add lua::stackguard

This commit is contained in:
MihailRis 2024-08-18 23:26:37 +03:00
parent 685cd414c4
commit 706cabeebd
2 changed files with 23 additions and 4 deletions

View File

@ -24,9 +24,29 @@ namespace lua {
luaerror(const std::string& message);
};
void log_error(const std::string& text);
using State = lua_State;
using Number = lua_Number;
using Integer = lua_Integer;
/// @brief Automatically resets stack top element index to the initial state
/// (when stackguard was created). Prevents Lua stack leak on exception
/// occurred out of Lua execution time, when engine controls scripting.
///
///
/// stackguard allows to not place lua::pop(...) into 'catch' blocks.
class stackguard {
int top;
State* state;
public:
stackguard(State* state) : state(state) {
top = lua_gettop(state);
}
~stackguard() {
lua_settop(state, top);
}
};
void log_error(const std::string& text);
}

View File

@ -101,7 +101,6 @@ static inline BlocksLayers load_layers(
layers.push_back(
load_layer(L, -1, lastLayersHeight, hasResizeableLayer));
} catch (const std::runtime_error& err) {
lua::pop(L, 2);
throw std::runtime_error(
fieldname+" #"+std::to_string(i)+": "+err.what());
}
@ -117,6 +116,7 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
) {
auto env = create_environment();
auto L = lua::get_main_thread();
lua::stackguard _(L);
lua::pop(L, load_script(*env, "generator", file));
@ -139,7 +139,6 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
groundLayers = load_layers(L, "layers");
seaLayers = load_layers(L, "sea_layers");
} catch (const std::runtime_error& err) {
lua::pop(L);
throw std::runtime_error(file.u8string()+": "+err.what());
}
lua::pop(L);