gd_mono_cache.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /*************************************************************************/
  2. /* gd_mono_cache.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "gd_mono_cache.h"
  31. #include "gd_mono.h"
  32. #include "gd_mono_class.h"
  33. #include "gd_mono_marshal.h"
  34. #include "gd_mono_method.h"
  35. #include "gd_mono_utils.h"
  36. namespace GDMonoCache {
  37. CachedData cached_data;
  38. #define CACHE_AND_CHECK(m_var, m_val) \
  39. { \
  40. CRASH_COND(m_var != nullptr); \
  41. m_var = m_val; \
  42. ERR_FAIL_COND_MSG(m_var == nullptr, "Mono Cache: Member " #m_var " is null."); \
  43. }
  44. #define CACHE_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(cached_data.class_##m_class, m_val)
  45. #define CACHE_NS_CLASS_AND_CHECK(m_ns, m_class, m_val) CACHE_AND_CHECK(cached_data.class_##m_ns##_##m_class, m_val)
  46. #define CACHE_RAW_MONO_CLASS_AND_CHECK(m_class, m_val) CACHE_AND_CHECK(cached_data.rawclass_##m_class, m_val)
  47. #define CACHE_FIELD_AND_CHECK(m_class, m_field, m_val) CACHE_AND_CHECK(cached_data.field_##m_class##_##m_field, m_val)
  48. #define CACHE_METHOD_AND_CHECK(m_class, m_method, m_val) CACHE_AND_CHECK(cached_data.method_##m_class##_##m_method, m_val)
  49. #define CACHE_PROPERTY_AND_CHECK(m_class, m_property, m_val) CACHE_AND_CHECK(cached_data.property_##m_class##_##m_property, m_val)
  50. #define CACHE_METHOD_THUNK_AND_CHECK_IMPL(m_var, m_val) \
  51. { \
  52. CRASH_COND(!m_var.is_null()); \
  53. ERR_FAIL_COND_MSG(m_val == nullptr, "Mono Cache: Method for member " #m_var " is null."); \
  54. m_var.set_from_method(m_val); \
  55. ERR_FAIL_COND_MSG(m_var.is_null(), "Mono Cache: Member " #m_var " is null."); \
  56. }
  57. #define CACHE_METHOD_THUNK_AND_CHECK(m_class, m_method, m_val) CACHE_METHOD_THUNK_AND_CHECK_IMPL(cached_data.methodthunk_##m_class##_##m_method, m_val)
  58. void CachedData::clear_corlib_cache() {
  59. corlib_cache_updated = false;
  60. class_MonoObject = nullptr;
  61. class_bool = nullptr;
  62. class_int8_t = nullptr;
  63. class_int16_t = nullptr;
  64. class_int32_t = nullptr;
  65. class_int64_t = nullptr;
  66. class_uint8_t = nullptr;
  67. class_uint16_t = nullptr;
  68. class_uint32_t = nullptr;
  69. class_uint64_t = nullptr;
  70. class_float = nullptr;
  71. class_double = nullptr;
  72. class_String = nullptr;
  73. class_IntPtr = nullptr;
  74. class_System_Collections_IEnumerable = nullptr;
  75. class_System_Collections_ICollection = nullptr;
  76. class_System_Collections_IDictionary = nullptr;
  77. #ifdef DEBUG_ENABLED
  78. class_System_Diagnostics_StackTrace = nullptr;
  79. methodthunk_System_Diagnostics_StackTrace_GetFrames.nullify();
  80. method_System_Diagnostics_StackTrace_ctor_bool = nullptr;
  81. method_System_Diagnostics_StackTrace_ctor_Exception_bool = nullptr;
  82. #endif
  83. class_KeyNotFoundException = nullptr;
  84. }
  85. void CachedData::clear_godot_api_cache() {
  86. godot_api_cache_updated = false;
  87. rawclass_Dictionary = nullptr;
  88. class_Vector2 = nullptr;
  89. class_Vector2i = nullptr;
  90. class_Rect2 = nullptr;
  91. class_Rect2i = nullptr;
  92. class_Transform2D = nullptr;
  93. class_Vector3 = nullptr;
  94. class_Vector3i = nullptr;
  95. class_Basis = nullptr;
  96. class_Quat = nullptr;
  97. class_Transform = nullptr;
  98. class_AABB = nullptr;
  99. class_Color = nullptr;
  100. class_Plane = nullptr;
  101. class_StringName = nullptr;
  102. class_NodePath = nullptr;
  103. class_RID = nullptr;
  104. class_GodotObject = nullptr;
  105. class_GodotResource = nullptr;
  106. class_Node = nullptr;
  107. class_Control = nullptr;
  108. class_Node3D = nullptr;
  109. class_WeakRef = nullptr;
  110. class_Callable = nullptr;
  111. class_SignalInfo = nullptr;
  112. class_Array = nullptr;
  113. class_Dictionary = nullptr;
  114. class_MarshalUtils = nullptr;
  115. class_ISerializationListener = nullptr;
  116. #ifdef DEBUG_ENABLED
  117. class_DebuggingUtils = nullptr;
  118. methodthunk_DebuggingUtils_GetStackFrameInfo.nullify();
  119. #endif
  120. class_ExportAttribute = nullptr;
  121. field_ExportAttribute_hint = nullptr;
  122. field_ExportAttribute_hintString = nullptr;
  123. class_SignalAttribute = nullptr;
  124. class_ToolAttribute = nullptr;
  125. class_RemoteAttribute = nullptr;
  126. class_MasterAttribute = nullptr;
  127. class_PuppetAttribute = nullptr;
  128. class_RemoteSyncAttribute = nullptr;
  129. class_MasterSyncAttribute = nullptr;
  130. class_PuppetSyncAttribute = nullptr;
  131. class_GodotMethodAttribute = nullptr;
  132. field_GodotMethodAttribute_methodName = nullptr;
  133. field_GodotObject_ptr = nullptr;
  134. field_StringName_ptr = nullptr;
  135. field_NodePath_ptr = nullptr;
  136. field_Image_ptr = nullptr;
  137. field_RID_ptr = nullptr;
  138. methodthunk_GodotObject_Dispose.nullify();
  139. methodthunk_Array_GetPtr.nullify();
  140. methodthunk_Dictionary_GetPtr.nullify();
  141. methodthunk_SignalAwaiter_SignalCallback.nullify();
  142. methodthunk_GodotTaskScheduler_Activate.nullify();
  143. methodthunk_Delegate_Equals.nullify();
  144. methodthunk_DelegateUtils_TrySerializeDelegate.nullify();
  145. methodthunk_DelegateUtils_TryDeserializeDelegate.nullify();
  146. // Start of MarshalUtils methods
  147. methodthunk_MarshalUtils_TypeIsGenericArray.nullify();
  148. methodthunk_MarshalUtils_TypeIsGenericDictionary.nullify();
  149. methodthunk_MarshalUtils_TypeIsSystemGenericList.nullify();
  150. methodthunk_MarshalUtils_TypeIsSystemGenericDictionary.nullify();
  151. methodthunk_MarshalUtils_TypeIsGenericIEnumerable.nullify();
  152. methodthunk_MarshalUtils_TypeIsGenericICollection.nullify();
  153. methodthunk_MarshalUtils_TypeIsGenericIDictionary.nullify();
  154. methodthunk_MarshalUtils_ArrayGetElementType.nullify();
  155. methodthunk_MarshalUtils_DictionaryGetKeyValueTypes.nullify();
  156. methodthunk_MarshalUtils_MakeGenericArrayType.nullify();
  157. methodthunk_MarshalUtils_MakeGenericDictionaryType.nullify();
  158. // End of MarshalUtils methods
  159. task_scheduler_handle = Ref<MonoGCHandleRef>();
  160. }
  161. #define GODOT_API_CLASS(m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(BINDINGS_NAMESPACE, #m_class))
  162. #define GODOT_API_NS_CLASS(m_ns, m_class) (GDMono::get_singleton()->get_core_api_assembly()->get_class(m_ns, #m_class))
  163. void update_corlib_cache() {
  164. CACHE_CLASS_AND_CHECK(MonoObject, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_object_class()));
  165. CACHE_CLASS_AND_CHECK(bool, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_boolean_class()));
  166. CACHE_CLASS_AND_CHECK(int8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_sbyte_class()));
  167. CACHE_CLASS_AND_CHECK(int16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int16_class()));
  168. CACHE_CLASS_AND_CHECK(int32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int32_class()));
  169. CACHE_CLASS_AND_CHECK(int64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_int64_class()));
  170. CACHE_CLASS_AND_CHECK(uint8_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_byte_class()));
  171. CACHE_CLASS_AND_CHECK(uint16_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint16_class()));
  172. CACHE_CLASS_AND_CHECK(uint32_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint32_class()));
  173. CACHE_CLASS_AND_CHECK(uint64_t, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_uint64_class()));
  174. CACHE_CLASS_AND_CHECK(float, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_single_class()));
  175. CACHE_CLASS_AND_CHECK(double, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_double_class()));
  176. CACHE_CLASS_AND_CHECK(String, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_string_class()));
  177. CACHE_CLASS_AND_CHECK(IntPtr, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_intptr_class()));
  178. CACHE_CLASS_AND_CHECK(System_Collections_IEnumerable, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IEnumerable"));
  179. CACHE_CLASS_AND_CHECK(System_Collections_ICollection, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "ICollection"));
  180. CACHE_CLASS_AND_CHECK(System_Collections_IDictionary, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IDictionary"));
  181. #ifdef DEBUG_ENABLED
  182. CACHE_CLASS_AND_CHECK(System_Diagnostics_StackTrace, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Diagnostics", "StackTrace"));
  183. CACHE_METHOD_THUNK_AND_CHECK(System_Diagnostics_StackTrace, GetFrames, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method("GetFrames"));
  184. CACHE_METHOD_AND_CHECK(System_Diagnostics_StackTrace, ctor_bool, CACHED_CLASS(System_Diagnostics_StackTrace)->get_method_with_desc("System.Diagnostics.StackTrace:.ctor(bool)", true));
  185. 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));
  186. #endif
  187. CACHE_METHOD_THUNK_AND_CHECK(Delegate, Equals, GDMono::get_singleton()->get_corlib_assembly()->get_class("System", "Delegate")->get_method_with_desc("System.Delegate:Equals(object)", 1));
  188. CACHE_CLASS_AND_CHECK(KeyNotFoundException, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections.Generic", "KeyNotFoundException"));
  189. cached_data.corlib_cache_updated = true;
  190. }
  191. void update_godot_api_cache() {
  192. CACHE_CLASS_AND_CHECK(Vector2, GODOT_API_CLASS(Vector2));
  193. CACHE_CLASS_AND_CHECK(Vector2i, GODOT_API_CLASS(Vector2i));
  194. CACHE_CLASS_AND_CHECK(Rect2, GODOT_API_CLASS(Rect2));
  195. CACHE_CLASS_AND_CHECK(Rect2i, GODOT_API_CLASS(Rect2i));
  196. CACHE_CLASS_AND_CHECK(Transform2D, GODOT_API_CLASS(Transform2D));
  197. CACHE_CLASS_AND_CHECK(Vector3, GODOT_API_CLASS(Vector3));
  198. CACHE_CLASS_AND_CHECK(Vector3i, GODOT_API_CLASS(Vector3i));
  199. CACHE_CLASS_AND_CHECK(Basis, GODOT_API_CLASS(Basis));
  200. CACHE_CLASS_AND_CHECK(Quat, GODOT_API_CLASS(Quat));
  201. CACHE_CLASS_AND_CHECK(Transform, GODOT_API_CLASS(Transform));
  202. CACHE_CLASS_AND_CHECK(AABB, GODOT_API_CLASS(AABB));
  203. CACHE_CLASS_AND_CHECK(Color, GODOT_API_CLASS(Color));
  204. CACHE_CLASS_AND_CHECK(Plane, GODOT_API_CLASS(Plane));
  205. CACHE_CLASS_AND_CHECK(StringName, GODOT_API_CLASS(StringName));
  206. CACHE_CLASS_AND_CHECK(NodePath, GODOT_API_CLASS(NodePath));
  207. CACHE_CLASS_AND_CHECK(RID, GODOT_API_CLASS(RID));
  208. CACHE_CLASS_AND_CHECK(GodotObject, GODOT_API_CLASS(Object));
  209. CACHE_CLASS_AND_CHECK(GodotResource, GODOT_API_CLASS(Resource));
  210. CACHE_CLASS_AND_CHECK(Node, GODOT_API_CLASS(Node));
  211. CACHE_CLASS_AND_CHECK(Control, GODOT_API_CLASS(Control));
  212. CACHE_CLASS_AND_CHECK(Node3D, GODOT_API_CLASS(Node3D));
  213. CACHE_CLASS_AND_CHECK(WeakRef, GODOT_API_CLASS(WeakRef));
  214. CACHE_CLASS_AND_CHECK(Callable, GODOT_API_CLASS(Callable));
  215. CACHE_CLASS_AND_CHECK(SignalInfo, GODOT_API_CLASS(SignalInfo));
  216. CACHE_CLASS_AND_CHECK(Array, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Array));
  217. CACHE_CLASS_AND_CHECK(Dictionary, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary));
  218. CACHE_CLASS_AND_CHECK(MarshalUtils, GODOT_API_CLASS(MarshalUtils));
  219. CACHE_CLASS_AND_CHECK(ISerializationListener, GODOT_API_CLASS(ISerializationListener));
  220. #ifdef DEBUG_ENABLED
  221. CACHE_CLASS_AND_CHECK(DebuggingUtils, GODOT_API_CLASS(DebuggingUtils));
  222. #endif
  223. // Attributes
  224. CACHE_CLASS_AND_CHECK(ExportAttribute, GODOT_API_CLASS(ExportAttribute));
  225. CACHE_FIELD_AND_CHECK(ExportAttribute, hint, CACHED_CLASS(ExportAttribute)->get_field("hint"));
  226. CACHE_FIELD_AND_CHECK(ExportAttribute, hintString, CACHED_CLASS(ExportAttribute)->get_field("hintString"));
  227. CACHE_CLASS_AND_CHECK(SignalAttribute, GODOT_API_CLASS(SignalAttribute));
  228. CACHE_CLASS_AND_CHECK(ToolAttribute, GODOT_API_CLASS(ToolAttribute));
  229. CACHE_CLASS_AND_CHECK(RemoteAttribute, GODOT_API_CLASS(RemoteAttribute));
  230. CACHE_CLASS_AND_CHECK(MasterAttribute, GODOT_API_CLASS(MasterAttribute));
  231. CACHE_CLASS_AND_CHECK(PuppetAttribute, GODOT_API_CLASS(PuppetAttribute));
  232. CACHE_CLASS_AND_CHECK(RemoteSyncAttribute, GODOT_API_CLASS(RemoteSyncAttribute));
  233. CACHE_CLASS_AND_CHECK(MasterSyncAttribute, GODOT_API_CLASS(MasterSyncAttribute));
  234. CACHE_CLASS_AND_CHECK(PuppetSyncAttribute, GODOT_API_CLASS(PuppetSyncAttribute));
  235. CACHE_CLASS_AND_CHECK(GodotMethodAttribute, GODOT_API_CLASS(GodotMethodAttribute));
  236. CACHE_FIELD_AND_CHECK(GodotMethodAttribute, methodName, CACHED_CLASS(GodotMethodAttribute)->get_field("methodName"));
  237. CACHE_FIELD_AND_CHECK(GodotObject, ptr, CACHED_CLASS(GodotObject)->get_field(BINDINGS_PTR_FIELD));
  238. CACHE_FIELD_AND_CHECK(StringName, ptr, CACHED_CLASS(StringName)->get_field(BINDINGS_PTR_FIELD));
  239. CACHE_FIELD_AND_CHECK(NodePath, ptr, CACHED_CLASS(NodePath)->get_field(BINDINGS_PTR_FIELD));
  240. CACHE_FIELD_AND_CHECK(RID, ptr, CACHED_CLASS(RID)->get_field(BINDINGS_PTR_FIELD));
  241. CACHE_METHOD_THUNK_AND_CHECK(GodotObject, Dispose, CACHED_CLASS(GodotObject)->get_method("Dispose", 0));
  242. CACHE_METHOD_THUNK_AND_CHECK(Array, GetPtr, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Array)->get_method("GetPtr", 0));
  243. CACHE_METHOD_THUNK_AND_CHECK(Dictionary, GetPtr, GODOT_API_NS_CLASS(BINDINGS_NAMESPACE_COLLECTIONS, Dictionary)->get_method("GetPtr", 0));
  244. CACHE_METHOD_THUNK_AND_CHECK(SignalAwaiter, SignalCallback, GODOT_API_CLASS(SignalAwaiter)->get_method("SignalCallback", 1));
  245. CACHE_METHOD_THUNK_AND_CHECK(GodotTaskScheduler, Activate, GODOT_API_CLASS(GodotTaskScheduler)->get_method("Activate", 0));
  246. CACHE_METHOD_THUNK_AND_CHECK(DelegateUtils, TrySerializeDelegate, GODOT_API_CLASS(DelegateUtils)->get_method("TrySerializeDelegate", 2));
  247. CACHE_METHOD_THUNK_AND_CHECK(DelegateUtils, TryDeserializeDelegate, GODOT_API_CLASS(DelegateUtils)->get_method("TryDeserializeDelegate", 2));
  248. // Start of MarshalUtils methods
  249. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericArray, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericArray", 1));
  250. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericDictionary", 1));
  251. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsSystemGenericList, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsSystemGenericList", 1));
  252. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsSystemGenericDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsSystemGenericDictionary", 1));
  253. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericIEnumerable, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericIEnumerable", 1));
  254. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericICollection, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericICollection", 1));
  255. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericIDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericIDictionary", 1));
  256. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, ArrayGetElementType, GODOT_API_CLASS(MarshalUtils)->get_method("ArrayGetElementType", 2));
  257. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, DictionaryGetKeyValueTypes, GODOT_API_CLASS(MarshalUtils)->get_method("DictionaryGetKeyValueTypes", 3));
  258. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericArrayType, GODOT_API_CLASS(MarshalUtils)->get_method("MakeGenericArrayType", 1));
  259. CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericDictionaryType, GODOT_API_CLASS(MarshalUtils)->get_method("MakeGenericDictionaryType", 2));
  260. // End of MarshalUtils methods
  261. #ifdef DEBUG_ENABLED
  262. CACHE_METHOD_THUNK_AND_CHECK(DebuggingUtils, GetStackFrameInfo, GODOT_API_CLASS(DebuggingUtils)->get_method("GetStackFrameInfo", 4));
  263. #endif
  264. // TODO Move to CSharpLanguage::init() and do handle disposal
  265. MonoObject *task_scheduler = mono_object_new(mono_domain_get(), GODOT_API_CLASS(GodotTaskScheduler)->get_mono_ptr());
  266. GDMonoUtils::runtime_object_init(task_scheduler, GODOT_API_CLASS(GodotTaskScheduler));
  267. cached_data.task_scheduler_handle = MonoGCHandleRef::create_strong(task_scheduler);
  268. cached_data.godot_api_cache_updated = true;
  269. }
  270. } // namespace GDMonoCache