Skip to content

Commit 5dd072c

Browse files
committed
Protect against double (un)register in scripts/gdextension_cython_preprocessor.py
1 parent 2105bcb commit 5dd072c

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

scripts/gdextension_cython_preprocessor.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,28 @@ def __cinit__(self):
123123
@staticmethod
124124
def __godot_extension_unregister_class():
125125
# print("[DEBUG] {spec.class_name}.__godot_extension_unregister_class()")
126+
127+
global __godot_extension_{spec.class_name}_registered
128+
if not __godot_extension_{spec.class_name}_registered:
129+
print("Not registered !", flush=True)
130+
raise RuntimeError("Not registered !")
131+
126132
{spec.class_name + "." + spec.unregister_class_hook + "()" if spec.unregister_class_hook is not None else ""}
127133
unregister_extension_class(b"{spec.class_name}")
128134
gd_string_name_del(&__godot_extension_{spec.class_name}_class_name)
129135
gd_string_name_del(&__godot_extension_{spec.class_name}_parent_class_name)
130136
137+
__godot_extension_{spec.class_name}_registered = False
138+
131139
@staticmethod
132140
def __godot_extension_register_class():
133141
# print("[DEBUG] {spec.class_name}.__godot_extension_register_class()")
134142
143+
global __godot_extension_{spec.class_name}_registered
144+
if __godot_extension_{spec.class_name}_registered:
145+
print("Already registered !", flush=True)
146+
raise RuntimeError("Already registered !")
147+
135148
global __godot_extension_{spec.class_name}_class_name
136149
global __godot_extension_{spec.class_name}_parent_class_name
137150
__godot_extension_{spec.class_name}_class_name = gd_string_name_from_unchecked_pystr("{spec.class_name}")
@@ -147,6 +160,8 @@ def __godot_extension_register_class():
147160
{"True" if spec.is_abstract else "False"},
148161
{"True" if spec.is_exposed else "False"},
149162
)
163+
164+
__godot_extension_{spec.class_name}_registered = True
150165
"""
151166
for method in spec.methods:
152167
cooked_params = "["
@@ -218,6 +233,7 @@ def generate_injected_module_code(spec: ModuleDef) -> str:
218233
for klass in spec.classes:
219234
code += f"""
220235
# {klass.class_name}
236+
cdef bint __godot_extension_{klass.class_name}_registered = False
221237
cdef gd_string_name_t __godot_extension_{klass.class_name}_class_name
222238
cdef gd_string_name_t __godot_extension_{klass.class_name}_parent_class_name
223239
"""

0 commit comments

Comments
 (0)