Skip to content

Commit 774c2a8

Browse files
authored
Merge pull request #114 from gilzoide/feature/get-set-metatable
Add support for getting and setting metatable from GDScript
2 parents 04fbd8a + 699f881 commit 774c2a8

File tree

5 files changed

+51
-0
lines changed

5 files changed

+51
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
## [Unreleased](https://github.com/gilzoide/lua-gdextension/compare/0.4.0...HEAD)
33
### Added
44
- Support for Linux arm64
5+
- `LuaTable.get_metatable` and `LuaTable.set_metatable` methods
56

67

78
## [0.4.0](https://github.com/gilzoide/lua-gdextension/releases/tag/0.4.0)

doc_classes/LuaTable.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@
3838
[/codeblocks]
3939
</description>
4040
</method>
41+
<method name="get_metatable" qualifiers="const">
42+
<return type="LuaTable" />
43+
<description>
44+
Returns this table's metatable.
45+
See [url]https://www.lua.org/manual/5.4/manual.html#2.4[/url]
46+
</description>
47+
</method>
4148
<method name="length" qualifiers="const">
4249
<return type="int" />
4350
<description>
@@ -101,6 +108,14 @@
101108
[/codeblocks]
102109
</description>
103110
</method>
111+
<method name="set_metatable">
112+
<return type="void" />
113+
<param index="0" name="metatable" type="LuaTable" />
114+
<description>
115+
Set a new metatable for this table.
116+
See [url]https://www.lua.org/manual/5.4/manual.html#2.4[/url]
117+
</description>
118+
</method>
104119
<method name="to_array" qualifiers="const">
105120
<return type="Array" />
106121
<description>

src/LuaTable.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,19 @@ Array LuaTable::to_array() const {
108108
return luagdextension::to_array(lua_object);
109109
}
110110

111+
Ref<LuaTable> LuaTable::get_metatable() const {
112+
if (sol::optional<sol::table> metatable = lua_object[sol::metatable_key]) {
113+
return LuaObject::wrap_object<LuaTable>(*metatable);
114+
}
115+
else {
116+
return nullptr;
117+
}
118+
}
119+
120+
void LuaTable::set_metatable(LuaTable *metatable) {
121+
lua_object[sol::metatable_key] = metatable ? metatable->get_table() : sol::nil;
122+
}
123+
111124
bool LuaTable::_iter_init(const Variant& iter) const {
112125
StackTopChecker topcheck(lua_object.lua_state());
113126
lua_State *L = lua_object.lua_state();
@@ -172,6 +185,9 @@ void LuaTable::_bind_methods() {
172185
ClassDB::bind_method(D_METHOD("to_dictionary"), &LuaTable::to_dictionary);
173186
ClassDB::bind_method(D_METHOD("to_array"), &LuaTable::to_array);
174187

188+
ClassDB::bind_method(D_METHOD("get_metatable"), &LuaTable::get_metatable);
189+
ClassDB::bind_method(D_METHOD("set_metatable", "metatable"), &LuaTable::set_metatable);
190+
175191
ClassDB::bind_method(D_METHOD("_iter_init", "iter"), &LuaTable::_iter_init);
176192
ClassDB::bind_method(D_METHOD("_iter_next", "iter"), &LuaTable::_iter_next);
177193
ClassDB::bind_method(D_METHOD("_iter_get", "iter"), &LuaTable::_iter_get);

src/LuaTable.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class LuaTable : public LuaObjectSubclass<sol::table> {
5353
Dictionary to_dictionary() const;
5454
Array to_array() const;
5555

56+
Ref<LuaTable> get_metatable() const;
57+
void set_metatable(LuaTable *metatable);
58+
5659
bool _iter_init(const Variant& iter) const;
5760
bool _iter_next(const Variant& iter) const;
5861
Variant _iter_get(const Variant& iter) const;

test/gdscript_tests/LuaTable.gd

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,19 @@ func test_dont_unpack_other_state() -> bool:
111111
var t_type = other_state.do_string("return type(t)")
112112
assert(t_type == "userdata", "Table should remain as Variant when passed to another LuaState")
113113
return true
114+
115+
116+
func test_setgetmetatable() -> bool:
117+
var table = lua_state.create_table()
118+
assert(table.get_metatable() == null)
119+
assert(table.get_metatable() == lua_state.globals.getmetatable.invoke(table))
120+
121+
var metatable = lua_state.create_table()
122+
table.set_metatable(metatable)
123+
assert(table.get_metatable() == metatable)
124+
assert(table.get_metatable() == lua_state.globals.getmetatable.invoke(table))
125+
126+
table.set_metatable(null)
127+
assert(table.get_metatable() == null)
128+
assert(table.get_metatable() == lua_state.globals.getmetatable.invoke(table))
129+
return true

0 commit comments

Comments
 (0)