Skip to content

Commit 1b631ed

Browse files
committed
Merge pull request godotengine#104129 from dsnopek/gdextension-get-used-classes
GDExtension: Add mechanism to get which classes an extension is using
2 parents f98cddf + 2dff9fe commit 1b631ed

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

core/extension/gdextension.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,13 @@ void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExte
679679
memnew_placement(r_path, String(library_path));
680680
}
681681

682+
void GDExtension::_register_get_classes_used_callback(GDExtensionClassLibraryPtr p_library, GDExtensionEditorGetClassesUsedCallback p_callback) {
683+
#ifdef TOOLS_ENABLED
684+
GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
685+
self->get_classes_used_callback = p_callback;
686+
#endif
687+
}
688+
682689
HashMap<StringName, GDExtensionInterfaceFunctionPtr> GDExtension::gdextension_interface_functions;
683690

684691
void GDExtension::register_interface_function(const StringName &p_function_name, GDExtensionInterfaceFunctionPtr p_function_pointer) {
@@ -799,6 +806,7 @@ void GDExtension::initialize_gdextensions() {
799806
register_interface_function("classdb_register_extension_class_signal", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_signal);
800807
register_interface_function("classdb_unregister_extension_class", (GDExtensionInterfaceFunctionPtr)&GDExtension::_unregister_extension_class);
801808
register_interface_function("get_library_path", (GDExtensionInterfaceFunctionPtr)&GDExtension::_get_library_path);
809+
register_interface_function("editor_register_get_classes_used_callback", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_get_classes_used_callback);
802810
}
803811

804812
void GDExtension::finalize_gdextensions() {
@@ -1034,6 +1042,14 @@ void GDExtension::_untrack_instance(void *p_user_data, void *p_instance) {
10341042
extension->instances.erase(obj->get_instance_id());
10351043
}
10361044

1045+
PackedStringArray GDExtension::get_classes_used() const {
1046+
PackedStringArray ret;
1047+
if (get_classes_used_callback) {
1048+
get_classes_used_callback((GDExtensionTypePtr)&ret);
1049+
}
1050+
return ret;
1051+
}
1052+
10371053
Vector<StringName> GDExtensionEditorPlugins::extension_classes;
10381054
GDExtensionEditorPlugins::EditorPluginRegisterFunc GDExtensionEditorPlugins::editor_node_add_plugin = nullptr;
10391055
GDExtensionEditorPlugins::EditorPluginRegisterFunc GDExtensionEditorPlugins::editor_node_remove_plugin = nullptr;

core/extension/gdextension.h

+4
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class GDExtension : public Resource {
9393
static void _register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count);
9494
static void _unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name);
9595
static void _get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path);
96+
static void _register_get_classes_used_callback(GDExtensionClassLibraryPtr p_library, GDExtensionEditorGetClassesUsedCallback p_callback);
9697

9798
GDExtensionInitialization initialization;
9899
int32_t level_initialized = -1;
@@ -101,6 +102,7 @@ class GDExtension : public Resource {
101102
bool is_reloading = false;
102103
Vector<GDExtensionMethodBind *> invalid_methods;
103104
Vector<ObjectID> instance_bindings;
105+
GDExtensionEditorGetClassesUsedCallback get_classes_used_callback = nullptr;
104106

105107
static void _track_instance(void *p_user_data, void *p_instance);
106108
static void _untrack_instance(void *p_user_data, void *p_instance);
@@ -155,6 +157,8 @@ class GDExtension : public Resource {
155157

156158
void track_instance_binding(Object *p_object);
157159
void untrack_instance_binding(Object *p_object);
160+
161+
PackedStringArray get_classes_used() const;
158162
#endif
159163

160164
InitializationLevel get_minimum_library_initialization_level() const;

core/extension/gdextension_interface.h

+19
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,9 @@ typedef struct {
400400

401401
typedef void *GDExtensionClassLibraryPtr;
402402

403+
/* Passed a pointer to a PackedStringArray that should be filled with the classes that may be used by the GDExtension. */
404+
typedef void (*GDExtensionEditorGetClassesUsedCallback)(GDExtensionTypePtr p_packed_string_array);
405+
403406
/* Method */
404407

405408
typedef enum {
@@ -3111,6 +3114,22 @@ typedef void (*GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8Chars)(const char *
31113114
*/
31123115
typedef void (*GDExtensionsInterfaceEditorHelpLoadXmlFromUtf8CharsAndLen)(const char *p_data, GDExtensionInt p_size);
31133116

3117+
/**
3118+
* @name editor_register_get_classes_used_callback
3119+
* @since 4.5
3120+
*
3121+
* Registers a callback that Godot can call to get the list of all classes (from ClassDB) that may be used by the calling GDExtension.
3122+
*
3123+
* This is used by the editor to generate a build profile (in "Tools" > "Engine Compilation Configuration Editor..." > "Detect from project"),
3124+
* in order to recompile Godot with only the classes used.
3125+
* In the provided callback, the GDExtension should provide the list of classes that _may_ be used statically, thus the time of invocation shouldn't matter.
3126+
* If a GDExtension doesn't register a callback, Godot will assume that it could be using any classes.
3127+
*
3128+
* @param p_library A pointer the library received by the GDExtension's entry point function.
3129+
* @param p_callback The callback to retrieve the list of classes used.
3130+
*/
3131+
typedef void (*GDExtensionInterfaceEditorRegisterGetClassesUsedCallback)(GDExtensionClassLibraryPtr p_library, GDExtensionEditorGetClassesUsedCallback p_callback);
3132+
31143133
#ifdef __cplusplus
31153134
}
31163135
#endif

0 commit comments

Comments
 (0)