aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/universe.cpp20
1 files changed, 5 insertions, 15 deletions
diff --git a/src/universe.cpp b/src/universe.cpp
index 08fdf40..0dc5646 100644
--- a/src/universe.cpp
+++ b/src/universe.cpp
@@ -303,24 +303,14 @@ void Universe::initializeOnStateCreate(lua_State* const L_)
303 STACK_CHECK_START_REL(L_, 0); // L_: settings 303 STACK_CHECK_START_REL(L_, 0); // L_: settings
304 if (luaG_getfield(L_, -1, kOnStateCreate) != LuaType::NIL) { // L_: settings on_state_create|nil 304 if (luaG_getfield(L_, -1, kOnStateCreate) != LuaType::NIL) { // L_: settings on_state_create|nil
305 LUA_ASSERT(L_, luaG_type(L_, -1) == LuaType::FUNCTION); // ensured by lanes.lua parameter validation 305 LUA_ASSERT(L_, luaG_type(L_, -1) == LuaType::FUNCTION); // ensured by lanes.lua parameter validation
306 // make sure the function doesn't have upvalues other than _G
307 int _uvi{ 1 };
308 for (
309 char const* _upname{ lua_getupvalue(L_, -1, _uvi) };
310 _upname;
311 _upname = lua_getupvalue(L_, -1, ++_uvi) // L_: settings on_state_create upvalue
312 ) {
313 // starting with Lua 5.2, functions have _ENV as their first upvalue. This is ok, it is mapped correctly
314 luaG_pushglobaltable(L_); // L_: settings on_state_create upvalue _G
315 if (!lua_rawequal(L_, -1, -2)) {
316 raise_luaL_error(L_, "%s with upvalues are forbidden", kOnStateCreate.data());
317 }
318 lua_pop(L_, 2); // L_: settings on_state_create
319 }
320 STACK_CHECK(L_, 1); // make sure no garbage remains on the stack after upvalue check // L_: settings on_state_create
321 // store C function pointer in an internal variable 306 // store C function pointer in an internal variable
322 lua_CFunction const _func{ lua_tocfunction(L_, -1) }; // L_: settings on_state_create 307 lua_CFunction const _func{ lua_tocfunction(L_, -1) }; // L_: settings on_state_create
323 if (_func) { 308 if (_func) {
309 // make sure the function doesn't have upvalues
310 char const* _upname{ lua_getupvalue(L_, -1, 1) }; // L_: settings on_state_create upval?
311 if (_upname != nullptr) { // should be "" for C functions with upvalues if any
312 raise_luaL_error(L_, "%s shouldn't have upvalues", kOnStateCreate.data());
313 }
324 onStateCreateFunc.emplace<lua_CFunction>(_func); 314 onStateCreateFunc.emplace<lua_CFunction>(_func);
325 // remove this C function from the config table so that it doesn't cause problems 315 // remove this C function from the config table so that it doesn't cause problems
326 // when we transfer the config table in newly created Lua states 316 // when we transfer the config table in newly created Lua states