@@ -394,12 +394,11 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
394394 result .append (f"class { class_name } {{" )
395395 result .append (f"\t static constexpr size_t { snake_class_name } _SIZE = { size } ;" )
396396 result .append (f"\t uint8_t opaque[{ snake_class_name } _SIZE] = {{}};" )
397- result .append (
398- f"\t _FORCE_INLINE_ GDNativeTypePtr _native_ptr() const {{ return const_cast<uint8_t (*)[{ snake_class_name } _SIZE]>(&opaque); }}"
399- )
400397
401398 result .append ("" )
402399 result .append ("\t friend class Variant;" )
400+ if class_name == "String" :
401+ result .append ("\t friend class StringName;" )
403402
404403 result .append ("" )
405404 result .append ("\t static struct _MethodBindings {" )
@@ -442,10 +441,15 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
442441
443442 result .append ("" )
444443 result .append ("\t static void init_bindings();" )
444+ result .append ("\t static void _init_bindings_constructors_destructor();" )
445445
446446 result .append ("" )
447447 result .append ("public:" )
448448
449+ result .append (
450+ f"\t _FORCE_INLINE_ GDNativeTypePtr _native_ptr() const {{ return const_cast<uint8_t (*)[{ snake_class_name } _SIZE]>(&opaque); }}"
451+ )
452+
449453 copy_constructor_index = - 1
450454
451455 if "constructors" in builtin_api :
@@ -674,7 +678,7 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
674678 result .append (f"{ class_name } ::_MethodBindings { class_name } ::_method_bindings;" )
675679 result .append ("" )
676680
677- result .append (f"void { class_name } ::init_bindings () {{" )
681+ result .append (f"void { class_name } ::_init_bindings_constructors_destructor () {{" )
678682
679683 if "constructors" in builtin_api :
680684 for constructor in builtin_api ["constructors" ]:
@@ -687,20 +691,33 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
687691 f"\t _method_bindings.destructor = internal::gdn_interface->variant_get_ptr_destructor({ enum_type_name } );"
688692 )
689693
694+ result .append ("}" )
695+
696+ result .append (f"void { class_name } ::init_bindings() {{" )
697+
698+ # StringName's constructor internally uses String, so it constructor must be ready !
699+ if class_name == "StringName" :
700+ result .append (f"\t String::_init_bindings_constructors_destructor();" )
701+ result .append (f"\t { class_name } ::_init_bindings_constructors_destructor();" )
702+
703+ result .append (f"\t StringName __name;" )
704+
690705 if "methods" in builtin_api :
691706 for method in builtin_api ["methods" ]:
692707 # TODO: Add error check for hash mismatch.
708+ result .append (f'\t __name = StringName("{ method ["name" ]} ");' )
693709 result .append (
694- f'\t _method_bindings.method_{ method ["name" ]} = internal::gdn_interface->variant_get_ptr_builtin_method({ enum_type_name } , " { method [ "name" ] } " , { method ["hash" ]} );'
710+ f'\t _method_bindings.method_{ method ["name" ]} = internal::gdn_interface->variant_get_ptr_builtin_method({ enum_type_name } , __name._native_ptr() , { method ["hash" ]} );'
695711 )
696712
697713 if "members" in builtin_api :
698714 for member in builtin_api ["members" ]:
715+ result .append (f'\t __name = StringName("{ member ["name" ]} ");' )
699716 result .append (
700- f'\t _method_bindings.member_{ member ["name" ]} _setter = internal::gdn_interface->variant_get_ptr_setter({ enum_type_name } , " { member [ "name" ] } " );'
717+ f'\t _method_bindings.member_{ member ["name" ]} _setter = internal::gdn_interface->variant_get_ptr_setter({ enum_type_name } , __name._native_ptr() );'
701718 )
702719 result .append (
703- f'\t _method_bindings.member_{ member ["name" ]} _getter = internal::gdn_interface->variant_get_ptr_getter({ enum_type_name } , " { member [ "name" ] } " );'
720+ f'\t _method_bindings.member_{ member ["name" ]} _getter = internal::gdn_interface->variant_get_ptr_getter({ enum_type_name } , __name._native_ptr() );'
704721 )
705722
706723 if "indexing_return_type" in builtin_api :
@@ -1292,8 +1309,9 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
12921309
12931310 if is_singleton :
12941311 result .append (f"{ class_name } *{ class_name } ::get_singleton() {{" )
1312+ result .append (f"\t const StringName __class_name = { class_name } ::get_class_static();" )
12951313 result .append (
1296- f' \t static GDNativeObjectPtr singleton_obj = internal::gdn_interface->global_get_singleton(" { class_name } ");'
1314+ f" \t static GDNativeObjectPtr singleton_obj = internal::gdn_interface->global_get_singleton(__class_name._native_ptr());"
12971315 )
12981316 result .append ("#ifdef DEBUG_ENABLED" )
12991317 result .append ("\t ERR_FAIL_COND_V(singleton_obj == nullptr, nullptr);" )
@@ -1318,8 +1336,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
13181336 result .append (method_signature + " {" )
13191337
13201338 # Method body.
1339+ result .append (f"\t const StringName __class_name = { class_name } ::get_class_static();" )
1340+ result .append (f'\t const StringName __method_name = "{ method ["name" ]} ";' )
13211341 result .append (
1322- f'\t static GDNativeMethodBindPtr ___method_bind = internal::gdn_interface->classdb_get_method_bind(" { class_name } ", " { method [ "name" ] } " , { method ["hash" ]} );'
1342+ f'\t static GDNativeMethodBindPtr ___method_bind = internal::gdn_interface->classdb_get_method_bind(__class_name._native_ptr(), __method_name._native_ptr() , { method ["hash" ]} );'
13231343 )
13241344 method_call = "\t "
13251345 has_return = "return_value" in method and method ["return_value" ]["type" ] != "void"
@@ -1566,8 +1586,9 @@ def generate_utility_functions(api, output_dir):
15661586
15671587 # Function body.
15681588
1589+ source .append (f'\t const StringName __function_name = "{ function ["name" ]} ";' )
15691590 source .append (
1570- f'\t static GDNativePtrUtilityFunction ___function = internal::gdn_interface->variant_get_ptr_utility_function(" { function [ "name" ] } " , { function ["hash" ]} );'
1591+ f'\t static GDNativePtrUtilityFunction ___function = internal::gdn_interface->variant_get_ptr_utility_function(__function_name._native_ptr() , { function ["hash" ]} );'
15711592 )
15721593 has_return = "return_type" in function and function ["return_type" ] != "void"
15731594 if has_return :
0 commit comments