OCaml internals: Исключения

Мне интересно узнать, как обрабатываются исключения в OCaml runtime, чтобы сделать их такими легкими. Используют ли они setjmp/longjmp или они возвращают специальное значение в каждой функции и распространяют его?

Мне кажется, что longjmp немного нагружает систему, но только когда возникает исключение, в то время как проверка каждого возвращаемого значения функции потребует проверки каждого значения после вызова функции, что, как мне кажется, потребует много проверок и переходов, и, кажется, это будет работать хуже всего.

Посмотрев на то, как OCaml взаимодействует с C ( http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142 ), и взглянув на callback.h, кажется, что исключение помечается с помощью выравнивания памяти объектов ( #define Is_exception_result(v) (((v) & 3) == 2) ). Это, похоже, указывает на то, что его реализация не использует longjmp и проверяет каждый результат функции после каждого вызова функции. Так ли это? Или функция C уже пытается поймать любое исключение, а затем преобразует его в этот формат?

Спасибо!

21
задан Steven Shaw 28 May 2012 в 07:59
поделиться