#ifndef GD_MONO_CACHE_H #define GD_MONO_CACHE_H #include "gd_mono_header.h" #include "gd_mono_method_thunk.h" namespace GDMonoCache { struct CachedData { // ----------------------------------------------- // corlib classes // Let's use the no-namespace format for these too GDMonoClass *class_MonoObject; GDMonoClass *class_bool; GDMonoClass *class_int8_t; GDMonoClass *class_int16_t; GDMonoClass *class_int32_t; GDMonoClass *class_int64_t; GDMonoClass *class_uint8_t; GDMonoClass *class_uint16_t; GDMonoClass *class_uint32_t; GDMonoClass *class_uint64_t; GDMonoClass *class_float; GDMonoClass *class_double; GDMonoClass *class_String; GDMonoClass *class_IntPtr; GDMonoClass *class_System_Collections_IEnumerable; GDMonoClass *class_System_Collections_IDictionary; #ifdef DEBUG_ENABLED GDMonoClass *class_System_Diagnostics_StackTrace; GDMonoMethodThunkR methodthunk_System_Diagnostics_StackTrace_GetFrames; GDMonoMethod *method_System_Diagnostics_StackTrace_ctor_bool; GDMonoMethod *method_System_Diagnostics_StackTrace_ctor_Exception_bool; #endif GDMonoClass *class_KeyNotFoundException; MonoClass *rawclass_Dictionary; // ----------------------------------------------- GDMonoClass *class_Vector2; GDMonoClass *class_Rect2; GDMonoClass *class_Transform2D; GDMonoClass *class_Vector3; GDMonoClass *class_Basis; GDMonoClass *class_Quat; GDMonoClass *class_Transform; GDMonoClass *class_AABB; GDMonoClass *class_Color; GDMonoClass *class_Plane; GDMonoClass *class_NodePath; GDMonoClass *class_RID; GDMonoClass *class_GodotObject; GDMonoClass *class_GodotResource; GDMonoClass *class_Node; GDMonoClass *class_Control; GDMonoClass *class_Spatial; GDMonoClass *class_WeakRef; GDMonoClass *class_Array; GDMonoClass *class_Dictionary; GDMonoClass *class_MarshalUtils; GDMonoClass *class_ISerializationListener; #ifdef DEBUG_ENABLED GDMonoClass *class_DebuggingUtils; GDMonoMethodThunk methodthunk_DebuggingUtils_GetStackFrameInfo; #endif GDMonoClass *class_ExportAttribute; GDMonoField *field_ExportAttribute_hint; GDMonoField *field_ExportAttribute_hintString; GDMonoClass *class_SignalAttribute; GDMonoClass *class_ToolAttribute; GDMonoClass *class_RemoteAttribute; GDMonoClass *class_SyncAttribute; GDMonoClass *class_RemoteSyncAttribute; GDMonoClass *class_MasterSyncAttribute; GDMonoClass *class_PuppetSyncAttribute; GDMonoClass *class_MasterAttribute; GDMonoClass *class_PuppetAttribute; GDMonoClass *class_SlaveAttribute; GDMonoClass *class_GodotMethodAttribute; GDMonoField *field_GodotMethodAttribute_methodName; GDMonoField *field_GodotObject_ptr; GDMonoField *field_NodePath_ptr; GDMonoField *field_Image_ptr; GDMonoField *field_RID_ptr; GDMonoMethodThunk methodthunk_GodotObject_Dispose; GDMonoMethodThunkR methodthunk_Array_GetPtr; GDMonoMethodThunkR methodthunk_Dictionary_GetPtr; GDMonoMethodThunk methodthunk_SignalAwaiter_SignalCallback; GDMonoMethodThunk methodthunk_SignalAwaiter_FailureCallback; GDMonoMethodThunk methodthunk_GodotTaskScheduler_Activate; // Start of MarshalUtils methods GDMonoMethodThunkR methodthunk_MarshalUtils_TypeIsGenericArray; GDMonoMethodThunkR methodthunk_MarshalUtils_TypeIsGenericDictionary; GDMonoMethodThunk methodthunk_MarshalUtils_ArrayGetElementType; GDMonoMethodThunk methodthunk_MarshalUtils_DictionaryGetKeyValueTypes; GDMonoMethodThunkR methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType; GDMonoMethodThunkR methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType; GDMonoMethodThunkR methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info; GDMonoMethodThunkR methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info; GDMonoMethodThunkR methodthunk_MarshalUtils_MakeGenericArrayType; GDMonoMethodThunkR methodthunk_MarshalUtils_MakeGenericDictionaryType; GDMonoMethodThunk methodthunk_MarshalUtils_EnumerableToArray; GDMonoMethodThunk methodthunk_MarshalUtils_IDictionaryToDictionary; GDMonoMethodThunk methodthunk_MarshalUtils_GenericIDictionaryToDictionary; // End of MarshalUtils methods Ref task_scheduler_handle; bool corlib_cache_updated; bool godot_api_cache_updated; void clear_corlib_cache(); void clear_godot_api_cache(); CachedData() { clear_corlib_cache(); clear_godot_api_cache(); } }; extern CachedData cached_data; void update_corlib_cache(); void update_godot_api_cache(); inline void clear_corlib_cache() { cached_data.clear_corlib_cache(); } inline void clear_godot_api_cache() { cached_data.clear_godot_api_cache(); } _FORCE_INLINE_ bool tools_godot_api_check() { #ifdef TOOLS_ENABLED return cached_data.godot_api_cache_updated; #else return true; // Assume it's updated if this was called, otherwise it's a bug #endif } } // namespace GDMonoCache #define CACHED_CLASS(m_class) (GDMonoCache::cached_data.class_##m_class) #define CACHED_CLASS_RAW(m_class) (GDMonoCache::cached_data.class_##m_class->get_mono_ptr()) #define CACHED_RAW_MONO_CLASS(m_class) (GDMonoCache::cached_data.rawclass_##m_class) #define CACHED_FIELD(m_class, m_field) (GDMonoCache::cached_data.field_##m_class##_##m_field) #define CACHED_METHOD(m_class, m_method) (GDMonoCache::cached_data.method_##m_class##_##m_method) #define CACHED_METHOD_THUNK(m_class, m_method) (GDMonoCache::cached_data.methodthunk_##m_class##_##m_method) #define CACHED_PROPERTY(m_class, m_property) (GDMonoCache::cached_data.property_##m_class##_##m_property) #ifdef REAL_T_IS_DOUBLE #define REAL_T_MONOCLASS CACHED_CLASS_RAW(double) #else #define REAL_T_MONOCLASS CACHED_CLASS_RAW(float) #endif #endif // GD_MONO_CACHE_H