Path: blob/master/core/extension/gdextension_interface.cpp
9903 views
/**************************************************************************/1/* gdextension_interface.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "gdextension_interface.h"3132#include "core/config/engine.h"33#include "core/extension/gdextension.h"34#include "core/extension/gdextension_special_compat_hashes.h"35#include "core/io/file_access.h"36#include "core/io/image.h"37#include "core/io/xml_parser.h"38#include "core/object/class_db.h"39#include "core/object/script_language_extension.h"40#include "core/object/worker_thread_pool.h"41#include "core/os/memory.h"42#include "core/variant/variant.h"43#include "core/version.h"4445class CallableCustomExtension : public CallableCustom {46void *userdata;47void *token;4849ObjectID object;5051GDExtensionCallableCustomCall call_func;52GDExtensionCallableCustomIsValid is_valid_func;53GDExtensionCallableCustomFree free_func;5455GDExtensionCallableCustomEqual equal_func;56GDExtensionCallableCustomLessThan less_than_func;5758GDExtensionCallableCustomToString to_string_func;5960GDExtensionCallableCustomGetArgumentCount get_argument_count_func;6162uint32_t _hash;6364static bool default_compare_equal(const CallableCustom *p_a, const CallableCustom *p_b) {65const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);66const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);6768if (a->call_func != b->call_func || a->userdata != b->userdata) {69return false;70}71return true;72}7374static bool default_compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {75const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);76const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);7778if (a->call_func != b->call_func) {79return a->call_func < b->call_func;80}81return a->userdata < b->userdata;82}8384static bool custom_compare_equal(const CallableCustom *p_a, const CallableCustom *p_b) {85const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);86const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);8788if (a->equal_func != b->equal_func) {89return false;90}91return a->equal_func(a->userdata, b->userdata);92}9394static bool custom_compare_less(const CallableCustom *p_a, const CallableCustom *p_b) {95const CallableCustomExtension *a = static_cast<const CallableCustomExtension *>(p_a);96const CallableCustomExtension *b = static_cast<const CallableCustomExtension *>(p_b);9798if (a->less_than_func != b->less_than_func) {99return default_compare_less(p_a, p_b);100}101return a->less_than_func(a->userdata, b->userdata);102}103104public:105uint32_t hash() const override {106return _hash;107}108109String get_as_text() const override {110if (to_string_func != nullptr) {111String out;112GDExtensionBool is_valid = false;113114to_string_func(userdata, &is_valid, (GDExtensionStringPtr)&out);115116if (is_valid) {117return out;118}119}120return "<CallableCustom>";121}122123CompareEqualFunc get_compare_equal_func() const override {124return (equal_func != nullptr) ? custom_compare_equal : default_compare_equal;125}126127CompareLessFunc get_compare_less_func() const override {128return (less_than_func != nullptr) ? custom_compare_less : default_compare_less;129}130131bool is_valid() const override {132if (is_valid_func != nullptr && !is_valid_func(userdata)) {133return false;134}135return call_func != nullptr;136}137138StringName get_method() const override {139return StringName();140}141142ObjectID get_object() const override {143return object;144}145146int get_argument_count(bool &r_is_valid) const override {147if (get_argument_count_func != nullptr) {148GDExtensionBool is_valid = false;149150GDExtensionInt ret = get_argument_count_func(userdata, &is_valid);151152if (is_valid) {153r_is_valid = true;154return ret;155}156}157r_is_valid = false;158return 0;159}160161void *get_userdata(void *p_token) const {162return (p_token == token) ? userdata : nullptr;163}164165void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const override {166GDExtensionCallError error;167168call_func(userdata, (GDExtensionConstVariantPtr *)p_arguments, p_argcount, (GDExtensionVariantPtr)&r_return_value, &error);169170r_call_error.error = (Callable::CallError::Error)error.error;171r_call_error.argument = error.argument;172r_call_error.expected = error.expected;173}174175#ifndef DISABLE_DEPRECATED176CallableCustomExtension(GDExtensionCallableCustomInfo *p_info) {177userdata = p_info->callable_userdata;178token = p_info->token;179180object = p_info->object_id;181182call_func = p_info->call_func;183is_valid_func = p_info->is_valid_func;184free_func = p_info->free_func;185186equal_func = p_info->equal_func;187less_than_func = p_info->less_than_func;188189to_string_func = p_info->to_string_func;190191get_argument_count_func = nullptr;192193// Pre-calculate the hash.194if (p_info->hash_func != nullptr) {195_hash = p_info->hash_func(userdata);196} else {197_hash = hash_murmur3_one_64((uint64_t)call_func);198_hash = hash_murmur3_one_64((uint64_t)userdata, _hash);199}200}201#endif202203CallableCustomExtension(GDExtensionCallableCustomInfo2 *p_info) {204userdata = p_info->callable_userdata;205token = p_info->token;206207object = p_info->object_id;208209call_func = p_info->call_func;210is_valid_func = p_info->is_valid_func;211free_func = p_info->free_func;212213equal_func = p_info->equal_func;214less_than_func = p_info->less_than_func;215216to_string_func = p_info->to_string_func;217218get_argument_count_func = p_info->get_argument_count_func;219220// Pre-calculate the hash.221if (p_info->hash_func != nullptr) {222_hash = p_info->hash_func(userdata);223} else {224_hash = hash_murmur3_one_64((uint64_t)call_func);225_hash = hash_murmur3_one_64((uint64_t)userdata, _hash);226}227}228229~CallableCustomExtension() {230if (free_func != nullptr) {231free_func(userdata);232}233}234};235236// Core interface functions.237GDExtensionInterfaceFunctionPtr gdextension_get_proc_address(const char *p_name) {238return GDExtension::get_interface_function(p_name);239}240241#ifndef DISABLE_DEPRECATED242static void gdextension_get_godot_version(GDExtensionGodotVersion *r_godot_version) {243r_godot_version->major = GODOT_VERSION_MAJOR;244r_godot_version->minor = GODOT_VERSION_MINOR;245r_godot_version->patch = GODOT_VERSION_PATCH;246r_godot_version->string = GODOT_VERSION_FULL_NAME;247}248#endif249250static void gdextension_get_godot_version2(GDExtensionGodotVersion2 *r_godot_version) {251r_godot_version->major = GODOT_VERSION_MAJOR;252r_godot_version->minor = GODOT_VERSION_MINOR;253r_godot_version->patch = GODOT_VERSION_PATCH;254r_godot_version->hex = GODOT_VERSION_HEX;255r_godot_version->status = GODOT_VERSION_STATUS;256r_godot_version->build = GODOT_VERSION_BUILD;257r_godot_version->hash = GODOT_VERSION_HASH;258r_godot_version->timestamp = GODOT_VERSION_TIMESTAMP;259r_godot_version->string = GODOT_VERSION_FULL_NAME;260}261262// Memory Functions263static void *gdextension_mem_alloc(size_t p_size) {264return memalloc(p_size);265}266267static void *gdextension_mem_realloc(void *p_mem, size_t p_size) {268return memrealloc(p_mem, p_size);269}270271static void gdextension_mem_free(void *p_mem) {272memfree(p_mem);273}274275// Helper print functions.276static void gdextension_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {277_err_print_error(p_function, p_file, p_line, p_description, p_editor_notify, ERR_HANDLER_ERROR);278}279static void gdextension_print_error_with_message(const char *p_description, const char *p_message, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {280_err_print_error(p_function, p_file, p_line, p_description, p_message, p_editor_notify, ERR_HANDLER_ERROR);281}282static void gdextension_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {283_err_print_error(p_function, p_file, p_line, p_description, p_editor_notify, ERR_HANDLER_WARNING);284}285static void gdextension_print_warning_with_message(const char *p_description, const char *p_message, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {286_err_print_error(p_function, p_file, p_line, p_description, p_message, p_editor_notify, ERR_HANDLER_WARNING);287}288static void gdextension_print_script_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {289_err_print_error(p_function, p_file, p_line, p_description, p_editor_notify, ERR_HANDLER_SCRIPT);290}291static void gdextension_print_script_error_with_message(const char *p_description, const char *p_message, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {292_err_print_error(p_function, p_file, p_line, p_description, p_message, p_editor_notify, ERR_HANDLER_SCRIPT);293}294295uint64_t gdextension_get_native_struct_size(GDExtensionConstStringNamePtr p_name) {296const StringName name = *reinterpret_cast<const StringName *>(p_name);297return ClassDB::get_native_struct_size(name);298}299300// Variant functions301302static void gdextension_variant_new_copy(GDExtensionUninitializedVariantPtr r_dest, GDExtensionConstVariantPtr p_src) {303memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<const Variant *>(p_src)));304}305static void gdextension_variant_new_nil(GDExtensionUninitializedVariantPtr r_dest) {306memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant);307}308static void gdextension_variant_destroy(GDExtensionVariantPtr p_self) {309reinterpret_cast<Variant *>(p_self)->~Variant();310}311312// variant type313314static void gdextension_variant_call(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {315Variant *self = (Variant *)p_self;316const StringName method = *reinterpret_cast<const StringName *>(p_method);317const Variant **args = (const Variant **)p_args;318Callable::CallError error;319memnew_placement(r_return, Variant);320Variant *ret = reinterpret_cast<Variant *>(r_return);321self->callp(method, args, p_argcount, *ret, error);322323if (r_error) {324r_error->error = (GDExtensionCallErrorType)(error.error);325r_error->argument = error.argument;326r_error->expected = error.expected;327}328}329330static void gdextension_variant_call_static(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {331Variant::Type type = (Variant::Type)p_type;332const StringName method = *reinterpret_cast<const StringName *>(p_method);333const Variant **args = (const Variant **)p_args;334Callable::CallError error;335memnew_placement(r_return, Variant);336Variant *ret = reinterpret_cast<Variant *>(r_return);337Variant::call_static(type, method, args, p_argcount, *ret, error);338339if (r_error) {340r_error->error = (GDExtensionCallErrorType)error.error;341r_error->argument = error.argument;342r_error->expected = error.expected;343}344}345346static void gdextension_variant_evaluate(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionUninitializedVariantPtr r_return, GDExtensionBool *r_valid) {347Variant::Operator op = (Variant::Operator)p_op;348const Variant *a = (const Variant *)p_a;349const Variant *b = (const Variant *)p_b;350bool valid;351memnew_placement(r_return, Variant);352Variant *ret = reinterpret_cast<Variant *>(r_return);353Variant::evaluate(op, *a, *b, *ret, valid);354*r_valid = valid;355}356357static void gdextension_variant_set(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {358Variant *self = (Variant *)p_self;359const Variant *key = (const Variant *)p_key;360const Variant *value = (const Variant *)p_value;361362bool valid;363self->set(*key, *value, &valid);364*r_valid = valid;365}366367static void gdextension_variant_set_named(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {368Variant *self = (Variant *)p_self;369const StringName *key = (const StringName *)p_key;370const Variant *value = (const Variant *)p_value;371372bool valid;373self->set_named(*key, *value, valid);374*r_valid = valid;375}376377static void gdextension_variant_set_keyed(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {378Variant *self = (Variant *)p_self;379const Variant *key = (const Variant *)p_key;380const Variant *value = (const Variant *)p_value;381382bool valid;383self->set_keyed(*key, *value, valid);384*r_valid = valid;385}386387static void gdextension_variant_set_indexed(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob) {388Variant *self = (Variant *)p_self;389const Variant *value = (const Variant *)p_value;390391bool valid;392bool oob;393self->set_indexed(p_index, *value, valid, oob);394*r_valid = valid;395*r_oob = oob;396}397398static void gdextension_variant_get(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {399const Variant *self = (const Variant *)p_self;400const Variant *key = (const Variant *)p_key;401402bool valid;403memnew_placement(r_ret, Variant(self->get(*key, &valid)));404*r_valid = valid;405}406407static void gdextension_variant_get_named(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {408const Variant *self = (const Variant *)p_self;409const StringName *key = (const StringName *)p_key;410411bool valid;412memnew_placement(r_ret, Variant(self->get_named(*key, valid)));413*r_valid = valid;414}415416static void gdextension_variant_get_keyed(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {417const Variant *self = (const Variant *)p_self;418const Variant *key = (const Variant *)p_key;419420bool valid;421memnew_placement(r_ret, Variant(self->get_keyed(*key, valid)));422*r_valid = valid;423}424425static void gdextension_variant_get_indexed(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob) {426const Variant *self = (const Variant *)p_self;427428bool valid;429bool oob;430memnew_placement(r_ret, Variant(self->get_indexed(p_index, valid, oob)));431*r_valid = valid;432*r_oob = oob;433}434435/// Iteration.436static GDExtensionBool gdextension_variant_iter_init(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_iter, GDExtensionBool *r_valid) {437const Variant *self = (const Variant *)p_self;438memnew_placement(r_iter, Variant);439Variant *iter = reinterpret_cast<Variant *>(r_iter);440441bool valid;442bool ret = self->iter_init(*iter, valid);443*r_valid = valid;444return ret;445}446447static GDExtensionBool gdextension_variant_iter_next(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid) {448const Variant *self = (const Variant *)p_self;449Variant *iter = (Variant *)r_iter;450451bool valid;452bool ret = self->iter_next(*iter, valid);453*r_valid = valid;454return ret;455}456457static void gdextension_variant_iter_get(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {458const Variant *self = (const Variant *)p_self;459Variant *iter = (Variant *)r_iter;460461bool valid;462memnew_placement(r_ret, Variant(self->iter_get(*iter, valid)));463*r_valid = valid;464}465466/// Variant functions.467static GDExtensionInt gdextension_variant_hash(GDExtensionConstVariantPtr p_self) {468const Variant *self = (const Variant *)p_self;469return self->hash();470}471472static GDExtensionInt gdextension_variant_recursive_hash(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count) {473const Variant *self = (const Variant *)p_self;474return self->recursive_hash(p_recursion_count);475}476477static GDExtensionBool gdextension_variant_hash_compare(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other) {478const Variant *self = (const Variant *)p_self;479const Variant *other = (const Variant *)p_other;480return self->hash_compare(*other);481}482483static GDExtensionBool gdextension_variant_booleanize(GDExtensionConstVariantPtr p_self) {484const Variant *self = (const Variant *)p_self;485return self->booleanize();486}487488static void gdextension_variant_duplicate(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool p_deep) {489const Variant *self = (const Variant *)p_self;490memnew_placement(r_ret, Variant(self->duplicate(p_deep)));491}492493static void gdextension_variant_stringify(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_ret) {494const Variant *self = (const Variant *)p_self;495memnew_placement(r_ret, String(*self));496}497498static GDExtensionVariantType gdextension_variant_get_type(GDExtensionConstVariantPtr p_self) {499const Variant *self = (const Variant *)p_self;500return (GDExtensionVariantType)self->get_type();501}502503static GDExtensionBool gdextension_variant_has_method(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method) {504const Variant *self = (const Variant *)p_self;505const StringName *method = (const StringName *)p_method;506return self->has_method(*method);507}508509static GDExtensionBool gdextension_variant_has_member(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {510return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member));511}512513static GDExtensionBool gdextension_variant_has_key(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid) {514const Variant *self = (const Variant *)p_self;515const Variant *key = (const Variant *)p_key;516bool valid;517bool ret = self->has_key(*key, valid);518*r_valid = valid;519return ret;520}521522static GDObjectInstanceID gdextension_variant_get_object_instance_id(GDExtensionConstVariantPtr p_self) {523const Variant *self = (const Variant *)p_self;524if (likely(self->get_type() == Variant::OBJECT)) {525return self->operator ObjectID();526}527return 0;528}529530static void gdextension_variant_get_type_name(GDExtensionVariantType p_type, GDExtensionUninitializedVariantPtr r_ret) {531String name = Variant::get_type_name((Variant::Type)p_type);532memnew_placement(r_ret, String(name));533}534535static GDExtensionBool gdextension_variant_can_convert(GDExtensionVariantType p_from, GDExtensionVariantType p_to) {536return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to);537}538539static GDExtensionBool gdextension_variant_can_convert_strict(GDExtensionVariantType p_from, GDExtensionVariantType p_to) {540return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to);541}542543// Variant interaction.544static GDExtensionVariantFromTypeConstructorFunc gdextension_get_variant_from_type_constructor(GDExtensionVariantType p_type) {545switch (p_type) {546case GDEXTENSION_VARIANT_TYPE_BOOL:547return VariantTypeConstructor<bool>::variant_from_type;548case GDEXTENSION_VARIANT_TYPE_INT:549return VariantTypeConstructor<int64_t>::variant_from_type;550case GDEXTENSION_VARIANT_TYPE_FLOAT:551return VariantTypeConstructor<double>::variant_from_type;552case GDEXTENSION_VARIANT_TYPE_STRING:553return VariantTypeConstructor<String>::variant_from_type;554case GDEXTENSION_VARIANT_TYPE_VECTOR2:555return VariantTypeConstructor<Vector2>::variant_from_type;556case GDEXTENSION_VARIANT_TYPE_VECTOR2I:557return VariantTypeConstructor<Vector2i>::variant_from_type;558case GDEXTENSION_VARIANT_TYPE_RECT2:559return VariantTypeConstructor<Rect2>::variant_from_type;560case GDEXTENSION_VARIANT_TYPE_RECT2I:561return VariantTypeConstructor<Rect2i>::variant_from_type;562case GDEXTENSION_VARIANT_TYPE_VECTOR3:563return VariantTypeConstructor<Vector3>::variant_from_type;564case GDEXTENSION_VARIANT_TYPE_VECTOR3I:565return VariantTypeConstructor<Vector3i>::variant_from_type;566case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:567return VariantTypeConstructor<Transform2D>::variant_from_type;568case GDEXTENSION_VARIANT_TYPE_VECTOR4:569return VariantTypeConstructor<Vector4>::variant_from_type;570case GDEXTENSION_VARIANT_TYPE_VECTOR4I:571return VariantTypeConstructor<Vector4i>::variant_from_type;572case GDEXTENSION_VARIANT_TYPE_PLANE:573return VariantTypeConstructor<Plane>::variant_from_type;574case GDEXTENSION_VARIANT_TYPE_QUATERNION:575return VariantTypeConstructor<Quaternion>::variant_from_type;576case GDEXTENSION_VARIANT_TYPE_AABB:577return VariantTypeConstructor<AABB>::variant_from_type;578case GDEXTENSION_VARIANT_TYPE_BASIS:579return VariantTypeConstructor<Basis>::variant_from_type;580case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:581return VariantTypeConstructor<Transform3D>::variant_from_type;582case GDEXTENSION_VARIANT_TYPE_PROJECTION:583return VariantTypeConstructor<Projection>::variant_from_type;584case GDEXTENSION_VARIANT_TYPE_COLOR:585return VariantTypeConstructor<Color>::variant_from_type;586case GDEXTENSION_VARIANT_TYPE_STRING_NAME:587return VariantTypeConstructor<StringName>::variant_from_type;588case GDEXTENSION_VARIANT_TYPE_NODE_PATH:589return VariantTypeConstructor<NodePath>::variant_from_type;590case GDEXTENSION_VARIANT_TYPE_RID:591return VariantTypeConstructor<RID>::variant_from_type;592case GDEXTENSION_VARIANT_TYPE_OBJECT:593return VariantTypeConstructor<Object *>::variant_from_type;594case GDEXTENSION_VARIANT_TYPE_CALLABLE:595return VariantTypeConstructor<Callable>::variant_from_type;596case GDEXTENSION_VARIANT_TYPE_SIGNAL:597return VariantTypeConstructor<Signal>::variant_from_type;598case GDEXTENSION_VARIANT_TYPE_DICTIONARY:599return VariantTypeConstructor<Dictionary>::variant_from_type;600case GDEXTENSION_VARIANT_TYPE_ARRAY:601return VariantTypeConstructor<Array>::variant_from_type;602case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:603return VariantTypeConstructor<PackedByteArray>::variant_from_type;604case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:605return VariantTypeConstructor<PackedInt32Array>::variant_from_type;606case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:607return VariantTypeConstructor<PackedInt64Array>::variant_from_type;608case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:609return VariantTypeConstructor<PackedFloat32Array>::variant_from_type;610case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:611return VariantTypeConstructor<PackedFloat64Array>::variant_from_type;612case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:613return VariantTypeConstructor<PackedStringArray>::variant_from_type;614case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:615return VariantTypeConstructor<PackedVector2Array>::variant_from_type;616case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:617return VariantTypeConstructor<PackedVector3Array>::variant_from_type;618case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:619return VariantTypeConstructor<PackedVector4Array>::variant_from_type;620case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:621return VariantTypeConstructor<PackedColorArray>::variant_from_type;622case GDEXTENSION_VARIANT_TYPE_NIL:623case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:624ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");625}626ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");627}628629static GDExtensionTypeFromVariantConstructorFunc gdextension_get_variant_to_type_constructor(GDExtensionVariantType p_type) {630switch (p_type) {631case GDEXTENSION_VARIANT_TYPE_BOOL:632return VariantTypeConstructor<bool>::type_from_variant;633case GDEXTENSION_VARIANT_TYPE_INT:634return VariantTypeConstructor<int64_t>::type_from_variant;635case GDEXTENSION_VARIANT_TYPE_FLOAT:636return VariantTypeConstructor<double>::type_from_variant;637case GDEXTENSION_VARIANT_TYPE_STRING:638return VariantTypeConstructor<String>::type_from_variant;639case GDEXTENSION_VARIANT_TYPE_VECTOR2:640return VariantTypeConstructor<Vector2>::type_from_variant;641case GDEXTENSION_VARIANT_TYPE_VECTOR2I:642return VariantTypeConstructor<Vector2i>::type_from_variant;643case GDEXTENSION_VARIANT_TYPE_RECT2:644return VariantTypeConstructor<Rect2>::type_from_variant;645case GDEXTENSION_VARIANT_TYPE_RECT2I:646return VariantTypeConstructor<Rect2i>::type_from_variant;647case GDEXTENSION_VARIANT_TYPE_VECTOR3:648return VariantTypeConstructor<Vector3>::type_from_variant;649case GDEXTENSION_VARIANT_TYPE_VECTOR3I:650return VariantTypeConstructor<Vector3i>::type_from_variant;651case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:652return VariantTypeConstructor<Transform2D>::type_from_variant;653case GDEXTENSION_VARIANT_TYPE_VECTOR4:654return VariantTypeConstructor<Vector4>::type_from_variant;655case GDEXTENSION_VARIANT_TYPE_VECTOR4I:656return VariantTypeConstructor<Vector4i>::type_from_variant;657case GDEXTENSION_VARIANT_TYPE_PLANE:658return VariantTypeConstructor<Plane>::type_from_variant;659case GDEXTENSION_VARIANT_TYPE_QUATERNION:660return VariantTypeConstructor<Quaternion>::type_from_variant;661case GDEXTENSION_VARIANT_TYPE_AABB:662return VariantTypeConstructor<AABB>::type_from_variant;663case GDEXTENSION_VARIANT_TYPE_BASIS:664return VariantTypeConstructor<Basis>::type_from_variant;665case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:666return VariantTypeConstructor<Transform3D>::type_from_variant;667case GDEXTENSION_VARIANT_TYPE_PROJECTION:668return VariantTypeConstructor<Projection>::type_from_variant;669case GDEXTENSION_VARIANT_TYPE_COLOR:670return VariantTypeConstructor<Color>::type_from_variant;671case GDEXTENSION_VARIANT_TYPE_STRING_NAME:672return VariantTypeConstructor<StringName>::type_from_variant;673case GDEXTENSION_VARIANT_TYPE_NODE_PATH:674return VariantTypeConstructor<NodePath>::type_from_variant;675case GDEXTENSION_VARIANT_TYPE_RID:676return VariantTypeConstructor<RID>::type_from_variant;677case GDEXTENSION_VARIANT_TYPE_OBJECT:678return VariantTypeConstructor<Object *>::type_from_variant;679case GDEXTENSION_VARIANT_TYPE_CALLABLE:680return VariantTypeConstructor<Callable>::type_from_variant;681case GDEXTENSION_VARIANT_TYPE_SIGNAL:682return VariantTypeConstructor<Signal>::type_from_variant;683case GDEXTENSION_VARIANT_TYPE_DICTIONARY:684return VariantTypeConstructor<Dictionary>::type_from_variant;685case GDEXTENSION_VARIANT_TYPE_ARRAY:686return VariantTypeConstructor<Array>::type_from_variant;687case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:688return VariantTypeConstructor<PackedByteArray>::type_from_variant;689case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:690return VariantTypeConstructor<PackedInt32Array>::type_from_variant;691case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:692return VariantTypeConstructor<PackedInt64Array>::type_from_variant;693case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:694return VariantTypeConstructor<PackedFloat32Array>::type_from_variant;695case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:696return VariantTypeConstructor<PackedFloat64Array>::type_from_variant;697case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:698return VariantTypeConstructor<PackedStringArray>::type_from_variant;699case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:700return VariantTypeConstructor<PackedVector2Array>::type_from_variant;701case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:702return VariantTypeConstructor<PackedVector3Array>::type_from_variant;703case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:704return VariantTypeConstructor<PackedVector4Array>::type_from_variant;705case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:706return VariantTypeConstructor<PackedColorArray>::type_from_variant;707case GDEXTENSION_VARIANT_TYPE_NIL:708case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:709ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");710}711ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");712}713714static GDExtensionVariantGetInternalPtrFunc gdextension_variant_get_ptr_internal_getter(GDExtensionVariantType p_type) {715switch (p_type) {716case GDEXTENSION_VARIANT_TYPE_BOOL:717return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<bool *(*)(Variant *)>(VariantInternal::get_bool));718case GDEXTENSION_VARIANT_TYPE_INT:719return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<int64_t *(*)(Variant *)>(VariantInternal::get_int));720case GDEXTENSION_VARIANT_TYPE_FLOAT:721return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<double *(*)(Variant *)>(VariantInternal::get_float));722case GDEXTENSION_VARIANT_TYPE_STRING:723return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<String *(*)(Variant *)>(VariantInternal::get_string));724case GDEXTENSION_VARIANT_TYPE_VECTOR2:725return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector2 *(*)(Variant *)>(VariantInternal::get_vector2));726case GDEXTENSION_VARIANT_TYPE_VECTOR2I:727return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector2i *(*)(Variant *)>(VariantInternal::get_vector2i));728case GDEXTENSION_VARIANT_TYPE_RECT2:729return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Rect2 *(*)(Variant *)>(VariantInternal::get_rect2));730case GDEXTENSION_VARIANT_TYPE_RECT2I:731return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Rect2i *(*)(Variant *)>(VariantInternal::get_rect2i));732case GDEXTENSION_VARIANT_TYPE_VECTOR3:733return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector3 *(*)(Variant *)>(VariantInternal::get_vector3));734case GDEXTENSION_VARIANT_TYPE_VECTOR3I:735return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector3i *(*)(Variant *)>(VariantInternal::get_vector3i));736case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:737return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Transform2D *(*)(Variant *)>(VariantInternal::get_transform2d));738case GDEXTENSION_VARIANT_TYPE_VECTOR4:739return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector4 *(*)(Variant *)>(VariantInternal::get_vector4));740case GDEXTENSION_VARIANT_TYPE_VECTOR4I:741return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector4i *(*)(Variant *)>(VariantInternal::get_vector4i));742case GDEXTENSION_VARIANT_TYPE_PLANE:743return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Plane *(*)(Variant *)>(VariantInternal::get_plane));744case GDEXTENSION_VARIANT_TYPE_QUATERNION:745return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Quaternion *(*)(Variant *)>(VariantInternal::get_quaternion));746case GDEXTENSION_VARIANT_TYPE_AABB:747return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<AABB *(*)(Variant *)>(VariantInternal::get_aabb));748case GDEXTENSION_VARIANT_TYPE_BASIS:749return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Basis *(*)(Variant *)>(VariantInternal::get_basis));750case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:751return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Transform3D *(*)(Variant *)>(VariantInternal::get_transform));752case GDEXTENSION_VARIANT_TYPE_PROJECTION:753return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Projection *(*)(Variant *)>(VariantInternal::get_projection));754case GDEXTENSION_VARIANT_TYPE_COLOR:755return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Color *(*)(Variant *)>(VariantInternal::get_color));756case GDEXTENSION_VARIANT_TYPE_STRING_NAME:757return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<StringName *(*)(Variant *)>(VariantInternal::get_string_name));758case GDEXTENSION_VARIANT_TYPE_NODE_PATH:759return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<NodePath *(*)(Variant *)>(VariantInternal::get_node_path));760case GDEXTENSION_VARIANT_TYPE_RID:761return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<RID *(*)(Variant *)>(VariantInternal::get_rid));762case GDEXTENSION_VARIANT_TYPE_OBJECT:763return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Object **(*)(Variant *)>(VariantInternal::get_object));764case GDEXTENSION_VARIANT_TYPE_CALLABLE:765return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Callable *(*)(Variant *)>(VariantInternal::get_callable));766case GDEXTENSION_VARIANT_TYPE_SIGNAL:767return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Signal *(*)(Variant *)>(VariantInternal::get_signal));768case GDEXTENSION_VARIANT_TYPE_DICTIONARY:769return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Dictionary *(*)(Variant *)>(VariantInternal::get_dictionary));770case GDEXTENSION_VARIANT_TYPE_ARRAY:771return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Array *(*)(Variant *)>(VariantInternal::get_array));772case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:773return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedByteArray *(*)(Variant *)>(VariantInternal::get_byte_array));774case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:775return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedInt32Array *(*)(Variant *)>(VariantInternal::get_int32_array));776case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:777return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedInt64Array *(*)(Variant *)>(VariantInternal::get_int64_array));778case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:779return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedFloat32Array *(*)(Variant *)>(VariantInternal::get_float32_array));780case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:781return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedFloat64Array *(*)(Variant *)>(VariantInternal::get_float64_array));782case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:783return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedStringArray *(*)(Variant *)>(VariantInternal::get_string_array));784case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:785return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedVector2Array *(*)(Variant *)>(VariantInternal::get_vector2_array));786case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:787return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedVector3Array *(*)(Variant *)>(VariantInternal::get_vector3_array));788case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:789return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedColorArray *(*)(Variant *)>(VariantInternal::get_color_array));790case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:791return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedVector4Array *(*)(Variant *)>(VariantInternal::get_vector4_array));792case GDEXTENSION_VARIANT_TYPE_NIL:793case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:794ERR_FAIL_V_MSG(nullptr, "Getting Variant get internal pointer function with invalid type.");795}796ERR_FAIL_V_MSG(nullptr, "Getting Variant get internal pointer function with invalid type.");797}798799// ptrcalls800static GDExtensionPtrOperatorEvaluator gdextension_variant_get_ptr_operator_evaluator(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b) {801return (GDExtensionPtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b));802}803static GDExtensionPtrBuiltInMethod gdextension_variant_get_ptr_builtin_method(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash) {804const StringName method = *reinterpret_cast<const StringName *>(p_method);805uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method);806if (hash != p_hash) {807ERR_PRINT_ONCE("Error getting method " + method + ", hash mismatch.");808return nullptr;809}810811return (GDExtensionPtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method);812}813static GDExtensionPtrConstructor gdextension_variant_get_ptr_constructor(GDExtensionVariantType p_type, int32_t p_constructor) {814return (GDExtensionPtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor);815}816static GDExtensionPtrDestructor gdextension_variant_get_ptr_destructor(GDExtensionVariantType p_type) {817return (GDExtensionPtrDestructor)Variant::get_ptr_destructor(Variant::Type(p_type));818}819static void gdextension_variant_construct(GDExtensionVariantType p_type, GDExtensionUninitializedVariantPtr r_base, const GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error) {820memnew_placement(r_base, Variant);821Variant *base = reinterpret_cast<Variant *>(r_base);822823Callable::CallError error;824Variant::construct(Variant::Type(p_type), *base, (const Variant **)p_args, p_argument_count, error);825826if (r_error) {827r_error->error = (GDExtensionCallErrorType)(error.error);828r_error->argument = error.argument;829r_error->expected = error.expected;830}831}832static GDExtensionPtrSetter gdextension_variant_get_ptr_setter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {833const StringName member = *reinterpret_cast<const StringName *>(p_member);834return (GDExtensionPtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), member);835}836static GDExtensionPtrGetter gdextension_variant_get_ptr_getter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {837const StringName member = *reinterpret_cast<const StringName *>(p_member);838return (GDExtensionPtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), member);839}840static GDExtensionPtrIndexedSetter gdextension_variant_get_ptr_indexed_setter(GDExtensionVariantType p_type) {841return (GDExtensionPtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type));842}843static GDExtensionPtrIndexedGetter gdextension_variant_get_ptr_indexed_getter(GDExtensionVariantType p_type) {844return (GDExtensionPtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type));845}846static GDExtensionPtrKeyedSetter gdextension_variant_get_ptr_keyed_setter(GDExtensionVariantType p_type) {847return (GDExtensionPtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type));848}849static GDExtensionPtrKeyedGetter gdextension_variant_get_ptr_keyed_getter(GDExtensionVariantType p_type) {850return (GDExtensionPtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type));851}852static GDExtensionPtrKeyedChecker gdextension_variant_get_ptr_keyed_checker(GDExtensionVariantType p_type) {853return (GDExtensionPtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type));854}855static void gdextension_variant_get_constant_value(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionUninitializedVariantPtr r_ret) {856StringName constant = *reinterpret_cast<const StringName *>(p_constant);857memnew_placement(r_ret, Variant(Variant::get_constant_value(Variant::Type(p_type), constant)));858}859static GDExtensionPtrUtilityFunction gdextension_variant_get_ptr_utility_function(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash) {860StringName function = *reinterpret_cast<const StringName *>(p_function);861uint32_t hash = Variant::get_utility_function_hash(function);862if (hash != p_hash) {863ERR_PRINT_ONCE("Error getting utility function " + function + ", hash mismatch.");864return nullptr;865}866return (GDExtensionPtrUtilityFunction)Variant::get_ptr_utility_function(function);867}868869//string helpers870871static void gdextension_string_new_with_latin1_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) {872String *dest = memnew_placement(r_dest, String);873dest->append_latin1(Span<char>(p_contents, p_contents ? strlen(p_contents) : 0));874}875876static void gdextension_string_new_with_utf8_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) {877String *dest = memnew_placement(r_dest, String);878dest->append_utf8(p_contents);879}880881static void gdextension_string_new_with_utf16_chars(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents) {882String *dest = memnew_placement(r_dest, String);883dest->append_utf16(p_contents);884}885886static void gdextension_string_new_with_utf32_chars(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents) {887String *dest = memnew_placement(r_dest, String);888dest->append_utf32(Span(p_contents, p_contents ? strlen(p_contents) : 0));889}890891static void gdextension_string_new_with_wide_chars(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents) {892if constexpr (sizeof(wchar_t) == 2) {893// wchar_t is 16 bit (UTF-16).894String *dest = memnew_placement(r_dest, String);895dest->append_utf16((const char16_t *)p_contents);896} else {897// wchar_t is 32 bit (UTF-32).898String *string = memnew_placement(r_dest, String);899string->append_utf32(Span((const char32_t *)p_contents, p_contents ? strlen(p_contents) : 0));900}901}902903static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {904const size_t string_length = p_contents ? (p_size < 0 ? strlen(p_contents) : strnlen(p_contents, p_size)) : 0;905String *dest = memnew_placement(r_dest, String);906dest->append_latin1(Span(p_contents, string_length));907}908909static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {910String *dest = memnew_placement(r_dest, String);911dest->append_utf8(p_contents, p_size);912}913914static GDExtensionInt gdextension_string_new_with_utf8_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {915String *dest = memnew_placement(r_dest, String);916return (GDExtensionInt)dest->append_utf8(p_contents, p_size);917}918919static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count) {920String *dest = memnew_placement(r_dest, String);921dest->append_utf16(p_contents, p_char_count);922}923924static GDExtensionInt gdextension_string_new_with_utf16_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count, GDExtensionBool p_default_little_endian) {925String *dest = memnew_placement(r_dest, String);926return (GDExtensionInt)dest->append_utf16(p_contents, p_char_count, p_default_little_endian);927}928929static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) {930const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen(p_contents, p_char_count)) : 0;931String *string = memnew_placement(r_dest, String);932string->append_utf32(Span(p_contents, string_length));933}934935static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count) {936if constexpr (sizeof(wchar_t) == 2) {937// wchar_t is 16 bit (UTF-16).938String *dest = memnew_placement(r_dest, String);939dest->append_utf16((const char16_t *)p_contents, p_char_count);940} else {941// wchar_t is 32 bit (UTF-32).942const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen((const char32_t *)p_contents, p_char_count)) : 0;943String *string = memnew_placement(r_dest, String);944string->append_utf32(Span((const char32_t *)p_contents, string_length));945}946}947948static GDExtensionInt gdextension_string_to_latin1_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {949String *self = (String *)p_self;950CharString cs = self->latin1();951GDExtensionInt len = cs.length();952if (r_text) {953const char *s_text = cs.ptr();954for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {955r_text[i] = s_text[i];956}957}958return len;959}960static GDExtensionInt gdextension_string_to_utf8_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {961String *self = (String *)p_self;962CharString cs = self->utf8();963GDExtensionInt len = cs.length();964if (r_text) {965const char *s_text = cs.ptr();966for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {967r_text[i] = s_text[i];968}969}970return len;971}972static GDExtensionInt gdextension_string_to_utf16_chars(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length) {973String *self = (String *)p_self;974Char16String cs = self->utf16();975GDExtensionInt len = cs.length();976if (r_text) {977const char16_t *s_text = cs.ptr();978for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {979r_text[i] = s_text[i];980}981}982return len;983}984static GDExtensionInt gdextension_string_to_utf32_chars(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length) {985String *self = (String *)p_self;986GDExtensionInt len = self->length();987if (r_text) {988const char32_t *s_text = self->ptr();989for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {990r_text[i] = s_text[i];991}992}993return len;994}995static GDExtensionInt gdextension_string_to_wide_chars(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length) {996if constexpr (sizeof(wchar_t) == 4) {997return gdextension_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length);998} else {999return gdextension_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length);1000}1001}10021003static char32_t *gdextension_string_operator_index(GDExtensionStringPtr p_self, GDExtensionInt p_index) {1004String *self = (String *)p_self;1005if (unlikely(p_index < 0 || p_index >= self->length() + 1)) {1006return nullptr;1007}1008return &self->ptrw()[p_index];1009}10101011static const char32_t *gdextension_string_operator_index_const(GDExtensionConstStringPtr p_self, GDExtensionInt p_index) {1012const String *self = (const String *)p_self;1013if (unlikely(p_index < 0 || p_index >= self->length() + 1)) {1014return nullptr;1015}1016return &self->ptr()[p_index];1017}10181019static void gdextension_string_operator_plus_eq_string(GDExtensionStringPtr p_self, GDExtensionConstStringPtr p_b) {1020String *self = (String *)p_self;1021const String *b = (const String *)p_b;1022*self += *b;1023}10241025static void gdextension_string_operator_plus_eq_char(GDExtensionStringPtr p_self, char32_t p_b) {1026String *self = (String *)p_self;1027*self += p_b;1028}10291030static void gdextension_string_operator_plus_eq_cstr(GDExtensionStringPtr p_self, const char *p_b) {1031String *self = (String *)p_self;1032*self += p_b;1033}10341035static void gdextension_string_operator_plus_eq_wcstr(GDExtensionStringPtr p_self, const wchar_t *p_b) {1036String *self = (String *)p_self;1037*self += p_b;1038}10391040static void gdextension_string_operator_plus_eq_c32str(GDExtensionStringPtr p_self, const char32_t *p_b) {1041String *self = (String *)p_self;1042*self += p_b;1043}10441045static GDExtensionInt gdextension_string_resize(GDExtensionStringPtr p_self, GDExtensionInt p_length) {1046String *self = (String *)p_self;1047return (*self).resize_uninitialized(p_length);1048}10491050static void gdextension_string_name_new_with_latin1_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionBool p_is_static) {1051memnew_placement(r_dest, StringName(p_contents, static_cast<bool>(p_is_static)));1052}10531054static void gdextension_string_name_new_with_utf8_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents) {1055String tmp = String::utf8(p_contents);1056memnew_placement(r_dest, StringName(tmp));1057}10581059static void gdextension_string_name_new_with_utf8_chars_and_len(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionInt p_size) {1060String tmp = String::utf8(p_contents, p_size);1061memnew_placement(r_dest, StringName(tmp));1062}10631064static GDExtensionInt gdextension_xml_parser_open_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_buffer, size_t p_size) {1065XMLParser *xml = (XMLParser *)p_instance;1066return (GDExtensionInt)xml->_open_buffer(p_buffer, p_size);1067}10681069static void gdextension_file_access_store_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_src, uint64_t p_length) {1070FileAccess *fa = (FileAccess *)p_instance;1071fa->store_buffer(p_src, p_length);1072}10731074static uint64_t gdextension_file_access_get_buffer(GDExtensionConstObjectPtr p_instance, uint8_t *p_dst, uint64_t p_length) {1075const FileAccess *fa = (FileAccess *)p_instance;1076return fa->get_buffer(p_dst, p_length);1077}10781079static uint8_t *gdextension_image_ptrw(GDExtensionObjectPtr p_instance) {1080Image *img = (Image *)p_instance;1081return img->ptrw();1082}10831084static const uint8_t *gdextension_image_ptr(GDExtensionObjectPtr p_instance) {1085Image *img = (Image *)p_instance;1086return img->ptr();1087}10881089static int64_t gdextension_worker_thread_pool_add_native_group_task(GDExtensionObjectPtr p_instance, void (*p_func)(void *, uint32_t), void *p_userdata, int p_elements, int p_tasks, GDExtensionBool p_high_priority, GDExtensionConstStringPtr p_description) {1090WorkerThreadPool *p = (WorkerThreadPool *)p_instance;1091const String *description = (const String *)p_description;1092return (int64_t)p->add_native_group_task(p_func, p_userdata, p_elements, p_tasks, static_cast<bool>(p_high_priority), *description);1093}10941095static int64_t gdextension_worker_thread_pool_add_native_task(GDExtensionObjectPtr p_instance, void (*p_func)(void *), void *p_userdata, GDExtensionBool p_high_priority, GDExtensionConstStringPtr p_description) {1096WorkerThreadPool *p = (WorkerThreadPool *)p_instance;1097const String *description = (const String *)p_description;1098return (int64_t)p->add_native_task(p_func, p_userdata, static_cast<bool>(p_high_priority), *description);1099}11001101/* Packed array functions */11021103static uint8_t *gdextension_packed_byte_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1104PackedByteArray *self = (PackedByteArray *)p_self;1105if (unlikely(p_index < 0 || p_index >= self->size())) {1106return nullptr;1107}1108return &self->ptrw()[p_index];1109}11101111static const uint8_t *gdextension_packed_byte_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1112const PackedByteArray *self = (const PackedByteArray *)p_self;1113if (unlikely(p_index < 0 || p_index >= self->size())) {1114return nullptr;1115}1116return &self->ptr()[p_index];1117}11181119static GDExtensionTypePtr gdextension_packed_color_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1120PackedColorArray *self = (PackedColorArray *)p_self;1121if (unlikely(p_index < 0 || p_index >= self->size())) {1122return nullptr;1123}1124return (GDExtensionTypePtr)&self->ptrw()[p_index];1125}11261127static GDExtensionTypePtr gdextension_packed_color_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1128const PackedColorArray *self = (const PackedColorArray *)p_self;1129if (unlikely(p_index < 0 || p_index >= self->size())) {1130return nullptr;1131}1132return (GDExtensionTypePtr)&self->ptr()[p_index];1133}11341135static float *gdextension_packed_float32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1136PackedFloat32Array *self = (PackedFloat32Array *)p_self;1137if (unlikely(p_index < 0 || p_index >= self->size())) {1138return nullptr;1139}1140return &self->ptrw()[p_index];1141}11421143static const float *gdextension_packed_float32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1144const PackedFloat32Array *self = (const PackedFloat32Array *)p_self;1145if (unlikely(p_index < 0 || p_index >= self->size())) {1146return nullptr;1147}1148return &self->ptr()[p_index];1149}11501151static double *gdextension_packed_float64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1152PackedFloat64Array *self = (PackedFloat64Array *)p_self;1153if (unlikely(p_index < 0 || p_index >= self->size())) {1154return nullptr;1155}1156return &self->ptrw()[p_index];1157}11581159static const double *gdextension_packed_float64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1160const PackedFloat64Array *self = (const PackedFloat64Array *)p_self;1161if (unlikely(p_index < 0 || p_index >= self->size())) {1162return nullptr;1163}1164return &self->ptr()[p_index];1165}11661167static int32_t *gdextension_packed_int32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1168PackedInt32Array *self = (PackedInt32Array *)p_self;1169if (unlikely(p_index < 0 || p_index >= self->size())) {1170return nullptr;1171}1172return &self->ptrw()[p_index];1173}11741175static const int32_t *gdextension_packed_int32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1176const PackedInt32Array *self = (const PackedInt32Array *)p_self;1177if (unlikely(p_index < 0 || p_index >= self->size())) {1178return nullptr;1179}1180return &self->ptr()[p_index];1181}11821183static int64_t *gdextension_packed_int64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1184PackedInt64Array *self = (PackedInt64Array *)p_self;1185if (unlikely(p_index < 0 || p_index >= self->size())) {1186return nullptr;1187}1188return &self->ptrw()[p_index];1189}11901191static const int64_t *gdextension_packed_int64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1192const PackedInt64Array *self = (const PackedInt64Array *)p_self;1193if (unlikely(p_index < 0 || p_index >= self->size())) {1194return nullptr;1195}1196return &self->ptr()[p_index];1197}11981199static GDExtensionStringPtr gdextension_packed_string_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1200PackedStringArray *self = (PackedStringArray *)p_self;1201if (unlikely(p_index < 0 || p_index >= self->size())) {1202return nullptr;1203}1204return (GDExtensionStringPtr)&self->ptrw()[p_index];1205}12061207static GDExtensionStringPtr gdextension_packed_string_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1208const PackedStringArray *self = (const PackedStringArray *)p_self;1209if (unlikely(p_index < 0 || p_index >= self->size())) {1210return nullptr;1211}1212return (GDExtensionStringPtr)&self->ptr()[p_index];1213}12141215static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1216PackedVector2Array *self = (PackedVector2Array *)p_self;1217if (unlikely(p_index < 0 || p_index >= self->size())) {1218return nullptr;1219}1220return (GDExtensionTypePtr)&self->ptrw()[p_index];1221}12221223static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1224const PackedVector2Array *self = (const PackedVector2Array *)p_self;1225if (unlikely(p_index < 0 || p_index >= self->size())) {1226return nullptr;1227}1228return (GDExtensionTypePtr)&self->ptr()[p_index];1229}12301231static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1232PackedVector3Array *self = (PackedVector3Array *)p_self;1233if (unlikely(p_index < 0 || p_index >= self->size())) {1234return nullptr;1235}1236return (GDExtensionTypePtr)&self->ptrw()[p_index];1237}12381239static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1240const PackedVector3Array *self = (const PackedVector3Array *)p_self;1241if (unlikely(p_index < 0 || p_index >= self->size())) {1242return nullptr;1243}1244return (GDExtensionTypePtr)&self->ptr()[p_index];1245}12461247static GDExtensionTypePtr gdextension_packed_vector4_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1248PackedVector4Array *self = (PackedVector4Array *)p_self;1249if (unlikely(p_index < 0 || p_index >= self->size())) {1250return nullptr;1251}1252return (GDExtensionTypePtr)&self->ptrw()[p_index];1253}12541255static GDExtensionTypePtr gdextension_packed_vector4_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1256const PackedVector4Array *self = (const PackedVector4Array *)p_self;1257if (unlikely(p_index < 0 || p_index >= self->size())) {1258return nullptr;1259}1260return (GDExtensionTypePtr)&self->ptr()[p_index];1261}12621263static GDExtensionVariantPtr gdextension_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1264Array *self = (Array *)p_self;1265if (unlikely(p_index < 0 || p_index >= self->size())) {1266return nullptr;1267}1268return (GDExtensionVariantPtr)&self->operator[](p_index);1269}12701271static GDExtensionVariantPtr gdextension_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1272const Array *self = (const Array *)p_self;1273if (unlikely(p_index < 0 || p_index >= self->size())) {1274return nullptr;1275}1276return (GDExtensionVariantPtr)&self->operator[](p_index);1277}12781279#ifndef DISABLE_DEPRECATED1280void gdextension_array_ref(GDExtensionTypePtr p_self, GDExtensionConstTypePtr p_from) {1281Array *self = (Array *)p_self;1282const Array *from = (const Array *)p_from;1283self->Array::operator=(*from);1284}1285#endif // DISABLE_DEPRECATED12861287void gdextension_array_set_typed(GDExtensionTypePtr p_self, GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstVariantPtr p_script) {1288Array *self = reinterpret_cast<Array *>(p_self);1289const StringName *class_name = reinterpret_cast<const StringName *>(p_class_name);1290const Variant *script = reinterpret_cast<const Variant *>(p_script);1291self->set_typed((uint32_t)p_type, *class_name, *script);1292}12931294/* Dictionary functions */12951296static GDExtensionVariantPtr gdextension_dictionary_operator_index(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key) {1297Dictionary *self = (Dictionary *)p_self;1298return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key);1299}13001301static GDExtensionVariantPtr gdextension_dictionary_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key) {1302const Dictionary *self = (const Dictionary *)p_self;1303return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key);1304}13051306void gdextension_dictionary_set_typed(GDExtensionTypePtr p_self, GDExtensionVariantType p_key_type, GDExtensionConstStringNamePtr p_key_class_name, GDExtensionConstVariantPtr p_key_script, GDExtensionVariantType p_value_type, GDExtensionConstStringNamePtr p_value_class_name, GDExtensionConstVariantPtr p_value_script) {1307Dictionary *self = reinterpret_cast<Dictionary *>(p_self);1308const StringName *key_class_name = reinterpret_cast<const StringName *>(p_key_class_name);1309const Variant *key_script = reinterpret_cast<const Variant *>(p_key_script);1310const StringName *value_class_name = reinterpret_cast<const StringName *>(p_value_class_name);1311const Variant *value_script = reinterpret_cast<const Variant *>(p_value_script);1312self->set_typed((uint32_t)p_key_type, *key_class_name, *key_script, (uint32_t)p_value_type, *value_class_name, *value_script);1313}13141315/* OBJECT API */13161317static void gdextension_object_method_bind_call(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {1318const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);1319Object *o = (Object *)p_instance;1320const Variant **args = (const Variant **)p_args;1321Callable::CallError error;13221323memnew_placement(r_return, Variant(mb->call(o, args, p_arg_count, error)));13241325if (r_error) {1326r_error->error = (GDExtensionCallErrorType)(error.error);1327r_error->argument = error.argument;1328r_error->expected = error.expected;1329}1330}13311332static void gdextension_object_method_bind_ptrcall(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr p_ret) {1333const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);1334Object *o = (Object *)p_instance;1335mb->ptrcall(o, (const void **)p_args, p_ret);1336}13371338static void gdextension_object_destroy(GDExtensionObjectPtr p_o) {1339memdelete((Object *)p_o);1340}13411342static GDExtensionObjectPtr gdextension_global_get_singleton(GDExtensionConstStringNamePtr p_name) {1343const StringName name = *reinterpret_cast<const StringName *>(p_name);1344return (GDExtensionObjectPtr)Engine::get_singleton()->get_singleton_object(name);1345}13461347static void *gdextension_object_get_instance_binding(GDExtensionObjectPtr p_object, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {1348Object *o = (Object *)p_object;1349return o->get_instance_binding(p_token, p_callbacks);1350}13511352static void gdextension_object_set_instance_binding(GDExtensionObjectPtr p_object, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) {1353Object *o = (Object *)p_object;1354o->set_instance_binding(p_token, p_binding, p_callbacks);1355}13561357static void gdextension_object_free_instance_binding(GDExtensionObjectPtr p_object, void *p_token) {1358Object *o = (Object *)p_object;1359o->free_instance_binding(p_token);1360}13611362static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {1363const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1364Object *o = (Object *)p_object;1365ClassDB::set_object_extension_instance(o, classname, p_instance);1366}13671368static GDExtensionObjectPtr gdextension_object_get_instance_from_id(GDObjectInstanceID p_instance_id) {1369return (GDExtensionObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id));1370}13711372static GDExtensionBool gdextension_object_get_class_name(GDExtensionConstObjectPtr p_object, GDExtensionClassLibraryPtr p_library, GDExtensionUninitializedStringNamePtr r_class_name) {1373if (!p_object) {1374return false;1375}1376const Object *o = (const Object *)p_object;13771378memnew_placement(r_class_name, StringName);1379StringName *class_name = reinterpret_cast<StringName *>(r_class_name);1380*class_name = o->get_class_name_for_extension((GDExtension *)p_library);13811382return true;1383}13841385static GDExtensionObjectPtr gdextension_object_cast_to(GDExtensionConstObjectPtr p_object, void *p_class_tag) {1386if (!p_object) {1387return nullptr;1388}1389Object *o = (Object *)p_object;13901391return o->is_class_ptr(p_class_tag) ? (GDExtensionObjectPtr)o : (GDExtensionObjectPtr) nullptr;1392}13931394static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObjectPtr p_object) {1395const Object *o = (const Object *)p_object;1396return (GDObjectInstanceID)o->get_instance_id();1397}13981399static GDExtensionBool gdextension_object_has_script_method(GDExtensionConstObjectPtr p_object, GDExtensionConstStringNamePtr p_method) {1400Object *o = (Object *)p_object;1401const StringName method = *reinterpret_cast<const StringName *>(p_method);14021403ScriptInstance *script_instance = o->get_script_instance();1404if (script_instance) {1405return script_instance->has_method(method);1406}1407return false;1408}14091410static void gdextension_object_call_script_method(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {1411Object *o = (Object *)p_object;1412const StringName method = *reinterpret_cast<const StringName *>(p_method);1413const Variant **args = (const Variant **)p_args;14141415Callable::CallError error; // TODO: Check `error`?1416memnew_placement(r_return, Variant);1417*(Variant *)r_return = o->callp(method, args, p_argument_count, error);14181419if (r_error) {1420r_error->error = (GDExtensionCallErrorType)(error.error);1421r_error->argument = error.argument;1422r_error->expected = error.expected;1423}1424}14251426static GDExtensionObjectPtr gdextension_ref_get_object(GDExtensionConstRefPtr p_ref) {1427const Ref<RefCounted> *ref = (const Ref<RefCounted> *)p_ref;1428if (ref == nullptr || ref->is_null()) {1429return (GDExtensionObjectPtr) nullptr;1430} else {1431return (GDExtensionObjectPtr)ref->ptr();1432}1433}14341435static void gdextension_ref_set_object(GDExtensionRefPtr p_ref, GDExtensionObjectPtr p_object) {1436Ref<RefCounted> *ref = (Ref<RefCounted> *)p_ref;1437ERR_FAIL_NULL(ref);14381439Object *o = (RefCounted *)p_object;1440ref->reference_ptr(o);1441}14421443#ifndef DISABLE_DEPRECATED1444static GDExtensionScriptInstancePtr gdextension_script_instance_create(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {1445GDExtensionScriptInstanceInfo3 *info_3 = memnew(GDExtensionScriptInstanceInfo3);1446info_3->set_func = p_info->set_func;1447info_3->get_func = p_info->get_func;1448info_3->get_property_list_func = p_info->get_property_list_func;1449info_3->free_property_list_func = nullptr;1450info_3->get_class_category_func = nullptr;1451info_3->property_can_revert_func = p_info->property_can_revert_func;1452info_3->property_get_revert_func = p_info->property_get_revert_func;1453info_3->get_owner_func = p_info->get_owner_func;1454info_3->get_property_state_func = p_info->get_property_state_func;1455info_3->get_method_list_func = p_info->get_method_list_func;1456info_3->free_method_list_func = nullptr;1457info_3->get_property_type_func = p_info->get_property_type_func;1458info_3->validate_property_func = nullptr;1459info_3->has_method_func = p_info->has_method_func;1460info_3->get_method_argument_count_func = nullptr;1461info_3->call_func = p_info->call_func;1462info_3->notification_func = nullptr;1463info_3->to_string_func = p_info->to_string_func;1464info_3->refcount_incremented_func = p_info->refcount_incremented_func;1465info_3->refcount_decremented_func = p_info->refcount_decremented_func;1466info_3->get_script_func = p_info->get_script_func;1467info_3->is_placeholder_func = p_info->is_placeholder_func;1468info_3->set_fallback_func = p_info->set_fallback_func;1469info_3->get_fallback_func = p_info->get_fallback_func;1470info_3->get_language_func = p_info->get_language_func;1471info_3->free_func = p_info->free_func;14721473ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);1474script_instance_extension->instance = p_instance_data;1475script_instance_extension->native_info = info_3;1476script_instance_extension->free_native_info = true;1477script_instance_extension->deprecated_native_info = memnew(ScriptInstanceExtension::DeprecatedNativeInfo);1478script_instance_extension->deprecated_native_info->notification_func = p_info->notification_func;1479script_instance_extension->deprecated_native_info->free_property_list_func = p_info->free_property_list_func;1480script_instance_extension->deprecated_native_info->free_method_list_func = p_info->free_method_list_func;1481return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);1482}14831484static GDExtensionScriptInstancePtr gdextension_script_instance_create2(const GDExtensionScriptInstanceInfo2 *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {1485GDExtensionScriptInstanceInfo3 *info_3 = memnew(GDExtensionScriptInstanceInfo3);1486info_3->set_func = p_info->set_func;1487info_3->get_func = p_info->get_func;1488info_3->get_property_list_func = p_info->get_property_list_func;1489info_3->free_property_list_func = nullptr;1490info_3->get_class_category_func = nullptr;1491info_3->property_can_revert_func = p_info->property_can_revert_func;1492info_3->property_get_revert_func = p_info->property_get_revert_func;1493info_3->get_owner_func = p_info->get_owner_func;1494info_3->get_property_state_func = p_info->get_property_state_func;1495info_3->get_method_list_func = p_info->get_method_list_func;1496info_3->free_method_list_func = nullptr;1497info_3->get_property_type_func = p_info->get_property_type_func;1498info_3->validate_property_func = nullptr;1499info_3->has_method_func = p_info->has_method_func;1500info_3->get_method_argument_count_func = nullptr;1501info_3->call_func = p_info->call_func;1502info_3->notification_func = p_info->notification_func;1503info_3->to_string_func = p_info->to_string_func;1504info_3->refcount_incremented_func = p_info->refcount_incremented_func;1505info_3->refcount_decremented_func = p_info->refcount_decremented_func;1506info_3->get_script_func = p_info->get_script_func;1507info_3->is_placeholder_func = p_info->is_placeholder_func;1508info_3->set_fallback_func = p_info->set_fallback_func;1509info_3->get_fallback_func = p_info->get_fallback_func;1510info_3->get_language_func = p_info->get_language_func;1511info_3->free_func = p_info->free_func;15121513ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);1514script_instance_extension->instance = p_instance_data;1515script_instance_extension->native_info = info_3;1516script_instance_extension->free_native_info = true;1517script_instance_extension->deprecated_native_info = memnew(ScriptInstanceExtension::DeprecatedNativeInfo);1518script_instance_extension->deprecated_native_info->free_property_list_func = p_info->free_property_list_func;1519script_instance_extension->deprecated_native_info->free_method_list_func = p_info->free_method_list_func;1520return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);1521}1522#endif // DISABLE_DEPRECATED15231524static GDExtensionScriptInstancePtr gdextension_script_instance_create3(const GDExtensionScriptInstanceInfo3 *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {1525ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);1526script_instance_extension->instance = p_instance_data;1527script_instance_extension->native_info = p_info;1528return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);1529}15301531static GDExtensionScriptInstancePtr gdextension_placeholder_script_instance_create(GDExtensionObjectPtr p_language, GDExtensionObjectPtr p_script, GDExtensionObjectPtr p_owner) {1532ScriptLanguage *language = (ScriptLanguage *)p_language;1533Ref<Script> script;1534script.reference_ptr((Script *)p_script);1535Object *owner = (Object *)p_owner;15361537PlaceHolderScriptInstance *placeholder = memnew(PlaceHolderScriptInstance(language, script, owner));1538return reinterpret_cast<GDExtensionScriptInstancePtr>(placeholder);1539}15401541static void gdextension_placeholder_script_instance_update(GDExtensionScriptInstancePtr p_placeholder, GDExtensionConstTypePtr p_properties, GDExtensionConstTypePtr p_values) {1542PlaceHolderScriptInstance *placeholder = dynamic_cast<PlaceHolderScriptInstance *>(reinterpret_cast<ScriptInstance *>(p_placeholder));1543ERR_FAIL_NULL_MSG(placeholder, "Unable to update placeholder, expected a PlaceHolderScriptInstance but received an invalid type.");15441545const Array &properties = *reinterpret_cast<const Array *>(p_properties);1546const Dictionary &values = *reinterpret_cast<const Dictionary *>(p_values);15471548List<PropertyInfo> properties_list;1549HashMap<StringName, Variant> values_map;15501551for (int i = 0; i < properties.size(); i++) {1552Dictionary d = properties[i];1553properties_list.push_back(PropertyInfo::from_dict(d));1554}15551556for (const KeyValue<Variant, Variant> &kv : values) {1557values_map.insert(kv.key, kv.value);1558}15591560placeholder->update(properties_list, values_map);1561}15621563static GDExtensionScriptInstancePtr gdextension_object_get_script_instance(GDExtensionConstObjectPtr p_object, GDExtensionConstObjectPtr p_language) {1564if (!p_object || !p_language) {1565return nullptr;1566}15671568const Object *o = (const Object *)p_object;1569ScriptInstanceExtension *script_instance_extension = reinterpret_cast<ScriptInstanceExtension *>(o->get_script_instance());1570if (!script_instance_extension) {1571return nullptr;1572}15731574const ScriptLanguage *language = script_instance_extension->get_language();1575if (language != p_language) {1576return nullptr;1577}15781579return script_instance_extension->instance;1580}15811582static void gdextension_object_set_script_instance(GDExtensionObjectPtr p_object, GDExtensionScriptInstancePtr p_script_instance) {1583ERR_FAIL_NULL(p_object);15841585Object *o = (Object *)p_object;1586ScriptInstance *script_instance = (ScriptInstanceExtension *)p_script_instance;15871588o->set_script_instance(script_instance);1589}15901591#ifndef DISABLE_DEPRECATED1592static void gdextension_callable_custom_create(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo *p_custom_callable_info) {1593memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));1594}1595#endif15961597static void gdextension_callable_custom_create2(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo2 *p_custom_callable_info) {1598memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));1599}16001601static void *gdextension_callable_custom_get_userdata(GDExtensionTypePtr p_callable, void *p_token) {1602const Callable &callable = *reinterpret_cast<const Callable *>(p_callable);1603if (!callable.is_custom()) {1604return nullptr;1605}1606const CallableCustomExtension *custom_callable = dynamic_cast<const CallableCustomExtension *>(callable.get_custom());1607if (!custom_callable) {1608return nullptr;1609}1610return custom_callable->get_userdata(p_token);1611}16121613static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash) {1614const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1615const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname);1616bool exists = false;1617MethodBind *mb = ClassDB::get_method_with_compatibility(classname, methodname, p_hash, &exists);16181619#ifndef DISABLE_DEPRECATED1620// If lookup failed, see if this is one of the broken hashes from issue #81386.1621if (!mb && exists) {1622uint32_t mapped_hash;1623if (GDExtensionSpecialCompatHashes::lookup_current_hash(classname, methodname, p_hash, &mapped_hash)) {1624mb = ClassDB::get_method_with_compatibility(classname, methodname, mapped_hash, &exists);1625}1626}1627#endif16281629if (!mb && exists) {1630ERR_PRINT(vformat("Method '%s.%s' has changed and no compatibility fallback has been provided. Please open an issue.", classname, methodname));1631return nullptr;1632}1633ERR_FAIL_NULL_V(mb, nullptr);1634return (GDExtensionMethodBindPtr)mb;1635}16361637#ifndef DISABLE_DEPRECATED1638static GDExtensionObjectPtr gdextension_classdb_construct_object(GDExtensionConstStringNamePtr p_classname) {1639const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1640return (GDExtensionObjectPtr)ClassDB::instantiate_no_placeholders(classname);1641}1642#endif16431644static GDExtensionObjectPtr gdextension_classdb_construct_object2(GDExtensionConstStringNamePtr p_classname) {1645const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1646return (GDExtensionObjectPtr)ClassDB::instantiate_without_postinitialization(classname);1647}16481649static void *gdextension_classdb_get_class_tag(GDExtensionConstStringNamePtr p_classname) {1650const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1651ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(classname);1652return class_info ? class_info->class_ptr : nullptr;1653}16541655static void gdextension_editor_add_plugin(GDExtensionConstStringNamePtr p_classname) {1656#ifdef TOOLS_ENABLED1657const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1658GDExtensionEditorPlugins::add_extension_class(classname);1659#endif1660}16611662static void gdextension_editor_remove_plugin(GDExtensionConstStringNamePtr p_classname) {1663#ifdef TOOLS_ENABLED1664const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1665GDExtensionEditorPlugins::remove_extension_class(classname);1666#endif1667}16681669static void gdextension_editor_help_load_xml_from_utf8_chars_and_len(const char *p_data, GDExtensionInt p_size) {1670#ifdef TOOLS_ENABLED1671GDExtensionEditorHelp::load_xml_buffer((const uint8_t *)p_data, p_size);1672#endif1673}16741675static void gdextension_editor_help_load_xml_from_utf8_chars(const char *p_data) {1676#ifdef TOOLS_ENABLED1677size_t len = strlen(p_data);1678gdextension_editor_help_load_xml_from_utf8_chars_and_len(p_data, len);1679#endif1680}16811682#define REGISTER_INTERFACE_FUNC(m_name) GDExtension::register_interface_function(#m_name, (GDExtensionInterfaceFunctionPtr) & gdextension_##m_name)16831684void gdextension_setup_interface() {1685#ifndef DISABLE_DEPRECATED1686REGISTER_INTERFACE_FUNC(get_godot_version);1687#endif // DISABLE_DEPRECATED1688REGISTER_INTERFACE_FUNC(get_godot_version2);1689REGISTER_INTERFACE_FUNC(mem_alloc);1690REGISTER_INTERFACE_FUNC(mem_realloc);1691REGISTER_INTERFACE_FUNC(mem_free);1692REGISTER_INTERFACE_FUNC(print_error);1693REGISTER_INTERFACE_FUNC(print_error_with_message);1694REGISTER_INTERFACE_FUNC(print_warning);1695REGISTER_INTERFACE_FUNC(print_warning_with_message);1696REGISTER_INTERFACE_FUNC(print_script_error);1697REGISTER_INTERFACE_FUNC(print_script_error_with_message);1698REGISTER_INTERFACE_FUNC(get_native_struct_size);1699REGISTER_INTERFACE_FUNC(variant_new_copy);1700REGISTER_INTERFACE_FUNC(variant_new_nil);1701REGISTER_INTERFACE_FUNC(variant_destroy);1702REGISTER_INTERFACE_FUNC(variant_call);1703REGISTER_INTERFACE_FUNC(variant_call_static);1704REGISTER_INTERFACE_FUNC(variant_evaluate);1705REGISTER_INTERFACE_FUNC(variant_set);1706REGISTER_INTERFACE_FUNC(variant_set_named);1707REGISTER_INTERFACE_FUNC(variant_set_keyed);1708REGISTER_INTERFACE_FUNC(variant_set_indexed);1709REGISTER_INTERFACE_FUNC(variant_get);1710REGISTER_INTERFACE_FUNC(variant_get_named);1711REGISTER_INTERFACE_FUNC(variant_get_keyed);1712REGISTER_INTERFACE_FUNC(variant_get_indexed);1713REGISTER_INTERFACE_FUNC(variant_iter_init);1714REGISTER_INTERFACE_FUNC(variant_iter_next);1715REGISTER_INTERFACE_FUNC(variant_iter_get);1716REGISTER_INTERFACE_FUNC(variant_hash);1717REGISTER_INTERFACE_FUNC(variant_recursive_hash);1718REGISTER_INTERFACE_FUNC(variant_hash_compare);1719REGISTER_INTERFACE_FUNC(variant_booleanize);1720REGISTER_INTERFACE_FUNC(variant_duplicate);1721REGISTER_INTERFACE_FUNC(variant_stringify);1722REGISTER_INTERFACE_FUNC(variant_get_type);1723REGISTER_INTERFACE_FUNC(variant_has_method);1724REGISTER_INTERFACE_FUNC(variant_has_member);1725REGISTER_INTERFACE_FUNC(variant_has_key);1726REGISTER_INTERFACE_FUNC(variant_get_object_instance_id);1727REGISTER_INTERFACE_FUNC(variant_get_type_name);1728REGISTER_INTERFACE_FUNC(variant_can_convert);1729REGISTER_INTERFACE_FUNC(variant_can_convert_strict);1730REGISTER_INTERFACE_FUNC(get_variant_from_type_constructor);1731REGISTER_INTERFACE_FUNC(get_variant_to_type_constructor);1732REGISTER_INTERFACE_FUNC(variant_get_ptr_internal_getter);1733REGISTER_INTERFACE_FUNC(variant_get_ptr_operator_evaluator);1734REGISTER_INTERFACE_FUNC(variant_get_ptr_builtin_method);1735REGISTER_INTERFACE_FUNC(variant_get_ptr_constructor);1736REGISTER_INTERFACE_FUNC(variant_get_ptr_destructor);1737REGISTER_INTERFACE_FUNC(variant_construct);1738REGISTER_INTERFACE_FUNC(variant_get_ptr_setter);1739REGISTER_INTERFACE_FUNC(variant_get_ptr_getter);1740REGISTER_INTERFACE_FUNC(variant_get_ptr_indexed_setter);1741REGISTER_INTERFACE_FUNC(variant_get_ptr_indexed_getter);1742REGISTER_INTERFACE_FUNC(variant_get_ptr_keyed_setter);1743REGISTER_INTERFACE_FUNC(variant_get_ptr_keyed_getter);1744REGISTER_INTERFACE_FUNC(variant_get_ptr_keyed_checker);1745REGISTER_INTERFACE_FUNC(variant_get_constant_value);1746REGISTER_INTERFACE_FUNC(variant_get_ptr_utility_function);1747REGISTER_INTERFACE_FUNC(string_new_with_latin1_chars);1748REGISTER_INTERFACE_FUNC(string_new_with_utf8_chars);1749REGISTER_INTERFACE_FUNC(string_new_with_utf16_chars);1750REGISTER_INTERFACE_FUNC(string_new_with_utf32_chars);1751REGISTER_INTERFACE_FUNC(string_new_with_wide_chars);1752REGISTER_INTERFACE_FUNC(string_new_with_latin1_chars_and_len);1753REGISTER_INTERFACE_FUNC(string_new_with_utf8_chars_and_len);1754REGISTER_INTERFACE_FUNC(string_new_with_utf8_chars_and_len2);1755REGISTER_INTERFACE_FUNC(string_new_with_utf16_chars_and_len);1756REGISTER_INTERFACE_FUNC(string_new_with_utf16_chars_and_len2);1757REGISTER_INTERFACE_FUNC(string_new_with_utf32_chars_and_len);1758REGISTER_INTERFACE_FUNC(string_new_with_wide_chars_and_len);1759REGISTER_INTERFACE_FUNC(string_to_latin1_chars);1760REGISTER_INTERFACE_FUNC(string_to_utf8_chars);1761REGISTER_INTERFACE_FUNC(string_to_utf16_chars);1762REGISTER_INTERFACE_FUNC(string_to_utf32_chars);1763REGISTER_INTERFACE_FUNC(string_to_wide_chars);1764REGISTER_INTERFACE_FUNC(string_operator_index);1765REGISTER_INTERFACE_FUNC(string_operator_index_const);1766REGISTER_INTERFACE_FUNC(string_operator_plus_eq_string);1767REGISTER_INTERFACE_FUNC(string_operator_plus_eq_char);1768REGISTER_INTERFACE_FUNC(string_operator_plus_eq_cstr);1769REGISTER_INTERFACE_FUNC(string_operator_plus_eq_wcstr);1770REGISTER_INTERFACE_FUNC(string_operator_plus_eq_c32str);1771REGISTER_INTERFACE_FUNC(string_resize);1772REGISTER_INTERFACE_FUNC(string_name_new_with_latin1_chars);1773REGISTER_INTERFACE_FUNC(string_name_new_with_utf8_chars);1774REGISTER_INTERFACE_FUNC(string_name_new_with_utf8_chars_and_len);1775REGISTER_INTERFACE_FUNC(xml_parser_open_buffer);1776REGISTER_INTERFACE_FUNC(file_access_store_buffer);1777REGISTER_INTERFACE_FUNC(file_access_get_buffer);1778REGISTER_INTERFACE_FUNC(worker_thread_pool_add_native_group_task);1779REGISTER_INTERFACE_FUNC(worker_thread_pool_add_native_task);1780REGISTER_INTERFACE_FUNC(packed_byte_array_operator_index);1781REGISTER_INTERFACE_FUNC(packed_byte_array_operator_index_const);1782REGISTER_INTERFACE_FUNC(packed_color_array_operator_index);1783REGISTER_INTERFACE_FUNC(packed_color_array_operator_index_const);1784REGISTER_INTERFACE_FUNC(packed_float32_array_operator_index);1785REGISTER_INTERFACE_FUNC(packed_float32_array_operator_index_const);1786REGISTER_INTERFACE_FUNC(packed_float64_array_operator_index);1787REGISTER_INTERFACE_FUNC(packed_float64_array_operator_index_const);1788REGISTER_INTERFACE_FUNC(packed_int32_array_operator_index);1789REGISTER_INTERFACE_FUNC(packed_int32_array_operator_index_const);1790REGISTER_INTERFACE_FUNC(packed_int64_array_operator_index);1791REGISTER_INTERFACE_FUNC(packed_int64_array_operator_index_const);1792REGISTER_INTERFACE_FUNC(packed_string_array_operator_index);1793REGISTER_INTERFACE_FUNC(packed_string_array_operator_index_const);1794REGISTER_INTERFACE_FUNC(packed_vector2_array_operator_index);1795REGISTER_INTERFACE_FUNC(packed_vector2_array_operator_index_const);1796REGISTER_INTERFACE_FUNC(packed_vector3_array_operator_index);1797REGISTER_INTERFACE_FUNC(packed_vector3_array_operator_index_const);1798REGISTER_INTERFACE_FUNC(packed_vector4_array_operator_index);1799REGISTER_INTERFACE_FUNC(packed_vector4_array_operator_index_const);1800REGISTER_INTERFACE_FUNC(array_operator_index);1801REGISTER_INTERFACE_FUNC(array_operator_index_const);1802#ifndef DISABLE_DEPRECATED1803REGISTER_INTERFACE_FUNC(array_ref);1804#endif // DISABLE_DEPRECATED1805REGISTER_INTERFACE_FUNC(array_set_typed);1806REGISTER_INTERFACE_FUNC(dictionary_operator_index);1807REGISTER_INTERFACE_FUNC(dictionary_operator_index_const);1808REGISTER_INTERFACE_FUNC(dictionary_set_typed);1809REGISTER_INTERFACE_FUNC(object_method_bind_call);1810REGISTER_INTERFACE_FUNC(object_method_bind_ptrcall);1811REGISTER_INTERFACE_FUNC(object_destroy);1812REGISTER_INTERFACE_FUNC(global_get_singleton);1813REGISTER_INTERFACE_FUNC(object_get_instance_binding);1814REGISTER_INTERFACE_FUNC(object_set_instance_binding);1815REGISTER_INTERFACE_FUNC(object_free_instance_binding);1816REGISTER_INTERFACE_FUNC(object_set_instance);1817REGISTER_INTERFACE_FUNC(object_get_class_name);1818REGISTER_INTERFACE_FUNC(object_cast_to);1819REGISTER_INTERFACE_FUNC(object_get_instance_from_id);1820REGISTER_INTERFACE_FUNC(object_get_instance_id);1821REGISTER_INTERFACE_FUNC(object_has_script_method);1822REGISTER_INTERFACE_FUNC(object_call_script_method);1823REGISTER_INTERFACE_FUNC(ref_get_object);1824REGISTER_INTERFACE_FUNC(ref_set_object);1825#ifndef DISABLE_DEPRECATED1826REGISTER_INTERFACE_FUNC(script_instance_create);1827REGISTER_INTERFACE_FUNC(script_instance_create2);1828#endif // DISABLE_DEPRECATED1829REGISTER_INTERFACE_FUNC(script_instance_create3);1830REGISTER_INTERFACE_FUNC(placeholder_script_instance_create);1831REGISTER_INTERFACE_FUNC(placeholder_script_instance_update);1832REGISTER_INTERFACE_FUNC(object_get_script_instance);1833REGISTER_INTERFACE_FUNC(object_set_script_instance);1834#ifndef DISABLE_DEPRECATED1835REGISTER_INTERFACE_FUNC(callable_custom_create);1836#endif // DISABLE_DEPRECATED1837REGISTER_INTERFACE_FUNC(callable_custom_create2);1838REGISTER_INTERFACE_FUNC(callable_custom_get_userdata);1839#ifndef DISABLE_DEPRECATED1840REGISTER_INTERFACE_FUNC(classdb_construct_object);1841#endif // DISABLE_DEPRECATED1842REGISTER_INTERFACE_FUNC(classdb_construct_object2);1843REGISTER_INTERFACE_FUNC(classdb_get_method_bind);1844REGISTER_INTERFACE_FUNC(classdb_get_class_tag);1845REGISTER_INTERFACE_FUNC(editor_add_plugin);1846REGISTER_INTERFACE_FUNC(editor_remove_plugin);1847REGISTER_INTERFACE_FUNC(editor_help_load_xml_from_utf8_chars);1848REGISTER_INTERFACE_FUNC(editor_help_load_xml_from_utf8_chars_and_len);1849REGISTER_INTERFACE_FUNC(image_ptrw);1850REGISTER_INTERFACE_FUNC(image_ptr);1851}18521853#undef REGISTER_INTERFACE_FUNCTION185418551856