|
@@ -45,273 +45,13 @@
|
|
|
#include "../utils/macros.h"
|
|
|
#include "../utils/mutex_utils.h"
|
|
|
#include "gd_mono.h"
|
|
|
+#include "gd_mono_cache.h"
|
|
|
#include "gd_mono_class.h"
|
|
|
#include "gd_mono_marshal.h"
|
|
|
+#include "gd_mono_method_thunk.h"
|
|
|
|
|
|
namespace GDMonoUtils {
|
|
|
|
|
|
-MonoCache mono_cache;
|
|
|
-
|
|
|
-#define CACHE_AND_CHECK(m_var, m_val) \
|
|
|
- { \
|
|
|
- CRASH_COND(m_var != NULL); \
|
|
|
- m_var = m_val; \
|
|
|
- ERR_FAIL_COND_MSG(!m_var, "Mono Cache: Member " #m_var " is null."); \
|
|
|
- }
|
|
|
-
|
|
|
-#define CACHE_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.class_##m_class, m_val)
|
|
|
-#define CACHE_NS_CLASS_AND_CHECK(m_ns, m_class, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.class_##m_ns##_##m_class, m_val)
|
|
|
-#define CACHE_RAW_MONO_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.rawclass_##m_class, m_val)
|
|
|
-#define CACHE_FIELD_AND_CHECK(m_class, m_field, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.field_##m_class##_##m_field, m_val)
|
|
|
-#define CACHE_METHOD_AND_CHECK(m_class, m_method, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.method_##m_class##_##m_method, m_val)
|
|
|
-#define CACHE_METHOD_THUNK_AND_CHECK(m_class, m_method, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.methodthunk_##m_class##_##m_method, m_val)
|
|
|
-#define CACHE_PROPERTY_AND_CHECK(m_class, m_property, m_val) CACHE_AND_CHECK(GDMonoUtils::mono_cache.property_##m_class##_##m_property, m_val)
|
|
|
-
|
|
|
-void MonoCache::clear_corlib_cache() {
|
|
|
-
|
|
|
- corlib_cache_updated = false;
|
|
|
-
|
|
|
- class_MonoObject = NULL;
|
|
|
- class_bool = NULL;
|
|
|
- class_int8_t = NULL;
|
|
|
- class_int16_t = NULL;
|
|
|
- class_int32_t = NULL;
|
|
|
- class_int64_t = NULL;
|
|
|
- class_uint8_t = NULL;
|
|
|
- class_uint16_t = NULL;
|
|
|
- class_uint32_t = NULL;
|
|
|
- class_uint64_t = NULL;
|
|
|
- class_float = NULL;
|
|
|
- class_double = NULL;
|
|
|
- class_String = NULL;
|
|
|
- class_IntPtr = NULL;
|
|
|
-
|
|
|
- class_System_Collections_IEnumerable = NULL;
|
|
|
- class_System_Collections_IDictionary = NULL;
|
|
|
-
|
|
|
-#ifdef DEBUG_ENABLED
|
|
|
- class_System_Diagnostics_StackTrace = NULL;
|
|
|
- methodthunk_System_Diagnostics_StackTrace_GetFrames = NULL;
|
|
|
- method_System_Diagnostics_StackTrace_ctor_bool = NULL;
|
|
|
- method_System_Diagnostics_StackTrace_ctor_Exception_bool = NULL;
|
|
|
-#endif
|
|
|
-
|
|
|
- class_KeyNotFoundException = NULL;
|
|
|
-}
|
|
|
-
|
|
|
-void MonoCache::clear_godot_api_cache() {
|
|
|
-
|
|
|
- godot_api_cache_updated = false;
|
|
|
-
|
|
|
- rawclass_Dictionary = NULL;
|
|
|
-
|
|
|
- class_Vector2 = NULL;
|
|
|
- class_Rect2 = NULL;
|
|
|
- class_Transform2D = NULL;
|
|
|
- class_Vector3 = NULL;
|
|
|
- class_Basis = NULL;
|
|
|
- class_Quat = NULL;
|
|
|
- class_Transform = NULL;
|
|
|
- class_AABB = NULL;
|
|
|
- class_Color = NULL;
|
|
|
- class_Plane = NULL;
|
|
|
- class_NodePath = NULL;
|
|
|
- class_RID = NULL;
|
|
|
- class_GodotObject = NULL;
|
|
|
- class_GodotResource = NULL;
|
|
|
- class_Node = NULL;
|
|
|
- class_Control = NULL;
|
|
|
- class_Spatial = NULL;
|
|
|
- class_WeakRef = NULL;
|
|
|
- class_Array = NULL;
|
|
|
- class_Dictionary = NULL;
|
|
|
- class_MarshalUtils = NULL;
|
|
|
- class_ISerializationListener = NULL;
|
|
|
-
|
|
|
-#ifdef DEBUG_ENABLED
|
|
|
- class_DebuggingUtils = NULL;
|
|
|
- methodthunk_DebuggingUtils_GetStackFrameInfo = NULL;
|
|
|
-#endif
|
|
|
-
|
|
|
- class_ExportAttribute = NULL;
|
|
|
- field_ExportAttribute_hint = NULL;
|
|
|
- field_ExportAttribute_hintString = NULL;
|
|
|
- class_SignalAttribute = NULL;
|
|
|
- class_ToolAttribute = NULL;
|
|
|
- class_RemoteAttribute = NULL;
|
|
|
- class_SyncAttribute = NULL;
|
|
|
- class_MasterAttribute = NULL;
|
|
|
- class_PuppetAttribute = NULL;
|
|
|
- class_SlaveAttribute = NULL;
|
|
|
- class_RemoteSyncAttribute = NULL;
|
|
|
- class_MasterSyncAttribute = NULL;
|
|
|
- class_PuppetSyncAttribute = NULL;
|
|
|
- class_GodotMethodAttribute = NULL;
|
|
|
- field_GodotMethodAttribute_methodName = NULL;
|
|
|
-
|
|
|
- field_GodotObject_ptr = NULL;
|
|
|
- field_NodePath_ptr = NULL;
|
|
|
- field_Image_ptr = NULL;
|
|
|
- field_RID_ptr = NULL;
|
|
|
-
|
|
|
- methodthunk_GodotObject_Dispose = NULL;
|
|
|
- methodthunk_Array_GetPtr = NULL;
|
|
|
- methodthunk_Dictionary_GetPtr = NULL;
|
|
|
- methodthunk_SignalAwaiter_SignalCallback = NULL;
|
|
|
- methodthunk_SignalAwaiter_FailureCallback = NULL;
|
|
|
- methodthunk_GodotTaskScheduler_Activate = NULL;
|
|
|
-
|
|
|
- // Start of MarshalUtils methods
|
|
|
-
|
|
|
- methodthunk_MarshalUtils_TypeIsGenericArray = NULL;
|
|
|
- methodthunk_MarshalUtils_TypeIsGenericDictionary = NULL;
|
|
|
-
|
|
|
- methodthunk_MarshalUtils_ArrayGetElementType = NULL;
|
|
|
- methodthunk_MarshalUtils_DictionaryGetKeyValueTypes = NULL;
|
|
|
-
|
|
|
- methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType = NULL;
|
|
|
- methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType = NULL;
|
|
|
- methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info = NULL;
|
|
|
- methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info = NULL;
|
|
|
-
|
|
|
- methodthunk_MarshalUtils_MakeGenericArrayType = NULL;
|
|
|
- methodthunk_MarshalUtils_MakeGenericDictionaryType = NULL;
|
|
|
-
|
|
|
- methodthunk_MarshalUtils_EnumerableToArray = NULL;
|
|
|
- methodthunk_MarshalUtils_IDictionaryToDictionary = NULL;
|
|
|
- methodthunk_MarshalUtils_GenericIDictionaryToDictionary = NULL;
|
|
|
-
|
|
|
- // End of MarshalUtils methods
|
|
|
-
|
|
|
- task_scheduler_handle = Ref<MonoGCHandle>();
|
|
|
-}
|
|
|
-
|
|
|
-#define GODOT_API_CLASS(m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(BINDINGS_NAMESPACE, #m_class))
|
|
|
-#define GODOT_API_NS_CLAS(m_ns, m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(m_ns, #m_class))
|
|
|
-
|
|
|
-void update_corlib_cache() {
|
|
|
-
|
|
|
- CACHE_CLASS_AND_CHECK(MonoObject, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_object_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(bool, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_boolean_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(int8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_sbyte_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(int16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int16_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(int32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int32_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(int64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int64_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(uint8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_byte_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(uint16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint16_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(uint32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint32_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(uint64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint64_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(float, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_single_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(double, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_double_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(String, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_string_class()));
|
|
|
- CACHE_CLASS_AND_CHECK(IntPtr, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_intptr_class()));
|
|
|
-
|
|
|
- CACHE_CLASS_AND_CHECK(System_Collections_IEnumerable, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IEnumerable"));
|
|
|
- CACHE_CLASS_AND_CHECK(System_Collections_IDictionary, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IDictionary"));
|
|
|
-
|
|
|
-#ifdef DEBUG_ENABLED
|
|
|
- CACHE_CLASS_AND_CHECK(System_Diagnostics_StackTrace, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Diagnostics", "StackTrace"));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(System_Diagnostics_StackTrace, GetFrames, (StackTrace_GetFrames)CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_thunk("GetFrames"));
|
|
|
- CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(bool)", true));
|
|
|
- CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_Exception_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(System.Exception,bool)", true));
|
|
|
-#endif
|
|
|
-
|
|
|
- CACHE_CLASS_AND_CHECK(KeyNotFoundException, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections.Generic", "KeyNotFoundException"));
|
|
|
-
|
|
|
- mono_cache.corlib_cache_updated = true;
|
|
|
-}
|
|
|
-
|
|
|
-void update_godot_api_cache() {
|
|
|
-
|
|
|
- CACHE_CLASS_AND_CHECK(Vector2, GODOT_API_CLASS(Vector2));
|
|
|
- CACHE_CLASS_AND_CHECK(Rect2, GODOT_API_CLASS(Rect2));
|
|
|
- CACHE_CLASS_AND_CHECK(Transform2D, GODOT_API_CLASS(Transform2D));
|
|
|
- CACHE_CLASS_AND_CHECK(Vector3, GODOT_API_CLASS(Vector3));
|
|
|
- CACHE_CLASS_AND_CHECK(Basis, GODOT_API_CLASS(Basis));
|
|
|
- CACHE_CLASS_AND_CHECK(Quat, GODOT_API_CLASS(Quat));
|
|
|
- CACHE_CLASS_AND_CHECK(Transform, GODOT_API_CLASS(Transform));
|
|
|
- CACHE_CLASS_AND_CHECK(AABB, GODOT_API_CLASS(AABB));
|
|
|
- CACHE_CLASS_AND_CHECK(Color, GODOT_API_CLASS(Color));
|
|
|
- CACHE_CLASS_AND_CHECK(Plane, GODOT_API_CLASS(Plane));
|
|
|
- CACHE_CLASS_AND_CHECK(NodePath, GODOT_API_CLASS(NodePath));
|
|
|
- CACHE_CLASS_AND_CHECK(RID, GODOT_API_CLASS(RID));
|
|
|
- CACHE_CLASS_AND_CHECK(GodotObject, GODOT_API_CLASS(Object));
|
|
|
- CACHE_CLASS_AND_CHECK(GodotResource, GODOT_API_CLASS(Resource));
|
|
|
- CACHE_CLASS_AND_CHECK(Node, GODOT_API_CLASS(Node));
|
|
|
- CACHE_CLASS_AND_CHECK(Control, GODOT_API_CLASS(Control));
|
|
|
- CACHE_CLASS_AND_CHECK(Spatial, GODOT_API_CLASS(Spatial));
|
|
|
- CACHE_CLASS_AND_CHECK(WeakRef, GODOT_API_CLASS(WeakRef));
|
|
|
- CACHE_CLASS_AND_CHECK(Array, GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Array));
|
|
|
- CACHE_CLASS_AND_CHECK(Dictionary, GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary));
|
|
|
- CACHE_CLASS_AND_CHECK(MarshalUtils, GODOT_API_CLASS(MarshalUtils));
|
|
|
- CACHE_CLASS_AND_CHECK(ISerializationListener, GODOT_API_CLASS(ISerializationListener));
|
|
|
-
|
|
|
-#ifdef DEBUG_ENABLED
|
|
|
- CACHE_CLASS_AND_CHECK(DebuggingUtils, GODOT_API_CLASS(DebuggingUtils));
|
|
|
-#endif
|
|
|
-
|
|
|
- // Attributes
|
|
|
- CACHE_CLASS_AND_CHECK(ExportAttribute, GODOT_API_CLASS(ExportAttribute));
|
|
|
- CACHE_FIELD_AND_CHECK(ExportAttribute, hint, CACHED_CLASS(ExportAttribute)->get_field("hint"));
|
|
|
- CACHE_FIELD_AND_CHECK(ExportAttribute, hintString, CACHED_CLASS(ExportAttribute)->get_field("hintString"));
|
|
|
- CACHE_CLASS_AND_CHECK(SignalAttribute, GODOT_API_CLASS(SignalAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(ToolAttribute, GODOT_API_CLASS(ToolAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(RemoteAttribute, GODOT_API_CLASS(RemoteAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(SyncAttribute, GODOT_API_CLASS(SyncAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(MasterAttribute, GODOT_API_CLASS(MasterAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(PuppetAttribute, GODOT_API_CLASS(PuppetAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(SlaveAttribute, GODOT_API_CLASS(SlaveAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(RemoteSyncAttribute, GODOT_API_CLASS(RemoteSyncAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(MasterSyncAttribute, GODOT_API_CLASS(MasterSyncAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(PuppetSyncAttribute, GODOT_API_CLASS(PuppetSyncAttribute));
|
|
|
- CACHE_CLASS_AND_CHECK(GodotMethodAttribute, GODOT_API_CLASS(GodotMethodAttribute));
|
|
|
- CACHE_FIELD_AND_CHECK(GodotMethodAttribute, methodName, CACHED_CLASS(GodotMethodAttribute)->get_field("methodName"));
|
|
|
-
|
|
|
- CACHE_FIELD_AND_CHECK(GodotObject, ptr, CACHED_CLASS(GodotObject)->get_field(BINDINGS_PTR_FIELD));
|
|
|
- CACHE_FIELD_AND_CHECK(NodePath, ptr, CACHED_CLASS(NodePath)->get_field(BINDINGS_PTR_FIELD));
|
|
|
- CACHE_FIELD_AND_CHECK(RID, ptr, CACHED_CLASS(RID)->get_field(BINDINGS_PTR_FIELD));
|
|
|
-
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(GodotObject, Dispose, (GodotObject_Dispose)CACHED_CLASS(GodotObject)->get_method_thunk("Dispose", 0));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(Array, GetPtr, (Array_GetPtr)GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Array)->get_method_thunk("GetPtr", 0));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(Dictionary, GetPtr, (Dictionary_GetPtr)GODOT_API_NS_CLAS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary)->get_method_thunk("GetPtr", 0));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, (SignalAwaiter_SignalCallback)GODOT_API_CLASS(SignalAwaiter)->get_method_thunk("SignalCallback", 1));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, FailureCallback, (SignalAwaiter_FailureCallback)GODOT_API_CLASS(SignalAwaiter)->get_method_thunk("FailureCallback", 0));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, (GodotTaskScheduler_Activate)GODOT_API_CLASS(GodotTaskScheduler)->get_method_thunk("Activate", 0));
|
|
|
-
|
|
|
- // Start of MarshalUtils methods
|
|
|
-
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericArray, (TypeIsGenericArray)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("TypeIsGenericArray", 1));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericDictionary, (TypeIsGenericDictionary)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("TypeIsGenericDictionary", 1));
|
|
|
-
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, ArrayGetElementType, (ArrayGetElementType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("ArrayGetElementType", 2));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, DictionaryGetKeyValueTypes, (DictionaryGetKeyValueTypes)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("DictionaryGetKeyValueTypes", 3));
|
|
|
-
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType, (GenericIEnumerableIsAssignableFromType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIEnumerableIsAssignableFromType", 1));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType, (GenericIDictionaryIsAssignableFromType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIDictionaryIsAssignableFromType", 1));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info, (GenericIEnumerableIsAssignableFromType_with_info)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIEnumerableIsAssignableFromType", 2));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info, (GenericIDictionaryIsAssignableFromType_with_info)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIDictionaryIsAssignableFromType", 3));
|
|
|
-
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericArrayType, (MakeGenericArrayType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("MakeGenericArrayType", 1));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericDictionaryType, (MakeGenericDictionaryType)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("MakeGenericDictionaryType", 2));
|
|
|
-
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, EnumerableToArray, (EnumerableToArray)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("EnumerableToArray", 2));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IDictionaryToDictionary, (IDictionaryToDictionary)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("IDictionaryToDictionary", 2));
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryToDictionary, (GenericIDictionaryToDictionary)GODOT_API_CLASS(MarshalUtils)->get_method_thunk("GenericIDictionaryToDictionary", 2));
|
|
|
-
|
|
|
- // End of MarshalUtils methods
|
|
|
-
|
|
|
-#ifdef DEBUG_ENABLED
|
|
|
- CACHE_METHOD_THUNK_AND_CHECK(DebuggingUtils, GetStackFrameInfo, (DebugUtils_StackFrameInfo)GODOT_API_CLASS(DebuggingUtils)->get_method_thunk("GetStackFrameInfo", 4));
|
|
|
-#endif
|
|
|
-
|
|
|
- // TODO Move to CSharpLanguage::init() and do handle disposal
|
|
|
- MonoObject *task_scheduler = mono_object_new(mono_domain_get(), GODOT_API_CLASS(GodotTaskScheduler)->get_mono_ptr());
|
|
|
- GDMonoUtils::runtime_object_init(task_scheduler, GODOT_API_CLASS(GodotTaskScheduler));
|
|
|
- mono_cache.task_scheduler_handle = MonoGCHandle::create_strong(task_scheduler);
|
|
|
-
|
|
|
- mono_cache.godot_api_cache_updated = true;
|
|
|
-}
|
|
|
-
|
|
|
MonoObject *unmanaged_get_managed(Object *unmanaged) {
|
|
|
|
|
|
if (!unmanaged)
|
|
@@ -386,7 +126,7 @@ void set_main_thread(MonoThread *p_thread) {
|
|
|
|
|
|
void attach_current_thread() {
|
|
|
ERR_FAIL_COND(!GDMono::get_singleton()->is_runtime_initialized());
|
|
|
- MonoThread *mono_thread = mono_thread_attach(mono_domain_get());
|
|
|
+ MonoThread *mono_thread = mono_thread_attach(mono_get_root_domain());
|
|
|
ERR_FAIL_NULL(mono_thread);
|
|
|
}
|
|
|
|
|
@@ -421,7 +161,7 @@ GDMonoClass *type_get_proxy_class(const StringName &p_type) {
|
|
|
|
|
|
if (klass && klass->is_static()) {
|
|
|
// A static class means this is a Godot singleton class. If an instance is needed we use Godot.Object.
|
|
|
- return mono_cache.class_GodotObject;
|
|
|
+ return GDMonoCache::cached_data.class_GodotObject;
|
|
|
}
|
|
|
|
|
|
#ifdef TOOLS_ENABLED
|
|
@@ -751,16 +491,16 @@ uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool &
|
|
|
}
|
|
|
|
|
|
void dispose(MonoObject *p_mono_object, MonoException **r_exc) {
|
|
|
- invoke_method_thunk(CACHED_METHOD_THUNK(GodotObject, Dispose), p_mono_object, r_exc);
|
|
|
+ CACHED_METHOD_THUNK(GodotObject, Dispose).invoke(p_mono_object, r_exc);
|
|
|
}
|
|
|
|
|
|
namespace Marshal {
|
|
|
|
|
|
#ifdef MONO_GLUE_ENABLED
|
|
|
#ifdef TOOLS_ENABLED
|
|
|
-#define NO_GLUE_RET(m_ret) \
|
|
|
- { \
|
|
|
- if (!mono_cache.godot_api_cache_updated) return m_ret; \
|
|
|
+#define NO_GLUE_RET(m_ret) \
|
|
|
+ { \
|
|
|
+ if (!GDMonoCache::cached_data.godot_api_cache_updated) return m_ret; \
|
|
|
}
|
|
|
#else
|
|
|
#define NO_GLUE_RET(m_ret) \
|
|
@@ -773,68 +513,60 @@ namespace Marshal {
|
|
|
|
|
|
bool type_is_generic_array(MonoReflectionType *p_reftype) {
|
|
|
NO_GLUE_RET(false);
|
|
|
- TypeIsGenericArray thunk = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc);
|
|
|
+ MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericArray).invoke(p_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return (bool)res;
|
|
|
}
|
|
|
|
|
|
bool type_is_generic_dictionary(MonoReflectionType *p_reftype) {
|
|
|
NO_GLUE_RET(false);
|
|
|
- TypeIsGenericDictionary thunk = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc);
|
|
|
+ MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericDictionary).invoke(p_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return (bool)res;
|
|
|
}
|
|
|
|
|
|
void array_get_element_type(MonoReflectionType *p_array_reftype, MonoReflectionType **r_elem_reftype) {
|
|
|
- ArrayGetElementType thunk = CACHED_METHOD_THUNK(MarshalUtils, ArrayGetElementType);
|
|
|
MonoException *exc = NULL;
|
|
|
- invoke_method_thunk(thunk, p_array_reftype, r_elem_reftype, &exc);
|
|
|
+ CACHED_METHOD_THUNK(MarshalUtils, ArrayGetElementType).invoke(p_array_reftype, r_elem_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
}
|
|
|
|
|
|
void dictionary_get_key_value_types(MonoReflectionType *p_dict_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) {
|
|
|
- DictionaryGetKeyValueTypes thunk = CACHED_METHOD_THUNK(MarshalUtils, DictionaryGetKeyValueTypes);
|
|
|
MonoException *exc = NULL;
|
|
|
- invoke_method_thunk(thunk, p_dict_reftype, r_key_reftype, r_value_reftype, &exc);
|
|
|
+ CACHED_METHOD_THUNK(MarshalUtils, DictionaryGetKeyValueTypes).invoke(p_dict_reftype, r_key_reftype, r_value_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
}
|
|
|
|
|
|
bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype) {
|
|
|
NO_GLUE_RET(false);
|
|
|
- GenericIEnumerableIsAssignableFromType thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc);
|
|
|
+ MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType).invoke(p_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return (bool)res;
|
|
|
}
|
|
|
|
|
|
bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype) {
|
|
|
NO_GLUE_RET(false);
|
|
|
- GenericIDictionaryIsAssignableFromType thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoBoolean res = invoke_method_thunk(thunk, p_reftype, &exc);
|
|
|
+ MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType).invoke(p_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return (bool)res;
|
|
|
}
|
|
|
|
|
|
bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_elem_reftype) {
|
|
|
NO_GLUE_RET(false);
|
|
|
- GenericIEnumerableIsAssignableFromType_with_info thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoBoolean res = invoke_method_thunk(thunk, p_reftype, r_elem_reftype, &exc);
|
|
|
+ MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info).invoke(p_reftype, r_elem_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return (bool)res;
|
|
|
}
|
|
|
|
|
|
bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) {
|
|
|
NO_GLUE_RET(false);
|
|
|
- GenericIDictionaryIsAssignableFromType_with_info thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoBoolean res = invoke_method_thunk(thunk, p_reftype, r_key_reftype, r_value_reftype, &exc);
|
|
|
+ MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info).invoke(p_reftype, r_key_reftype, r_value_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return (bool)res;
|
|
|
}
|
|
@@ -842,9 +574,8 @@ bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype, MonoR
|
|
|
Array enumerable_to_array(MonoObject *p_enumerable) {
|
|
|
NO_GLUE_RET(Array());
|
|
|
Array result;
|
|
|
- EnumerableToArray thunk = CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray);
|
|
|
MonoException *exc = NULL;
|
|
|
- invoke_method_thunk(thunk, p_enumerable, &result, &exc);
|
|
|
+ CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray).invoke(p_enumerable, &result, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return result;
|
|
|
}
|
|
@@ -852,9 +583,8 @@ Array enumerable_to_array(MonoObject *p_enumerable) {
|
|
|
Dictionary idictionary_to_dictionary(MonoObject *p_idictionary) {
|
|
|
NO_GLUE_RET(Dictionary());
|
|
|
Dictionary result;
|
|
|
- IDictionaryToDictionary thunk = CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary);
|
|
|
MonoException *exc = NULL;
|
|
|
- invoke_method_thunk(thunk, p_idictionary, &result, &exc);
|
|
|
+ CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary).invoke(p_idictionary, &result, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return result;
|
|
|
}
|
|
@@ -862,27 +592,24 @@ Dictionary idictionary_to_dictionary(MonoObject *p_idictionary) {
|
|
|
Dictionary generic_idictionary_to_dictionary(MonoObject *p_generic_idictionary) {
|
|
|
NO_GLUE_RET(Dictionary());
|
|
|
Dictionary result;
|
|
|
- GenericIDictionaryToDictionary thunk = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryToDictionary);
|
|
|
MonoException *exc = NULL;
|
|
|
- invoke_method_thunk(thunk, p_generic_idictionary, &result, &exc);
|
|
|
+ CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryToDictionary).invoke(p_generic_idictionary, &result, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
GDMonoClass *make_generic_array_type(MonoReflectionType *p_elem_reftype) {
|
|
|
NO_GLUE_RET(NULL);
|
|
|
- MakeGenericArrayType thunk = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericArrayType);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoReflectionType *reftype = invoke_method_thunk(thunk, p_elem_reftype, &exc);
|
|
|
+ MonoReflectionType *reftype = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericArrayType).invoke(p_elem_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return GDMono::get_singleton()->get_class(mono_class_from_mono_type(mono_reflection_type_get_type(reftype)));
|
|
|
}
|
|
|
|
|
|
GDMonoClass *make_generic_dictionary_type(MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype) {
|
|
|
NO_GLUE_RET(NULL);
|
|
|
- MakeGenericDictionaryType thunk = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericDictionaryType);
|
|
|
MonoException *exc = NULL;
|
|
|
- MonoReflectionType *reftype = invoke_method_thunk(thunk, p_key_reftype, p_value_reftype, &exc);
|
|
|
+ MonoReflectionType *reftype = CACHED_METHOD_THUNK(MarshalUtils, MakeGenericDictionaryType).invoke(p_key_reftype, p_value_reftype, &exc);
|
|
|
UNHANDLED_EXCEPTION(exc);
|
|
|
return GDMono::get_singleton()->get_class(mono_class_from_mono_type(mono_reflection_type_get_type(reftype)));
|
|
|
}
|