Skip to content

Commit a8f9c55

Browse files
committed
Use StringName in the whole GDExtension API instead of const char *
1 parent f79da6e commit a8f9c55

File tree

14 files changed

+316
-312
lines changed

14 files changed

+316
-312
lines changed

binding_generator.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -394,9 +394,6 @@ 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;")
@@ -446,6 +443,10 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
446443
result.append("")
447444
result.append("public:")
448445

446+
result.append(
447+
f"\t_FORCE_INLINE_ GDNativeTypePtr _native_ptr() const {{ return const_cast<uint8_t (*)[{snake_class_name}_SIZE]>(&opaque); }}"
448+
)
449+
449450
copy_constructor_index = -1
450451

451452
if "constructors" in builtin_api:
@@ -694,17 +695,17 @@ def generate_builtin_class_source(builtin_api, size, used_classes, fully_used_cl
694695
# TODO: Add error check for hash mismatch.
695696
result.append(f'\t__name = StringName("{method["name"]}");')
696697
result.append(
697-
f'\t_method_bindings.method_{method["name"]} = internal::gdn_interface->variant_get_ptr_builtin_method({enum_type_name}, (void *)&__name, {method["hash"]});'
698+
f'\t_method_bindings.method_{method["name"]} = internal::gdn_interface->variant_get_ptr_builtin_method({enum_type_name}, __name._native_ptr(), {method["hash"]});'
698699
)
699700

700701
if "members" in builtin_api:
701702
for member in builtin_api["members"]:
702703
result.append(f'\t__name = StringName("{member["name"]}");')
703704
result.append(
704-
f'\t_method_bindings.member_{member["name"]}_setter = internal::gdn_interface->variant_get_ptr_setter({enum_type_name}, (void *)&__name);'
705+
f'\t_method_bindings.member_{member["name"]}_setter = internal::gdn_interface->variant_get_ptr_setter({enum_type_name}, __name._native_ptr());'
705706
)
706707
result.append(
707-
f'\t_method_bindings.member_{member["name"]}_getter = internal::gdn_interface->variant_get_ptr_getter({enum_type_name}, (void *)&__name);'
708+
f'\t_method_bindings.member_{member["name"]}_getter = internal::gdn_interface->variant_get_ptr_getter({enum_type_name}, __name._native_ptr());'
708709
)
709710

710711
if "indexing_return_type" in builtin_api:
@@ -1296,9 +1297,9 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
12961297

12971298
if is_singleton:
12981299
result.append(f"{class_name} *{class_name}::get_singleton() {{")
1299-
result.append(f'\tconst StringName __class_name = {class_name}::get_class_static();')
1300+
result.append(f"\tconst StringName __class_name = {class_name}::get_class_static();")
13001301
result.append(
1301-
f"\tstatic GDNativeObjectPtr singleton_obj = internal::gdn_interface->global_get_singleton((void *)&__class_name);"
1302+
f"\tstatic GDNativeObjectPtr singleton_obj = internal::gdn_interface->global_get_singleton(__class_name._native_ptr());"
13021303
)
13031304
result.append("#ifdef DEBUG_ENABLED")
13041305
result.append("\tERR_FAIL_COND_V(singleton_obj == nullptr, nullptr);")
@@ -1323,10 +1324,10 @@ def generate_engine_class_source(class_api, used_classes, fully_used_classes, us
13231324
result.append(method_signature + " {")
13241325

13251326
# Method body.
1326-
result.append(f'\tconst StringName __class_name = {class_name}::get_class_static();')
1327+
result.append(f"\tconst StringName __class_name = {class_name}::get_class_static();")
13271328
result.append(f'\tconst StringName __method_name = "{method["name"]}";')
13281329
result.append(
1329-
f'\tstatic GDNativeMethodBindPtr ___method_bind = internal::gdn_interface->classdb_get_method_bind((void *)&__class_name, (void *)&__method_name, {method["hash"]});'
1330+
f'\tstatic GDNativeMethodBindPtr ___method_bind = internal::gdn_interface->classdb_get_method_bind(__class_name._native_ptr(), __method_name._native_ptr(), {method["hash"]});'
13301331
)
13311332
method_call = "\t"
13321333
has_return = "return_value" in method and method["return_value"]["type"] != "void"
@@ -1575,7 +1576,7 @@ def generate_utility_functions(api, output_dir):
15751576

15761577
source.append(f'\tconst StringName __function_name = "{function["name"]}";')
15771578
source.append(
1578-
f'\tstatic GDNativePtrUtilityFunction ___function = internal::gdn_interface->variant_get_ptr_utility_function((void *)&__function_name, {function["hash"]});'
1579+
f'\tstatic GDNativePtrUtilityFunction ___function = internal::gdn_interface->variant_get_ptr_utility_function(__function_name._native_ptr(), {function["hash"]});'
15791580
)
15801581
has_return = "return_type" in function and function["return_type"] != "void"
15811582
if has_return:

godot-headers/godot/gdnative_interface.h

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -202,21 +202,21 @@ typedef uint64_t (*GDNativeExtensionClassGetRID)(GDExtensionClassInstancePtr p_i
202202

203203
typedef struct {
204204
GDNativeVariantType type;
205-
const char *name;
206-
const char *class_name;
205+
GDNativeStringNamePtr name;
206+
GDNativeStringNamePtr class_name;
207207
uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`)
208-
const char *hint_string;
208+
GDNativeStringPtr hint_string;
209209
uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`)
210210
} GDNativePropertyInfo;
211211

212212
typedef struct {
213-
const char *name;
213+
GDNativeStringNamePtr name;
214214
GDNativePropertyInfo return_value;
215215
uint32_t flags; // Bitfield of `GDNativeExtensionClassMethodFlags`
216216
int32_t id;
217-
GDNativePropertyInfo *arguments;
217+
GDNativePropertyInfo *arguments; // array of `argument_count` size
218218
uint32_t argument_count;
219-
GDNativeVariantPtr default_arguments;
219+
GDNativeVariantPtr *default_arguments; // array of `default_argument_count` size
220220
uint32_t default_argument_count;
221221
} GDNativeMethodInfo;
222222

@@ -231,7 +231,7 @@ typedef void (*GDNativeExtensionClassUnreference)(GDExtensionClassInstancePtr p_
231231
typedef void (*GDNativeExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
232232
typedef GDNativeObjectPtr (*GDNativeExtensionClassCreateInstance)(void *p_userdata);
233233
typedef void (*GDNativeExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
234-
typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, const char *p_name);
234+
typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, const GDNativeStringNamePtr p_name);
235235

236236
typedef struct {
237237
GDNativeBool is_virtual;
@@ -284,24 +284,21 @@ typedef enum {
284284
typedef void (*GDNativeExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDNativeVariantPtr *p_args, const GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
285285
typedef void (*GDNativeExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDNativeTypePtr *p_args, GDNativeTypePtr r_ret);
286286

287-
/* passing -1 as argument in the following functions refers to the return type */
288-
typedef GDNativeVariantType (*GDNativeExtensionClassMethodGetArgumentType)(void *p_method_userdata, int32_t p_argument);
289-
typedef void (*GDNativeExtensionClassMethodGetArgumentInfo)(void *p_method_userdata, int32_t p_argument, GDNativePropertyInfo *r_info);
290-
typedef GDNativeExtensionClassMethodArgumentMetadata (*GDNativeExtensionClassMethodGetArgumentMetadata)(void *p_method_userdata, int32_t p_argument);
291-
292287
typedef struct {
293-
const char *name;
288+
GDNativeStringNamePtr name;
294289
void *method_userdata;
295290
GDNativeExtensionClassMethodCall call_func;
296291
GDNativeExtensionClassMethodPtrCall ptrcall_func;
297292
uint32_t method_flags; // Bitfield of `GDNativeExtensionClassMethodFlags`
298293
uint32_t argument_count;
299294
GDNativeBool has_return_value;
300-
GDNativeExtensionClassMethodGetArgumentType get_argument_type_func;
301-
GDNativeExtensionClassMethodGetArgumentInfo get_argument_info_func; /* name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. */
302-
GDNativeExtensionClassMethodGetArgumentMetadata get_argument_metadata_func;
295+
GDNativePropertyInfo *return_value_info; // Ignored if `has_return_value` is false
296+
GDNativeExtensionClassMethodArgumentMetadata *return_value_metadata; // Ignored if `has_return_value` is false
297+
/* name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. */
298+
GDNativePropertyInfo *aguments_info; // array of `argument_count` size
299+
GDNativeExtensionClassMethodArgumentMetadata *aguments_metadata; // array of `argument_count` size
303300
uint32_t default_argument_count;
304-
GDNativeVariantPtr *default_arguments;
301+
GDNativeVariantPtr *default_arguments; // array of `default_argument_count` size
305302
} GDNativeExtensionClassMethodInfo;
306303

307304
/* SCRIPT INSTANCE EXTENSION */
@@ -546,14 +543,14 @@ typedef struct {
546543

547544
/* CLASSDB EXTENSION */
548545

549-
void (*classdb_register_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
550-
void (*classdb_register_extension_class_method)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
551-
void (*classdb_register_extension_class_integer_constant)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_enum_name, const char *p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield);
552-
void (*classdb_register_extension_class_property)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const GDNativePropertyInfo *p_info, const char *p_setter, const char *p_getter);
553-
void (*classdb_register_extension_class_property_group)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_group_name, const char *p_prefix);
554-
void (*classdb_register_extension_class_property_subgroup)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_subgroup_name, const char *p_prefix);
555-
void (*classdb_register_extension_class_signal)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name, const char *p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
556-
void (*classdb_unregister_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const char *p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
546+
void (*classdb_register_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativeStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
547+
void (*classdb_register_extension_class_method)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
548+
void (*classdb_register_extension_class_integer_constant)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativeStringNamePtr p_enum_name, const GDNativeStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield);
549+
void (*classdb_register_extension_class_property)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, const GDNativeStringNamePtr p_setter, const GDNativeStringNamePtr p_getter);
550+
void (*classdb_register_extension_class_property_group)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativeStringNamePtr p_group_name, const GDNativeStringNamePtr p_prefix);
551+
void (*classdb_register_extension_class_property_subgroup)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativeStringNamePtr p_subgroup_name, const GDNativeStringNamePtr p_prefix);
552+
void (*classdb_register_extension_class_signal)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name, const GDNativeStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
553+
void (*classdb_unregister_extension_class)(const GDNativeExtensionClassLibraryPtr p_library, const GDNativeStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
557554

558555
void (*get_library_path)(const GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path);
559556

include/godot_cpp/classes/ref.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,8 @@ struct GetTypeInfo<Ref<T>, typename EnableIf<TypeInherits<RefCounted, T>::value>
264264
static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT;
265265
static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE;
266266

267-
static inline GDNativePropertyInfo get_class_info() {
268-
return make_property_info(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static());
267+
static inline PropertyInfo get_class_info() {
268+
return make_property_info(Variant::Type::OBJECT, T::get_class_static());
269269
}
270270
};
271271

@@ -274,8 +274,8 @@ struct GetTypeInfo<const Ref<T> &, typename EnableIf<TypeInherits<RefCounted, T>
274274
static const GDNativeVariantType VARIANT_TYPE = GDNATIVE_VARIANT_TYPE_OBJECT;
275275
static const GDNativeExtensionClassMethodArgumentMetadata METADATA = GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE;
276276

277-
static inline GDNativePropertyInfo get_class_info() {
278-
return make_property_info(GDNATIVE_VARIANT_TYPE_OBJECT, T::get_class_static());
277+
static inline PropertyInfo get_class_info() {
278+
return make_property_info(Variant::Type::OBJECT, T::get_class_static());
279279
}
280280
};
281281

0 commit comments

Comments
 (0)