diff options
author | Benoit Germain <benoit.germain@ubisoft.com> | 2024-05-02 18:50:40 +0200 |
---|---|---|
committer | Benoit Germain <benoit.germain@ubisoft.com> | 2024-05-02 18:50:40 +0200 |
commit | a2824ef0c87034d535d3b12e6d582dfcf2265f27 (patch) | |
tree | 4cd1def6d11df8d5c715b51f338b090bb299b7cd /src | |
parent | eb7c7611524ba2dd2324aa3c72142e6973912286 (diff) | |
download | lanes-a2824ef0c87034d535d3b12e6d582dfcf2265f27.tar.gz lanes-a2824ef0c87034d535d3b12e6d582dfcf2265f27.tar.bz2 lanes-a2824ef0c87034d535d3b12e6d582dfcf2265f27.zip |
Remove dependency on _G["package"]
Diffstat (limited to 'src')
-rw-r--r-- | src/compat.cpp | 19 | ||||
-rw-r--r-- | src/compat.h | 21 | ||||
-rw-r--r-- | src/keeper.cpp | 7 | ||||
-rw-r--r-- | src/tools.cpp | 5 |
4 files changed, 44 insertions, 8 deletions
diff --git a/src/compat.cpp b/src/compat.cpp index 591e19f..6ceed8f 100644 --- a/src/compat.cpp +++ b/src/compat.cpp | |||
@@ -6,6 +6,23 @@ | |||
6 | #include "macros_and_utils.h" | 6 | #include "macros_and_utils.h" |
7 | 7 | ||
8 | // ################################################################################################# | 8 | // ################################################################################################# |
9 | |||
10 | // a small helper to obtain the "package" module table from the registry instead of relying on the presence of _G.package | ||
11 | int luaG_getpackage(lua_State* L_) | ||
12 | { | ||
13 | STACK_CHECK_START_REL(L_, 0); | ||
14 | int type{ lua503_getfield(L_, LUA_REGISTRYINDEX, LUA_LOADED_TABLE) }; // L_: _R._LOADED|nil | ||
15 | if (type != LUA_TTABLE) { // L_: _R._LOADED|nil | ||
16 | STACK_CHECK(L_, 1); | ||
17 | return type; | ||
18 | } | ||
19 | type = lua503_getfield(L_, -1, LUA_LOADLIBNAME); // L_: _R._LOADED package|nil | ||
20 | lua_remove(L_, -2); // L_: package|nil | ||
21 | STACK_CHECK(L_, 1); | ||
22 | return type; | ||
23 | } | ||
24 | |||
25 | // ################################################################################################# | ||
9 | // ################################################################################################# | 26 | // ################################################################################################# |
10 | #if LUA_VERSION_NUM == 501 | 27 | #if LUA_VERSION_NUM == 501 |
11 | // ################################################################################################# | 28 | // ################################################################################################# |
@@ -71,7 +88,7 @@ int lua_getiuservalue(lua_State* L_, int idx_, int n_) | |||
71 | 88 | ||
72 | #if LUA_VERSION_NUM == 501 | 89 | #if LUA_VERSION_NUM == 501 |
73 | /* default environment is not a nil (see lua_getfenv) */ | 90 | /* default environment is not a nil (see lua_getfenv) */ |
74 | lua_getglobal(L_, "package"); | 91 | lua_getglobal(L_, LUA_LOADLIBNAME); |
75 | if (lua_rawequal(L_, -2, -1) || lua_rawequal(L_, -2, LUA_GLOBALSINDEX)) { | 92 | if (lua_rawequal(L_, -2, -1) || lua_rawequal(L_, -2, LUA_GLOBALSINDEX)) { |
76 | lua_pop(L_, 2); | 93 | lua_pop(L_, 2); |
77 | lua_pushnil(L_); | 94 | lua_pushnil(L_); |
diff --git a/src/compat.h b/src/compat.h index 4816cb7..f98e142 100644 --- a/src/compat.h +++ b/src/compat.h | |||
@@ -100,6 +100,25 @@ inline int lua504_dump(lua_State* L_, lua_Writer writer_, void* data_, [[maybe_u | |||
100 | 100 | ||
101 | // ################################################################################################# | 101 | // ################################################################################################# |
102 | 102 | ||
103 | #if LUA_VERSION_NUM < 503 | ||
104 | // starting with Lua 5.3, lua_getfield returns the type of the value it found | ||
105 | inline int lua503_getfield(lua_State* L_, int idx_, char const* k_) | ||
106 | { | ||
107 | lua_getfield(L_, idx_, k_); | ||
108 | return lua_type(L_, -1); | ||
109 | } | ||
110 | |||
111 | #else // LUA_VERSION_NUM >= 503 | ||
112 | |||
113 | inline int lua503_getfield(lua_State* L_, int idx_, char const* k_) | ||
114 | { | ||
115 | return lua_getfield(L_, idx_, k_); | ||
116 | } | ||
117 | |||
118 | #endif // LUA_VERSION_NUM >= 503 | ||
119 | |||
120 | // ################################################################################################# | ||
121 | |||
103 | // wrap Lua 5.3 calls under Lua 5.1 API when it is simpler that way | 122 | // wrap Lua 5.3 calls under Lua 5.1 API when it is simpler that way |
104 | #if LUA_VERSION_NUM == 503 | 123 | #if LUA_VERSION_NUM == 503 |
105 | 124 | ||
@@ -199,3 +218,5 @@ inline char const* lua_typename(lua_State* L_, LuaType t_) | |||
199 | { | 218 | { |
200 | return lua_typename(L_, static_cast<int>(t_)); | 219 | return lua_typename(L_, static_cast<int>(t_)); |
201 | } | 220 | } |
221 | |||
222 | int luaG_getpackage(lua_State* L_); | ||
diff --git a/src/keeper.cpp b/src/keeper.cpp index 763bcf7..8e76247 100644 --- a/src/keeper.cpp +++ b/src/keeper.cpp | |||
@@ -651,15 +651,14 @@ void init_keepers(Universe* U_, lua_State* L_) | |||
651 | 651 | ||
652 | // make sure 'package' is initialized in keeper states, so that we have require() | 652 | // make sure 'package' is initialized in keeper states, so that we have require() |
653 | // this because this is needed when transferring deep userdata object | 653 | // this because this is needed when transferring deep userdata object |
654 | luaL_requiref(K, "package", luaopen_package, 1); // L_: settings K: package | 654 | luaL_requiref(K, LUA_LOADLIBNAME, luaopen_package, 1); // L_: settings K: package |
655 | lua_pop(K, 1); // L_: settings K: | 655 | lua_pop(K, 1); // L_: settings K: |
656 | STACK_CHECK(K, 0); | 656 | STACK_CHECK(K, 0); |
657 | serialize_require(DEBUGSPEW_PARAM_COMMA(U_) K); | 657 | serialize_require(DEBUGSPEW_PARAM_COMMA(U_) K); |
658 | STACK_CHECK(K, 0); | 658 | STACK_CHECK(K, 0); |
659 | 659 | ||
660 | // copy package.path and package.cpath from the source state (TODO: use _R._LOADED.package instead of _G.package) | 660 | // copy package.path and package.cpath from the source state |
661 | lua_getglobal(L_, "package"); // L_: settings package K: | 661 | if (luaG_getpackage(L_) != LUA_TNIL) { // L_: settings package K: |
662 | if (!lua_isnil(L_, -1)) { | ||
663 | // when copying with mode LookupMode::ToKeeper, error message is pushed at the top of the stack, not raised immediately | 662 | // when copying with mode LookupMode::ToKeeper, error message is pushed at the top of the stack, not raised immediately |
664 | InterCopyContext c{ U_, DestState{ K }, SourceState{ L_ }, {}, SourceIndex{ lua_absindex(L_, -1) }, {}, LookupMode::ToKeeper, {} }; | 663 | InterCopyContext c{ U_, DestState{ K }, SourceState{ L_ }, {}, SourceIndex{ lua_absindex(L_, -1) }, {}, LookupMode::ToKeeper, {} }; |
665 | if (c.inter_copy_package() != InterCopyResult::Success) { // L_: settings ... error_msg K: | 664 | if (c.inter_copy_package() != InterCopyResult::Success) { // L_: settings ... error_msg K: |
diff --git a/src/tools.cpp b/src/tools.cpp index a55ee75..049a065 100644 --- a/src/tools.cpp +++ b/src/tools.cpp | |||
@@ -1826,12 +1826,11 @@ void InterCopyContext::inter_copy_keyvaluepair() const | |||
1826 | STACK_CHECK(L1, 1); | 1826 | STACK_CHECK(L1, 1); |
1827 | // raise the error when copying from lane to lane, else just leave it on the stack to be raised later | 1827 | // raise the error when copying from lane to lane, else just leave it on the stack to be raised later |
1828 | if (mode == LookupMode::LaneBody) { | 1828 | if (mode == LookupMode::LaneBody) { |
1829 | raise_lua_error(getErrL()); | 1829 | raise_lua_error(getErrL()); // that's ok, getErrL() is L1 in that case |
1830 | } | 1830 | } |
1831 | return InterCopyResult::Error; | 1831 | return InterCopyResult::Error; |
1832 | } | 1832 | } |
1833 | lua_getglobal(L2, "package"); // TODO: use _R._LOADED.package instead of _G.package | 1833 | if (luaG_getpackage(L2) == LUA_TNIL) { // package library not loaded: do nothing |
1834 | if (lua_isnil(L2, -1)) { // package library not loaded: do nothing | ||
1835 | DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "'package' not loaded, nothing to do\n" INDENT_END(U))); | 1834 | DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "'package' not loaded, nothing to do\n" INDENT_END(U))); |
1836 | STACK_CHECK(L1, 0); | 1835 | STACK_CHECK(L1, 0); |
1837 | return InterCopyResult::Success; | 1836 | return InterCopyResult::Success; |