У меня есть работающая функция С++, которую я могу вызвать из 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 как С++, - это когда
lua_pushlstring()
вызываетlua_error()
string destructor не будет вызываться, если был использован longjmp. Является ли проблема решена путем компиляции как С++ и исключения исключений вместо использования 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
нужно будет добавить во многие места. Это может быть сделано как макрос и помещаться вокруг каждой команды, которая может бросать, но это было бы не намного приятнее.