diff --git a/binding_generator.py b/binding_generator.py index d04c6987b0..272c826090 100644 --- a/binding_generator.py +++ b/binding_generator.py @@ -1453,13 +1453,16 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us if is_singleton: result.append(f"{class_name} *{class_name}::get_singleton() {{") - result.append(f"\tconst StringName _gde_class_name = {class_name}::get_class_static();") + result.append("\tstatic GDExtensionObjectPtr singleton_obj = nullptr;") + result.append("\tif (unlikely(singleton_obj == nullptr)) {") + result.append(f"\t\tconst StringName _gde_class_name = {class_name}::get_class_static();") result.append( - "\tstatic GDExtensionObjectPtr singleton_obj = internal::gdextension_interface_global_get_singleton(_gde_class_name._native_ptr());" + "\t\tsingleton_obj = internal::gdextension_interface_global_get_singleton(_gde_class_name._native_ptr());" ) result.append("#ifdef DEBUG_ENABLED") - result.append("\tERR_FAIL_COND_V(singleton_obj == nullptr, nullptr);") + result.append("\t\tERR_FAIL_COND_V(singleton_obj == nullptr, nullptr);") result.append("#endif // DEBUG_ENABLED") + result.append("\t}") result.append( f"\tstatic {class_name} *singleton = reinterpret_cast<{class_name} *>(internal::gdextension_interface_object_get_instance_binding(singleton_obj, internal::token, &{class_name}::_gde_binding_callbacks));" )