Skip to content

Commit d740268

Browse files
authored
Merge pull request #127 from gilzoide/bugfix/luascriptproperty-leak
Fix memory leak from cyclic reference of LuaScriptProperty <-> LuaState
2 parents 12a693c + 565f8c5 commit d740268

File tree

3 files changed

+9
-6
lines changed

3 files changed

+9
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
### Fixed
1111
- Fixed cyclic references from `LuaScriptInstance` <-> `LuaState`, avoiding leaks of `LuaScript`s
12+
- Fixed cyclic references from `LuaScriptProperty` <-> `LuaState`, avoiding memory leaks
1213

1314

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

src/script-language/LuaScriptProperty.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@ static LuaScriptProperty lua_property(sol::stack_object value) {
8080
property.usage &= ~PROPERTY_USAGE_STORAGE;
8181
}
8282
else if (auto getter = table->get<sol::optional<sol::protected_function>>("get")) {
83-
property.getter = LuaObject::wrap_object<LuaFunction>(*getter);
83+
property.getter = *getter;
8484
property.usage &= ~PROPERTY_USAGE_STORAGE;
8585
}
8686
if (auto setter_name = table->get<sol::optional<StringName>>("set")) {
8787
property.setter_name = *setter_name;
8888
}
8989
else if (auto setter = table->get<sol::optional<sol::protected_function>>("set")) {
90-
property.setter = LuaObject::wrap_object<LuaFunction>(*setter);
90+
property.setter = *setter;
9191
}
9292
}
9393
else if (auto type = value.as<sol::optional<VariantType>>()) {
@@ -118,7 +118,7 @@ LuaScriptProperty::LuaScriptProperty(const Variant& value, const StringName& nam
118118
}
119119

120120
bool LuaScriptProperty::get_value(LuaScriptInstance *self, Variant& r_value) const {
121-
if (getter.is_valid()) {
121+
if (getter.valid()) {
122122
r_value = LuaFunction::invoke_lua(getter, VariantArguments(self->owner, nullptr, 0), false);
123123
return true;
124124
}
@@ -141,7 +141,7 @@ Variant LuaScriptProperty::instantiate_default_value() const {
141141
}
142142

143143
bool LuaScriptProperty::set_value(LuaScriptInstance *self, const Variant& value) const {
144-
if (setter.is_valid()) {
144+
if (setter.valid()) {
145145
LuaCoroutine::invoke_lua(setter, Array::make(self->owner, value), false);
146146
return true;
147147
}

src/script-language/LuaScriptProperty.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@ struct LuaScriptProperty {
4949

5050
StringName getter_name;
5151
StringName setter_name;
52-
Ref<LuaFunction> getter; // Variant getter(self)
53-
Ref<LuaFunction> setter; // void setter(self, Variant value)
52+
// we use sol::protected_function instead of Ref<LuaFunction> here because LuaScriptProperty lives inside Lua
53+
// this avoids cyclic references from LuaScriptPropert to/from its owning LuaState
54+
sol::protected_function getter; // Variant getter(self)
55+
sol::protected_function setter; // void setter(self, Variant value)
5456

5557
bool get_value(LuaScriptInstance *self, Variant& r_value) const;
5658
bool set_value(LuaScriptInstance *self, const Variant& value) const;

0 commit comments

Comments
 (0)