Skip to content

Commit 1c202de

Browse files
committed
wip
1 parent 5524e38 commit 1c202de

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

src/godot/builtins_pyx/conversion.pyx.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ cdef object gd_variant_steal_into_pyobj(const gd_variant_t *gdvar):
9595
cdef inline object _gd_variant_steal_into_pyobj_{{ builtin.cy_type }}(const gd_variant_t *gdvar):
9696
cdef {{ builtin.cy_type }} ret = {{ builtin.cy_type }}.__new__({{ builtin.cy_type }})
9797
ret._gd_data = {{ builtin.c_name_prefix }}_from_variant(<gd_variant_t *>gdvar)
98+
gd_variant_del(gdvar)
9899
return ret
99100
{% endfor %}
100101

@@ -111,6 +112,7 @@ cdef object gd_variant_copy_into_pyobj(const gd_variant_t *gdvar):
111112
#########################################################################
112113

113114

115+
# TODO rename given stealing is not possible with GDExtension C++ orientated API
114116
cdef bint gd_variant_steal_from_pyobj(object pyobj, gd_variant_t *gdvar):
115117
if pyobj is None:
116118
pythonscript_gdextension.variant_new_nil(gdvar)
@@ -138,5 +140,6 @@ cdef bint gd_variant_steal_from_pyobj(object pyobj, gd_variant_t *gdvar):
138140
cdef inline void _gd_variant_steal_from_pyobj_pystr(object pyobj, gd_variant_t *gdvar):
139141
cdef gd_string_t gdstr = gd_string_from_unchecked_pystr(pyobj)
140142
gdvar[0] = gd_string_into_variant(&gdstr)
143+
gd_string_del(&gdstr)
141144
# into conversion steals the ownership, so don't need to call `gd_string_del(gdstr)`
142145
{% endmacro %}

src/godot/classes.pxd.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,5 @@ cdef class {{ cls.cy_type }}({{ cls.inherits.cy_type if cls.inherits else "" }})
8383

8484
cdef object _load_class(str name)
8585
cdef object _load_singleton(str name)
86+
cdef void _cleanup_loaded_classes_and_singletons()
8687
cdef object _object_call(gd_object_t obj, str meth, args)

src/godot/classes.pyx.j2

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ cdef object _loaded_singletons = {}
8888
cdef object _loaded_classes = {}
8989

9090

91+
cdef void _cleanup_loaded_classes_and_singletons():
92+
_loaded_singletons.clear()
93+
_loaded_classes.clear()
94+
95+
9196
cdef object _load_singleton(str name):
9297
try:
9398
return _loaded_singletons[name]
@@ -186,6 +191,7 @@ cdef object _load_class(str name):
186191

187192

188193
cdef object _object_call(GDExtensionObjectPtr obj, str meth, args):
194+
cdef object pyret
189195
cdef gd_variant_t ret
190196
cdef GDExtensionCallError call_error
191197

@@ -206,6 +212,8 @@ cdef object _object_call(GDExtensionObjectPtr obj, str meth, args):
206212
# TODO: provide a helper for string name from Python str creation
207213
cdef gd_string_name_t meth_gdstrname = gd_string_name_from_unchecked_pystr(meth)
208214
variant_args[0] = gd_string_name_into_variant(&meth_gdstrname)
215+
gd_string_name_del(&meth_gdstrname)
216+
# TODO: rename !
209217
# Into conversion steals the owneship, so no need to delete meth_gdstrname
210218

211219
for i, arg in enumerate(args, 1):
@@ -222,10 +230,12 @@ cdef object _object_call(GDExtensionObjectPtr obj, str meth, args):
222230
&ret,
223231
&call_error,
224232
)
225-
gd_variant_del(&variant_args[0]) # Only param we created without stealing ownership
233+
for i in range(args_with_meth_len):
234+
gd_variant_del(&variant_args[i])
235+
# gd_variant_del(&variant_args[0]) # Only param we created without stealing ownership
226236
if call_error.error == GDEXTENSION_CALL_OK:
227-
return gd_variant_steal_into_pyobj(&ret)
228237
# No need to destroy ret given the conversion has stolen ownership on data !
238+
return gd_variant_steal_into_pyobj(&ret)
229239

230240
# TODO: improve ret error raised exception type ?
231241
elif call_error.error == GDEXTENSION_CALL_ERROR_INVALID_METHOD:

0 commit comments

Comments
 (0)