## План доклада - Контекст: что такое 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 - Динамическое расширение информации о фреймах при компиляции трасс - Что получается в результате - Общий результат: можем пробрасывать исключения между языками, примеры использования - Некоторые неприятные платформоспецифичные особенности, о которых стоит знать.