Здравствуйте, Константин Б., Вы писали:
V>>Установка точек возврата для исключений работает аналогичным образом, как setjmp/longjmp.
КБ>А передавать управление на эту точку возврата кто будет? longjmp сам вызовется?
Вызывается изнутри _Unwind_RaiseException — сначала производится cleanup текущих стековых переменных, затем поиск обработчика через type_info, затем происходит аналог longjmp на установленную точку входа обработчика.
КБ>В случае SEH операционная система нужный обработчик вызовет (который мало что сделать сможет, но это другой вопрос).
В случае структурных исключений ядро просто трансформирует аппаратные прерывания в софтовые с известной на уровне ABI операционки структурой данных, описывающих исключение.
Т.е., сводит сигналы различной природы к одному АПИ.
КБ>А longjmp руками вызвать надо.
longjmp — это невыразимый обычными ср-вами языка трюк "отмотки" стека с одновременной передачей управления некоей выставленной заранее точке в коде, где указатель стека как раз восстанавливается до значения в этой точке.
Пробрасывания и перехваты исключений построены ровно по такому же принципу, разве что вместо аргумента int user_data оперируют указателями на void*, под которым скрываются более сложные структуры, описывающие семантику происходящего. При доступе к АПИ компилятора на Си нефик делать всё это раскрутить вручную, как это происходит автоматом на плюсах.