diff options
| author | Benoit Germain <benoit.germain@ubisoft.com> | 2024-10-25 15:06:41 +0200 |
|---|---|---|
| committer | Benoit Germain <benoit.germain@ubisoft.com> | 2024-10-25 15:06:41 +0200 |
| commit | b4bf1ad095452aabb12896040b522bf1746065a2 (patch) | |
| tree | fdb4e8e7ddbf71e7f854f1c31dc149bfeb01c37e /src | |
| parent | 8e33d8a2ca89d630f8890332df7e5737fc4608c8 (diff) | |
| download | lanes-b4bf1ad095452aabb12896040b522bf1746065a2.tar.gz lanes-b4bf1ad095452aabb12896040b522bf1746065a2.tar.bz2 lanes-b4bf1ad095452aabb12896040b522bf1746065a2.zip | |
New compatibility helper luaG_rawgetfield
Diffstat (limited to 'src')
| -rw-r--r-- | src/compat.h | 104 | ||||
| -rw-r--r-- | src/deep.cpp | 2 |
2 files changed, 58 insertions, 48 deletions
diff --git a/src/compat.h b/src/compat.h index 0ea35bf..b1e8663 100644 --- a/src/compat.h +++ b/src/compat.h | |||
| @@ -135,6 +135,53 @@ inline LuaType luaG_type(lua_State* const L_, StackIndex const idx_) | |||
| 135 | // ################################################################################################# | 135 | // ################################################################################################# |
| 136 | // ################################################################################################# | 136 | // ################################################################################################# |
| 137 | 137 | ||
| 138 | // must keep as a macro as long as we do constant string concatenations | ||
| 139 | #define STRINGVIEW_FMT "%.*s" | ||
| 140 | |||
| 141 | // a replacement of lua_tolstring | ||
| 142 | [[nodiscard]] inline std::string_view luaG_tostring(lua_State* const L_, StackIndex const idx_) | ||
| 143 | { | ||
| 144 | size_t _len{ 0 }; | ||
| 145 | char const* _str{ lua_tolstring(L_, idx_, &_len) }; | ||
| 146 | return _str ? std::string_view{ _str, _len } : ""; | ||
| 147 | } | ||
| 148 | |||
| 149 | [[nodiscard]] inline std::string_view luaG_checkstring(lua_State* const L_, StackIndex const idx_) | ||
| 150 | { | ||
| 151 | size_t _len{ 0 }; | ||
| 152 | char const* _str{ luaL_checklstring(L_, idx_, &_len) }; | ||
| 153 | return std::string_view{ _str, _len }; | ||
| 154 | } | ||
| 155 | |||
| 156 | [[nodiscard]] inline std::string_view luaG_optstring(lua_State* const L_, StackIndex const idx_, std::string_view const& default_) | ||
| 157 | { | ||
| 158 | if (lua_isnoneornil(L_, idx_)) { | ||
| 159 | return default_; | ||
| 160 | } | ||
| 161 | size_t _len{ 0 }; | ||
| 162 | char const* _str{ luaL_optlstring(L_, idx_, default_.data(), &_len) }; | ||
| 163 | return std::string_view{ _str, _len }; | ||
| 164 | } | ||
| 165 | |||
| 166 | template <typename... EXTRA> | ||
| 167 | inline std::string_view luaG_pushstring(lua_State* const L_, std::string_view const& str_, EXTRA&&... extra_) | ||
| 168 | { | ||
| 169 | if constexpr (sizeof...(EXTRA) == 0) { | ||
| 170 | if constexpr (LUA_VERSION_NUM == 501) { | ||
| 171 | // lua_pushlstring doesn't return a value in Lua 5.1 | ||
| 172 | lua_pushlstring(L_, str_.data(), str_.size()); | ||
| 173 | return luaG_tostring(L_, kIdxTop); | ||
| 174 | } else { | ||
| 175 | return std::string_view{ lua_pushlstring(L_, str_.data(), str_.size()), str_.size() }; | ||
| 176 | } | ||
| 177 | } else { | ||
| 178 | static_assert((... && std::is_trivial_v<std::decay_t<EXTRA>>)); | ||
| 179 | return std::string_view{ lua_pushfstring(L_, str_.data(), std::forward<EXTRA>(extra_)...) }; | ||
| 180 | } | ||
| 181 | } | ||
| 182 | |||
| 183 | // ################################################################################################# | ||
| 184 | |||
| 138 | // use this in place of lua_absindex to save a function call | 185 | // use this in place of lua_absindex to save a function call |
| 139 | inline StackIndex luaG_absindex(lua_State* const L_, StackIndex const idx_) | 186 | inline StackIndex luaG_absindex(lua_State* const L_, StackIndex const idx_) |
| 140 | { | 187 | { |
| @@ -285,6 +332,16 @@ static inline LuaError luaG_resume(lua_State* const L_, lua_State* const from_, | |||
| 285 | 332 | ||
| 286 | // ################################################################################################# | 333 | // ################################################################################################# |
| 287 | 334 | ||
| 335 | static inline LuaType luaG_rawgetfield(lua_State* const L_, StackIndex const idx_, std::string_view const& name_) | ||
| 336 | { | ||
| 337 | auto const _absIdx{ luaG_absindex(L_, idx_) }; | ||
| 338 | luaG_pushstring(L_, name_); // L_: ... t ... name_ | ||
| 339 | lua_rawget(L_, _absIdx); // L_: ... t ... <field> | ||
| 340 | return luaG_type(L_, kIdxTop); | ||
| 341 | } | ||
| 342 | |||
| 343 | // ################################################################################################# | ||
| 344 | |||
| 288 | template <size_t N> | 345 | template <size_t N> |
| 289 | static inline void luaG_newlib(lua_State* const L_, luaL_Reg const (&funcs_)[N]) | 346 | static inline void luaG_newlib(lua_State* const L_, luaL_Reg const (&funcs_)[N]) |
| 290 | { | 347 | { |
| @@ -369,50 +426,3 @@ template <typename T> | |||
| 369 | { | 426 | { |
| 370 | return luaG_typename(L_, luaG_type(L_, idx_)); | 427 | return luaG_typename(L_, luaG_type(L_, idx_)); |
| 371 | } | 428 | } |
| 372 | |||
| 373 | // ################################################################################################# | ||
| 374 | |||
| 375 | // must keep as a macro as long as we do constant string concatenations | ||
| 376 | #define STRINGVIEW_FMT "%.*s" | ||
| 377 | |||
| 378 | // a replacement of lua_tolstring | ||
| 379 | [[nodiscard]] inline std::string_view luaG_tostring(lua_State* const L_, StackIndex const idx_) | ||
| 380 | { | ||
| 381 | size_t _len{ 0 }; | ||
| 382 | char const* _str{ lua_tolstring(L_, idx_, &_len) }; | ||
| 383 | return _str ? std::string_view{ _str, _len } : ""; | ||
| 384 | } | ||
| 385 | |||
| 386 | [[nodiscard]] inline std::string_view luaG_checkstring(lua_State* const L_, StackIndex const idx_) | ||
| 387 | { | ||
| 388 | size_t _len{ 0 }; | ||
| 389 | char const* _str{ luaL_checklstring(L_, idx_, &_len) }; | ||
| 390 | return std::string_view{ _str, _len }; | ||
| 391 | } | ||
| 392 | |||
| 393 | [[nodiscard]] inline std::string_view luaG_optstring(lua_State* const L_, StackIndex const idx_, std::string_view const& default_) | ||
| 394 | { | ||
| 395 | if (lua_isnoneornil(L_, idx_)) { | ||
| 396 | return default_; | ||
| 397 | } | ||
| 398 | size_t _len{ 0 }; | ||
| 399 | char const* _str{ luaL_optlstring(L_, idx_, default_.data(), &_len) }; | ||
| 400 | return std::string_view{ _str, _len }; | ||
| 401 | } | ||
| 402 | |||
| 403 | template<typename ...EXTRA> | ||
| 404 | inline std::string_view luaG_pushstring(lua_State* const L_, std::string_view const& str_, EXTRA&&... extra_) | ||
| 405 | { | ||
| 406 | if constexpr (sizeof...(EXTRA) == 0) { | ||
| 407 | if constexpr (LUA_VERSION_NUM == 501) { | ||
| 408 | // lua_pushlstring doesn't return a value in Lua 5.1 | ||
| 409 | lua_pushlstring(L_, str_.data(), str_.size()); | ||
| 410 | return luaG_tostring(L_, kIdxTop); | ||
| 411 | } else { | ||
| 412 | return std::string_view{ lua_pushlstring(L_, str_.data(), str_.size()), str_.size() }; | ||
| 413 | } | ||
| 414 | } else { | ||
| 415 | static_assert((... && std::is_trivial_v<std::decay_t<EXTRA>>)); | ||
| 416 | return std::string_view{ lua_pushfstring(L_, str_.data(), std::forward<EXTRA>(extra_)...) }; | ||
| 417 | } | ||
| 418 | } | ||
diff --git a/src/deep.cpp b/src/deep.cpp index bfadeac..278d25f 100644 --- a/src/deep.cpp +++ b/src/deep.cpp | |||
| @@ -216,7 +216,7 @@ void DeepFactory::PushDeepProxy(DestState const L_, DeepPrelude* const prelude_, | |||
| 216 | raise_luaL_error(errL_, "Bad DeepFactory::createMetatable overload: unexpected pushed value"); | 216 | raise_luaL_error(errL_, "Bad DeepFactory::createMetatable overload: unexpected pushed value"); |
| 217 | } | 217 | } |
| 218 | // if the metatable contains a __gc, we will call it from our own | 218 | // if the metatable contains a __gc, we will call it from our own |
| 219 | std::ignore = luaG_getfield(L_, kIdxTop, "__gc"); // L_: DPC proxy metatable __gc | 219 | std::ignore = luaG_rawgetfield(L_, kIdxTop, "__gc"); // L_: DPC proxy metatable __gc |
| 220 | } else { | 220 | } else { |
| 221 | // keepers need a minimal metatable that only contains our own __gc | 221 | // keepers need a minimal metatable that only contains our own __gc |
| 222 | lua_createtable(L_, 0, 1); // L_: DPC proxy metatable | 222 | lua_createtable(L_, 0, 1); // L_: DPC proxy metatable |
