У меня есть рабочая функция C ++, которую я могу вызвать из Lua. Чтобы продемонстрировать мою проблему, вот пример:
int PushHello(lua_State *L){
string str("Hello");
lua_pushlstring(L, str.data(), str.length());
return 1;
}
Примечание: я знаю, что мне не нужно использовать строковую переменную там, но она есть, чтобы продемонстрировать проблему.
Вот две мои проблемы:
Когда я вызываю эту функцию из Lua, конструктор строки может выдать исключение. Это проблема? Будет ли Lua справиться с этим и правильно раскрутить стек Lua? Я так не думаю. Как я могу решить это? Нужно ли добавлять try/catch
вокруг всего такого кода и преобразовывать исключение в lua_error? Нет ли лучшего решения?
Другая проблема, которую я, вероятно, решил, скомпилировав Lua в C ++, это когда lua_pushlstring()
вызывает lua_error()
строковый деструктор, который не будет вызываться при использовании longjmp. Решена ли проблема путем компиляции как C ++ и выдачи исключений вместо использования longjmp?
Чтобы уточнить, возможное решение проблемы 1 было бы следующим:
int PushHello(lua_State *L){
string str;
try{
str.assign("Hello");
catch(exception &e){
luaL_error(L, e.what());
}
lua_pushlstring(L, str.data(), str.length());
return 1;
}
Но это очень уродливо и подвержено ошибкам, так как try/catch
нужно будет добавить во многие места. Это можно сделать как макрос и обойти каждую команду, которая может выдать, но это не будет намного лучше.