Вопрос

Я недавно наткнулся на эту ошибку C ++ / Lua

int function_for_lua( lua_State* L )
{
   std::string s("Trouble coming!");
   /* ... */
   return luaL_error(L,"something went wrong");
}

Ошибка в том, что luaL_error использовать longjmp, поэтому стек никогда не размотана и s никогда не разрушается, протекающая память. Есть еще несколько лучших API Lua, которые не смогут расслабить стек.

Одно очевидное решение состоит в том, чтобы скомпилировать LUA в режиме C ++ с исключениями. Я, однако, не может быть, так как Luabind нужен стандарт C ABI.

Моя текущая мысль - написать свои собственные функции, которые имитируют хлопотные части LUA API:

// just a heads up this is valid c++.  It's called a function try/catch.
int function_for_lua( lua_State* L )
try
{
   /* code that may throw Lua_error */
}
catch( Lua_error& e )
{
   luaL_error(L,e.what());
}

Итак, мой вопрос: function_for_luaстек правильно раскручивается. Может что-то пойти не так?

Это было полезно?

Решение

Если я правильно понимаю, с Luabind Функции, которые бросают исключения, правильно пойманы и переведены в любом случае. (Видеть ссылка.)

Поэтому, когда вам нужно указать ошибку, просто выбросьте стандартное исключение:

void function_for_lua( lua_State* L )
{
    std::string s("Trouble coming!");
    /* ... */

    // translated into lua error
    throw std::runtime_error("something went wrong");
}

Отказ от ответственности: Я никогда не использовал люснул.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top