Skip to content

Commit ce3c083

Browse files
authored
Merge pull request #896 from touilleMan/stringname-in-gdextension-api
Uses `StringName` in GDExtension perf critical instance creation & method/properties setter/getter
2 parents 73ad671 + ed4d3d3 commit ce3c083

File tree

16 files changed

+377
-369
lines changed

16 files changed

+377
-369
lines changed

binding_generator.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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"\tstatic constexpr size_t {snake_class_name}_SIZE = {size};")
396396
result.append(f"\tuint8_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("\tfriend class Variant;")
400+
if class_name == "String":
401+
result.append("\tfriend class StringName;")
403402

404403
result.append("")
405404
result.append("\tstatic 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("\tstatic void init_bindings();")
444+
result.append("\tstatic 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"\tString::_init_bindings_constructors_destructor();")
701+
result.append(f"\t{class_name}::_init_bindings_constructors_destructor();")
702+
703+
result.append(f"\tStringName __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"\tconst StringName __class_name = {class_name}::get_class_static();")
12951313
result.append(
1296-
f'\tstatic GDNativeObjectPtr singleton_obj = internal::gdn_interface->global_get_singleton("{class_name}");'
1314+
f"\tstatic GDNativeObjectPtr singleton_obj = internal::gdn_interface->global_get_singleton(__class_name._native_ptr());"
12971315
)
12981316
result.append("#ifdef DEBUG_ENABLED")
12991317
result.append("\tERR_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"\tconst StringName __class_name = {class_name}::get_class_static();")
1340+
result.append(f'\tconst StringName __method_name = "{method["name"]}";')
13211341
result.append(
1322-
f'\tstatic GDNativeMethodBindPtr ___method_bind = internal::gdn_interface->classdb_get_method_bind("{class_name}", "{method["name"]}", {method["hash"]});'
1342+
f'\tstatic 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'\tconst StringName __function_name = "{function["name"]}";')
15691590
source.append(
1570-
f'\tstatic GDNativePtrUtilityFunction ___function = internal::gdn_interface->variant_get_ptr_utility_function("{function["name"]}", {function["hash"]});'
1591+
f'\tstatic 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:

godot-headers/extension_api.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264388,4 +264388,4 @@
264388264388
"format": "StringName signature;uint64_t call_count;uint64_t total_time;uint64_t self_time"
264389264389
}
264390264390
]
264391-
}
264391+
}

0 commit comments

Comments
 (0)