Skip to content

Commit c1d2708

Browse files
RepiteoHandagotes
authored andcommitted
Merge pull request godotengine#108614 from dsnopek/gdextension-compat-unexposed-classes
GDExtension: Prevent compatibility breakage from change to `ClassDB::instantiate()` for unexposed classes
1 parent 7af435a commit c1d2708

File tree

3 files changed

+39
-13
lines changed

3 files changed

+39
-13
lines changed

core/extension/gdextension.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ class GDExtensionMethodBind : public MethodBind {
240240

241241
#ifndef DISABLE_DEPRECATED
242242
void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs) {
243-
const GDExtensionClassCreationInfo4 class_info4 = {
243+
const GDExtensionClassCreationInfo5 class_info5 = {
244244
p_extension_funcs->is_virtual, // GDExtensionBool is_virtual;
245245
p_extension_funcs->is_abstract, // GDExtensionBool is_abstract;
246246
true, // GDExtensionBool is_exposed;
@@ -274,14 +274,14 @@ void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library
274274
p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
275275
nullptr,
276276
};
277-
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info4, &legacy);
277+
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info5, &legacy);
278278
}
279279

280280
void GDExtension::_register_extension_class2(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo2 *p_extension_funcs) {
281-
const GDExtensionClassCreationInfo4 class_info4 = {
281+
const GDExtensionClassCreationInfo5 class_info5 = {
282282
p_extension_funcs->is_virtual, // GDExtensionBool is_virtual;
283283
p_extension_funcs->is_abstract, // GDExtensionBool is_abstract;
284-
p_extension_funcs->is_exposed, // GDExtensionBool is_exposed;
284+
true, // GDExtensionBool is_exposed;
285285
false, // GDExtensionBool is_runtime;
286286
nullptr, // GDExtensionConstStringPtr icon_path;
287287
p_extension_funcs->set_func, // GDExtensionClassSet set_func;
@@ -312,14 +312,14 @@ void GDExtension::_register_extension_class2(GDExtensionClassLibraryPtr p_librar
312312
p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
313313
p_extension_funcs->get_virtual_call_data_func, // GDExtensionClassGetVirtual get_virtual_func;
314314
};
315-
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info4, &legacy);
315+
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info5, &legacy);
316316
}
317317

318318
void GDExtension::_register_extension_class3(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs) {
319-
const GDExtensionClassCreationInfo4 class_info4 = {
319+
const GDExtensionClassCreationInfo5 class_info5 = {
320320
p_extension_funcs->is_virtual, // GDExtensionBool is_virtual;
321321
p_extension_funcs->is_abstract, // GDExtensionBool is_abstract;
322-
p_extension_funcs->is_exposed, // GDExtensionBool is_exposed;
322+
true, // GDExtensionBool is_exposed;
323323
p_extension_funcs->is_runtime, // GDExtensionBool is_runtime;
324324
nullptr, // GDExtensionConstStringPtr icon_path;
325325
p_extension_funcs->set_func, // GDExtensionClassSet set_func;
@@ -350,16 +350,22 @@ void GDExtension::_register_extension_class3(GDExtensionClassLibraryPtr p_librar
350350
p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func;
351351
p_extension_funcs->get_virtual_call_data_func, // GDExtensionClassGetVirtual get_virtual_func;
352352
};
353-
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info4, &legacy);
353+
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info5, &legacy);
354354
}
355355

356+
void GDExtension::_register_extension_class4(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs) {
357+
GDExtensionClassCreationInfo5 class_info5 = *p_extension_funcs;
358+
// Force classes to be exposed, because the behavior of unexposed classes changed in an incompatible (albeit, minor) way.
359+
class_info5.is_exposed = true;
360+
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info5);
361+
}
356362
#endif // DISABLE_DEPRECATED
357363

358-
void GDExtension::_register_extension_class4(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs) {
364+
void GDExtension::_register_extension_class5(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo5 *p_extension_funcs) {
359365
_register_extension_class_internal(p_library, p_class_name, p_parent_class_name, p_extension_funcs);
360366
}
361367

362-
void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs) {
368+
void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo5 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs) {
363369
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
364370

365371
StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
@@ -807,8 +813,9 @@ void GDExtension::initialize_gdextensions() {
807813
register_interface_function("classdb_register_extension_class", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class);
808814
register_interface_function("classdb_register_extension_class2", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class2);
809815
register_interface_function("classdb_register_extension_class3", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class3);
810-
#endif // DISABLE_DEPRECATED
811816
register_interface_function("classdb_register_extension_class4", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class4);
817+
#endif // DISABLE_DEPRECATED
818+
register_interface_function("classdb_register_extension_class5", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class5);
812819
register_interface_function("classdb_register_extension_class_method", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_method);
813820
register_interface_function("classdb_register_extension_class_virtual_method", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_virtual_method);
814821
register_interface_function("classdb_register_extension_class_integer_constant", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_integer_constant);

core/extension/gdextension.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,10 @@ class GDExtension : public Resource {
8080
static void _register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs);
8181
static void _register_extension_class2(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo2 *p_extension_funcs);
8282
static void _register_extension_class3(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs);
83-
#endif // DISABLE_DEPRECATED
8483
static void _register_extension_class4(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs);
85-
static void _register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs = nullptr);
84+
#endif // DISABLE_DEPRECATED
85+
static void _register_extension_class5(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo5 *p_extension_funcs);
86+
static void _register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo5 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs = nullptr);
8687
static void _register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info);
8788
static void _register_extension_class_virtual_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassVirtualMethodInfo *p_method_info);
8889
static void _register_extension_class_integer_constant(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield);

core/extension/gdextension_interface.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,8 @@ typedef struct {
399399
void *class_userdata; // Per-class user data, later accessible in instance bindings.
400400
} GDExtensionClassCreationInfo4;
401401

402+
typedef GDExtensionClassCreationInfo4 GDExtensionClassCreationInfo5;
403+
402404
typedef void *GDExtensionClassLibraryPtr;
403405

404406
/* Passed a pointer to a PackedStringArray that should be filled with the classes that may be used by the GDExtension. */
@@ -2943,6 +2945,7 @@ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass3)(GDExtensionCl
29432945
/**
29442946
* @name classdb_register_extension_class4
29452947
* @since 4.4
2948+
* @deprecated in Godot 4.5. Use `classdb_register_extension_class5` instead.
29462949
*
29472950
* Registers an extension class in the ClassDB.
29482951
*
@@ -2955,6 +2958,21 @@ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass3)(GDExtensionCl
29552958
*/
29562959
typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass4)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs);
29572960

2961+
/**
2962+
* @name classdb_register_extension_class5
2963+
* @since 4.5
2964+
*
2965+
* Registers an extension class in the ClassDB.
2966+
*
2967+
* Provided struct can be safely freed once the function returns.
2968+
*
2969+
* @param p_library A pointer the library received by the GDExtension's entry point function.
2970+
* @param p_class_name A pointer to a StringName with the class name.
2971+
* @param p_parent_class_name A pointer to a StringName with the parent class name.
2972+
* @param p_extension_funcs A pointer to a GDExtensionClassCreationInfo2 struct.
2973+
*/
2974+
typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass5)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo5 *p_extension_funcs);
2975+
29582976
/**
29592977
* @name classdb_register_extension_class_method
29602978
* @since 4.1

0 commit comments

Comments
 (0)