Bez popisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

il2cpp-mono-api.cpp 51KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831
  1. // This file implements the Mono embedding API that the debugger code requires.
  2. // It should not include any Mono headers.
  3. #include "il2cpp-config.h"
  4. #include "il2cpp-api.h"
  5. #include "il2cpp-mono-api.h"
  6. #include "il2cpp-class-internals.h"
  7. #include "gc/GCHandle.h"
  8. #include "gc/WriteBarrier.h"
  9. #include "metadata/FieldLayout.h"
  10. #include "metadata/GenericMetadata.h"
  11. #include "vm/Array.h"
  12. #include "vm/Assembly.h"
  13. #include "vm/Class.h"
  14. #include "vm/Domain.h"
  15. #include "vm/Field.h"
  16. #include "vm/GenericClass.h"
  17. #include "vm/GenericContainer.h"
  18. #include "vm/Image.h"
  19. #include "vm/MetadataCache.h"
  20. #include "vm/Method.h"
  21. #include "vm/Object.h"
  22. #include "vm/Property.h"
  23. #include "vm/Reflection.h"
  24. #include "vm/Runtime.h"
  25. #include "vm/String.h"
  26. #include "vm/Thread.h"
  27. #include "vm/ThreadPoolMs.h"
  28. #include "vm/Type.h"
  29. #include "vm-utils/Debugger.h"
  30. #include "utils/Il2CppHashMap.h"
  31. #include "utils/Memory.h"
  32. #include "utils/StringUtils.h"
  33. #include <cstring>
  34. #include <limits>
  35. // These types must match the layout of types defined in Mono headers
  36. struct Il2CppGPtrArray
  37. {
  38. void** pdata;
  39. uint32_t len;
  40. };
  41. struct Il2CppGPtrArrayPriv
  42. {
  43. void** pdata;
  44. uint32_t len;
  45. uint32_t size;
  46. };
  47. struct Il2CppMonoError
  48. {
  49. unsigned short error_code;
  50. unsigned short flags;
  51. void *hidden_1[12];
  52. };
  53. struct Il2CppMonoMethodSignature
  54. {
  55. Il2CppType *ret;
  56. uint16_t param_count;
  57. int16_t sentinalpos_unused;
  58. uint32_t generic_param_count : 16;
  59. uint32_t call_convention_unused : 6;
  60. uint32_t hasthis : 1;
  61. uint32_t explicit_this_unused : 1;
  62. uint32_t pinvoke_unused : 1;
  63. uint32_t is_inflated_unused : 1;
  64. uint32_t has_type_parameters_unused : 1;
  65. Il2CppType* params[IL2CPP_ZERO_LEN_ARRAY];
  66. };
  67. struct Il2CppMonoMethodHeader
  68. {
  69. const unsigned char* code_unused;
  70. uint32_t code_size;
  71. uint16_t max_stack_unused : 15;
  72. uint32_t is_transient_unsued : 1;
  73. uint32_t num_clauses_unused : 15;
  74. uint32_t init_locals_unused : 1;
  75. uint16_t num_locals;
  76. void* clauses_unused; // Actually a MonoExceptionClause in Mono,but we don't use it
  77. void* volatile_args_unused; // Actually MonoBitSet
  78. void* volatile_locals_unused;// Actually MonoBitSet
  79. Il2CppType* locals[IL2CPP_ZERO_LEN_ARRAY];
  80. };
  81. struct Il2CppMonoDebugCodeBlock
  82. {
  83. int32_t parent;
  84. int32_t type;
  85. int32_t start_offset;
  86. int32_t end_offset;
  87. };
  88. struct Il2CppMonoDebugLocalVar
  89. {
  90. char *name;
  91. int32_t index;
  92. Il2CppMonoDebugCodeBlock *block;
  93. };
  94. struct Il2CppMonoDebugLocalsInfo
  95. {
  96. int32_t num_locals;
  97. Il2CppMonoDebugLocalVar *locals;
  98. int32_t num_blocks;
  99. Il2CppMonoDebugCodeBlock *code_blocks;
  100. };
  101. struct Il2CppMonoDebugLineNumberEntry
  102. {
  103. uint32_t il_offset;
  104. uint32_t native_offset;
  105. };
  106. struct Il2CppMonoDebugVarInfo
  107. {
  108. uint32_t index;
  109. uint32_t offset;
  110. uint32_t size;
  111. uint32_t begin_scope;
  112. uint32_t end_scope;
  113. Il2CppType *type;
  114. };
  115. struct Il2CppMonoDebugMethodJitInfo
  116. {
  117. const uint8_t *code_start;
  118. uint32_t code_size;
  119. uint32_t prologue_end;
  120. uint32_t epilogue_begin;
  121. const uint8_t *wrapper_addr;
  122. uint32_t num_line_numbers;
  123. Il2CppMonoDebugLineNumberEntry *line_numbers;
  124. uint32_t has_var_info;
  125. uint32_t num_params;
  126. Il2CppMonoDebugVarInfo *this_var;
  127. Il2CppMonoDebugVarInfo *params;
  128. uint32_t num_locals;
  129. Il2CppMonoDebugVarInfo *locals;
  130. Il2CppMonoDebugVarInfo *gsharedvt_info_var;
  131. Il2CppMonoDebugVarInfo *gsharedvt_locals_var;
  132. };
  133. enum
  134. {
  135. BFLAGS_IgnoreCase = 1,
  136. BFLAGS_DeclaredOnly = 2,
  137. BFLAGS_Instance = 4,
  138. BFLAGS_Static = 8,
  139. BFLAGS_Public = 0x10,
  140. BFLAGS_NonPublic = 0x20,
  141. BFLAGS_FlattenHierarchy = 0x40,
  142. BFLAGS_InvokeMethod = 0x100,
  143. BFLAGS_CreateInstance = 0x200,
  144. BFLAGS_GetField = 0x400,
  145. BFLAGS_SetField = 0x800,
  146. BFLAGS_GetProperty = 0x1000,
  147. BFLAGS_SetProperty = 0x2000,
  148. BFLAGS_ExactBinding = 0x10000,
  149. BFLAGS_SuppressChangeType = 0x20000,
  150. BFLAGS_OptionalParamBinding = 0x40000
  151. };
  152. struct Il2CppMonoTypeNameParse
  153. {
  154. char *name_space_unused;
  155. char *name_unused;
  156. Il2CppAssemblyName assembly;
  157. void *il2cppTypeNameParseInfo; // really GList *modifiers, but IL2CPP re-uses this field
  158. void *type_arguments_unused;
  159. void *nested_unused;
  160. };
  161. struct Il2CppMonoJitExceptionInfo
  162. {
  163. uint32_t flags;
  164. int32_t exvar_offset;
  165. void* try_start;
  166. void* try_end;
  167. void* handler_start;
  168. /*
  169. * For LLVM compiled code, this is the index of the il clause
  170. * associated with this handler.
  171. */
  172. int clause_index;
  173. uint32_t try_offset;
  174. uint32_t try_len;
  175. uint32_t handler_offset;
  176. uint32_t handler_len;
  177. union
  178. {
  179. MonoClass *catch_class;
  180. void* filter;
  181. void* handler_end;
  182. } data;
  183. };
  184. struct Il2CppMonoJitInfo
  185. {
  186. /* NOTE: These first two elements (method and
  187. next_jit_code_hash) must be in the same order and at the
  188. same offset as in RuntimeMethod, because of the jit_code_hash
  189. internal hash table in MonoDomain. */
  190. union
  191. {
  192. MonoMethod *method;
  193. MonoImage *image;
  194. void* aot_info;
  195. void* tramp_info;
  196. } d;
  197. union
  198. {
  199. void *next_jit_code_hash;
  200. void *next_tombstone;
  201. } n;
  202. void* code_start;
  203. uint32_t unwind_info;
  204. int code_size;
  205. uint32_t num_clauses : 15;
  206. /* Whenever the code is domain neutral or 'shared' */
  207. int32_t domain_neutral : 1;
  208. int32_t has_generic_jit_info : 1;
  209. int32_t has_try_block_holes : 1;
  210. int32_t has_arch_eh_info : 1;
  211. int32_t has_thunk_info : 1;
  212. int32_t has_unwind_info : 1;
  213. int32_t from_aot : 1;
  214. int32_t from_llvm : 1;
  215. int32_t dbg_attrs_inited : 1;
  216. int32_t dbg_hidden : 1;
  217. /* Whenever this jit info was loaded in async context */
  218. int32_t async : 1;
  219. int32_t dbg_step_through : 1;
  220. int32_t dbg_non_user_code : 1;
  221. /*
  222. * Whenever this jit info refers to a trampoline.
  223. * d.tramp_info contains additional data in this case.
  224. */
  225. int32_t is_trampoline : 1;
  226. /* Whenever this jit info refers to an interpreter method */
  227. int32_t is_interp : 1;
  228. /* FIXME: Embed this after the structure later*/
  229. void* gc_info; /* Currently only used by SGen */
  230. Il2CppMonoJitExceptionInfo clauses[IL2CPP_ZERO_LEN_ARRAY];
  231. /* There is an optional MonoGenericJitInfo after the clauses */
  232. /* There is an optional MonoTryBlockHoleTableJitInfo after MonoGenericJitInfo clauses*/
  233. /* There is an optional MonoArchEHJitInfo after MonoTryBlockHoleTableJitInfo */
  234. /* There is an optional MonoThunkJitInfo after MonoArchEHJitInfo */
  235. };
  236. // End of mirrored types
  237. static void initialize_il2cpp_mono_method_signature(Il2CppMonoMethodSignature* signature, MethodInfo* method)
  238. {
  239. signature->hasthis = il2cpp::vm::Method::IsInstance(method);
  240. signature->ret = (Il2CppType*)il2cpp::vm::Method::GetReturnType(method);
  241. signature->generic_param_count = 0;
  242. if (method->is_generic)
  243. {
  244. signature->generic_param_count = il2cpp::vm::Method::GetGenericParamCount(method);
  245. }
  246. else if (method->is_inflated)
  247. {
  248. if (method->genericMethod->context.method_inst)
  249. signature->generic_param_count += method->genericMethod->context.method_inst->type_argc;
  250. if (method->genericMethod->context.class_inst)
  251. signature->generic_param_count += method->genericMethod->context.class_inst->type_argc;
  252. }
  253. signature->param_count = il2cpp::vm::Method::GetParamCount(method);
  254. for (int i = 0; i < signature->param_count; ++i)
  255. signature->params[i] = (Il2CppType*)il2cpp::vm::Method::GetParam(method, i);
  256. }
  257. // We need to allocate the Il2CppMonoMethodSignature struct with C-style allocators because it is
  258. // a mirror of _MonoMethodSignature, which end in a zero-length array. So wrap it in this C++
  259. // struct that we can insert into a hash map and get proper memory management.
  260. struct Il2CppMonoMethodSignatureWrapper
  261. {
  262. Il2CppMonoMethodSignatureWrapper(MethodInfo* method)
  263. {
  264. // We need the size of Il2CppMonoMethodSignature plus one pointer for each parameter of the method.
  265. size_t methodSignatureSize = sizeof(Il2CppMonoMethodSignature) + (sizeof(Il2CppType*) * il2cpp::vm::Method::GetParamCount(method));
  266. signature = (Il2CppMonoMethodSignature*)IL2CPP_CALLOC(1, methodSignatureSize);
  267. initialize_il2cpp_mono_method_signature(signature, method);
  268. }
  269. ~Il2CppMonoMethodSignatureWrapper()
  270. {
  271. IL2CPP_FREE(signature);
  272. }
  273. Il2CppMonoMethodSignature* signature;
  274. };
  275. typedef Il2CppHashMap<MethodInfo*, Il2CppMonoMethodSignatureWrapper*, il2cpp::utils::PointerHash<MethodInfo> > MethodSignatureMap;
  276. static MethodSignatureMap* method_signatures;
  277. static void error_init(MonoError* error)
  278. {
  279. if (error != NULL)
  280. {
  281. auto il2CppError = (Il2CppMonoError*)error;
  282. il2CppError->error_code = 0;
  283. il2CppError->flags = 0;
  284. }
  285. }
  286. uint32_t mono_image_get_entry_point(MonoImage *image)
  287. {
  288. const MethodInfo* entryPoint = il2cpp::vm::Image::GetEntryPoint((Il2CppImage*)image);
  289. return entryPoint == NULL ? 0 : entryPoint->token;
  290. }
  291. const char* mono_image_get_filename(MonoImage *image)
  292. {
  293. return il2cpp_image_get_filename((Il2CppImage *)image);
  294. }
  295. const char* mono_image_get_guid(MonoImage *image)
  296. {
  297. return "00000000-0000-0000-0000-000000000000"; //IL2CPP doesn't have image GUIDs
  298. }
  299. int32_t mono_image_is_dynamic(MonoImage *image)
  300. {
  301. return false;
  302. }
  303. MonoAssembly* mono_image_get_assembly(MonoImage *image)
  304. {
  305. return (MonoAssembly*)il2cpp_image_get_assembly((Il2CppImage *)image);
  306. }
  307. const char* mono_image_get_name(MonoImage *image)
  308. {
  309. return il2cpp_image_get_name((Il2CppImage *)image);
  310. }
  311. MonoDomain* mono_get_root_domain(void)
  312. {
  313. return (MonoDomain*)il2cpp::vm::Domain::GetCurrent();
  314. }
  315. MonoDomain* mono_domain_get(void)
  316. {
  317. return mono_get_root_domain();
  318. }
  319. int32_t mono_domain_set_fast(MonoDomain *domain, int32_t force)
  320. {
  321. IL2CPP_ASSERT(domain == mono_get_root_domain());
  322. return true;
  323. }
  324. void mono_domain_foreach(MonoDomainFunc func, void* user_data)
  325. {
  326. func((MonoDomain*)mono_get_root_domain(), user_data);
  327. }
  328. void mono_domain_lock(MonoDomain* domain)
  329. {
  330. }
  331. void mono_domain_unlock(MonoDomain* domain)
  332. {
  333. }
  334. const MonoAssembly* mono_domain_get_corlib(MonoDomain *domain)
  335. {
  336. return (MonoAssembly*)il2cpp::vm::Image::GetAssembly((Il2CppImage*)il2cpp_defaults.corlib);
  337. }
  338. MonoAssembly* mono_domain_get_assemblies_iter(MonoAppDomain *domain, void** iter)
  339. {
  340. if (!iter)
  341. return NULL;
  342. il2cpp::vm::AssemblyVector* assemblies = il2cpp::vm::Assembly::GetAllAssemblies();
  343. if (!*iter)
  344. {
  345. il2cpp::vm::AssemblyVector::iterator *pIter = new il2cpp::vm::AssemblyVector::iterator();
  346. *pIter = assemblies->begin();
  347. *iter = pIter;
  348. return (MonoAssembly*)**pIter;
  349. }
  350. il2cpp::vm::AssemblyVector::iterator *pIter = (il2cpp::vm::AssemblyVector::iterator*)*iter;
  351. (*pIter)++;
  352. if (*pIter != assemblies->end())
  353. {
  354. return (MonoAssembly*)(**pIter);
  355. }
  356. else
  357. {
  358. delete pIter;
  359. *iter = NULL;
  360. }
  361. return NULL;
  362. }
  363. MonoClass* mono_type_get_class(MonoType *type)
  364. {
  365. return (MonoClass*)il2cpp::vm::Type::GetClass((Il2CppType*)type);
  366. }
  367. MonoGenericClass* m_type_get_generic_class(MonoType* type)
  368. {
  369. return (MonoGenericClass*)((Il2CppType*)type)->data.generic_class;
  370. }
  371. int32_t mono_type_is_struct(MonoType *type)
  372. {
  373. return il2cpp::vm::Type::IsStruct((Il2CppType*)type);
  374. }
  375. int32_t mono_type_is_reference(MonoType *type)
  376. {
  377. return il2cpp::vm::Type::IsReference((Il2CppType*)type);
  378. }
  379. int32_t mono_type_generic_inst_is_valuetype(MonoType *monoType)
  380. {
  381. static const int kBitIsValueType = 1;
  382. Il2CppType *type = (Il2CppType*)monoType;
  383. Il2CppMetadataTypeHandle handle = il2cpp::vm::MetadataCache::GetTypeHandleFromType(type->data.generic_class->type);
  384. return il2cpp::vm::MetadataCache::TypeIsValueType(handle);
  385. }
  386. char* mono_type_full_name(MonoType* type)
  387. {
  388. std::string name = il2cpp::vm::Type::GetName((Il2CppType*)type, IL2CPP_TYPE_NAME_FORMAT_FULL_NAME);
  389. return il2cpp::utils::StringUtils::StringDuplicate(name.c_str());
  390. }
  391. char* mono_type_get_name_full(MonoType* type, MonoTypeNameFormat format)
  392. {
  393. std::string name = il2cpp::vm::Type::GetName((Il2CppType*)type, (Il2CppTypeNameFormat)format);
  394. return il2cpp::utils::StringUtils::StringDuplicate(name.c_str());
  395. }
  396. void mono_string_free(const char* str)
  397. {
  398. il2cpp::utils::StringUtils::StringDelete(str);
  399. }
  400. MonoReflectionType* mono_type_get_object_checked(MonoDomain* domain, MonoType* type, MonoError* error)
  401. {
  402. error_init(error);
  403. return (MonoReflectionType*)il2cpp::vm::Reflection::GetTypeObject((const Il2CppType*)type);
  404. }
  405. int mono_type_get_type(MonoType* type)
  406. {
  407. return il2cpp_type_get_type((const Il2CppType*)type);
  408. }
  409. int32_t mono_type_is_byref(MonoType* type)
  410. {
  411. return il2cpp_type_is_byref((const Il2CppType*)type);
  412. }
  413. uint32_t mono_type_get_attrs(MonoType* type)
  414. {
  415. return il2cpp_type_get_attrs((const Il2CppType*)type);
  416. }
  417. MonoVTable* mono_class_vtable_checked(MonoDomain *domain, MonoClass *klass, MonoError* error)
  418. {
  419. return (MonoVTable*)((Il2CppClass*)klass)->vtable;
  420. }
  421. int32_t mono_class_instance_size(MonoClass *klass)
  422. {
  423. il2cpp::vm::Class::Init((Il2CppClass*)klass);
  424. return il2cpp_class_instance_size((Il2CppClass*)klass);
  425. }
  426. int32_t mono_class_value_size(MonoClass *klass, uint32_t *align)
  427. {
  428. return il2cpp::vm::Class::GetValueSize((Il2CppClass*)klass, align);
  429. }
  430. int32_t mono_class_is_assignable_from_internal(MonoClass *klass, MonoClass *oklass)
  431. {
  432. return il2cpp::vm::Class::IsAssignableFrom((Il2CppClass*)klass, (Il2CppClass*)oklass);
  433. }
  434. MonoClass* mono_class_from_mono_type_internal(MonoType *type)
  435. {
  436. return (MonoClass*)il2cpp::vm::Class::FromIl2CppType((Il2CppType*)type);
  437. }
  438. uint32_t mono_class_get_flags(MonoClass * klass)
  439. {
  440. return il2cpp_class_get_flags((Il2CppClass*)klass);
  441. }
  442. int mono_class_num_fields(MonoClass *klass)
  443. {
  444. return (int)il2cpp::vm::Class::GetNumFields((Il2CppClass*)klass);
  445. }
  446. int mono_class_num_methods(MonoClass *klass)
  447. {
  448. return (int)il2cpp::vm::Class::GetNumMethods((Il2CppClass*)klass);
  449. }
  450. int mono_class_num_properties(MonoClass *klass)
  451. {
  452. return (int)il2cpp::vm::Class::GetNumProperties((Il2CppClass*)klass);
  453. }
  454. MonoClassField* mono_class_get_fields_internal(MonoClass* klass, void* *iter)
  455. {
  456. return (MonoClassField*)il2cpp::vm::Class::GetFields((Il2CppClass*)klass, iter);
  457. }
  458. MonoMethod* mono_class_get_methods(MonoClass* klass, void* *iter)
  459. {
  460. return (MonoMethod*)il2cpp::vm::Class::GetMethods((Il2CppClass*)klass, iter);
  461. }
  462. MonoProperty* mono_class_get_properties(MonoClass* klass, void* *iter)
  463. {
  464. return (MonoProperty*)il2cpp::vm::Class::GetProperties((Il2CppClass*)klass, iter);
  465. }
  466. MonoClass* mono_class_get_nested_types(MonoClass *monoClass, void* *iter)
  467. {
  468. Il2CppClass *klass = (Il2CppClass*)monoClass;
  469. if (klass->generic_class)
  470. return NULL;
  471. return (MonoClass*)il2cpp::vm::Class::GetNestedTypes(klass, iter);
  472. }
  473. void mono_class_setup_methods(MonoClass* klass)
  474. {
  475. il2cpp::vm::Class::SetupMethods((Il2CppClass*)klass);
  476. }
  477. void mono_class_setup_vtable(MonoClass* klass)
  478. {
  479. il2cpp::vm::Class::Init((Il2CppClass*)klass);
  480. }
  481. static int32_t method_nonpublic(MethodInfo* method, int32_t start_klass)
  482. {
  483. switch (method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK)
  484. {
  485. case METHOD_ATTRIBUTE_ASSEM:
  486. return (start_klass || il2cpp_defaults.generic_ilist_class);
  487. case METHOD_ATTRIBUTE_PRIVATE:
  488. return start_klass;
  489. case METHOD_ATTRIBUTE_PUBLIC:
  490. return false;
  491. default:
  492. return true;
  493. }
  494. }
  495. static Il2CppGPtrArray* il2cpp_g_ptr_array_new()
  496. {
  497. Il2CppGPtrArrayPriv* array = (Il2CppGPtrArrayPriv*)IL2CPP_CALLOC(1, sizeof(Il2CppGPtrArrayPriv));
  498. array->pdata = NULL;
  499. array->len = 0;
  500. array->size = 0;
  501. return (Il2CppGPtrArray *)array;
  502. }
  503. static void il2cpp_g_ptr_array_grow(Il2CppGPtrArrayPriv* array, uint32_t length)
  504. {
  505. uint32_t new_length = array->len + length;
  506. IL2CPP_ASSERT(array != NULL);
  507. if (new_length <= array->size)
  508. return;
  509. array->size = 1;
  510. while (array->size < new_length)
  511. array->size <<= 1;
  512. array->size = std::max(array->size, 16U);
  513. array->pdata = (void**)IL2CPP_REALLOC(array->pdata, array->size * sizeof(void*));
  514. }
  515. static void il2cpp_g_ptr_array_add(Il2CppGPtrArray* array, void* data)
  516. {
  517. IL2CPP_ASSERT(array != NULL);
  518. il2cpp_g_ptr_array_grow((Il2CppGPtrArrayPriv *)array, 1);
  519. array->pdata[array->len++] = data;
  520. }
  521. GPtrArray* il2cpp_g_ptr_array_free(GPtrArray *_array, bool free_seg)
  522. {
  523. Il2CppGPtrArray* array = (Il2CppGPtrArray*)_array;
  524. void *data = NULL;
  525. IL2CPP_ASSERT(array);
  526. if (free_seg)
  527. {
  528. IL2CPP_FREE(array->pdata);
  529. }
  530. else
  531. {
  532. data = array->pdata;
  533. }
  534. IL2CPP_FREE(array);
  535. return (GPtrArray*)data;
  536. }
  537. static int32_t il2cpp_g_ascii_strcasecmp(const char *s1, const char *s2)
  538. {
  539. const char *sp1 = s1;
  540. const char *sp2 = s2;
  541. if (s1 == NULL)
  542. return 0;
  543. if (s2 == NULL)
  544. return 0;
  545. while (*sp1 != '\0')
  546. {
  547. char c1 = tolower(*sp1++);
  548. char c2 = tolower(*sp2++);
  549. if (c1 != c2)
  550. return c1 - c2;
  551. }
  552. return (*sp1) - (*sp2);
  553. }
  554. GPtrArray* mono_class_get_methods_by_name(MonoClass* il2cppMonoKlass, const char* name, uint32_t bflags, uint32_t ignore_case, int32_t allow_ctors, MonoError* error)
  555. {
  556. #if IL2CPP_MONO_DEBUGGER
  557. Il2CppGPtrArray *array;
  558. Il2CppClass *klass = (Il2CppClass*)il2cppMonoKlass;
  559. Il2CppClass *startklass;
  560. MethodInfo *method;
  561. void* iter;
  562. int match;
  563. int (*compare_func) (const char *s1, const char *s2) = NULL;
  564. array = il2cpp_g_ptr_array_new();
  565. startklass = klass;
  566. error_init(error);
  567. if (name != NULL)
  568. compare_func = (ignore_case) ? il2cpp_g_ascii_strcasecmp : strcmp;
  569. handle_parent:
  570. mono_class_setup_methods((MonoClass*)klass);
  571. mono_class_setup_vtable((MonoClass*)klass);
  572. iter = NULL;
  573. while ((method = (MethodInfo*)mono_class_get_methods((MonoClass*)klass, &iter)))
  574. {
  575. match = 0;
  576. if (!allow_ctors && method->name[0] == '.' && (strcmp(method->name, ".ctor") == 0 || strcmp(method->name, ".cctor") == 0))
  577. continue;
  578. if ((method->flags & METHOD_ATTRIBUTE_MEMBER_ACCESS_MASK) == METHOD_ATTRIBUTE_PUBLIC)
  579. {
  580. if (bflags & BFLAGS_Public)
  581. match++;
  582. }
  583. else if ((bflags & BFLAGS_NonPublic) && method_nonpublic(method, (klass == startklass)))
  584. {
  585. match++;
  586. }
  587. if (!match)
  588. continue;
  589. match = 0;
  590. if (method->flags & METHOD_ATTRIBUTE_STATIC)
  591. {
  592. if (bflags & BFLAGS_Static)
  593. if ((bflags & BFLAGS_FlattenHierarchy) || (klass == startklass))
  594. match++;
  595. }
  596. else
  597. {
  598. if (bflags & BFLAGS_Instance)
  599. match++;
  600. }
  601. if (!match)
  602. continue;
  603. if (name != NULL)
  604. {
  605. if (compare_func(name, method->name))
  606. continue;
  607. }
  608. match = 0;
  609. il2cpp_g_ptr_array_add(array, method);
  610. }
  611. if (!(bflags & BFLAGS_DeclaredOnly) && (klass = klass->parent))
  612. goto handle_parent;
  613. return (GPtrArray*)array;
  614. #else
  615. return NULL;
  616. #endif
  617. }
  618. MonoMethod* mono_class_get_method_from_name_checked(MonoClass * klass, const char* name, int argsCount, int flags, MonoError* error)
  619. {
  620. return (MonoMethod*)il2cpp_class_get_method_from_name((Il2CppClass*)klass, name, argsCount);
  621. }
  622. int32_t mono_class_is_abstract(MonoClass * klass)
  623. {
  624. return il2cpp_class_is_abstract((Il2CppClass*)klass);
  625. }
  626. int32_t mono_class_field_is_special_static(MonoClassField* field)
  627. {
  628. return il2cpp::vm::Field::IsNormalStatic((FieldInfo*)field) ? 0 : 1;
  629. }
  630. MonoGenericContext* mono_class_get_context(MonoClass* klass)
  631. {
  632. return (MonoGenericContext*)&((Il2CppClass*)klass)->generic_class->context;
  633. }
  634. MonoMethod* mono_class_inflate_generic_method_full_checked(MonoMethod* method, MonoClass* klass_hint, MonoGenericContext* context, MonoError* error)
  635. {
  636. error_init(error);
  637. return (MonoMethod*)il2cpp::metadata::GenericMetadata::Inflate((MethodInfo*)method, (Il2CppGenericContext*)context);
  638. }
  639. MonoMethod* mono_class_inflate_generic_method_checked(MonoMethod* method, MonoGenericContext* context, MonoError* error)
  640. {
  641. error_init(error);
  642. return (MonoMethod*)il2cpp::metadata::GenericMetadata::Inflate((MethodInfo*)method, (Il2CppGenericContext*)context);
  643. }
  644. int32_t mono_class_is_nullable(MonoClass* klass)
  645. {
  646. return il2cpp::vm::Class::IsNullable((Il2CppClass*)klass);
  647. }
  648. MonoGenericContainer* mono_class_get_generic_container(MonoClass* klass)
  649. {
  650. return (MonoGenericContainer*)il2cpp::vm::Class::GetGenericContainer((Il2CppClass*)klass);
  651. }
  652. void mono_class_setup_interfaces(MonoClass* klass, MonoError* error)
  653. {
  654. error_init(error);
  655. il2cpp::vm::Class::SetupInterfaces((Il2CppClass*)klass);
  656. }
  657. int32_t mono_class_is_valuetype(MonoClass* klass)
  658. {
  659. return il2cpp_class_is_valuetype((Il2CppClass*)klass);
  660. }
  661. MonoClass* mono_class_from_generic_parameter_internal(MonoGenericParam* param)
  662. {
  663. return (MonoClass*)il2cpp::vm::Class::FromGenericParameter((Il2CppMetadataGenericParameterHandle)param);
  664. }
  665. MonoGenericClass* mono_class_get_generic_class(MonoClass* monoClass)
  666. {
  667. Il2CppClass *klass = (Il2CppClass*)monoClass;
  668. return (MonoGenericClass*)klass->generic_class;
  669. }
  670. MonoClass* mono_class_try_load_from_name(MonoImage* image, const char* namespaze, const char* name)
  671. {
  672. return (MonoClass*)il2cpp_class_from_name((const Il2CppImage*)image, namespaze, name);
  673. }
  674. int32_t mono_class_is_gtd(MonoClass* klass)
  675. {
  676. return il2cpp_class_is_generic((Il2CppClass*)klass);
  677. }
  678. int32_t mono_class_is_ginst(MonoClass* klass)
  679. {
  680. return il2cpp_class_is_inflated((Il2CppClass*)klass);
  681. }
  682. const char* mono_class_get_namespace(MonoClass * klass)
  683. {
  684. return il2cpp_class_get_namespace((Il2CppClass*)klass);
  685. }
  686. const char* mono_class_get_name(MonoClass * klass)
  687. {
  688. return il2cpp_class_get_name((Il2CppClass*)klass);
  689. }
  690. MonoClass* mono_class_get_parent(MonoClass * klass)
  691. {
  692. return (MonoClass*)il2cpp_class_get_parent((Il2CppClass*)klass);
  693. }
  694. MonoType* mono_class_get_type(MonoClass * klass)
  695. {
  696. return (MonoType*)il2cpp_class_get_type((Il2CppClass*)klass);
  697. }
  698. uint32_t mono_class_get_type_token(MonoClass * klass)
  699. {
  700. return il2cpp_class_get_type_token((Il2CppClass*)klass);
  701. }
  702. MonoType* mono_class_get_byref_type(MonoClass *klass)
  703. {
  704. return (MonoType*)il2cpp::vm::Class::GetByrefType((Il2CppClass*)klass);
  705. }
  706. MonoImage* mono_class_get_image(MonoClass * klass)
  707. {
  708. return (MonoImage*)il2cpp_class_get_image((Il2CppClass*)klass);
  709. }
  710. MonoClass* mono_class_get_interfaces(MonoClass * klass, void* *iter)
  711. {
  712. return (MonoClass*)il2cpp_class_get_interfaces((Il2CppClass*)klass, iter);
  713. }
  714. int32_t mono_class_is_interface(MonoClass * klass)
  715. {
  716. return il2cpp_class_is_interface((Il2CppClass*)klass);
  717. }
  718. int mono_class_get_rank(MonoClass * klass)
  719. {
  720. return il2cpp_class_get_rank((Il2CppClass*)klass);
  721. }
  722. MonoClass* mono_class_get_element_class(MonoClass * klass)
  723. {
  724. return (MonoClass*)il2cpp_class_get_element_class((Il2CppClass*)klass);
  725. }
  726. int32_t mono_class_is_enum(MonoClass * klass)
  727. {
  728. return il2cpp_class_is_enum((Il2CppClass*)klass);
  729. }
  730. MonoMethodSignature* mono_method_signature_internal(MonoMethod *m)
  731. {
  732. MethodInfo* method = (MethodInfo*)m;
  733. if (method_signatures == NULL)
  734. method_signatures = new MethodSignatureMap();
  735. auto entry = method_signatures->find(method);
  736. if (entry != method_signatures->end())
  737. return (MonoMethodSignature*)entry->second->signature;
  738. Il2CppMonoMethodSignatureWrapper* wrapper = new Il2CppMonoMethodSignatureWrapper(method);
  739. method_signatures->add(method, wrapper);
  740. return (MonoMethodSignature*)wrapper->signature;
  741. }
  742. void mono_free_method_signatures()
  743. {
  744. delete method_signatures;
  745. method_signatures = NULL;
  746. }
  747. MonoDebugLocalsInfo* mono_debug_lookup_locals(MonoMethod *method)
  748. {
  749. #if IL2CPP_MONO_DEBUGGER
  750. uint32_t executionContextInfoCount;
  751. const Il2CppMethodExecutionContextInfo * executionContextInfo;
  752. const Il2CppMethodHeaderInfo *headerInfo;
  753. const Il2CppMethodScope *scopes;
  754. il2cpp::utils::Debugger::GetMethodExecutionContextInfo((const MethodInfo*)method, &executionContextInfoCount, &executionContextInfo, &headerInfo, &scopes);
  755. Il2CppMonoDebugLocalsInfo* locals = (Il2CppMonoDebugLocalsInfo*)IL2CPP_CALLOC(1, sizeof(Il2CppMonoDebugLocalsInfo));
  756. locals->num_locals = executionContextInfoCount;
  757. locals->locals = (Il2CppMonoDebugLocalVar*)IL2CPP_CALLOC(executionContextInfoCount, sizeof(Il2CppMonoDebugLocalVar));
  758. for (int i = 0; i < locals->num_locals; ++i)
  759. {
  760. locals->locals[i].name = (char*)il2cpp::utils::Debugger::GetLocalName((const MethodInfo*)method, executionContextInfo[i].nameIndex);
  761. locals->locals[i].index = i;
  762. /* hack we should point to blocks allocated below? */
  763. locals->locals[i].block = (Il2CppMonoDebugCodeBlock*)IL2CPP_CALLOC(1, sizeof(Il2CppMonoDebugCodeBlock));
  764. const Il2CppMethodScope* scope = il2cpp::utils::Debugger::GetLocalScope((const MethodInfo*)method, executionContextInfo[i].scopeIndex);
  765. locals->locals[i].block->start_offset = scope->startOffset;
  766. locals->locals[i].block->end_offset = scope->endOffset;
  767. }
  768. locals->num_blocks = headerInfo->numScopes;
  769. locals->code_blocks = (Il2CppMonoDebugCodeBlock*)IL2CPP_CALLOC(headerInfo->numScopes, sizeof(Il2CppMonoDebugCodeBlock));
  770. for (int i = 0; i < headerInfo->numScopes; ++i)
  771. {
  772. locals->code_blocks[i].start_offset = scopes[i].startOffset;
  773. locals->code_blocks[i].end_offset = scopes[i].endOffset;
  774. }
  775. return (MonoDebugLocalsInfo*)locals;
  776. #else
  777. return NULL;
  778. #endif
  779. }
  780. void mono_debug_free_locals(MonoDebugLocalsInfo *info)
  781. {
  782. #if IL2CPP_MONO_DEBUGGER
  783. Il2CppMonoDebugLocalsInfo* locals = (Il2CppMonoDebugLocalsInfo*)info;
  784. for (int i = 0; i < locals->num_locals; ++i)
  785. {
  786. IL2CPP_FREE(locals->locals[i].block);
  787. }
  788. IL2CPP_FREE(locals->locals);
  789. IL2CPP_FREE(locals->code_blocks);
  790. IL2CPP_FREE(locals);
  791. #endif
  792. }
  793. MonoDebugMethodJitInfo* mono_debug_find_method(MonoMethod *method, MonoDomain *domain)
  794. {
  795. #if IL2CPP_MONO_DEBUGGER
  796. Il2CppMonoDebugMethodJitInfo* jit = (Il2CppMonoDebugMethodJitInfo*)IL2CPP_CALLOC(1, sizeof(Il2CppMonoDebugMethodJitInfo));
  797. Il2CppMonoDebugLocalsInfo* locals_info = (Il2CppMonoDebugLocalsInfo*)mono_debug_lookup_locals(method);
  798. jit->num_locals = locals_info->num_locals;
  799. Il2CppMonoMethodSignature* sig = (Il2CppMonoMethodSignature*)mono_method_signature_internal(method);
  800. jit->num_params = sig->param_count;
  801. return (MonoDebugMethodJitInfo*)jit;
  802. #else
  803. return NULL;
  804. #endif
  805. }
  806. void mono_method_get_param_names(MonoMethod *m, const char **names)
  807. {
  808. MethodInfo* method = (MethodInfo*)m;
  809. uint32_t numberOfParameters = il2cpp::vm::Method::GetParamCount(method);
  810. for (uint32_t i = 0; i < numberOfParameters; ++i)
  811. names[i] = il2cpp::vm::Method::GetParamName(method, i);
  812. }
  813. MonoGenericContext* mono_method_get_context(MonoMethod* monoMethod)
  814. {
  815. MethodInfo* method = (MethodInfo*)monoMethod;
  816. if (!method->is_inflated || method->is_generic)
  817. return NULL;
  818. return (MonoGenericContext*)&((MethodInfo*)method)->genericMethod->context;
  819. }
  820. MonoMethodHeader* mono_method_get_header_checked(MonoMethod *method, MonoError *error)
  821. {
  822. #if IL2CPP_MONO_DEBUGGER
  823. if (error)
  824. error_init(error);
  825. uint32_t executionContextInfoCount;
  826. const Il2CppMethodExecutionContextInfo *executionContextInfo;
  827. const Il2CppMethodHeaderInfo *headerInfo;
  828. const Il2CppMethodScope *scopes;
  829. MonoGenericContext* context = mono_method_get_context(method);
  830. il2cpp::utils::Debugger::GetMethodExecutionContextInfo((const MethodInfo*)method, &executionContextInfoCount, &executionContextInfo, &headerInfo, &scopes);
  831. Il2CppMonoMethodHeader* header = (Il2CppMonoMethodHeader*)IL2CPP_CALLOC(1, sizeof(Il2CppMonoMethodHeader) + (executionContextInfoCount * sizeof(Il2CppType*)));
  832. header->code_size = headerInfo->code_size;
  833. header->num_locals = executionContextInfoCount;
  834. for (uint32_t i = 0; i < executionContextInfoCount; i++)
  835. header->locals[i] = (Il2CppType*)il2cpp::metadata::GenericMetadata::InflateIfNeeded(il2cpp::vm::MetadataCache::GetIl2CppTypeFromIndex(NULL, executionContextInfo[i].typeIndex), (const Il2CppGenericContext *)context, true);
  836. return (MonoMethodHeader*)header;
  837. #else
  838. return NULL;
  839. #endif
  840. }
  841. void mono_metadata_free_mh(MonoMethodHeader *mh)
  842. {
  843. IL2CPP_FREE(mh);
  844. }
  845. char* mono_method_full_name(MonoMethod* method, int32_t signature)
  846. {
  847. return il2cpp::utils::StringUtils::StringDuplicate(((MethodInfo*)method)->name);
  848. }
  849. MonoGenericContainer* mono_method_get_generic_container(MonoMethod* monoMethod)
  850. {
  851. MethodInfo * method = (MethodInfo*)monoMethod;
  852. if (method->is_inflated || !method->is_generic)
  853. return NULL;
  854. return (MonoGenericContainer*)method->genericContainerHandle;
  855. }
  856. void* mono_method_get_wrapper_data(MonoMethod* method, uint32_t id)
  857. {
  858. IL2CPP_ASSERT(0 && "This method is not supported");
  859. return 0;
  860. }
  861. MonoMethod* mono_method_get_declaring_generic_method(MonoMethod* method)
  862. {
  863. IL2CPP_ASSERT(0 && "This method is not supported");
  864. return NULL;
  865. }
  866. const char* mono_method_get_name(MonoMethod *method)
  867. {
  868. return il2cpp::vm::Method::GetName((const MethodInfo*)method);
  869. }
  870. MonoClass* mono_method_get_class(MonoMethod *method)
  871. {
  872. return (MonoClass*)il2cpp::vm::Method::GetClass((const MethodInfo*)method);
  873. }
  874. uint32_t mono_method_get_flags(MonoMethod *method, uint32_t *iflags)
  875. {
  876. if (iflags != 0)
  877. *iflags = il2cpp::vm::Method::GetImplementationFlags((const MethodInfo*)method);
  878. return il2cpp::vm::Method::GetFlags((const MethodInfo*)method);
  879. }
  880. uint32_t mono_method_get_token(MonoMethod *method)
  881. {
  882. return il2cpp::vm::Method::GetToken((const MethodInfo*)method);
  883. }
  884. bool mono_method_is_generic(MonoMethod *method)
  885. {
  886. return il2cpp::vm::Method::IsGeneric((const MethodInfo*)method);
  887. }
  888. bool mono_method_is_inflated(MonoMethod *method)
  889. {
  890. return il2cpp::vm::Method::IsInflated((const MethodInfo*)method);
  891. }
  892. int32_t mono_array_element_size(MonoClass *monoClass)
  893. {
  894. Il2CppClass *klass = (Il2CppClass*)monoClass;
  895. return klass->element_size;
  896. }
  897. char* mono_array_addr_with_size(MonoArray *array, int size, uintptr_t idx)
  898. {
  899. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  900. return NULL;
  901. }
  902. uintptr_t mono_array_length(MonoArray *array)
  903. {
  904. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  905. return 0;
  906. }
  907. const char* mono_field_get_name(MonoClassField *field)
  908. {
  909. return il2cpp::vm::Field::GetName((FieldInfo*)field);
  910. }
  911. void mono_field_set_value(MonoObject *obj, MonoClassField *field, void *value)
  912. {
  913. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  914. }
  915. void mono_field_static_set_value_internal(MonoVTable *vt, MonoClassField *field, void *value)
  916. {
  917. il2cpp::vm::Field::StaticSetValue((FieldInfo*)field, value);
  918. }
  919. MonoObject* mono_field_get_value_object_checked(MonoDomain* domain, MonoClassField* field, MonoObject* obj, MonoError* error)
  920. {
  921. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  922. return NULL;
  923. }
  924. MonoClass* mono_field_get_parent(MonoClassField *field)
  925. {
  926. return (MonoClass*)il2cpp::vm::Field::GetParent((FieldInfo*)field);
  927. }
  928. uint32_t mono_field_get_offset(MonoClassField *field)
  929. {
  930. return (uint32_t)il2cpp::vm::Field::GetOffset((FieldInfo*)field);
  931. }
  932. MonoType* mono_field_get_type(MonoClassField *field)
  933. {
  934. return (MonoType*)il2cpp::vm::Field::GetType((FieldInfo*)field);
  935. }
  936. uint16_t* mono_string_chars(MonoString *monoStr)
  937. {
  938. Il2CppString *str = (Il2CppString*)monoStr;
  939. return (uint16_t*)str->chars;
  940. }
  941. int mono_string_length(MonoString *monoStr)
  942. {
  943. Il2CppString *str = (Il2CppString*)monoStr;
  944. return str->length;
  945. }
  946. MonoString* mono_string_new(MonoDomain *domain, const char *text)
  947. {
  948. return (MonoString*)il2cpp::vm::String::New(text);
  949. }
  950. MonoString* mono_string_new_checked(MonoDomain *domain, const char *text, MonoError *merror)
  951. {
  952. error_init(merror);
  953. return mono_string_new(domain, text);
  954. }
  955. char* mono_string_to_utf8_checked_internal(MonoString *string_obj, MonoError *error)
  956. {
  957. error_init(error);
  958. Il2CppString *str = (Il2CppString*)string_obj;
  959. std::string s = il2cpp::utils::StringUtils::Utf16ToUtf8(str->chars, str->length);
  960. return il2cpp::utils::StringUtils::StringDuplicate(s.c_str());
  961. }
  962. int mono_object_hash_internal(MonoObject* obj)
  963. {
  964. return (int)((intptr_t)obj >> 3);
  965. }
  966. void* mono_object_unbox_internal(MonoObject *monoObj)
  967. {
  968. Il2CppObject *obj = (Il2CppObject*)monoObj;
  969. return il2cpp::vm::Object::Unbox(obj);
  970. }
  971. MonoMethod* mono_object_get_virtual_method_internal(MonoObject *obj, MonoMethod *method)
  972. {
  973. return (MonoMethod*)il2cpp::vm::Object::GetVirtualMethod((Il2CppObject*)obj, (const MethodInfo*)method);
  974. }
  975. MonoObject* mono_object_new_checked(MonoDomain* domain, MonoClass* klass, MonoError* error)
  976. {
  977. error_init(error);
  978. return (MonoObject*)il2cpp::vm::Object::New((Il2CppClass*)klass);
  979. }
  980. MonoType* mono_object_get_type(MonoObject* object)
  981. {
  982. return (MonoType*)&(((Il2CppObject*)object)->klass->byval_arg);
  983. }
  984. MonoMethod* mono_get_method_checked(MonoImage* image, uint32_t token, MonoClass* klass, MonoGenericContext* context, MonoError* error)
  985. {
  986. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  987. return NULL;
  988. }
  989. void* mono_gchandle_new_weakref_internal(MonoObject *obj, int32_t track_resurrection)
  990. {
  991. auto weakRef = il2cpp::gc::GCHandle::NewWeakref((Il2CppObject*)obj, track_resurrection == 0 ? false : true);
  992. il2cpp::vm::Exception::RaiseIfError(weakRef.GetError());
  993. return (void*)weakRef.Get();
  994. }
  995. MonoObject* mono_gchandle_get_target_internal(void* gchandle)
  996. {
  997. return (MonoObject*)il2cpp::gc::GCHandle::GetTarget((Il2CppGCHandle)gchandle);
  998. }
  999. void mono_gchandle_free_internal(void* gchandle)
  1000. {
  1001. il2cpp::gc::GCHandle::Free((Il2CppGCHandle)gchandle);
  1002. }
  1003. MonoThread* mono_thread_current()
  1004. {
  1005. return (MonoThread*)il2cpp::vm::Thread::Current();
  1006. }
  1007. MonoThread* mono_thread_get_main()
  1008. {
  1009. return (MonoThread*)il2cpp::vm::Thread::Main();
  1010. }
  1011. MonoThread* mono_thread_attach(MonoDomain* domain)
  1012. {
  1013. return (MonoThread*)il2cpp::vm::Thread::Attach((Il2CppDomain*)domain);
  1014. }
  1015. void mono_thread_detach(MonoThread* thread)
  1016. {
  1017. il2cpp::vm::Thread::Detach((Il2CppThread*)thread);
  1018. }
  1019. MonoInternalThread* mono_thread_internal_current()
  1020. {
  1021. Il2CppThread* currentThread = (Il2CppThread*)mono_thread_current();
  1022. if (currentThread == NULL)
  1023. return NULL;
  1024. return (MonoInternalThread*)currentThread->internal_thread;
  1025. }
  1026. int32_t mono_thread_internal_is_current(MonoInternalThread* thread)
  1027. {
  1028. MonoInternalThread* currentThread = mono_thread_internal_current();
  1029. if (currentThread == NULL)
  1030. return false;
  1031. return currentThread == thread;
  1032. }
  1033. int32_t mono_thread_internal_abort(MonoInternalThread* thread, int32_t appdomain_unload)
  1034. {
  1035. return il2cpp::vm::Thread::RequestAbort((Il2CppInternalThread*)thread);
  1036. }
  1037. void mono_thread_internal_reset_abort(MonoInternalThread* thread)
  1038. {
  1039. il2cpp::vm::Thread::ResetAbort((Il2CppInternalThread*)thread);
  1040. }
  1041. char* mono_thread_get_name_utf8(MonoThread* this_obj)
  1042. {
  1043. std::string name = il2cpp::vm::Thread::GetName(((Il2CppThread*)this_obj)->GetInternalThread());
  1044. if (name.empty())
  1045. return NULL;
  1046. return il2cpp::utils::StringUtils::StringDuplicate(name.c_str());
  1047. }
  1048. void mono_thread_set_name_internal(MonoInternalThread* this_obj, MonoString* name, int32_t permanent, int32_t reset, MonoError* error)
  1049. {
  1050. il2cpp::vm::Thread::SetName((Il2CppInternalThread*)this_obj, (Il2CppString*)name);
  1051. error_init(error);
  1052. }
  1053. #if IL2CPP_COMPILER_MSVC
  1054. void mono_thread_set_name(MonoInternalThread* this_obj, const char* name8, size_t name8_length, const uint16_t* name16, int32_t flags, MonoError *error)
  1055. #else
  1056. void mono_thread_set_name(MonoInternalThread* this_obj, const char* name8, size_t name8_length, const uint16_t* name16, MonoSetThreadNameFlags flags, MonoError *error)
  1057. #endif
  1058. {
  1059. il2cpp::vm::Thread::SetName((Il2CppInternalThread*)this_obj, il2cpp::vm::String::New(name8));
  1060. error_init(error);
  1061. }
  1062. void mono_thread_suspend_all_other_threads()
  1063. {
  1064. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1065. }
  1066. int32_t mono_thread_state_init_from_current(MonoThreadUnwindState* ctx)
  1067. {
  1068. return 0;
  1069. }
  1070. int32_t mono_thread_state_init_from_monoctx(MonoThreadUnwindState* ctx, MonoContext* mctx)
  1071. {
  1072. return 0;
  1073. }
  1074. const char* mono_property_get_name(MonoProperty *prop)
  1075. {
  1076. return il2cpp::vm::Property::GetName((PropertyInfo*)prop);
  1077. }
  1078. MonoMethod* mono_property_get_get_method(MonoProperty *prop)
  1079. {
  1080. return (MonoMethod*)il2cpp::vm::Property::GetGetMethod((PropertyInfo*)prop);
  1081. }
  1082. MonoMethod* mono_property_get_set_method(MonoProperty *prop)
  1083. {
  1084. return (MonoMethod*)il2cpp::vm::Property::GetSetMethod((PropertyInfo*)prop);
  1085. }
  1086. MonoClass* mono_property_get_parent(MonoProperty *prop)
  1087. {
  1088. return (MonoClass*)il2cpp::vm::Property::GetParent((PropertyInfo*)prop);
  1089. }
  1090. void mono_loader_lock()
  1091. {
  1092. #if IL2CPP_MONO_DEBUGGER
  1093. il2cpp::utils::Debugger::AcquireLoaderLock();
  1094. #else
  1095. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1096. #endif
  1097. }
  1098. void mono_loader_unlock()
  1099. {
  1100. #if IL2CPP_MONO_DEBUGGER
  1101. il2cpp::utils::Debugger::ReleaseLoaderLock();
  1102. #else
  1103. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1104. #endif
  1105. }
  1106. void mono_loader_lock_track_ownership(int32_t track)
  1107. {
  1108. // This method intentionally does nothing.
  1109. }
  1110. int32_t mono_loader_lock_is_owned_by_self()
  1111. {
  1112. #if IL2CPP_MONO_DEBUGGER
  1113. return il2cpp::utils::Debugger::LoaderLockIsOwnedByThisThread();
  1114. #else
  1115. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1116. return false;
  1117. #endif
  1118. }
  1119. void mono_gc_wbarrier_generic_store_internal(void volatile* ptr, MonoObject* value)
  1120. {
  1121. il2cpp::gc::WriteBarrier::GenericStore((Il2CppObject**)ptr, (Il2CppObject*)value);
  1122. }
  1123. void mono_gc_base_init()
  1124. {
  1125. // This method intentionally does nothing.
  1126. }
  1127. #if IL2CPP_COMPILER_MSVC
  1128. int mono_gc_register_root(char* start, size_t size, MonoGCDescriptor descr, int32_t source, void* key, const char* msg)
  1129. #else
  1130. int mono_gc_register_root(char* start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void* key, const char* msg)
  1131. #endif
  1132. {
  1133. il2cpp::gc::GarbageCollector::RegisterRoot(start, size);
  1134. return 1;
  1135. }
  1136. void mono_gc_deregister_root(char* addr)
  1137. {
  1138. il2cpp::gc::GarbageCollector::UnregisterRoot(addr);
  1139. }
  1140. void* mono_gc_make_root_descr_all_refs(int numbits)
  1141. {
  1142. return NULL;
  1143. }
  1144. #if IL2CPP_COMPILER_MSVC
  1145. int mono_gc_register_root_wbarrier(char *start, size_t size, MonoGCDescriptor descr, int32_t source, void *key, const char *msg)
  1146. #else
  1147. int mono_gc_register_root_wbarrier(char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg)
  1148. #endif
  1149. {
  1150. il2cpp::gc::GarbageCollector::RegisterRoot(start, size);
  1151. return 1;
  1152. }
  1153. MonoGCDescriptor mono_gc_make_vector_descr()
  1154. {
  1155. return 0;
  1156. }
  1157. MonoInterpCallbacks* mini_get_interp_callbacks()
  1158. {
  1159. #if IL2CPP_MONO_DEBUGGER
  1160. return (MonoInterpCallbacks*)il2cpp::utils::Debugger::GetInterpCallbacks();
  1161. #else
  1162. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1163. return NULL;
  1164. #endif
  1165. }
  1166. void* mono_gc_invoke_with_gc_lock(MonoGCLockedCallbackFunc func, void *data)
  1167. {
  1168. return il2cpp::gc::GarbageCollector::CallWithAllocLockHeld(func, data);
  1169. }
  1170. int32_t mono_gc_is_moving()
  1171. {
  1172. return false;
  1173. }
  1174. int mono_reflection_parse_type_checked(char *name, MonoTypeNameParse *monoInfo, MonoError *error)
  1175. {
  1176. #if !IL2CPP_MONO_DEBUGGER
  1177. IL2CPP_ASSERT(0 && "This is not a complete implementation. It should only be called from the debugger.");
  1178. #endif
  1179. error_init(error);
  1180. il2cpp::vm::TypeNameParseInfo *pInfo = new il2cpp::vm::TypeNameParseInfo();
  1181. std::string nameStr = name;
  1182. std::replace(nameStr.begin(), nameStr.end(), '/', '+');
  1183. il2cpp::vm::TypeNameParser parser(nameStr, *pInfo, false);
  1184. Il2CppMonoTypeNameParse* info = (Il2CppMonoTypeNameParse*)monoInfo;
  1185. info->assembly.name = NULL;
  1186. info->il2cppTypeNameParseInfo = pInfo;
  1187. return parser.Parse();
  1188. }
  1189. void mono_reflection_free_type_info(MonoTypeNameParse *info)
  1190. {
  1191. delete (il2cpp::vm::TypeNameParseInfo*)((Il2CppMonoTypeNameParse*)info)->il2cppTypeNameParseInfo;
  1192. }
  1193. MonoType* mono_reflection_get_type_checked(MonoAssemblyLoadContext *alc, MonoImage* rootimage, MonoImage* image, MonoTypeNameParse* info, int32_t ignorecase, int32_t search_mscorlib, int32_t* type_resolve, MonoError* error)
  1194. {
  1195. error_init(error);
  1196. Il2CppClass *klass = il2cpp::vm::Image::FromTypeNameParseInfo((Il2CppImage*)image, *((il2cpp::vm::TypeNameParseInfo*)((Il2CppMonoTypeNameParse*)info)->il2cppTypeNameParseInfo), ignorecase);
  1197. if (!klass)
  1198. return NULL;
  1199. return (MonoType*)il2cpp::vm::Class::GetType(klass);
  1200. }
  1201. void mono_runtime_quit()
  1202. {
  1203. il2cpp::vm::Runtime::Shutdown();
  1204. }
  1205. int32_t mono_runtime_is_shutting_down()
  1206. {
  1207. return il2cpp::vm::Runtime::IsShuttingDown() ? true : false;
  1208. }
  1209. MonoObject* mono_runtime_try_invoke(MonoMethod* method, void* obj, void** params, MonoObject** exc, MonoError* error)
  1210. {
  1211. error_init(error);
  1212. return (MonoObject*)il2cpp::vm::Runtime::Invoke((MethodInfo*)method, obj, params, (Il2CppException**)exc);
  1213. }
  1214. MonoObject* mono_runtime_invoke_checked(MonoMethod* method, void* obj, void** params, MonoError* error)
  1215. {
  1216. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1217. return NULL;
  1218. }
  1219. int32_t mono_runtime_try_shutdown()
  1220. {
  1221. return true;
  1222. }
  1223. void mono_arch_setup_resume_sighandler_ctx(MonoContext* ctx, void* func)
  1224. {
  1225. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1226. }
  1227. void mono_arch_set_breakpoint(MonoJitInfo* ji, uint8_t* ip)
  1228. {
  1229. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1230. }
  1231. void mono_arch_clear_breakpoint(MonoJitInfo* ji, uint8_t* ip)
  1232. {
  1233. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1234. }
  1235. void mono_arch_start_single_stepping()
  1236. {
  1237. }
  1238. void mono_arch_stop_single_stepping()
  1239. {
  1240. }
  1241. void mono_arch_skip_breakpoint(MonoContext* ctx, MonoJitInfo* ji)
  1242. {
  1243. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1244. }
  1245. void mono_arch_skip_single_step(MonoContext* ctx)
  1246. {
  1247. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1248. }
  1249. intptr_t mono_arch_context_get_int_reg(MonoContext* ctx, int reg)
  1250. {
  1251. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1252. return 0;
  1253. }
  1254. void mono_arch_context_set_int_reg(MonoContext* ctx, int reg, intptr_t val)
  1255. {
  1256. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1257. }
  1258. MonoJitInfo* mono_jit_info_table_find(MonoDomain* domain, void* addr)
  1259. {
  1260. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1261. return NULL;
  1262. }
  1263. MonoMethod* mono_jit_info_get_method(MonoJitInfo* ji)
  1264. {
  1265. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1266. return NULL;
  1267. }
  1268. MonoJitInfo* mono_jit_info_table_find_internal(MonoDomain* domain, void* addr, int32_t try_aot, int32_t allow_trampolines)
  1269. {
  1270. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1271. return NULL;
  1272. }
  1273. int32_t mono_debug_il_offset_from_address(MonoMethod* method, MonoDomain* domain, uint32_t native_offset)
  1274. {
  1275. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1276. return 0;
  1277. }
  1278. void mono_set_is_debugger_attached(int32_t attached)
  1279. {
  1280. #if IL2CPP_MONO_DEBUGGER
  1281. il2cpp::utils::Debugger::SetIsDebuggerAttached(attached == 1);
  1282. #endif
  1283. }
  1284. uint32_t mono_aligned_addr_hash(const void* ptr)
  1285. {
  1286. return ((uint32_t)(intptr_t)(ptr)) >> 3;
  1287. }
  1288. MonoGenericInst* mono_metadata_get_generic_inst(int type_argc, MonoType** type_argv)
  1289. {
  1290. return (MonoGenericInst*)il2cpp::vm::MetadataCache::GetGenericInst((Il2CppType**)type_argv, type_argc);
  1291. }
  1292. void* mono_ldtoken_checked(MonoImage* image, uint32_t token, MonoClass** handle_class, MonoGenericContext* context, MonoError* error)
  1293. {
  1294. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1295. return 0;
  1296. }
  1297. MonoThreadInfo* mono_stack_mark_record_size(MonoThreadInfo* info, HandleStackMark* stackmark, const char* func_name)
  1298. {
  1299. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1300. return NULL;
  1301. }
  1302. void mono_nullable_init(uint8_t* buf, MonoObject* value, MonoClass* klass)
  1303. {
  1304. il2cpp::vm::Object::NullableInit(buf, (Il2CppObject*)value, (Il2CppClass*)klass);
  1305. }
  1306. MonoObject* mono_value_box_checked(MonoDomain* domain, MonoClass* klass, void* value, MonoError* error)
  1307. {
  1308. error_init(error);
  1309. return (MonoObject*)il2cpp::vm::Object::Box((Il2CppClass*)klass, value);
  1310. }
  1311. char* mono_get_runtime_build_info()
  1312. {
  1313. return il2cpp::utils::StringUtils::StringDuplicate("0.0 (IL2CPP)");
  1314. }
  1315. MonoMethod* mono_marshal_method_from_wrapper(MonoMethod* wrapper)
  1316. {
  1317. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1318. return NULL;
  1319. }
  1320. void* mono_jit_find_compiled_method_with_jit_info(MonoDomain* domain, MonoMethod* method, MonoJitInfo** ji)
  1321. {
  1322. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1323. return 0;
  1324. }
  1325. MonoLMF** mono_get_lmf_addr()
  1326. {
  1327. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1328. return NULL;
  1329. }
  1330. void mono_set_lmf(MonoLMF* lmf)
  1331. {
  1332. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1333. }
  1334. void* il2cpp_mono_aot_get_method_checked(MonoDomain* domain, MonoMethod* method, MonoError* error)
  1335. {
  1336. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1337. return 0;
  1338. }
  1339. MonoJitInfo* mini_jit_info_table_find(MonoDomain* domain, char* addr, MonoDomain** out_domain)
  1340. {
  1341. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1342. return NULL;
  1343. }
  1344. void mono_restore_context(MonoContext* ctx)
  1345. {
  1346. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1347. }
  1348. int32_t mono_error_ok(MonoError *error)
  1349. {
  1350. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1351. return 0;
  1352. }
  1353. MonoString* mono_ldstr_checked(MonoDomain* domain, MonoImage* image, uint32_t idx, MonoError* error)
  1354. {
  1355. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1356. return NULL;
  1357. }
  1358. int32_t mono_find_prev_seq_point_for_native_offset(MonoDomain *domain, MonoMethod *method, int32_t native_offset, MonoSeqPointInfo **info, SeqPoint* seq_point)
  1359. {
  1360. IL2CPP_ASSERT(0 && "This method is not yet implemented");
  1361. return 0;
  1362. }
  1363. int32_t mono_environment_exitcode_get()
  1364. {
  1365. return il2cpp::vm::Runtime::GetExitCode();
  1366. }
  1367. void mono_environment_exitcode_set(int32_t value)
  1368. {
  1369. il2cpp::vm::Runtime::SetExitCode(value);
  1370. }
  1371. void mono_threadpool_suspend()
  1372. {
  1373. il2cpp::vm::ThreadPoolMs::Suspend();
  1374. }
  1375. void mono_threadpool_resume()
  1376. {
  1377. il2cpp::vm::ThreadPoolMs::Resume();
  1378. }
  1379. MonoImage* mono_assembly_get_image_internal(MonoAssembly* assembly)
  1380. {
  1381. return (MonoImage*)il2cpp::vm::Assembly::GetImage((Il2CppAssembly*)assembly);
  1382. }
  1383. int32_t mono_verifier_is_method_valid_generic_instantiation(MonoMethod* method)
  1384. {
  1385. if (!method)
  1386. return 0;
  1387. if (!((MethodInfo*)method)->is_generic && ((MethodInfo*)method)->is_inflated && ((MethodInfo*)method)->methodPointer)
  1388. return 1;
  1389. return 0;
  1390. }
  1391. void mono_network_init()
  1392. {
  1393. }
  1394. MonoMethod* jinfo_get_method(MonoJitInfo *ji)
  1395. {
  1396. return (MonoMethod*)((Il2CppMonoJitInfo*)ji)->d.method;
  1397. }
  1398. void mono_error_cleanup(MonoError *oerror)
  1399. {
  1400. }
  1401. MonoGenericContext* mono_generic_class_get_context(MonoGenericClass *gclass)
  1402. {
  1403. return (MonoGenericContext*)il2cpp::vm::GenericClass::GetContext((Il2CppGenericClass*)gclass);
  1404. }
  1405. MonoClass* mono_get_string_class()
  1406. {
  1407. return (MonoClass*)il2cpp_defaults.string_class;
  1408. }
  1409. int32_t mono_type_is_generic_parameter(MonoType *type)
  1410. {
  1411. auto il2cppType = (Il2CppType*)type;
  1412. return !il2cppType->byref && (il2cppType->type == IL2CPP_TYPE_VAR || il2cppType->type == IL2CPP_TYPE_MVAR);
  1413. }
  1414. int mono_type_size(MonoType *t, int* align)
  1415. {
  1416. auto sizeAndAlignment = il2cpp::metadata::FieldLayout::GetTypeSizeAndAlignment((Il2CppType*)t);
  1417. *align = sizeAndAlignment.alignment;
  1418. // The Mono API requires an int return value, so assert if the value does not fit in an int.
  1419. IL2CPP_ASSERT(sizeAndAlignment.size <= std::numeric_limits<uint32_t>::max());
  1420. return (int)sizeAndAlignment.size;
  1421. }
  1422. int32_t mono_metadata_generic_class_is_valuetype(MonoGenericClass *gclass)
  1423. {
  1424. return il2cpp::vm::GenericClass::IsValueType((Il2CppGenericClass*)gclass);
  1425. }
  1426. int32_t mono_domain_is_unloading(MonoDomain *domain)
  1427. {
  1428. // Domains never unload in IL2CPP
  1429. return 0;
  1430. }
  1431. MonoClass* mono_get_byte_class()
  1432. {
  1433. return (MonoClass*)il2cpp_defaults.byte_class;
  1434. }
  1435. int32_t mono_debug_image_has_debug_info(MonoImage *image)
  1436. {
  1437. // For IL2CPP assume we never have debug info for a given image
  1438. return 0;
  1439. }
  1440. char* mono_debug_image_get_sourcelink(MonoImage *image)
  1441. {
  1442. // IL2CPP does not support sourcelink
  1443. return NULL;
  1444. }
  1445. MonoAssemblyLoadContext* mono_domain_default_alc(MonoDomain *domain)
  1446. {
  1447. // IL2CPP does not support ALCs yet
  1448. return NULL;
  1449. }
  1450. int mono_class_interface_offset_with_variance(MonoClass *klass, MonoClass *itf, int32_t *non_exact_match)
  1451. {
  1452. IL2CPP_ASSERT(0 && "Not Implemented yet");
  1453. return 0;
  1454. }
  1455. int32_t mono_class_has_parent(MonoClass *klass, MonoClass *parent)
  1456. {
  1457. return il2cpp::vm::Class::HasParent((Il2CppClass*)klass, (Il2CppClass*)parent);
  1458. }
  1459. MonoClass* mono_class_get_checked(MonoImage *image, uint32_t type_token, MonoError *error)
  1460. {
  1461. IL2CPP_ASSERT(0 && "Not Implemented yet");
  1462. return NULL;
  1463. }
  1464. void* mono_vtype_get_field_addr(void* vtype, MonoClassField *field)
  1465. {
  1466. return ((char*)vtype) + ((FieldInfo*)field)->offset - sizeof(Il2CppObject);
  1467. }
  1468. MonoClass* mono_class_create_array(MonoClass *element_class, uint32_t rank)
  1469. {
  1470. return (MonoClass*)il2cpp::vm::Class::GetArrayClass((Il2CppClass*)element_class, rank);
  1471. }
  1472. MonoArray* mono_array_new_full_checked(MonoDomain *domain, MonoClass *array_class, uintptr_t *lengths, intptr_t *lower_bounds, MonoError *error)
  1473. {
  1474. return (MonoArray*)il2cpp::vm::Array::NewFull((Il2CppClass*)array_class, (il2cpp_array_size_t*)lengths, (il2cpp_array_size_t*)lower_bounds);
  1475. }
  1476. int32_t mono_gc_is_finalizer_internal_thread(MonoInternalThread *thread)
  1477. {
  1478. return il2cpp::gc::GarbageCollector::IsFinalizerInternalThread((Il2CppInternalThread*)thread);
  1479. }
  1480. char* mono_debugger_state_str()
  1481. {
  1482. return NULL;
  1483. }
  1484. MonoType* mono_get_void_type()
  1485. {
  1486. return (MonoType*)il2cpp::vm::Class::GetType(il2cpp_defaults.void_class);
  1487. }
  1488. MonoType* mono_get_object_type()
  1489. {
  1490. return (MonoType*)il2cpp::vm::Class::GetType(il2cpp_defaults.object_class);
  1491. }
  1492. MonoCustomAttrInfo* mono_custom_attrs_from_assembly_checked(MonoAssembly *assembly, int32_t ignore_missing, MonoError *error)
  1493. {
  1494. return (MonoCustomAttrInfo*)il2cpp::vm::MetadataCache::GetCustomAttributeTypeToken(((Il2CppAssembly*)assembly)->image, ((Il2CppAssembly*)assembly)->token);
  1495. }
  1496. MonoCustomAttrInfo* mono_custom_attrs_from_class_checked(MonoClass *klass, MonoError *error)
  1497. {
  1498. return (MonoCustomAttrInfo*)il2cpp::vm::MetadataCache::GetCustomAttributeTypeToken(((Il2CppClass*)klass)->image, ((Il2CppClass*)klass)->token);
  1499. }
  1500. MonoCustomAttrInfo* mono_custom_attrs_from_method_checked(MonoMethod *method, MonoError *error)
  1501. {
  1502. return (MonoCustomAttrInfo*)il2cpp::vm::MetadataCache::GetCustomAttributeTypeToken(((MethodInfo*)method)->klass->image, ((MethodInfo*)method)->token);
  1503. }
  1504. MonoCustomAttrInfo* mono_custom_attrs_from_property_checked(MonoClass *klass, MonoProperty *property, MonoError *error)
  1505. {
  1506. return (MonoCustomAttrInfo*)il2cpp::vm::MetadataCache::GetCustomAttributeTypeToken(((Il2CppClass*)klass)->image, ((PropertyInfo*)property)->token);
  1507. }
  1508. MonoCustomAttrInfo* mono_custom_attrs_from_field_checked(MonoClass *klass, MonoClassField *field, MonoError *error)
  1509. {
  1510. return (MonoCustomAttrInfo*)il2cpp::vm::MetadataCache::GetCustomAttributeTypeToken(((Il2CppClass*)klass)->image, ((FieldInfo*)field)->token);
  1511. }