Browse Source

Merge pull request #69718 from groud/finally_rename_gdnative_to_gdextension

Rename all gdnative occurences to gdextension
Rémi Verschelde 2 years ago
parent
commit
f1edd03d4c
66 changed files with 2193 additions and 2194 deletions
  1. 1 2
      .github/CODEOWNERS
  2. 1 1
      .github/workflows/linux_builds.yml
  3. 1 1
      .gitignore
  4. 2 2
      core/extension/SCsub
  5. 4 4
      core/extension/extension_api_dump.cpp
  6. 2 2
      core/extension/extension_api_dump.h
  7. 99 99
      core/extension/gdextension.cpp
  8. 28 28
      core/extension/gdextension.h
  9. 1083 0
      core/extension/gdextension_interface.cpp
  10. 612 0
      core/extension/gdextension_interface.h
  11. 38 38
      core/extension/gdextension_manager.cpp
  12. 15 15
      core/extension/gdextension_manager.h
  13. 0 1083
      core/extension/gdnative_interface.cpp
  14. 0 612
      core/extension/gdnative_interface.h
  15. 7 7
      core/extension/make_interface_dumper.py
  16. 2 2
      core/io/packet_peer.h
  17. 4 4
      core/io/stream_peer.h
  18. 10 10
      core/object/class_db.cpp
  19. 2 2
      core/object/class_db.h
  20. 7 7
      core/object/make_virtuals.py
  21. 9 9
      core/object/object.cpp
  22. 29 29
      core/object/object.h
  23. 32 32
      core/object/script_language_extension.h
  24. 17 17
      core/register_core_types.cpp
  25. 46 46
      core/variant/native_ptr.h
  26. 1 1
      core/variant/variant_internal.h
  27. 3 3
      doc/classes/@GlobalScope.xml
  28. 3 3
      doc/classes/GDExtension.xml
  29. 5 5
      doc/classes/GDExtensionManager.xml
  30. 1 1
      drivers/register_driver_types.cpp
  31. 11 11
      editor/editor_file_system.cpp
  32. 2 2
      editor/export/editor_export_platform.cpp
  33. 1 1
      editor/export/editor_export_plugin.h
  34. 2 2
      editor/plugins/gdextension_export_plugin.h
  35. 1 1
      editor/project_converter_3_to_4.cpp
  36. 22 22
      main/main.cpp
  37. 1 1
      misc/dist/linux/godot.6
  38. 1 1
      misc/dist/shell/_godot.zsh-completion
  39. 1 1
      misc/dist/shell/godot.fish
  40. 3 3
      modules/mono/csharp_script.cpp
  41. 2 2
      modules/mono/csharp_script.h
  42. 1 1
      modules/mono/glue/GodotSharp/GodotSharp.sln.DotSettings
  43. 5 5
      modules/register_module_types.h
  44. 1 1
      modules/text_server_adv/register_types.cpp
  45. 1 1
      modules/text_server_fb/register_types.cpp
  46. 2 2
      modules/webrtc/webrtc_data_channel_extension.h
  47. 4 4
      platform/android/export/export_plugin.cpp
  48. 15 15
      platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java
  49. 3 3
      platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginInfoProvider.java
  50. 9 9
      platform/android/plugin/godot_plugin_jni.cpp
  51. 1 1
      platform/android/plugin/godot_plugin_jni.h
  52. 1 1
      platform/ios/export/export_plugin.cpp
  53. 1 1
      platform/web/export/export_plugin.cpp
  54. 2 2
      platform/web/js/engine/config.js
  55. 2 2
      platform/web/js/engine/engine.js
  56. 1 1
      platform/windows/os_windows.cpp
  57. 2 2
      scene/main/multiplayer_peer.h
  58. 1 1
      scene/register_scene_types.cpp
  59. 1 1
      servers/audio/audio_effect.h
  60. 2 2
      servers/audio/audio_stream.h
  61. 9 9
      servers/extensions/physics_server_2d_extension.h
  62. 7 7
      servers/extensions/physics_server_3d_extension.h
  63. 1 1
      servers/movie_writer/movie_writer.h
  64. 2 2
      servers/physics_server_3d.h
  65. 3 3
      servers/text/text_server_extension.cpp
  66. 5 5
      servers/text/text_server_extension.h

+ 1 - 2
.github/CODEOWNERS

@@ -118,13 +118,12 @@ doc_classes/*                       @godotengine/documentation
 
 ## Text
 /modules/freetype/                  @godotengine/buildsystem
-/modules/gdnative/text/             @godotengine/gui-nodes
 /modules/text_server_adv/           @godotengine/gui-nodes
 /modules/text_server_fb/            @godotengine/gui-nodes
 
 ## XR
 /modules/camera/                    @godotengine/xr
-/modules/gdnative/xr/               @godotengine/xr
+/modules/gdextension/xr/            @godotengine/xr
 /modules/mobile_vr/                 @godotengine/xr
 /modules/webxr/                     @godotengine/xr
 

+ 1 - 1
.github/workflows/linux_builds.yml

@@ -211,7 +211,7 @@ jobs:
         if: ${{ matrix.godot-cpp-test }}
         run: |
           cp -f extension_api.json godot-cpp/godot-headers/
-          cp -f core/extension/gdnative_interface.h godot-cpp/godot-headers/godot/
+          cp -f core/extension/gdextension_interface.h godot-cpp/godot-headers/godot/
 
       # Build godot-cpp test extension
       - name: Build godot-cpp test extension

+ 1 - 1
.gitignore

@@ -37,7 +37,7 @@ platform/windows/godot_res.res
 
 # Generated by Godot binary
 .import/
-/gdnative_interface.h
+/gdextension_interface.h
 extension_api.json
 logs/
 

+ 2 - 2
core/extension/SCsub

@@ -8,8 +8,8 @@ from platform_methods import run_in_subprocess
 
 env.CommandNoCache(["ext_wrappers.gen.inc"], "make_wrappers.py", run_in_subprocess(make_wrappers.run))
 env.CommandNoCache(
-    "gdnative_interface_dump.gen.h",
-    ["gdnative_interface.h", "make_interface_dumper.py"],
+    "gdextension_interface_dump.gen.h",
+    ["gdextension_interface.h", "make_interface_dumper.py"],
     run_in_subprocess(make_interface_dumper.run),
 )
 

+ 4 - 4
core/extension/extension_api_dump.cpp

@@ -82,7 +82,7 @@ static String get_property_info_type_name(const PropertyInfo &p_info) {
 	return get_builtin_or_variant_type_name(p_info.type);
 }
 
-Dictionary NativeExtensionAPIDump::generate_extension_api() {
+Dictionary GDExtensionAPIDump::generate_extension_api() {
 	Dictionary api_dump;
 
 	{
@@ -177,8 +177,8 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
 		};
 
 		// Validate sizes at compile time for the current build configuration.
-		static_assert(type_size_array[Variant::BOOL][sizeof(void *)] == sizeof(GDNativeBool), "Size of bool mismatch");
-		static_assert(type_size_array[Variant::INT][sizeof(void *)] == sizeof(GDNativeInt), "Size of int mismatch");
+		static_assert(type_size_array[Variant::BOOL][sizeof(void *)] == sizeof(GDExtensionBool), "Size of bool mismatch");
+		static_assert(type_size_array[Variant::INT][sizeof(void *)] == sizeof(GDExtensionInt), "Size of int mismatch");
 		static_assert(type_size_array[Variant::FLOAT][sizeof(void *)] == sizeof(double), "Size of float mismatch");
 		static_assert(type_size_array[Variant::STRING][sizeof(void *)] == sizeof(String), "Size of String mismatch");
 		static_assert(type_size_array[Variant::VECTOR2][sizeof(void *)] == sizeof(Vector2), "Size of Vector2 mismatch");
@@ -943,7 +943,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
 	return api_dump;
 }
 
-void NativeExtensionAPIDump::generate_extension_json_file(const String &p_path) {
+void GDExtensionAPIDump::generate_extension_json_file(const String &p_path) {
 	Dictionary api = generate_extension_api();
 	Ref<JSON> json;
 	json.instantiate();

+ 2 - 2
core/extension/extension_api_dump.h

@@ -31,11 +31,11 @@
 #ifndef EXTENSION_API_DUMP_H
 #define EXTENSION_API_DUMP_H
 
-#include "core/extension/native_extension.h"
+#include "core/extension/gdextension.h"
 
 #ifdef TOOLS_ENABLED
 
-class NativeExtensionAPIDump {
+class GDExtensionAPIDump {
 public:
 	static Dictionary generate_extension_api();
 	static void generate_extension_json_file(const String &p_path);

+ 99 - 99
core/extension/native_extension.cpp → core/extension/gdextension.cpp

@@ -1,5 +1,5 @@
 /*************************************************************************/
-/*  native_extension.cpp                                                 */
+/*  gdextension.cpp                                                      */
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
@@ -28,18 +28,18 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "native_extension.h"
+#include "gdextension.h"
 #include "core/config/project_settings.h"
 #include "core/io/dir_access.h"
 #include "core/object/class_db.h"
 #include "core/object/method_bind.h"
 #include "core/os/os.h"
 
-String NativeExtension::get_extension_list_config_file() {
+String GDExtension::get_extension_list_config_file() {
 	return ProjectSettings::get_singleton()->get_project_data_path().path_join("extension_list.cfg");
 }
 
-String NativeExtension::find_extension_library(const String &p_path, Ref<ConfigFile> p_config, std::function<bool(String)> p_has_feature, PackedStringArray *r_tags) {
+String GDExtension::find_extension_library(const String &p_path, Ref<ConfigFile> p_config, std::function<bool(String)> p_has_feature, PackedStringArray *r_tags) {
 	// First, check the explicit libraries.
 	if (p_config->has_section("libraries")) {
 		List<String> libraries;
@@ -144,9 +144,9 @@ String NativeExtension::find_extension_library(const String &p_path, Ref<ConfigF
 	return String();
 }
 
-class NativeExtensionMethodBind : public MethodBind {
-	GDNativeExtensionClassMethodCall call_func;
-	GDNativeExtensionClassMethodPtrCall ptrcall_func;
+class GDExtensionMethodBind : public MethodBind {
+	GDExtensionClassMethodCall call_func;
+	GDExtensionClassMethodPtrCall ptrcall_func;
 	void *method_userdata;
 	bool vararg;
 	PropertyInfo return_value_info;
@@ -184,8 +184,8 @@ public:
 	virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const override {
 		Variant ret;
 		GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance();
-		GDNativeCallError ce{ GDNATIVE_CALL_OK, 0, 0 };
-		call_func(method_userdata, extension_instance, reinterpret_cast<GDNativeConstVariantPtr *>(p_args), p_arg_count, (GDNativeVariantPtr)&ret, &ce);
+		GDExtensionCallError ce{ GDEXTENSION_CALL_OK, 0, 0 };
+		call_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstVariantPtr *>(p_args), p_arg_count, (GDExtensionVariantPtr)&ret, &ce);
 		r_error.error = Callable::CallError::Error(ce.error);
 		r_error.argument = ce.argument;
 		r_error.expected = ce.expected;
@@ -194,14 +194,14 @@ public:
 	virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override {
 		ERR_FAIL_COND_MSG(vararg, "Vararg methods don't have ptrcall support. This is most likely an engine bug.");
 		GDExtensionClassInstancePtr extension_instance = p_object->_get_extension_instance();
-		ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDNativeConstTypePtr *>(p_args), (GDNativeTypePtr)r_ret);
+		ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstTypePtr *>(p_args), (GDExtensionTypePtr)r_ret);
 	}
 
 	virtual bool is_vararg() const override {
 		return false;
 	}
 
-	explicit NativeExtensionMethodBind(const GDNativeExtensionClassMethodInfo *p_method_info) {
+	explicit GDExtensionMethodBind(const GDExtensionClassMethodInfo *p_method_info) {
 		method_userdata = p_method_info->method_userdata;
 		call_func = p_method_info->call_func;
 		ptrcall_func = p_method_info->ptrcall_func;
@@ -219,10 +219,10 @@ public:
 
 		set_hint_flags(p_method_info->method_flags);
 
-		vararg = p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_VARARG;
+		vararg = p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_VARARG;
 		_set_returns(p_method_info->has_return_value);
-		_set_const(p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_CONST);
-		_set_static(p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_STATIC);
+		_set_const(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_CONST);
+		_set_static(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_STATIC);
 #ifdef DEBUG_METHODS_ENABLED
 		_generate_argument_types(p_method_info->argument_count);
 #endif
@@ -238,10 +238,10 @@ public:
 	}
 };
 
-static GDNativeInterface gdnative_interface;
+static GDExtensionInterface gdextension_interface;
 
-void NativeExtension::_register_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	StringName parent_class_name = *reinterpret_cast<const StringName *>(p_parent_class_name);
@@ -268,35 +268,35 @@ void NativeExtension::_register_extension_class(GDNativeExtensionClassLibraryPtr
 	Extension *extension = &self->extension_classes[class_name];
 
 	if (parent_extension) {
-		extension->native_extension.parent = &parent_extension->native_extension;
-		parent_extension->native_extension.children.push_back(&extension->native_extension);
+		extension->gdextension.parent = &parent_extension->gdextension;
+		parent_extension->gdextension.children.push_back(&extension->gdextension);
 	}
 
-	extension->native_extension.parent_class_name = parent_class_name;
-	extension->native_extension.class_name = class_name;
-	extension->native_extension.editor_class = self->level_initialized == INITIALIZATION_LEVEL_EDITOR;
-	extension->native_extension.is_virtual = p_extension_funcs->is_virtual;
-	extension->native_extension.is_abstract = p_extension_funcs->is_abstract;
-	extension->native_extension.set = p_extension_funcs->set_func;
-	extension->native_extension.get = p_extension_funcs->get_func;
-	extension->native_extension.get_property_list = p_extension_funcs->get_property_list_func;
-	extension->native_extension.free_property_list = p_extension_funcs->free_property_list_func;
-	extension->native_extension.property_can_revert = p_extension_funcs->property_can_revert_func;
-	extension->native_extension.property_get_revert = p_extension_funcs->property_get_revert_func;
-	extension->native_extension.notification = p_extension_funcs->notification_func;
-	extension->native_extension.to_string = p_extension_funcs->to_string_func;
-	extension->native_extension.reference = p_extension_funcs->reference_func;
-	extension->native_extension.unreference = p_extension_funcs->unreference_func;
-	extension->native_extension.class_userdata = p_extension_funcs->class_userdata;
-	extension->native_extension.create_instance = p_extension_funcs->create_instance_func;
-	extension->native_extension.free_instance = p_extension_funcs->free_instance_func;
-	extension->native_extension.get_virtual = p_extension_funcs->get_virtual_func;
-	extension->native_extension.get_rid = p_extension_funcs->get_rid_func;
-
-	ClassDB::register_extension_class(&extension->native_extension);
+	extension->gdextension.parent_class_name = parent_class_name;
+	extension->gdextension.class_name = class_name;
+	extension->gdextension.editor_class = self->level_initialized == INITIALIZATION_LEVEL_EDITOR;
+	extension->gdextension.is_virtual = p_extension_funcs->is_virtual;
+	extension->gdextension.is_abstract = p_extension_funcs->is_abstract;
+	extension->gdextension.set = p_extension_funcs->set_func;
+	extension->gdextension.get = p_extension_funcs->get_func;
+	extension->gdextension.get_property_list = p_extension_funcs->get_property_list_func;
+	extension->gdextension.free_property_list = p_extension_funcs->free_property_list_func;
+	extension->gdextension.property_can_revert = p_extension_funcs->property_can_revert_func;
+	extension->gdextension.property_get_revert = p_extension_funcs->property_get_revert_func;
+	extension->gdextension.notification = p_extension_funcs->notification_func;
+	extension->gdextension.to_string = p_extension_funcs->to_string_func;
+	extension->gdextension.reference = p_extension_funcs->reference_func;
+	extension->gdextension.unreference = p_extension_funcs->unreference_func;
+	extension->gdextension.class_userdata = p_extension_funcs->class_userdata;
+	extension->gdextension.create_instance = p_extension_funcs->create_instance_func;
+	extension->gdextension.free_instance = p_extension_funcs->free_instance_func;
+	extension->gdextension.get_virtual = p_extension_funcs->get_virtual_func;
+	extension->gdextension.get_rid = p_extension_funcs->get_rid_func;
+
+	ClassDB::register_extension_class(&extension->gdextension);
 }
-void NativeExtension::_register_extension_class_method(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	StringName method_name = *reinterpret_cast<const StringName *>(p_method_info->name);
@@ -304,13 +304,13 @@ void NativeExtension::_register_extension_class_method(GDNativeExtensionClassLib
 
 	//Extension *extension = &self->extension_classes[class_name];
 
-	NativeExtensionMethodBind *method = memnew(NativeExtensionMethodBind(p_method_info));
+	GDExtensionMethodBind *method = memnew(GDExtensionMethodBind(p_method_info));
 	method->set_instance_class(class_name);
 
 	ClassDB::bind_method_custom(class_name, method);
 }
-void NativeExtension::_register_extension_class_integer_constant(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_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) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	StringName enum_name = *reinterpret_cast<const StringName *>(p_enum_name);
@@ -320,8 +320,8 @@ void NativeExtension::_register_extension_class_integer_constant(GDNativeExtensi
 	ClassDB::bind_integer_constant(class_name, enum_name, constant_name, p_constant_value, p_is_bitfield);
 }
 
-void NativeExtension::_register_extension_class_property(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_register_extension_class_property(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	StringName setter = *reinterpret_cast<const StringName *>(p_setter);
@@ -335,8 +335,8 @@ void NativeExtension::_register_extension_class_property(GDNativeExtensionClassL
 	ClassDB::add_property(class_name, pinfo, setter, getter);
 }
 
-void NativeExtension::_register_extension_class_property_group(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_group_name, GDNativeConstStringPtr p_prefix) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_group_name, GDExtensionConstStringPtr p_prefix) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	String group_name = *reinterpret_cast<const String *>(p_group_name);
@@ -346,8 +346,8 @@ void NativeExtension::_register_extension_class_property_group(GDNativeExtension
 	ClassDB::add_property_group(class_name, group_name, prefix);
 }
 
-void NativeExtension::_register_extension_class_property_subgroup(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_subgroup_name, GDNativeConstStringPtr p_prefix) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_subgroup_name, GDExtensionConstStringPtr p_prefix) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	String subgroup_name = *reinterpret_cast<const String *>(p_subgroup_name);
@@ -357,8 +357,8 @@ void NativeExtension::_register_extension_class_property_subgroup(GDNativeExtens
 	ClassDB::add_property_subgroup(class_name, subgroup_name, prefix);
 }
 
-void NativeExtension::_register_extension_class_signal(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	StringName signal_name = *reinterpret_cast<const StringName *>(p_signal_name);
@@ -373,28 +373,28 @@ void NativeExtension::_register_extension_class_signal(GDNativeExtensionClassLib
 	ClassDB::add_signal(class_name, s);
 }
 
-void NativeExtension::_unregister_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	StringName class_name = *reinterpret_cast<const StringName *>(p_class_name);
 	ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to unregister unexisting extension class '" + class_name + "'.");
 	Extension *ext = &self->extension_classes[class_name];
-	ERR_FAIL_COND_MSG(ext->native_extension.children.size(), "Attempt to unregister class '" + class_name + "' while other extension classes inherit from it.");
+	ERR_FAIL_COND_MSG(ext->gdextension.children.size(), "Attempt to unregister class '" + class_name + "' while other extension classes inherit from it.");
 
 	ClassDB::unregister_extension_class(class_name);
-	if (ext->native_extension.parent != nullptr) {
-		ext->native_extension.parent->children.erase(&ext->native_extension);
+	if (ext->gdextension.parent != nullptr) {
+		ext->gdextension.parent->children.erase(&ext->gdextension);
 	}
 	self->extension_classes.erase(class_name);
 }
 
-void NativeExtension::_get_library_path(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path) {
-	NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library);
+void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path) {
+	GDExtension *self = reinterpret_cast<GDExtension *>(p_library);
 
 	*(String *)r_path = self->library_path;
 }
 
-Error NativeExtension::open_library(const String &p_path, const String &p_entry_symbol) {
+Error GDExtension::open_library(const String &p_path, const String &p_entry_symbol) {
 	Error err = OS::get_singleton()->open_dynamic_library(p_path, library, true, &library_path);
 	if (err != OK) {
 		ERR_PRINT("GDExtension dynamic library not found: " + p_path);
@@ -411,9 +411,9 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_
 		return err;
 	}
 
-	GDNativeInitializationFunction initialization_function = (GDNativeInitializationFunction)entry_funcptr;
+	GDExtensionInitializationFunction initialization_function = (GDExtensionInitializationFunction)entry_funcptr;
 
-	if (initialization_function(&gdnative_interface, this, &initialization)) {
+	if (initialization_function(&gdextension_interface, this, &initialization)) {
 		level_initialized = -1;
 		return OK;
 	} else {
@@ -422,23 +422,23 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_
 	}
 }
 
-void NativeExtension::close_library() {
+void GDExtension::close_library() {
 	ERR_FAIL_COND(library == nullptr);
 	OS::get_singleton()->close_dynamic_library(library);
 
 	library = nullptr;
 }
 
-bool NativeExtension::is_library_open() const {
+bool GDExtension::is_library_open() const {
 	return library != nullptr;
 }
 
-NativeExtension::InitializationLevel NativeExtension::get_minimum_library_initialization_level() const {
+GDExtension::InitializationLevel GDExtension::get_minimum_library_initialization_level() const {
 	ERR_FAIL_COND_V(library == nullptr, INITIALIZATION_LEVEL_CORE);
 	return InitializationLevel(initialization.minimum_initialization_level);
 }
 
-void NativeExtension::initialize_library(InitializationLevel p_level) {
+void GDExtension::initialize_library(InitializationLevel p_level) {
 	ERR_FAIL_COND(library == nullptr);
 	ERR_FAIL_COND_MSG(p_level <= int32_t(level_initialized), vformat("Level '%d' must be higher than the current level '%d'", p_level, level_initialized));
 
@@ -446,23 +446,23 @@ void NativeExtension::initialize_library(InitializationLevel p_level) {
 
 	ERR_FAIL_COND(initialization.initialize == nullptr);
 
-	initialization.initialize(initialization.userdata, GDNativeInitializationLevel(p_level));
+	initialization.initialize(initialization.userdata, GDExtensionInitializationLevel(p_level));
 }
-void NativeExtension::deinitialize_library(InitializationLevel p_level) {
+void GDExtension::deinitialize_library(InitializationLevel p_level) {
 	ERR_FAIL_COND(library == nullptr);
 	ERR_FAIL_COND(p_level > int32_t(level_initialized));
 
 	level_initialized = int32_t(p_level) - 1;
-	initialization.deinitialize(initialization.userdata, GDNativeInitializationLevel(p_level));
+	initialization.deinitialize(initialization.userdata, GDExtensionInitializationLevel(p_level));
 }
 
-void NativeExtension::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("open_library", "path", "entry_symbol"), &NativeExtension::open_library);
-	ClassDB::bind_method(D_METHOD("close_library"), &NativeExtension::close_library);
-	ClassDB::bind_method(D_METHOD("is_library_open"), &NativeExtension::is_library_open);
+void GDExtension::_bind_methods() {
+	ClassDB::bind_method(D_METHOD("open_library", "path", "entry_symbol"), &GDExtension::open_library);
+	ClassDB::bind_method(D_METHOD("close_library"), &GDExtension::close_library);
+	ClassDB::bind_method(D_METHOD("is_library_open"), &GDExtension::is_library_open);
 
-	ClassDB::bind_method(D_METHOD("get_minimum_library_initialization_level"), &NativeExtension::get_minimum_library_initialization_level);
-	ClassDB::bind_method(D_METHOD("initialize_library", "level"), &NativeExtension::initialize_library);
+	ClassDB::bind_method(D_METHOD("get_minimum_library_initialization_level"), &GDExtension::get_minimum_library_initialization_level);
+	ClassDB::bind_method(D_METHOD("initialize_library", "level"), &GDExtension::initialize_library);
 
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_CORE);
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SERVERS);
@@ -470,32 +470,32 @@ void NativeExtension::_bind_methods() {
 	BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_EDITOR);
 }
 
-NativeExtension::NativeExtension() {
+GDExtension::GDExtension() {
 }
 
-NativeExtension::~NativeExtension() {
+GDExtension::~GDExtension() {
 	if (library != nullptr) {
 		close_library();
 	}
 }
 
-extern void gdnative_setup_interface(GDNativeInterface *p_interface);
+extern void gdextension_setup_interface(GDExtensionInterface *p_interface);
 
-void NativeExtension::initialize_native_extensions() {
-	gdnative_setup_interface(&gdnative_interface);
+void GDExtension::initialize_gdextensions() {
+	gdextension_setup_interface(&gdextension_interface);
 
-	gdnative_interface.classdb_register_extension_class = _register_extension_class;
-	gdnative_interface.classdb_register_extension_class_method = _register_extension_class_method;
-	gdnative_interface.classdb_register_extension_class_integer_constant = _register_extension_class_integer_constant;
-	gdnative_interface.classdb_register_extension_class_property = _register_extension_class_property;
-	gdnative_interface.classdb_register_extension_class_property_group = _register_extension_class_property_group;
-	gdnative_interface.classdb_register_extension_class_property_subgroup = _register_extension_class_property_subgroup;
-	gdnative_interface.classdb_register_extension_class_signal = _register_extension_class_signal;
-	gdnative_interface.classdb_unregister_extension_class = _unregister_extension_class;
-	gdnative_interface.get_library_path = _get_library_path;
+	gdextension_interface.classdb_register_extension_class = _register_extension_class;
+	gdextension_interface.classdb_register_extension_class_method = _register_extension_class_method;
+	gdextension_interface.classdb_register_extension_class_integer_constant = _register_extension_class_integer_constant;
+	gdextension_interface.classdb_register_extension_class_property = _register_extension_class_property;
+	gdextension_interface.classdb_register_extension_class_property_group = _register_extension_class_property_group;
+	gdextension_interface.classdb_register_extension_class_property_subgroup = _register_extension_class_property_subgroup;
+	gdextension_interface.classdb_register_extension_class_signal = _register_extension_class_signal;
+	gdextension_interface.classdb_unregister_extension_class = _unregister_extension_class;
+	gdextension_interface.get_library_path = _get_library_path;
 }
 
-Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
+Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
 	Ref<ConfigFile> config;
 	config.instantiate();
 
@@ -520,7 +520,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
 
 	String entry_symbol = config->get_value("configuration", "entry_symbol");
 
-	String library_path = NativeExtension::find_extension_library(p_path, config, [](String p_feature) { return OS::get_singleton()->has_feature(p_feature); });
+	String library_path = GDExtension::find_extension_library(p_path, config, [](String p_feature) { return OS::get_singleton()->has_feature(p_feature); });
 
 	if (library_path.is_empty()) {
 		if (r_error) {
@@ -535,7 +535,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
 		library_path = p_path.get_base_dir().path_join(library_path);
 	}
 
-	Ref<NativeExtension> lib;
+	Ref<GDExtension> lib;
 	lib.instantiate();
 	String abs_path = ProjectSettings::get_singleton()->globalize_path(library_path);
 	err = lib->open_library(abs_path, entry_symbol);
@@ -552,18 +552,18 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
 	return lib;
 }
 
-void NativeExtensionResourceLoader::get_recognized_extensions(List<String> *p_extensions) const {
+void GDExtensionResourceLoader::get_recognized_extensions(List<String> *p_extensions) const {
 	p_extensions->push_back("gdextension");
 }
 
-bool NativeExtensionResourceLoader::handles_type(const String &p_type) const {
-	return p_type == "NativeExtension";
+bool GDExtensionResourceLoader::handles_type(const String &p_type) const {
+	return p_type == "GDExtension";
 }
 
-String NativeExtensionResourceLoader::get_resource_type(const String &p_path) const {
+String GDExtensionResourceLoader::get_resource_type(const String &p_path) const {
 	String el = p_path.get_extension().to_lower();
 	if (el == "gdextension") {
-		return "NativeExtension";
+		return "GDExtension";
 	}
 	return "";
 }

+ 28 - 28
core/extension/native_extension.h → core/extension/gdextension.h

@@ -1,5 +1,5 @@
 /*************************************************************************/
-/*  native_extension.h                                                   */
+/*  gdextension.h                                                        */
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
@@ -28,39 +28,39 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#ifndef NATIVE_EXTENSION_H
-#define NATIVE_EXTENSION_H
+#ifndef GDEXTENSION_H
+#define GDEXTENSION_H
 
 #include <functional>
 
-#include "core/extension/gdnative_interface.h"
+#include "core/extension/gdextension_interface.h"
 #include "core/io/config_file.h"
 #include "core/io/resource_loader.h"
 #include "core/object/ref_counted.h"
 
-class NativeExtension : public Resource {
-	GDCLASS(NativeExtension, Resource)
+class GDExtension : public Resource {
+	GDCLASS(GDExtension, Resource)
 
 	void *library = nullptr; // pointer if valid,
 	String library_path;
 
 	struct Extension {
-		ObjectNativeExtension native_extension;
+		ObjectGDExtension gdextension;
 	};
 
 	HashMap<StringName, Extension> extension_classes;
 
-	static void _register_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
-	static void _register_extension_class_method(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
-	static void _register_extension_class_integer_constant(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield);
-	static void _register_extension_class_property(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter);
-	static void _register_extension_class_property_group(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_group_name, GDNativeConstStringNamePtr p_prefix);
-	static void _register_extension_class_property_subgroup(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_subgroup_name, GDNativeConstStringNamePtr p_prefix);
-	static void _register_extension_class_signal(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
-	static void _unregister_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name);
-	static void _get_library_path(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path);
-
-	GDNativeInitialization initialization;
+	static void _register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs);
+	static void _register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info);
+	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);
+	static void _register_extension_class_property(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter);
+	static void _register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_group_name, GDExtensionConstStringNamePtr p_prefix);
+	static void _register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_subgroup_name, GDExtensionConstStringNamePtr p_prefix);
+	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);
+	static void _unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name);
+	static void _get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path);
+
+	GDExtensionInitialization initialization;
 	int32_t level_initialized = -1;
 
 protected:
@@ -74,10 +74,10 @@ public:
 	void close_library();
 
 	enum InitializationLevel {
-		INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE,
-		INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS,
-		INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE,
-		INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR
+		INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE,
+		INITIALIZATION_LEVEL_SERVERS = GDEXTENSION_INITIALIZATION_SERVERS,
+		INITIALIZATION_LEVEL_SCENE = GDEXTENSION_INITIALIZATION_SCENE,
+		INITIALIZATION_LEVEL_EDITOR = GDEXTENSION_INITIALIZATION_EDITOR
 	};
 
 	bool is_library_open() const;
@@ -86,14 +86,14 @@ public:
 	void initialize_library(InitializationLevel p_level);
 	void deinitialize_library(InitializationLevel p_level);
 
-	static void initialize_native_extensions();
-	NativeExtension();
-	~NativeExtension();
+	static void initialize_gdextensions();
+	GDExtension();
+	~GDExtension();
 };
 
-VARIANT_ENUM_CAST(NativeExtension::InitializationLevel)
+VARIANT_ENUM_CAST(GDExtension::InitializationLevel)
 
-class NativeExtensionResourceLoader : public ResourceFormatLoader {
+class GDExtensionResourceLoader : public ResourceFormatLoader {
 public:
 	virtual Ref<Resource> load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE);
 	virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -101,4 +101,4 @@ public:
 	virtual String get_resource_type(const String &p_path) const;
 };
 
-#endif // NATIVE_EXTENSION_H
+#endif // GDEXTENSION_H

+ 1083 - 0
core/extension/gdextension_interface.cpp

@@ -0,0 +1,1083 @@
+/*************************************************************************/
+/*  gdextension_interface.cpp                                            */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#include "gdextension_interface.h"
+
+#include "core/config/engine.h"
+#include "core/object/class_db.h"
+#include "core/object/script_language_extension.h"
+#include "core/os/memory.h"
+#include "core/variant/variant.h"
+#include "core/version.h"
+
+// Memory Functions
+static void *gdextension_alloc(size_t p_size) {
+	return memalloc(p_size);
+}
+
+static void *gdextension_realloc(void *p_mem, size_t p_size) {
+	return memrealloc(p_mem, p_size);
+}
+
+static void gdextension_free(void *p_mem) {
+	memfree(p_mem);
+}
+
+// Helper print functions.
+static void gdextension_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
+	_err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_ERROR);
+}
+static void gdextension_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
+	_err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_WARNING);
+}
+static void gdextension_print_script_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
+	_err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_SCRIPT);
+}
+
+uint64_t gdextension_get_native_struct_size(GDExtensionConstStringNamePtr p_name) {
+	const StringName name = *reinterpret_cast<const StringName *>(p_name);
+	return ClassDB::get_native_struct_size(name);
+}
+
+// Variant functions
+
+static void gdextension_variant_new_copy(GDExtensionVariantPtr r_dest, GDExtensionConstVariantPtr p_src) {
+	memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<const Variant *>(p_src)));
+}
+static void gdextension_variant_new_nil(GDExtensionVariantPtr r_dest) {
+	memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant);
+}
+static void gdextension_variant_destroy(GDExtensionVariantPtr p_self) {
+	reinterpret_cast<Variant *>(p_self)->~Variant();
+}
+
+// variant type
+
+static void gdextension_variant_call(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) {
+	Variant *self = (Variant *)p_self;
+	const StringName method = *reinterpret_cast<const StringName *>(p_method);
+	const Variant **args = (const Variant **)p_args;
+	Variant ret;
+	Callable::CallError error;
+	self->callp(method, args, p_argcount, ret, error);
+	memnew_placement(r_return, Variant(ret));
+
+	if (r_error) {
+		r_error->error = (GDExtensionCallErrorType)(error.error);
+		r_error->argument = error.argument;
+		r_error->expected = error.expected;
+	}
+}
+
+static void gdextension_variant_call_static(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) {
+	Variant::Type type = (Variant::Type)p_type;
+	const StringName method = *reinterpret_cast<const StringName *>(p_method);
+	const Variant **args = (const Variant **)p_args;
+	Variant ret;
+	Callable::CallError error;
+	Variant::call_static(type, method, args, p_argcount, ret, error);
+	memnew_placement(r_return, Variant(ret));
+
+	if (r_error) {
+		r_error->error = (GDExtensionCallErrorType)error.error;
+		r_error->argument = error.argument;
+		r_error->expected = error.expected;
+	}
+}
+
+static void gdextension_variant_evaluate(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionVariantPtr r_return, GDExtensionBool *r_valid) {
+	Variant::Operator op = (Variant::Operator)p_op;
+	const Variant *a = (const Variant *)p_a;
+	const Variant *b = (const Variant *)p_b;
+	Variant *ret = (Variant *)r_return;
+	bool valid;
+	Variant::evaluate(op, *a, *b, *ret, valid);
+	*r_valid = valid;
+}
+
+static void gdextension_variant_set(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {
+	Variant *self = (Variant *)p_self;
+	const Variant *key = (const Variant *)p_key;
+	const Variant *value = (const Variant *)p_value;
+
+	bool valid;
+	self->set(*key, *value, &valid);
+	*r_valid = valid;
+}
+
+static void gdextension_variant_set_named(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {
+	Variant *self = (Variant *)p_self;
+	const StringName *key = (const StringName *)p_key;
+	const Variant *value = (const Variant *)p_value;
+
+	bool valid;
+	self->set_named(*key, *value, valid);
+	*r_valid = valid;
+}
+
+static void gdextension_variant_set_keyed(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {
+	Variant *self = (Variant *)p_self;
+	const Variant *key = (const Variant *)p_key;
+	const Variant *value = (const Variant *)p_value;
+
+	bool valid;
+	self->set_keyed(*key, *value, valid);
+	*r_valid = valid;
+}
+
+static void gdextension_variant_set_indexed(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob) {
+	Variant *self = (Variant *)p_self;
+	const Variant *value = (const Variant *)p_value;
+
+	bool valid;
+	bool oob;
+	self->set_indexed(p_index, *value, valid, oob);
+	*r_valid = valid;
+	*r_oob = oob;
+}
+
+static void gdextension_variant_get(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	const Variant *key = (const Variant *)p_key;
+
+	bool valid;
+	memnew_placement(r_ret, Variant(self->get(*key, &valid)));
+	*r_valid = valid;
+}
+
+static void gdextension_variant_get_named(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	const StringName *key = (const StringName *)p_key;
+
+	bool valid;
+	memnew_placement(r_ret, Variant(self->get_named(*key, valid)));
+	*r_valid = valid;
+}
+
+static void gdextension_variant_get_keyed(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	const Variant *key = (const Variant *)p_key;
+
+	bool valid;
+	memnew_placement(r_ret, Variant(self->get_keyed(*key, valid)));
+	*r_valid = valid;
+}
+
+static void gdextension_variant_get_indexed(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob) {
+	const Variant *self = (const Variant *)p_self;
+
+	bool valid;
+	bool oob;
+	memnew_placement(r_ret, Variant(self->get_indexed(p_index, valid, oob)));
+	*r_valid = valid;
+	*r_oob = oob;
+}
+
+/// Iteration.
+static GDExtensionBool gdextension_variant_iter_init(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	Variant *iter = (Variant *)r_iter;
+
+	bool valid;
+	bool ret = self->iter_init(*iter, valid);
+	*r_valid = valid;
+	return ret;
+}
+
+static GDExtensionBool gdextension_variant_iter_next(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	Variant *iter = (Variant *)r_iter;
+
+	bool valid;
+	bool ret = self->iter_next(*iter, valid);
+	*r_valid = valid;
+	return ret;
+}
+
+static void gdextension_variant_iter_get(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	Variant *iter = (Variant *)r_iter;
+
+	bool valid;
+	memnew_placement(r_ret, Variant(self->iter_next(*iter, valid)));
+	*r_valid = valid;
+}
+
+/// Variant functions.
+static GDExtensionInt gdextension_variant_hash(GDExtensionConstVariantPtr p_self) {
+	const Variant *self = (const Variant *)p_self;
+	return self->hash();
+}
+
+static GDExtensionInt gdextension_variant_recursive_hash(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count) {
+	const Variant *self = (const Variant *)p_self;
+	return self->recursive_hash(p_recursion_count);
+}
+
+static GDExtensionBool gdextension_variant_hash_compare(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other) {
+	const Variant *self = (const Variant *)p_self;
+	const Variant *other = (const Variant *)p_other;
+	return self->hash_compare(*other);
+}
+
+static GDExtensionBool gdextension_variant_booleanize(GDExtensionConstVariantPtr p_self) {
+	const Variant *self = (const Variant *)p_self;
+	return self->booleanize();
+}
+
+static void gdextension_variant_duplicate(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_ret, GDExtensionBool p_deep) {
+	const Variant *self = (const Variant *)p_self;
+	memnew_placement(r_ret, Variant(self->duplicate(p_deep)));
+}
+
+static void gdextension_variant_stringify(GDExtensionConstVariantPtr p_self, GDExtensionStringPtr r_ret) {
+	const Variant *self = (const Variant *)p_self;
+	memnew_placement(r_ret, String(*self));
+}
+
+static GDExtensionVariantType gdextension_variant_get_type(GDExtensionConstVariantPtr p_self) {
+	const Variant *self = (const Variant *)p_self;
+	return (GDExtensionVariantType)self->get_type();
+}
+
+static GDExtensionBool gdextension_variant_has_method(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method) {
+	const Variant *self = (const Variant *)p_self;
+	const StringName *method = (const StringName *)p_method;
+	return self->has_method(*method);
+}
+
+static GDExtensionBool gdextension_variant_has_member(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {
+	return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member));
+}
+
+static GDExtensionBool gdextension_variant_has_key(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid) {
+	const Variant *self = (const Variant *)p_self;
+	const Variant *key = (const Variant *)p_key;
+	bool valid;
+	bool ret = self->has_key(*key, valid);
+	*r_valid = valid;
+	return ret;
+}
+
+static void gdextension_variant_get_type_name(GDExtensionVariantType p_type, GDExtensionStringPtr r_ret) {
+	String name = Variant::get_type_name((Variant::Type)p_type);
+	memnew_placement(r_ret, String(name));
+}
+
+static GDExtensionBool gdextension_variant_can_convert(GDExtensionVariantType p_from, GDExtensionVariantType p_to) {
+	return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to);
+}
+
+static GDExtensionBool gdextension_variant_can_convert_strict(GDExtensionVariantType p_from, GDExtensionVariantType p_to) {
+	return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to);
+}
+
+// Variant interaction.
+static GDExtensionVariantFromTypeConstructorFunc gdextension_get_variant_from_type_constructor(GDExtensionVariantType p_type) {
+	switch (p_type) {
+		case GDEXTENSION_VARIANT_TYPE_BOOL:
+			return VariantTypeConstructor<bool>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_INT:
+			return VariantTypeConstructor<int64_t>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_FLOAT:
+			return VariantTypeConstructor<double>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_STRING:
+			return VariantTypeConstructor<String>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR2:
+			return VariantTypeConstructor<Vector2>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR2I:
+			return VariantTypeConstructor<Vector2i>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_RECT2:
+			return VariantTypeConstructor<Rect2>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_RECT2I:
+			return VariantTypeConstructor<Rect2i>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR3:
+			return VariantTypeConstructor<Vector3>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR3I:
+			return VariantTypeConstructor<Vector3i>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:
+			return VariantTypeConstructor<Transform2D>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR4:
+			return VariantTypeConstructor<Vector4>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR4I:
+			return VariantTypeConstructor<Vector4i>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PLANE:
+			return VariantTypeConstructor<Plane>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_QUATERNION:
+			return VariantTypeConstructor<Quaternion>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_AABB:
+			return VariantTypeConstructor<AABB>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_BASIS:
+			return VariantTypeConstructor<Basis>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:
+			return VariantTypeConstructor<Transform3D>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PROJECTION:
+			return VariantTypeConstructor<Projection>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_COLOR:
+			return VariantTypeConstructor<Color>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_STRING_NAME:
+			return VariantTypeConstructor<StringName>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_NODE_PATH:
+			return VariantTypeConstructor<NodePath>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_RID:
+			return VariantTypeConstructor<RID>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_OBJECT:
+			return VariantTypeConstructor<Object *>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_CALLABLE:
+			return VariantTypeConstructor<Callable>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_SIGNAL:
+			return VariantTypeConstructor<Signal>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_DICTIONARY:
+			return VariantTypeConstructor<Dictionary>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_ARRAY:
+			return VariantTypeConstructor<Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:
+			return VariantTypeConstructor<PackedByteArray>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:
+			return VariantTypeConstructor<PackedInt32Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:
+			return VariantTypeConstructor<PackedInt64Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:
+			return VariantTypeConstructor<PackedFloat32Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:
+			return VariantTypeConstructor<PackedFloat64Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:
+			return VariantTypeConstructor<PackedStringArray>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:
+			return VariantTypeConstructor<PackedVector2Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:
+			return VariantTypeConstructor<PackedVector3Array>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:
+			return VariantTypeConstructor<PackedColorArray>::variant_from_type;
+		case GDEXTENSION_VARIANT_TYPE_NIL:
+		case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:
+			ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
+	}
+	ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
+}
+
+static GDExtensionTypeFromVariantConstructorFunc gdextension_get_type_from_variant_constructor(GDExtensionVariantType p_type) {
+	switch (p_type) {
+		case GDEXTENSION_VARIANT_TYPE_BOOL:
+			return VariantTypeConstructor<bool>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_INT:
+			return VariantTypeConstructor<int64_t>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_FLOAT:
+			return VariantTypeConstructor<double>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_STRING:
+			return VariantTypeConstructor<String>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR2:
+			return VariantTypeConstructor<Vector2>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR2I:
+			return VariantTypeConstructor<Vector2i>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_RECT2:
+			return VariantTypeConstructor<Rect2>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_RECT2I:
+			return VariantTypeConstructor<Rect2i>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR3:
+			return VariantTypeConstructor<Vector3>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR3I:
+			return VariantTypeConstructor<Vector3i>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:
+			return VariantTypeConstructor<Transform2D>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR4:
+			return VariantTypeConstructor<Vector4>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_VECTOR4I:
+			return VariantTypeConstructor<Vector4i>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PLANE:
+			return VariantTypeConstructor<Plane>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_QUATERNION:
+			return VariantTypeConstructor<Quaternion>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_AABB:
+			return VariantTypeConstructor<AABB>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_BASIS:
+			return VariantTypeConstructor<Basis>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:
+			return VariantTypeConstructor<Transform3D>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PROJECTION:
+			return VariantTypeConstructor<Projection>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_COLOR:
+			return VariantTypeConstructor<Color>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_STRING_NAME:
+			return VariantTypeConstructor<StringName>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_NODE_PATH:
+			return VariantTypeConstructor<NodePath>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_RID:
+			return VariantTypeConstructor<RID>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_OBJECT:
+			return VariantTypeConstructor<Object *>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_CALLABLE:
+			return VariantTypeConstructor<Callable>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_SIGNAL:
+			return VariantTypeConstructor<Signal>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_DICTIONARY:
+			return VariantTypeConstructor<Dictionary>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_ARRAY:
+			return VariantTypeConstructor<Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:
+			return VariantTypeConstructor<PackedByteArray>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:
+			return VariantTypeConstructor<PackedInt32Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:
+			return VariantTypeConstructor<PackedInt64Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:
+			return VariantTypeConstructor<PackedFloat32Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:
+			return VariantTypeConstructor<PackedFloat64Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:
+			return VariantTypeConstructor<PackedStringArray>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:
+			return VariantTypeConstructor<PackedVector2Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:
+			return VariantTypeConstructor<PackedVector3Array>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:
+			return VariantTypeConstructor<PackedColorArray>::type_from_variant;
+		case GDEXTENSION_VARIANT_TYPE_NIL:
+		case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:
+			ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
+	}
+	ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
+}
+
+// ptrcalls
+static GDExtensionPtrOperatorEvaluator gdextension_variant_get_ptr_operator_evaluator(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b) {
+	return (GDExtensionPtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b));
+}
+static GDExtensionPtrBuiltInMethod gdextension_variant_get_ptr_builtin_method(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash) {
+	const StringName method = *reinterpret_cast<const StringName *>(p_method);
+	uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method);
+	if (hash != p_hash) {
+		ERR_PRINT_ONCE("Error getting method " + method + ", hash mismatch.");
+		return nullptr;
+	}
+
+	return (GDExtensionPtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method);
+}
+static GDExtensionPtrConstructor gdextension_variant_get_ptr_constructor(GDExtensionVariantType p_type, int32_t p_constructor) {
+	return (GDExtensionPtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor);
+}
+static GDExtensionPtrDestructor gdextension_variant_get_ptr_destructor(GDExtensionVariantType p_type) {
+	return (GDExtensionPtrDestructor)Variant::get_ptr_destructor(Variant::Type(p_type));
+}
+static void gdextension_variant_construct(GDExtensionVariantType p_type, GDExtensionVariantPtr p_base, GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error) {
+	memnew_placement(p_base, Variant);
+
+	Callable::CallError error;
+	Variant::construct(Variant::Type(p_type), *(Variant *)p_base, (const Variant **)p_args, p_argument_count, error);
+
+	if (r_error) {
+		r_error->error = (GDExtensionCallErrorType)(error.error);
+		r_error->argument = error.argument;
+		r_error->expected = error.expected;
+	}
+}
+static GDExtensionPtrSetter gdextension_variant_get_ptr_setter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {
+	const StringName member = *reinterpret_cast<const StringName *>(p_member);
+	return (GDExtensionPtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), member);
+}
+static GDExtensionPtrGetter gdextension_variant_get_ptr_getter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {
+	const StringName member = *reinterpret_cast<const StringName *>(p_member);
+	return (GDExtensionPtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), member);
+}
+static GDExtensionPtrIndexedSetter gdextension_variant_get_ptr_indexed_setter(GDExtensionVariantType p_type) {
+	return (GDExtensionPtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type));
+}
+static GDExtensionPtrIndexedGetter gdextension_variant_get_ptr_indexed_getter(GDExtensionVariantType p_type) {
+	return (GDExtensionPtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type));
+}
+static GDExtensionPtrKeyedSetter gdextension_variant_get_ptr_keyed_setter(GDExtensionVariantType p_type) {
+	return (GDExtensionPtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type));
+}
+static GDExtensionPtrKeyedGetter gdextension_variant_get_ptr_keyed_getter(GDExtensionVariantType p_type) {
+	return (GDExtensionPtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type));
+}
+static GDExtensionPtrKeyedChecker gdextension_variant_get_ptr_keyed_checker(GDExtensionVariantType p_type) {
+	return (GDExtensionPtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type));
+}
+static void gdextension_variant_get_constant_value(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionVariantPtr r_ret) {
+	StringName constant = *reinterpret_cast<const StringName *>(p_constant);
+	memnew_placement(r_ret, Variant(Variant::get_constant_value(Variant::Type(p_type), constant)));
+}
+static GDExtensionPtrUtilityFunction gdextension_variant_get_ptr_utility_function(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash) {
+	StringName function = *reinterpret_cast<const StringName *>(p_function);
+	uint32_t hash = Variant::get_utility_function_hash(function);
+	if (hash != p_hash) {
+		ERR_PRINT_ONCE("Error getting utility function " + function + ", hash mismatch.");
+		return nullptr;
+	}
+	return (GDExtensionPtrUtilityFunction)Variant::get_ptr_utility_function(function);
+}
+
+//string helpers
+
+static void gdextension_string_new_with_latin1_chars(GDExtensionStringPtr r_dest, const char *p_contents) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	*dest = String(p_contents);
+}
+
+static void gdextension_string_new_with_utf8_chars(GDExtensionStringPtr r_dest, const char *p_contents) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	dest->parse_utf8(p_contents);
+}
+
+static void gdextension_string_new_with_utf16_chars(GDExtensionStringPtr r_dest, const char16_t *p_contents) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	dest->parse_utf16(p_contents);
+}
+
+static void gdextension_string_new_with_utf32_chars(GDExtensionStringPtr r_dest, const char32_t *p_contents) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	*dest = String((const char32_t *)p_contents);
+}
+
+static void gdextension_string_new_with_wide_chars(GDExtensionStringPtr r_dest, const wchar_t *p_contents) {
+	String *dest = (String *)r_dest;
+	if constexpr (sizeof(wchar_t) == 2) {
+		// wchar_t is 16 bit, parse.
+		memnew_placement(dest, String);
+		dest->parse_utf16((const char16_t *)p_contents);
+	} else {
+		// wchar_t is 32 bit, copy.
+		memnew_placement(dest, String);
+		*dest = String((const char32_t *)p_contents);
+	}
+}
+
+static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	*dest = String(p_contents, p_size);
+}
+
+static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	dest->parse_utf8(p_contents, p_size);
+}
+
+static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	dest->parse_utf16(p_contents, p_size);
+}
+
+static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size) {
+	String *dest = (String *)r_dest;
+	memnew_placement(dest, String);
+	*dest = String((const char32_t *)p_contents, p_size);
+}
+
+static void gdextension_string_new_with_wide_chars_and_len(GDExtensionStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size) {
+	String *dest = (String *)r_dest;
+	if constexpr (sizeof(wchar_t) == 2) {
+		// wchar_t is 16 bit, parse.
+		memnew_placement(dest, String);
+		dest->parse_utf16((const char16_t *)p_contents, p_size);
+	} else {
+		// wchar_t is 32 bit, copy.
+		memnew_placement(dest, String);
+		*dest = String((const char32_t *)p_contents, p_size);
+	}
+}
+
+static GDExtensionInt gdextension_string_to_latin1_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {
+	String *self = (String *)p_self;
+	CharString cs = self->ascii(true);
+	GDExtensionInt len = cs.length();
+	if (r_text) {
+		const char *s_text = cs.ptr();
+		for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {
+			r_text[i] = s_text[i];
+		}
+	}
+	return len;
+}
+static GDExtensionInt gdextension_string_to_utf8_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {
+	String *self = (String *)p_self;
+	CharString cs = self->utf8();
+	GDExtensionInt len = cs.length();
+	if (r_text) {
+		const char *s_text = cs.ptr();
+		for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {
+			r_text[i] = s_text[i];
+		}
+	}
+	return len;
+}
+static GDExtensionInt gdextension_string_to_utf16_chars(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length) {
+	String *self = (String *)p_self;
+	Char16String cs = self->utf16();
+	GDExtensionInt len = cs.length();
+	if (r_text) {
+		const char16_t *s_text = cs.ptr();
+		for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {
+			r_text[i] = s_text[i];
+		}
+	}
+	return len;
+}
+static GDExtensionInt gdextension_string_to_utf32_chars(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length) {
+	String *self = (String *)p_self;
+	GDExtensionInt len = self->length();
+	if (r_text) {
+		const char32_t *s_text = self->ptr();
+		for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {
+			r_text[i] = s_text[i];
+		}
+	}
+	return len;
+}
+static GDExtensionInt gdextension_string_to_wide_chars(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length) {
+	if constexpr (sizeof(wchar_t) == 4) {
+		return gdextension_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length);
+	} else {
+		return gdextension_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length);
+	}
+}
+
+static char32_t *gdextension_string_operator_index(GDExtensionStringPtr p_self, GDExtensionInt p_index) {
+	String *self = (String *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr);
+	return &self->ptrw()[p_index];
+}
+
+static const char32_t *gdextension_string_operator_index_const(GDExtensionConstStringPtr p_self, GDExtensionInt p_index) {
+	const String *self = (const String *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr);
+	return &self->ptr()[p_index];
+}
+
+/* Packed array functions */
+
+static uint8_t *gdextension_packed_byte_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedByteArray *self = (PackedByteArray *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptrw()[p_index];
+}
+
+static const uint8_t *gdextension_packed_byte_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedByteArray *self = (const PackedByteArray *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptr()[p_index];
+}
+
+static GDExtensionTypePtr gdextension_packed_color_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedColorArray *self = (PackedColorArray *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionTypePtr)&self->ptrw()[p_index];
+}
+
+static GDExtensionTypePtr gdextension_packed_color_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedColorArray *self = (const PackedColorArray *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionTypePtr)&self->ptr()[p_index];
+}
+
+static float *gdextension_packed_float32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedFloat32Array *self = (PackedFloat32Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptrw()[p_index];
+}
+
+static const float *gdextension_packed_float32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedFloat32Array *self = (const PackedFloat32Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptr()[p_index];
+}
+
+static double *gdextension_packed_float64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedFloat64Array *self = (PackedFloat64Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptrw()[p_index];
+}
+
+static const double *gdextension_packed_float64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedFloat64Array *self = (const PackedFloat64Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptr()[p_index];
+}
+
+static int32_t *gdextension_packed_int32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedInt32Array *self = (PackedInt32Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptrw()[p_index];
+}
+
+static const int32_t *gdextension_packed_int32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedInt32Array *self = (const PackedInt32Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptr()[p_index];
+}
+
+static int64_t *gdextension_packed_int64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedInt64Array *self = (PackedInt64Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptrw()[p_index];
+}
+
+static const int64_t *gdextension_packed_int64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedInt64Array *self = (const PackedInt64Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return &self->ptr()[p_index];
+}
+
+static GDExtensionStringPtr gdextension_packed_string_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedStringArray *self = (PackedStringArray *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionStringPtr)&self->ptrw()[p_index];
+}
+
+static GDExtensionStringPtr gdextension_packed_string_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedStringArray *self = (const PackedStringArray *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionStringPtr)&self->ptr()[p_index];
+}
+
+static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedVector2Array *self = (PackedVector2Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionTypePtr)&self->ptrw()[p_index];
+}
+
+static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedVector2Array *self = (const PackedVector2Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionTypePtr)&self->ptr()[p_index];
+}
+
+static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	PackedVector3Array *self = (PackedVector3Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionTypePtr)&self->ptrw()[p_index];
+}
+
+static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const PackedVector3Array *self = (const PackedVector3Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionTypePtr)&self->ptr()[p_index];
+}
+
+static GDExtensionVariantPtr gdextension_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
+	Array *self = (Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionVariantPtr)&self->operator[](p_index);
+}
+
+static GDExtensionVariantPtr gdextension_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
+	const Array *self = (const Array *)p_self;
+	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
+	return (GDExtensionVariantPtr)&self->operator[](p_index);
+}
+
+/* Dictionary functions */
+
+static GDExtensionVariantPtr gdextension_dictionary_operator_index(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key) {
+	Dictionary *self = (Dictionary *)p_self;
+	return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key);
+}
+
+static GDExtensionVariantPtr gdextension_dictionary_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key) {
+	const Dictionary *self = (const Dictionary *)p_self;
+	return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key);
+}
+
+/* OBJECT API */
+
+static void gdextension_object_method_bind_call(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) {
+	const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);
+	Object *o = (Object *)p_instance;
+	const Variant **args = (const Variant **)p_args;
+	Callable::CallError error;
+
+	Variant ret = mb->call(o, args, p_arg_count, error);
+	memnew_placement(r_return, Variant(ret));
+
+	if (r_error) {
+		r_error->error = (GDExtensionCallErrorType)(error.error);
+		r_error->argument = error.argument;
+		r_error->expected = error.expected;
+	}
+}
+
+static void gdextension_object_method_bind_ptrcall(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr p_ret) {
+	const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);
+	Object *o = (Object *)p_instance;
+	mb->ptrcall(o, (const void **)p_args, p_ret);
+}
+
+static void gdextension_object_destroy(GDExtensionObjectPtr p_o) {
+	memdelete((Object *)p_o);
+}
+
+static GDExtensionObjectPtr gdextension_global_get_singleton(GDExtensionConstStringNamePtr p_name) {
+	const StringName name = *reinterpret_cast<const StringName *>(p_name);
+	return (GDExtensionObjectPtr)Engine::get_singleton()->get_singleton_object(name);
+}
+
+static void *gdextension_object_get_instance_binding(GDExtensionObjectPtr p_object, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
+	Object *o = (Object *)p_object;
+	return o->get_instance_binding(p_token, p_callbacks);
+}
+
+static void gdextension_object_set_instance_binding(GDExtensionObjectPtr p_object, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
+	Object *o = (Object *)p_object;
+	o->set_instance_binding(p_token, p_binding, p_callbacks);
+}
+
+static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {
+	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
+	Object *o = (Object *)p_object;
+	ClassDB::set_object_extension_instance(o, classname, p_instance);
+}
+
+static GDExtensionObjectPtr gdextension_object_get_instance_from_id(GDObjectInstanceID p_instance_id) {
+	return (GDExtensionObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id));
+}
+
+static GDExtensionObjectPtr gdextension_object_cast_to(GDExtensionConstObjectPtr p_object, void *p_class_tag) {
+	if (!p_object) {
+		return nullptr;
+	}
+	Object *o = (Object *)p_object;
+
+	return o->is_class_ptr(p_class_tag) ? (GDExtensionObjectPtr)o : (GDExtensionObjectPtr) nullptr;
+}
+
+static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObjectPtr p_object) {
+	const Object *o = (const Object *)p_object;
+	return (GDObjectInstanceID)o->get_instance_id();
+}
+
+static GDExtensionScriptInstancePtr gdextension_script_instance_create(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {
+	ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);
+	script_instance_extension->instance = p_instance_data;
+	script_instance_extension->native_info = p_info;
+	return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);
+}
+
+static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash) {
+	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
+	const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname);
+	MethodBind *mb = ClassDB::get_method(classname, methodname);
+	ERR_FAIL_COND_V(!mb, nullptr);
+	if (mb->get_hash() != p_hash) {
+		ERR_PRINT("Hash mismatch for method '" + classname + "." + methodname + "'.");
+		return nullptr;
+	}
+	return (GDExtensionMethodBindPtr)mb;
+}
+
+static GDExtensionObjectPtr gdextension_classdb_construct_object(GDExtensionConstStringNamePtr p_classname) {
+	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
+	return (GDExtensionObjectPtr)ClassDB::instantiate(classname);
+}
+
+static void *gdextension_classdb_get_class_tag(GDExtensionConstStringNamePtr p_classname) {
+	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
+	ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(classname);
+	return class_info ? class_info->class_ptr : nullptr;
+}
+
+void gdextension_setup_interface(GDExtensionInterface *p_interface) {
+	GDExtensionInterface &gde_interface = *p_interface;
+
+	gde_interface.version_major = VERSION_MAJOR;
+	gde_interface.version_minor = VERSION_MINOR;
+#if VERSION_PATCH
+	gde_interface.version_patch = VERSION_PATCH;
+#else
+	gde_interface.version_patch = 0;
+#endif
+	gde_interface.version_string = VERSION_FULL_NAME;
+
+	/* GODOT CORE */
+
+	gde_interface.mem_alloc = gdextension_alloc;
+	gde_interface.mem_realloc = gdextension_realloc;
+	gde_interface.mem_free = gdextension_free;
+
+	gde_interface.print_error = gdextension_print_error;
+	gde_interface.print_warning = gdextension_print_warning;
+	gde_interface.print_script_error = gdextension_print_script_error;
+
+	gde_interface.get_native_struct_size = gdextension_get_native_struct_size;
+
+	/* GODOT VARIANT */
+
+	// variant general
+	gde_interface.variant_new_copy = gdextension_variant_new_copy;
+	gde_interface.variant_new_nil = gdextension_variant_new_nil;
+	gde_interface.variant_destroy = gdextension_variant_destroy;
+
+	gde_interface.variant_call = gdextension_variant_call;
+	gde_interface.variant_call_static = gdextension_variant_call_static;
+	gde_interface.variant_evaluate = gdextension_variant_evaluate;
+	gde_interface.variant_set = gdextension_variant_set;
+	gde_interface.variant_set_named = gdextension_variant_set_named;
+	gde_interface.variant_set_keyed = gdextension_variant_set_keyed;
+	gde_interface.variant_set_indexed = gdextension_variant_set_indexed;
+	gde_interface.variant_get = gdextension_variant_get;
+	gde_interface.variant_get_named = gdextension_variant_get_named;
+	gde_interface.variant_get_keyed = gdextension_variant_get_keyed;
+	gde_interface.variant_get_indexed = gdextension_variant_get_indexed;
+	gde_interface.variant_iter_init = gdextension_variant_iter_init;
+	gde_interface.variant_iter_next = gdextension_variant_iter_next;
+	gde_interface.variant_iter_get = gdextension_variant_iter_get;
+	gde_interface.variant_hash = gdextension_variant_hash;
+	gde_interface.variant_recursive_hash = gdextension_variant_recursive_hash;
+	gde_interface.variant_hash_compare = gdextension_variant_hash_compare;
+	gde_interface.variant_booleanize = gdextension_variant_booleanize;
+	gde_interface.variant_duplicate = gdextension_variant_duplicate;
+	gde_interface.variant_stringify = gdextension_variant_stringify;
+
+	gde_interface.variant_get_type = gdextension_variant_get_type;
+	gde_interface.variant_has_method = gdextension_variant_has_method;
+	gde_interface.variant_has_member = gdextension_variant_has_member;
+	gde_interface.variant_has_key = gdextension_variant_has_key;
+	gde_interface.variant_get_type_name = gdextension_variant_get_type_name;
+	gde_interface.variant_can_convert = gdextension_variant_can_convert;
+	gde_interface.variant_can_convert_strict = gdextension_variant_can_convert_strict;
+
+	gde_interface.get_variant_from_type_constructor = gdextension_get_variant_from_type_constructor;
+	gde_interface.get_variant_to_type_constructor = gdextension_get_type_from_variant_constructor;
+
+	// ptrcalls.
+
+	gde_interface.variant_get_ptr_operator_evaluator = gdextension_variant_get_ptr_operator_evaluator;
+	gde_interface.variant_get_ptr_builtin_method = gdextension_variant_get_ptr_builtin_method;
+	gde_interface.variant_get_ptr_constructor = gdextension_variant_get_ptr_constructor;
+	gde_interface.variant_get_ptr_destructor = gdextension_variant_get_ptr_destructor;
+	gde_interface.variant_construct = gdextension_variant_construct;
+	gde_interface.variant_get_ptr_setter = gdextension_variant_get_ptr_setter;
+	gde_interface.variant_get_ptr_getter = gdextension_variant_get_ptr_getter;
+	gde_interface.variant_get_ptr_indexed_setter = gdextension_variant_get_ptr_indexed_setter;
+	gde_interface.variant_get_ptr_indexed_getter = gdextension_variant_get_ptr_indexed_getter;
+	gde_interface.variant_get_ptr_keyed_setter = gdextension_variant_get_ptr_keyed_setter;
+	gde_interface.variant_get_ptr_keyed_getter = gdextension_variant_get_ptr_keyed_getter;
+	gde_interface.variant_get_ptr_keyed_checker = gdextension_variant_get_ptr_keyed_checker;
+	gde_interface.variant_get_constant_value = gdextension_variant_get_constant_value;
+	gde_interface.variant_get_ptr_utility_function = gdextension_variant_get_ptr_utility_function;
+
+	// extra utilities
+
+	gde_interface.string_new_with_latin1_chars = gdextension_string_new_with_latin1_chars;
+	gde_interface.string_new_with_utf8_chars = gdextension_string_new_with_utf8_chars;
+	gde_interface.string_new_with_utf16_chars = gdextension_string_new_with_utf16_chars;
+	gde_interface.string_new_with_utf32_chars = gdextension_string_new_with_utf32_chars;
+	gde_interface.string_new_with_wide_chars = gdextension_string_new_with_wide_chars;
+	gde_interface.string_new_with_latin1_chars_and_len = gdextension_string_new_with_latin1_chars_and_len;
+	gde_interface.string_new_with_utf8_chars_and_len = gdextension_string_new_with_utf8_chars_and_len;
+	gde_interface.string_new_with_utf16_chars_and_len = gdextension_string_new_with_utf16_chars_and_len;
+	gde_interface.string_new_with_utf32_chars_and_len = gdextension_string_new_with_utf32_chars_and_len;
+	gde_interface.string_new_with_wide_chars_and_len = gdextension_string_new_with_wide_chars_and_len;
+	gde_interface.string_to_latin1_chars = gdextension_string_to_latin1_chars;
+	gde_interface.string_to_utf8_chars = gdextension_string_to_utf8_chars;
+	gde_interface.string_to_utf16_chars = gdextension_string_to_utf16_chars;
+	gde_interface.string_to_utf32_chars = gdextension_string_to_utf32_chars;
+	gde_interface.string_to_wide_chars = gdextension_string_to_wide_chars;
+	gde_interface.string_operator_index = gdextension_string_operator_index;
+	gde_interface.string_operator_index_const = gdextension_string_operator_index_const;
+
+	/* Packed array functions */
+
+	gde_interface.packed_byte_array_operator_index = gdextension_packed_byte_array_operator_index;
+	gde_interface.packed_byte_array_operator_index_const = gdextension_packed_byte_array_operator_index_const;
+
+	gde_interface.packed_color_array_operator_index = gdextension_packed_color_array_operator_index;
+	gde_interface.packed_color_array_operator_index_const = gdextension_packed_color_array_operator_index_const;
+
+	gde_interface.packed_float32_array_operator_index = gdextension_packed_float32_array_operator_index;
+	gde_interface.packed_float32_array_operator_index_const = gdextension_packed_float32_array_operator_index_const;
+	gde_interface.packed_float64_array_operator_index = gdextension_packed_float64_array_operator_index;
+	gde_interface.packed_float64_array_operator_index_const = gdextension_packed_float64_array_operator_index_const;
+
+	gde_interface.packed_int32_array_operator_index = gdextension_packed_int32_array_operator_index;
+	gde_interface.packed_int32_array_operator_index_const = gdextension_packed_int32_array_operator_index_const;
+	gde_interface.packed_int64_array_operator_index = gdextension_packed_int64_array_operator_index;
+	gde_interface.packed_int64_array_operator_index_const = gdextension_packed_int64_array_operator_index_const;
+
+	gde_interface.packed_string_array_operator_index = gdextension_packed_string_array_operator_index;
+	gde_interface.packed_string_array_operator_index_const = gdextension_packed_string_array_operator_index_const;
+
+	gde_interface.packed_vector2_array_operator_index = gdextension_packed_vector2_array_operator_index;
+	gde_interface.packed_vector2_array_operator_index_const = gdextension_packed_vector2_array_operator_index_const;
+	gde_interface.packed_vector3_array_operator_index = gdextension_packed_vector3_array_operator_index;
+	gde_interface.packed_vector3_array_operator_index_const = gdextension_packed_vector3_array_operator_index_const;
+
+	gde_interface.array_operator_index = gdextension_array_operator_index;
+	gde_interface.array_operator_index_const = gdextension_array_operator_index_const;
+
+	/* Dictionary functions */
+
+	gde_interface.dictionary_operator_index = gdextension_dictionary_operator_index;
+	gde_interface.dictionary_operator_index_const = gdextension_dictionary_operator_index_const;
+
+	/* OBJECT */
+
+	gde_interface.object_method_bind_call = gdextension_object_method_bind_call;
+	gde_interface.object_method_bind_ptrcall = gdextension_object_method_bind_ptrcall;
+	gde_interface.object_destroy = gdextension_object_destroy;
+	gde_interface.global_get_singleton = gdextension_global_get_singleton;
+	gde_interface.object_get_instance_binding = gdextension_object_get_instance_binding;
+	gde_interface.object_set_instance_binding = gdextension_object_set_instance_binding;
+	gde_interface.object_set_instance = gdextension_object_set_instance;
+
+	gde_interface.object_cast_to = gdextension_object_cast_to;
+	gde_interface.object_get_instance_from_id = gdextension_object_get_instance_from_id;
+	gde_interface.object_get_instance_id = gdextension_object_get_instance_id;
+
+	/* SCRIPT INSTANCE */
+
+	gde_interface.script_instance_create = gdextension_script_instance_create;
+
+	/* CLASSDB */
+
+	gde_interface.classdb_construct_object = gdextension_classdb_construct_object;
+	gde_interface.classdb_get_method_bind = gdextension_classdb_get_method_bind;
+	gde_interface.classdb_get_class_tag = gdextension_classdb_get_class_tag;
+
+	/* CLASSDB EXTENSION */
+
+	//these are filled by implementation, since it will want to keep track of registered classes
+	gde_interface.classdb_register_extension_class = nullptr;
+	gde_interface.classdb_register_extension_class_method = nullptr;
+	gde_interface.classdb_register_extension_class_integer_constant = nullptr;
+	gde_interface.classdb_register_extension_class_property = nullptr;
+	gde_interface.classdb_register_extension_class_property_group = nullptr;
+	gde_interface.classdb_register_extension_class_property_subgroup = nullptr;
+	gde_interface.classdb_register_extension_class_signal = nullptr;
+	gde_interface.classdb_unregister_extension_class = nullptr;
+
+	gde_interface.get_library_path = nullptr;
+}

+ 612 - 0
core/extension/gdextension_interface.h

@@ -0,0 +1,612 @@
+/*************************************************************************/
+/*  gdextension_interface.h                                              */
+/*************************************************************************/
+/*                       This file is part of:                           */
+/*                           GODOT ENGINE                                */
+/*                      https://godotengine.org                          */
+/*************************************************************************/
+/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
+/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
+/*                                                                       */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the       */
+/* "Software"), to deal in the Software without restriction, including   */
+/* without limitation the rights to use, copy, modify, merge, publish,   */
+/* distribute, sublicense, and/or sell copies of the Software, and to    */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions:                                             */
+/*                                                                       */
+/* The above copyright notice and this permission notice shall be        */
+/* included in all copies or substantial portions of the Software.       */
+/*                                                                       */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
+/*************************************************************************/
+
+#ifndef GDEXTENSION_INTERFACE_H
+#define GDEXTENSION_INTERFACE_H
+
+/* This is a C class header, you can copy it and use it directly in your own binders.
+ * Together with the JSON file, you should be able to generate any binder.
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#ifndef __cplusplus
+typedef uint32_t char32_t;
+typedef uint16_t char16_t;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* VARIANT TYPES */
+
+typedef enum {
+	GDEXTENSION_VARIANT_TYPE_NIL,
+
+	/*  atomic types */
+	GDEXTENSION_VARIANT_TYPE_BOOL,
+	GDEXTENSION_VARIANT_TYPE_INT,
+	GDEXTENSION_VARIANT_TYPE_FLOAT,
+	GDEXTENSION_VARIANT_TYPE_STRING,
+
+	/* math types */
+	GDEXTENSION_VARIANT_TYPE_VECTOR2,
+	GDEXTENSION_VARIANT_TYPE_VECTOR2I,
+	GDEXTENSION_VARIANT_TYPE_RECT2,
+	GDEXTENSION_VARIANT_TYPE_RECT2I,
+	GDEXTENSION_VARIANT_TYPE_VECTOR3,
+	GDEXTENSION_VARIANT_TYPE_VECTOR3I,
+	GDEXTENSION_VARIANT_TYPE_TRANSFORM2D,
+	GDEXTENSION_VARIANT_TYPE_VECTOR4,
+	GDEXTENSION_VARIANT_TYPE_VECTOR4I,
+	GDEXTENSION_VARIANT_TYPE_PLANE,
+	GDEXTENSION_VARIANT_TYPE_QUATERNION,
+	GDEXTENSION_VARIANT_TYPE_AABB,
+	GDEXTENSION_VARIANT_TYPE_BASIS,
+	GDEXTENSION_VARIANT_TYPE_TRANSFORM3D,
+	GDEXTENSION_VARIANT_TYPE_PROJECTION,
+
+	/* misc types */
+	GDEXTENSION_VARIANT_TYPE_COLOR,
+	GDEXTENSION_VARIANT_TYPE_STRING_NAME,
+	GDEXTENSION_VARIANT_TYPE_NODE_PATH,
+	GDEXTENSION_VARIANT_TYPE_RID,
+	GDEXTENSION_VARIANT_TYPE_OBJECT,
+	GDEXTENSION_VARIANT_TYPE_CALLABLE,
+	GDEXTENSION_VARIANT_TYPE_SIGNAL,
+	GDEXTENSION_VARIANT_TYPE_DICTIONARY,
+	GDEXTENSION_VARIANT_TYPE_ARRAY,
+
+	/* typed arrays */
+	GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY,
+	GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY,
+
+	GDEXTENSION_VARIANT_TYPE_VARIANT_MAX
+} GDExtensionVariantType;
+
+typedef enum {
+	/* comparison */
+	GDEXTENSION_VARIANT_OP_EQUAL,
+	GDEXTENSION_VARIANT_OP_NOT_EQUAL,
+	GDEXTENSION_VARIANT_OP_LESS,
+	GDEXTENSION_VARIANT_OP_LESS_EQUAL,
+	GDEXTENSION_VARIANT_OP_GREATER,
+	GDEXTENSION_VARIANT_OP_GREATER_EQUAL,
+
+	/* mathematic */
+	GDEXTENSION_VARIANT_OP_ADD,
+	GDEXTENSION_VARIANT_OP_SUBTRACT,
+	GDEXTENSION_VARIANT_OP_MULTIPLY,
+	GDEXTENSION_VARIANT_OP_DIVIDE,
+	GDEXTENSION_VARIANT_OP_NEGATE,
+	GDEXTENSION_VARIANT_OP_POSITIVE,
+	GDEXTENSION_VARIANT_OP_MODULE,
+	GDEXTENSION_VARIANT_OP_POWER,
+
+	/* bitwise */
+	GDEXTENSION_VARIANT_OP_SHIFT_LEFT,
+	GDEXTENSION_VARIANT_OP_SHIFT_RIGHT,
+	GDEXTENSION_VARIANT_OP_BIT_AND,
+	GDEXTENSION_VARIANT_OP_BIT_OR,
+	GDEXTENSION_VARIANT_OP_BIT_XOR,
+	GDEXTENSION_VARIANT_OP_BIT_NEGATE,
+
+	/* logic */
+	GDEXTENSION_VARIANT_OP_AND,
+	GDEXTENSION_VARIANT_OP_OR,
+	GDEXTENSION_VARIANT_OP_XOR,
+	GDEXTENSION_VARIANT_OP_NOT,
+
+	/* containment */
+	GDEXTENSION_VARIANT_OP_IN,
+	GDEXTENSION_VARIANT_OP_MAX
+
+} GDExtensionVariantOperator;
+
+typedef void *GDExtensionVariantPtr;
+typedef const void *GDExtensionConstVariantPtr;
+typedef void *GDExtensionStringNamePtr;
+typedef const void *GDExtensionConstStringNamePtr;
+typedef void *GDExtensionStringPtr;
+typedef const void *GDExtensionConstStringPtr;
+typedef void *GDExtensionObjectPtr;
+typedef const void *GDExtensionConstObjectPtr;
+typedef void *GDExtensionTypePtr;
+typedef const void *GDExtensionConstTypePtr;
+typedef const void *GDExtensionMethodBindPtr;
+typedef int64_t GDExtensionInt;
+typedef uint8_t GDExtensionBool;
+typedef uint64_t GDObjectInstanceID;
+
+/* VARIANT DATA I/O */
+
+typedef enum {
+	GDEXTENSION_CALL_OK,
+	GDEXTENSION_CALL_ERROR_INVALID_METHOD,
+	GDEXTENSION_CALL_ERROR_INVALID_ARGUMENT, // Expected a different variant type.
+	GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS, // Expected lower number of arguments.
+	GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS, // Expected higher number of arguments.
+	GDEXTENSION_CALL_ERROR_INSTANCE_IS_NULL,
+	GDEXTENSION_CALL_ERROR_METHOD_NOT_CONST, // Used for const call.
+} GDExtensionCallErrorType;
+
+typedef struct {
+	GDExtensionCallErrorType error;
+	int32_t argument;
+	int32_t expected;
+} GDExtensionCallError;
+
+typedef void (*GDExtensionVariantFromTypeConstructorFunc)(GDExtensionVariantPtr, GDExtensionTypePtr);
+typedef void (*GDExtensionTypeFromVariantConstructorFunc)(GDExtensionTypePtr, GDExtensionVariantPtr);
+typedef void (*GDExtensionPtrOperatorEvaluator)(GDExtensionConstTypePtr p_left, GDExtensionConstTypePtr p_right, GDExtensionTypePtr r_result);
+typedef void (*GDExtensionPtrBuiltInMethod)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_return, int p_argument_count);
+typedef void (*GDExtensionPtrConstructor)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr *p_args);
+typedef void (*GDExtensionPtrDestructor)(GDExtensionTypePtr p_base);
+typedef void (*GDExtensionPtrSetter)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr p_value);
+typedef void (*GDExtensionPtrGetter)(GDExtensionConstTypePtr p_base, GDExtensionTypePtr r_value);
+typedef void (*GDExtensionPtrIndexedSetter)(GDExtensionTypePtr p_base, GDExtensionInt p_index, GDExtensionConstTypePtr p_value);
+typedef void (*GDExtensionPtrIndexedGetter)(GDExtensionConstTypePtr p_base, GDExtensionInt p_index, GDExtensionTypePtr r_value);
+typedef void (*GDExtensionPtrKeyedSetter)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr p_key, GDExtensionConstTypePtr p_value);
+typedef void (*GDExtensionPtrKeyedGetter)(GDExtensionConstTypePtr p_base, GDExtensionConstTypePtr p_key, GDExtensionTypePtr r_value);
+typedef uint32_t (*GDExtensionPtrKeyedChecker)(GDExtensionConstVariantPtr p_base, GDExtensionConstVariantPtr p_key);
+typedef void (*GDExtensionPtrUtilityFunction)(GDExtensionTypePtr r_return, GDExtensionConstTypePtr *p_arguments, int p_argument_count);
+
+typedef GDExtensionObjectPtr (*GDExtensionClassConstructor)();
+
+typedef void *(*GDExtensionInstanceBindingCreateCallback)(void *p_token, void *p_instance);
+typedef void (*GDExtensionInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding);
+typedef GDExtensionBool (*GDExtensionInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDExtensionBool p_reference);
+
+typedef struct {
+	GDExtensionInstanceBindingCreateCallback create_callback;
+	GDExtensionInstanceBindingFreeCallback free_callback;
+	GDExtensionInstanceBindingReferenceCallback reference_callback;
+} GDExtensionInstanceBindingCallbacks;
+
+/* EXTENSION CLASSES */
+
+typedef void *GDExtensionClassInstancePtr;
+
+typedef GDExtensionBool (*GDExtensionClassSet)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value);
+typedef GDExtensionBool (*GDExtensionClassGet)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
+typedef uint64_t (*GDExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance);
+
+typedef struct {
+	GDExtensionVariantType type;
+	GDExtensionStringNamePtr name;
+	GDExtensionStringNamePtr class_name;
+	uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`).
+	GDExtensionStringPtr hint_string;
+	uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`).
+} GDExtensionPropertyInfo;
+
+typedef struct {
+	GDExtensionStringNamePtr name;
+	GDExtensionPropertyInfo return_value;
+	uint32_t flags; // Bitfield of `GDExtensionClassMethodFlags`.
+	int32_t id;
+
+	/* Arguments: `default_arguments` is an array of size `argument_count`. */
+	uint32_t argument_count;
+	GDExtensionPropertyInfo *arguments;
+
+	/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
+	uint32_t default_argument_count;
+	GDExtensionVariantPtr *default_arguments;
+} GDExtensionMethodInfo;
+
+typedef const GDExtensionPropertyInfo *(*GDExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
+typedef void (*GDExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDExtensionPropertyInfo *p_list);
+typedef GDExtensionBool (*GDExtensionClassPropertyCanRevert)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name);
+typedef GDExtensionBool (*GDExtensionClassPropertyGetRevert)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
+typedef void (*GDExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what);
+typedef void (*GDExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr p_out);
+typedef void (*GDExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
+typedef void (*GDExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
+typedef void (*GDExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
+typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance)(void *p_userdata);
+typedef void (*GDExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
+typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_userdata, GDExtensionConstStringNamePtr p_name);
+
+typedef struct {
+	GDExtensionBool is_virtual;
+	GDExtensionBool is_abstract;
+	GDExtensionClassSet set_func;
+	GDExtensionClassGet get_func;
+	GDExtensionClassGetPropertyList get_property_list_func;
+	GDExtensionClassFreePropertyList free_property_list_func;
+	GDExtensionClassPropertyCanRevert property_can_revert_func;
+	GDExtensionClassPropertyGetRevert property_get_revert_func;
+	GDExtensionClassNotification notification_func;
+	GDExtensionClassToString to_string_func;
+	GDExtensionClassReference reference_func;
+	GDExtensionClassUnreference unreference_func;
+	GDExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract.
+	GDExtensionClassFreeInstance free_instance_func; // Destructor; mandatory.
+	GDExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function.
+	GDExtensionClassGetRID get_rid_func;
+	void *class_userdata; // Per-class user data, later accessible in instance bindings.
+} GDExtensionClassCreationInfo;
+
+typedef void *GDExtensionClassLibraryPtr;
+
+/* Method */
+
+typedef enum {
+	GDEXTENSION_METHOD_FLAG_NORMAL = 1,
+	GDEXTENSION_METHOD_FLAG_EDITOR = 2,
+	GDEXTENSION_METHOD_FLAG_CONST = 4,
+	GDEXTENSION_METHOD_FLAG_VIRTUAL = 8,
+	GDEXTENSION_METHOD_FLAG_VARARG = 16,
+	GDEXTENSION_METHOD_FLAG_STATIC = 32,
+	GDEXTENSION_METHOD_FLAGS_DEFAULT = GDEXTENSION_METHOD_FLAG_NORMAL,
+} GDExtensionClassMethodFlags;
+
+typedef enum {
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
+	GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE
+} GDExtensionClassMethodArgumentMetadata;
+
+typedef void (*GDExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
+typedef void (*GDExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
+
+typedef struct {
+	GDExtensionStringNamePtr name;
+	void *method_userdata;
+	GDExtensionClassMethodCall call_func;
+	GDExtensionClassMethodPtrCall ptrcall_func;
+	uint32_t method_flags; // Bitfield of `GDExtensionClassMethodFlags`.
+
+	/* If `has_return_value` is false, `return_value_info` and `return_value_metadata` are ignored. */
+	GDExtensionBool has_return_value;
+	GDExtensionPropertyInfo *return_value_info;
+	GDExtensionClassMethodArgumentMetadata return_value_metadata;
+
+	/* Arguments: `arguments_info` and `arguments_metadata` are array of size `argument_count`.
+	 * Name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies.
+	 */
+	uint32_t argument_count;
+	GDExtensionPropertyInfo *arguments_info;
+	GDExtensionClassMethodArgumentMetadata *arguments_metadata;
+
+	/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
+	uint32_t default_argument_count;
+	GDExtensionVariantPtr *default_arguments;
+} GDExtensionClassMethodInfo;
+
+/* SCRIPT INSTANCE EXTENSION */
+
+typedef void *GDExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation.
+
+typedef GDExtensionBool (*GDExtensionScriptInstanceSet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value);
+typedef GDExtensionBool (*GDExtensionScriptInstanceGet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
+typedef const GDExtensionPropertyInfo *(*GDExtensionScriptInstanceGetPropertyList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
+typedef void (*GDExtensionScriptInstanceFreePropertyList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionPropertyInfo *p_list);
+typedef GDExtensionVariantType (*GDExtensionScriptInstanceGetPropertyType)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool *r_is_valid);
+
+typedef GDExtensionBool (*GDExtensionScriptInstancePropertyCanRevert)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name);
+typedef GDExtensionBool (*GDExtensionScriptInstancePropertyGetRevert)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret);
+
+typedef GDExtensionObjectPtr (*GDExtensionScriptInstanceGetOwner)(GDExtensionScriptInstanceDataPtr p_instance);
+typedef void (*GDExtensionScriptInstancePropertyStateAdd)(GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value, void *p_userdata);
+typedef void (*GDExtensionScriptInstanceGetPropertyState)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata);
+
+typedef const GDExtensionMethodInfo *(*GDExtensionScriptInstanceGetMethodList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
+typedef void (*GDExtensionScriptInstanceFreeMethodList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionMethodInfo *p_list);
+
+typedef GDExtensionBool (*GDExtensionScriptInstanceHasMethod)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name);
+
+typedef void (*GDExtensionScriptInstanceCall)(GDExtensionScriptInstanceDataPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
+typedef void (*GDExtensionScriptInstanceNotification)(GDExtensionScriptInstanceDataPtr p_instance, int32_t p_what);
+typedef void (*GDExtensionScriptInstanceToString)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr r_out);
+
+typedef void (*GDExtensionScriptInstanceRefCountIncremented)(GDExtensionScriptInstanceDataPtr p_instance);
+typedef GDExtensionBool (*GDExtensionScriptInstanceRefCountDecremented)(GDExtensionScriptInstanceDataPtr p_instance);
+
+typedef GDExtensionObjectPtr (*GDExtensionScriptInstanceGetScript)(GDExtensionScriptInstanceDataPtr p_instance);
+typedef GDExtensionBool (*GDExtensionScriptInstanceIsPlaceholder)(GDExtensionScriptInstanceDataPtr p_instance);
+
+typedef void *GDExtensionScriptLanguagePtr;
+
+typedef GDExtensionScriptLanguagePtr (*GDExtensionScriptInstanceGetLanguage)(GDExtensionScriptInstanceDataPtr p_instance);
+
+typedef void (*GDExtensionScriptInstanceFree)(GDExtensionScriptInstanceDataPtr p_instance);
+
+typedef void *GDExtensionScriptInstancePtr; // Pointer to ScriptInstance.
+
+typedef struct {
+	GDExtensionScriptInstanceSet set_func;
+	GDExtensionScriptInstanceGet get_func;
+	GDExtensionScriptInstanceGetPropertyList get_property_list_func;
+	GDExtensionScriptInstanceFreePropertyList free_property_list_func;
+
+	GDExtensionScriptInstancePropertyCanRevert property_can_revert_func;
+	GDExtensionScriptInstancePropertyGetRevert property_get_revert_func;
+
+	GDExtensionScriptInstanceGetOwner get_owner_func;
+	GDExtensionScriptInstanceGetPropertyState get_property_state_func;
+
+	GDExtensionScriptInstanceGetMethodList get_method_list_func;
+	GDExtensionScriptInstanceFreeMethodList free_method_list_func;
+	GDExtensionScriptInstanceGetPropertyType get_property_type_func;
+
+	GDExtensionScriptInstanceHasMethod has_method_func;
+
+	GDExtensionScriptInstanceCall call_func;
+	GDExtensionScriptInstanceNotification notification_func;
+
+	GDExtensionScriptInstanceToString to_string_func;
+
+	GDExtensionScriptInstanceRefCountIncremented refcount_incremented_func;
+	GDExtensionScriptInstanceRefCountDecremented refcount_decremented_func;
+
+	GDExtensionScriptInstanceGetScript get_script_func;
+
+	GDExtensionScriptInstanceIsPlaceholder is_placeholder_func;
+
+	GDExtensionScriptInstanceSet set_fallback_func;
+	GDExtensionScriptInstanceGet get_fallback_func;
+
+	GDExtensionScriptInstanceGetLanguage get_language_func;
+
+	GDExtensionScriptInstanceFree free_func;
+
+} GDExtensionScriptInstanceInfo;
+
+/* INTERFACE */
+
+typedef struct {
+	uint32_t version_major;
+	uint32_t version_minor;
+	uint32_t version_patch;
+	const char *version_string;
+
+	/* GODOT CORE */
+
+	void *(*mem_alloc)(size_t p_bytes);
+	void *(*mem_realloc)(void *p_ptr, size_t p_bytes);
+	void (*mem_free)(void *p_ptr);
+
+	void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
+	void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
+	void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
+
+	uint64_t (*get_native_struct_size)(GDExtensionConstStringNamePtr p_name);
+
+	/* GODOT VARIANT */
+
+	/* variant general */
+	void (*variant_new_copy)(GDExtensionVariantPtr r_dest, GDExtensionConstVariantPtr p_src);
+	void (*variant_new_nil)(GDExtensionVariantPtr r_dest);
+	void (*variant_destroy)(GDExtensionVariantPtr p_self);
+
+	/* variant type */
+	void (*variant_call)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
+	void (*variant_call_static)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error);
+	void (*variant_evaluate)(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionVariantPtr r_return, GDExtensionBool *r_valid);
+	void (*variant_set)(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid);
+	void (*variant_set_named)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid);
+	void (*variant_set_keyed)(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid);
+	void (*variant_set_indexed)(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob);
+	void (*variant_get)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
+	void (*variant_get_named)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
+	void (*variant_get_keyed)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
+	void (*variant_get_indexed)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob);
+	GDExtensionBool (*variant_iter_init)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid);
+	GDExtensionBool (*variant_iter_next)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid);
+	void (*variant_iter_get)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid);
+	GDExtensionInt (*variant_hash)(GDExtensionConstVariantPtr p_self);
+	GDExtensionInt (*variant_recursive_hash)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count);
+	GDExtensionBool (*variant_hash_compare)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other);
+	GDExtensionBool (*variant_booleanize)(GDExtensionConstVariantPtr p_self);
+	void (*variant_duplicate)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_ret, GDExtensionBool p_deep);
+	void (*variant_stringify)(GDExtensionConstVariantPtr p_self, GDExtensionStringPtr r_ret);
+
+	GDExtensionVariantType (*variant_get_type)(GDExtensionConstVariantPtr p_self);
+	GDExtensionBool (*variant_has_method)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method);
+	GDExtensionBool (*variant_has_member)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member);
+	GDExtensionBool (*variant_has_key)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid);
+	void (*variant_get_type_name)(GDExtensionVariantType p_type, GDExtensionStringPtr r_name);
+	GDExtensionBool (*variant_can_convert)(GDExtensionVariantType p_from, GDExtensionVariantType p_to);
+	GDExtensionBool (*variant_can_convert_strict)(GDExtensionVariantType p_from, GDExtensionVariantType p_to);
+
+	/* ptrcalls */
+	GDExtensionVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDExtensionVariantType p_type);
+	GDExtensionTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDExtensionVariantType p_type);
+	GDExtensionPtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b);
+	GDExtensionPtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash);
+	GDExtensionPtrConstructor (*variant_get_ptr_constructor)(GDExtensionVariantType p_type, int32_t p_constructor);
+	GDExtensionPtrDestructor (*variant_get_ptr_destructor)(GDExtensionVariantType p_type);
+	void (*variant_construct)(GDExtensionVariantType p_type, GDExtensionVariantPtr p_base, GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error);
+	GDExtensionPtrSetter (*variant_get_ptr_setter)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member);
+	GDExtensionPtrGetter (*variant_get_ptr_getter)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member);
+	GDExtensionPtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDExtensionVariantType p_type);
+	GDExtensionPtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDExtensionVariantType p_type);
+	GDExtensionPtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDExtensionVariantType p_type);
+	GDExtensionPtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDExtensionVariantType p_type);
+	GDExtensionPtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDExtensionVariantType p_type);
+	void (*variant_get_constant_value)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionVariantPtr r_ret);
+	GDExtensionPtrUtilityFunction (*variant_get_ptr_utility_function)(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash);
+
+	/*  extra utilities */
+	void (*string_new_with_latin1_chars)(GDExtensionStringPtr r_dest, const char *p_contents);
+	void (*string_new_with_utf8_chars)(GDExtensionStringPtr r_dest, const char *p_contents);
+	void (*string_new_with_utf16_chars)(GDExtensionStringPtr r_dest, const char16_t *p_contents);
+	void (*string_new_with_utf32_chars)(GDExtensionStringPtr r_dest, const char32_t *p_contents);
+	void (*string_new_with_wide_chars)(GDExtensionStringPtr r_dest, const wchar_t *p_contents);
+	void (*string_new_with_latin1_chars_and_len)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
+	void (*string_new_with_utf8_chars_and_len)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size);
+	void (*string_new_with_utf16_chars_and_len)(GDExtensionStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size);
+	void (*string_new_with_utf32_chars_and_len)(GDExtensionStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size);
+	void (*string_new_with_wide_chars_and_len)(GDExtensionStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size);
+	/* Information about the following functions:
+	 * - The return value is the resulting encoded string length.
+	 * - The length returned is in characters, not in bytes. It also does not include a trailing zero.
+	 * - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it).
+	 * - Passing NULL in r_text means only the length is computed (again, without including trailing zero).
+	 * - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL.
+	 * - p_max_write_length argument does not affect the return value, it's only to cap write length.
+	 */
+	GDExtensionInt (*string_to_latin1_chars)(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length);
+	GDExtensionInt (*string_to_utf8_chars)(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length);
+	GDExtensionInt (*string_to_utf16_chars)(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length);
+	GDExtensionInt (*string_to_utf32_chars)(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length);
+	GDExtensionInt (*string_to_wide_chars)(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length);
+	char32_t *(*string_operator_index)(GDExtensionStringPtr p_self, GDExtensionInt p_index);
+	const char32_t *(*string_operator_index_const)(GDExtensionConstStringPtr p_self, GDExtensionInt p_index);
+
+	/* Packed array functions */
+
+	uint8_t *(*packed_byte_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray
+	const uint8_t *(*packed_byte_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray
+
+	GDExtensionTypePtr (*packed_color_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedColorArray, returns Color ptr
+	GDExtensionTypePtr (*packed_color_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedColorArray, returns Color ptr
+
+	float *(*packed_float32_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat32Array
+	const float *(*packed_float32_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat32Array
+	double *(*packed_float64_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat64Array
+	const double *(*packed_float64_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat64Array
+
+	int32_t *(*packed_int32_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
+	const int32_t *(*packed_int32_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
+	int64_t *(*packed_int64_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
+	const int64_t *(*packed_int64_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array
+
+	GDExtensionStringPtr (*packed_string_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedStringArray
+	GDExtensionStringPtr (*packed_string_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedStringArray
+
+	GDExtensionTypePtr (*packed_vector2_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
+	GDExtensionTypePtr (*packed_vector2_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
+	GDExtensionTypePtr (*packed_vector3_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
+	GDExtensionTypePtr (*packed_vector3_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
+
+	GDExtensionVariantPtr (*array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr
+	GDExtensionVariantPtr (*array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr
+
+	/* Dictionary functions */
+
+	GDExtensionVariantPtr (*dictionary_operator_index)(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key); // p_self should be an Dictionary ptr
+	GDExtensionVariantPtr (*dictionary_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key); // p_self should be an Dictionary ptr
+
+	/* OBJECT */
+
+	void (*object_method_bind_call)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_ret, GDExtensionCallError *r_error);
+	void (*object_method_bind_ptrcall)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret);
+	void (*object_destroy)(GDExtensionObjectPtr p_o);
+	GDExtensionObjectPtr (*global_get_singleton)(GDExtensionConstStringNamePtr p_name);
+
+	void *(*object_get_instance_binding)(GDExtensionObjectPtr p_o, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks);
+	void (*object_set_instance_binding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
+
+	void (*object_set_instance)(GDExtensionObjectPtr p_o, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */
+
+	GDExtensionObjectPtr (*object_cast_to)(GDExtensionConstObjectPtr p_object, void *p_class_tag);
+	GDExtensionObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id);
+	GDObjectInstanceID (*object_get_instance_id)(GDExtensionConstObjectPtr p_object);
+
+	/* SCRIPT INSTANCE */
+
+	GDExtensionScriptInstancePtr (*script_instance_create)(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data);
+
+	/* CLASSDB */
+
+	GDExtensionObjectPtr (*classdb_construct_object)(GDExtensionConstStringNamePtr p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */
+	GDExtensionMethodBindPtr (*classdb_get_method_bind)(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash);
+	void *(*classdb_get_class_tag)(GDExtensionConstStringNamePtr p_classname);
+
+	/* CLASSDB EXTENSION */
+
+	/* Provided parameters for `classdb_register_extension_*` can be safely freed once the function returns. */
+	void (*classdb_register_extension_class)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs);
+	void (*classdb_register_extension_class_method)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info);
+	void (*classdb_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);
+	void (*classdb_register_extension_class_property)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter);
+	void (*classdb_register_extension_class_property_group)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_group_name, GDExtensionConstStringPtr p_prefix);
+	void (*classdb_register_extension_class_property_subgroup)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_subgroup_name, GDExtensionConstStringPtr p_prefix);
+	void (*classdb_register_extension_class_signal)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count);
+	void (*classdb_unregister_extension_class)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
+
+	void (*get_library_path)(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path);
+
+} GDExtensionInterface;
+
+/* INITIALIZATION */
+
+typedef enum {
+	GDEXTENSION_INITIALIZATION_CORE,
+	GDEXTENSION_INITIALIZATION_SERVERS,
+	GDEXTENSION_INITIALIZATION_SCENE,
+	GDEXTENSION_INITIALIZATION_EDITOR,
+	GDEXTENSION_MAX_INITIALIZATION_LEVEL,
+} GDExtensionInitializationLevel;
+
+typedef struct {
+	/* Minimum initialization level required.
+	 * If Core or Servers, the extension needs editor or game restart to take effect */
+	GDExtensionInitializationLevel minimum_initialization_level;
+	/* Up to the user to supply when initializing */
+	void *userdata;
+	/* This function will be called multiple times for each initialization level. */
+	void (*initialize)(void *userdata, GDExtensionInitializationLevel p_level);
+	void (*deinitialize)(void *userdata, GDExtensionInitializationLevel p_level);
+} GDExtensionInitialization;
+
+/* Define a C function prototype that implements the function below and expose it to dlopen() (or similar).
+ * This is the entry point of the GDExtension library and will be called on initialization.
+ * It can be used to set up different init levels, which are called during various stages of initialization/shutdown.
+ * The function name must be a unique one specified in the .gdextension config file.
+ */
+typedef GDExtensionBool (*GDExtensionInitializationFunction)(const GDExtensionInterface *p_interface, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // GDEXTENSION_INTERFACE_H

+ 38 - 38
core/extension/native_extension_manager.cpp → core/extension/gdextension_manager.cpp

@@ -1,5 +1,5 @@
 /*************************************************************************/
-/*  native_extension_manager.cpp                                         */
+/*  gdextension_manager.cpp                                              */
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
@@ -28,91 +28,91 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#include "native_extension_manager.h"
+#include "gdextension_manager.h"
 #include "core/io/file_access.h"
 
-NativeExtensionManager::LoadStatus NativeExtensionManager::load_extension(const String &p_path) {
-	if (native_extension_map.has(p_path)) {
+GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &p_path) {
+	if (gdextension_map.has(p_path)) {
 		return LOAD_STATUS_ALREADY_LOADED;
 	}
-	Ref<NativeExtension> extension = ResourceLoader::load(p_path);
+	Ref<GDExtension> extension = ResourceLoader::load(p_path);
 	if (extension.is_null()) {
 		return LOAD_STATUS_FAILED;
 	}
 
 	if (level >= 0) { // Already initialized up to some level.
 		int32_t minimum_level = extension->get_minimum_library_initialization_level();
-		if (minimum_level < MIN(level, NativeExtension::INITIALIZATION_LEVEL_SCENE)) {
+		if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) {
 			return LOAD_STATUS_NEEDS_RESTART;
 		}
 		// Initialize up to current level.
 		for (int32_t i = minimum_level; i <= level; i++) {
-			extension->initialize_library(NativeExtension::InitializationLevel(i));
+			extension->initialize_library(GDExtension::InitializationLevel(i));
 		}
 	}
-	native_extension_map[p_path] = extension;
+	gdextension_map[p_path] = extension;
 	return LOAD_STATUS_OK;
 }
 
-NativeExtensionManager::LoadStatus NativeExtensionManager::reload_extension(const String &p_path) {
+GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String &p_path) {
 	return LOAD_STATUS_OK; //TODO
 }
-NativeExtensionManager::LoadStatus NativeExtensionManager::unload_extension(const String &p_path) {
-	if (!native_extension_map.has(p_path)) {
+GDExtensionManager::LoadStatus GDExtensionManager::unload_extension(const String &p_path) {
+	if (!gdextension_map.has(p_path)) {
 		return LOAD_STATUS_NOT_LOADED;
 	}
 
-	Ref<NativeExtension> extension = native_extension_map[p_path];
+	Ref<GDExtension> extension = gdextension_map[p_path];
 
 	if (level >= 0) { // Already initialized up to some level.
 		int32_t minimum_level = extension->get_minimum_library_initialization_level();
-		if (minimum_level < MIN(level, NativeExtension::INITIALIZATION_LEVEL_SCENE)) {
+		if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) {
 			return LOAD_STATUS_NEEDS_RESTART;
 		}
 		// Deinitialize down to current level.
 		for (int32_t i = level; i >= minimum_level; i--) {
-			extension->deinitialize_library(NativeExtension::InitializationLevel(i));
+			extension->deinitialize_library(GDExtension::InitializationLevel(i));
 		}
 	}
-	native_extension_map.erase(p_path);
+	gdextension_map.erase(p_path);
 	return LOAD_STATUS_OK;
 }
 
-bool NativeExtensionManager::is_extension_loaded(const String &p_path) const {
-	return native_extension_map.has(p_path);
+bool GDExtensionManager::is_extension_loaded(const String &p_path) const {
+	return gdextension_map.has(p_path);
 }
 
-Vector<String> NativeExtensionManager::get_loaded_extensions() const {
+Vector<String> GDExtensionManager::get_loaded_extensions() const {
 	Vector<String> ret;
-	for (const KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
+	for (const KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
 		ret.push_back(E.key);
 	}
 	return ret;
 }
-Ref<NativeExtension> NativeExtensionManager::get_extension(const String &p_path) {
-	HashMap<String, Ref<NativeExtension>>::Iterator E = native_extension_map.find(p_path);
-	ERR_FAIL_COND_V(!E, Ref<NativeExtension>());
+Ref<GDExtension> GDExtensionManager::get_extension(const String &p_path) {
+	HashMap<String, Ref<GDExtension>>::Iterator E = gdextension_map.find(p_path);
+	ERR_FAIL_COND_V(!E, Ref<GDExtension>());
 	return E->value;
 }
 
-void NativeExtensionManager::initialize_extensions(NativeExtension::InitializationLevel p_level) {
+void GDExtensionManager::initialize_extensions(GDExtension::InitializationLevel p_level) {
 	ERR_FAIL_COND(int32_t(p_level) - 1 != level);
-	for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
+	for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
 		E.value->initialize_library(p_level);
 	}
 	level = p_level;
 }
 
-void NativeExtensionManager::deinitialize_extensions(NativeExtension::InitializationLevel p_level) {
+void GDExtensionManager::deinitialize_extensions(GDExtension::InitializationLevel p_level) {
 	ERR_FAIL_COND(int32_t(p_level) != level);
-	for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) {
+	for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) {
 		E.value->deinitialize_library(p_level);
 	}
 	level = int32_t(p_level) - 1;
 }
 
-void NativeExtensionManager::load_extensions() {
-	Ref<FileAccess> f = FileAccess::open(NativeExtension::get_extension_list_config_file(), FileAccess::READ);
+void GDExtensionManager::load_extensions() {
+	Ref<FileAccess> f = FileAccess::open(GDExtension::get_extension_list_config_file(), FileAccess::READ);
 	while (f.is_valid() && !f->eof_reached()) {
 		String s = f->get_line().strip_edges();
 		if (!s.is_empty()) {
@@ -122,17 +122,17 @@ void NativeExtensionManager::load_extensions() {
 	}
 }
 
-NativeExtensionManager *NativeExtensionManager::get_singleton() {
+GDExtensionManager *GDExtensionManager::get_singleton() {
 	return singleton;
 }
-void NativeExtensionManager::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("load_extension", "path"), &NativeExtensionManager::load_extension);
-	ClassDB::bind_method(D_METHOD("reload_extension", "path"), &NativeExtensionManager::reload_extension);
-	ClassDB::bind_method(D_METHOD("unload_extension", "path"), &NativeExtensionManager::unload_extension);
-	ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &NativeExtensionManager::is_extension_loaded);
+void GDExtensionManager::_bind_methods() {
+	ClassDB::bind_method(D_METHOD("load_extension", "path"), &GDExtensionManager::load_extension);
+	ClassDB::bind_method(D_METHOD("reload_extension", "path"), &GDExtensionManager::reload_extension);
+	ClassDB::bind_method(D_METHOD("unload_extension", "path"), &GDExtensionManager::unload_extension);
+	ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &GDExtensionManager::is_extension_loaded);
 
-	ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &NativeExtensionManager::get_loaded_extensions);
-	ClassDB::bind_method(D_METHOD("get_extension", "path"), &NativeExtensionManager::get_extension);
+	ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &GDExtensionManager::get_loaded_extensions);
+	ClassDB::bind_method(D_METHOD("get_extension", "path"), &GDExtensionManager::get_extension);
 
 	BIND_ENUM_CONSTANT(LOAD_STATUS_OK);
 	BIND_ENUM_CONSTANT(LOAD_STATUS_FAILED);
@@ -141,9 +141,9 @@ void NativeExtensionManager::_bind_methods() {
 	BIND_ENUM_CONSTANT(LOAD_STATUS_NEEDS_RESTART);
 }
 
-NativeExtensionManager *NativeExtensionManager::singleton = nullptr;
+GDExtensionManager *GDExtensionManager::singleton = nullptr;
 
-NativeExtensionManager::NativeExtensionManager() {
+GDExtensionManager::GDExtensionManager() {
 	ERR_FAIL_COND(singleton != nullptr);
 	singleton = this;
 }

+ 15 - 15
core/extension/native_extension_manager.h → core/extension/gdextension_manager.h

@@ -1,5 +1,5 @@
 /*************************************************************************/
-/*  native_extension_manager.h                                           */
+/*  gdextension_manager.h                                                */
 /*************************************************************************/
 /*                       This file is part of:                           */
 /*                           GODOT ENGINE                                */
@@ -28,20 +28,20 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
-#ifndef NATIVE_EXTENSION_MANAGER_H
-#define NATIVE_EXTENSION_MANAGER_H
+#ifndef GDEXTENSION_MANAGER_H
+#define GDEXTENSION_MANAGER_H
 
-#include "core/extension/native_extension.h"
+#include "core/extension/gdextension.h"
 
-class NativeExtensionManager : public Object {
-	GDCLASS(NativeExtensionManager, Object);
+class GDExtensionManager : public Object {
+	GDCLASS(GDExtensionManager, Object);
 
 	int32_t level = -1;
-	HashMap<String, Ref<NativeExtension>> native_extension_map;
+	HashMap<String, Ref<GDExtension>> gdextension_map;
 
 	static void _bind_methods();
 
-	static NativeExtensionManager *singleton;
+	static GDExtensionManager *singleton;
 
 public:
 	enum LoadStatus {
@@ -57,18 +57,18 @@ public:
 	LoadStatus unload_extension(const String &p_path);
 	bool is_extension_loaded(const String &p_path) const;
 	Vector<String> get_loaded_extensions() const;
-	Ref<NativeExtension> get_extension(const String &p_path);
+	Ref<GDExtension> get_extension(const String &p_path);
 
-	void initialize_extensions(NativeExtension::InitializationLevel p_level);
-	void deinitialize_extensions(NativeExtension::InitializationLevel p_level);
+	void initialize_extensions(GDExtension::InitializationLevel p_level);
+	void deinitialize_extensions(GDExtension::InitializationLevel p_level);
 
-	static NativeExtensionManager *get_singleton();
+	static GDExtensionManager *get_singleton();
 
 	void load_extensions();
 
-	NativeExtensionManager();
+	GDExtensionManager();
 };
 
-VARIANT_ENUM_CAST(NativeExtensionManager::LoadStatus)
+VARIANT_ENUM_CAST(GDExtensionManager::LoadStatus)
 
-#endif // NATIVE_EXTENSION_MANAGER_H
+#endif // GDEXTENSION_MANAGER_H

+ 0 - 1083
core/extension/gdnative_interface.cpp

@@ -1,1083 +0,0 @@
-/*************************************************************************/
-/*  gdnative_interface.cpp                                               */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#include "gdnative_interface.h"
-
-#include "core/config/engine.h"
-#include "core/object/class_db.h"
-#include "core/object/script_language_extension.h"
-#include "core/os/memory.h"
-#include "core/variant/variant.h"
-#include "core/version.h"
-
-// Memory Functions
-static void *gdnative_alloc(size_t p_size) {
-	return memalloc(p_size);
-}
-
-static void *gdnative_realloc(void *p_mem, size_t p_size) {
-	return memrealloc(p_mem, p_size);
-}
-
-static void gdnative_free(void *p_mem) {
-	memfree(p_mem);
-}
-
-// Helper print functions.
-static void gdnative_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
-	_err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_ERROR);
-}
-static void gdnative_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
-	_err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_WARNING);
-}
-static void gdnative_print_script_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) {
-	_err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_SCRIPT);
-}
-
-uint64_t gdnative_get_native_struct_size(GDNativeConstStringNamePtr p_name) {
-	const StringName name = *reinterpret_cast<const StringName *>(p_name);
-	return ClassDB::get_native_struct_size(name);
-}
-
-// Variant functions
-
-static void gdnative_variant_new_copy(GDNativeVariantPtr r_dest, GDNativeConstVariantPtr p_src) {
-	memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<const Variant *>(p_src)));
-}
-static void gdnative_variant_new_nil(GDNativeVariantPtr r_dest) {
-	memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant);
-}
-static void gdnative_variant_destroy(GDNativeVariantPtr p_self) {
-	reinterpret_cast<Variant *>(p_self)->~Variant();
-}
-
-// variant type
-
-static void gdnative_variant_call(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argcount, GDNativeVariantPtr r_return, GDNativeCallError *r_error) {
-	Variant *self = (Variant *)p_self;
-	const StringName method = *reinterpret_cast<const StringName *>(p_method);
-	const Variant **args = (const Variant **)p_args;
-	Variant ret;
-	Callable::CallError error;
-	self->callp(method, args, p_argcount, ret, error);
-	memnew_placement(r_return, Variant(ret));
-
-	if (r_error) {
-		r_error->error = (GDNativeCallErrorType)(error.error);
-		r_error->argument = error.argument;
-		r_error->expected = error.expected;
-	}
-}
-
-static void gdnative_variant_call_static(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argcount, GDNativeVariantPtr r_return, GDNativeCallError *r_error) {
-	Variant::Type type = (Variant::Type)p_type;
-	const StringName method = *reinterpret_cast<const StringName *>(p_method);
-	const Variant **args = (const Variant **)p_args;
-	Variant ret;
-	Callable::CallError error;
-	Variant::call_static(type, method, args, p_argcount, ret, error);
-	memnew_placement(r_return, Variant(ret));
-
-	if (r_error) {
-		r_error->error = (GDNativeCallErrorType)error.error;
-		r_error->argument = error.argument;
-		r_error->expected = error.expected;
-	}
-}
-
-static void gdnative_variant_evaluate(GDNativeVariantOperator p_op, GDNativeConstVariantPtr p_a, GDNativeConstVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid) {
-	Variant::Operator op = (Variant::Operator)p_op;
-	const Variant *a = (const Variant *)p_a;
-	const Variant *b = (const Variant *)p_b;
-	Variant *ret = (Variant *)r_return;
-	bool valid;
-	Variant::evaluate(op, *a, *b, *ret, valid);
-	*r_valid = valid;
-}
-
-static void gdnative_variant_set(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid) {
-	Variant *self = (Variant *)p_self;
-	const Variant *key = (const Variant *)p_key;
-	const Variant *value = (const Variant *)p_value;
-
-	bool valid;
-	self->set(*key, *value, &valid);
-	*r_valid = valid;
-}
-
-static void gdnative_variant_set_named(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid) {
-	Variant *self = (Variant *)p_self;
-	const StringName *key = (const StringName *)p_key;
-	const Variant *value = (const Variant *)p_value;
-
-	bool valid;
-	self->set_named(*key, *value, valid);
-	*r_valid = valid;
-}
-
-static void gdnative_variant_set_keyed(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid) {
-	Variant *self = (Variant *)p_self;
-	const Variant *key = (const Variant *)p_key;
-	const Variant *value = (const Variant *)p_value;
-
-	bool valid;
-	self->set_keyed(*key, *value, valid);
-	*r_valid = valid;
-}
-
-static void gdnative_variant_set_indexed(GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob) {
-	Variant *self = (Variant *)p_self;
-	const Variant *value = (const Variant *)p_value;
-
-	bool valid;
-	bool oob;
-	self->set_indexed(p_index, *value, valid, oob);
-	*r_valid = valid;
-	*r_oob = oob;
-}
-
-static void gdnative_variant_get(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	const Variant *key = (const Variant *)p_key;
-
-	bool valid;
-	memnew_placement(r_ret, Variant(self->get(*key, &valid)));
-	*r_valid = valid;
-}
-
-static void gdnative_variant_get_named(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	const StringName *key = (const StringName *)p_key;
-
-	bool valid;
-	memnew_placement(r_ret, Variant(self->get_named(*key, valid)));
-	*r_valid = valid;
-}
-
-static void gdnative_variant_get_keyed(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	const Variant *key = (const Variant *)p_key;
-
-	bool valid;
-	memnew_placement(r_ret, Variant(self->get_keyed(*key, valid)));
-	*r_valid = valid;
-}
-
-static void gdnative_variant_get_indexed(GDNativeConstVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob) {
-	const Variant *self = (const Variant *)p_self;
-
-	bool valid;
-	bool oob;
-	memnew_placement(r_ret, Variant(self->get_indexed(p_index, valid, oob)));
-	*r_valid = valid;
-	*r_oob = oob;
-}
-
-/// Iteration.
-static GDNativeBool gdnative_variant_iter_init(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	Variant *iter = (Variant *)r_iter;
-
-	bool valid;
-	bool ret = self->iter_init(*iter, valid);
-	*r_valid = valid;
-	return ret;
-}
-
-static GDNativeBool gdnative_variant_iter_next(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	Variant *iter = (Variant *)r_iter;
-
-	bool valid;
-	bool ret = self->iter_next(*iter, valid);
-	*r_valid = valid;
-	return ret;
-}
-
-static void gdnative_variant_iter_get(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	Variant *iter = (Variant *)r_iter;
-
-	bool valid;
-	memnew_placement(r_ret, Variant(self->iter_next(*iter, valid)));
-	*r_valid = valid;
-}
-
-/// Variant functions.
-static GDNativeInt gdnative_variant_hash(GDNativeConstVariantPtr p_self) {
-	const Variant *self = (const Variant *)p_self;
-	return self->hash();
-}
-
-static GDNativeInt gdnative_variant_recursive_hash(GDNativeConstVariantPtr p_self, GDNativeInt p_recursion_count) {
-	const Variant *self = (const Variant *)p_self;
-	return self->recursive_hash(p_recursion_count);
-}
-
-static GDNativeBool gdnative_variant_hash_compare(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_other) {
-	const Variant *self = (const Variant *)p_self;
-	const Variant *other = (const Variant *)p_other;
-	return self->hash_compare(*other);
-}
-
-static GDNativeBool gdnative_variant_booleanize(GDNativeConstVariantPtr p_self) {
-	const Variant *self = (const Variant *)p_self;
-	return self->booleanize();
-}
-
-static void gdnative_variant_duplicate(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep) {
-	const Variant *self = (const Variant *)p_self;
-	memnew_placement(r_ret, Variant(self->duplicate(p_deep)));
-}
-
-static void gdnative_variant_stringify(GDNativeConstVariantPtr p_self, GDNativeStringPtr r_ret) {
-	const Variant *self = (const Variant *)p_self;
-	memnew_placement(r_ret, String(*self));
-}
-
-static GDNativeVariantType gdnative_variant_get_type(GDNativeConstVariantPtr p_self) {
-	const Variant *self = (const Variant *)p_self;
-	return (GDNativeVariantType)self->get_type();
-}
-
-static GDNativeBool gdnative_variant_has_method(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_method) {
-	const Variant *self = (const Variant *)p_self;
-	const StringName *method = (const StringName *)p_method;
-	return self->has_method(*method);
-}
-
-static GDNativeBool gdnative_variant_has_member(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member) {
-	return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member));
-}
-
-static GDNativeBool gdnative_variant_has_key(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeBool *r_valid) {
-	const Variant *self = (const Variant *)p_self;
-	const Variant *key = (const Variant *)p_key;
-	bool valid;
-	bool ret = self->has_key(*key, valid);
-	*r_valid = valid;
-	return ret;
-}
-
-static void gdnative_variant_get_type_name(GDNativeVariantType p_type, GDNativeStringPtr r_ret) {
-	String name = Variant::get_type_name((Variant::Type)p_type);
-	memnew_placement(r_ret, String(name));
-}
-
-static GDNativeBool gdnative_variant_can_convert(GDNativeVariantType p_from, GDNativeVariantType p_to) {
-	return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to);
-}
-
-static GDNativeBool gdnative_variant_can_convert_strict(GDNativeVariantType p_from, GDNativeVariantType p_to) {
-	return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to);
-}
-
-// Variant interaction.
-static GDNativeVariantFromTypeConstructorFunc gdnative_get_variant_from_type_constructor(GDNativeVariantType p_type) {
-	switch (p_type) {
-		case GDNATIVE_VARIANT_TYPE_BOOL:
-			return VariantTypeConstructor<bool>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_INT:
-			return VariantTypeConstructor<int64_t>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_FLOAT:
-			return VariantTypeConstructor<double>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_STRING:
-			return VariantTypeConstructor<String>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_VECTOR2:
-			return VariantTypeConstructor<Vector2>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_VECTOR2I:
-			return VariantTypeConstructor<Vector2i>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_RECT2:
-			return VariantTypeConstructor<Rect2>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_RECT2I:
-			return VariantTypeConstructor<Rect2i>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_VECTOR3:
-			return VariantTypeConstructor<Vector3>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_VECTOR3I:
-			return VariantTypeConstructor<Vector3i>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_TRANSFORM2D:
-			return VariantTypeConstructor<Transform2D>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_VECTOR4:
-			return VariantTypeConstructor<Vector4>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_VECTOR4I:
-			return VariantTypeConstructor<Vector4i>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PLANE:
-			return VariantTypeConstructor<Plane>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_QUATERNION:
-			return VariantTypeConstructor<Quaternion>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_AABB:
-			return VariantTypeConstructor<AABB>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_BASIS:
-			return VariantTypeConstructor<Basis>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_TRANSFORM3D:
-			return VariantTypeConstructor<Transform3D>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PROJECTION:
-			return VariantTypeConstructor<Projection>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_COLOR:
-			return VariantTypeConstructor<Color>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_STRING_NAME:
-			return VariantTypeConstructor<StringName>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_NODE_PATH:
-			return VariantTypeConstructor<NodePath>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_RID:
-			return VariantTypeConstructor<RID>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_OBJECT:
-			return VariantTypeConstructor<Object *>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_CALLABLE:
-			return VariantTypeConstructor<Callable>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_SIGNAL:
-			return VariantTypeConstructor<Signal>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_DICTIONARY:
-			return VariantTypeConstructor<Dictionary>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_ARRAY:
-			return VariantTypeConstructor<Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY:
-			return VariantTypeConstructor<PackedByteArray>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY:
-			return VariantTypeConstructor<PackedInt32Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY:
-			return VariantTypeConstructor<PackedInt64Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:
-			return VariantTypeConstructor<PackedFloat32Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:
-			return VariantTypeConstructor<PackedFloat64Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY:
-			return VariantTypeConstructor<PackedStringArray>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:
-			return VariantTypeConstructor<PackedVector2Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:
-			return VariantTypeConstructor<PackedVector3Array>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY:
-			return VariantTypeConstructor<PackedColorArray>::variant_from_type;
-		case GDNATIVE_VARIANT_TYPE_NIL:
-		case GDNATIVE_VARIANT_TYPE_VARIANT_MAX:
-			ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
-	}
-	ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
-}
-
-static GDNativeTypeFromVariantConstructorFunc gdnative_get_type_from_variant_constructor(GDNativeVariantType p_type) {
-	switch (p_type) {
-		case GDNATIVE_VARIANT_TYPE_BOOL:
-			return VariantTypeConstructor<bool>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_INT:
-			return VariantTypeConstructor<int64_t>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_FLOAT:
-			return VariantTypeConstructor<double>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_STRING:
-			return VariantTypeConstructor<String>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_VECTOR2:
-			return VariantTypeConstructor<Vector2>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_VECTOR2I:
-			return VariantTypeConstructor<Vector2i>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_RECT2:
-			return VariantTypeConstructor<Rect2>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_RECT2I:
-			return VariantTypeConstructor<Rect2i>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_VECTOR3:
-			return VariantTypeConstructor<Vector3>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_VECTOR3I:
-			return VariantTypeConstructor<Vector3i>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_TRANSFORM2D:
-			return VariantTypeConstructor<Transform2D>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_VECTOR4:
-			return VariantTypeConstructor<Vector4>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_VECTOR4I:
-			return VariantTypeConstructor<Vector4i>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PLANE:
-			return VariantTypeConstructor<Plane>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_QUATERNION:
-			return VariantTypeConstructor<Quaternion>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_AABB:
-			return VariantTypeConstructor<AABB>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_BASIS:
-			return VariantTypeConstructor<Basis>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_TRANSFORM3D:
-			return VariantTypeConstructor<Transform3D>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PROJECTION:
-			return VariantTypeConstructor<Projection>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_COLOR:
-			return VariantTypeConstructor<Color>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_STRING_NAME:
-			return VariantTypeConstructor<StringName>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_NODE_PATH:
-			return VariantTypeConstructor<NodePath>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_RID:
-			return VariantTypeConstructor<RID>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_OBJECT:
-			return VariantTypeConstructor<Object *>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_CALLABLE:
-			return VariantTypeConstructor<Callable>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_SIGNAL:
-			return VariantTypeConstructor<Signal>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_DICTIONARY:
-			return VariantTypeConstructor<Dictionary>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_ARRAY:
-			return VariantTypeConstructor<Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY:
-			return VariantTypeConstructor<PackedByteArray>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY:
-			return VariantTypeConstructor<PackedInt32Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY:
-			return VariantTypeConstructor<PackedInt64Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:
-			return VariantTypeConstructor<PackedFloat32Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:
-			return VariantTypeConstructor<PackedFloat64Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY:
-			return VariantTypeConstructor<PackedStringArray>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:
-			return VariantTypeConstructor<PackedVector2Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:
-			return VariantTypeConstructor<PackedVector3Array>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY:
-			return VariantTypeConstructor<PackedColorArray>::type_from_variant;
-		case GDNATIVE_VARIANT_TYPE_NIL:
-		case GDNATIVE_VARIANT_TYPE_VARIANT_MAX:
-			ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
-	}
-	ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");
-}
-
-// ptrcalls
-static GDNativePtrOperatorEvaluator gdnative_variant_get_ptr_operator_evaluator(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b) {
-	return (GDNativePtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b));
-}
-static GDNativePtrBuiltInMethod gdnative_variant_get_ptr_builtin_method(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeInt p_hash) {
-	const StringName method = *reinterpret_cast<const StringName *>(p_method);
-	uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method);
-	if (hash != p_hash) {
-		ERR_PRINT_ONCE("Error getting method " + method + ", hash mismatch.");
-		return nullptr;
-	}
-
-	return (GDNativePtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method);
-}
-static GDNativePtrConstructor gdnative_variant_get_ptr_constructor(GDNativeVariantType p_type, int32_t p_constructor) {
-	return (GDNativePtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor);
-}
-static GDNativePtrDestructor gdnative_variant_get_ptr_destructor(GDNativeVariantType p_type) {
-	return (GDNativePtrDestructor)Variant::get_ptr_destructor(Variant::Type(p_type));
-}
-static void gdnative_variant_construct(GDNativeVariantType p_type, GDNativeVariantPtr p_base, GDNativeConstVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error) {
-	memnew_placement(p_base, Variant);
-
-	Callable::CallError error;
-	Variant::construct(Variant::Type(p_type), *(Variant *)p_base, (const Variant **)p_args, p_argument_count, error);
-
-	if (r_error) {
-		r_error->error = (GDNativeCallErrorType)(error.error);
-		r_error->argument = error.argument;
-		r_error->expected = error.expected;
-	}
-}
-static GDNativePtrSetter gdnative_variant_get_ptr_setter(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member) {
-	const StringName member = *reinterpret_cast<const StringName *>(p_member);
-	return (GDNativePtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), member);
-}
-static GDNativePtrGetter gdnative_variant_get_ptr_getter(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member) {
-	const StringName member = *reinterpret_cast<const StringName *>(p_member);
-	return (GDNativePtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), member);
-}
-static GDNativePtrIndexedSetter gdnative_variant_get_ptr_indexed_setter(GDNativeVariantType p_type) {
-	return (GDNativePtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type));
-}
-static GDNativePtrIndexedGetter gdnative_variant_get_ptr_indexed_getter(GDNativeVariantType p_type) {
-	return (GDNativePtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type));
-}
-static GDNativePtrKeyedSetter gdnative_variant_get_ptr_keyed_setter(GDNativeVariantType p_type) {
-	return (GDNativePtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type));
-}
-static GDNativePtrKeyedGetter gdnative_variant_get_ptr_keyed_getter(GDNativeVariantType p_type) {
-	return (GDNativePtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type));
-}
-static GDNativePtrKeyedChecker gdnative_variant_get_ptr_keyed_checker(GDNativeVariantType p_type) {
-	return (GDNativePtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type));
-}
-static void gdnative_variant_get_constant_value(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_constant, GDNativeVariantPtr r_ret) {
-	StringName constant = *reinterpret_cast<const StringName *>(p_constant);
-	memnew_placement(r_ret, Variant(Variant::get_constant_value(Variant::Type(p_type), constant)));
-}
-static GDNativePtrUtilityFunction gdnative_variant_get_ptr_utility_function(GDNativeConstStringNamePtr p_function, GDNativeInt p_hash) {
-	StringName function = *reinterpret_cast<const StringName *>(p_function);
-	uint32_t hash = Variant::get_utility_function_hash(function);
-	if (hash != p_hash) {
-		ERR_PRINT_ONCE("Error getting utility function " + function + ", hash mismatch.");
-		return nullptr;
-	}
-	return (GDNativePtrUtilityFunction)Variant::get_ptr_utility_function(function);
-}
-
-//string helpers
-
-static void gdnative_string_new_with_latin1_chars(GDNativeStringPtr r_dest, const char *p_contents) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	*dest = String(p_contents);
-}
-
-static void gdnative_string_new_with_utf8_chars(GDNativeStringPtr r_dest, const char *p_contents) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	dest->parse_utf8(p_contents);
-}
-
-static void gdnative_string_new_with_utf16_chars(GDNativeStringPtr r_dest, const char16_t *p_contents) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	dest->parse_utf16(p_contents);
-}
-
-static void gdnative_string_new_with_utf32_chars(GDNativeStringPtr r_dest, const char32_t *p_contents) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	*dest = String((const char32_t *)p_contents);
-}
-
-static void gdnative_string_new_with_wide_chars(GDNativeStringPtr r_dest, const wchar_t *p_contents) {
-	String *dest = (String *)r_dest;
-	if constexpr (sizeof(wchar_t) == 2) {
-		// wchar_t is 16 bit, parse.
-		memnew_placement(dest, String);
-		dest->parse_utf16((const char16_t *)p_contents);
-	} else {
-		// wchar_t is 32 bit, copy.
-		memnew_placement(dest, String);
-		*dest = String((const char32_t *)p_contents);
-	}
-}
-
-static void gdnative_string_new_with_latin1_chars_and_len(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	*dest = String(p_contents, p_size);
-}
-
-static void gdnative_string_new_with_utf8_chars_and_len(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	dest->parse_utf8(p_contents, p_size);
-}
-
-static void gdnative_string_new_with_utf16_chars_and_len(GDNativeStringPtr r_dest, const char16_t *p_contents, GDNativeInt p_size) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	dest->parse_utf16(p_contents, p_size);
-}
-
-static void gdnative_string_new_with_utf32_chars_and_len(GDNativeStringPtr r_dest, const char32_t *p_contents, GDNativeInt p_size) {
-	String *dest = (String *)r_dest;
-	memnew_placement(dest, String);
-	*dest = String((const char32_t *)p_contents, p_size);
-}
-
-static void gdnative_string_new_with_wide_chars_and_len(GDNativeStringPtr r_dest, const wchar_t *p_contents, GDNativeInt p_size) {
-	String *dest = (String *)r_dest;
-	if constexpr (sizeof(wchar_t) == 2) {
-		// wchar_t is 16 bit, parse.
-		memnew_placement(dest, String);
-		dest->parse_utf16((const char16_t *)p_contents, p_size);
-	} else {
-		// wchar_t is 32 bit, copy.
-		memnew_placement(dest, String);
-		*dest = String((const char32_t *)p_contents, p_size);
-	}
-}
-
-static GDNativeInt gdnative_string_to_latin1_chars(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length) {
-	String *self = (String *)p_self;
-	CharString cs = self->ascii(true);
-	GDNativeInt len = cs.length();
-	if (r_text) {
-		const char *s_text = cs.ptr();
-		for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
-			r_text[i] = s_text[i];
-		}
-	}
-	return len;
-}
-static GDNativeInt gdnative_string_to_utf8_chars(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length) {
-	String *self = (String *)p_self;
-	CharString cs = self->utf8();
-	GDNativeInt len = cs.length();
-	if (r_text) {
-		const char *s_text = cs.ptr();
-		for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
-			r_text[i] = s_text[i];
-		}
-	}
-	return len;
-}
-static GDNativeInt gdnative_string_to_utf16_chars(GDNativeConstStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length) {
-	String *self = (String *)p_self;
-	Char16String cs = self->utf16();
-	GDNativeInt len = cs.length();
-	if (r_text) {
-		const char16_t *s_text = cs.ptr();
-		for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
-			r_text[i] = s_text[i];
-		}
-	}
-	return len;
-}
-static GDNativeInt gdnative_string_to_utf32_chars(GDNativeConstStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length) {
-	String *self = (String *)p_self;
-	GDNativeInt len = self->length();
-	if (r_text) {
-		const char32_t *s_text = self->ptr();
-		for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) {
-			r_text[i] = s_text[i];
-		}
-	}
-	return len;
-}
-static GDNativeInt gdnative_string_to_wide_chars(GDNativeConstStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length) {
-	if constexpr (sizeof(wchar_t) == 4) {
-		return gdnative_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length);
-	} else {
-		return gdnative_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length);
-	}
-}
-
-static char32_t *gdnative_string_operator_index(GDNativeStringPtr p_self, GDNativeInt p_index) {
-	String *self = (String *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr);
-	return &self->ptrw()[p_index];
-}
-
-static const char32_t *gdnative_string_operator_index_const(GDNativeConstStringPtr p_self, GDNativeInt p_index) {
-	const String *self = (const String *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr);
-	return &self->ptr()[p_index];
-}
-
-/* Packed array functions */
-
-static uint8_t *gdnative_packed_byte_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedByteArray *self = (PackedByteArray *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptrw()[p_index];
-}
-
-static const uint8_t *gdnative_packed_byte_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedByteArray *self = (const PackedByteArray *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptr()[p_index];
-}
-
-static GDNativeTypePtr gdnative_packed_color_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedColorArray *self = (PackedColorArray *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeTypePtr)&self->ptrw()[p_index];
-}
-
-static GDNativeTypePtr gdnative_packed_color_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedColorArray *self = (const PackedColorArray *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeTypePtr)&self->ptr()[p_index];
-}
-
-static float *gdnative_packed_float32_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedFloat32Array *self = (PackedFloat32Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptrw()[p_index];
-}
-
-static const float *gdnative_packed_float32_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedFloat32Array *self = (const PackedFloat32Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptr()[p_index];
-}
-
-static double *gdnative_packed_float64_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedFloat64Array *self = (PackedFloat64Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptrw()[p_index];
-}
-
-static const double *gdnative_packed_float64_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedFloat64Array *self = (const PackedFloat64Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptr()[p_index];
-}
-
-static int32_t *gdnative_packed_int32_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedInt32Array *self = (PackedInt32Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptrw()[p_index];
-}
-
-static const int32_t *gdnative_packed_int32_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedInt32Array *self = (const PackedInt32Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptr()[p_index];
-}
-
-static int64_t *gdnative_packed_int64_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedInt64Array *self = (PackedInt64Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptrw()[p_index];
-}
-
-static const int64_t *gdnative_packed_int64_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedInt64Array *self = (const PackedInt64Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return &self->ptr()[p_index];
-}
-
-static GDNativeStringPtr gdnative_packed_string_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedStringArray *self = (PackedStringArray *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeStringPtr)&self->ptrw()[p_index];
-}
-
-static GDNativeStringPtr gdnative_packed_string_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedStringArray *self = (const PackedStringArray *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeStringPtr)&self->ptr()[p_index];
-}
-
-static GDNativeTypePtr gdnative_packed_vector2_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedVector2Array *self = (PackedVector2Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeTypePtr)&self->ptrw()[p_index];
-}
-
-static GDNativeTypePtr gdnative_packed_vector2_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedVector2Array *self = (const PackedVector2Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeTypePtr)&self->ptr()[p_index];
-}
-
-static GDNativeTypePtr gdnative_packed_vector3_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	PackedVector3Array *self = (PackedVector3Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeTypePtr)&self->ptrw()[p_index];
-}
-
-static GDNativeTypePtr gdnative_packed_vector3_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const PackedVector3Array *self = (const PackedVector3Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeTypePtr)&self->ptr()[p_index];
-}
-
-static GDNativeVariantPtr gdnative_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) {
-	Array *self = (Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeVariantPtr)&self->operator[](p_index);
-}
-
-static GDNativeVariantPtr gdnative_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) {
-	const Array *self = (const Array *)p_self;
-	ERR_FAIL_INDEX_V(p_index, self->size(), nullptr);
-	return (GDNativeVariantPtr)&self->operator[](p_index);
-}
-
-/* Dictionary functions */
-
-static GDNativeVariantPtr gdnative_dictionary_operator_index(GDNativeTypePtr p_self, GDNativeConstVariantPtr p_key) {
-	Dictionary *self = (Dictionary *)p_self;
-	return (GDNativeVariantPtr)&self->operator[](*(const Variant *)p_key);
-}
-
-static GDNativeVariantPtr gdnative_dictionary_operator_index_const(GDNativeConstTypePtr p_self, GDNativeConstVariantPtr p_key) {
-	const Dictionary *self = (const Dictionary *)p_self;
-	return (GDNativeVariantPtr)&self->operator[](*(const Variant *)p_key);
-}
-
-/* OBJECT API */
-
-static void gdnative_object_method_bind_call(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_arg_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error) {
-	const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);
-	Object *o = (Object *)p_instance;
-	const Variant **args = (const Variant **)p_args;
-	Callable::CallError error;
-
-	Variant ret = mb->call(o, args, p_arg_count, error);
-	memnew_placement(r_return, Variant(ret));
-
-	if (r_error) {
-		r_error->error = (GDNativeCallErrorType)(error.error);
-		r_error->argument = error.argument;
-		r_error->expected = error.expected;
-	}
-}
-
-static void gdnative_object_method_bind_ptrcall(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr p_ret) {
-	const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);
-	Object *o = (Object *)p_instance;
-	mb->ptrcall(o, (const void **)p_args, p_ret);
-}
-
-static void gdnative_object_destroy(GDNativeObjectPtr p_o) {
-	memdelete((Object *)p_o);
-}
-
-static GDNativeObjectPtr gdnative_global_get_singleton(GDNativeConstStringNamePtr p_name) {
-	const StringName name = *reinterpret_cast<const StringName *>(p_name);
-	return (GDNativeObjectPtr)Engine::get_singleton()->get_singleton_object(name);
-}
-
-static void *gdnative_object_get_instance_binding(GDNativeObjectPtr p_object, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks) {
-	Object *o = (Object *)p_object;
-	return o->get_instance_binding(p_token, p_callbacks);
-}
-
-static void gdnative_object_set_instance_binding(GDNativeObjectPtr p_object, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks) {
-	Object *o = (Object *)p_object;
-	o->set_instance_binding(p_token, p_binding, p_callbacks);
-}
-
-static void gdnative_object_set_instance(GDNativeObjectPtr p_object, GDNativeConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {
-	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
-	Object *o = (Object *)p_object;
-	ClassDB::set_object_extension_instance(o, classname, p_instance);
-}
-
-static GDNativeObjectPtr gdnative_object_get_instance_from_id(GDObjectInstanceID p_instance_id) {
-	return (GDNativeObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id));
-}
-
-static GDNativeObjectPtr gdnative_object_cast_to(GDNativeConstObjectPtr p_object, void *p_class_tag) {
-	if (!p_object) {
-		return nullptr;
-	}
-	Object *o = (Object *)p_object;
-
-	return o->is_class_ptr(p_class_tag) ? (GDNativeObjectPtr)o : (GDNativeObjectPtr) nullptr;
-}
-
-static GDObjectInstanceID gdnative_object_get_instance_id(GDNativeConstObjectPtr p_object) {
-	const Object *o = (const Object *)p_object;
-	return (GDObjectInstanceID)o->get_instance_id();
-}
-
-static GDNativeScriptInstancePtr gdnative_script_instance_create(const GDNativeExtensionScriptInstanceInfo *p_info, GDNativeExtensionScriptInstanceDataPtr p_instance_data) {
-	ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);
-	script_instance_extension->instance = p_instance_data;
-	script_instance_extension->native_info = p_info;
-	return reinterpret_cast<GDNativeScriptInstancePtr>(script_instance_extension);
-}
-
-static GDNativeMethodBindPtr gdnative_classdb_get_method_bind(GDNativeConstStringNamePtr p_classname, GDNativeConstStringNamePtr p_methodname, GDNativeInt p_hash) {
-	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
-	const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname);
-	MethodBind *mb = ClassDB::get_method(classname, methodname);
-	ERR_FAIL_COND_V(!mb, nullptr);
-	if (mb->get_hash() != p_hash) {
-		ERR_PRINT("Hash mismatch for method '" + classname + "." + methodname + "'.");
-		return nullptr;
-	}
-	return (GDNativeMethodBindPtr)mb;
-}
-
-static GDNativeObjectPtr gdnative_classdb_construct_object(GDNativeConstStringNamePtr p_classname) {
-	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
-	return (GDNativeObjectPtr)ClassDB::instantiate(classname);
-}
-
-static void *gdnative_classdb_get_class_tag(GDNativeConstStringNamePtr p_classname) {
-	const StringName classname = *reinterpret_cast<const StringName *>(p_classname);
-	ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(classname);
-	return class_info ? class_info->class_ptr : nullptr;
-}
-
-void gdnative_setup_interface(GDNativeInterface *p_interface) {
-	GDNativeInterface &gdni = *p_interface;
-
-	gdni.version_major = VERSION_MAJOR;
-	gdni.version_minor = VERSION_MINOR;
-#if VERSION_PATCH
-	gdni.version_patch = VERSION_PATCH;
-#else
-	gdni.version_patch = 0;
-#endif
-	gdni.version_string = VERSION_FULL_NAME;
-
-	/* GODOT CORE */
-
-	gdni.mem_alloc = gdnative_alloc;
-	gdni.mem_realloc = gdnative_realloc;
-	gdni.mem_free = gdnative_free;
-
-	gdni.print_error = gdnative_print_error;
-	gdni.print_warning = gdnative_print_warning;
-	gdni.print_script_error = gdnative_print_script_error;
-
-	gdni.get_native_struct_size = gdnative_get_native_struct_size;
-
-	/* GODOT VARIANT */
-
-	// variant general
-	gdni.variant_new_copy = gdnative_variant_new_copy;
-	gdni.variant_new_nil = gdnative_variant_new_nil;
-	gdni.variant_destroy = gdnative_variant_destroy;
-
-	gdni.variant_call = gdnative_variant_call;
-	gdni.variant_call_static = gdnative_variant_call_static;
-	gdni.variant_evaluate = gdnative_variant_evaluate;
-	gdni.variant_set = gdnative_variant_set;
-	gdni.variant_set_named = gdnative_variant_set_named;
-	gdni.variant_set_keyed = gdnative_variant_set_keyed;
-	gdni.variant_set_indexed = gdnative_variant_set_indexed;
-	gdni.variant_get = gdnative_variant_get;
-	gdni.variant_get_named = gdnative_variant_get_named;
-	gdni.variant_get_keyed = gdnative_variant_get_keyed;
-	gdni.variant_get_indexed = gdnative_variant_get_indexed;
-	gdni.variant_iter_init = gdnative_variant_iter_init;
-	gdni.variant_iter_next = gdnative_variant_iter_next;
-	gdni.variant_iter_get = gdnative_variant_iter_get;
-	gdni.variant_hash = gdnative_variant_hash;
-	gdni.variant_recursive_hash = gdnative_variant_recursive_hash;
-	gdni.variant_hash_compare = gdnative_variant_hash_compare;
-	gdni.variant_booleanize = gdnative_variant_booleanize;
-	gdni.variant_duplicate = gdnative_variant_duplicate;
-	gdni.variant_stringify = gdnative_variant_stringify;
-
-	gdni.variant_get_type = gdnative_variant_get_type;
-	gdni.variant_has_method = gdnative_variant_has_method;
-	gdni.variant_has_member = gdnative_variant_has_member;
-	gdni.variant_has_key = gdnative_variant_has_key;
-	gdni.variant_get_type_name = gdnative_variant_get_type_name;
-	gdni.variant_can_convert = gdnative_variant_can_convert;
-	gdni.variant_can_convert_strict = gdnative_variant_can_convert_strict;
-
-	gdni.get_variant_from_type_constructor = gdnative_get_variant_from_type_constructor;
-	gdni.get_variant_to_type_constructor = gdnative_get_type_from_variant_constructor;
-
-	// ptrcalls.
-
-	gdni.variant_get_ptr_operator_evaluator = gdnative_variant_get_ptr_operator_evaluator;
-	gdni.variant_get_ptr_builtin_method = gdnative_variant_get_ptr_builtin_method;
-	gdni.variant_get_ptr_constructor = gdnative_variant_get_ptr_constructor;
-	gdni.variant_get_ptr_destructor = gdnative_variant_get_ptr_destructor;
-	gdni.variant_construct = gdnative_variant_construct;
-	gdni.variant_get_ptr_setter = gdnative_variant_get_ptr_setter;
-	gdni.variant_get_ptr_getter = gdnative_variant_get_ptr_getter;
-	gdni.variant_get_ptr_indexed_setter = gdnative_variant_get_ptr_indexed_setter;
-	gdni.variant_get_ptr_indexed_getter = gdnative_variant_get_ptr_indexed_getter;
-	gdni.variant_get_ptr_keyed_setter = gdnative_variant_get_ptr_keyed_setter;
-	gdni.variant_get_ptr_keyed_getter = gdnative_variant_get_ptr_keyed_getter;
-	gdni.variant_get_ptr_keyed_checker = gdnative_variant_get_ptr_keyed_checker;
-	gdni.variant_get_constant_value = gdnative_variant_get_constant_value;
-	gdni.variant_get_ptr_utility_function = gdnative_variant_get_ptr_utility_function;
-
-	// extra utilities
-
-	gdni.string_new_with_latin1_chars = gdnative_string_new_with_latin1_chars;
-	gdni.string_new_with_utf8_chars = gdnative_string_new_with_utf8_chars;
-	gdni.string_new_with_utf16_chars = gdnative_string_new_with_utf16_chars;
-	gdni.string_new_with_utf32_chars = gdnative_string_new_with_utf32_chars;
-	gdni.string_new_with_wide_chars = gdnative_string_new_with_wide_chars;
-	gdni.string_new_with_latin1_chars_and_len = gdnative_string_new_with_latin1_chars_and_len;
-	gdni.string_new_with_utf8_chars_and_len = gdnative_string_new_with_utf8_chars_and_len;
-	gdni.string_new_with_utf16_chars_and_len = gdnative_string_new_with_utf16_chars_and_len;
-	gdni.string_new_with_utf32_chars_and_len = gdnative_string_new_with_utf32_chars_and_len;
-	gdni.string_new_with_wide_chars_and_len = gdnative_string_new_with_wide_chars_and_len;
-	gdni.string_to_latin1_chars = gdnative_string_to_latin1_chars;
-	gdni.string_to_utf8_chars = gdnative_string_to_utf8_chars;
-	gdni.string_to_utf16_chars = gdnative_string_to_utf16_chars;
-	gdni.string_to_utf32_chars = gdnative_string_to_utf32_chars;
-	gdni.string_to_wide_chars = gdnative_string_to_wide_chars;
-	gdni.string_operator_index = gdnative_string_operator_index;
-	gdni.string_operator_index_const = gdnative_string_operator_index_const;
-
-	/* Packed array functions */
-
-	gdni.packed_byte_array_operator_index = gdnative_packed_byte_array_operator_index;
-	gdni.packed_byte_array_operator_index_const = gdnative_packed_byte_array_operator_index_const;
-
-	gdni.packed_color_array_operator_index = gdnative_packed_color_array_operator_index;
-	gdni.packed_color_array_operator_index_const = gdnative_packed_color_array_operator_index_const;
-
-	gdni.packed_float32_array_operator_index = gdnative_packed_float32_array_operator_index;
-	gdni.packed_float32_array_operator_index_const = gdnative_packed_float32_array_operator_index_const;
-	gdni.packed_float64_array_operator_index = gdnative_packed_float64_array_operator_index;
-	gdni.packed_float64_array_operator_index_const = gdnative_packed_float64_array_operator_index_const;
-
-	gdni.packed_int32_array_operator_index = gdnative_packed_int32_array_operator_index;
-	gdni.packed_int32_array_operator_index_const = gdnative_packed_int32_array_operator_index_const;
-	gdni.packed_int64_array_operator_index = gdnative_packed_int64_array_operator_index;
-	gdni.packed_int64_array_operator_index_const = gdnative_packed_int64_array_operator_index_const;
-
-	gdni.packed_string_array_operator_index = gdnative_packed_string_array_operator_index;
-	gdni.packed_string_array_operator_index_const = gdnative_packed_string_array_operator_index_const;
-
-	gdni.packed_vector2_array_operator_index = gdnative_packed_vector2_array_operator_index;
-	gdni.packed_vector2_array_operator_index_const = gdnative_packed_vector2_array_operator_index_const;
-	gdni.packed_vector3_array_operator_index = gdnative_packed_vector3_array_operator_index;
-	gdni.packed_vector3_array_operator_index_const = gdnative_packed_vector3_array_operator_index_const;
-
-	gdni.array_operator_index = gdnative_array_operator_index;
-	gdni.array_operator_index_const = gdnative_array_operator_index_const;
-
-	/* Dictionary functions */
-
-	gdni.dictionary_operator_index = gdnative_dictionary_operator_index;
-	gdni.dictionary_operator_index_const = gdnative_dictionary_operator_index_const;
-
-	/* OBJECT */
-
-	gdni.object_method_bind_call = gdnative_object_method_bind_call;
-	gdni.object_method_bind_ptrcall = gdnative_object_method_bind_ptrcall;
-	gdni.object_destroy = gdnative_object_destroy;
-	gdni.global_get_singleton = gdnative_global_get_singleton;
-	gdni.object_get_instance_binding = gdnative_object_get_instance_binding;
-	gdni.object_set_instance_binding = gdnative_object_set_instance_binding;
-	gdni.object_set_instance = gdnative_object_set_instance;
-
-	gdni.object_cast_to = gdnative_object_cast_to;
-	gdni.object_get_instance_from_id = gdnative_object_get_instance_from_id;
-	gdni.object_get_instance_id = gdnative_object_get_instance_id;
-
-	/* SCRIPT INSTANCE */
-
-	gdni.script_instance_create = gdnative_script_instance_create;
-
-	/* CLASSDB */
-
-	gdni.classdb_construct_object = gdnative_classdb_construct_object;
-	gdni.classdb_get_method_bind = gdnative_classdb_get_method_bind;
-	gdni.classdb_get_class_tag = gdnative_classdb_get_class_tag;
-
-	/* CLASSDB EXTENSION */
-
-	//these are filled by implementation, since it will want to keep track of registered classes
-	gdni.classdb_register_extension_class = nullptr;
-	gdni.classdb_register_extension_class_method = nullptr;
-	gdni.classdb_register_extension_class_integer_constant = nullptr;
-	gdni.classdb_register_extension_class_property = nullptr;
-	gdni.classdb_register_extension_class_property_group = nullptr;
-	gdni.classdb_register_extension_class_property_subgroup = nullptr;
-	gdni.classdb_register_extension_class_signal = nullptr;
-	gdni.classdb_unregister_extension_class = nullptr;
-
-	gdni.get_library_path = nullptr;
-}

+ 0 - 612
core/extension/gdnative_interface.h

@@ -1,612 +0,0 @@
-/*************************************************************************/
-/*  gdnative_interface.h                                                 */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef GDNATIVE_INTERFACE_H
-#define GDNATIVE_INTERFACE_H
-
-/* This is a C class header, you can copy it and use it directly in your own binders.
- * Together with the JSON file, you should be able to generate any binder.
- */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#ifndef __cplusplus
-typedef uint32_t char32_t;
-typedef uint16_t char16_t;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* VARIANT TYPES */
-
-typedef enum {
-	GDNATIVE_VARIANT_TYPE_NIL,
-
-	/*  atomic types */
-	GDNATIVE_VARIANT_TYPE_BOOL,
-	GDNATIVE_VARIANT_TYPE_INT,
-	GDNATIVE_VARIANT_TYPE_FLOAT,
-	GDNATIVE_VARIANT_TYPE_STRING,
-
-	/* math types */
-	GDNATIVE_VARIANT_TYPE_VECTOR2,
-	GDNATIVE_VARIANT_TYPE_VECTOR2I,
-	GDNATIVE_VARIANT_TYPE_RECT2,
-	GDNATIVE_VARIANT_TYPE_RECT2I,
-	GDNATIVE_VARIANT_TYPE_VECTOR3,
-	GDNATIVE_VARIANT_TYPE_VECTOR3I,
-	GDNATIVE_VARIANT_TYPE_TRANSFORM2D,
-	GDNATIVE_VARIANT_TYPE_VECTOR4,
-	GDNATIVE_VARIANT_TYPE_VECTOR4I,
-	GDNATIVE_VARIANT_TYPE_PLANE,
-	GDNATIVE_VARIANT_TYPE_QUATERNION,
-	GDNATIVE_VARIANT_TYPE_AABB,
-	GDNATIVE_VARIANT_TYPE_BASIS,
-	GDNATIVE_VARIANT_TYPE_TRANSFORM3D,
-	GDNATIVE_VARIANT_TYPE_PROJECTION,
-
-	/* misc types */
-	GDNATIVE_VARIANT_TYPE_COLOR,
-	GDNATIVE_VARIANT_TYPE_STRING_NAME,
-	GDNATIVE_VARIANT_TYPE_NODE_PATH,
-	GDNATIVE_VARIANT_TYPE_RID,
-	GDNATIVE_VARIANT_TYPE_OBJECT,
-	GDNATIVE_VARIANT_TYPE_CALLABLE,
-	GDNATIVE_VARIANT_TYPE_SIGNAL,
-	GDNATIVE_VARIANT_TYPE_DICTIONARY,
-	GDNATIVE_VARIANT_TYPE_ARRAY,
-
-	/* typed arrays */
-	GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY,
-	GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY,
-
-	GDNATIVE_VARIANT_TYPE_VARIANT_MAX
-} GDNativeVariantType;
-
-typedef enum {
-	/* comparison */
-	GDNATIVE_VARIANT_OP_EQUAL,
-	GDNATIVE_VARIANT_OP_NOT_EQUAL,
-	GDNATIVE_VARIANT_OP_LESS,
-	GDNATIVE_VARIANT_OP_LESS_EQUAL,
-	GDNATIVE_VARIANT_OP_GREATER,
-	GDNATIVE_VARIANT_OP_GREATER_EQUAL,
-
-	/* mathematic */
-	GDNATIVE_VARIANT_OP_ADD,
-	GDNATIVE_VARIANT_OP_SUBTRACT,
-	GDNATIVE_VARIANT_OP_MULTIPLY,
-	GDNATIVE_VARIANT_OP_DIVIDE,
-	GDNATIVE_VARIANT_OP_NEGATE,
-	GDNATIVE_VARIANT_OP_POSITIVE,
-	GDNATIVE_VARIANT_OP_MODULE,
-	GDNATIVE_VARIANT_OP_POWER,
-
-	/* bitwise */
-	GDNATIVE_VARIANT_OP_SHIFT_LEFT,
-	GDNATIVE_VARIANT_OP_SHIFT_RIGHT,
-	GDNATIVE_VARIANT_OP_BIT_AND,
-	GDNATIVE_VARIANT_OP_BIT_OR,
-	GDNATIVE_VARIANT_OP_BIT_XOR,
-	GDNATIVE_VARIANT_OP_BIT_NEGATE,
-
-	/* logic */
-	GDNATIVE_VARIANT_OP_AND,
-	GDNATIVE_VARIANT_OP_OR,
-	GDNATIVE_VARIANT_OP_XOR,
-	GDNATIVE_VARIANT_OP_NOT,
-
-	/* containment */
-	GDNATIVE_VARIANT_OP_IN,
-	GDNATIVE_VARIANT_OP_MAX
-
-} GDNativeVariantOperator;
-
-typedef void *GDNativeVariantPtr;
-typedef const void *GDNativeConstVariantPtr;
-typedef void *GDNativeStringNamePtr;
-typedef const void *GDNativeConstStringNamePtr;
-typedef void *GDNativeStringPtr;
-typedef const void *GDNativeConstStringPtr;
-typedef void *GDNativeObjectPtr;
-typedef const void *GDNativeConstObjectPtr;
-typedef void *GDNativeTypePtr;
-typedef const void *GDNativeConstTypePtr;
-typedef const void *GDNativeMethodBindPtr;
-typedef int64_t GDNativeInt;
-typedef uint8_t GDNativeBool;
-typedef uint64_t GDObjectInstanceID;
-
-/* VARIANT DATA I/O */
-
-typedef enum {
-	GDNATIVE_CALL_OK,
-	GDNATIVE_CALL_ERROR_INVALID_METHOD,
-	GDNATIVE_CALL_ERROR_INVALID_ARGUMENT, // Expected a different variant type.
-	GDNATIVE_CALL_ERROR_TOO_MANY_ARGUMENTS, // Expected lower number of arguments.
-	GDNATIVE_CALL_ERROR_TOO_FEW_ARGUMENTS, // Expected higher number of arguments.
-	GDNATIVE_CALL_ERROR_INSTANCE_IS_NULL,
-	GDNATIVE_CALL_ERROR_METHOD_NOT_CONST, // Used for const call.
-} GDNativeCallErrorType;
-
-typedef struct {
-	GDNativeCallErrorType error;
-	int32_t argument;
-	int32_t expected;
-} GDNativeCallError;
-
-typedef void (*GDNativeVariantFromTypeConstructorFunc)(GDNativeVariantPtr, GDNativeTypePtr);
-typedef void (*GDNativeTypeFromVariantConstructorFunc)(GDNativeTypePtr, GDNativeVariantPtr);
-typedef void (*GDNativePtrOperatorEvaluator)(GDNativeConstTypePtr p_left, GDNativeConstTypePtr p_right, GDNativeTypePtr r_result);
-typedef void (*GDNativePtrBuiltInMethod)(GDNativeTypePtr p_base, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_return, int p_argument_count);
-typedef void (*GDNativePtrConstructor)(GDNativeTypePtr p_base, GDNativeConstTypePtr *p_args);
-typedef void (*GDNativePtrDestructor)(GDNativeTypePtr p_base);
-typedef void (*GDNativePtrSetter)(GDNativeTypePtr p_base, GDNativeConstTypePtr p_value);
-typedef void (*GDNativePtrGetter)(GDNativeConstTypePtr p_base, GDNativeTypePtr r_value);
-typedef void (*GDNativePtrIndexedSetter)(GDNativeTypePtr p_base, GDNativeInt p_index, GDNativeConstTypePtr p_value);
-typedef void (*GDNativePtrIndexedGetter)(GDNativeConstTypePtr p_base, GDNativeInt p_index, GDNativeTypePtr r_value);
-typedef void (*GDNativePtrKeyedSetter)(GDNativeTypePtr p_base, GDNativeConstTypePtr p_key, GDNativeConstTypePtr p_value);
-typedef void (*GDNativePtrKeyedGetter)(GDNativeConstTypePtr p_base, GDNativeConstTypePtr p_key, GDNativeTypePtr r_value);
-typedef uint32_t (*GDNativePtrKeyedChecker)(GDNativeConstVariantPtr p_base, GDNativeConstVariantPtr p_key);
-typedef void (*GDNativePtrUtilityFunction)(GDNativeTypePtr r_return, GDNativeConstTypePtr *p_arguments, int p_argument_count);
-
-typedef GDNativeObjectPtr (*GDNativeClassConstructor)();
-
-typedef void *(*GDNativeInstanceBindingCreateCallback)(void *p_token, void *p_instance);
-typedef void (*GDNativeInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding);
-typedef GDNativeBool (*GDNativeInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDNativeBool p_reference);
-
-typedef struct {
-	GDNativeInstanceBindingCreateCallback create_callback;
-	GDNativeInstanceBindingFreeCallback free_callback;
-	GDNativeInstanceBindingReferenceCallback reference_callback;
-} GDNativeInstanceBindingCallbacks;
-
-/* EXTENSION CLASSES */
-
-typedef void *GDExtensionClassInstancePtr;
-
-typedef GDNativeBool (*GDNativeExtensionClassSet)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value);
-typedef GDNativeBool (*GDNativeExtensionClassGet)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
-typedef uint64_t (*GDNativeExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance);
-
-typedef struct {
-	GDNativeVariantType type;
-	GDNativeStringNamePtr name;
-	GDNativeStringNamePtr class_name;
-	uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`).
-	GDNativeStringPtr hint_string;
-	uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`).
-} GDNativePropertyInfo;
-
-typedef struct {
-	GDNativeStringNamePtr name;
-	GDNativePropertyInfo return_value;
-	uint32_t flags; // Bitfield of `GDNativeExtensionClassMethodFlags`.
-	int32_t id;
-
-	/* Arguments: `default_arguments` is an array of size `argument_count`. */
-	uint32_t argument_count;
-	GDNativePropertyInfo *arguments;
-
-	/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
-	uint32_t default_argument_count;
-	GDNativeVariantPtr *default_arguments;
-} GDNativeMethodInfo;
-
-typedef const GDNativePropertyInfo *(*GDNativeExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count);
-typedef void (*GDNativeExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list);
-typedef GDNativeBool (*GDNativeExtensionClassPropertyCanRevert)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name);
-typedef GDNativeBool (*GDNativeExtensionClassPropertyGetRevert)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
-typedef void (*GDNativeExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what);
-typedef void (*GDNativeExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr p_out);
-typedef void (*GDNativeExtensionClassReference)(GDExtensionClassInstancePtr p_instance);
-typedef void (*GDNativeExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance);
-typedef void (*GDNativeExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret);
-typedef GDNativeObjectPtr (*GDNativeExtensionClassCreateInstance)(void *p_userdata);
-typedef void (*GDNativeExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance);
-typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, GDNativeConstStringNamePtr p_name);
-
-typedef struct {
-	GDNativeBool is_virtual;
-	GDNativeBool is_abstract;
-	GDNativeExtensionClassSet set_func;
-	GDNativeExtensionClassGet get_func;
-	GDNativeExtensionClassGetPropertyList get_property_list_func;
-	GDNativeExtensionClassFreePropertyList free_property_list_func;
-	GDNativeExtensionClassPropertyCanRevert property_can_revert_func;
-	GDNativeExtensionClassPropertyGetRevert property_get_revert_func;
-	GDNativeExtensionClassNotification notification_func;
-	GDNativeExtensionClassToString to_string_func;
-	GDNativeExtensionClassReference reference_func;
-	GDNativeExtensionClassUnreference unreference_func;
-	GDNativeExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract.
-	GDNativeExtensionClassFreeInstance free_instance_func; // Destructor; mandatory.
-	GDNativeExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function.
-	GDNativeExtensionClassGetRID get_rid_func;
-	void *class_userdata; // Per-class user data, later accessible in instance bindings.
-} GDNativeExtensionClassCreationInfo;
-
-typedef void *GDNativeExtensionClassLibraryPtr;
-
-/* Method */
-
-typedef enum {
-	GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL = 1,
-	GDNATIVE_EXTENSION_METHOD_FLAG_EDITOR = 2,
-	GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 4,
-	GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 8,
-	GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 16,
-	GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 32,
-	GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT = GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL,
-} GDNativeExtensionClassMethodFlags;
-
-typedef enum {
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT,
-	GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE
-} GDNativeExtensionClassMethodArgumentMetadata;
-
-typedef void (*GDNativeExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
-typedef void (*GDNativeExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret);
-
-typedef struct {
-	GDNativeStringNamePtr name;
-	void *method_userdata;
-	GDNativeExtensionClassMethodCall call_func;
-	GDNativeExtensionClassMethodPtrCall ptrcall_func;
-	uint32_t method_flags; // Bitfield of `GDNativeExtensionClassMethodFlags`.
-
-	/* If `has_return_value` is false, `return_value_info` and `return_value_metadata` are ignored. */
-	GDNativeBool has_return_value;
-	GDNativePropertyInfo *return_value_info;
-	GDNativeExtensionClassMethodArgumentMetadata return_value_metadata;
-
-	/* Arguments: `arguments_info` and `arguments_metadata` are array of size `argument_count`.
-	 * Name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies.
-	 */
-	uint32_t argument_count;
-	GDNativePropertyInfo *arguments_info;
-	GDNativeExtensionClassMethodArgumentMetadata *arguments_metadata;
-
-	/* Default arguments: `default_arguments` is an array of size `default_argument_count`. */
-	uint32_t default_argument_count;
-	GDNativeVariantPtr *default_arguments;
-} GDNativeExtensionClassMethodInfo;
-
-/* SCRIPT INSTANCE EXTENSION */
-
-typedef void *GDNativeExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation.
-
-typedef GDNativeBool (*GDNativeExtensionScriptInstanceSet)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value);
-typedef GDNativeBool (*GDNativeExtensionScriptInstanceGet)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
-typedef const GDNativePropertyInfo *(*GDNativeExtensionScriptInstanceGetPropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
-typedef void (*GDNativeExtensionScriptInstanceFreePropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativePropertyInfo *p_list);
-typedef GDNativeVariantType (*GDNativeExtensionScriptInstanceGetPropertyType)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeBool *r_is_valid);
-
-typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyCanRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name);
-typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyGetRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret);
-
-typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetOwner)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-typedef void (*GDNativeExtensionScriptInstancePropertyStateAdd)(GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value, void *p_userdata);
-typedef void (*GDNativeExtensionScriptInstanceGetPropertyState)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata);
-
-typedef const GDNativeMethodInfo *(*GDNativeExtensionScriptInstanceGetMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count);
-typedef void (*GDNativeExtensionScriptInstanceFreeMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeMethodInfo *p_list);
-
-typedef GDNativeBool (*GDNativeExtensionScriptInstanceHasMethod)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name);
-
-typedef void (*GDNativeExtensionScriptInstanceCall)(GDNativeExtensionScriptInstanceDataPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
-typedef void (*GDNativeExtensionScriptInstanceNotification)(GDNativeExtensionScriptInstanceDataPtr p_instance, int32_t p_what);
-typedef void (*GDNativeExtensionScriptInstanceToString)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out);
-
-typedef void (*GDNativeExtensionScriptInstanceRefCountIncremented)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-typedef GDNativeBool (*GDNativeExtensionScriptInstanceRefCountDecremented)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-
-typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetScript)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-typedef GDNativeBool (*GDNativeExtensionScriptInstanceIsPlaceholder)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-
-typedef void *GDNativeExtensionScriptLanguagePtr;
-
-typedef GDNativeExtensionScriptLanguagePtr (*GDNativeExtensionScriptInstanceGetLanguage)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-
-typedef void (*GDNativeExtensionScriptInstanceFree)(GDNativeExtensionScriptInstanceDataPtr p_instance);
-
-typedef void *GDNativeScriptInstancePtr; // Pointer to ScriptInstance.
-
-typedef struct {
-	GDNativeExtensionScriptInstanceSet set_func;
-	GDNativeExtensionScriptInstanceGet get_func;
-	GDNativeExtensionScriptInstanceGetPropertyList get_property_list_func;
-	GDNativeExtensionScriptInstanceFreePropertyList free_property_list_func;
-
-	GDNativeExtensionScriptInstancePropertyCanRevert property_can_revert_func;
-	GDNativeExtensionScriptInstancePropertyGetRevert property_get_revert_func;
-
-	GDNativeExtensionScriptInstanceGetOwner get_owner_func;
-	GDNativeExtensionScriptInstanceGetPropertyState get_property_state_func;
-
-	GDNativeExtensionScriptInstanceGetMethodList get_method_list_func;
-	GDNativeExtensionScriptInstanceFreeMethodList free_method_list_func;
-	GDNativeExtensionScriptInstanceGetPropertyType get_property_type_func;
-
-	GDNativeExtensionScriptInstanceHasMethod has_method_func;
-
-	GDNativeExtensionScriptInstanceCall call_func;
-	GDNativeExtensionScriptInstanceNotification notification_func;
-
-	GDNativeExtensionScriptInstanceToString to_string_func;
-
-	GDNativeExtensionScriptInstanceRefCountIncremented refcount_incremented_func;
-	GDNativeExtensionScriptInstanceRefCountDecremented refcount_decremented_func;
-
-	GDNativeExtensionScriptInstanceGetScript get_script_func;
-
-	GDNativeExtensionScriptInstanceIsPlaceholder is_placeholder_func;
-
-	GDNativeExtensionScriptInstanceSet set_fallback_func;
-	GDNativeExtensionScriptInstanceGet get_fallback_func;
-
-	GDNativeExtensionScriptInstanceGetLanguage get_language_func;
-
-	GDNativeExtensionScriptInstanceFree free_func;
-
-} GDNativeExtensionScriptInstanceInfo;
-
-/* INTERFACE */
-
-typedef struct {
-	uint32_t version_major;
-	uint32_t version_minor;
-	uint32_t version_patch;
-	const char *version_string;
-
-	/* GODOT CORE */
-
-	void *(*mem_alloc)(size_t p_bytes);
-	void *(*mem_realloc)(void *p_ptr, size_t p_bytes);
-	void (*mem_free)(void *p_ptr);
-
-	void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
-	void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
-	void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line);
-
-	uint64_t (*get_native_struct_size)(GDNativeConstStringNamePtr p_name);
-
-	/* GODOT VARIANT */
-
-	/* variant general */
-	void (*variant_new_copy)(GDNativeVariantPtr r_dest, GDNativeConstVariantPtr p_src);
-	void (*variant_new_nil)(GDNativeVariantPtr r_dest);
-	void (*variant_destroy)(GDNativeVariantPtr p_self);
-
-	/* variant type */
-	void (*variant_call)(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
-	void (*variant_call_static)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error);
-	void (*variant_evaluate)(GDNativeVariantOperator p_op, GDNativeConstVariantPtr p_a, GDNativeConstVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid);
-	void (*variant_set)(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid);
-	void (*variant_set_named)(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid);
-	void (*variant_set_keyed)(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid);
-	void (*variant_set_indexed)(GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob);
-	void (*variant_get)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
-	void (*variant_get_named)(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
-	void (*variant_get_keyed)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
-	void (*variant_get_indexed)(GDNativeConstVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob);
-	GDNativeBool (*variant_iter_init)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
-	GDNativeBool (*variant_iter_next)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid);
-	void (*variant_iter_get)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid);
-	GDNativeInt (*variant_hash)(GDNativeConstVariantPtr p_self);
-	GDNativeInt (*variant_recursive_hash)(GDNativeConstVariantPtr p_self, GDNativeInt p_recursion_count);
-	GDNativeBool (*variant_hash_compare)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_other);
-	GDNativeBool (*variant_booleanize)(GDNativeConstVariantPtr p_self);
-	void (*variant_duplicate)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep);
-	void (*variant_stringify)(GDNativeConstVariantPtr p_self, GDNativeStringPtr r_ret);
-
-	GDNativeVariantType (*variant_get_type)(GDNativeConstVariantPtr p_self);
-	GDNativeBool (*variant_has_method)(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_method);
-	GDNativeBool (*variant_has_member)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member);
-	GDNativeBool (*variant_has_key)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeBool *r_valid);
-	void (*variant_get_type_name)(GDNativeVariantType p_type, GDNativeStringPtr r_name);
-	GDNativeBool (*variant_can_convert)(GDNativeVariantType p_from, GDNativeVariantType p_to);
-	GDNativeBool (*variant_can_convert_strict)(GDNativeVariantType p_from, GDNativeVariantType p_to);
-
-	/* ptrcalls */
-	GDNativeVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDNativeVariantType p_type);
-	GDNativeTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDNativeVariantType p_type);
-	GDNativePtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b);
-	GDNativePtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeInt p_hash);
-	GDNativePtrConstructor (*variant_get_ptr_constructor)(GDNativeVariantType p_type, int32_t p_constructor);
-	GDNativePtrDestructor (*variant_get_ptr_destructor)(GDNativeVariantType p_type);
-	void (*variant_construct)(GDNativeVariantType p_type, GDNativeVariantPtr p_base, GDNativeConstVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error);
-	GDNativePtrSetter (*variant_get_ptr_setter)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member);
-	GDNativePtrGetter (*variant_get_ptr_getter)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member);
-	GDNativePtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDNativeVariantType p_type);
-	GDNativePtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDNativeVariantType p_type);
-	GDNativePtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDNativeVariantType p_type);
-	GDNativePtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDNativeVariantType p_type);
-	GDNativePtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDNativeVariantType p_type);
-	void (*variant_get_constant_value)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_constant, GDNativeVariantPtr r_ret);
-	GDNativePtrUtilityFunction (*variant_get_ptr_utility_function)(GDNativeConstStringNamePtr p_function, GDNativeInt p_hash);
-
-	/*  extra utilities */
-	void (*string_new_with_latin1_chars)(GDNativeStringPtr r_dest, const char *p_contents);
-	void (*string_new_with_utf8_chars)(GDNativeStringPtr r_dest, const char *p_contents);
-	void (*string_new_with_utf16_chars)(GDNativeStringPtr r_dest, const char16_t *p_contents);
-	void (*string_new_with_utf32_chars)(GDNativeStringPtr r_dest, const char32_t *p_contents);
-	void (*string_new_with_wide_chars)(GDNativeStringPtr r_dest, const wchar_t *p_contents);
-	void (*string_new_with_latin1_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size);
-	void (*string_new_with_utf8_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size);
-	void (*string_new_with_utf16_chars_and_len)(GDNativeStringPtr r_dest, const char16_t *p_contents, GDNativeInt p_size);
-	void (*string_new_with_utf32_chars_and_len)(GDNativeStringPtr r_dest, const char32_t *p_contents, GDNativeInt p_size);
-	void (*string_new_with_wide_chars_and_len)(GDNativeStringPtr r_dest, const wchar_t *p_contents, GDNativeInt p_size);
-	/* Information about the following functions:
-	 * - The return value is the resulting encoded string length.
-	 * - The length returned is in characters, not in bytes. It also does not include a trailing zero.
-	 * - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it).
-	 * - Passing NULL in r_text means only the length is computed (again, without including trailing zero).
-	 * - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL.
-	 * - p_max_write_length argument does not affect the return value, it's only to cap write length.
-	 */
-	GDNativeInt (*string_to_latin1_chars)(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
-	GDNativeInt (*string_to_utf8_chars)(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length);
-	GDNativeInt (*string_to_utf16_chars)(GDNativeConstStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length);
-	GDNativeInt (*string_to_utf32_chars)(GDNativeConstStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length);
-	GDNativeInt (*string_to_wide_chars)(GDNativeConstStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length);
-	char32_t *(*string_operator_index)(GDNativeStringPtr p_self, GDNativeInt p_index);
-	const char32_t *(*string_operator_index_const)(GDNativeConstStringPtr p_self, GDNativeInt p_index);
-
-	/* Packed array functions */
-
-	uint8_t *(*packed_byte_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
-	const uint8_t *(*packed_byte_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray
-
-	GDNativeTypePtr (*packed_color_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
-	GDNativeTypePtr (*packed_color_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr
-
-	float *(*packed_float32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
-	const float *(*packed_float32_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array
-	double *(*packed_float64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
-	const double *(*packed_float64_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array
-
-	int32_t *(*packed_int32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
-	const int32_t *(*packed_int32_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
-	int64_t *(*packed_int64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
-	const int64_t *(*packed_int64_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array
-
-	GDNativeStringPtr (*packed_string_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
-	GDNativeStringPtr (*packed_string_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray
-
-	GDNativeTypePtr (*packed_vector2_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
-	GDNativeTypePtr (*packed_vector2_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr
-	GDNativeTypePtr (*packed_vector3_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
-	GDNativeTypePtr (*packed_vector3_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr
-
-	GDNativeVariantPtr (*array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr
-	GDNativeVariantPtr (*array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr
-
-	/* Dictionary functions */
-
-	GDNativeVariantPtr (*dictionary_operator_index)(GDNativeTypePtr p_self, GDNativeConstVariantPtr p_key); // p_self should be an Dictionary ptr
-	GDNativeVariantPtr (*dictionary_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeConstVariantPtr p_key); // p_self should be an Dictionary ptr
-
-	/* OBJECT */
-
-	void (*object_method_bind_call)(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_arg_count, GDNativeVariantPtr r_ret, GDNativeCallError *r_error);
-	void (*object_method_bind_ptrcall)(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret);
-	void (*object_destroy)(GDNativeObjectPtr p_o);
-	GDNativeObjectPtr (*global_get_singleton)(GDNativeConstStringNamePtr p_name);
-
-	void *(*object_get_instance_binding)(GDNativeObjectPtr p_o, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks);
-	void (*object_set_instance_binding)(GDNativeObjectPtr p_o, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks);
-
-	void (*object_set_instance)(GDNativeObjectPtr p_o, GDNativeConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */
-
-	GDNativeObjectPtr (*object_cast_to)(GDNativeConstObjectPtr p_object, void *p_class_tag);
-	GDNativeObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id);
-	GDObjectInstanceID (*object_get_instance_id)(GDNativeConstObjectPtr p_object);
-
-	/* SCRIPT INSTANCE */
-
-	GDNativeScriptInstancePtr (*script_instance_create)(const GDNativeExtensionScriptInstanceInfo *p_info, GDNativeExtensionScriptInstanceDataPtr p_instance_data);
-
-	/* CLASSDB */
-
-	GDNativeObjectPtr (*classdb_construct_object)(GDNativeConstStringNamePtr p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */
-	GDNativeMethodBindPtr (*classdb_get_method_bind)(GDNativeConstStringNamePtr p_classname, GDNativeConstStringNamePtr p_methodname, GDNativeInt p_hash);
-	void *(*classdb_get_class_tag)(GDNativeConstStringNamePtr p_classname);
-
-	/* CLASSDB EXTENSION */
-
-	/* Provided parameters for `classdb_register_extension_*` can be safely freed once the function returns. */
-	void (*classdb_register_extension_class)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs);
-	void (*classdb_register_extension_class_method)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info);
-	void (*classdb_register_extension_class_integer_constant)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield);
-	void (*classdb_register_extension_class_property)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter);
-	void (*classdb_register_extension_class_property_group)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_group_name, GDNativeConstStringPtr p_prefix);
-	void (*classdb_register_extension_class_property_subgroup)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_subgroup_name, GDNativeConstStringPtr p_prefix);
-	void (*classdb_register_extension_class_signal)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count);
-	void (*classdb_unregister_extension_class)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */
-
-	void (*get_library_path)(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path);
-
-} GDNativeInterface;
-
-/* INITIALIZATION */
-
-typedef enum {
-	GDNATIVE_INITIALIZATION_CORE,
-	GDNATIVE_INITIALIZATION_SERVERS,
-	GDNATIVE_INITIALIZATION_SCENE,
-	GDNATIVE_INITIALIZATION_EDITOR,
-	GDNATIVE_MAX_INITIALIZATION_LEVEL,
-} GDNativeInitializationLevel;
-
-typedef struct {
-	/* Minimum initialization level required.
-	 * If Core or Servers, the extension needs editor or game restart to take effect */
-	GDNativeInitializationLevel minimum_initialization_level;
-	/* Up to the user to supply when initializing */
-	void *userdata;
-	/* This function will be called multiple times for each initialization level. */
-	void (*initialize)(void *userdata, GDNativeInitializationLevel p_level);
-	void (*deinitialize)(void *userdata, GDNativeInitializationLevel p_level);
-} GDNativeInitialization;
-
-/* Define a C function prototype that implements the function below and expose it to dlopen() (or similar).
- * This is the entry point of the GDExtension library and will be called on initialization.
- * It can be used to set up different init levels, which are called during various stages of initialization/shutdown.
- * The function name must be a unique one specified in the .gdextension config file.
- */
-typedef GDNativeBool (*GDNativeInitializationFunction)(const GDNativeInterface *p_interface, GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // GDNATIVE_INTERFACE_H

+ 7 - 7
core/extension/make_interface_dumper.py

@@ -6,17 +6,17 @@ def run(target, source, env):
 
     g.write(
         """/* THIS FILE IS GENERATED DO NOT EDIT */
-#ifndef GDNATIVE_INTERFACE_DUMP_H
-#define GDNATIVE_INTERFACE_DUMP_H
+#ifndef GDEXTENSION_INTERFACE_DUMP_H
+#define GDEXTENSION_INTERFACE_DUMP_H
 
 #ifdef TOOLS_ENABLED
 
 #include "core/io/file_access.h"
 #include "core/string/ustring.h"
 
-class GDNativeInterfaceDump {
+class GDExtensionInterfaceDump {
 	private:
-        static constexpr char const *gdnative_interface_dump ="""
+        static constexpr char const *gdextension_interface_dump ="""
     )
     for line in f:
         g.write('"' + line.rstrip().replace('"', '\\"') + '\\n"\n')
@@ -25,16 +25,16 @@ class GDNativeInterfaceDump {
     g.write(
         """
     public:
-        static void generate_gdnative_interface_file(const String &p_path) {
+        static void generate_gdextension_interface_file(const String &p_path) {
             Ref<FileAccess> fa = FileAccess::open(p_path, FileAccess::WRITE);
-            CharString cs(gdnative_interface_dump);
+            CharString cs(gdextension_interface_dump);
             fa->store_buffer((const uint8_t *)cs.ptr(), cs.length());
         };
 };
 
 #endif // TOOLS_ENABLED
 
-#endif // GDNATIVE_INTERFACE_DUMP_H
+#endif // GDEXTENSION_INTERFACE_DUMP_H
 """
     )
     g.close()

+ 2 - 2
core/io/packet_peer.h

@@ -86,10 +86,10 @@ protected:
 
 public:
 	virtual Error get_packet(const uint8_t **r_buffer, int &r_buffer_size) override; ///< buffer is GONE after next get_packet
-	GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>);
+	GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>);
 
 	virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override;
-	GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int);
+	GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int);
 
 	EXBIND0RC(int, get_available_packet_count);
 	EXBIND0RC(int, get_max_packet_size);

+ 4 - 4
core/io/stream_peer.h

@@ -105,16 +105,16 @@ protected:
 
 public:
 	virtual Error put_data(const uint8_t *p_data, int p_bytes) override;
-	GDVIRTUAL3R(Error, _put_data, GDNativeConstPtr<const uint8_t>, int, GDNativePtr<int>);
+	GDVIRTUAL3R(Error, _put_data, GDExtensionConstPtr<const uint8_t>, int, GDExtensionPtr<int>);
 
 	virtual Error put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) override;
-	GDVIRTUAL3R(Error, _put_partial_data, GDNativeConstPtr<const uint8_t>, int, GDNativePtr<int>);
+	GDVIRTUAL3R(Error, _put_partial_data, GDExtensionConstPtr<const uint8_t>, int, GDExtensionPtr<int>);
 
 	virtual Error get_data(uint8_t *p_buffer, int p_bytes) override;
-	GDVIRTUAL3R(Error, _get_data, GDNativePtr<uint8_t>, int, GDNativePtr<int>);
+	GDVIRTUAL3R(Error, _get_data, GDExtensionPtr<uint8_t>, int, GDExtensionPtr<int>);
 
 	virtual Error get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) override;
-	GDVIRTUAL3R(Error, _get_partial_data, GDNativePtr<uint8_t>, int, GDNativePtr<int>);
+	GDVIRTUAL3R(Error, _get_partial_data, GDExtensionPtr<uint8_t>, int, GDExtensionPtr<int>);
 
 	EXBIND0RC(int, get_available_bytes);
 };

+ 10 - 10
core/object/class_db.cpp

@@ -318,7 +318,7 @@ Object *ClassDB::instantiate(const StringName &p_class) {
 	{
 		OBJTYPE_RLOCK;
 		ti = classes.getptr(p_class);
-		if (!ti || ti->disabled || !ti->creation_func || (ti->native_extension && !ti->native_extension->create_instance)) {
+		if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) {
 			if (compat_classes.has(p_class)) {
 				ti = classes.getptr(compat_classes[p_class]);
 			}
@@ -333,8 +333,8 @@ Object *ClassDB::instantiate(const StringName &p_class) {
 		return nullptr;
 	}
 #endif
-	if (ti->native_extension && ti->native_extension->create_instance) {
-		return (Object *)ti->native_extension->create_instance(ti->native_extension->class_userdata);
+	if (ti->gdextension && ti->gdextension->create_instance) {
+		return (Object *)ti->gdextension->create_instance(ti->gdextension->class_userdata);
 	} else {
 		return ti->creation_func();
 	}
@@ -346,17 +346,17 @@ void ClassDB::set_object_extension_instance(Object *p_object, const StringName &
 	{
 		OBJTYPE_RLOCK;
 		ti = classes.getptr(p_class);
-		if (!ti || ti->disabled || !ti->creation_func || (ti->native_extension && !ti->native_extension->create_instance)) {
+		if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) {
 			if (compat_classes.has(p_class)) {
 				ti = classes.getptr(compat_classes[p_class]);
 			}
 		}
 		ERR_FAIL_COND_MSG(!ti, "Cannot get class '" + String(p_class) + "'.");
 		ERR_FAIL_COND_MSG(ti->disabled, "Class '" + String(p_class) + "' is disabled.");
-		ERR_FAIL_COND_MSG(!ti->native_extension, "Class '" + String(p_class) + "' has no native extension.");
+		ERR_FAIL_COND_MSG(!ti->gdextension, "Class '" + String(p_class) + "' has no native extension.");
 	}
 
-	p_object->_extension = ti->native_extension;
+	p_object->_extension = ti->gdextension;
 	p_object->_extension_instance = p_instance;
 }
 
@@ -370,7 +370,7 @@ bool ClassDB::can_instantiate(const StringName &p_class) {
 		return false;
 	}
 #endif
-	return (!ti->disabled && ti->creation_func != nullptr && !(ti->native_extension && !ti->native_extension->create_instance));
+	return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance));
 }
 
 bool ClassDB::is_virtual(const StringName &p_class) {
@@ -388,7 +388,7 @@ bool ClassDB::is_virtual(const StringName &p_class) {
 		return false;
 	}
 #endif
-	return (!ti->disabled && ti->creation_func != nullptr && !(ti->native_extension && !ti->native_extension->create_instance) && ti->is_virtual);
+	return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance) && ti->is_virtual);
 }
 
 void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherits) {
@@ -1522,7 +1522,7 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con
 	return var;
 }
 
-void ClassDB::register_extension_class(ObjectNativeExtension *p_extension) {
+void ClassDB::register_extension_class(ObjectGDExtension *p_extension) {
 	GLOBAL_LOCK_FUNCTION;
 
 	ERR_FAIL_COND_MSG(classes.has(p_extension->class_name), "Class already registered: " + String(p_extension->class_name));
@@ -1532,7 +1532,7 @@ void ClassDB::register_extension_class(ObjectNativeExtension *p_extension) {
 
 	ClassInfo c;
 	c.api = p_extension->editor_class ? API_EDITOR_EXTENSION : API_EXTENSION;
-	c.native_extension = p_extension;
+	c.gdextension = p_extension;
 	c.name = p_extension->class_name;
 	c.is_virtual = p_extension->is_virtual;
 	if (!p_extension->is_abstract) {

+ 2 - 2
core/object/class_db.h

@@ -100,7 +100,7 @@ public:
 		ClassInfo *inherits_ptr = nullptr;
 		void *class_ptr = nullptr;
 
-		ObjectNativeExtension *native_extension = nullptr;
+		ObjectGDExtension *gdextension = nullptr;
 
 		HashMap<StringName, MethodBind *> method_map;
 		HashMap<StringName, int64_t> constant_map;
@@ -203,7 +203,7 @@ public:
 		//nothing
 	}
 
-	static void register_extension_class(ObjectNativeExtension *p_extension);
+	static void register_extension_class(ObjectGDExtension *p_extension);
 	static void unregister_extension_class(const StringName &p_class);
 
 	template <class T>

+ 7 - 7
core/object/make_virtuals.py

@@ -2,7 +2,7 @@ proto = """
 #define GDVIRTUAL$VER($RET m_name $ARG) \\
 StringName _gdvirtual_##m_name##_sn = #m_name;\\
 mutable bool _gdvirtual_##m_name##_initialized = false;\\
-mutable GDNativeExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\
+mutable GDExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\
 template<bool required>\\
 _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
 	ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\
@@ -16,8 +16,8 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\
 		}    \\
 	}\\
     if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
-        /* TODO: C-style cast because GDNativeStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
-        _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDNativeStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDNativeExtensionClassCallVirtual) nullptr;\\
+        /* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
+        _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\
         _gdvirtual_##m_name##_initialized = true;\\
     }\\
 	if (_gdvirtual_##m_name) {\\
@@ -41,8 +41,8 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\
 	    return _script_instance->has_method(_gdvirtual_##m_name##_sn);\\
 	}\\
     if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\
-        /* TODO: C-style cast because GDNativeStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
-        _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDNativeStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDNativeExtensionClassCallVirtual) nullptr;\\
+        /* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\
+        _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\
         _gdvirtual_##m_name##_initialized = true;\\
     }\\
 	if (_gdvirtual_##m_name) {\\
@@ -94,7 +94,7 @@ def generate_version(argcount, const=False, returns=False):
         argtext += ", "
         callsiargs = "Variant vargs[" + str(argcount) + "]={"
         callsiargptrs = "\t\tconst Variant *vargptrs[" + str(argcount) + "]={"
-        callptrargsptr = "\t\tGDNativeConstTypePtr argptrs[" + str(argcount) + "]={"
+        callptrargsptr = "\t\tGDExtensionConstTypePtr argptrs[" + str(argcount) + "]={"
     callptrargs = ""
     for i in range(argcount):
         if i > 0:
@@ -121,7 +121,7 @@ def generate_version(argcount, const=False, returns=False):
         s = s.replace("$CALLSIARGPASS", "(const Variant **)vargptrs," + str(argcount))
         callptrargsptr += "};\\\n"
         s = s.replace("$CALLPTRARGS", callptrargs + callptrargsptr)
-        s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDNativeConstTypePtr*>(argptrs)")
+        s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr*>(argptrs)")
     else:
         s = s.replace("$CALLSIARGS", "")
         s = s.replace("$CALLSIARGPASS", "nullptr, 0")

+ 9 - 9
core/object/object.cpp

@@ -233,7 +233,7 @@ void Object::set(const StringName &p_name, const Variant &p_value, bool *r_valid
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
 #endif
-		if (_extension->set(_extension_instance, (const GDNativeStringNamePtr)&p_name, (const GDNativeVariantPtr)&p_value)) {
+		if (_extension->set(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (const GDExtensionVariantPtr)&p_value)) {
 			if (r_valid) {
 				*r_valid = true;
 			}
@@ -321,7 +321,7 @@ Variant Object::get(const StringName &p_name, bool *r_valid) const {
 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
 #endif
 
-		if (_extension->get(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) {
+		if (_extension->get(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret)) {
 			if (r_valid) {
 				*r_valid = true;
 			}
@@ -477,7 +477,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons
 	}
 
 	if (_extension) {
-		const ObjectNativeExtension *current_extension = _extension;
+		const ObjectGDExtension *current_extension = _extension;
 		while (current_extension) {
 			p_list->push_back(PropertyInfo(Variant::NIL, current_extension->class_name, PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
 			ClassDB::get_property_list(current_extension->class_name, p_list, true, this);
@@ -487,7 +487,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons
 
 	if (_extension && _extension->get_property_list) {
 		uint32_t pcount;
-		const GDNativePropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount);
+		const GDExtensionPropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount);
 		for (uint32_t i = 0; i < pcount; i++) {
 			p_list->push_back(PropertyInfo(pinfo[i]));
 		}
@@ -533,7 +533,7 @@ bool Object::property_can_revert(const StringName &p_name) const {
 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
 #endif
 	if (_extension && _extension->property_can_revert) {
-		if (_extension->property_can_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name)) {
+		if (_extension->property_can_revert(_extension_instance, (const GDExtensionStringNamePtr)&p_name)) {
 			return true;
 		}
 	}
@@ -559,7 +559,7 @@ Variant Object::property_get_revert(const StringName &p_name) const {
 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
 #endif
 	if (_extension && _extension->property_get_revert) {
-		if (_extension->property_get_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) {
+		if (_extension->property_get_revert(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret)) {
 			return ret;
 		}
 	}
@@ -808,7 +808,7 @@ String Object::to_string() {
 	}
 	if (_extension && _extension->to_string) {
 		String ret;
-		GDNativeBool is_valid;
+		GDExtensionBool is_valid;
 		_extension->to_string(_extension_instance, &is_valid, &ret);
 		return ret;
 	}
@@ -1701,7 +1701,7 @@ uint32_t Object::get_edited_version() const {
 }
 #endif
 
-void Object::set_instance_binding(void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks) {
+void Object::set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
 	// This is only meant to be used on creation by the binder.
 	ERR_FAIL_COND(_instance_bindings != nullptr);
 	_instance_bindings = (InstanceBinding *)memalloc(sizeof(InstanceBinding));
@@ -1712,7 +1712,7 @@ void Object::set_instance_binding(void *p_token, void *p_binding, const GDNative
 	_instance_binding_count = 1;
 }
 
-void *Object::get_instance_binding(void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks) {
+void *Object::get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {
 	void *binding = nullptr;
 	_instance_binding_mutex.lock();
 	for (uint32_t i = 0; i < _instance_binding_count; i++) {

+ 29 - 29
core/object/object.h

@@ -31,7 +31,7 @@
 #ifndef OBJECT_H
 #define OBJECT_H
 
-#include "core/extension/gdnative_interface.h"
+#include "core/extension/gdextension_interface.h"
 #include "core/object/message_queue.h"
 #include "core/object/object_id.h"
 #include "core/os/rw_lock.h"
@@ -191,7 +191,7 @@ struct PropertyInfo {
 			type(Variant::OBJECT),
 			class_name(p_class_name) {}
 
-	explicit PropertyInfo(const GDNativePropertyInfo &pinfo) :
+	explicit PropertyInfo(const GDExtensionPropertyInfo &pinfo) :
 			type((Variant::Type)pinfo.type),
 			name(*reinterpret_cast<StringName *>(pinfo.name)),
 			class_name(*reinterpret_cast<StringName *>(pinfo.class_name)),
@@ -243,7 +243,7 @@ struct MethodInfo {
 
 	MethodInfo() {}
 
-	explicit MethodInfo(const GDNativeMethodInfo &pinfo) :
+	explicit MethodInfo(const GDExtensionMethodInfo &pinfo) :
 			name(*reinterpret_cast<StringName *>(pinfo.name)),
 			return_val(PropertyInfo(pinfo.return_value)),
 			flags(pinfo.flags),
@@ -301,31 +301,31 @@ struct MethodInfo {
 	}
 };
 
-// API used to extend in GDNative and other C compatible compiled languages.
+// API used to extend in GDExtension and other C compatible compiled languages.
 class MethodBind;
 
-struct ObjectNativeExtension {
-	ObjectNativeExtension *parent = nullptr;
-	List<ObjectNativeExtension *> children;
+struct ObjectGDExtension {
+	ObjectGDExtension *parent = nullptr;
+	List<ObjectGDExtension *> children;
 	StringName parent_class_name;
 	StringName class_name;
 	bool editor_class = false;
 	bool is_virtual = false;
 	bool is_abstract = false;
-	GDNativeExtensionClassSet set;
-	GDNativeExtensionClassGet get;
-	GDNativeExtensionClassGetPropertyList get_property_list;
-	GDNativeExtensionClassFreePropertyList free_property_list;
-	GDNativeExtensionClassPropertyCanRevert property_can_revert;
-	GDNativeExtensionClassPropertyGetRevert property_get_revert;
-	GDNativeExtensionClassNotification notification;
-	GDNativeExtensionClassToString to_string;
-	GDNativeExtensionClassReference reference;
-	GDNativeExtensionClassReference unreference;
-	GDNativeExtensionClassGetRID get_rid;
+	GDExtensionClassSet set;
+	GDExtensionClassGet get;
+	GDExtensionClassGetPropertyList get_property_list;
+	GDExtensionClassFreePropertyList free_property_list;
+	GDExtensionClassPropertyCanRevert property_can_revert;
+	GDExtensionClassPropertyGetRevert property_get_revert;
+	GDExtensionClassNotification notification;
+	GDExtensionClassToString to_string;
+	GDExtensionClassReference reference;
+	GDExtensionClassReference unreference;
+	GDExtensionClassGetRID get_rid;
 
 	_FORCE_INLINE_ bool is_class(const String &p_class) const {
-		const ObjectNativeExtension *e = this;
+		const ObjectGDExtension *e = this;
 		while (e) {
 			if (p_class == e->class_name.operator String()) {
 				return true;
@@ -336,9 +336,9 @@ struct ObjectNativeExtension {
 	}
 	void *class_userdata = nullptr;
 
-	GDNativeExtensionClassCreateInstance create_instance;
-	GDNativeExtensionClassFreeInstance free_instance;
-	GDNativeExtensionClassGetVirtual get_virtual;
+	GDExtensionClassCreateInstance create_instance;
+	GDExtensionClassFreeInstance free_instance;
+	GDExtensionClassGetVirtual get_virtual;
 };
 
 #define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__)
@@ -579,7 +579,7 @@ private:
 	friend bool predelete_handler(Object *);
 	friend void postinitialize_handler(Object *);
 
-	ObjectNativeExtension *_extension = nullptr;
+	ObjectGDExtension *_extension = nullptr;
 	GDExtensionClassInstancePtr _extension_instance = nullptr;
 
 	struct SignalData {
@@ -637,8 +637,8 @@ private:
 	struct InstanceBinding {
 		void *binding = nullptr;
 		void *token = nullptr;
-		GDNativeInstanceBindingFreeCallback free_callback = nullptr;
-		GDNativeInstanceBindingReferenceCallback reference_callback = nullptr;
+		GDExtensionInstanceBindingFreeCallback free_callback = nullptr;
+		GDExtensionInstanceBindingReferenceCallback reference_callback = nullptr;
 	};
 	InstanceBinding *_instance_bindings = nullptr;
 	uint32_t _instance_binding_count = 0;
@@ -662,8 +662,8 @@ protected:
 		return can_die;
 	}
 
-	friend class NativeExtensionMethodBind;
-	_ALWAYS_INLINE_ const ObjectNativeExtension *_get_extension() const { return _extension; }
+	friend class GDExtensionMethodBind;
+	_ALWAYS_INLINE_ const ObjectGDExtension *_get_extension() const { return _extension; }
 	_ALWAYS_INLINE_ GDExtensionClassInstancePtr _get_extension_instance() const { return _extension_instance; }
 	virtual void _initialize_classv() { initialize_class(); }
 	virtual bool _setv(const StringName &p_name, const Variant &p_property) { return false; };
@@ -917,9 +917,9 @@ public:
 #endif
 
 	// Used by script languages to store binding data.
-	void *get_instance_binding(void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks);
+	void *get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks);
 	// Used on creation by binding only.
-	void set_instance_binding(void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks);
+	void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks);
 	bool has_instance_binding(void *p_token);
 
 	void clear_internal_resource_paths();

+ 32 - 32
core/object/script_language_extension.h

@@ -43,7 +43,7 @@ class ScriptExtension : public Script {
 protected:
 	EXBIND0R(bool, editor_can_reload_from_file)
 
-	GDVIRTUAL1(_placeholder_erased, GDNativePtr<void>)
+	GDVIRTUAL1(_placeholder_erased, GDExtensionPtr<void>)
 	virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) override {
 		GDVIRTUAL_CALL(_placeholder_erased, p_placeholder);
 	}
@@ -56,15 +56,15 @@ public:
 	EXBIND1RC(bool, inherits_script, const Ref<Script> &)
 	EXBIND0RC(StringName, get_instance_base_type)
 
-	GDVIRTUAL1RC(GDNativePtr<void>, _instance_create, Object *)
+	GDVIRTUAL1RC(GDExtensionPtr<void>, _instance_create, Object *)
 	virtual ScriptInstance *instance_create(Object *p_this) override {
-		GDNativePtr<void> ret = nullptr;
+		GDExtensionPtr<void> ret = nullptr;
 		GDVIRTUAL_REQUIRED_CALL(_instance_create, p_this, ret);
 		return reinterpret_cast<ScriptInstance *>(ret.operator void *());
 	}
-	GDVIRTUAL1RC(GDNativePtr<void>, _placeholder_instance_create, Object *)
+	GDVIRTUAL1RC(GDExtensionPtr<void>, _placeholder_instance_create, Object *)
 	PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) override {
-		GDNativePtr<void> ret = nullptr;
+		GDExtensionPtr<void> ret = nullptr;
 		GDVIRTUAL_REQUIRED_CALL(_placeholder_instance_create, p_this, ret);
 		return reinterpret_cast<PlaceHolderScriptInstance *>(ret.operator void *());
 	}
@@ -482,10 +482,10 @@ public:
 			}
 		}
 	}
-	GDVIRTUAL1R(GDNativePtr<void>, _debug_get_stack_level_instance, int)
+	GDVIRTUAL1R(GDExtensionPtr<void>, _debug_get_stack_level_instance, int)
 
 	virtual ScriptInstance *debug_get_stack_level_instance(int p_level) override {
-		GDNativePtr<void> ret = nullptr;
+		GDExtensionPtr<void> ret = nullptr;
 		GDVIRTUAL_REQUIRED_CALL(_debug_get_stack_level_instance, p_level, ret);
 		return reinterpret_cast<ScriptInstance *>(ret.operator void *());
 	}
@@ -578,7 +578,7 @@ public:
 	EXBIND0(profiling_start)
 	EXBIND0(profiling_stop)
 
-	GDVIRTUAL2R(int, _profiling_get_accumulated_data, GDNativePtr<ScriptLanguageExtensionProfilingInfo>, int)
+	GDVIRTUAL2R(int, _profiling_get_accumulated_data, GDExtensionPtr<ScriptLanguageExtensionProfilingInfo>, int)
 
 	virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) override {
 		int ret = 0;
@@ -586,7 +586,7 @@ public:
 		return ret;
 	}
 
-	GDVIRTUAL2R(int, _profiling_get_frame_data, GDNativePtr<ScriptLanguageExtensionProfilingInfo>, int)
+	GDVIRTUAL2R(int, _profiling_get_frame_data, GDExtensionPtr<ScriptLanguageExtensionProfilingInfo>, int)
 
 	virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) override {
 		int ret = 0;
@@ -594,15 +594,15 @@ public:
 		return ret;
 	}
 
-	GDVIRTUAL1R(GDNativePtr<void>, _alloc_instance_binding_data, Object *)
+	GDVIRTUAL1R(GDExtensionPtr<void>, _alloc_instance_binding_data, Object *)
 
 	virtual void *alloc_instance_binding_data(Object *p_object) override {
-		GDNativePtr<void> ret = nullptr;
+		GDExtensionPtr<void> ret = nullptr;
 		GDVIRTUAL_REQUIRED_CALL(_alloc_instance_binding_data, p_object, ret);
 		return ret.operator void *();
 	}
 
-	GDVIRTUAL1(_free_instance_binding_data, GDNativePtr<void>)
+	GDVIRTUAL1(_free_instance_binding_data, GDExtensionPtr<void>)
 
 	virtual void free_instance_binding_data(void *p_data) override {
 		GDVIRTUAL_REQUIRED_CALL(_free_instance_binding_data, p_data);
@@ -639,8 +639,8 @@ VARIANT_ENUM_CAST(ScriptLanguageExtension::CodeCompletionLocation)
 
 class ScriptInstanceExtension : public ScriptInstance {
 public:
-	const GDNativeExtensionScriptInstanceInfo *native_info;
-	GDNativeExtensionScriptInstanceDataPtr instance = nullptr;
+	const GDExtensionScriptInstanceInfo *native_info;
+	GDExtensionScriptInstanceDataPtr instance = nullptr;
 
 // There should not be warnings on explicit casts.
 #if defined(__GNUC__) && !defined(__clang__)
@@ -650,20 +650,20 @@ public:
 
 	virtual bool set(const StringName &p_name, const Variant &p_value) override {
 		if (native_info->set_func) {
-			return native_info->set_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeConstVariantPtr)&p_value);
+			return native_info->set_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionConstVariantPtr)&p_value);
 		}
 		return false;
 	}
 	virtual bool get(const StringName &p_name, Variant &r_ret) const override {
 		if (native_info->get_func) {
-			return native_info->get_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&r_ret);
+			return native_info->get_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&r_ret);
 		}
 		return false;
 	}
 	virtual void get_property_list(List<PropertyInfo> *p_list) const override {
 		if (native_info->get_property_list_func) {
 			uint32_t pcount;
-			const GDNativePropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
+			const GDExtensionPropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount);
 
 #ifdef TOOLS_ENABLED
 			Ref<Script> script = get_script();
@@ -682,8 +682,8 @@ public:
 	}
 	virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const override {
 		if (native_info->get_property_type_func) {
-			GDNativeBool is_valid = 0;
-			GDNativeVariantType type = native_info->get_property_type_func(instance, (GDNativeConstStringNamePtr)&p_name, &is_valid);
+			GDExtensionBool is_valid = 0;
+			GDExtensionVariantType type = native_info->get_property_type_func(instance, (GDExtensionConstStringNamePtr)&p_name, &is_valid);
 			if (r_is_valid) {
 				*r_is_valid = is_valid != 0;
 			}
@@ -694,13 +694,13 @@ public:
 
 	virtual bool property_can_revert(const StringName &p_name) const override {
 		if (native_info->property_can_revert_func) {
-			return native_info->property_can_revert_func(instance, (GDNativeConstStringNamePtr)&p_name);
+			return native_info->property_can_revert_func(instance, (GDExtensionConstStringNamePtr)&p_name);
 		}
 		return false;
 	}
 	virtual bool property_get_revert(const StringName &p_name, Variant &r_ret) const override {
 		if (native_info->property_get_revert_func) {
-			return native_info->property_get_revert_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&r_ret);
+			return native_info->property_get_revert_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&r_ret);
 		}
 		return false;
 	}
@@ -711,7 +711,7 @@ public:
 		}
 		return nullptr;
 	}
-	static void _add_property_with_state(GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value, void *p_userdata) {
+	static void _add_property_with_state(GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value, void *p_userdata) {
 		List<Pair<StringName, Variant>> *state = (List<Pair<StringName, Variant>> *)p_userdata;
 		state->push_back(Pair<StringName, Variant>(*(const StringName *)p_name, *(const Variant *)p_value));
 	}
@@ -724,7 +724,7 @@ public:
 	virtual void get_method_list(List<MethodInfo> *p_list) const override {
 		if (native_info->get_method_list_func) {
 			uint32_t mcount;
-			const GDNativeMethodInfo *minfo = native_info->get_method_list_func(instance, &mcount);
+			const GDExtensionMethodInfo *minfo = native_info->get_method_list_func(instance, &mcount);
 			for (uint32_t i = 0; i < mcount; i++) {
 				p_list->push_back(MethodInfo(minfo[i]));
 			}
@@ -735,7 +735,7 @@ public:
 	}
 	virtual bool has_method(const StringName &p_method) const override {
 		if (native_info->has_method_func) {
-			return native_info->has_method_func(instance, (GDNativeStringNamePtr)&p_method);
+			return native_info->has_method_func(instance, (GDExtensionStringNamePtr)&p_method);
 		}
 		return false;
 	}
@@ -743,8 +743,8 @@ public:
 	virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override {
 		Variant ret;
 		if (native_info->call_func) {
-			GDNativeCallError ce;
-			native_info->call_func(instance, (GDNativeConstStringNamePtr)&p_method, (GDNativeConstVariantPtr *)p_args, p_argcount, (GDNativeVariantPtr)&ret, &ce);
+			GDExtensionCallError ce;
+			native_info->call_func(instance, (GDExtensionConstStringNamePtr)&p_method, (GDExtensionConstVariantPtr *)p_args, p_argcount, (GDExtensionVariantPtr)&ret, &ce);
 			r_error.error = Callable::CallError::Error(ce.error);
 			r_error.argument = ce.argument;
 			r_error.expected = ce.expected;
@@ -759,9 +759,9 @@ public:
 	}
 	virtual String to_string(bool *r_valid) override {
 		if (native_info->to_string_func) {
-			GDNativeBool valid;
+			GDExtensionBool valid;
 			String ret;
-			native_info->to_string_func(instance, &valid, reinterpret_cast<GDNativeStringPtr>(&ret));
+			native_info->to_string_func(instance, &valid, reinterpret_cast<GDExtensionStringPtr>(&ret));
 			if (r_valid) {
 				*r_valid = valid != 0;
 			}
@@ -784,7 +784,7 @@ public:
 
 	virtual Ref<Script> get_script() const override {
 		if (native_info->get_script_func) {
-			GDNativeObjectPtr script = native_info->get_script_func(instance);
+			GDExtensionObjectPtr script = native_info->get_script_func(instance);
 			return Ref<Script>(reinterpret_cast<Script *>(script));
 		}
 		return Ref<Script>();
@@ -799,7 +799,7 @@ public:
 
 	virtual void property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid) override {
 		if (native_info->set_fallback_func) {
-			bool ret = native_info->set_fallback_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeConstVariantPtr)&p_value);
+			bool ret = native_info->set_fallback_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionConstVariantPtr)&p_value);
 			if (r_valid) {
 				*r_valid = ret;
 			}
@@ -808,7 +808,7 @@ public:
 	virtual Variant property_get_fallback(const StringName &p_name, bool *r_valid) override {
 		Variant ret;
 		if (native_info->get_fallback_func) {
-			bool valid = native_info->get_fallback_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&ret);
+			bool valid = native_info->get_fallback_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret);
 			if (r_valid) {
 				*r_valid = valid;
 			}
@@ -818,7 +818,7 @@ public:
 
 	virtual ScriptLanguage *get_language() override {
 		if (native_info->get_language_func) {
-			GDNativeExtensionScriptLanguagePtr lang = native_info->get_language_func(instance);
+			GDExtensionScriptLanguagePtr lang = native_info->get_language_func(instance);
 			return reinterpret_cast<ScriptLanguage *>(lang);
 		}
 		return nullptr;

+ 17 - 17
core/register_core_types.cpp

@@ -38,8 +38,8 @@
 #include "core/crypto/crypto.h"
 #include "core/crypto/hashing_context.h"
 #include "core/debugger/engine_profiler.h"
-#include "core/extension/native_extension.h"
-#include "core/extension/native_extension_manager.h"
+#include "core/extension/gdextension.h"
+#include "core/extension/gdextension_manager.h"
 #include "core/input/input.h"
 #include "core/input/input_map.h"
 #include "core/input/shortcut.h"
@@ -88,7 +88,7 @@ static Ref<ResourceFormatLoaderImage> resource_format_image;
 static Ref<TranslationLoaderPO> resource_format_po;
 static Ref<ResourceFormatSaverCrypto> resource_format_saver_crypto;
 static Ref<ResourceFormatLoaderCrypto> resource_format_loader_crypto;
-static Ref<NativeExtensionResourceLoader> resource_loader_native_extension;
+static Ref<GDExtensionResourceLoader> resource_loader_gdextension;
 static Ref<ResourceFormatSaverJSON> resource_saver_json;
 static Ref<ResourceFormatLoaderJSON> resource_loader_json;
 
@@ -109,7 +109,7 @@ static WorkerThreadPool *worker_thread_pool = nullptr;
 
 extern Mutex _global_mutex;
 
-static NativeExtensionManager *native_extension_manager = nullptr;
+static GDExtensionManager *gdextension_manager = nullptr;
 
 extern void register_global_constants();
 extern void unregister_global_constants();
@@ -256,9 +256,9 @@ void register_core_types() {
 	GDREGISTER_CLASS(ImageFormatLoaderExtension);
 	GDREGISTER_ABSTRACT_CLASS(ResourceImporter);
 
-	GDREGISTER_CLASS(NativeExtension);
+	GDREGISTER_CLASS(GDExtension);
 
-	GDREGISTER_ABSTRACT_CLASS(NativeExtensionManager);
+	GDREGISTER_ABSTRACT_CLASS(GDExtensionManager);
 
 	GDREGISTER_ABSTRACT_CLASS(ResourceUID);
 
@@ -266,10 +266,10 @@ void register_core_types() {
 
 	resource_uid = memnew(ResourceUID);
 
-	native_extension_manager = memnew(NativeExtensionManager);
+	gdextension_manager = memnew(GDExtensionManager);
 
-	resource_loader_native_extension.instantiate();
-	ResourceLoader::add_resource_format_loader(resource_loader_native_extension);
+	resource_loader_gdextension.instantiate();
+	ResourceLoader::add_resource_format_loader(resource_loader_gdextension);
 
 	ip = IP::create();
 
@@ -344,27 +344,27 @@ void register_core_singletons() {
 	Engine::get_singleton()->add_singleton(Engine::Singleton("InputMap", InputMap::get_singleton()));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("EngineDebugger", core_bind::EngineDebugger::get_singleton()));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("Time", Time::get_singleton()));
-	Engine::get_singleton()->add_singleton(Engine::Singleton("NativeExtensionManager", NativeExtensionManager::get_singleton()));
+	Engine::get_singleton()->add_singleton(Engine::Singleton("GDExtensionManager", GDExtensionManager::get_singleton()));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("ResourceUID", ResourceUID::get_singleton()));
 	Engine::get_singleton()->add_singleton(Engine::Singleton("WorkerThreadPool", worker_thread_pool));
 }
 
 void register_core_extensions() {
 	// Hardcoded for now.
-	NativeExtension::initialize_native_extensions();
-	native_extension_manager->load_extensions();
-	native_extension_manager->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE);
+	GDExtension::initialize_gdextensions();
+	gdextension_manager->load_extensions();
+	gdextension_manager->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE);
 	_is_core_extensions_registered = true;
 }
 
 void unregister_core_extensions() {
 	if (_is_core_extensions_registered) {
-		native_extension_manager->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE);
+		gdextension_manager->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE);
 	}
 }
 
 void unregister_core_types() {
-	memdelete(native_extension_manager);
+	memdelete(gdextension_manager);
 
 	memdelete(resource_uid);
 	memdelete(_resource_loader);
@@ -410,8 +410,8 @@ void unregister_core_types() {
 		memdelete(ip);
 	}
 
-	ResourceLoader::remove_resource_format_loader(resource_loader_native_extension);
-	resource_loader_native_extension.unref();
+	ResourceLoader::remove_resource_format_loader(resource_loader_gdextension);
+	resource_loader_gdextension.unref();
 
 	ResourceLoader::finalize();
 

+ 46 - 46
core/variant/native_ptr.h

@@ -36,90 +36,90 @@
 #include "core/variant/type_info.h"
 
 template <class T>
-struct GDNativeConstPtr {
+struct GDExtensionConstPtr {
 	const T *data = nullptr;
-	GDNativeConstPtr(const T *p_assign) { data = p_assign; }
+	GDExtensionConstPtr(const T *p_assign) { data = p_assign; }
 	static const char *get_name() { return "const void"; }
 	operator const T *() const { return data; }
 	operator Variant() const { return uint64_t(data); }
 };
 
 template <class T>
-struct GDNativePtr {
+struct GDExtensionPtr {
 	T *data = nullptr;
-	GDNativePtr(T *p_assign) { data = p_assign; }
+	GDExtensionPtr(T *p_assign) { data = p_assign; }
 	static const char *get_name() { return "void"; }
 	operator T *() const { return data; }
 	operator Variant() const { return uint64_t(data); }
 };
 
-#define GDVIRTUAL_NATIVE_PTR(m_type)                                                              \
-	template <>                                                                                   \
-	struct GDNativeConstPtr<const m_type> {                                                       \
-		const m_type *data = nullptr;                                                             \
-		GDNativeConstPtr() {}                                                                     \
-		GDNativeConstPtr(const m_type *p_assign) { data = p_assign; }                             \
-		static const char *get_name() { return "const " #m_type; }                                \
-		operator const m_type *() const { return data; }                                          \
-		operator Variant() const { return uint64_t(data); }                                       \
-	};                                                                                            \
-	template <>                                                                                   \
-	struct VariantCaster<GDNativeConstPtr<const m_type>> {                                        \
-		static _FORCE_INLINE_ GDNativeConstPtr<const m_type> cast(const Variant &p_variant) {     \
-			return GDNativeConstPtr<const m_type>((const m_type *)p_variant.operator uint64_t()); \
-		}                                                                                         \
-	};                                                                                            \
-	template <>                                                                                   \
-	struct GDNativePtr<m_type> {                                                                  \
-		m_type *data = nullptr;                                                                   \
-		GDNativePtr() {}                                                                          \
-		GDNativePtr(m_type *p_assign) { data = p_assign; }                                        \
-		static const char *get_name() { return #m_type; }                                         \
-		operator m_type *() const { return data; }                                                \
-		operator Variant() const { return uint64_t(data); }                                       \
-	};                                                                                            \
-	template <>                                                                                   \
-	struct VariantCaster<GDNativePtr<m_type>> {                                                   \
-		static _FORCE_INLINE_ GDNativePtr<m_type> cast(const Variant &p_variant) {                \
-			return GDNativePtr<m_type>((m_type *)p_variant.operator uint64_t());                  \
-		}                                                                                         \
+#define GDVIRTUAL_NATIVE_PTR(m_type)                                                                 \
+	template <>                                                                                      \
+	struct GDExtensionConstPtr<const m_type> {                                                       \
+		const m_type *data = nullptr;                                                                \
+		GDExtensionConstPtr() {}                                                                     \
+		GDExtensionConstPtr(const m_type *p_assign) { data = p_assign; }                             \
+		static const char *get_name() { return "const " #m_type; }                                   \
+		operator const m_type *() const { return data; }                                             \
+		operator Variant() const { return uint64_t(data); }                                          \
+	};                                                                                               \
+	template <>                                                                                      \
+	struct VariantCaster<GDExtensionConstPtr<const m_type>> {                                        \
+		static _FORCE_INLINE_ GDExtensionConstPtr<const m_type> cast(const Variant &p_variant) {     \
+			return GDExtensionConstPtr<const m_type>((const m_type *)p_variant.operator uint64_t()); \
+		}                                                                                            \
+	};                                                                                               \
+	template <>                                                                                      \
+	struct GDExtensionPtr<m_type> {                                                                  \
+		m_type *data = nullptr;                                                                      \
+		GDExtensionPtr() {}                                                                          \
+		GDExtensionPtr(m_type *p_assign) { data = p_assign; }                                        \
+		static const char *get_name() { return #m_type; }                                            \
+		operator m_type *() const { return data; }                                                   \
+		operator Variant() const { return uint64_t(data); }                                          \
+	};                                                                                               \
+	template <>                                                                                      \
+	struct VariantCaster<GDExtensionPtr<m_type>> {                                                   \
+		static _FORCE_INLINE_ GDExtensionPtr<m_type> cast(const Variant &p_variant) {                \
+			return GDExtensionPtr<m_type>((m_type *)p_variant.operator uint64_t());                  \
+		}                                                                                            \
 	};
 
 template <class T>
-struct GetTypeInfo<GDNativeConstPtr<T>> {
+struct GetTypeInfo<GDExtensionConstPtr<T>> {
 	static const Variant::Type VARIANT_TYPE = Variant::NIL;
 	static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
 	static inline PropertyInfo get_class_info() {
-		return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDNativeConstPtr<T>::get_name());
+		return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDExtensionConstPtr<T>::get_name());
 	}
 };
 
 template <class T>
-struct GetTypeInfo<GDNativePtr<T>> {
+struct GetTypeInfo<GDExtensionPtr<T>> {
 	static const Variant::Type VARIANT_TYPE = Variant::NIL;
 	static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
 	static inline PropertyInfo get_class_info() {
-		return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDNativePtr<T>::get_name());
+		return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDExtensionPtr<T>::get_name());
 	}
 };
 
 template <class T>
-struct PtrToArg<GDNativeConstPtr<T>> {
-	_FORCE_INLINE_ static GDNativeConstPtr<T> convert(const void *p_ptr) {
-		return GDNativeConstPtr<T>(reinterpret_cast<const T *>(p_ptr));
+struct PtrToArg<GDExtensionConstPtr<T>> {
+	_FORCE_INLINE_ static GDExtensionConstPtr<T> convert(const void *p_ptr) {
+		return GDExtensionConstPtr<T>(reinterpret_cast<const T *>(p_ptr));
 	}
 	typedef const T *EncodeT;
-	_FORCE_INLINE_ static void encode(GDNativeConstPtr<T> p_val, void *p_ptr) {
+	_FORCE_INLINE_ static void encode(GDExtensionConstPtr<T> p_val, void *p_ptr) {
 		*((const T **)p_ptr) = p_val.data;
 	}
 };
 template <class T>
-struct PtrToArg<GDNativePtr<T>> {
-	_FORCE_INLINE_ static GDNativePtr<T> convert(const void *p_ptr) {
-		return GDNativePtr<T>(reinterpret_cast<const T *>(p_ptr));
+struct PtrToArg<GDExtensionPtr<T>> {
+	_FORCE_INLINE_ static GDExtensionPtr<T> convert(const void *p_ptr) {
+		return GDExtensionPtr<T>(reinterpret_cast<const T *>(p_ptr));
 	}
 	typedef T *EncodeT;
-	_FORCE_INLINE_ static void encode(GDNativePtr<T> p_val, void *p_ptr) {
+	_FORCE_INLINE_ static void encode(GDExtensionPtr<T> p_val, void *p_ptr) {
 		*((T **)p_ptr) = p_val.data;
 	}
 };

+ 1 - 1
core/variant/variant_internal.h

@@ -1517,7 +1517,7 @@ struct VariantTypeAdjust<Object *> {
 	}
 };
 
-// GDNative extension helpers.
+// GDExtension helpers.
 
 template <class T>
 struct VariantTypeConstructor {

+ 3 - 3
doc/classes/@GlobalScope.xml

@@ -1319,6 +1319,9 @@
 		<member name="EngineDebugger" type="EngineDebugger" setter="" getter="">
 			The [EngineDebugger] singleton.
 		</member>
+		<member name="GDExtensionManager" type="GDExtensionManager" setter="" getter="">
+			The [GDExtensionManager] singleton.
+		</member>
 		<member name="Geometry2D" type="Geometry2D" setter="" getter="">
 			The [Geometry2D] singleton.
 		</member>
@@ -1348,9 +1351,6 @@
 		<member name="Marshalls" type="Marshalls" setter="" getter="">
 			The [Marshalls] singleton.
 		</member>
-		<member name="NativeExtensionManager" type="NativeExtensionManager" setter="" getter="">
-			The [NativeExtensionManager] singleton.
-		</member>
 		<member name="NavigationMeshGenerator" type="NavigationMeshGenerator" setter="" getter="">
 			The [NavigationMeshGenerator] singleton.
 		</member>

+ 3 - 3
doc/classes/NativeExtension.xml → doc/classes/GDExtension.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<class name="NativeExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
+<class name="GDExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
 	<brief_description>
 	</brief_description>
 	<description>
@@ -13,13 +13,13 @@
 			</description>
 		</method>
 		<method name="get_minimum_library_initialization_level" qualifiers="const">
-			<return type="int" enum="NativeExtension.InitializationLevel" />
+			<return type="int" enum="GDExtension.InitializationLevel" />
 			<description>
 			</description>
 		</method>
 		<method name="initialize_library">
 			<return type="void" />
-			<param index="0" name="level" type="int" enum="NativeExtension.InitializationLevel" />
+			<param index="0" name="level" type="int" enum="GDExtension.InitializationLevel" />
 			<description>
 			</description>
 		</method>

+ 5 - 5
doc/classes/NativeExtensionManager.xml → doc/classes/GDExtensionManager.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<class name="NativeExtensionManager" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
+<class name="GDExtensionManager" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
 	<brief_description>
 	</brief_description>
 	<description>
@@ -8,7 +8,7 @@
 	</tutorials>
 	<methods>
 		<method name="get_extension">
-			<return type="NativeExtension" />
+			<return type="GDExtension" />
 			<param index="0" name="path" type="String" />
 			<description>
 			</description>
@@ -25,19 +25,19 @@
 			</description>
 		</method>
 		<method name="load_extension">
-			<return type="int" enum="NativeExtensionManager.LoadStatus" />
+			<return type="int" enum="GDExtensionManager.LoadStatus" />
 			<param index="0" name="path" type="String" />
 			<description>
 			</description>
 		</method>
 		<method name="reload_extension">
-			<return type="int" enum="NativeExtensionManager.LoadStatus" />
+			<return type="int" enum="GDExtensionManager.LoadStatus" />
 			<param index="0" name="path" type="String" />
 			<description>
 			</description>
 		</method>
 		<method name="unload_extension">
-			<return type="int" enum="NativeExtensionManager.LoadStatus" />
+			<return type="int" enum="GDExtensionManager.LoadStatus" />
 			<param index="0" name="path" type="String" />
 			<description>
 			</description>

+ 1 - 1
drivers/register_driver_types.cpp

@@ -30,7 +30,7 @@
 
 #include "register_driver_types.h"
 
-#include "core/extension/native_extension_manager.h"
+#include "core/extension/gdextension_manager.h"
 #include "drivers/png/image_loader_png.h"
 #include "drivers/png/resource_saver_png.h"
 

+ 11 - 11
editor/editor_file_system.cpp

@@ -31,7 +31,7 @@
 #include "editor_file_system.h"
 
 #include "core/config/project_settings.h"
-#include "core/extension/native_extension_manager.h"
+#include "core/extension/gdextension_manager.h"
 #include "core/io/file_access.h"
 #include "core/io/resource_importer.h"
 #include "core/io/resource_loader.h"
@@ -2335,7 +2335,7 @@ ResourceUID::ID EditorFileSystem::_resource_saver_get_resource_id_for_path(const
 static void _scan_extensions_dir(EditorFileSystemDirectory *d, HashSet<String> &extensions) {
 	int fc = d->get_file_count();
 	for (int i = 0; i < fc; i++) {
-		if (d->get_file_type(i) == SNAME("NativeExtension")) {
+		if (d->get_file_type(i) == SNAME("GDExtension")) {
 			extensions.insert(d->get_file_path(i));
 		}
 	}
@@ -2356,19 +2356,19 @@ bool EditorFileSystem::_scan_extensions() {
 	Vector<String> extensions_removed;
 
 	for (const String &E : extensions) {
-		if (!NativeExtensionManager::get_singleton()->is_extension_loaded(E)) {
+		if (!GDExtensionManager::get_singleton()->is_extension_loaded(E)) {
 			extensions_added.push_back(E);
 		}
 	}
 
-	Vector<String> loaded_extensions = NativeExtensionManager::get_singleton()->get_loaded_extensions();
+	Vector<String> loaded_extensions = GDExtensionManager::get_singleton()->get_loaded_extensions();
 	for (int i = 0; i < loaded_extensions.size(); i++) {
 		if (!extensions.has(loaded_extensions[i])) {
 			extensions_removed.push_back(loaded_extensions[i]);
 		}
 	}
 
-	String extension_list_config_file = NativeExtension::get_extension_list_config_file();
+	String extension_list_config_file = GDExtension::get_extension_list_config_file();
 	if (extensions.size()) {
 		if (extensions_added.size() || extensions_removed.size()) { //extensions were added or removed
 			Ref<FileAccess> f = FileAccess::open(extension_list_config_file, FileAccess::WRITE);
@@ -2385,18 +2385,18 @@ bool EditorFileSystem::_scan_extensions() {
 
 	bool needs_restart = false;
 	for (int i = 0; i < extensions_added.size(); i++) {
-		NativeExtensionManager::LoadStatus st = NativeExtensionManager::get_singleton()->load_extension(extensions_added[i]);
-		if (st == NativeExtensionManager::LOAD_STATUS_FAILED) {
+		GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->load_extension(extensions_added[i]);
+		if (st == GDExtensionManager::LOAD_STATUS_FAILED) {
 			EditorNode::get_singleton()->add_io_error("Error loading extension: " + extensions_added[i]);
-		} else if (st == NativeExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
+		} else if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
 			needs_restart = true;
 		}
 	}
 	for (int i = 0; i < extensions_removed.size(); i++) {
-		NativeExtensionManager::LoadStatus st = NativeExtensionManager::get_singleton()->unload_extension(extensions_removed[i]);
-		if (st == NativeExtensionManager::LOAD_STATUS_FAILED) {
+		GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->unload_extension(extensions_removed[i]);
+		if (st == GDExtensionManager::LOAD_STATUS_FAILED) {
 			EditorNode::get_singleton()->add_io_error("Error removing extension: " + extensions_added[i]);
-		} else if (st == NativeExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
+		} else if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) {
 			needs_restart = true;
 		}
 	}

+ 2 - 2
editor/export/editor_export_platform.cpp

@@ -32,7 +32,7 @@
 
 #include "core/config/project_settings.h"
 #include "core/crypto/crypto_core.h"
-#include "core/extension/native_extension.h"
+#include "core/extension/gdextension.h"
 #include "core/io/file_access_encrypted.h"
 #include "core/io/file_access_pack.h" // PACK_HEADER_MAGIC, PACK_FORMAT_VERSION
 #include "core/io/zip_io.h"
@@ -1267,7 +1267,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
 		}
 	}
 
-	String extension_list_config_file = NativeExtension::get_extension_list_config_file();
+	String extension_list_config_file = GDExtension::get_extension_list_config_file();
 	if (FileAccess::exists(extension_list_config_file)) {
 		Vector<uint8_t> array = FileAccess::get_file_as_bytes(extension_list_config_file);
 		err = p_func(p_udata, extension_list_config_file, array, idx, total, enc_in_filters, enc_ex_filters, key);

+ 1 - 1
editor/export/editor_export_plugin.h

@@ -31,7 +31,7 @@
 #ifndef EDITOR_EXPORT_PLUGIN_H
 #define EDITOR_EXPORT_PLUGIN_H
 
-#include "core/extension/native_extension.h"
+#include "core/extension/gdextension.h"
 #include "editor_export_preset.h"
 #include "editor_export_shared_object.h"
 #include "scene/main/node.h"

+ 2 - 2
editor/plugins/gdextension_export_plugin.h

@@ -40,7 +40,7 @@ protected:
 };
 
 void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p_type, const HashSet<String> &p_features) {
-	if (p_type != "NativeExtension") {
+	if (p_type != "GDExtension") {
 		return;
 	}
 
@@ -55,7 +55,7 @@ void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p
 	String entry_symbol = config->get_value("configuration", "entry_symbol");
 
 	PackedStringArray tags;
-	String library_path = NativeExtension::find_extension_library(
+	String library_path = GDExtension::find_extension_library(
 			p_path, config, [p_features](String p_feature) { return p_features.has(p_feature); }, &tags);
 	if (!library_path.is_empty()) {
 		add_shared_object(library_path, tags);

+ 1 - 1
editor/project_converter_3_to_4.cpp

@@ -1398,7 +1398,7 @@ static const char *class_renames[][2] = {
 	// { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB
 	// { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB
 	// { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB
-	// { "NativeScript","NativeExtension"}, ??
+	// { "NativeScript","GDExtension"}, ??
 	{ "ARVRAnchor", "XRAnchor3D" },
 	{ "ARVRCamera", "XRCamera3D" },
 	{ "ARVRController", "XRController3D" },

+ 22 - 22
main/main.cpp

@@ -36,8 +36,8 @@
 #include "core/crypto/crypto.h"
 #include "core/debugger/engine_debugger.h"
 #include "core/extension/extension_api_dump.h"
-#include "core/extension/gdnative_interface_dump.gen.h"
-#include "core/extension/native_extension_manager.h"
+#include "core/extension/gdextension_interface_dump.gen.h"
+#include "core/extension/gdextension_manager.h"
 #include "core/input/input.h"
 #include "core/input/input_map.h"
 #include "core/io/dir_access.h"
@@ -202,7 +202,7 @@ static MovieWriter *movie_writer = nullptr;
 static bool disable_vsync = false;
 static bool print_fps = false;
 #ifdef TOOLS_ENABLED
-static bool dump_gdnative_interface = false;
+static bool dump_gdextension_interface = false;
 static bool dump_extension_api = false;
 #endif
 bool profile_gpu = false;
@@ -423,7 +423,7 @@ void Main::print_help(const char *p_binary) {
 	OS::get_singleton()->print("  --doctool [<path>]                Dump the engine API reference to the given <path> (defaults to current dir) in XML format, merging if existing files are found.\n");
 	OS::get_singleton()->print("  --no-docbase                      Disallow dumping the base types (used with --doctool).\n");
 	OS::get_singleton()->print("  --build-solutions                 Build the scripting solutions (e.g. for C# projects). Implies --editor and requires a valid project to edit.\n");
-	OS::get_singleton()->print("  --dump-gdextension-interface      Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.\n");
+	OS::get_singleton()->print("  --dump-gdextension-interface      Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.\n");
 	OS::get_singleton()->print("  --dump-extension-api              Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.\n");
 	OS::get_singleton()->print("  --startup-benchmark               Benchmark the startup time and print it to console.\n");
 	OS::get_singleton()->print("  --startup-benchmark-file <path>   Benchmark the startup time and save it to a given file in JSON format.\n");
@@ -473,7 +473,7 @@ Error Main::test_setup() {
 	register_server_types();
 	XRServer::set_xr_mode(XRServer::XRMODE_OFF); // Skip in tests.
 	initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
+	GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 
 	translation_server->setup(); //register translations, load them, etc.
 	if (!locale.is_empty()) {
@@ -488,14 +488,14 @@ Error Main::test_setup() {
 	register_driver_types();
 
 	initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+	GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
 
 #ifdef TOOLS_ENABLED
 	ClassDB::set_current_api(ClassDB::API_EDITOR);
 	register_editor_types();
 
 	initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+	GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
 
 	ClassDB::set_current_api(ClassDB::API_CORE);
 #endif
@@ -547,12 +547,12 @@ void Main::test_cleanup() {
 	ResourceSaver::remove_custom_savers();
 
 #ifdef TOOLS_ENABLED
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
 	unregister_editor_types();
 #endif
 
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
 	unregister_platform_apis();
 	unregister_driver_types();
@@ -560,7 +560,7 @@ void Main::test_cleanup() {
 
 	finalize_theme_db();
 
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
+	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
 	unregister_server_types();
 
@@ -1063,8 +1063,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 			// Register as an editor instance to use low-end fallback if relevant.
 			editor = true;
 			cmdline_tool = true;
-			dump_gdnative_interface = true;
-			print_line("Dumping gdnative interface header file");
+			dump_gdextension_interface = true;
+			print_line("Dumping GDExtension interface header file");
 			// Hack. Not needed but otherwise we end up detecting that this should
 			// run the project instead of a cmdline tool.
 			// Needs full refactoring to fix properly.
@@ -1962,7 +1962,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 
 	register_server_types();
 	initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
+	GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 
 	if (p_main_tid_override) {
 		Thread::main_thread_id = p_main_tid_override;
@@ -2321,13 +2321,13 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
 	register_driver_types();
 
 	initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+	GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
 
 #ifdef TOOLS_ENABLED
 	ClassDB::set_current_api(ClassDB::API_EDITOR);
 	register_editor_types();
 	initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
-	NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+	GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
 
 	ClassDB::set_current_api(ClassDB::API_CORE);
 
@@ -2585,15 +2585,15 @@ bool Main::start() {
 		return false;
 	}
 
-	if (dump_gdnative_interface) {
-		GDNativeInterfaceDump::generate_gdnative_interface_file("gdnative_interface.h");
+	if (dump_gdextension_interface) {
+		GDExtensionInterfaceDump::generate_gdextension_interface_file("gdextension_interface.h");
 	}
 
 	if (dump_extension_api) {
-		NativeExtensionAPIDump::generate_extension_json_file("extension_api.json");
+		GDExtensionAPIDump::generate_extension_json_file("extension_api.json");
 	}
 
-	if (dump_gdnative_interface || dump_extension_api) {
+	if (dump_gdextension_interface || dump_extension_api) {
 		return false;
 	}
 
@@ -3345,7 +3345,7 @@ void Main::cleanup(bool p_force) {
 	}
 
 #ifdef TOOLS_ENABLED
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR);
+	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR);
 	unregister_editor_types();
 
@@ -3353,7 +3353,7 @@ void Main::cleanup(bool p_force) {
 
 	ImageLoader::cleanup();
 
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE);
+	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE);
 
 	unregister_platform_apis();
@@ -3366,7 +3366,7 @@ void Main::cleanup(bool p_force) {
 	finalize_navigation_server();
 	finalize_physics();
 
-	NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS);
+	GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS);
 	uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS);
 	unregister_server_types();
 

+ 1 - 1
misc/dist/linux/godot.6

@@ -157,7 +157,7 @@ Disallow dumping the base types (used with \fB\-\-doctool\fR).
 Build the scripting solutions (e.g. for C# projects). Implies \-\-editor and requires a valid project to edit.
 .TP
 \fB\-\-dump\-gdextension\-interface\fR
-Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.
+Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.
 .TP
 \fB\-\-dump\-extension\-api\fR
 Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.

+ 1 - 1
misc/dist/shell/_godot.zsh-completion

@@ -86,7 +86,7 @@ _arguments \
   '--doctool[dump the engine API reference to the given path in XML format, merging if existing files are found]:path to base Godot build directory (optional):_dirs' \
   '--no-docbase[disallow dumping the base types (used with --doctool)]' \
   '--build-solutions[build the scripting solutions (e.g. for C# projects)]' \
-  '--dump-gdextension-interface[generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \
+  '--dump-gdextension-interface[generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \
   '--dump-extension-api[generate JSON dump of the Godot API for GDExtension bindings named "extension_api.json" in the current folder]' \
   '--startup-benchmark[benchmark the startup time and print it to console]' \
   '--startup-benchmark-file[benchmark the startup time and save it to a given file in JSON format]:path to output JSON file' \

+ 1 - 1
misc/dist/shell/godot.fish

@@ -107,7 +107,7 @@ complete -c godot -l validate-conversion-3to4 -d "Shows what elements will be re
 complete -c godot -l doctool -d "Dump the engine API reference to the given path in XML format, merging if existing files are found" -r
 complete -c godot -l no-docbase -d "Disallow dumping the base types (used with --doctool)"
 complete -c godot -l build-solutions -d "Build the scripting solutions (e.g. for C# projects)"
-complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension"
+complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension"
 complete -c godot -l dump-extension-api -d "Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder"
 complete -c godot -l startup-benchmark -d "Benchmark the startup time and print it to console"
 complete -c godot -l startup-benchmark-file -d "Benchmark the startup time and save it to a given file in JSON format" -x

+ 3 - 3
modules/mono/csharp_script.cpp

@@ -73,7 +73,7 @@ static bool _create_project_solution_if_needed() {
 
 CSharpLanguage *CSharpLanguage::singleton = nullptr;
 
-GDNativeInstanceBindingCallbacks CSharpLanguage::_instance_binding_callbacks = {
+GDExtensionInstanceBindingCallbacks CSharpLanguage::_instance_binding_callbacks = {
 	&_instance_binding_create_callback,
 	&_instance_binding_free_callback,
 	&_instance_binding_reference_callback
@@ -1293,7 +1293,7 @@ void CSharpLanguage::_instance_binding_free_callback(void *, void *, void *p_bin
 	}
 }
 
-GDNativeBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference) {
+GDExtensionBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference) {
 	CRASH_COND(!p_binding);
 
 	CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)p_binding)->get();
@@ -2202,7 +2202,7 @@ void CSharpScript::reload_registered_script(Ref<CSharpScript> p_script) {
 void CSharpScript::update_script_class_info(Ref<CSharpScript> p_script) {
 	bool tool = false;
 
-	// TODO: Use GDNative godot_dictionary
+	// TODO: Use GDExtension godot_dictionary
 	Array methods_array;
 	methods_array.~Array();
 	Dictionary rpc_functions_dict;

+ 2 - 2
modules/mono/csharp_script.h

@@ -352,9 +352,9 @@ class CSharpLanguage : public ScriptLanguage {
 
 	static void *_instance_binding_create_callback(void *p_token, void *p_instance);
 	static void _instance_binding_free_callback(void *p_token, void *p_instance, void *p_binding);
-	static GDNativeBool _instance_binding_reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference);
+	static GDExtensionBool _instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference);
 
-	static GDNativeInstanceBindingCallbacks _instance_binding_callbacks;
+	static GDExtensionInstanceBindingCallbacks _instance_binding_callbacks;
 
 public:
 	static void *get_instance_binding(Object *p_object);

+ 1 - 1
modules/mono/glue/GodotSharp/GodotSharp.sln.DotSettings

@@ -1,7 +1,7 @@
 <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GC/@EntryIndexedValue">GC</s:String>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=alcs/@EntryIndexedValue">True</s:Boolean>
-	<s:Boolean x:Key="/Default/UserDictionary/Words/=gdnative/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/UserDictionary/Words/=gdextension/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=godotsharp/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=icall/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/UserDictionary/Words/=quat/@EntryIndexedValue">True</s:Boolean>

+ 5 - 5
modules/register_module_types.h

@@ -31,13 +31,13 @@
 #ifndef REGISTER_MODULE_TYPES_H
 #define REGISTER_MODULE_TYPES_H
 
-#include "core/extension/gdnative_interface.h"
+#include "core/extension/gdextension_interface.h"
 
 enum ModuleInitializationLevel {
-	MODULE_INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE,
-	MODULE_INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS,
-	MODULE_INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE,
-	MODULE_INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR
+	MODULE_INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE,
+	MODULE_INITIALIZATION_LEVEL_SERVERS = GDEXTENSION_INITIALIZATION_SERVERS,
+	MODULE_INITIALIZATION_LEVEL_SCENE = GDEXTENSION_INITIALIZATION_SCENE,
+	MODULE_INITIALIZATION_LEVEL_EDITOR = GDEXTENSION_INITIALIZATION_EDITOR
 };
 
 void initialize_modules(ModuleInitializationLevel p_level);

+ 1 - 1
modules/text_server_adv/register_types.cpp

@@ -62,7 +62,7 @@ using namespace godot;
 
 extern "C" {
 
-GDNativeBool GDN_EXPORT textserver_advanced_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
+GDExtensionBool GDN_EXPORT textserver_advanced_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
 	GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
 
 	init_obj.register_initializer(&initialize_text_server_adv_module);

+ 1 - 1
modules/text_server_fb/register_types.cpp

@@ -62,7 +62,7 @@ using namespace godot;
 
 extern "C" {
 
-GDNativeBool GDN_EXPORT textserver_fallback_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) {
+GDExtensionBool GDN_EXPORT textserver_fallback_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {
 	GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization);
 
 	init_obj.register_initializer(&initialize_text_server_fb_module);

+ 2 - 2
modules/webrtc/webrtc_data_channel_extension.h

@@ -70,8 +70,8 @@ public:
 	virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override;
 
 	/** GDExtension **/
-	GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>);
-	GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int);
+	GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>);
+	GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int);
 
 	WebRTCDataChannelExtension() {}
 };

+ 4 - 4
platform/android/export/export_plugin.cpp

@@ -205,7 +205,7 @@ static const char *LEGACY_BUILD_SPLASH_IMAGE_EXPORT_PATH = "res/drawable-nodpi-v
 static const char *SPLASH_BG_COLOR_PATH = "res/drawable-nodpi/splash_bg_color.png";
 static const char *LEGACY_BUILD_SPLASH_BG_COLOR_PATH = "res/drawable-nodpi-v4/splash_bg_color.png";
 static const char *SPLASH_CONFIG_PATH = "res://android/build/res/drawable/splash_drawable.xml";
-static const char *GDNATIVE_LIBS_PATH = "res://android/build/libs/gdnativelibs.json";
+static const char *GDEXTENSION_LIBS_PATH = "res://android/build/libs/gdextensionlibs.json";
 
 static const int icon_densities_count = 6;
 static const char *launcher_icon_option = PNAME("launcher_icons/main_192x192");
@@ -2509,7 +2509,7 @@ void EditorExportPlatformAndroid::_clear_assets_directory() {
 void EditorExportPlatformAndroid::_remove_copied_libs() {
 	print_verbose("Removing previously installed libraries...");
 	Error error;
-	String libs_json = FileAccess::get_file_as_string(GDNATIVE_LIBS_PATH, &error);
+	String libs_json = FileAccess::get_file_as_string(GDEXTENSION_LIBS_PATH, &error);
 	if (error || libs_json.is_empty()) {
 		print_verbose("No previously installed libraries found");
 		return;
@@ -2525,7 +2525,7 @@ void EditorExportPlatformAndroid::_remove_copied_libs() {
 		print_verbose("Removing previously installed library " + libs[i]);
 		da->remove(libs[i]);
 	}
-	da->remove(GDNATIVE_LIBS_PATH);
+	da->remove(GDEXTENSION_LIBS_PATH);
 }
 
 String EditorExportPlatformAndroid::join_list(const List<String> &p_parts, const String &p_separator) {
@@ -2661,7 +2661,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
 				return err;
 			}
 			if (user_data.libs.size() > 0) {
-				Ref<FileAccess> fa = FileAccess::open(GDNATIVE_LIBS_PATH, FileAccess::WRITE);
+				Ref<FileAccess> fa = FileAccess::open(GDEXTENSION_LIBS_PATH, FileAccess::WRITE);
 				fa->store_string(JSON::stringify(user_data.libs, "\t"));
 			}
 		} else {

+ 15 - 15
platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java

@@ -71,11 +71,11 @@ import javax.microedition.khronos.opengles.GL10;
  * - 'plugin.init.ClassFullName' is the full name (package + class name) of the plugin class
  * extending {@link GodotPlugin}.
  *
- * A plugin can also define and provide c/c++ gdnative libraries and nativescripts for the target
+ * A plugin can also define and provide c/c++ gdextension libraries and nativescripts for the target
  * app/game to leverage.
- * The shared library for the gdnative library will be automatically bundled by the aar build
+ * The shared library for the gdextension library will be automatically bundled by the aar build
  * system.
- * Godot '*.gdnlib' and '*.gdns' resource files must however be manually defined in the project
+ * Godot '*.gdextension' resource files must however be manually defined in the project
  * 'assets' directory. The recommended path for these resources in the 'assets' directory should be:
  * 'godot/plugin/v1/[PluginName]/'
  */
@@ -112,7 +112,7 @@ public abstract class GodotPlugin {
 	public final void onRegisterPluginWithGodotNative() {
 		registeredSignals.putAll(
 				registerPluginWithGodotNative(this, getPluginName(), getPluginMethods(), getPluginSignals(),
-						getPluginGDNativeLibrariesPaths()));
+						getPluginGDExtensionLibrariesPaths()));
 	}
 
 	/**
@@ -124,7 +124,7 @@ public abstract class GodotPlugin {
 			GodotPluginInfoProvider pluginInfoProvider) {
 		registerPluginWithGodotNative(pluginObject, pluginInfoProvider.getPluginName(),
 				Collections.emptyList(), pluginInfoProvider.getPluginSignals(),
-				pluginInfoProvider.getPluginGDNativeLibrariesPaths());
+				pluginInfoProvider.getPluginGDExtensionLibrariesPaths());
 
 		// Notify that registration is complete.
 		pluginInfoProvider.onPluginRegistered();
@@ -132,7 +132,7 @@ public abstract class GodotPlugin {
 
 	private static Map<String, SignalInfo> registerPluginWithGodotNative(Object pluginObject,
 			String pluginName, List<String> pluginMethods, Set<SignalInfo> pluginSignals,
-			Set<String> pluginGDNativeLibrariesPaths) {
+			Set<String> pluginGDExtensionLibrariesPaths) {
 		nativeRegisterSingleton(pluginName, pluginObject);
 
 		Set<Method> filteredMethods = new HashSet<>();
@@ -176,9 +176,9 @@ public abstract class GodotPlugin {
 			registeredSignals.put(signalName, signalInfo);
 		}
 
-		// Get the list of gdnative libraries to register.
-		if (!pluginGDNativeLibrariesPaths.isEmpty()) {
-			nativeRegisterGDNativeLibraries(pluginGDNativeLibrariesPaths.toArray(new String[0]));
+		// Get the list of gdextension libraries to register.
+		if (!pluginGDExtensionLibrariesPaths.isEmpty()) {
+			nativeRegisterGDExtensionLibraries(pluginGDExtensionLibrariesPaths.toArray(new String[0]));
 		}
 
 		return registeredSignals;
@@ -304,12 +304,12 @@ public abstract class GodotPlugin {
 	}
 
 	/**
-	 * Returns the paths for the plugin's gdnative libraries.
+	 * Returns the paths for the plugin's gdextension libraries.
 	 *
-	 * The paths must be relative to the 'assets' directory and point to a '*.gdnlib' file.
+	 * The paths must be relative to the 'assets' directory and point to a '*.gdextension' file.
 	 */
 	@NonNull
-	protected Set<String> getPluginGDNativeLibrariesPaths() {
+	protected Set<String> getPluginGDExtensionLibrariesPaths() {
 		return Collections.emptySet();
 	}
 
@@ -420,10 +420,10 @@ public abstract class GodotPlugin {
 	private static native void nativeRegisterMethod(String p_sname, String p_name, String p_ret, String[] p_params);
 
 	/**
-	 * Used to register gdnative libraries bundled by the plugin.
-	 * @param gdnlibPaths Paths to the libraries relative to the 'assets' directory.
+	 * Used to register gdextension libraries bundled by the plugin.
+	 * @param gdextensionPaths Paths to the libraries relative to the 'assets' directory.
 	 */
-	private static native void nativeRegisterGDNativeLibraries(String[] gdnlibPaths);
+	private static native void nativeRegisterGDExtensionLibraries(String[] gdextensionPaths);
 
 	/**
 	 * Used to complete registration of the {@link GodotPlugin} instance's methods.

+ 3 - 3
platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginInfoProvider.java

@@ -54,12 +54,12 @@ public interface GodotPluginInfoProvider {
 	}
 
 	/**
-	 * Returns the paths for the plugin's gdnative libraries (if any).
+	 * Returns the paths for the plugin's gdextension libraries (if any).
 	 *
-	 * The paths must be relative to the 'assets' directory and point to a '*.gdnlib' file.
+	 * The paths must be relative to the 'assets' directory and point to a '*.gdextension' file.
 	 */
 	@NonNull
-	default Set<String> getPluginGDNativeLibrariesPaths() {
+	default Set<String> getPluginGDExtensionLibrariesPaths() {
 		return Collections.emptySet();
 	}
 

+ 9 - 9
platform/android/plugin/godot_plugin_jni.cpp

@@ -128,21 +128,21 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitS
 	singleton->emit_signalp(StringName(signal_name), args, count);
 }
 
-JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jclass clazz, jobjectArray gdnlib_paths) {
-	int gdnlib_count = env->GetArrayLength(gdnlib_paths);
-	if (gdnlib_count == 0) {
+JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDExtensionLibraries(JNIEnv *env, jclass clazz, jobjectArray gdextension_paths) {
+	int gdextension_count = env->GetArrayLength(gdextension_paths);
+	if (gdextension_count == 0) {
 		return;
 	}
 
-	// Retrieve the current list of gdnative libraries.
+	// Retrieve the current list of gdextension libraries.
 	Array singletons;
-	if (ProjectSettings::get_singleton()->has_setting("gdnative/singletons")) {
-		singletons = GLOBAL_GET("gdnative/singletons");
+	if (ProjectSettings::get_singleton()->has_setting("gdextension/singletons")) {
+		singletons = GLOBAL_GET("gdextension/singletons");
 	}
 
 	// Insert the libraries provided by the plugin
-	for (int i = 0; i < gdnlib_count; i++) {
-		jstring relative_path = (jstring)env->GetObjectArrayElement(gdnlib_paths, i);
+	for (int i = 0; i < gdextension_count; i++) {
+		jstring relative_path = (jstring)env->GetObjectArrayElement(gdextension_paths, i);
 
 		String path = "res://" + jstring_to_string(relative_path, env);
 		if (!singletons.has(path)) {
@@ -152,6 +152,6 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis
 	}
 
 	// Insert the updated list back into project settings.
-	ProjectSettings::get_singleton()->set("gdnative/singletons", singletons);
+	ProjectSettings::get_singleton()->set("gdextension/singletons", singletons);
 }
 }

+ 1 - 1
platform/android/plugin/godot_plugin_jni.h

@@ -39,7 +39,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis
 JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterMethod(JNIEnv *env, jclass clazz, jstring sname, jstring name, jstring ret, jobjectArray args);
 JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSignal(JNIEnv *env, jclass clazz, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_param_types);
 JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitSignal(JNIEnv *env, jclass clazz, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_params);
-JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jclass clazz, jobjectArray gdnlib_paths);
+JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDExtensionLibraries(JNIEnv *env, jclass clazz, jobjectArray gdextension_paths);
 }
 
 #endif // GODOT_PLUGIN_JNI_H

+ 1 - 1
platform/ios/export/export_plugin.cpp

@@ -1134,7 +1134,7 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String
 									   "<key>CFBundleShortVersionString</key>\n"
 									   "<string>1.0</string>\n"
 									   "<key>CFBundleIdentifier</key>\n"
-									   "<string>com.gdnative.framework.$name</string>\n"
+									   "<string>com.gdextension.framework.$name</string>\n"
 									   "<key>CFBundleName</key>\n"
 									   "<string>$name</string>\n"
 									   "<key>CFBundleExecutable</key>\n"

+ 1 - 1
platform/web/export/export_plugin.cpp

@@ -133,7 +133,7 @@ void EditorExportPlatformWeb::_fix_html(Vector<uint8_t> &p_html, const Ref<Edito
 	config["canvasResizePolicy"] = p_preset->get("html/canvas_resize_policy");
 	config["experimentalVK"] = p_preset->get("html/experimental_virtual_keyboard");
 	config["focusCanvas"] = p_preset->get("html/focus_canvas_on_start");
-	config["gdnativeLibs"] = libs;
+	config["gdextensionLibs"] = libs;
 	config["executable"] = p_name;
 	config["args"] = args;
 	config["fileSizes"] = p_file_sizes;

+ 2 - 2
platform/web/js/engine/config.js

@@ -127,7 +127,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
 		 * @ignore
 		 * @type {Array.<string>}
 		 */
-		gdnativeLibs: [],
+		gdextensionLibs: [],
 		/**
 		 * @ignore
 		 * @type {Array.<string>}
@@ -257,7 +257,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-
 		this.experimentalVK = parse('experimentalVK', this.experimentalVK);
 		this.focusCanvas = parse('focusCanvas', this.focusCanvas);
 		this.serviceWorker = parse('serviceWorker', this.serviceWorker);
-		this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs);
+		this.gdextensionLibs = parse('gdextensionLibs', this.gdextensionLibs);
 		this.fileSizes = parse('fileSizes', this.fileSizes);
 		this.args = parse('args', this.args);
 		this.onExecute = parse('onExecute', this.onExecute);

+ 2 - 2
platform/web/js/engine/engine.js

@@ -162,9 +162,9 @@ const Engine = (function () {
 					// Godot configuration.
 					me.rtenv['initConfig'](config);
 
-					// Preload GDNative libraries.
+					// Preload GDExtension libraries.
 					const libs = [];
-					me.config.gdnativeLibs.forEach(function (lib) {
+					me.config.gdextensionLibs.forEach(function (lib) {
 						libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true }));
 					});
 					return Promise.all(libs).then(function () {

+ 1 - 1
platform/windows/os_windows.cpp

@@ -272,7 +272,7 @@ Error OS_Windows::open_dynamic_library(const String p_path, void *&p_library_han
 	String path = p_path.replace("/", "\\");
 
 	if (!FileAccess::exists(path)) {
-		//this code exists so gdnative can load .dll files from within the executable path
+		//this code exists so gdextension can load .dll files from within the executable path
 		path = get_executable_path().get_base_dir().path_join(p_path.get_file());
 	}
 

+ 2 - 2
scene/main/multiplayer_peer.h

@@ -112,11 +112,11 @@ protected:
 public:
 	/* PacketPeer extension */
 	virtual Error get_packet(const uint8_t **r_buffer, int &r_buffer_size) override; ///< buffer is GONE after next get_packet
-	GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>);
+	GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>);
 	GDVIRTUAL0R(PackedByteArray, _get_packet_script); // For GDScript.
 
 	virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override;
-	GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int);
+	GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int);
 	GDVIRTUAL1R(Error, _put_packet_script, PackedByteArray); // For GDScript.
 
 	EXBIND0RC(int, get_available_packet_count);

+ 1 - 1
scene/register_scene_types.cpp

@@ -31,7 +31,7 @@
 #include "register_scene_types.h"
 
 #include "core/config/project_settings.h"
-#include "core/extension/native_extension_manager.h"
+#include "core/extension/gdextension_manager.h"
 #include "core/object/class_db.h"
 #include "core/os/os.h"
 #include "scene/2d/animated_sprite_2d.h"

+ 1 - 1
servers/audio/audio_effect.h

@@ -41,7 +41,7 @@ class AudioEffectInstance : public RefCounted {
 	GDCLASS(AudioEffectInstance, RefCounted);
 
 protected:
-	GDVIRTUAL3(_process, GDNativeConstPtr<AudioFrame>, GDNativePtr<AudioFrame>, int)
+	GDVIRTUAL3(_process, GDExtensionConstPtr<AudioFrame>, GDExtensionPtr<AudioFrame>, int)
 	GDVIRTUAL0RC(bool, _process_silence)
 	static void _bind_methods();
 

+ 2 - 2
servers/audio/audio_stream.h

@@ -53,7 +53,7 @@ protected:
 	GDVIRTUAL0RC(int, _get_loop_count)
 	GDVIRTUAL0RC(double, _get_playback_position)
 	GDVIRTUAL1(_seek, double)
-	GDVIRTUAL3R(int, _mix, GDNativePtr<AudioFrame>, float, int)
+	GDVIRTUAL3R(int, _mix, GDExtensionPtr<AudioFrame>, float, int)
 	GDVIRTUAL0(_tag_used_streams)
 public:
 	virtual void start(double p_from_pos = 0.0);
@@ -91,7 +91,7 @@ protected:
 	virtual int _mix_internal(AudioFrame *p_buffer, int p_frames);
 	virtual float get_stream_sampling_rate();
 
-	GDVIRTUAL2R(int, _mix_resampled, GDNativePtr<AudioFrame>, int)
+	GDVIRTUAL2R(int, _mix_resampled, GDExtensionPtr<AudioFrame>, int)
 	GDVIRTUAL0RC(float, _get_stream_sampling_rate)
 
 	static void _bind_methods();

+ 9 - 9
servers/extensions/physics_server_2d_extension.h

@@ -126,12 +126,12 @@ protected:
 	static void _bind_methods();
 	bool is_body_excluded_from_query(const RID &p_body) const;
 
-	GDVIRTUAL7R(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDNativePtr<PhysicsServer2DExtensionRayResult>)
-	GDVIRTUAL7R(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeResult>, int)
-	GDVIRTUAL9R(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeResult>, int)
-	GDVIRTUAL9R(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<real_t>, GDNativePtr<real_t>)
-	GDVIRTUAL10R(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<Vector2>, int, GDNativePtr<int>)
-	GDVIRTUAL8R(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeRestInfo>)
+	GDVIRTUAL7R(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionRayResult>)
+	GDVIRTUAL7R(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int)
+	GDVIRTUAL9R(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int)
+	GDVIRTUAL9R(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>)
+	GDVIRTUAL10R(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)
+	GDVIRTUAL8R(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeRestInfo>)
 
 public:
 	virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) override {
@@ -190,9 +190,9 @@ class PhysicsServer2DExtension : public PhysicsServer2D {
 protected:
 	static void _bind_methods();
 
-	GDVIRTUAL9R(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDNativePtr<Vector2>, int, GDNativePtr<int>)
+	GDVIRTUAL9R(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)
 
-	GDVIRTUAL8R(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDNativePtr<Vector2>, int, GDNativePtr<int>)
+	GDVIRTUAL8R(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>)
 
 public:
 	// The warning is valid, but unavoidable. If the function is not overridden it will error anyway.
@@ -385,7 +385,7 @@ public:
 
 	EXBIND1R(PhysicsDirectBodyState2D *, body_get_direct_state, RID)
 
-	GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionMotionResult>)
+	GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionMotionResult>)
 
 	thread_local static const HashSet<RID> *exclude_bodies;
 	thread_local static const HashSet<ObjectID> *exclude_objects;

+ 7 - 7
servers/extensions/physics_server_3d_extension.h

@@ -128,12 +128,12 @@ protected:
 	static void _bind_methods();
 	bool is_body_excluded_from_query(const RID &p_body) const;
 
-	GDVIRTUAL8R(bool, _intersect_ray, const Vector3 &, const Vector3 &, uint32_t, bool, bool, bool, bool, GDNativePtr<PhysicsServer3DExtensionRayResult>)
-	GDVIRTUAL6R(int, _intersect_point, const Vector3 &, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeResult>, int)
-	GDVIRTUAL9R(int, _intersect_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeResult>, int)
-	GDVIRTUAL10R(bool, _cast_motion, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<real_t>, GDNativePtr<real_t>, GDNativePtr<PhysicsServer3DExtensionShapeRestInfo>)
-	GDVIRTUAL10R(bool, _collide_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<Vector3>, int, GDNativePtr<int>)
-	GDVIRTUAL8R(bool, _rest_info, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeRestInfo>)
+	GDVIRTUAL8R(bool, _intersect_ray, const Vector3 &, const Vector3 &, uint32_t, bool, bool, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionRayResult>)
+	GDVIRTUAL6R(int, _intersect_point, const Vector3 &, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeResult>, int)
+	GDVIRTUAL9R(int, _intersect_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeResult>, int)
+	GDVIRTUAL10R(bool, _cast_motion, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>, GDExtensionPtr<PhysicsServer3DExtensionShapeRestInfo>)
+	GDVIRTUAL10R(bool, _collide_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector3>, int, GDExtensionPtr<int>)
+	GDVIRTUAL8R(bool, _rest_info, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeRestInfo>)
 	GDVIRTUAL2RC(Vector3, _get_closest_point_to_object_volume, RID, const Vector3 &)
 
 public:
@@ -382,7 +382,7 @@ public:
 
 	EXBIND2(body_set_ray_pickable, RID, bool)
 
-	GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform3D &, const Vector3 &, real_t, int, bool, GDNativePtr<PhysicsServer3DExtensionMotionResult>)
+	GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform3D &, const Vector3 &, real_t, int, bool, GDExtensionPtr<PhysicsServer3DExtensionMotionResult>)
 
 	thread_local static const HashSet<RID> *exclude_bodies;
 	thread_local static const HashSet<ObjectID> *exclude_objects;

+ 1 - 1
servers/movie_writer/movie_writer.h

@@ -67,7 +67,7 @@ protected:
 	GDVIRTUAL0RC(Vector<String>, _get_supported_extensions)
 
 	GDVIRTUAL3R(Error, _write_begin, const Size2i &, uint32_t, const String &)
-	GDVIRTUAL2R(Error, _write_frame, const Ref<Image> &, GDNativeConstPtr<int32_t>)
+	GDVIRTUAL2R(Error, _write_frame, const Ref<Image> &, GDExtensionConstPtr<int32_t>)
 	GDVIRTUAL0(_write_end)
 
 	static void _bind_methods();

+ 2 - 2
servers/physics_server_3d.h

@@ -210,8 +210,8 @@ public:
 class PhysicsServer3DRenderingServerHandler : public Object {
 	GDCLASS(PhysicsServer3DRenderingServerHandler, Object)
 protected:
-	GDVIRTUAL2(_set_vertex, int, GDNativeConstPtr<void>)
-	GDVIRTUAL2(_set_normal, int, GDNativeConstPtr<void>)
+	GDVIRTUAL2(_set_vertex, int, GDExtensionConstPtr<void>)
+	GDVIRTUAL2(_set_normal, int, GDExtensionConstPtr<void>)
 	GDVIRTUAL1(_set_aabb, const AABB &)
 
 	static void _bind_methods();

+ 3 - 3
servers/text/text_server_extension.cpp

@@ -1118,13 +1118,13 @@ bool TextServerExtension::shaped_text_is_ready(const RID &p_shaped) const {
 }
 
 const Glyph *TextServerExtension::shaped_text_get_glyphs(const RID &p_shaped) const {
-	GDNativeConstPtr<const Glyph> ret;
+	GDExtensionConstPtr<const Glyph> ret;
 	GDVIRTUAL_CALL(_shaped_text_get_glyphs, p_shaped, ret);
 	return ret;
 }
 
 const Glyph *TextServerExtension::shaped_text_sort_logical(const RID &p_shaped) {
-	GDNativeConstPtr<const Glyph> ret;
+	GDExtensionConstPtr<const Glyph> ret;
 	GDVIRTUAL_CALL(_shaped_text_sort_logical, p_shaped, ret);
 	return ret;
 }
@@ -1178,7 +1178,7 @@ int64_t TextServerExtension::shaped_text_get_ellipsis_pos(const RID &p_shaped) c
 }
 
 const Glyph *TextServerExtension::shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const {
-	GDNativeConstPtr<const Glyph> ret;
+	GDExtensionConstPtr<const Glyph> ret;
 	GDVIRTUAL_CALL(_shaped_text_get_ellipsis_glyphs, p_shaped, ret);
 	return ret;
 }

+ 5 - 5
servers/text/text_server_extension.h

@@ -84,7 +84,7 @@ public:
 	virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override;
 	virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override;
 	GDVIRTUAL2(_font_set_data, RID, const PackedByteArray &);
-	GDVIRTUAL3(_font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t);
+	GDVIRTUAL3(_font_set_data_ptr, RID, GDExtensionConstPtr<const uint8_t>, int64_t);
 
 	virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override;
 	virtual int64_t font_get_face_index(const RID &p_font_rid) const override;
@@ -431,8 +431,8 @@ public:
 	virtual const Glyph *shaped_text_get_glyphs(const RID &p_shaped) const override;
 	virtual const Glyph *shaped_text_sort_logical(const RID &p_shaped) override;
 	virtual int64_t shaped_text_get_glyph_count(const RID &p_shaped) const override;
-	GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_glyphs, RID);
-	GDVIRTUAL1R(GDNativeConstPtr<const Glyph>, _shaped_text_sort_logical, RID);
+	GDVIRTUAL1RC(GDExtensionConstPtr<const Glyph>, _shaped_text_get_glyphs, RID);
+	GDVIRTUAL1R(GDExtensionConstPtr<const Glyph>, _shaped_text_sort_logical, RID);
 	GDVIRTUAL1RC(int64_t, _shaped_text_get_glyph_count, RID);
 
 	virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override;
@@ -451,7 +451,7 @@ public:
 	virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override;
 	GDVIRTUAL1RC(int64_t, _shaped_text_get_trim_pos, RID);
 	GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_pos, RID);
-	GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID);
+	GDVIRTUAL1RC(GDExtensionConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID);
 	GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_glyph_count, RID);
 
 	virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override;
@@ -480,7 +480,7 @@ public:
 
 	virtual CaretInfo shaped_text_get_carets(const RID &p_shaped, int64_t p_position) const override;
 	virtual Vector<Vector2> shaped_text_get_selection(const RID &p_shaped, int64_t p_start, int64_t p_end) const override;
-	GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDNativePtr<CaretInfo>);
+	GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDExtensionPtr<CaretInfo>);
 	GDVIRTUAL3RC(Vector<Vector2>, _shaped_text_get_selection, RID, int64_t, int64_t);
 
 	virtual int64_t shaped_text_hit_test_grapheme(const RID &p_shaped, double p_coords) const override;