11

Re: Поддержка исключений и RtlUnwind

Во время зимнего сезона разработки, работая над новой прикладной задачей в рамках проектов «Канторовых систем», чуть было не увлекся и не ушел в переделку исключений CoreLite. Поскольку в код так или иначе смотрел, сложилось некоторое представление (может быть неверным):

  • Windows перехватывает аппаратные исключения на манер того, как описано выше для Колибри, но одевает их в структурную оболочку, описываемую в Delphi как TExceptionRec.

  • Delphi устанавливает обработчик, получающий эти самые TExceptionRec и транслирует их в объекты исключений (экземпляры класса Exception), чтобы на стороне прикладных программ аппаратные исключения в плане обработки были неотличимы от программных исключений. Е — единообразие.

  • Попутно в TLS создаются цепочки обработчиков исключений, адресуемые через сегментный регистр FS. Как понял, это самостоятельный, отдельный от транслятора аппаратных исключений механизм.

  • По всей видимости, имеется некий стандарт либо аппаратная обусловленность обработчиков исключений по FS, поскольку имеется системная функция RtlUnwind, разработанная явно не в Borland.

  • Механизм RtlUnwind чисто прикладной и зависит лишь от наличия TLS и соглашения по параметрам обработчиков.

  • Возможно даже, что RtlUnwind нужна для каких-то особых случаев, а обычная обработка исключений еще проще и RtlUnwind не задействует (тут могу сильно ошибаться).

Тем самым выходит, что раньше я не понимал задачу и ставил ее неправильно. Мы не должны ждать RtlUnwind от системщиков как манны небесной, а реализовать ее сами, вместе с механизмом установки обработчиков через TLS и регистр FS ← это же стандарт какой-то, да?

Потом уже можно будет организовать трансляцию аппаратных исключений (Е — единообразие), продумать классы, добавить TObject в модуль System и всё остальное, что потребуется.

12

Re: Поддержка исключений и RtlUnwind

Из описания C-unwind ABI языка Rust:

C++ as specified has no concept of "foreign" exceptions or of an underlying exception mechanism. However, in practice, the C++ exception mechanism is the "native" unwinding mechanism used by compilers.

On Microsoft platforms, when using MSVC, unwinding is always supported for both C++ and C code; this is very similar to "option 3" described in the inside-rust post mentioned above.

Не знаю, насколько это применимо к нашему случаю, но оставляю в качестве примера теории обработки исключений.