InterpreterUtil.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "InterpreterUtil.h"
  2. #include "vm/Object.h"
  3. #include "../metadata/MetadataUtil.h"
  4. namespace hybridclr
  5. {
  6. namespace interpreter
  7. {
  8. TypeDesc GetValueTypeArgDescBySize(uint32_t size)
  9. {
  10. if (size <= 8)
  11. {
  12. return { LocationDataType::U8, 1 };
  13. }
  14. return { LocationDataType::S_N, (uint32_t)metadata::GetStackSizeByByteSize(size) };
  15. }
  16. TypeDesc GetTypeArgDesc(const Il2CppType* type)
  17. {
  18. if (type->byref)
  19. {
  20. return { LocationDataType::U8, 1 };
  21. }
  22. switch (type->type)
  23. {
  24. case IL2CPP_TYPE_BOOLEAN:
  25. case IL2CPP_TYPE_U1:
  26. return{ LocationDataType::U1, 1 };
  27. case IL2CPP_TYPE_I1:
  28. return{ LocationDataType::I1, 1 };
  29. case IL2CPP_TYPE_I2:
  30. return{ LocationDataType::I2, 1 };
  31. case IL2CPP_TYPE_CHAR:
  32. case IL2CPP_TYPE_U2:
  33. return{ LocationDataType::U2, 1 };
  34. case IL2CPP_TYPE_I4:
  35. case IL2CPP_TYPE_U4:
  36. case IL2CPP_TYPE_R4:
  37. case IL2CPP_TYPE_I8:
  38. case IL2CPP_TYPE_U8:
  39. case IL2CPP_TYPE_R8:
  40. case IL2CPP_TYPE_I:
  41. case IL2CPP_TYPE_U:
  42. case IL2CPP_TYPE_FNPTR:
  43. case IL2CPP_TYPE_PTR:
  44. case IL2CPP_TYPE_BYREF:
  45. case IL2CPP_TYPE_STRING:
  46. case IL2CPP_TYPE_ARRAY:
  47. case IL2CPP_TYPE_SZARRAY:
  48. case IL2CPP_TYPE_OBJECT:
  49. case IL2CPP_TYPE_CLASS:
  50. return{ LocationDataType::U8, 1 };
  51. case IL2CPP_TYPE_TYPEDBYREF:
  52. return GetValueTypeArgDescBySize(sizeof(Il2CppTypedRef));
  53. case IL2CPP_TYPE_VALUETYPE:
  54. {
  55. Il2CppClass* klass = il2cpp::vm::Class::FromIl2CppType(type);
  56. IL2CPP_ASSERT(IS_CLASS_VALUE_TYPE(klass));
  57. if (klass->enumtype)
  58. {
  59. return GetTypeArgDesc(&klass->castClass->byval_arg);
  60. }
  61. return GetValueTypeArgDescBySize(il2cpp::vm::Class::GetValueSize(klass, nullptr));
  62. }
  63. case IL2CPP_TYPE_GENERICINST:
  64. {
  65. Il2CppGenericClass* genericClass = type->data.generic_class;
  66. if (genericClass->type->type == IL2CPP_TYPE_CLASS)
  67. {
  68. IL2CPP_ASSERT(!IS_CLASS_VALUE_TYPE(il2cpp::vm::Class::FromIl2CppType(type)));
  69. return{ LocationDataType::U8, 1 };
  70. }
  71. else
  72. {
  73. Il2CppClass* klass = il2cpp::vm::Class::FromIl2CppType(type);
  74. IL2CPP_ASSERT(IS_CLASS_VALUE_TYPE(klass));
  75. if (klass->enumtype)
  76. {
  77. return GetTypeArgDesc(&klass->castClass->byval_arg);
  78. }
  79. return GetValueTypeArgDescBySize(il2cpp::vm::Class::GetValueSize(klass, nullptr));
  80. }
  81. }
  82. default:
  83. {
  84. RaiseExecutionEngineException("not support arg type");
  85. return{ LocationDataType::U8, 1 };
  86. }
  87. }
  88. }
  89. Il2CppObject* TranslateNativeValueToBoxValue(const Il2CppType* type, void* value)
  90. {
  91. if (type->byref)
  92. {
  93. RaiseExecutionEngineException("TranslateNativeValueToBoxValue can't box ref");
  94. return nullptr;
  95. }
  96. Il2CppClass* klass = il2cpp::vm::Class::FromIl2CppType(type);
  97. return il2cpp::vm::Object::Box(klass, value);
  98. }
  99. }
  100. }