Path: blob/master/modules/mono/glue/runtime_interop.cpp
10278 views
/**************************************************************************/1/* runtime_interop.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 "runtime_interop.h"3132#include "../csharp_script.h"33#include "../interop_types.h"34#include "../managed_callable.h"35#include "../mono_gd/gd_mono_cache.h"36#include "../signal_awaiter_utils.h"37#include "../utils/path_utils.h"3839#include "core/config/engine.h"40#include "core/config/project_settings.h"41#include "core/debugger/engine_debugger.h"42#include "core/debugger/script_debugger.h"43#include "core/io/marshalls.h"44#include "core/object/class_db.h"45#include "core/object/method_bind.h"46#include "core/os/os.h"47#include "core/string/string_name.h"4849#ifdef TOOLS_ENABLED50#include "editor/file_system/editor_file_system.h"51#endif5253#ifdef __cplusplus54extern "C" {55#endif5657// For ArrayPrivate and DictionaryPrivate58static_assert(sizeof(SafeRefCount) == sizeof(uint32_t));5960typedef Object *(*godotsharp_class_creation_func)(bool);6162bool godotsharp_dotnet_module_is_initialized() {63return GDMono::get_singleton()->is_initialized();64}6566MethodBind *godotsharp_method_bind_get_method(const StringName *p_classname, const StringName *p_methodname) {67return ClassDB::get_method(*p_classname, *p_methodname);68}6970MethodBind *godotsharp_method_bind_get_method_with_compatibility(const StringName *p_classname, const StringName *p_methodname, uint64_t p_hash) {71return ClassDB::get_method_with_compatibility(*p_classname, *p_methodname, p_hash);72}7374godotsharp_class_creation_func godotsharp_get_class_constructor(const StringName *p_classname) {75ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(*p_classname);76if (class_info) {77return class_info->creation_func;78}79return nullptr;80}8182Object *godotsharp_engine_get_singleton(const String *p_name) {83return Engine::get_singleton()->get_singleton_object(*p_name);84}8586int32_t godotsharp_stack_info_vector_resize(87Vector<ScriptLanguage::StackInfo> *p_stack_info_vector, int p_size) {88return (int32_t)p_stack_info_vector->resize(p_size);89}9091void godotsharp_stack_info_vector_destroy(92Vector<ScriptLanguage::StackInfo> *p_stack_info_vector) {93p_stack_info_vector->~Vector();94}9596void godotsharp_internal_script_debugger_send_error(const String *p_func,97const String *p_file, int32_t p_line, const String *p_err, const String *p_descr,98ErrorHandlerType p_type, const Vector<ScriptLanguage::StackInfo> *p_stack_info_vector) {99const String file = ProjectSettings::get_singleton()->localize_path(p_file->simplify_path());100EngineDebugger::get_script_debugger()->send_error(*p_func, file, p_line, *p_err, *p_descr,101true, p_type, *p_stack_info_vector);102}103104bool godotsharp_internal_script_debugger_is_active() {105return EngineDebugger::is_active();106}107108GCHandleIntPtr godotsharp_internal_object_get_associated_gchandle(Object *p_ptr) {109#ifdef DEBUG_ENABLED110CRASH_COND(p_ptr == nullptr);111#endif112113if (p_ptr->get_script_instance()) {114CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(p_ptr->get_script_instance());115if (cs_instance) {116if (!cs_instance->is_destructing_script_instance()) {117return cs_instance->get_gchandle_intptr();118}119return { nullptr };120}121}122123void *data = CSharpLanguage::get_existing_instance_binding(p_ptr);124125if (data) {126CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)data)->get();127if (script_binding.inited) {128MonoGCHandleData &gchandle = script_binding.gchandle;129return !gchandle.is_released() ? gchandle.get_intptr() : GCHandleIntPtr{ nullptr };130}131}132133return { nullptr };134}135136void godotsharp_internal_object_disposed(Object *p_ptr, GCHandleIntPtr p_gchandle_to_free) {137#ifdef DEBUG_ENABLED138CRASH_COND(p_ptr == nullptr);139#endif140141if (p_ptr->get_script_instance()) {142CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(p_ptr->get_script_instance());143if (cs_instance) {144if (!cs_instance->is_destructing_script_instance()) {145cs_instance->mono_object_disposed(p_gchandle_to_free);146p_ptr->set_script_instance(nullptr);147}148return;149}150}151152void *data = CSharpLanguage::get_existing_instance_binding(p_ptr);153154if (data) {155CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)data)->get();156if (script_binding.inited) {157if (!script_binding.gchandle.is_released()) {158CSharpLanguage::release_binding_gchandle_thread_safe(p_gchandle_to_free, script_binding);159}160}161}162}163164void godotsharp_internal_refcounted_disposed(Object *p_ptr, GCHandleIntPtr p_gchandle_to_free, bool p_is_finalizer) {165#ifdef DEBUG_ENABLED166CRASH_COND(p_ptr == nullptr);167// This is only called with RefCounted derived classes168CRASH_COND(!Object::cast_to<RefCounted>(p_ptr));169#endif170171RefCounted *rc = static_cast<RefCounted *>(p_ptr);172173if (rc->get_script_instance()) {174CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(rc->get_script_instance());175if (cs_instance) {176if (!cs_instance->is_destructing_script_instance()) {177bool delete_owner;178bool remove_script_instance;179180cs_instance->mono_object_disposed_baseref(p_gchandle_to_free, p_is_finalizer,181delete_owner, remove_script_instance);182183if (delete_owner) {184memdelete(rc);185} else if (remove_script_instance) {186rc->set_script_instance(nullptr);187}188}189return;190}191}192193// Unsafe refcount decrement. The managed instance also counts as a reference.194// See: CSharpLanguage::alloc_instance_binding_data(Object *p_object)195CSharpLanguage::get_singleton()->pre_unsafe_unreference(rc);196if (rc->unreference()) {197memdelete(rc);198} else {199void *data = CSharpLanguage::get_existing_instance_binding(rc);200201if (data) {202CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)data)->get();203if (script_binding.inited) {204if (!script_binding.gchandle.is_released()) {205if (rc->get_reference_count() == 1 && script_binding.gchandle.is_weak()) {206// The GCHandle is just swapped, so get the swapped handle to release207// See: CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference)208p_gchandle_to_free = script_binding.gchandle.get_intptr();209}210CSharpLanguage::release_binding_gchandle_thread_safe(p_gchandle_to_free, script_binding);211}212}213}214}215}216217int32_t godotsharp_internal_signal_awaiter_connect(Object *p_source, StringName *p_signal, Object *p_target, GCHandleIntPtr p_awaiter_handle_ptr) {218StringName signal = p_signal ? *p_signal : StringName();219return (int32_t)gd_mono_connect_signal_awaiter(p_source, signal, p_target, p_awaiter_handle_ptr);220}221222GCHandleIntPtr godotsharp_internal_unmanaged_get_script_instance_managed(Object *p_unmanaged, bool *r_has_cs_script_instance) {223#ifdef DEBUG_ENABLED224CRASH_COND(!p_unmanaged);225CRASH_COND(!r_has_cs_script_instance);226#endif227228if (p_unmanaged->get_script_instance()) {229CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(p_unmanaged->get_script_instance());230231if (cs_instance) {232*r_has_cs_script_instance = true;233return cs_instance->get_gchandle_intptr();234}235}236237*r_has_cs_script_instance = false;238return { nullptr };239}240241GCHandleIntPtr godotsharp_internal_unmanaged_get_instance_binding_managed(Object *p_unmanaged) {242#ifdef DEBUG_ENABLED243CRASH_COND(!p_unmanaged);244#endif245246void *data = CSharpLanguage::get_instance_binding_with_setup(p_unmanaged);247ERR_FAIL_NULL_V(data, { nullptr });248CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)data)->value();249ERR_FAIL_COND_V(!script_binding.inited, { nullptr });250251return script_binding.gchandle.get_intptr();252}253254GCHandleIntPtr godotsharp_internal_unmanaged_instance_binding_create_managed(Object *p_unmanaged, GCHandleIntPtr p_old_gchandle) {255#ifdef DEBUG_ENABLED256CRASH_COND(!p_unmanaged);257#endif258259void *data = CSharpLanguage::get_instance_binding_with_setup(p_unmanaged);260ERR_FAIL_NULL_V(data, { nullptr });261CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)data)->value();262ERR_FAIL_COND_V(!script_binding.inited, { nullptr });263264MonoGCHandleData &gchandle = script_binding.gchandle;265266// TODO: Possible data race?267CRASH_COND(gchandle.get_intptr().value != p_old_gchandle.value);268269CSharpLanguage::get_singleton()->release_script_gchandle(gchandle);270script_binding.inited = false;271272// Create a new one273274#ifdef DEBUG_ENABLED275CRASH_COND(script_binding.type_name == StringName());276#endif277278bool parent_is_object_class = ClassDB::is_parent_class(p_unmanaged->get_class_name(), script_binding.type_name);279ERR_FAIL_COND_V_MSG(!parent_is_object_class, { nullptr },280"Type inherits from native type '" + script_binding.type_name + "', so it can't be instantiated in object of type: '" + p_unmanaged->get_class() + "'.");281282GCHandleIntPtr strong_gchandle =283GDMonoCache::managed_callbacks.ScriptManagerBridge_CreateManagedForGodotObjectBinding(284&script_binding.type_name, p_unmanaged);285286ERR_FAIL_NULL_V(strong_gchandle.value, { nullptr });287288gchandle = MonoGCHandleData(strong_gchandle, gdmono::GCHandleType::STRONG_HANDLE);289script_binding.inited = true;290291// Tie managed to unmanaged292RefCounted *rc = Object::cast_to<RefCounted>(p_unmanaged);293294if (rc) {295// Unsafe refcount increment. The managed instance also counts as a reference.296// This way if the unmanaged world has no references to our owner297// but the managed instance is alive, the refcount will be 1 instead of 0.298// See: godot_icall_RefCounted_Dtor(MonoObject *p_obj, Object *p_ptr)299rc->reference();300CSharpLanguage::get_singleton()->post_unsafe_reference(rc);301}302303return gchandle.get_intptr();304}305306void godotsharp_internal_tie_native_managed_to_unmanaged(GCHandleIntPtr p_gchandle_intptr, Object *p_unmanaged, const StringName *p_native_name, bool p_ref_counted) {307CSharpLanguage::tie_native_managed_to_unmanaged(p_gchandle_intptr, p_unmanaged, p_native_name, p_ref_counted);308}309310void godotsharp_internal_tie_user_managed_to_unmanaged(GCHandleIntPtr p_gchandle_intptr, Object *p_unmanaged, Ref<CSharpScript> *p_script, bool p_ref_counted) {311CSharpLanguage::tie_user_managed_to_unmanaged(p_gchandle_intptr, p_unmanaged, p_script, p_ref_counted);312}313314void godotsharp_internal_tie_managed_to_unmanaged_with_pre_setup(GCHandleIntPtr p_gchandle_intptr, Object *p_unmanaged) {315CSharpLanguage::tie_managed_to_unmanaged_with_pre_setup(p_gchandle_intptr, p_unmanaged);316}317318void godotsharp_internal_new_csharp_script(Ref<CSharpScript> *r_dest) {319memnew_placement(r_dest, Ref<CSharpScript>(memnew(CSharpScript)));320}321322void godotsharp_internal_editor_file_system_update_files(const PackedStringArray &p_script_paths) {323#ifdef TOOLS_ENABLED324// If the EditorFileSystem singleton is available, update the file;325// otherwise, the file will be updated when the singleton becomes available.326EditorFileSystem *efs = EditorFileSystem::get_singleton();327if (efs) {328efs->update_files(p_script_paths);329}330#else331// EditorFileSystem is only available when running in the Godot editor.332DEV_ASSERT(false);333#endif334}335336bool godotsharp_internal_script_load(const String *p_path, Ref<CSharpScript> *r_dest) {337Ref<Resource> res = ResourceLoader::load(*p_path);338if (res.is_valid()) {339memnew_placement(r_dest, Ref<CSharpScript>(res));340return true;341} else {342memnew_placement(r_dest, Ref<CSharpScript>());343return false;344}345}346347void godotsharp_internal_reload_registered_script(CSharpScript *p_script) {348CRASH_COND(!p_script);349CSharpScript::reload_registered_script(Ref<CSharpScript>(p_script));350}351352void godotsharp_array_filter_godot_objects_by_native(StringName *p_native_name, const Array *p_input, Array *r_output) {353memnew_placement(r_output, Array);354355for (int i = 0; i < p_input->size(); ++i) {356if (ClassDB::is_parent_class(((Object *)(*p_input)[i])->get_class(), *p_native_name)) {357r_output->push_back(p_input[i]);358}359}360}361362void godotsharp_array_filter_godot_objects_by_non_native(const Array *p_input, Array *r_output) {363memnew_placement(r_output, Array);364365for (int i = 0; i < p_input->size(); ++i) {366CSharpInstance *si = CAST_CSHARP_INSTANCE(((Object *)(*p_input)[i])->get_script_instance());367368if (si != nullptr) {369r_output->push_back(p_input[i]);370}371}372}373374void godotsharp_ref_new_from_ref_counted_ptr(Ref<RefCounted> *r_dest, RefCounted *p_ref_counted_ptr) {375memnew_placement(r_dest, Ref<RefCounted>(p_ref_counted_ptr));376}377378void godotsharp_ref_destroy(Ref<RefCounted> *p_instance) {379p_instance->~Ref();380}381382void godotsharp_string_name_new_from_string(StringName *r_dest, const String *p_name) {383memnew_placement(r_dest, StringName(*p_name));384}385386void godotsharp_node_path_new_from_string(NodePath *r_dest, const String *p_name) {387memnew_placement(r_dest, NodePath(*p_name));388}389390void godotsharp_string_name_as_string(String *r_dest, const StringName *p_name) {391memnew_placement(r_dest, String(p_name->operator String()));392}393394void godotsharp_node_path_as_string(String *r_dest, const NodePath *p_np) {395memnew_placement(r_dest, String(p_np->operator String()));396}397398godot_packed_array godotsharp_packed_byte_array_new_mem_copy(const uint8_t *p_src, int32_t p_length) {399godot_packed_array ret;400memnew_placement(&ret, PackedByteArray);401PackedByteArray *array = reinterpret_cast<PackedByteArray *>(&ret);402array->resize(p_length);403uint8_t *dst = array->ptrw();404memcpy(dst, p_src, p_length * sizeof(uint8_t));405return ret;406}407408godot_packed_array godotsharp_packed_int32_array_new_mem_copy(const int32_t *p_src, int32_t p_length) {409godot_packed_array ret;410memnew_placement(&ret, PackedInt32Array);411PackedInt32Array *array = reinterpret_cast<PackedInt32Array *>(&ret);412array->resize(p_length);413int32_t *dst = array->ptrw();414memcpy(dst, p_src, p_length * sizeof(int32_t));415return ret;416}417418godot_packed_array godotsharp_packed_int64_array_new_mem_copy(const int64_t *p_src, int32_t p_length) {419godot_packed_array ret;420memnew_placement(&ret, PackedInt64Array);421PackedInt64Array *array = reinterpret_cast<PackedInt64Array *>(&ret);422array->resize(p_length);423int64_t *dst = array->ptrw();424memcpy(dst, p_src, p_length * sizeof(int64_t));425return ret;426}427428godot_packed_array godotsharp_packed_float32_array_new_mem_copy(const float *p_src, int32_t p_length) {429godot_packed_array ret;430memnew_placement(&ret, PackedFloat32Array);431PackedFloat32Array *array = reinterpret_cast<PackedFloat32Array *>(&ret);432array->resize(p_length);433float *dst = array->ptrw();434memcpy(dst, p_src, p_length * sizeof(float));435return ret;436}437438godot_packed_array godotsharp_packed_float64_array_new_mem_copy(const double *p_src, int32_t p_length) {439godot_packed_array ret;440memnew_placement(&ret, PackedFloat64Array);441PackedFloat64Array *array = reinterpret_cast<PackedFloat64Array *>(&ret);442array->resize(p_length);443double *dst = array->ptrw();444memcpy(dst, p_src, p_length * sizeof(double));445return ret;446}447448godot_packed_array godotsharp_packed_vector2_array_new_mem_copy(const Vector2 *p_src, int32_t p_length) {449godot_packed_array ret;450memnew_placement(&ret, PackedVector2Array);451PackedVector2Array *array = reinterpret_cast<PackedVector2Array *>(&ret);452array->resize(p_length);453Vector2 *dst = array->ptrw();454memcpy(dst, p_src, p_length * sizeof(Vector2));455return ret;456}457458godot_packed_array godotsharp_packed_vector3_array_new_mem_copy(const Vector3 *p_src, int32_t p_length) {459godot_packed_array ret;460memnew_placement(&ret, PackedVector3Array);461PackedVector3Array *array = reinterpret_cast<PackedVector3Array *>(&ret);462array->resize(p_length);463Vector3 *dst = array->ptrw();464memcpy(dst, p_src, p_length * sizeof(Vector3));465return ret;466}467468godot_packed_array godotsharp_packed_vector4_array_new_mem_copy(const Vector4 *p_src, int32_t p_length) {469godot_packed_array ret;470memnew_placement(&ret, PackedVector4Array);471PackedVector4Array *array = reinterpret_cast<PackedVector4Array *>(&ret);472array->resize(p_length);473Vector4 *dst = array->ptrw();474memcpy(dst, p_src, p_length * sizeof(Vector4));475return ret;476}477478godot_packed_array godotsharp_packed_color_array_new_mem_copy(const Color *p_src, int32_t p_length) {479godot_packed_array ret;480memnew_placement(&ret, PackedColorArray);481PackedColorArray *array = reinterpret_cast<PackedColorArray *>(&ret);482array->resize(p_length);483Color *dst = array->ptrw();484memcpy(dst, p_src, p_length * sizeof(Color));485return ret;486}487488void godotsharp_packed_string_array_add(PackedStringArray *r_dest, const String *p_element) {489r_dest->append(*p_element);490}491492void godotsharp_callable_new_with_delegate(GCHandleIntPtr p_delegate_handle, void *p_trampoline,493const Object *p_object, Callable *r_callable) {494// TODO: Use pooling for ManagedCallable instances.495ObjectID objid = p_object ? p_object->get_instance_id() : ObjectID();496CallableCustom *managed_callable = memnew(ManagedCallable(p_delegate_handle, p_trampoline, objid));497memnew_placement(r_callable, Callable(managed_callable));498}499500bool godotsharp_callable_get_data_for_marshalling(const Callable *p_callable,501GCHandleIntPtr *r_delegate_handle, void **r_trampoline, Object **r_object, StringName *r_name) {502if (p_callable->is_custom()) {503CallableCustom *custom = p_callable->get_custom();504CallableCustom::CompareEqualFunc compare_equal_func = custom->get_compare_equal_func();505506if (compare_equal_func == ManagedCallable::compare_equal_func_ptr) {507ManagedCallable *managed_callable = static_cast<ManagedCallable *>(custom);508*r_delegate_handle = managed_callable->get_delegate();509*r_trampoline = managed_callable->get_trampoline();510*r_object = nullptr;511memnew_placement(r_name, StringName());512return true;513} else if (compare_equal_func == SignalAwaiterCallable::compare_equal_func_ptr) {514SignalAwaiterCallable *signal_awaiter_callable = static_cast<SignalAwaiterCallable *>(custom);515*r_delegate_handle = { nullptr };516*r_trampoline = nullptr;517*r_object = ObjectDB::get_instance(signal_awaiter_callable->get_object());518memnew_placement(r_name, StringName(signal_awaiter_callable->get_signal()));519return true;520} else if (compare_equal_func == EventSignalCallable::compare_equal_func_ptr) {521EventSignalCallable *event_signal_callable = static_cast<EventSignalCallable *>(custom);522*r_delegate_handle = { nullptr };523*r_trampoline = nullptr;524*r_object = ObjectDB::get_instance(event_signal_callable->get_object());525memnew_placement(r_name, StringName(event_signal_callable->get_signal()));526return true;527}528529// Some other CallableCustom. We only support ManagedCallable.530*r_delegate_handle = { nullptr };531*r_trampoline = nullptr;532*r_object = nullptr;533memnew_placement(r_name, StringName());534return false;535} else {536*r_delegate_handle = { nullptr };537*r_trampoline = nullptr;538*r_object = ObjectDB::get_instance(p_callable->get_object_id());539memnew_placement(r_name, StringName(p_callable->get_method()));540return true;541}542}543544godot_variant godotsharp_callable_call(Callable *p_callable, const Variant **p_args, const int32_t p_arg_count, Callable::CallError *p_call_error) {545godot_variant ret;546memnew_placement(&ret, Variant);547548Variant *ret_val = (Variant *)&ret;549550p_callable->callp(p_args, p_arg_count, *ret_val, *p_call_error);551552return ret;553}554555void godotsharp_callable_call_deferred(Callable *p_callable, const Variant **p_args, const int32_t p_arg_count) {556p_callable->call_deferredp(p_args, p_arg_count);557}558559godot_color godotsharp_color_from_ok_hsl(float p_h, float p_s, float p_l, float p_alpha) {560godot_color ret;561Color *dest = (Color *)&ret;562memnew_placement(dest, Color(Color::from_ok_hsl(p_h, p_s, p_l, p_alpha)));563return ret;564}565566float godotsharp_color_get_ok_hsl_h(const Color *p_self) {567return p_self->get_ok_hsl_h();568}569570float godotsharp_color_get_ok_hsl_s(const Color *p_self) {571return p_self->get_ok_hsl_s();572}573574float godotsharp_color_get_ok_hsl_l(const Color *p_self) {575return p_self->get_ok_hsl_l();576}577578// GDNative functions579580// gdnative.h581582void godotsharp_method_bind_ptrcall(MethodBind *p_method_bind, Object *p_instance, const void **p_args, void *p_ret) {583p_method_bind->ptrcall(p_instance, p_args, p_ret);584}585586godot_variant godotsharp_method_bind_call(MethodBind *p_method_bind, Object *p_instance, const godot_variant **p_args, const int32_t p_arg_count, Callable::CallError *p_call_error) {587godot_variant ret;588memnew_placement(&ret, Variant());589590Variant *ret_val = (Variant *)&ret;591592*ret_val = p_method_bind->call(p_instance, (const Variant **)p_args, p_arg_count, *p_call_error);593594return ret;595}596597// variant.h598599void godotsharp_variant_new_copy(godot_variant *r_dest, const Variant *p_src) {600memnew_placement(r_dest, Variant(*p_src));601}602603void godotsharp_variant_new_string_name(godot_variant *r_dest, const StringName *p_s) {604memnew_placement(r_dest, Variant(*p_s));605}606607void godotsharp_variant_new_node_path(godot_variant *r_dest, const NodePath *p_np) {608memnew_placement(r_dest, Variant(*p_np));609}610611void godotsharp_variant_new_object(godot_variant *r_dest, const Object *p_obj) {612memnew_placement(r_dest, Variant(p_obj));613}614615void godotsharp_variant_new_transform2d(godot_variant *r_dest, const Transform2D *p_t2d) {616memnew_placement(r_dest, Variant(*p_t2d));617}618619void godotsharp_variant_new_basis(godot_variant *r_dest, const Basis *p_basis) {620memnew_placement(r_dest, Variant(*p_basis));621}622623void godotsharp_variant_new_transform3d(godot_variant *r_dest, const Transform3D *p_trans) {624memnew_placement(r_dest, Variant(*p_trans));625}626627void godotsharp_variant_new_projection(godot_variant *r_dest, const Projection *p_proj) {628memnew_placement(r_dest, Variant(*p_proj));629}630631void godotsharp_variant_new_aabb(godot_variant *r_dest, const AABB *p_aabb) {632memnew_placement(r_dest, Variant(*p_aabb));633}634635void godotsharp_variant_new_dictionary(godot_variant *r_dest, const Dictionary *p_dict) {636memnew_placement(r_dest, Variant(*p_dict));637}638639void godotsharp_variant_new_array(godot_variant *r_dest, const Array *p_arr) {640memnew_placement(r_dest, Variant(*p_arr));641}642643void godotsharp_variant_new_packed_byte_array(godot_variant *r_dest, const PackedByteArray *p_pba) {644memnew_placement(r_dest, Variant(*p_pba));645}646647void godotsharp_variant_new_packed_int32_array(godot_variant *r_dest, const PackedInt32Array *p_pia) {648memnew_placement(r_dest, Variant(*p_pia));649}650651void godotsharp_variant_new_packed_int64_array(godot_variant *r_dest, const PackedInt64Array *p_pia) {652memnew_placement(r_dest, Variant(*p_pia));653}654655void godotsharp_variant_new_packed_float32_array(godot_variant *r_dest, const PackedFloat32Array *p_pra) {656memnew_placement(r_dest, Variant(*p_pra));657}658659void godotsharp_variant_new_packed_float64_array(godot_variant *r_dest, const PackedFloat64Array *p_pra) {660memnew_placement(r_dest, Variant(*p_pra));661}662663void godotsharp_variant_new_packed_string_array(godot_variant *r_dest, const PackedStringArray *p_psa) {664memnew_placement(r_dest, Variant(*p_psa));665}666667void godotsharp_variant_new_packed_vector2_array(godot_variant *r_dest, const PackedVector2Array *p_pv2a) {668memnew_placement(r_dest, Variant(*p_pv2a));669}670671void godotsharp_variant_new_packed_vector3_array(godot_variant *r_dest, const PackedVector3Array *p_pv3a) {672memnew_placement(r_dest, Variant(*p_pv3a));673}674675void godotsharp_variant_new_packed_vector4_array(godot_variant *r_dest, const PackedVector4Array *p_pv4a) {676memnew_placement(r_dest, Variant(*p_pv4a));677}678679void godotsharp_variant_new_packed_color_array(godot_variant *r_dest, const PackedColorArray *p_pca) {680memnew_placement(r_dest, Variant(*p_pca));681}682683bool godotsharp_variant_as_bool(const Variant *p_self) {684return p_self->operator bool();685}686687int64_t godotsharp_variant_as_int(const Variant *p_self) {688return p_self->operator int64_t();689}690691double godotsharp_variant_as_float(const Variant *p_self) {692return p_self->operator double();693}694695godot_string godotsharp_variant_as_string(const Variant *p_self) {696godot_string raw_dest;697String *dest = (String *)&raw_dest;698memnew_placement(dest, String(p_self->operator String()));699return raw_dest;700}701702godot_vector2 godotsharp_variant_as_vector2(const Variant *p_self) {703godot_vector2 raw_dest;704Vector2 *dest = (Vector2 *)&raw_dest;705memnew_placement(dest, Vector2(p_self->operator Vector2()));706return raw_dest;707}708709godot_vector2i godotsharp_variant_as_vector2i(const Variant *p_self) {710godot_vector2i raw_dest;711Vector2i *dest = (Vector2i *)&raw_dest;712memnew_placement(dest, Vector2i(p_self->operator Vector2i()));713return raw_dest;714}715716godot_rect2 godotsharp_variant_as_rect2(const Variant *p_self) {717godot_rect2 raw_dest;718Rect2 *dest = (Rect2 *)&raw_dest;719memnew_placement(dest, Rect2(p_self->operator Rect2()));720return raw_dest;721}722723godot_rect2i godotsharp_variant_as_rect2i(const Variant *p_self) {724godot_rect2i raw_dest;725Rect2i *dest = (Rect2i *)&raw_dest;726memnew_placement(dest, Rect2i(p_self->operator Rect2i()));727return raw_dest;728}729730godot_vector3 godotsharp_variant_as_vector3(const Variant *p_self) {731godot_vector3 raw_dest;732Vector3 *dest = (Vector3 *)&raw_dest;733memnew_placement(dest, Vector3(p_self->operator Vector3()));734return raw_dest;735}736737godot_vector3i godotsharp_variant_as_vector3i(const Variant *p_self) {738godot_vector3i raw_dest;739Vector3i *dest = (Vector3i *)&raw_dest;740memnew_placement(dest, Vector3i(p_self->operator Vector3i()));741return raw_dest;742}743744godot_transform2d godotsharp_variant_as_transform2d(const Variant *p_self) {745godot_transform2d raw_dest;746Transform2D *dest = (Transform2D *)&raw_dest;747memnew_placement(dest, Transform2D(p_self->operator Transform2D()));748return raw_dest;749}750751godot_vector4 godotsharp_variant_as_vector4(const Variant *p_self) {752godot_vector4 raw_dest;753Vector4 *dest = (Vector4 *)&raw_dest;754memnew_placement(dest, Vector4(p_self->operator Vector4()));755return raw_dest;756}757758godot_vector4i godotsharp_variant_as_vector4i(const Variant *p_self) {759godot_vector4i raw_dest;760Vector4i *dest = (Vector4i *)&raw_dest;761memnew_placement(dest, Vector4i(p_self->operator Vector4i()));762return raw_dest;763}764765godot_plane godotsharp_variant_as_plane(const Variant *p_self) {766godot_plane raw_dest;767Plane *dest = (Plane *)&raw_dest;768memnew_placement(dest, Plane(p_self->operator Plane()));769return raw_dest;770}771772godot_quaternion godotsharp_variant_as_quaternion(const Variant *p_self) {773godot_quaternion raw_dest;774Quaternion *dest = (Quaternion *)&raw_dest;775memnew_placement(dest, Quaternion(p_self->operator Quaternion()));776return raw_dest;777}778779godot_aabb godotsharp_variant_as_aabb(const Variant *p_self) {780godot_aabb raw_dest;781AABB *dest = (AABB *)&raw_dest;782memnew_placement(dest, AABB(p_self->operator ::AABB()));783return raw_dest;784}785786godot_basis godotsharp_variant_as_basis(const Variant *p_self) {787godot_basis raw_dest;788Basis *dest = (Basis *)&raw_dest;789memnew_placement(dest, Basis(p_self->operator Basis()));790return raw_dest;791}792793godot_transform3d godotsharp_variant_as_transform3d(const Variant *p_self) {794godot_transform3d raw_dest;795Transform3D *dest = (Transform3D *)&raw_dest;796memnew_placement(dest, Transform3D(p_self->operator Transform3D()));797return raw_dest;798}799800godot_projection godotsharp_variant_as_projection(const Variant *p_self) {801godot_projection raw_dest;802Projection *dest = (Projection *)&raw_dest;803memnew_placement(dest, Projection(p_self->operator Projection()));804return raw_dest;805}806807godot_color godotsharp_variant_as_color(const Variant *p_self) {808godot_color raw_dest;809Color *dest = (Color *)&raw_dest;810memnew_placement(dest, Color(p_self->operator Color()));811return raw_dest;812}813814godot_string_name godotsharp_variant_as_string_name(const Variant *p_self) {815godot_string_name raw_dest;816StringName *dest = (StringName *)&raw_dest;817memnew_placement(dest, StringName(p_self->operator StringName()));818return raw_dest;819}820821godot_node_path godotsharp_variant_as_node_path(const Variant *p_self) {822godot_node_path raw_dest;823NodePath *dest = (NodePath *)&raw_dest;824memnew_placement(dest, NodePath(p_self->operator NodePath()));825return raw_dest;826}827828godot_rid godotsharp_variant_as_rid(const Variant *p_self) {829godot_rid raw_dest;830RID *dest = (RID *)&raw_dest;831memnew_placement(dest, RID(p_self->operator ::RID()));832return raw_dest;833}834835godot_callable godotsharp_variant_as_callable(const Variant *p_self) {836godot_callable raw_dest;837Callable *dest = (Callable *)&raw_dest;838memnew_placement(dest, Callable(p_self->operator Callable()));839return raw_dest;840}841842godot_signal godotsharp_variant_as_signal(const Variant *p_self) {843godot_signal raw_dest;844Signal *dest = (Signal *)&raw_dest;845memnew_placement(dest, Signal(p_self->operator Signal()));846return raw_dest;847}848849godot_dictionary godotsharp_variant_as_dictionary(const Variant *p_self) {850godot_dictionary raw_dest;851Dictionary *dest = (Dictionary *)&raw_dest;852memnew_placement(dest, Dictionary(p_self->operator Dictionary()));853return raw_dest;854}855856godot_array godotsharp_variant_as_array(const Variant *p_self) {857godot_array raw_dest;858Array *dest = (Array *)&raw_dest;859memnew_placement(dest, Array(p_self->operator Array()));860return raw_dest;861}862863godot_packed_array godotsharp_variant_as_packed_byte_array(const Variant *p_self) {864godot_packed_array raw_dest;865PackedByteArray *dest = (PackedByteArray *)&raw_dest;866memnew_placement(dest, PackedByteArray(p_self->operator PackedByteArray()));867return raw_dest;868}869870godot_packed_array godotsharp_variant_as_packed_int32_array(const Variant *p_self) {871godot_packed_array raw_dest;872PackedInt32Array *dest = (PackedInt32Array *)&raw_dest;873memnew_placement(dest, PackedInt32Array(p_self->operator PackedInt32Array()));874return raw_dest;875}876877godot_packed_array godotsharp_variant_as_packed_int64_array(const Variant *p_self) {878godot_packed_array raw_dest;879PackedInt64Array *dest = (PackedInt64Array *)&raw_dest;880memnew_placement(dest, PackedInt64Array(p_self->operator PackedInt64Array()));881return raw_dest;882}883884godot_packed_array godotsharp_variant_as_packed_float32_array(const Variant *p_self) {885godot_packed_array raw_dest;886PackedFloat32Array *dest = (PackedFloat32Array *)&raw_dest;887memnew_placement(dest, PackedFloat32Array(p_self->operator PackedFloat32Array()));888return raw_dest;889}890891godot_packed_array godotsharp_variant_as_packed_float64_array(const Variant *p_self) {892godot_packed_array raw_dest;893PackedFloat64Array *dest = (PackedFloat64Array *)&raw_dest;894memnew_placement(dest, PackedFloat64Array(p_self->operator PackedFloat64Array()));895return raw_dest;896}897898godot_packed_array godotsharp_variant_as_packed_string_array(const Variant *p_self) {899godot_packed_array raw_dest;900PackedStringArray *dest = (PackedStringArray *)&raw_dest;901memnew_placement(dest, PackedStringArray(p_self->operator PackedStringArray()));902return raw_dest;903}904905godot_packed_array godotsharp_variant_as_packed_vector2_array(const Variant *p_self) {906godot_packed_array raw_dest;907PackedVector2Array *dest = (PackedVector2Array *)&raw_dest;908memnew_placement(dest, PackedVector2Array(p_self->operator PackedVector2Array()));909return raw_dest;910}911912godot_packed_array godotsharp_variant_as_packed_vector3_array(const Variant *p_self) {913godot_packed_array raw_dest;914PackedVector3Array *dest = (PackedVector3Array *)&raw_dest;915memnew_placement(dest, PackedVector3Array(p_self->operator PackedVector3Array()));916return raw_dest;917}918919godot_packed_array godotsharp_variant_as_packed_vector4_array(const Variant *p_self) {920godot_packed_array raw_dest;921PackedVector4Array *dest = (PackedVector4Array *)&raw_dest;922memnew_placement(dest, PackedVector4Array(p_self->operator PackedVector4Array()));923return raw_dest;924}925926godot_packed_array godotsharp_variant_as_packed_color_array(const Variant *p_self) {927godot_packed_array raw_dest;928PackedColorArray *dest = (PackedColorArray *)&raw_dest;929memnew_placement(dest, PackedColorArray(p_self->operator PackedColorArray()));930return raw_dest;931}932933bool godotsharp_variant_equals(const godot_variant *p_a, const godot_variant *p_b) {934return *reinterpret_cast<const Variant *>(p_a) == *reinterpret_cast<const Variant *>(p_b);935}936937// string.h938939void godotsharp_string_new_with_utf16_chars(String *r_dest, const char16_t *p_contents) {940memnew_placement(r_dest, String());941r_dest->append_utf16(p_contents);942}943944// string_name.h945946void godotsharp_string_name_new_copy(StringName *r_dest, const StringName *p_src) {947memnew_placement(r_dest, StringName(*p_src));948}949950// node_path.h951952void godotsharp_node_path_new_copy(NodePath *r_dest, const NodePath *p_src) {953memnew_placement(r_dest, NodePath(*p_src));954}955956// array.h957958void godotsharp_array_new(Array *r_dest) {959memnew_placement(r_dest, Array);960}961962void godotsharp_array_new_copy(Array *r_dest, const Array *p_src) {963memnew_placement(r_dest, Array(*p_src));964}965966godot_variant *godotsharp_array_ptrw(godot_array *p_self) {967return reinterpret_cast<godot_variant *>(&reinterpret_cast<Array *>(p_self)->operator[](0));968}969970// dictionary.h971972void godotsharp_dictionary_new(Dictionary *r_dest) {973memnew_placement(r_dest, Dictionary);974}975976void godotsharp_dictionary_new_copy(Dictionary *r_dest, const Dictionary *p_src) {977memnew_placement(r_dest, Dictionary(*p_src));978}979980// destroy functions981982void godotsharp_packed_byte_array_destroy(PackedByteArray *p_self) {983p_self->~PackedByteArray();984}985986void godotsharp_packed_int32_array_destroy(PackedInt32Array *p_self) {987p_self->~PackedInt32Array();988}989990void godotsharp_packed_int64_array_destroy(PackedInt64Array *p_self) {991p_self->~PackedInt64Array();992}993994void godotsharp_packed_float32_array_destroy(PackedFloat32Array *p_self) {995p_self->~PackedFloat32Array();996}997998void godotsharp_packed_float64_array_destroy(PackedFloat64Array *p_self) {999p_self->~PackedFloat64Array();1000}10011002void godotsharp_packed_string_array_destroy(PackedStringArray *p_self) {1003p_self->~PackedStringArray();1004}10051006void godotsharp_packed_vector2_array_destroy(PackedVector2Array *p_self) {1007p_self->~PackedVector2Array();1008}10091010void godotsharp_packed_vector3_array_destroy(PackedVector3Array *p_self) {1011p_self->~PackedVector3Array();1012}10131014void godotsharp_packed_vector4_array_destroy(PackedVector4Array *p_self) {1015p_self->~PackedVector4Array();1016}10171018void godotsharp_packed_color_array_destroy(PackedColorArray *p_self) {1019p_self->~PackedColorArray();1020}10211022void godotsharp_variant_destroy(Variant *p_self) {1023p_self->~Variant();1024}10251026void godotsharp_string_destroy(String *p_self) {1027p_self->~String();1028}10291030void godotsharp_string_name_destroy(StringName *p_self) {1031p_self->~StringName();1032}10331034void godotsharp_node_path_destroy(NodePath *p_self) {1035p_self->~NodePath();1036}10371038void godotsharp_signal_destroy(Signal *p_self) {1039p_self->~Signal();1040}10411042void godotsharp_callable_destroy(Callable *p_self) {1043p_self->~Callable();1044}10451046void godotsharp_array_destroy(Array *p_self) {1047p_self->~Array();1048}10491050void godotsharp_dictionary_destroy(Dictionary *p_self) {1051p_self->~Dictionary();1052}10531054// Array10551056int32_t godotsharp_array_add(Array *p_self, const Variant *p_item) {1057p_self->append(*p_item);1058return p_self->size();1059}10601061int32_t godotsharp_array_add_range(Array *p_self, const Array *p_collection) {1062p_self->append_array(*p_collection);1063return p_self->size();1064}10651066int32_t godotsharp_array_binary_search(const Array *p_self, int32_t p_index, int32_t p_length, const Variant *p_value) {1067ERR_FAIL_COND_V(p_index < 0, -1);1068ERR_FAIL_COND_V(p_length < 0, -1);1069ERR_FAIL_COND_V(p_self->size() - p_index < p_length, -1);10701071const Variant &value = *p_value;1072const Array &array = *p_self;10731074int lo = p_index;1075int hi = p_index + p_length - 1;1076while (lo <= hi) {1077int mid = lo + ((hi - lo) >> 1);1078const Variant &mid_item = array[mid];10791080if (mid_item == value) {1081return mid;1082}1083if (mid_item < value) {1084lo = mid + 1;1085} else {1086hi = mid - 1;1087}1088}10891090return ~lo;1091}10921093void godotsharp_array_duplicate(const Array *p_self, bool p_deep, Array *r_dest) {1094memnew_placement(r_dest, Array(p_self->duplicate(p_deep)));1095}10961097void godotsharp_array_fill(Array *p_self, const Variant *p_value) {1098p_self->fill(*p_value);1099}11001101int32_t godotsharp_array_index_of(const Array *p_self, const Variant *p_item, int32_t p_index = 0) {1102return p_self->find(*p_item, p_index);1103}11041105void godotsharp_array_insert(Array *p_self, int32_t p_index, const Variant *p_item) {1106p_self->insert(p_index, *p_item);1107}11081109int32_t godotsharp_array_last_index_of(const Array *p_self, const Variant *p_item, int32_t p_index) {1110return p_self->rfind(*p_item, p_index);1111}11121113void godotsharp_array_make_read_only(Array *p_self) {1114p_self->make_read_only();1115}11161117void godotsharp_array_set_typed(Array *p_self, uint32_t p_elem_type, const StringName *p_elem_class_name, const Ref<CSharpScript> *p_elem_script) {1118Variant elem_script_variant;1119StringName elem_class_name = *p_elem_class_name;1120if (p_elem_script && p_elem_script->is_valid()) {1121elem_script_variant = Variant(p_elem_script->ptr());1122elem_class_name = p_elem_script->ptr()->get_instance_base_type();1123}1124p_self->set_typed(p_elem_type, elem_class_name, p_elem_script->ptr());1125}11261127bool godotsharp_array_is_typed(const Array *p_self) {1128return p_self->is_typed();1129}11301131void godotsharp_array_max(const Array *p_self, Variant *r_value) {1132*r_value = p_self->max();1133}11341135void godotsharp_array_min(const Array *p_self, Variant *r_value) {1136*r_value = p_self->min();1137}11381139void godotsharp_array_pick_random(const Array *p_self, Variant *r_value) {1140*r_value = p_self->pick_random();1141}11421143bool godotsharp_array_recursive_equal(const Array *p_self, const Array *p_other) {1144return p_self->recursive_equal(*p_other, 0);1145}11461147void godotsharp_array_remove_at(Array *p_self, int32_t p_index) {1148p_self->remove_at(p_index);1149}11501151int32_t godotsharp_array_resize(Array *p_self, int32_t p_new_size) {1152return (int32_t)p_self->resize(p_new_size);1153}11541155void godotsharp_array_reverse(Array *p_self) {1156p_self->reverse();1157}11581159void godotsharp_array_shuffle(Array *p_self) {1160p_self->shuffle();1161}11621163void godotsharp_array_slice(Array *p_self, int32_t p_start, int32_t p_end, int32_t p_step, bool p_deep, Array *r_dest) {1164memnew_placement(r_dest, Array(p_self->slice(p_start, p_end, p_step, p_deep)));1165}11661167void godotsharp_array_sort(Array *p_self) {1168p_self->sort();1169}11701171void godotsharp_array_to_string(const Array *p_self, String *r_str) {1172*r_str = Variant(*p_self).operator String();1173}11741175void godotsharp_packed_byte_array_compress(const PackedByteArray *p_src, int p_mode, PackedByteArray *r_dst) {1176if (p_src->size() > 0) {1177Compression::Mode mode = (Compression::Mode)(p_mode);1178r_dst->resize(Compression::get_max_compressed_buffer_size(p_src->size(), mode));1179int result = Compression::compress(r_dst->ptrw(), p_src->ptr(), p_src->size(), mode);11801181result = result >= 0 ? result : 0;1182r_dst->resize(result);1183}1184}11851186void godotsharp_packed_byte_array_decompress(const PackedByteArray *p_src, int64_t p_buffer_size, int p_mode, PackedByteArray *r_dst) {1187int64_t buffer_size = p_buffer_size;1188Compression::Mode mode = (Compression::Mode)(p_mode);11891190if (buffer_size <= 0) {1191ERR_FAIL_MSG("Decompression buffer size must be greater than zero.");1192}1193if (p_src->size() == 0) {1194ERR_FAIL_MSG("Compressed buffer size must be greater than zero.");1195}11961197r_dst->resize(buffer_size);1198int result = Compression::decompress(r_dst->ptrw(), buffer_size, p_src->ptr(), p_src->size(), mode);11991200result = result >= 0 ? result : 0;1201r_dst->resize(result);1202}12031204void godotsharp_packed_byte_array_decompress_dynamic(const PackedByteArray *p_src, int64_t p_max_output_size, int p_mode, PackedByteArray *r_dst) {1205int64_t max_output_size = p_max_output_size;1206Compression::Mode mode = (Compression::Mode)(p_mode);12071208int result = Compression::decompress_dynamic(r_dst, max_output_size, p_src->ptr(), p_src->size(), mode);12091210if (result != OK) {1211r_dst->clear();1212ERR_FAIL_MSG("Decompression failed.");1213}1214}12151216// Dictionary12171218bool godotsharp_dictionary_try_get_value(const Dictionary *p_self, const Variant *p_key, Variant *r_value) {1219const Variant *ret = p_self->getptr(*p_key);1220if (ret == nullptr) {1221memnew_placement(r_value, Variant());1222return false;1223}1224memnew_placement(r_value, Variant(*ret));1225return true;1226}12271228void godotsharp_dictionary_set_value(Dictionary *p_self, const Variant *p_key, const Variant *p_value) {1229p_self->operator[](*p_key) = *p_value;1230}12311232void godotsharp_dictionary_keys(const Dictionary *p_self, Array *r_dest) {1233memnew_placement(r_dest, Array(p_self->keys()));1234}12351236void godotsharp_dictionary_values(const Dictionary *p_self, Array *r_dest) {1237memnew_placement(r_dest, Array(p_self->values()));1238}12391240int32_t godotsharp_dictionary_count(const Dictionary *p_self) {1241return p_self->size();1242}12431244void godotsharp_dictionary_key_value_pair_at(const Dictionary *p_self, int32_t p_index, Variant *r_key, Variant *r_value) {1245memnew_placement(r_key, Variant(p_self->get_key_at_index(p_index)));1246memnew_placement(r_value, Variant(p_self->get_value_at_index(p_index)));1247}12481249void godotsharp_dictionary_add(Dictionary *p_self, const Variant *p_key, const Variant *p_value) {1250p_self->operator[](*p_key) = *p_value;1251}12521253void godotsharp_dictionary_clear(Dictionary *p_self) {1254p_self->clear();1255}12561257bool godotsharp_dictionary_contains_key(const Dictionary *p_self, const Variant *p_key) {1258return p_self->has(*p_key);1259}12601261void godotsharp_dictionary_duplicate(const Dictionary *p_self, bool p_deep, Dictionary *r_dest) {1262memnew_placement(r_dest, Dictionary(p_self->duplicate(p_deep)));1263}12641265void godotsharp_dictionary_merge(Dictionary *p_self, const Dictionary *p_dictionary, bool p_overwrite) {1266p_self->merge(*p_dictionary, p_overwrite);1267}12681269bool godotsharp_dictionary_recursive_equal(const Dictionary *p_self, const Dictionary *p_other) {1270return p_self->recursive_equal(*p_other, 0);1271}12721273bool godotsharp_dictionary_remove_key(Dictionary *p_self, const Variant *p_key) {1274return p_self->erase(*p_key);1275}12761277void godotsharp_dictionary_make_read_only(Dictionary *p_self) {1278p_self->make_read_only();1279}12801281void godotsharp_dictionary_set_typed(Dictionary *p_self, uint32_t p_key_type, const StringName *p_key_class_name, const Ref<CSharpScript> *p_key_script, uint32_t p_value_type, const StringName *p_value_class_name, const Ref<CSharpScript> *p_value_script) {1282Variant key_script_variant;1283StringName key_class_name = *p_key_class_name;1284if (p_key_script && p_key_script->is_valid()) {1285key_script_variant = Variant(p_key_script->ptr());1286key_class_name = p_key_script->ptr()->get_instance_base_type();1287}1288Variant value_script_variant;1289StringName value_class_name = *p_value_class_name;1290if (p_value_script && p_value_script->is_valid()) {1291value_script_variant = Variant(p_value_script->ptr());1292value_class_name = p_value_script->ptr()->get_instance_base_type();1293}1294p_self->set_typed(p_key_type, key_class_name, p_key_script->ptr(), p_value_type, value_class_name, p_value_script->ptr());1295}12961297bool godotsharp_dictionary_is_typed_key(const Dictionary *p_self) {1298return p_self->is_typed_key();1299}13001301bool godotsharp_dictionary_is_typed_value(const Dictionary *p_self) {1302return p_self->is_typed_value();1303}13041305uint32_t godotsharp_dictionary_get_typed_key_builtin(const Dictionary *p_self) {1306return p_self->get_typed_key_builtin();1307}13081309uint32_t godotsharp_dictionary_get_typed_value_builtin(const Dictionary *p_self) {1310return p_self->get_typed_value_builtin();1311}13121313void godotsharp_dictionary_get_typed_key_class_name(const Dictionary *p_self, StringName *r_dest) {1314memnew_placement(r_dest, StringName(p_self->get_typed_key_class_name()));1315}13161317void godotsharp_dictionary_get_typed_value_class_name(const Dictionary *p_self, StringName *r_dest) {1318memnew_placement(r_dest, StringName(p_self->get_typed_value_class_name()));1319}13201321void godotsharp_dictionary_get_typed_key_script(const Dictionary *p_self, Variant *r_dest) {1322memnew_placement(r_dest, Variant(p_self->get_typed_key_script()));1323}13241325void godotsharp_dictionary_get_typed_value_script(const Dictionary *p_self, Variant *r_dest) {1326memnew_placement(r_dest, Variant(p_self->get_typed_value_script()));1327}13281329void godotsharp_dictionary_to_string(const Dictionary *p_self, String *r_str) {1330*r_str = Variant(*p_self).operator String();1331}13321333void godotsharp_string_simplify_path(const String *p_self, String *r_simplified_path) {1334memnew_placement(r_simplified_path, String(p_self->simplify_path()));1335}13361337void godotsharp_string_capitalize(const String *p_self, String *r_capitalized) {1338memnew_placement(r_capitalized, String(p_self->capitalize()));1339}13401341void godotsharp_string_to_camel_case(const String *p_self, String *r_camel_case) {1342memnew_placement(r_camel_case, String(p_self->to_camel_case()));1343}13441345void godotsharp_string_to_pascal_case(const String *p_self, String *r_pascal_case) {1346memnew_placement(r_pascal_case, String(p_self->to_pascal_case()));1347}13481349void godotsharp_string_to_snake_case(const String *p_self, String *r_snake_case) {1350memnew_placement(r_snake_case, String(p_self->to_snake_case()));1351}13521353void godotsharp_string_to_kebab_case(const String *p_self, String *r_kebab_case) {1354memnew_placement(r_kebab_case, String(p_self->to_kebab_case()));1355}13561357void godotsharp_node_path_get_as_property_path(const NodePath *p_ptr, NodePath *r_dest) {1358memnew_placement(r_dest, NodePath(p_ptr->get_as_property_path()));1359}13601361void godotsharp_node_path_get_concatenated_names(const NodePath *p_self, String *r_subnames) {1362memnew_placement(r_subnames, String(p_self->get_concatenated_names()));1363}13641365void godotsharp_node_path_get_concatenated_subnames(const NodePath *p_self, String *r_subnames) {1366memnew_placement(r_subnames, String(p_self->get_concatenated_subnames()));1367}13681369void godotsharp_node_path_get_name(const NodePath *p_self, uint32_t p_idx, String *r_name) {1370memnew_placement(r_name, String(p_self->get_name(p_idx)));1371}13721373int32_t godotsharp_node_path_get_name_count(const NodePath *p_self) {1374return p_self->get_name_count();1375}13761377void godotsharp_node_path_get_subname(const NodePath *p_self, uint32_t p_idx, String *r_subname) {1378memnew_placement(r_subname, String(p_self->get_subname(p_idx)));1379}13801381int32_t godotsharp_node_path_get_subname_count(const NodePath *p_self) {1382return p_self->get_subname_count();1383}13841385bool godotsharp_node_path_is_absolute(const NodePath *p_self) {1386return p_self->is_absolute();1387}13881389bool godotsharp_node_path_equals(const NodePath *p_self, const NodePath *p_other) {1390return *p_self == *p_other;1391}13921393int godotsharp_node_path_hash(const NodePath *p_self) {1394return p_self->hash();1395}13961397void godotsharp_randomize() {1398Math::randomize();1399}14001401uint32_t godotsharp_randi() {1402return Math::rand();1403}14041405float godotsharp_randf() {1406return Math::randf();1407}14081409int32_t godotsharp_randi_range(int32_t p_from, int32_t p_to) {1410return Math::random(p_from, p_to);1411}14121413double godotsharp_randf_range(double p_from, double p_to) {1414return Math::random(p_from, p_to);1415}14161417double godotsharp_randfn(double p_mean, double p_deviation) {1418return Math::randfn(p_mean, p_deviation);1419}14201421void godotsharp_seed(uint64_t p_seed) {1422Math::seed(p_seed);1423}14241425uint32_t godotsharp_rand_from_seed(uint64_t p_seed, uint64_t *r_new_seed) {1426uint32_t ret = Math::rand_from_seed(&p_seed);1427*r_new_seed = p_seed;1428return ret;1429}14301431void godotsharp_weakref(Object *p_ptr, Ref<RefCounted> *r_weak_ref) {1432if (!p_ptr) {1433return;1434}14351436Ref<WeakRef> wref;1437RefCounted *rc = Object::cast_to<RefCounted>(p_ptr);14381439if (rc) {1440Ref<RefCounted> r = rc;1441if (r.is_null()) {1442return;1443}14441445wref.instantiate();1446wref->set_ref(r);1447} else {1448wref.instantiate();1449wref->set_obj(p_ptr);1450}14511452memnew_placement(r_weak_ref, Ref<RefCounted>(wref));1453}14541455void godotsharp_print(const godot_string *p_what) {1456print_line(*reinterpret_cast<const String *>(p_what));1457}14581459void godotsharp_print_rich(const godot_string *p_what) {1460print_line_rich(*reinterpret_cast<const String *>(p_what));1461}14621463void godotsharp_printerr(const godot_string *p_what) {1464print_error(*reinterpret_cast<const String *>(p_what));1465}14661467void godotsharp_printt(const godot_string *p_what) {1468print_line(*reinterpret_cast<const String *>(p_what));1469}14701471void godotsharp_prints(const godot_string *p_what) {1472print_line(*reinterpret_cast<const String *>(p_what));1473}14741475void godotsharp_printraw(const godot_string *p_what) {1476OS::get_singleton()->print("%s", reinterpret_cast<const String *>(p_what)->utf8().get_data());1477}14781479void godotsharp_err_print_error(const godot_string *p_function, const godot_string *p_file, int32_t p_line, const godot_string *p_error, const godot_string *p_message, bool p_editor_notify, ErrorHandlerType p_type) {1480_err_print_error(1481reinterpret_cast<const String *>(p_function)->utf8().get_data(),1482reinterpret_cast<const String *>(p_file)->utf8().get_data(),1483p_line,1484reinterpret_cast<const String *>(p_error)->utf8().get_data(),1485reinterpret_cast<const String *>(p_message)->utf8().get_data(),1486p_editor_notify, p_type);1487}14881489void godotsharp_var_to_str(const godot_variant *p_var, godot_string *r_ret) {1490const Variant &var = *reinterpret_cast<const Variant *>(p_var);1491String &vars = *memnew_placement(r_ret, String);1492VariantWriter::write_to_string(var, vars);1493}14941495void godotsharp_str_to_var(const godot_string *p_str, godot_variant *r_ret) {1496Variant ret;14971498VariantParser::StreamString ss;1499ss.s = *reinterpret_cast<const String *>(p_str);15001501String errs;1502int line;1503Error err = VariantParser::parse(&ss, ret, errs, line);1504if (err != OK) {1505String err_str = "Parse error at line " + itos(line) + ": " + errs + ".";1506ERR_PRINT(err_str);1507ret = err_str;1508}1509memnew_placement(r_ret, Variant(ret));1510}15111512void godotsharp_var_to_bytes(const godot_variant *p_var, bool p_full_objects, godot_packed_array *r_bytes) {1513const Variant &var = *reinterpret_cast<const Variant *>(p_var);1514PackedByteArray &bytes = *memnew_placement(r_bytes, PackedByteArray);15151516int len;1517Error err = encode_variant(var, nullptr, len, p_full_objects);1518ERR_FAIL_COND_MSG(err != OK, "Unexpected error encoding variable to bytes, likely unserializable type found (Object or RID).");15191520bytes.resize(len);1521encode_variant(var, bytes.ptrw(), len, p_full_objects);1522}15231524void godotsharp_bytes_to_var(const godot_packed_array *p_bytes, bool p_allow_objects, godot_variant *r_ret) {1525const PackedByteArray *bytes = reinterpret_cast<const PackedByteArray *>(p_bytes);1526Variant ret;1527Error err = decode_variant(ret, bytes->ptr(), bytes->size(), nullptr, p_allow_objects);1528if (err != OK) {1529ret = RTR("Not enough bytes for decoding bytes, or invalid format.");1530}1531memnew_placement(r_ret, Variant(ret));1532}15331534int godotsharp_hash(const godot_variant *p_var) {1535return reinterpret_cast<const Variant *>(p_var)->hash();1536}15371538void godotsharp_convert(const godot_variant *p_what, int32_t p_type, godot_variant *r_ret) {1539const Variant *args[1] = { reinterpret_cast<const Variant *>(p_what) };1540Callable::CallError ce;1541Variant ret;1542Variant::construct(Variant::Type(p_type), ret, args, 1, ce);1543if (ce.error != Callable::CallError::CALL_OK) {1544memnew_placement(r_ret, Variant);1545ERR_FAIL_MSG("Unable to convert parameter from '" +1546Variant::get_type_name(reinterpret_cast<const Variant *>(p_what)->get_type()) +1547"' to '" + Variant::get_type_name(Variant::Type(p_type)) + "'.");1548}1549memnew_placement(r_ret, Variant(ret));1550}15511552Object *godotsharp_instance_from_id(uint64_t p_instance_id) {1553return ObjectDB::get_instance(ObjectID(p_instance_id));1554}15551556void godotsharp_object_to_string(Object *p_ptr, godot_string *r_str) {1557#ifdef DEBUG_ENABLED1558// Cannot happen in C#; would get an ObjectDisposedException instead.1559CRASH_COND(p_ptr == nullptr);1560#endif1561// Can't call 'Object::to_string()' here, as that can end up calling 'ToString' again resulting in an endless circular loop.1562memnew_placement(r_str,1563String("<" + p_ptr->get_class() + "#" + itos(p_ptr->get_instance_id()) + ">"));1564}15651566#ifdef __cplusplus1567}1568#endif15691570// The order in this array must match the declaration order of1571// the methods in 'GodotSharp/Core/NativeInterop/NativeFuncs.cs'.1572static const void *unmanaged_callbacks[]{1573(void *)godotsharp_dotnet_module_is_initialized,1574(void *)godotsharp_method_bind_get_method,1575(void *)godotsharp_method_bind_get_method_with_compatibility,1576(void *)godotsharp_get_class_constructor,1577(void *)godotsharp_engine_get_singleton,1578(void *)godotsharp_stack_info_vector_resize,1579(void *)godotsharp_stack_info_vector_destroy,1580(void *)godotsharp_internal_editor_file_system_update_files,1581(void *)godotsharp_internal_script_debugger_send_error,1582(void *)godotsharp_internal_script_debugger_is_active,1583(void *)godotsharp_internal_object_get_associated_gchandle,1584(void *)godotsharp_internal_object_disposed,1585(void *)godotsharp_internal_refcounted_disposed,1586(void *)godotsharp_internal_signal_awaiter_connect,1587(void *)godotsharp_internal_tie_native_managed_to_unmanaged,1588(void *)godotsharp_internal_tie_user_managed_to_unmanaged,1589(void *)godotsharp_internal_tie_managed_to_unmanaged_with_pre_setup,1590(void *)godotsharp_internal_unmanaged_get_script_instance_managed,1591(void *)godotsharp_internal_unmanaged_get_instance_binding_managed,1592(void *)godotsharp_internal_unmanaged_instance_binding_create_managed,1593(void *)godotsharp_internal_new_csharp_script,1594(void *)godotsharp_internal_script_load,1595(void *)godotsharp_internal_reload_registered_script,1596(void *)godotsharp_array_filter_godot_objects_by_native,1597(void *)godotsharp_array_filter_godot_objects_by_non_native,1598(void *)godotsharp_ref_new_from_ref_counted_ptr,1599(void *)godotsharp_ref_destroy,1600(void *)godotsharp_string_name_new_from_string,1601(void *)godotsharp_node_path_new_from_string,1602(void *)godotsharp_string_name_as_string,1603(void *)godotsharp_node_path_as_string,1604(void *)godotsharp_packed_byte_array_new_mem_copy,1605(void *)godotsharp_packed_int32_array_new_mem_copy,1606(void *)godotsharp_packed_int64_array_new_mem_copy,1607(void *)godotsharp_packed_float32_array_new_mem_copy,1608(void *)godotsharp_packed_float64_array_new_mem_copy,1609(void *)godotsharp_packed_vector2_array_new_mem_copy,1610(void *)godotsharp_packed_vector3_array_new_mem_copy,1611(void *)godotsharp_packed_vector4_array_new_mem_copy,1612(void *)godotsharp_packed_color_array_new_mem_copy,1613(void *)godotsharp_packed_string_array_add,1614(void *)godotsharp_callable_new_with_delegate,1615(void *)godotsharp_callable_get_data_for_marshalling,1616(void *)godotsharp_callable_call,1617(void *)godotsharp_callable_call_deferred,1618(void *)godotsharp_color_from_ok_hsl,1619(void *)godotsharp_color_get_ok_hsl_h,1620(void *)godotsharp_color_get_ok_hsl_s,1621(void *)godotsharp_color_get_ok_hsl_l,1622(void *)godotsharp_method_bind_ptrcall,1623(void *)godotsharp_method_bind_call,1624(void *)godotsharp_variant_new_string_name,1625(void *)godotsharp_variant_new_copy,1626(void *)godotsharp_variant_new_node_path,1627(void *)godotsharp_variant_new_object,1628(void *)godotsharp_variant_new_transform2d,1629(void *)godotsharp_variant_new_basis,1630(void *)godotsharp_variant_new_transform3d,1631(void *)godotsharp_variant_new_projection,1632(void *)godotsharp_variant_new_aabb,1633(void *)godotsharp_variant_new_dictionary,1634(void *)godotsharp_variant_new_array,1635(void *)godotsharp_variant_new_packed_byte_array,1636(void *)godotsharp_variant_new_packed_int32_array,1637(void *)godotsharp_variant_new_packed_int64_array,1638(void *)godotsharp_variant_new_packed_float32_array,1639(void *)godotsharp_variant_new_packed_float64_array,1640(void *)godotsharp_variant_new_packed_string_array,1641(void *)godotsharp_variant_new_packed_vector2_array,1642(void *)godotsharp_variant_new_packed_vector3_array,1643(void *)godotsharp_variant_new_packed_vector4_array,1644(void *)godotsharp_variant_new_packed_color_array,1645(void *)godotsharp_variant_as_bool,1646(void *)godotsharp_variant_as_int,1647(void *)godotsharp_variant_as_float,1648(void *)godotsharp_variant_as_string,1649(void *)godotsharp_variant_as_vector2,1650(void *)godotsharp_variant_as_vector2i,1651(void *)godotsharp_variant_as_rect2,1652(void *)godotsharp_variant_as_rect2i,1653(void *)godotsharp_variant_as_vector3,1654(void *)godotsharp_variant_as_vector3i,1655(void *)godotsharp_variant_as_transform2d,1656(void *)godotsharp_variant_as_vector4,1657(void *)godotsharp_variant_as_vector4i,1658(void *)godotsharp_variant_as_plane,1659(void *)godotsharp_variant_as_quaternion,1660(void *)godotsharp_variant_as_aabb,1661(void *)godotsharp_variant_as_basis,1662(void *)godotsharp_variant_as_transform3d,1663(void *)godotsharp_variant_as_projection,1664(void *)godotsharp_variant_as_color,1665(void *)godotsharp_variant_as_string_name,1666(void *)godotsharp_variant_as_node_path,1667(void *)godotsharp_variant_as_rid,1668(void *)godotsharp_variant_as_callable,1669(void *)godotsharp_variant_as_signal,1670(void *)godotsharp_variant_as_dictionary,1671(void *)godotsharp_variant_as_array,1672(void *)godotsharp_variant_as_packed_byte_array,1673(void *)godotsharp_variant_as_packed_int32_array,1674(void *)godotsharp_variant_as_packed_int64_array,1675(void *)godotsharp_variant_as_packed_float32_array,1676(void *)godotsharp_variant_as_packed_float64_array,1677(void *)godotsharp_variant_as_packed_string_array,1678(void *)godotsharp_variant_as_packed_vector2_array,1679(void *)godotsharp_variant_as_packed_vector3_array,1680(void *)godotsharp_variant_as_packed_vector4_array,1681(void *)godotsharp_variant_as_packed_color_array,1682(void *)godotsharp_variant_equals,1683(void *)godotsharp_string_new_with_utf16_chars,1684(void *)godotsharp_string_name_new_copy,1685(void *)godotsharp_node_path_new_copy,1686(void *)godotsharp_array_new,1687(void *)godotsharp_array_new_copy,1688(void *)godotsharp_array_ptrw,1689(void *)godotsharp_dictionary_new,1690(void *)godotsharp_dictionary_new_copy,1691(void *)godotsharp_packed_byte_array_destroy,1692(void *)godotsharp_packed_int32_array_destroy,1693(void *)godotsharp_packed_int64_array_destroy,1694(void *)godotsharp_packed_float32_array_destroy,1695(void *)godotsharp_packed_float64_array_destroy,1696(void *)godotsharp_packed_string_array_destroy,1697(void *)godotsharp_packed_vector2_array_destroy,1698(void *)godotsharp_packed_vector3_array_destroy,1699(void *)godotsharp_packed_vector4_array_destroy,1700(void *)godotsharp_packed_color_array_destroy,1701(void *)godotsharp_variant_destroy,1702(void *)godotsharp_string_destroy,1703(void *)godotsharp_string_name_destroy,1704(void *)godotsharp_node_path_destroy,1705(void *)godotsharp_signal_destroy,1706(void *)godotsharp_callable_destroy,1707(void *)godotsharp_array_destroy,1708(void *)godotsharp_dictionary_destroy,1709(void *)godotsharp_array_add,1710(void *)godotsharp_array_add_range,1711(void *)godotsharp_array_binary_search,1712(void *)godotsharp_array_duplicate,1713(void *)godotsharp_array_fill,1714(void *)godotsharp_array_index_of,1715(void *)godotsharp_array_insert,1716(void *)godotsharp_array_last_index_of,1717(void *)godotsharp_array_make_read_only,1718(void *)godotsharp_array_set_typed,1719(void *)godotsharp_array_is_typed,1720(void *)godotsharp_array_max,1721(void *)godotsharp_array_min,1722(void *)godotsharp_array_pick_random,1723(void *)godotsharp_array_recursive_equal,1724(void *)godotsharp_array_remove_at,1725(void *)godotsharp_array_resize,1726(void *)godotsharp_array_reverse,1727(void *)godotsharp_array_shuffle,1728(void *)godotsharp_array_slice,1729(void *)godotsharp_array_sort,1730(void *)godotsharp_array_to_string,1731(void *)godotsharp_packed_byte_array_compress,1732(void *)godotsharp_packed_byte_array_decompress,1733(void *)godotsharp_packed_byte_array_decompress_dynamic,1734(void *)godotsharp_dictionary_try_get_value,1735(void *)godotsharp_dictionary_set_value,1736(void *)godotsharp_dictionary_keys,1737(void *)godotsharp_dictionary_values,1738(void *)godotsharp_dictionary_count,1739(void *)godotsharp_dictionary_key_value_pair_at,1740(void *)godotsharp_dictionary_add,1741(void *)godotsharp_dictionary_clear,1742(void *)godotsharp_dictionary_contains_key,1743(void *)godotsharp_dictionary_duplicate,1744(void *)godotsharp_dictionary_merge,1745(void *)godotsharp_dictionary_recursive_equal,1746(void *)godotsharp_dictionary_remove_key,1747(void *)godotsharp_dictionary_make_read_only,1748(void *)godotsharp_dictionary_set_typed,1749(void *)godotsharp_dictionary_is_typed_key,1750(void *)godotsharp_dictionary_is_typed_value,1751(void *)godotsharp_dictionary_get_typed_key_builtin,1752(void *)godotsharp_dictionary_get_typed_value_builtin,1753(void *)godotsharp_dictionary_get_typed_key_class_name,1754(void *)godotsharp_dictionary_get_typed_value_class_name,1755(void *)godotsharp_dictionary_get_typed_key_script,1756(void *)godotsharp_dictionary_get_typed_value_script,1757(void *)godotsharp_dictionary_to_string,1758(void *)godotsharp_string_simplify_path,1759(void *)godotsharp_string_capitalize,1760(void *)godotsharp_string_to_camel_case,1761(void *)godotsharp_string_to_pascal_case,1762(void *)godotsharp_string_to_snake_case,1763(void *)godotsharp_string_to_kebab_case,1764(void *)godotsharp_node_path_get_as_property_path,1765(void *)godotsharp_node_path_get_concatenated_names,1766(void *)godotsharp_node_path_get_concatenated_subnames,1767(void *)godotsharp_node_path_get_name,1768(void *)godotsharp_node_path_get_name_count,1769(void *)godotsharp_node_path_get_subname,1770(void *)godotsharp_node_path_get_subname_count,1771(void *)godotsharp_node_path_is_absolute,1772(void *)godotsharp_node_path_equals,1773(void *)godotsharp_node_path_hash,1774(void *)godotsharp_bytes_to_var,1775(void *)godotsharp_convert,1776(void *)godotsharp_hash,1777(void *)godotsharp_instance_from_id,1778(void *)godotsharp_print,1779(void *)godotsharp_print_rich,1780(void *)godotsharp_printerr,1781(void *)godotsharp_printraw,1782(void *)godotsharp_prints,1783(void *)godotsharp_printt,1784(void *)godotsharp_randf,1785(void *)godotsharp_randi,1786(void *)godotsharp_randomize,1787(void *)godotsharp_randf_range,1788(void *)godotsharp_randfn,1789(void *)godotsharp_randi_range,1790(void *)godotsharp_rand_from_seed,1791(void *)godotsharp_seed,1792(void *)godotsharp_weakref,1793(void *)godotsharp_str_to_var,1794(void *)godotsharp_var_to_bytes,1795(void *)godotsharp_var_to_str,1796(void *)godotsharp_err_print_error,1797(void *)godotsharp_object_to_string,1798};17991800const void **godotsharp::get_runtime_interop_funcs(int32_t &r_size) {1801r_size = sizeof(unmanaged_callbacks);1802return unmanaged_callbacks;1803}180418051806