No Description
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.

Enum.cpp 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "vm/Enum.h"
  2. #include "il2cpp-object-internals.h"
  3. #include "il2cpp-class-internals.h"
  4. #include "gc/WriteBarrier.h"
  5. #include "vm/Array.h"
  6. #include "vm/Class.h"
  7. #include "vm/Reflection.h"
  8. #include "vm/GenericClass.h"
  9. #include "vm/Field.h"
  10. #include "vm/String.h"
  11. #include "vm/Type.h"
  12. #include "utils/MemoryRead.h"
  13. namespace il2cpp
  14. {
  15. namespace vm
  16. {
  17. static uint64_t GetEnumFieldValue(Il2CppClass* enumType, FieldInfo* field)
  18. {
  19. const Il2CppType* type = NULL;
  20. const char* ptr = Class::GetFieldDefaultValue(field, &type);
  21. switch (Class::GetEnumBaseType(enumType)->type)
  22. {
  23. case IL2CPP_TYPE_I1: // Sign extend
  24. return static_cast<int64_t>(static_cast<int8_t>(*ptr));
  25. case IL2CPP_TYPE_U1:
  26. return (uint8_t)*ptr;
  27. case IL2CPP_TYPE_CHAR:
  28. return utils::ReadChar(ptr);
  29. case IL2CPP_TYPE_I2: // Sign extend
  30. return static_cast<int64_t>(static_cast<int16_t>(utils::Read16(ptr)));
  31. case IL2CPP_TYPE_U2:
  32. return utils::Read16(ptr);
  33. case IL2CPP_TYPE_I4: // Sign extend
  34. return static_cast<int64_t>(static_cast<int32_t>(utils::ReadCompressedInt32(&ptr)));
  35. case IL2CPP_TYPE_U4:
  36. return utils::ReadCompressedUInt32(&ptr);
  37. case IL2CPP_TYPE_U8:
  38. case IL2CPP_TYPE_I8:
  39. case IL2CPP_TYPE_U:
  40. case IL2CPP_TYPE_I:
  41. return utils::Read64(ptr);
  42. default:
  43. IL2CPP_ASSERT(0);
  44. return 0;
  45. }
  46. }
  47. bool Enum::GetEnumValuesAndNames(Il2CppClass* enumType, Il2CppArray** values, Il2CppArray** names)
  48. {
  49. size_t nvalues = Class::GetNumFields(enumType) ? Class::GetNumFields(enumType) - 1 : 0;
  50. bool sorted = true;
  51. gc::WriteBarrier::GenericStore(values, vm::Array::New(il2cpp_defaults.uint64_class, (il2cpp_array_size_t)nvalues));
  52. uint64_t field_value, previous_value = 0;
  53. gc::WriteBarrier::GenericStore(names, vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)nvalues));
  54. if (enumType->generic_class)
  55. enumType = GenericClass::GetTypeDefinition(enumType->generic_class);
  56. FieldInfo* field;
  57. void* iter = NULL;
  58. int j = 0;
  59. while ((field = Class::GetFields(enumType, &iter)))
  60. {
  61. if (strcmp("value__", field->name) == 0)
  62. continue;
  63. if (Field::IsDeleted(field))
  64. continue;
  65. il2cpp_array_setref(*names, j, il2cpp::vm::String::New(Field::GetName(field)));
  66. field_value = GetEnumFieldValue(enumType, field);
  67. il2cpp_array_set(*values, uint64_t, j, field_value);
  68. if (previous_value > field_value)
  69. sorted = false;
  70. previous_value = field_value;
  71. j++;
  72. }
  73. return sorted;
  74. }
  75. } /* namespace vm */
  76. } /* namespace il2cpp */