diff options
| author | Benoit Germain <benoit.germain@ubisoft.com> | 2024-06-20 12:36:38 +0200 |
|---|---|---|
| committer | Benoit Germain <benoit.germain@ubisoft.com> | 2024-06-20 12:36:38 +0200 |
| commit | 4226f9400d329467bf87b6bae2c9c57571250cb9 (patch) | |
| tree | 3226de79c4466d5a042cf2fb2b635eddd9a9647f /src | |
| parent | 0f34fabd90b66c96ac309a68a019d584b6c8e917 (diff) | |
| download | lanes-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.cpp | 20 |
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 |
