Path: blob/master/core/extension/gdextension_interface.cpp
21139 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.gen.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 Functions263#ifndef DISABLE_DEPRECATED264static void *gdextension_mem_alloc(size_t p_size) {265return memalloc(p_size);266}267268static void *gdextension_mem_realloc(void *p_mem, size_t p_size) {269return memrealloc(p_mem, p_size);270}271272static void gdextension_mem_free(void *p_mem) {273memfree(p_mem);274}275#endif276277static void *gdextension_mem_alloc2(size_t p_size, GDExtensionBool p_prepad_align) {278return Memory::alloc_static(p_size, p_prepad_align);279}280281static void *gdextension_mem_realloc2(void *p_mem, size_t p_size, GDExtensionBool p_prepad_align) {282return Memory::realloc_static(p_mem, p_size, p_prepad_align);283}284285static void gdextension_mem_free2(void *p_mem, GDExtensionBool p_prepad_align) {286Memory::free_static(p_mem, p_prepad_align);287}288289// Helper print functions.290static void gdextension_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {291_err_print_error(p_function, p_file, p_line, p_description, p_editor_notify, ERR_HANDLER_ERROR);292}293static 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) {294_err_print_error(p_function, p_file, p_line, p_description, p_message, p_editor_notify, ERR_HANDLER_ERROR);295}296static void gdextension_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line, GDExtensionBool p_editor_notify) {297_err_print_error(p_function, p_file, p_line, p_description, p_editor_notify, ERR_HANDLER_WARNING);298}299static 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) {300_err_print_error(p_function, p_file, p_line, p_description, p_message, p_editor_notify, ERR_HANDLER_WARNING);301}302static 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) {303_err_print_error(p_function, p_file, p_line, p_description, p_editor_notify, ERR_HANDLER_SCRIPT);304}305static 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) {306_err_print_error(p_function, p_file, p_line, p_description, p_message, p_editor_notify, ERR_HANDLER_SCRIPT);307}308309uint64_t gdextension_get_native_struct_size(GDExtensionConstStringNamePtr p_name) {310const StringName name = *reinterpret_cast<const StringName *>(p_name);311return ClassDB::get_native_struct_size(name);312}313314// Variant functions315316static void gdextension_variant_new_copy(GDExtensionUninitializedVariantPtr r_dest, GDExtensionConstVariantPtr p_src) {317memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<const Variant *>(p_src)));318}319static void gdextension_variant_new_nil(GDExtensionUninitializedVariantPtr r_dest) {320memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant);321}322static void gdextension_variant_destroy(GDExtensionVariantPtr p_self) {323reinterpret_cast<Variant *>(p_self)->~Variant();324}325326// variant type327328static void gdextension_variant_call(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {329Variant *self = (Variant *)p_self;330const StringName method = *reinterpret_cast<const StringName *>(p_method);331const Variant **args = (const Variant **)p_args;332Callable::CallError error;333memnew_placement(r_return, Variant);334Variant *ret = reinterpret_cast<Variant *>(r_return);335self->callp(method, args, p_argcount, *ret, error);336337if (r_error) {338r_error->error = (GDExtensionCallErrorType)(error.error);339r_error->argument = error.argument;340r_error->expected = error.expected;341}342}343344static void gdextension_variant_call_static(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) {345Variant::Type type = (Variant::Type)p_type;346const StringName method = *reinterpret_cast<const StringName *>(p_method);347const Variant **args = (const Variant **)p_args;348Callable::CallError error;349memnew_placement(r_return, Variant);350Variant *ret = reinterpret_cast<Variant *>(r_return);351Variant::call_static(type, method, args, p_argcount, *ret, error);352353if (r_error) {354r_error->error = (GDExtensionCallErrorType)error.error;355r_error->argument = error.argument;356r_error->expected = error.expected;357}358}359360static void gdextension_variant_evaluate(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionUninitializedVariantPtr r_return, GDExtensionBool *r_valid) {361Variant::Operator op = (Variant::Operator)p_op;362const Variant *a = (const Variant *)p_a;363const Variant *b = (const Variant *)p_b;364bool valid;365memnew_placement(r_return, Variant);366Variant *ret = reinterpret_cast<Variant *>(r_return);367Variant::evaluate(op, *a, *b, *ret, valid);368*r_valid = valid;369}370371static void gdextension_variant_set(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {372Variant *self = (Variant *)p_self;373const Variant *key = (const Variant *)p_key;374const Variant *value = (const Variant *)p_value;375376bool valid;377self->set(*key, *value, &valid);378*r_valid = valid;379}380381static void gdextension_variant_set_named(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {382Variant *self = (Variant *)p_self;383const StringName *key = (const StringName *)p_key;384const Variant *value = (const Variant *)p_value;385386bool valid;387self->set_named(*key, *value, valid);388*r_valid = valid;389}390391static void gdextension_variant_set_keyed(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) {392Variant *self = (Variant *)p_self;393const Variant *key = (const Variant *)p_key;394const Variant *value = (const Variant *)p_value;395396bool valid;397self->set_keyed(*key, *value, valid);398*r_valid = valid;399}400401static void gdextension_variant_set_indexed(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob) {402Variant *self = (Variant *)p_self;403const Variant *value = (const Variant *)p_value;404405bool valid;406bool oob;407self->set_indexed(p_index, *value, valid, oob);408*r_valid = valid;409*r_oob = oob;410}411412static void gdextension_variant_get(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {413const Variant *self = (const Variant *)p_self;414const Variant *key = (const Variant *)p_key;415416bool valid;417memnew_placement(r_ret, Variant(self->get(*key, &valid)));418*r_valid = valid;419}420421static void gdextension_variant_get_named(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {422const Variant *self = (const Variant *)p_self;423const StringName *key = (const StringName *)p_key;424425bool valid;426memnew_placement(r_ret, Variant(self->get_named(*key, valid)));427*r_valid = valid;428}429430static void gdextension_variant_get_keyed(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {431const Variant *self = (const Variant *)p_self;432const Variant *key = (const Variant *)p_key;433434bool valid;435memnew_placement(r_ret, Variant(self->get_keyed(*key, valid)));436*r_valid = valid;437}438439static void gdextension_variant_get_indexed(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob) {440const Variant *self = (const Variant *)p_self;441442bool valid;443bool oob;444memnew_placement(r_ret, Variant(self->get_indexed(p_index, valid, oob)));445*r_valid = valid;446*r_oob = oob;447}448449/// Iteration.450static GDExtensionBool gdextension_variant_iter_init(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_iter, GDExtensionBool *r_valid) {451const Variant *self = (const Variant *)p_self;452memnew_placement(r_iter, Variant);453Variant *iter = reinterpret_cast<Variant *>(r_iter);454455bool valid;456bool ret = self->iter_init(*iter, valid);457*r_valid = valid;458return ret;459}460461static GDExtensionBool gdextension_variant_iter_next(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid) {462const Variant *self = (const Variant *)p_self;463Variant *iter = (Variant *)r_iter;464465bool valid;466bool ret = self->iter_next(*iter, valid);467*r_valid = valid;468return ret;469}470471static void gdextension_variant_iter_get(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool *r_valid) {472const Variant *self = (const Variant *)p_self;473Variant *iter = (Variant *)r_iter;474475bool valid;476memnew_placement(r_ret, Variant(self->iter_get(*iter, valid)));477*r_valid = valid;478}479480/// Variant functions.481static GDExtensionInt gdextension_variant_hash(GDExtensionConstVariantPtr p_self) {482const Variant *self = (const Variant *)p_self;483return self->hash();484}485486static GDExtensionInt gdextension_variant_recursive_hash(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count) {487const Variant *self = (const Variant *)p_self;488return self->recursive_hash(p_recursion_count);489}490491static GDExtensionBool gdextension_variant_hash_compare(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other) {492const Variant *self = (const Variant *)p_self;493const Variant *other = (const Variant *)p_other;494return self->hash_compare(*other);495}496497static GDExtensionBool gdextension_variant_booleanize(GDExtensionConstVariantPtr p_self) {498const Variant *self = (const Variant *)p_self;499return self->booleanize();500}501502static void gdextension_variant_duplicate(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_ret, GDExtensionBool p_deep) {503const Variant *self = (const Variant *)p_self;504memnew_placement(r_ret, Variant(self->duplicate(p_deep)));505}506507static void gdextension_variant_stringify(GDExtensionConstVariantPtr p_self, GDExtensionUninitializedVariantPtr r_ret) {508const Variant *self = (const Variant *)p_self;509memnew_placement(r_ret, String(*self));510}511512static GDExtensionVariantType gdextension_variant_get_type(GDExtensionConstVariantPtr p_self) {513const Variant *self = (const Variant *)p_self;514return (GDExtensionVariantType)self->get_type();515}516517static GDExtensionBool gdextension_variant_has_method(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method) {518const Variant *self = (const Variant *)p_self;519const StringName *method = (const StringName *)p_method;520return self->has_method(*method);521}522523static GDExtensionBool gdextension_variant_has_member(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {524return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member));525}526527static GDExtensionBool gdextension_variant_has_key(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid) {528const Variant *self = (const Variant *)p_self;529const Variant *key = (const Variant *)p_key;530bool valid;531bool ret = self->has_key(*key, valid);532*r_valid = valid;533return ret;534}535536static GDObjectInstanceID gdextension_variant_get_object_instance_id(GDExtensionConstVariantPtr p_self) {537const Variant *self = (const Variant *)p_self;538if (likely(self->get_type() == Variant::OBJECT)) {539return self->operator ObjectID();540}541return 0;542}543544static void gdextension_variant_get_type_name(GDExtensionVariantType p_type, GDExtensionUninitializedVariantPtr r_ret) {545String name = Variant::get_type_name((Variant::Type)p_type);546memnew_placement(r_ret, String(name));547}548549static GDExtensionBool gdextension_variant_can_convert(GDExtensionVariantType p_from, GDExtensionVariantType p_to) {550return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to);551}552553static GDExtensionBool gdextension_variant_can_convert_strict(GDExtensionVariantType p_from, GDExtensionVariantType p_to) {554return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to);555}556557// Variant interaction.558static GDExtensionVariantFromTypeConstructorFunc gdextension_get_variant_from_type_constructor(GDExtensionVariantType p_type) {559switch (p_type) {560case GDEXTENSION_VARIANT_TYPE_BOOL:561return VariantTypeConstructor<bool>::variant_from_type;562case GDEXTENSION_VARIANT_TYPE_INT:563return VariantTypeConstructor<int64_t>::variant_from_type;564case GDEXTENSION_VARIANT_TYPE_FLOAT:565return VariantTypeConstructor<double>::variant_from_type;566case GDEXTENSION_VARIANT_TYPE_STRING:567return VariantTypeConstructor<String>::variant_from_type;568case GDEXTENSION_VARIANT_TYPE_VECTOR2:569return VariantTypeConstructor<Vector2>::variant_from_type;570case GDEXTENSION_VARIANT_TYPE_VECTOR2I:571return VariantTypeConstructor<Vector2i>::variant_from_type;572case GDEXTENSION_VARIANT_TYPE_RECT2:573return VariantTypeConstructor<Rect2>::variant_from_type;574case GDEXTENSION_VARIANT_TYPE_RECT2I:575return VariantTypeConstructor<Rect2i>::variant_from_type;576case GDEXTENSION_VARIANT_TYPE_VECTOR3:577return VariantTypeConstructor<Vector3>::variant_from_type;578case GDEXTENSION_VARIANT_TYPE_VECTOR3I:579return VariantTypeConstructor<Vector3i>::variant_from_type;580case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:581return VariantTypeConstructor<Transform2D>::variant_from_type;582case GDEXTENSION_VARIANT_TYPE_VECTOR4:583return VariantTypeConstructor<Vector4>::variant_from_type;584case GDEXTENSION_VARIANT_TYPE_VECTOR4I:585return VariantTypeConstructor<Vector4i>::variant_from_type;586case GDEXTENSION_VARIANT_TYPE_PLANE:587return VariantTypeConstructor<Plane>::variant_from_type;588case GDEXTENSION_VARIANT_TYPE_QUATERNION:589return VariantTypeConstructor<Quaternion>::variant_from_type;590case GDEXTENSION_VARIANT_TYPE_AABB:591return VariantTypeConstructor<AABB>::variant_from_type;592case GDEXTENSION_VARIANT_TYPE_BASIS:593return VariantTypeConstructor<Basis>::variant_from_type;594case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:595return VariantTypeConstructor<Transform3D>::variant_from_type;596case GDEXTENSION_VARIANT_TYPE_PROJECTION:597return VariantTypeConstructor<Projection>::variant_from_type;598case GDEXTENSION_VARIANT_TYPE_COLOR:599return VariantTypeConstructor<Color>::variant_from_type;600case GDEXTENSION_VARIANT_TYPE_STRING_NAME:601return VariantTypeConstructor<StringName>::variant_from_type;602case GDEXTENSION_VARIANT_TYPE_NODE_PATH:603return VariantTypeConstructor<NodePath>::variant_from_type;604case GDEXTENSION_VARIANT_TYPE_RID:605return VariantTypeConstructor<RID>::variant_from_type;606case GDEXTENSION_VARIANT_TYPE_OBJECT:607return VariantTypeConstructor<Object *>::variant_from_type;608case GDEXTENSION_VARIANT_TYPE_CALLABLE:609return VariantTypeConstructor<Callable>::variant_from_type;610case GDEXTENSION_VARIANT_TYPE_SIGNAL:611return VariantTypeConstructor<Signal>::variant_from_type;612case GDEXTENSION_VARIANT_TYPE_DICTIONARY:613return VariantTypeConstructor<Dictionary>::variant_from_type;614case GDEXTENSION_VARIANT_TYPE_ARRAY:615return VariantTypeConstructor<Array>::variant_from_type;616case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:617return VariantTypeConstructor<PackedByteArray>::variant_from_type;618case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:619return VariantTypeConstructor<PackedInt32Array>::variant_from_type;620case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:621return VariantTypeConstructor<PackedInt64Array>::variant_from_type;622case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:623return VariantTypeConstructor<PackedFloat32Array>::variant_from_type;624case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:625return VariantTypeConstructor<PackedFloat64Array>::variant_from_type;626case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:627return VariantTypeConstructor<PackedStringArray>::variant_from_type;628case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:629return VariantTypeConstructor<PackedVector2Array>::variant_from_type;630case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:631return VariantTypeConstructor<PackedVector3Array>::variant_from_type;632case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:633return VariantTypeConstructor<PackedVector4Array>::variant_from_type;634case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:635return VariantTypeConstructor<PackedColorArray>::variant_from_type;636case GDEXTENSION_VARIANT_TYPE_NIL:637case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:638ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");639}640ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");641}642643static GDExtensionTypeFromVariantConstructorFunc gdextension_get_variant_to_type_constructor(GDExtensionVariantType p_type) {644switch (p_type) {645case GDEXTENSION_VARIANT_TYPE_BOOL:646return VariantTypeConstructor<bool>::type_from_variant;647case GDEXTENSION_VARIANT_TYPE_INT:648return VariantTypeConstructor<int64_t>::type_from_variant;649case GDEXTENSION_VARIANT_TYPE_FLOAT:650return VariantTypeConstructor<double>::type_from_variant;651case GDEXTENSION_VARIANT_TYPE_STRING:652return VariantTypeConstructor<String>::type_from_variant;653case GDEXTENSION_VARIANT_TYPE_VECTOR2:654return VariantTypeConstructor<Vector2>::type_from_variant;655case GDEXTENSION_VARIANT_TYPE_VECTOR2I:656return VariantTypeConstructor<Vector2i>::type_from_variant;657case GDEXTENSION_VARIANT_TYPE_RECT2:658return VariantTypeConstructor<Rect2>::type_from_variant;659case GDEXTENSION_VARIANT_TYPE_RECT2I:660return VariantTypeConstructor<Rect2i>::type_from_variant;661case GDEXTENSION_VARIANT_TYPE_VECTOR3:662return VariantTypeConstructor<Vector3>::type_from_variant;663case GDEXTENSION_VARIANT_TYPE_VECTOR3I:664return VariantTypeConstructor<Vector3i>::type_from_variant;665case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:666return VariantTypeConstructor<Transform2D>::type_from_variant;667case GDEXTENSION_VARIANT_TYPE_VECTOR4:668return VariantTypeConstructor<Vector4>::type_from_variant;669case GDEXTENSION_VARIANT_TYPE_VECTOR4I:670return VariantTypeConstructor<Vector4i>::type_from_variant;671case GDEXTENSION_VARIANT_TYPE_PLANE:672return VariantTypeConstructor<Plane>::type_from_variant;673case GDEXTENSION_VARIANT_TYPE_QUATERNION:674return VariantTypeConstructor<Quaternion>::type_from_variant;675case GDEXTENSION_VARIANT_TYPE_AABB:676return VariantTypeConstructor<AABB>::type_from_variant;677case GDEXTENSION_VARIANT_TYPE_BASIS:678return VariantTypeConstructor<Basis>::type_from_variant;679case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:680return VariantTypeConstructor<Transform3D>::type_from_variant;681case GDEXTENSION_VARIANT_TYPE_PROJECTION:682return VariantTypeConstructor<Projection>::type_from_variant;683case GDEXTENSION_VARIANT_TYPE_COLOR:684return VariantTypeConstructor<Color>::type_from_variant;685case GDEXTENSION_VARIANT_TYPE_STRING_NAME:686return VariantTypeConstructor<StringName>::type_from_variant;687case GDEXTENSION_VARIANT_TYPE_NODE_PATH:688return VariantTypeConstructor<NodePath>::type_from_variant;689case GDEXTENSION_VARIANT_TYPE_RID:690return VariantTypeConstructor<RID>::type_from_variant;691case GDEXTENSION_VARIANT_TYPE_OBJECT:692return VariantTypeConstructor<Object *>::type_from_variant;693case GDEXTENSION_VARIANT_TYPE_CALLABLE:694return VariantTypeConstructor<Callable>::type_from_variant;695case GDEXTENSION_VARIANT_TYPE_SIGNAL:696return VariantTypeConstructor<Signal>::type_from_variant;697case GDEXTENSION_VARIANT_TYPE_DICTIONARY:698return VariantTypeConstructor<Dictionary>::type_from_variant;699case GDEXTENSION_VARIANT_TYPE_ARRAY:700return VariantTypeConstructor<Array>::type_from_variant;701case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:702return VariantTypeConstructor<PackedByteArray>::type_from_variant;703case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:704return VariantTypeConstructor<PackedInt32Array>::type_from_variant;705case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:706return VariantTypeConstructor<PackedInt64Array>::type_from_variant;707case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:708return VariantTypeConstructor<PackedFloat32Array>::type_from_variant;709case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:710return VariantTypeConstructor<PackedFloat64Array>::type_from_variant;711case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:712return VariantTypeConstructor<PackedStringArray>::type_from_variant;713case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:714return VariantTypeConstructor<PackedVector2Array>::type_from_variant;715case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:716return VariantTypeConstructor<PackedVector3Array>::type_from_variant;717case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:718return VariantTypeConstructor<PackedVector4Array>::type_from_variant;719case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:720return VariantTypeConstructor<PackedColorArray>::type_from_variant;721case GDEXTENSION_VARIANT_TYPE_NIL:722case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:723ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");724}725ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type");726}727728static GDExtensionVariantGetInternalPtrFunc gdextension_variant_get_ptr_internal_getter(GDExtensionVariantType p_type) {729switch (p_type) {730case GDEXTENSION_VARIANT_TYPE_BOOL:731return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<bool *(*)(Variant *)>(VariantInternal::get_bool));732case GDEXTENSION_VARIANT_TYPE_INT:733return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<int64_t *(*)(Variant *)>(VariantInternal::get_int));734case GDEXTENSION_VARIANT_TYPE_FLOAT:735return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<double *(*)(Variant *)>(VariantInternal::get_float));736case GDEXTENSION_VARIANT_TYPE_STRING:737return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<String *(*)(Variant *)>(VariantInternal::get_string));738case GDEXTENSION_VARIANT_TYPE_VECTOR2:739return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector2 *(*)(Variant *)>(VariantInternal::get_vector2));740case GDEXTENSION_VARIANT_TYPE_VECTOR2I:741return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector2i *(*)(Variant *)>(VariantInternal::get_vector2i));742case GDEXTENSION_VARIANT_TYPE_RECT2:743return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Rect2 *(*)(Variant *)>(VariantInternal::get_rect2));744case GDEXTENSION_VARIANT_TYPE_RECT2I:745return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Rect2i *(*)(Variant *)>(VariantInternal::get_rect2i));746case GDEXTENSION_VARIANT_TYPE_VECTOR3:747return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector3 *(*)(Variant *)>(VariantInternal::get_vector3));748case GDEXTENSION_VARIANT_TYPE_VECTOR3I:749return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector3i *(*)(Variant *)>(VariantInternal::get_vector3i));750case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D:751return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Transform2D *(*)(Variant *)>(VariantInternal::get_transform2d));752case GDEXTENSION_VARIANT_TYPE_VECTOR4:753return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector4 *(*)(Variant *)>(VariantInternal::get_vector4));754case GDEXTENSION_VARIANT_TYPE_VECTOR4I:755return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Vector4i *(*)(Variant *)>(VariantInternal::get_vector4i));756case GDEXTENSION_VARIANT_TYPE_PLANE:757return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Plane *(*)(Variant *)>(VariantInternal::get_plane));758case GDEXTENSION_VARIANT_TYPE_QUATERNION:759return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Quaternion *(*)(Variant *)>(VariantInternal::get_quaternion));760case GDEXTENSION_VARIANT_TYPE_AABB:761return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<AABB *(*)(Variant *)>(VariantInternal::get_aabb));762case GDEXTENSION_VARIANT_TYPE_BASIS:763return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Basis *(*)(Variant *)>(VariantInternal::get_basis));764case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D:765return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Transform3D *(*)(Variant *)>(VariantInternal::get_transform));766case GDEXTENSION_VARIANT_TYPE_PROJECTION:767return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Projection *(*)(Variant *)>(VariantInternal::get_projection));768case GDEXTENSION_VARIANT_TYPE_COLOR:769return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Color *(*)(Variant *)>(VariantInternal::get_color));770case GDEXTENSION_VARIANT_TYPE_STRING_NAME:771return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<StringName *(*)(Variant *)>(VariantInternal::get_string_name));772case GDEXTENSION_VARIANT_TYPE_NODE_PATH:773return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<NodePath *(*)(Variant *)>(VariantInternal::get_node_path));774case GDEXTENSION_VARIANT_TYPE_RID:775return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<RID *(*)(Variant *)>(VariantInternal::get_rid));776case GDEXTENSION_VARIANT_TYPE_OBJECT:777return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Object **(*)(Variant *)>(VariantInternal::get_object));778case GDEXTENSION_VARIANT_TYPE_CALLABLE:779return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Callable *(*)(Variant *)>(VariantInternal::get_callable));780case GDEXTENSION_VARIANT_TYPE_SIGNAL:781return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Signal *(*)(Variant *)>(VariantInternal::get_signal));782case GDEXTENSION_VARIANT_TYPE_DICTIONARY:783return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Dictionary *(*)(Variant *)>(VariantInternal::get_dictionary));784case GDEXTENSION_VARIANT_TYPE_ARRAY:785return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<Array *(*)(Variant *)>(VariantInternal::get_array));786case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY:787return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedByteArray *(*)(Variant *)>(VariantInternal::get_byte_array));788case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY:789return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedInt32Array *(*)(Variant *)>(VariantInternal::get_int32_array));790case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY:791return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedInt64Array *(*)(Variant *)>(VariantInternal::get_int64_array));792case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY:793return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedFloat32Array *(*)(Variant *)>(VariantInternal::get_float32_array));794case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY:795return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedFloat64Array *(*)(Variant *)>(VariantInternal::get_float64_array));796case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY:797return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedStringArray *(*)(Variant *)>(VariantInternal::get_string_array));798case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY:799return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedVector2Array *(*)(Variant *)>(VariantInternal::get_vector2_array));800case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:801return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedVector3Array *(*)(Variant *)>(VariantInternal::get_vector3_array));802case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:803return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedColorArray *(*)(Variant *)>(VariantInternal::get_color_array));804case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:805return reinterpret_cast<GDExtensionVariantGetInternalPtrFunc>(static_cast<PackedVector4Array *(*)(Variant *)>(VariantInternal::get_vector4_array));806case GDEXTENSION_VARIANT_TYPE_NIL:807case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX:808ERR_FAIL_V_MSG(nullptr, "Getting Variant get internal pointer function with invalid type.");809}810ERR_FAIL_V_MSG(nullptr, "Getting Variant get internal pointer function with invalid type.");811}812813// ptrcalls814static GDExtensionPtrOperatorEvaluator gdextension_variant_get_ptr_operator_evaluator(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b) {815return (GDExtensionPtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b));816}817static GDExtensionPtrBuiltInMethod gdextension_variant_get_ptr_builtin_method(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash) {818const StringName method = *reinterpret_cast<const StringName *>(p_method);819GDExtensionPtrBuiltInMethod ptr = (GDExtensionPtrBuiltInMethod)Variant::get_ptr_builtin_method_with_compatibility(Variant::Type(p_type), method, p_hash);820if (!ptr) {821ERR_PRINT("Error getting method " + method + ", missing or hash mismatch.");822}823return ptr;824}825static GDExtensionPtrConstructor gdextension_variant_get_ptr_constructor(GDExtensionVariantType p_type, int32_t p_constructor) {826return (GDExtensionPtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor);827}828static GDExtensionPtrDestructor gdextension_variant_get_ptr_destructor(GDExtensionVariantType p_type) {829return (GDExtensionPtrDestructor)Variant::get_ptr_destructor(Variant::Type(p_type));830}831static void gdextension_variant_construct(GDExtensionVariantType p_type, GDExtensionUninitializedVariantPtr r_base, const GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error) {832memnew_placement(r_base, Variant);833Variant *base = reinterpret_cast<Variant *>(r_base);834835Callable::CallError error;836Variant::construct(Variant::Type(p_type), *base, (const Variant **)p_args, p_argument_count, error);837838if (r_error) {839r_error->error = (GDExtensionCallErrorType)(error.error);840r_error->argument = error.argument;841r_error->expected = error.expected;842}843}844static GDExtensionPtrSetter gdextension_variant_get_ptr_setter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {845const StringName member = *reinterpret_cast<const StringName *>(p_member);846return (GDExtensionPtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), member);847}848static GDExtensionPtrGetter gdextension_variant_get_ptr_getter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) {849const StringName member = *reinterpret_cast<const StringName *>(p_member);850return (GDExtensionPtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), member);851}852static GDExtensionPtrIndexedSetter gdextension_variant_get_ptr_indexed_setter(GDExtensionVariantType p_type) {853return (GDExtensionPtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type));854}855static GDExtensionPtrIndexedGetter gdextension_variant_get_ptr_indexed_getter(GDExtensionVariantType p_type) {856return (GDExtensionPtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type));857}858static GDExtensionPtrKeyedSetter gdextension_variant_get_ptr_keyed_setter(GDExtensionVariantType p_type) {859return (GDExtensionPtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type));860}861static GDExtensionPtrKeyedGetter gdextension_variant_get_ptr_keyed_getter(GDExtensionVariantType p_type) {862return (GDExtensionPtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type));863}864static GDExtensionPtrKeyedChecker gdextension_variant_get_ptr_keyed_checker(GDExtensionVariantType p_type) {865return (GDExtensionPtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type));866}867static void gdextension_variant_get_constant_value(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionUninitializedVariantPtr r_ret) {868StringName constant = *reinterpret_cast<const StringName *>(p_constant);869memnew_placement(r_ret, Variant(Variant::get_constant_value(Variant::Type(p_type), constant)));870}871static GDExtensionPtrUtilityFunction gdextension_variant_get_ptr_utility_function(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash) {872StringName function = *reinterpret_cast<const StringName *>(p_function);873uint32_t hash = Variant::get_utility_function_hash(function);874if (hash != p_hash) {875ERR_PRINT_ONCE("Error getting utility function " + function + ", hash mismatch.");876return nullptr;877}878return (GDExtensionPtrUtilityFunction)Variant::get_ptr_utility_function(function);879}880881//string helpers882883static void gdextension_string_new_with_latin1_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) {884String *dest = memnew_placement(r_dest, String);885dest->append_latin1(Span<char>(p_contents, p_contents ? strlen(p_contents) : 0));886}887888static void gdextension_string_new_with_utf8_chars(GDExtensionUninitializedStringPtr r_dest, const char *p_contents) {889String *dest = memnew_placement(r_dest, String);890dest->append_utf8(p_contents);891}892893static void gdextension_string_new_with_utf16_chars(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents) {894String *dest = memnew_placement(r_dest, String);895dest->append_utf16(p_contents);896}897898static void gdextension_string_new_with_utf32_chars(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents) {899String *dest = memnew_placement(r_dest, String);900dest->append_utf32(Span(p_contents, p_contents ? strlen(p_contents) : 0));901}902903static void gdextension_string_new_with_wide_chars(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents) {904if constexpr (sizeof(wchar_t) == 2) {905// wchar_t is 16 bit (UTF-16).906String *dest = memnew_placement(r_dest, String);907dest->append_utf16((const char16_t *)p_contents);908} else {909// wchar_t is 32 bit (UTF-32).910String *string = memnew_placement(r_dest, String);911string->append_utf32(Span((const char32_t *)p_contents, p_contents ? strlen(p_contents) : 0));912}913}914915static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {916const size_t string_length = p_contents ? (p_size < 0 ? strlen(p_contents) : strnlen(p_contents, p_size)) : 0;917String *dest = memnew_placement(r_dest, String);918dest->append_latin1(Span(p_contents, string_length));919}920921static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {922String *dest = memnew_placement(r_dest, String);923dest->append_utf8(p_contents, p_size);924}925926static GDExtensionInt gdextension_string_new_with_utf8_chars_and_len2(GDExtensionUninitializedStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) {927String *dest = memnew_placement(r_dest, String);928return (GDExtensionInt)dest->append_utf8(p_contents, p_size);929}930931static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_char_count) {932String *dest = memnew_placement(r_dest, String);933dest->append_utf16(p_contents, p_char_count);934}935936static 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) {937String *dest = memnew_placement(r_dest, String);938return (GDExtensionInt)dest->append_utf16(p_contents, p_char_count, p_default_little_endian);939}940941static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_char_count) {942const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen(p_contents, p_char_count)) : 0;943String *string = memnew_placement(r_dest, String);944string->append_utf32(Span(p_contents, string_length));945}946947static void gdextension_string_new_with_wide_chars_and_len(GDExtensionUninitializedStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_char_count) {948if constexpr (sizeof(wchar_t) == 2) {949// wchar_t is 16 bit (UTF-16).950String *dest = memnew_placement(r_dest, String);951dest->append_utf16((const char16_t *)p_contents, p_char_count);952} else {953// wchar_t is 32 bit (UTF-32).954const size_t string_length = p_contents ? (p_char_count < 0 ? strlen(p_contents) : strnlen((const char32_t *)p_contents, p_char_count)) : 0;955String *string = memnew_placement(r_dest, String);956string->append_utf32(Span((const char32_t *)p_contents, string_length));957}958}959960static GDExtensionInt gdextension_string_to_latin1_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {961String *self = (String *)p_self;962CharString cs = self->latin1();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_utf8_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) {973String *self = (String *)p_self;974CharString cs = self->utf8();975GDExtensionInt len = cs.length();976if (r_text) {977const char *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_utf16_chars(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length) {985String *self = (String *)p_self;986Char16String cs = self->utf16();987GDExtensionInt len = cs.length();988if (r_text) {989const char16_t *s_text = cs.ptr();990for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {991r_text[i] = s_text[i];992}993}994return len;995}996static GDExtensionInt gdextension_string_to_utf32_chars(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length) {997String *self = (String *)p_self;998GDExtensionInt len = self->length();999if (r_text) {1000const char32_t *s_text = self->ptr();1001for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) {1002r_text[i] = s_text[i];1003}1004}1005return len;1006}1007static GDExtensionInt gdextension_string_to_wide_chars(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length) {1008if constexpr (sizeof(wchar_t) == 4) {1009return gdextension_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length);1010} else {1011return gdextension_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length);1012}1013}10141015static char32_t *gdextension_string_operator_index(GDExtensionStringPtr p_self, GDExtensionInt p_index) {1016String *self = (String *)p_self;1017if (unlikely(p_index < 0 || p_index >= self->length() + 1)) {1018return nullptr;1019}1020return &self->ptrw()[p_index];1021}10221023static const char32_t *gdextension_string_operator_index_const(GDExtensionConstStringPtr p_self, GDExtensionInt p_index) {1024const String *self = (const String *)p_self;1025if (unlikely(p_index < 0 || p_index >= self->length() + 1)) {1026return nullptr;1027}1028return &self->ptr()[p_index];1029}10301031static void gdextension_string_operator_plus_eq_string(GDExtensionStringPtr p_self, GDExtensionConstStringPtr p_b) {1032String *self = (String *)p_self;1033const String *b = (const String *)p_b;1034*self += *b;1035}10361037static void gdextension_string_operator_plus_eq_char(GDExtensionStringPtr p_self, char32_t p_b) {1038String *self = (String *)p_self;1039*self += p_b;1040}10411042static void gdextension_string_operator_plus_eq_cstr(GDExtensionStringPtr p_self, const char *p_b) {1043String *self = (String *)p_self;1044*self += p_b;1045}10461047static void gdextension_string_operator_plus_eq_wcstr(GDExtensionStringPtr p_self, const wchar_t *p_b) {1048String *self = (String *)p_self;1049*self += p_b;1050}10511052static void gdextension_string_operator_plus_eq_c32str(GDExtensionStringPtr p_self, const char32_t *p_b) {1053String *self = (String *)p_self;1054*self += p_b;1055}10561057static GDExtensionInt gdextension_string_resize(GDExtensionStringPtr p_self, GDExtensionInt p_length) {1058String *self = (String *)p_self;1059return (*self).resize_uninitialized(p_length);1060}10611062static void gdextension_string_name_new_with_latin1_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionBool p_is_static) {1063memnew_placement(r_dest, StringName(p_contents, static_cast<bool>(p_is_static)));1064}10651066static void gdextension_string_name_new_with_utf8_chars(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents) {1067String tmp = String::utf8(p_contents);1068memnew_placement(r_dest, StringName(tmp));1069}10701071static void gdextension_string_name_new_with_utf8_chars_and_len(GDExtensionUninitializedStringNamePtr r_dest, const char *p_contents, GDExtensionInt p_size) {1072String tmp = String::utf8(p_contents, p_size);1073memnew_placement(r_dest, StringName(tmp));1074}10751076static GDExtensionInt gdextension_xml_parser_open_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_buffer, size_t p_size) {1077XMLParser *xml = (XMLParser *)p_instance;1078return (GDExtensionInt)xml->_open_buffer(p_buffer, p_size);1079}10801081static void gdextension_file_access_store_buffer(GDExtensionObjectPtr p_instance, const uint8_t *p_src, uint64_t p_length) {1082FileAccess *fa = (FileAccess *)p_instance;1083fa->store_buffer(p_src, p_length);1084}10851086static uint64_t gdextension_file_access_get_buffer(GDExtensionConstObjectPtr p_instance, uint8_t *p_dst, uint64_t p_length) {1087const FileAccess *fa = (FileAccess *)p_instance;1088return fa->get_buffer(p_dst, p_length);1089}10901091static uint8_t *gdextension_image_ptrw(GDExtensionObjectPtr p_instance) {1092Image *img = (Image *)p_instance;1093return img->ptrw();1094}10951096static const uint8_t *gdextension_image_ptr(GDExtensionObjectPtr p_instance) {1097Image *img = (Image *)p_instance;1098return img->ptr();1099}11001101static 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) {1102WorkerThreadPool *p = (WorkerThreadPool *)p_instance;1103const String *description = (const String *)p_description;1104return (int64_t)p->add_native_group_task(p_func, p_userdata, p_elements, p_tasks, static_cast<bool>(p_high_priority), *description);1105}11061107static 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) {1108WorkerThreadPool *p = (WorkerThreadPool *)p_instance;1109const String *description = (const String *)p_description;1110return (int64_t)p->add_native_task(p_func, p_userdata, static_cast<bool>(p_high_priority), *description);1111}11121113/* Packed array functions */11141115static uint8_t *gdextension_packed_byte_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1116PackedByteArray *self = (PackedByteArray *)p_self;1117if (unlikely(p_index < 0 || p_index >= self->size())) {1118return nullptr;1119}1120return &self->ptrw()[p_index];1121}11221123static const uint8_t *gdextension_packed_byte_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1124const PackedByteArray *self = (const PackedByteArray *)p_self;1125if (unlikely(p_index < 0 || p_index >= self->size())) {1126return nullptr;1127}1128return &self->ptr()[p_index];1129}11301131static GDExtensionTypePtr gdextension_packed_color_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1132PackedColorArray *self = (PackedColorArray *)p_self;1133if (unlikely(p_index < 0 || p_index >= self->size())) {1134return nullptr;1135}1136return (GDExtensionTypePtr)&self->ptrw()[p_index];1137}11381139static GDExtensionTypePtr gdextension_packed_color_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1140const PackedColorArray *self = (const PackedColorArray *)p_self;1141if (unlikely(p_index < 0 || p_index >= self->size())) {1142return nullptr;1143}1144return (GDExtensionTypePtr)&self->ptr()[p_index];1145}11461147static float *gdextension_packed_float32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1148PackedFloat32Array *self = (PackedFloat32Array *)p_self;1149if (unlikely(p_index < 0 || p_index >= self->size())) {1150return nullptr;1151}1152return &self->ptrw()[p_index];1153}11541155static const float *gdextension_packed_float32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1156const PackedFloat32Array *self = (const PackedFloat32Array *)p_self;1157if (unlikely(p_index < 0 || p_index >= self->size())) {1158return nullptr;1159}1160return &self->ptr()[p_index];1161}11621163static double *gdextension_packed_float64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1164PackedFloat64Array *self = (PackedFloat64Array *)p_self;1165if (unlikely(p_index < 0 || p_index >= self->size())) {1166return nullptr;1167}1168return &self->ptrw()[p_index];1169}11701171static const double *gdextension_packed_float64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1172const PackedFloat64Array *self = (const PackedFloat64Array *)p_self;1173if (unlikely(p_index < 0 || p_index >= self->size())) {1174return nullptr;1175}1176return &self->ptr()[p_index];1177}11781179static int32_t *gdextension_packed_int32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1180PackedInt32Array *self = (PackedInt32Array *)p_self;1181if (unlikely(p_index < 0 || p_index >= self->size())) {1182return nullptr;1183}1184return &self->ptrw()[p_index];1185}11861187static const int32_t *gdextension_packed_int32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1188const PackedInt32Array *self = (const PackedInt32Array *)p_self;1189if (unlikely(p_index < 0 || p_index >= self->size())) {1190return nullptr;1191}1192return &self->ptr()[p_index];1193}11941195static int64_t *gdextension_packed_int64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1196PackedInt64Array *self = (PackedInt64Array *)p_self;1197if (unlikely(p_index < 0 || p_index >= self->size())) {1198return nullptr;1199}1200return &self->ptrw()[p_index];1201}12021203static const int64_t *gdextension_packed_int64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1204const PackedInt64Array *self = (const PackedInt64Array *)p_self;1205if (unlikely(p_index < 0 || p_index >= self->size())) {1206return nullptr;1207}1208return &self->ptr()[p_index];1209}12101211static GDExtensionStringPtr gdextension_packed_string_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1212PackedStringArray *self = (PackedStringArray *)p_self;1213if (unlikely(p_index < 0 || p_index >= self->size())) {1214return nullptr;1215}1216return (GDExtensionStringPtr)&self->ptrw()[p_index];1217}12181219static GDExtensionStringPtr gdextension_packed_string_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1220const PackedStringArray *self = (const PackedStringArray *)p_self;1221if (unlikely(p_index < 0 || p_index >= self->size())) {1222return nullptr;1223}1224return (GDExtensionStringPtr)&self->ptr()[p_index];1225}12261227static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1228PackedVector2Array *self = (PackedVector2Array *)p_self;1229if (unlikely(p_index < 0 || p_index >= self->size())) {1230return nullptr;1231}1232return (GDExtensionTypePtr)&self->ptrw()[p_index];1233}12341235static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1236const PackedVector2Array *self = (const PackedVector2Array *)p_self;1237if (unlikely(p_index < 0 || p_index >= self->size())) {1238return nullptr;1239}1240return (GDExtensionTypePtr)&self->ptr()[p_index];1241}12421243static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1244PackedVector3Array *self = (PackedVector3Array *)p_self;1245if (unlikely(p_index < 0 || p_index >= self->size())) {1246return nullptr;1247}1248return (GDExtensionTypePtr)&self->ptrw()[p_index];1249}12501251static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1252const PackedVector3Array *self = (const PackedVector3Array *)p_self;1253if (unlikely(p_index < 0 || p_index >= self->size())) {1254return nullptr;1255}1256return (GDExtensionTypePtr)&self->ptr()[p_index];1257}12581259static GDExtensionTypePtr gdextension_packed_vector4_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1260PackedVector4Array *self = (PackedVector4Array *)p_self;1261if (unlikely(p_index < 0 || p_index >= self->size())) {1262return nullptr;1263}1264return (GDExtensionTypePtr)&self->ptrw()[p_index];1265}12661267static GDExtensionTypePtr gdextension_packed_vector4_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1268const PackedVector4Array *self = (const PackedVector4Array *)p_self;1269if (unlikely(p_index < 0 || p_index >= self->size())) {1270return nullptr;1271}1272return (GDExtensionTypePtr)&self->ptr()[p_index];1273}12741275static GDExtensionVariantPtr gdextension_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {1276Array *self = (Array *)p_self;1277if (unlikely(p_index < 0 || p_index >= self->size())) {1278return nullptr;1279}1280return (GDExtensionVariantPtr)&self->operator[](p_index);1281}12821283static GDExtensionVariantPtr gdextension_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {1284const Array *self = (const Array *)p_self;1285if (unlikely(p_index < 0 || p_index >= self->size())) {1286return nullptr;1287}1288return (GDExtensionVariantPtr)&self->operator[](p_index);1289}12901291#ifndef DISABLE_DEPRECATED1292void gdextension_array_ref(GDExtensionTypePtr p_self, GDExtensionConstTypePtr p_from) {1293Array *self = (Array *)p_self;1294const Array *from = (const Array *)p_from;1295self->Array::operator=(*from);1296}1297#endif // DISABLE_DEPRECATED12981299void gdextension_array_set_typed(GDExtensionTypePtr p_self, GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstVariantPtr p_script) {1300Array *self = reinterpret_cast<Array *>(p_self);1301const StringName *class_name = reinterpret_cast<const StringName *>(p_class_name);1302const Variant *script = reinterpret_cast<const Variant *>(p_script);1303self->set_typed((uint32_t)p_type, *class_name, *script);1304}13051306/* Dictionary functions */13071308static GDExtensionVariantPtr gdextension_dictionary_operator_index(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key) {1309Dictionary *self = (Dictionary *)p_self;1310return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key);1311}13121313static GDExtensionVariantPtr gdextension_dictionary_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key) {1314const Dictionary *self = (const Dictionary *)p_self;1315return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key);1316}13171318void 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) {1319Dictionary *self = reinterpret_cast<Dictionary *>(p_self);1320const StringName *key_class_name = reinterpret_cast<const StringName *>(p_key_class_name);1321const Variant *key_script = reinterpret_cast<const Variant *>(p_key_script);1322const StringName *value_class_name = reinterpret_cast<const StringName *>(p_value_class_name);1323const Variant *value_script = reinterpret_cast<const Variant *>(p_value_script);1324self->set_typed((uint32_t)p_key_type, *key_class_name, *key_script, (uint32_t)p_value_type, *value_class_name, *value_script);1325}13261327/* OBJECT API */13281329static 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) {1330const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);1331Object *o = (Object *)p_instance;1332const Variant **args = (const Variant **)p_args;1333Callable::CallError error;13341335memnew_placement(r_return, Variant(mb->call(o, args, p_arg_count, error)));13361337if (r_error) {1338r_error->error = (GDExtensionCallErrorType)(error.error);1339r_error->argument = error.argument;1340r_error->expected = error.expected;1341}1342}13431344static void gdextension_object_method_bind_ptrcall(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr p_ret) {1345const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind);1346Object *o = (Object *)p_instance;1347mb->ptrcall(o, (const void **)p_args, p_ret);1348}13491350static void gdextension_object_destroy(GDExtensionObjectPtr p_o) {1351memdelete((Object *)p_o);1352}13531354static GDExtensionObjectPtr gdextension_global_get_singleton(GDExtensionConstStringNamePtr p_name) {1355const StringName name = *reinterpret_cast<const StringName *>(p_name);1356return (GDExtensionObjectPtr)Engine::get_singleton()->get_singleton_object(name);1357}13581359static void *gdextension_object_get_instance_binding(GDExtensionObjectPtr p_object, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) {1360Object *o = (Object *)p_object;1361return o->get_instance_binding(p_token, p_callbacks);1362}13631364static void gdextension_object_set_instance_binding(GDExtensionObjectPtr p_object, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) {1365Object *o = (Object *)p_object;1366o->set_instance_binding(p_token, p_binding, p_callbacks);1367}13681369static void gdextension_object_free_instance_binding(GDExtensionObjectPtr p_object, void *p_token) {1370Object *o = (Object *)p_object;1371o->free_instance_binding(p_token);1372}13731374static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) {1375const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1376Object *o = (Object *)p_object;1377ClassDB::set_object_extension_instance(o, classname, p_instance);1378}13791380static GDExtensionObjectPtr gdextension_object_get_instance_from_id(GDObjectInstanceID p_instance_id) {1381return (GDExtensionObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id));1382}13831384static GDExtensionBool gdextension_object_get_class_name(GDExtensionConstObjectPtr p_object, GDExtensionClassLibraryPtr p_library, GDExtensionUninitializedStringNamePtr r_class_name) {1385if (!p_object) {1386return false;1387}1388const Object *o = (const Object *)p_object;13891390memnew_placement(r_class_name, StringName);1391StringName *class_name = reinterpret_cast<StringName *>(r_class_name);1392*class_name = o->get_class_name_for_extension((GDExtension *)p_library);13931394return true;1395}13961397static GDExtensionObjectPtr gdextension_object_cast_to(GDExtensionConstObjectPtr p_object, void *p_class_tag) {1398if (!p_object) {1399return nullptr;1400}1401Object *o = (Object *)p_object;14021403return o->is_class_ptr(p_class_tag) ? (GDExtensionObjectPtr)o : (GDExtensionObjectPtr) nullptr;1404}14051406static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObjectPtr p_object) {1407const Object *o = (const Object *)p_object;1408return (GDObjectInstanceID)o->get_instance_id();1409}14101411static GDExtensionBool gdextension_object_has_script_method(GDExtensionConstObjectPtr p_object, GDExtensionConstStringNamePtr p_method) {1412Object *o = (Object *)p_object;1413const StringName method = *reinterpret_cast<const StringName *>(p_method);14141415ScriptInstance *script_instance = o->get_script_instance();1416if (script_instance) {1417return script_instance->has_method(method);1418}1419return false;1420}14211422static 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) {1423Object *o = (Object *)p_object;1424const StringName method = *reinterpret_cast<const StringName *>(p_method);1425const Variant **args = (const Variant **)p_args;14261427Callable::CallError error; // TODO: Check `error`?1428memnew_placement(r_return, Variant);1429*(Variant *)r_return = o->callp(method, args, p_argument_count, error);14301431if (r_error) {1432r_error->error = (GDExtensionCallErrorType)(error.error);1433r_error->argument = error.argument;1434r_error->expected = error.expected;1435}1436}14371438static GDExtensionObjectPtr gdextension_ref_get_object(GDExtensionConstRefPtr p_ref) {1439const Ref<RefCounted> *ref = (const Ref<RefCounted> *)p_ref;1440if (ref == nullptr || ref->is_null()) {1441return (GDExtensionObjectPtr) nullptr;1442} else {1443return (GDExtensionObjectPtr)ref->ptr();1444}1445}14461447static void gdextension_ref_set_object(GDExtensionRefPtr p_ref, GDExtensionObjectPtr p_object) {1448Ref<RefCounted> *ref = (Ref<RefCounted> *)p_ref;1449ERR_FAIL_NULL(ref);14501451Object *o = (RefCounted *)p_object;1452ref->reference_ptr(o);1453}14541455#ifndef DISABLE_DEPRECATED1456static GDExtensionScriptInstancePtr gdextension_script_instance_create(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {1457GDExtensionScriptInstanceInfo3 *info_3 = memnew(GDExtensionScriptInstanceInfo3);1458info_3->set_func = p_info->set_func;1459info_3->get_func = p_info->get_func;1460info_3->get_property_list_func = p_info->get_property_list_func;1461info_3->free_property_list_func = nullptr;1462info_3->get_class_category_func = nullptr;1463info_3->property_can_revert_func = p_info->property_can_revert_func;1464info_3->property_get_revert_func = p_info->property_get_revert_func;1465info_3->get_owner_func = p_info->get_owner_func;1466info_3->get_property_state_func = p_info->get_property_state_func;1467info_3->get_method_list_func = p_info->get_method_list_func;1468info_3->free_method_list_func = nullptr;1469info_3->get_property_type_func = p_info->get_property_type_func;1470info_3->validate_property_func = nullptr;1471info_3->has_method_func = p_info->has_method_func;1472info_3->get_method_argument_count_func = nullptr;1473info_3->call_func = p_info->call_func;1474info_3->notification_func = nullptr;1475info_3->to_string_func = p_info->to_string_func;1476info_3->refcount_incremented_func = p_info->refcount_incremented_func;1477info_3->refcount_decremented_func = p_info->refcount_decremented_func;1478info_3->get_script_func = p_info->get_script_func;1479info_3->is_placeholder_func = p_info->is_placeholder_func;1480info_3->set_fallback_func = p_info->set_fallback_func;1481info_3->get_fallback_func = p_info->get_fallback_func;1482info_3->get_language_func = p_info->get_language_func;1483info_3->free_func = p_info->free_func;14841485ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);1486script_instance_extension->instance = p_instance_data;1487script_instance_extension->native_info = info_3;1488script_instance_extension->free_native_info = true;1489script_instance_extension->deprecated_native_info = memnew(ScriptInstanceExtension::DeprecatedNativeInfo);1490script_instance_extension->deprecated_native_info->notification_func = p_info->notification_func;1491script_instance_extension->deprecated_native_info->free_property_list_func = p_info->free_property_list_func;1492script_instance_extension->deprecated_native_info->free_method_list_func = p_info->free_method_list_func;1493return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);1494}14951496static GDExtensionScriptInstancePtr gdextension_script_instance_create2(const GDExtensionScriptInstanceInfo2 *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {1497GDExtensionScriptInstanceInfo3 *info_3 = memnew(GDExtensionScriptInstanceInfo3);1498info_3->set_func = p_info->set_func;1499info_3->get_func = p_info->get_func;1500info_3->get_property_list_func = p_info->get_property_list_func;1501info_3->free_property_list_func = nullptr;1502info_3->get_class_category_func = nullptr;1503info_3->property_can_revert_func = p_info->property_can_revert_func;1504info_3->property_get_revert_func = p_info->property_get_revert_func;1505info_3->get_owner_func = p_info->get_owner_func;1506info_3->get_property_state_func = p_info->get_property_state_func;1507info_3->get_method_list_func = p_info->get_method_list_func;1508info_3->free_method_list_func = nullptr;1509info_3->get_property_type_func = p_info->get_property_type_func;1510info_3->validate_property_func = nullptr;1511info_3->has_method_func = p_info->has_method_func;1512info_3->get_method_argument_count_func = nullptr;1513info_3->call_func = p_info->call_func;1514info_3->notification_func = p_info->notification_func;1515info_3->to_string_func = p_info->to_string_func;1516info_3->refcount_incremented_func = p_info->refcount_incremented_func;1517info_3->refcount_decremented_func = p_info->refcount_decremented_func;1518info_3->get_script_func = p_info->get_script_func;1519info_3->is_placeholder_func = p_info->is_placeholder_func;1520info_3->set_fallback_func = p_info->set_fallback_func;1521info_3->get_fallback_func = p_info->get_fallback_func;1522info_3->get_language_func = p_info->get_language_func;1523info_3->free_func = p_info->free_func;15241525ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);1526script_instance_extension->instance = p_instance_data;1527script_instance_extension->native_info = info_3;1528script_instance_extension->free_native_info = true;1529script_instance_extension->deprecated_native_info = memnew(ScriptInstanceExtension::DeprecatedNativeInfo);1530script_instance_extension->deprecated_native_info->free_property_list_func = p_info->free_property_list_func;1531script_instance_extension->deprecated_native_info->free_method_list_func = p_info->free_method_list_func;1532return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);1533}1534#endif // DISABLE_DEPRECATED15351536static GDExtensionScriptInstancePtr gdextension_script_instance_create3(const GDExtensionScriptInstanceInfo3 *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) {1537ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension);1538script_instance_extension->instance = p_instance_data;1539script_instance_extension->native_info = p_info;1540return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension);1541}15421543static GDExtensionScriptInstancePtr gdextension_placeholder_script_instance_create(GDExtensionObjectPtr p_language, GDExtensionObjectPtr p_script, GDExtensionObjectPtr p_owner) {1544ScriptLanguage *language = (ScriptLanguage *)p_language;1545Ref<Script> script;1546script.reference_ptr((Script *)p_script);1547Object *owner = (Object *)p_owner;15481549PlaceHolderScriptInstance *placeholder = memnew(PlaceHolderScriptInstance(language, script, owner));1550return reinterpret_cast<GDExtensionScriptInstancePtr>(placeholder);1551}15521553static void gdextension_placeholder_script_instance_update(GDExtensionScriptInstancePtr p_placeholder, GDExtensionConstTypePtr p_properties, GDExtensionConstTypePtr p_values) {1554PlaceHolderScriptInstance *placeholder = dynamic_cast<PlaceHolderScriptInstance *>(reinterpret_cast<ScriptInstance *>(p_placeholder));1555ERR_FAIL_NULL_MSG(placeholder, "Unable to update placeholder, expected a PlaceHolderScriptInstance but received an invalid type.");15561557const Array &properties = *reinterpret_cast<const Array *>(p_properties);1558const Dictionary &values = *reinterpret_cast<const Dictionary *>(p_values);15591560List<PropertyInfo> properties_list;1561HashMap<StringName, Variant> values_map;15621563for (int i = 0; i < properties.size(); i++) {1564Dictionary d = properties[i];1565properties_list.push_back(PropertyInfo::from_dict(d));1566}15671568for (const KeyValue<Variant, Variant> &kv : values) {1569values_map.insert(kv.key, kv.value);1570}15711572placeholder->update(properties_list, values_map);1573}15741575static GDExtensionScriptInstancePtr gdextension_object_get_script_instance(GDExtensionConstObjectPtr p_object, GDExtensionConstObjectPtr p_language) {1576if (!p_object || !p_language) {1577return nullptr;1578}15791580const Object *o = (const Object *)p_object;1581ScriptInstanceExtension *script_instance_extension = reinterpret_cast<ScriptInstanceExtension *>(o->get_script_instance());1582if (!script_instance_extension) {1583return nullptr;1584}15851586const ScriptLanguage *language = script_instance_extension->get_language();1587if (language != p_language) {1588return nullptr;1589}15901591return script_instance_extension->instance;1592}15931594static void gdextension_object_set_script_instance(GDExtensionObjectPtr p_object, GDExtensionScriptInstancePtr p_script_instance) {1595ERR_FAIL_NULL(p_object);15961597Object *o = (Object *)p_object;1598ScriptInstance *script_instance = (ScriptInstanceExtension *)p_script_instance;15991600o->set_script_instance(script_instance);1601}16021603#ifndef DISABLE_DEPRECATED1604static void gdextension_callable_custom_create(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo *p_custom_callable_info) {1605memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));1606}1607#endif16081609static void gdextension_callable_custom_create2(GDExtensionUninitializedTypePtr r_callable, GDExtensionCallableCustomInfo2 *p_custom_callable_info) {1610memnew_placement(r_callable, Callable(memnew(CallableCustomExtension(p_custom_callable_info))));1611}16121613static void *gdextension_callable_custom_get_userdata(GDExtensionTypePtr p_callable, void *p_token) {1614const Callable &callable = *reinterpret_cast<const Callable *>(p_callable);1615if (!callable.is_custom()) {1616return nullptr;1617}1618const CallableCustomExtension *custom_callable = dynamic_cast<const CallableCustomExtension *>(callable.get_custom());1619if (!custom_callable) {1620return nullptr;1621}1622return custom_callable->get_userdata(p_token);1623}16241625static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash) {1626const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1627const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname);1628bool exists = false;1629MethodBind *mb = ClassDB::get_method_with_compatibility(classname, methodname, p_hash, &exists);16301631#ifndef DISABLE_DEPRECATED1632// If lookup failed, see if this is one of the broken hashes from issue #81386.1633if (!mb && exists) {1634uint32_t mapped_hash;1635if (GDExtensionSpecialCompatHashes::lookup_current_hash(classname, methodname, p_hash, &mapped_hash)) {1636mb = ClassDB::get_method_with_compatibility(classname, methodname, mapped_hash, &exists);1637}1638}1639#endif16401641if (!mb && exists) {1642ERR_PRINT(vformat("Method '%s.%s' has changed and no compatibility fallback has been provided. Please open an issue.", classname, methodname));1643return nullptr;1644}1645ERR_FAIL_NULL_V(mb, nullptr);1646return (GDExtensionMethodBindPtr)mb;1647}16481649#ifndef DISABLE_DEPRECATED1650static GDExtensionObjectPtr gdextension_classdb_construct_object(GDExtensionConstStringNamePtr p_classname) {1651const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1652return (GDExtensionObjectPtr)ClassDB::instantiate_no_placeholders(classname);1653}1654#endif16551656static GDExtensionObjectPtr gdextension_classdb_construct_object2(GDExtensionConstStringNamePtr p_classname) {1657const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1658return (GDExtensionObjectPtr)ClassDB::instantiate_without_postinitialization(classname);1659}16601661static void *gdextension_classdb_get_class_tag(GDExtensionConstStringNamePtr p_classname) {1662const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1663ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(classname);1664return class_info ? class_info->class_ptr : nullptr;1665}16661667static void gdextension_editor_add_plugin(GDExtensionConstStringNamePtr p_classname) {1668#ifdef TOOLS_ENABLED1669const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1670GDExtensionEditorPlugins::add_extension_class(classname);1671#endif1672}16731674static void gdextension_editor_remove_plugin(GDExtensionConstStringNamePtr p_classname) {1675#ifdef TOOLS_ENABLED1676const StringName classname = *reinterpret_cast<const StringName *>(p_classname);1677GDExtensionEditorPlugins::remove_extension_class(classname);1678#endif1679}16801681static void gdextension_editor_help_load_xml_from_utf8_chars_and_len(const char *p_data, GDExtensionInt p_size) {1682#ifdef TOOLS_ENABLED1683GDExtensionEditorHelp::load_xml_buffer((const uint8_t *)p_data, p_size);1684#endif1685}16861687static void gdextension_editor_help_load_xml_from_utf8_chars(const char *p_data) {1688#ifdef TOOLS_ENABLED1689size_t len = strlen(p_data);1690gdextension_editor_help_load_xml_from_utf8_chars_and_len(p_data, len);1691#endif1692}16931694#define REGISTER_INTERFACE_FUNC(m_name) GDExtension::register_interface_function(#m_name, (GDExtensionInterfaceFunctionPtr) & gdextension_##m_name)16951696void gdextension_setup_interface() {1697#ifndef DISABLE_DEPRECATED1698REGISTER_INTERFACE_FUNC(get_godot_version);1699#endif // DISABLE_DEPRECATED1700REGISTER_INTERFACE_FUNC(get_godot_version2);1701#ifndef DISABLE_DEPRECATED1702REGISTER_INTERFACE_FUNC(mem_alloc);1703REGISTER_INTERFACE_FUNC(mem_realloc);1704REGISTER_INTERFACE_FUNC(mem_free);1705#endif // DISABLE_DEPRECATED1706REGISTER_INTERFACE_FUNC(mem_alloc2);1707REGISTER_INTERFACE_FUNC(mem_realloc2);1708REGISTER_INTERFACE_FUNC(mem_free2);1709REGISTER_INTERFACE_FUNC(print_error);1710REGISTER_INTERFACE_FUNC(print_error_with_message);1711REGISTER_INTERFACE_FUNC(print_warning);1712REGISTER_INTERFACE_FUNC(print_warning_with_message);1713REGISTER_INTERFACE_FUNC(print_script_error);1714REGISTER_INTERFACE_FUNC(print_script_error_with_message);1715REGISTER_INTERFACE_FUNC(get_native_struct_size);1716REGISTER_INTERFACE_FUNC(variant_new_copy);1717REGISTER_INTERFACE_FUNC(variant_new_nil);1718REGISTER_INTERFACE_FUNC(variant_destroy);1719REGISTER_INTERFACE_FUNC(variant_call);1720REGISTER_INTERFACE_FUNC(variant_call_static);1721REGISTER_INTERFACE_FUNC(variant_evaluate);1722REGISTER_INTERFACE_FUNC(variant_set);1723REGISTER_INTERFACE_FUNC(variant_set_named);1724REGISTER_INTERFACE_FUNC(variant_set_keyed);1725REGISTER_INTERFACE_FUNC(variant_set_indexed);1726REGISTER_INTERFACE_FUNC(variant_get);1727REGISTER_INTERFACE_FUNC(variant_get_named);1728REGISTER_INTERFACE_FUNC(variant_get_keyed);1729REGISTER_INTERFACE_FUNC(variant_get_indexed);1730REGISTER_INTERFACE_FUNC(variant_iter_init);1731REGISTER_INTERFACE_FUNC(variant_iter_next);1732REGISTER_INTERFACE_FUNC(variant_iter_get);1733REGISTER_INTERFACE_FUNC(variant_hash);1734REGISTER_INTERFACE_FUNC(variant_recursive_hash);1735REGISTER_INTERFACE_FUNC(variant_hash_compare);1736REGISTER_INTERFACE_FUNC(variant_booleanize);1737REGISTER_INTERFACE_FUNC(variant_duplicate);1738REGISTER_INTERFACE_FUNC(variant_stringify);1739REGISTER_INTERFACE_FUNC(variant_get_type);1740REGISTER_INTERFACE_FUNC(variant_has_method);1741REGISTER_INTERFACE_FUNC(variant_has_member);1742REGISTER_INTERFACE_FUNC(variant_has_key);1743REGISTER_INTERFACE_FUNC(variant_get_object_instance_id);1744REGISTER_INTERFACE_FUNC(variant_get_type_name);1745REGISTER_INTERFACE_FUNC(variant_can_convert);1746REGISTER_INTERFACE_FUNC(variant_can_convert_strict);1747REGISTER_INTERFACE_FUNC(get_variant_from_type_constructor);1748REGISTER_INTERFACE_FUNC(get_variant_to_type_constructor);1749REGISTER_INTERFACE_FUNC(variant_get_ptr_internal_getter);1750REGISTER_INTERFACE_FUNC(variant_get_ptr_operator_evaluator);1751REGISTER_INTERFACE_FUNC(variant_get_ptr_builtin_method);1752REGISTER_INTERFACE_FUNC(variant_get_ptr_constructor);1753REGISTER_INTERFACE_FUNC(variant_get_ptr_destructor);1754REGISTER_INTERFACE_FUNC(variant_construct);1755REGISTER_INTERFACE_FUNC(variant_get_ptr_setter);1756REGISTER_INTERFACE_FUNC(variant_get_ptr_getter);1757REGISTER_INTERFACE_FUNC(variant_get_ptr_indexed_setter);1758REGISTER_INTERFACE_FUNC(variant_get_ptr_indexed_getter);1759REGISTER_INTERFACE_FUNC(variant_get_ptr_keyed_setter);1760REGISTER_INTERFACE_FUNC(variant_get_ptr_keyed_getter);1761REGISTER_INTERFACE_FUNC(variant_get_ptr_keyed_checker);1762REGISTER_INTERFACE_FUNC(variant_get_constant_value);1763REGISTER_INTERFACE_FUNC(variant_get_ptr_utility_function);1764REGISTER_INTERFACE_FUNC(string_new_with_latin1_chars);1765REGISTER_INTERFACE_FUNC(string_new_with_utf8_chars);1766REGISTER_INTERFACE_FUNC(string_new_with_utf16_chars);1767REGISTER_INTERFACE_FUNC(string_new_with_utf32_chars);1768REGISTER_INTERFACE_FUNC(string_new_with_wide_chars);1769REGISTER_INTERFACE_FUNC(string_new_with_latin1_chars_and_len);1770REGISTER_INTERFACE_FUNC(string_new_with_utf8_chars_and_len);1771REGISTER_INTERFACE_FUNC(string_new_with_utf8_chars_and_len2);1772REGISTER_INTERFACE_FUNC(string_new_with_utf16_chars_and_len);1773REGISTER_INTERFACE_FUNC(string_new_with_utf16_chars_and_len2);1774REGISTER_INTERFACE_FUNC(string_new_with_utf32_chars_and_len);1775REGISTER_INTERFACE_FUNC(string_new_with_wide_chars_and_len);1776REGISTER_INTERFACE_FUNC(string_to_latin1_chars);1777REGISTER_INTERFACE_FUNC(string_to_utf8_chars);1778REGISTER_INTERFACE_FUNC(string_to_utf16_chars);1779REGISTER_INTERFACE_FUNC(string_to_utf32_chars);1780REGISTER_INTERFACE_FUNC(string_to_wide_chars);1781REGISTER_INTERFACE_FUNC(string_operator_index);1782REGISTER_INTERFACE_FUNC(string_operator_index_const);1783REGISTER_INTERFACE_FUNC(string_operator_plus_eq_string);1784REGISTER_INTERFACE_FUNC(string_operator_plus_eq_char);1785REGISTER_INTERFACE_FUNC(string_operator_plus_eq_cstr);1786REGISTER_INTERFACE_FUNC(string_operator_plus_eq_wcstr);1787REGISTER_INTERFACE_FUNC(string_operator_plus_eq_c32str);1788REGISTER_INTERFACE_FUNC(string_resize);1789REGISTER_INTERFACE_FUNC(string_name_new_with_latin1_chars);1790REGISTER_INTERFACE_FUNC(string_name_new_with_utf8_chars);1791REGISTER_INTERFACE_FUNC(string_name_new_with_utf8_chars_and_len);1792REGISTER_INTERFACE_FUNC(xml_parser_open_buffer);1793REGISTER_INTERFACE_FUNC(file_access_store_buffer);1794REGISTER_INTERFACE_FUNC(file_access_get_buffer);1795REGISTER_INTERFACE_FUNC(worker_thread_pool_add_native_group_task);1796REGISTER_INTERFACE_FUNC(worker_thread_pool_add_native_task);1797REGISTER_INTERFACE_FUNC(packed_byte_array_operator_index);1798REGISTER_INTERFACE_FUNC(packed_byte_array_operator_index_const);1799REGISTER_INTERFACE_FUNC(packed_color_array_operator_index);1800REGISTER_INTERFACE_FUNC(packed_color_array_operator_index_const);1801REGISTER_INTERFACE_FUNC(packed_float32_array_operator_index);1802REGISTER_INTERFACE_FUNC(packed_float32_array_operator_index_const);1803REGISTER_INTERFACE_FUNC(packed_float64_array_operator_index);1804REGISTER_INTERFACE_FUNC(packed_float64_array_operator_index_const);1805REGISTER_INTERFACE_FUNC(packed_int32_array_operator_index);1806REGISTER_INTERFACE_FUNC(packed_int32_array_operator_index_const);1807REGISTER_INTERFACE_FUNC(packed_int64_array_operator_index);1808REGISTER_INTERFACE_FUNC(packed_int64_array_operator_index_const);1809REGISTER_INTERFACE_FUNC(packed_string_array_operator_index);1810REGISTER_INTERFACE_FUNC(packed_string_array_operator_index_const);1811REGISTER_INTERFACE_FUNC(packed_vector2_array_operator_index);1812REGISTER_INTERFACE_FUNC(packed_vector2_array_operator_index_const);1813REGISTER_INTERFACE_FUNC(packed_vector3_array_operator_index);1814REGISTER_INTERFACE_FUNC(packed_vector3_array_operator_index_const);1815REGISTER_INTERFACE_FUNC(packed_vector4_array_operator_index);1816REGISTER_INTERFACE_FUNC(packed_vector4_array_operator_index_const);1817REGISTER_INTERFACE_FUNC(array_operator_index);1818REGISTER_INTERFACE_FUNC(array_operator_index_const);1819#ifndef DISABLE_DEPRECATED1820REGISTER_INTERFACE_FUNC(array_ref);1821#endif // DISABLE_DEPRECATED1822REGISTER_INTERFACE_FUNC(array_set_typed);1823REGISTER_INTERFACE_FUNC(dictionary_operator_index);1824REGISTER_INTERFACE_FUNC(dictionary_operator_index_const);1825REGISTER_INTERFACE_FUNC(dictionary_set_typed);1826REGISTER_INTERFACE_FUNC(object_method_bind_call);1827REGISTER_INTERFACE_FUNC(object_method_bind_ptrcall);1828REGISTER_INTERFACE_FUNC(object_destroy);1829REGISTER_INTERFACE_FUNC(global_get_singleton);1830REGISTER_INTERFACE_FUNC(object_get_instance_binding);1831REGISTER_INTERFACE_FUNC(object_set_instance_binding);1832REGISTER_INTERFACE_FUNC(object_free_instance_binding);1833REGISTER_INTERFACE_FUNC(object_set_instance);1834REGISTER_INTERFACE_FUNC(object_get_class_name);1835REGISTER_INTERFACE_FUNC(object_cast_to);1836REGISTER_INTERFACE_FUNC(object_get_instance_from_id);1837REGISTER_INTERFACE_FUNC(object_get_instance_id);1838REGISTER_INTERFACE_FUNC(object_has_script_method);1839REGISTER_INTERFACE_FUNC(object_call_script_method);1840REGISTER_INTERFACE_FUNC(ref_get_object);1841REGISTER_INTERFACE_FUNC(ref_set_object);1842#ifndef DISABLE_DEPRECATED1843REGISTER_INTERFACE_FUNC(script_instance_create);1844REGISTER_INTERFACE_FUNC(script_instance_create2);1845#endif // DISABLE_DEPRECATED1846REGISTER_INTERFACE_FUNC(script_instance_create3);1847REGISTER_INTERFACE_FUNC(placeholder_script_instance_create);1848REGISTER_INTERFACE_FUNC(placeholder_script_instance_update);1849REGISTER_INTERFACE_FUNC(object_get_script_instance);1850REGISTER_INTERFACE_FUNC(object_set_script_instance);1851#ifndef DISABLE_DEPRECATED1852REGISTER_INTERFACE_FUNC(callable_custom_create);1853#endif // DISABLE_DEPRECATED1854REGISTER_INTERFACE_FUNC(callable_custom_create2);1855REGISTER_INTERFACE_FUNC(callable_custom_get_userdata);1856#ifndef DISABLE_DEPRECATED1857REGISTER_INTERFACE_FUNC(classdb_construct_object);1858#endif // DISABLE_DEPRECATED1859REGISTER_INTERFACE_FUNC(classdb_construct_object2);1860REGISTER_INTERFACE_FUNC(classdb_get_method_bind);1861REGISTER_INTERFACE_FUNC(classdb_get_class_tag);1862REGISTER_INTERFACE_FUNC(editor_add_plugin);1863REGISTER_INTERFACE_FUNC(editor_remove_plugin);1864REGISTER_INTERFACE_FUNC(editor_help_load_xml_from_utf8_chars);1865REGISTER_INTERFACE_FUNC(editor_help_load_xml_from_utf8_chars_and_len);1866REGISTER_INTERFACE_FUNC(image_ptrw);1867REGISTER_INTERFACE_FUNC(image_ptr);1868}18691870#undef REGISTER_INTERFACE_FUNCTION187118721873