## План доклада
- Контекст: что такое Tarantool, особенность рантайма в виде большого количества слоев Lua-C-Lua-..
- Какие сложности возникают при обработке ошибок на стыках этих слоев:
- Неудобная обработка, неестественные для Lua конструкции
- Развал Lua-рантайма из-за CPP-исключения, несмотря на наличие pcall.
- Интероперабельность исключений: решение всех наших проблем
- Исторический контекст исключений:
- Как исключения реализовывали когда-то давно: SJLJ, связные списки контекстов, много накладных расходов
- Как исключения реализуют сейчас:
- Размотка стека
- Personality routines, поиск подходящих catch-блоков
- Повторный проход с деструкцией
- Передача управления в landing pad для соответствующего catch
- Возможные сценарии выброса исключения и их особенности:
- C++ exception в CPP-функции
- Lua exception в CPP-функции
- Lua exception в Lua-функции
- С++ exception на трассе
- Как восстанавливать состояние VM? Создаем дополнительные снапшоты, чтобы корректно выходить обратно в VM.
- Что необходимо сделать для интероперабельности?
- personality routine для VM
- Что можно и нельзя делать с foreign exceptions
- Разберем personality routine для VM LuaJIT
- perosnality routine для трасс
- landing pad для трасс и сложности корректного выхода в VM:
- расставляем дополнительные снапшоты
- разберем пример из LuaJIT
- Динамическое расширение информации о фреймах при компиляции трасс
- Что получается в результате
- Общий результат: можем пробрасывать исключения между языками, примеры использования
- Некоторые неприятные платформоспецифичные особенности, о которых стоит знать.