aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-06-20 12:36:38 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-06-20 12:36:38 +0200
commit4226f9400d329467bf87b6bae2c9c57571250cb9 (patch)
tree3226de79c4466d5a042cf2fb2b635eddd9a9647f /src
parent0f34fabd90b66c96ac309a68a019d584b6c8e917 (diff)
downloadlanes-4226f9400d329467bf87b6bae2c9c57571250cb9.tar.gz
lanes-4226f9400d329467bf87b6bae2c9c57571250cb9.tar.bz2
lanes-4226f9400d329467bf87b6bae2c9c57571250cb9.zip
Revert overzealous upvalue check on on_state_create
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