add lua::stackguard
This commit is contained in:
parent
685cd414c4
commit
706cabeebd
@ -24,9 +24,29 @@ namespace lua {
|
|||||||
luaerror(const std::string& message);
|
luaerror(const std::string& message);
|
||||||
};
|
};
|
||||||
|
|
||||||
void log_error(const std::string& text);
|
|
||||||
|
|
||||||
using State = lua_State;
|
using State = lua_State;
|
||||||
using Number = lua_Number;
|
using Number = lua_Number;
|
||||||
using Integer = lua_Integer;
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -101,7 +101,6 @@ static inline BlocksLayers load_layers(
|
|||||||
layers.push_back(
|
layers.push_back(
|
||||||
load_layer(L, -1, lastLayersHeight, hasResizeableLayer));
|
load_layer(L, -1, lastLayersHeight, hasResizeableLayer));
|
||||||
} catch (const std::runtime_error& err) {
|
} catch (const std::runtime_error& err) {
|
||||||
lua::pop(L, 2);
|
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
fieldname+" #"+std::to_string(i)+": "+err.what());
|
fieldname+" #"+std::to_string(i)+": "+err.what());
|
||||||
}
|
}
|
||||||
@ -117,6 +116,7 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
|
|||||||
) {
|
) {
|
||||||
auto env = create_environment();
|
auto env = create_environment();
|
||||||
auto L = lua::get_main_thread();
|
auto L = lua::get_main_thread();
|
||||||
|
lua::stackguard _(L);
|
||||||
|
|
||||||
lua::pop(L, load_script(*env, "generator", file));
|
lua::pop(L, load_script(*env, "generator", file));
|
||||||
|
|
||||||
@ -139,7 +139,6 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
|
|||||||
groundLayers = load_layers(L, "layers");
|
groundLayers = load_layers(L, "layers");
|
||||||
seaLayers = load_layers(L, "sea_layers");
|
seaLayers = load_layers(L, "sea_layers");
|
||||||
} catch (const std::runtime_error& err) {
|
} catch (const std::runtime_error& err) {
|
||||||
lua::pop(L);
|
|
||||||
throw std::runtime_error(file.u8string()+": "+err.what());
|
throw std::runtime_error(file.u8string()+": "+err.what());
|
||||||
}
|
}
|
||||||
lua::pop(L);
|
lua::pop(L);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user