2323#include " LuaTable.hpp"
2424
2525#include " utils/convert_godot_lua.hpp"
26- #include " utils/convert_godot_std.hpp"
2726#include " utils/metatable.hpp"
27+ #include " utils/stack_top_checker.hpp"
2828
2929#include < godot_cpp/core/error_macros.hpp>
3030
@@ -37,14 +37,17 @@ LuaTable::LuaTable(sol::table&& table) : LuaObjectSubclass(table) {}
3737LuaTable::LuaTable (const sol::table& table) : LuaObjectSubclass(table) {}
3838
3939sol::optional<Variant> LuaTable::try_get_value (const Variant& key) const {
40+ StackTopChecker topcheck (lua_object.lua_state ());
4041 lua_State *L = lua_object.lua_state ();
41- auto lua_key = to_lua (L, key);
42- sol::stack::pop_n (L, 1 );
43- if (auto lua_value = lua_object.get <sol::optional<sol::object>>(lua_key)) {
44- return to_variant (*lua_value);
42+ sol::stack::push (L, lua_object);
43+ std::ignore = to_lua (L, key);
44+ lua_gettable (L, -2 );
45+ auto _ = sol::stack::pop_n (L, 2 );
46+ if (lua_isnoneornil (L, -1 )) {
47+ return std::nullopt ;
4548 }
4649 else {
47- return {} ;
50+ return to_variant (L, - 1 ) ;
4851 }
4952}
5053
@@ -53,6 +56,7 @@ Variant LuaTable::get_value(const Variant& key, const Variant& default_value) co
5356}
5457
5558void LuaTable::set_value (const Variant& key, const Variant& value) {
59+ StackTopChecker topcheck (lua_object.lua_state ());
5660 lua_State *L = lua_object.lua_state ();
5761 auto table_popper = sol::stack::push_pop (L, lua_object);
5862 std::ignore = to_lua (L, key);
@@ -61,6 +65,7 @@ void LuaTable::set_value(const Variant& key, const Variant& value) {
6165}
6266
6367void LuaTable::clear () {
68+ StackTopChecker topcheck (lua_object.lua_state ());
6469 for (auto [key, _] : lua_object) {
6570 lua_object[key] = sol::nil;
6671 }
@@ -79,6 +84,7 @@ Array LuaTable::to_array() const {
7984}
8085
8186bool LuaTable::_iter_init (const Variant& iter) const {
87+ StackTopChecker topcheck (lua_object.lua_state ());
8288 lua_State *L = lua_object.lua_state ();
8389 auto table_popper = sol::stack::push_pop (lua_object);
8490 lua_pushnil (L);
@@ -95,6 +101,7 @@ bool LuaTable::_iter_init(const Variant& iter) const {
95101}
96102
97103bool LuaTable::_iter_next (const Variant& iter) const {
104+ StackTopChecker topcheck (lua_object.lua_state ());
98105 lua_State *L = lua_object.lua_state ();
99106 Array arg = iter;
100107 auto table_popper = sol::stack::push_pop (lua_object);
@@ -138,11 +145,13 @@ void LuaTable::_bind_methods() {
138145}
139146
140147bool LuaTable::_get (const StringName& property_name, Variant& r_value) const {
148+ StackTopChecker topcheck (lua_object.lua_state ());
141149 r_value = to_variant (lua_object[property_name].get <sol::object>());
142150 return true ;
143151}
144152
145153bool LuaTable::_set (const StringName& property_name, const Variant& value) {
154+ StackTopChecker topcheck (lua_object.lua_state ());
146155 lua_object[property_name] = to_lua (lua_object.lua_state (), value);
147156 return true ;
148157}
0 commit comments