AOTHomologousImage.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "AOTHomologousImage.h"
  2. #include "vm/MetadataLock.h"
  3. #include "vm/GlobalMetadata.h"
  4. #include "vm/Class.h"
  5. #include "vm/Image.h"
  6. #include "vm/Exception.h"
  7. #include "vm/MetadataCache.h"
  8. #include "metadata/GenericMetadata.h"
  9. namespace hybridclr
  10. {
  11. namespace metadata
  12. {
  13. std::vector<AOTHomologousImage*> s_images;
  14. AOTHomologousImage* AOTHomologousImage::FindImageByAssembly(const Il2CppAssembly* ass)
  15. {
  16. il2cpp::os::FastAutoLock lock(&il2cpp::vm::g_MetadataLock);
  17. return FindImageByAssemblyLocked(ass, lock);
  18. }
  19. void AOTHomologousImage::RegisterLocked(AOTHomologousImage* image, il2cpp::os::FastAutoLock& lock)
  20. {
  21. IL2CPP_ASSERT(FindImageByAssemblyLocked(image->_aotAssembly, lock) == nullptr);
  22. s_images.push_back(image);
  23. }
  24. AOTHomologousImage* AOTHomologousImage::FindImageByAssemblyLocked(const Il2CppAssembly* ass, il2cpp::os::FastAutoLock& lock)
  25. {
  26. for (AOTHomologousImage* image : s_images)
  27. {
  28. if (image->_aotAssembly == ass)
  29. {
  30. return image;
  31. }
  32. }
  33. return nullptr;
  34. }
  35. LoadImageErrorCode AOTHomologousImage::Load(const byte* imageData, size_t length)
  36. {
  37. _rawImage = new RawImage();
  38. LoadImageErrorCode err = _rawImage->Load(imageData, length);
  39. if (err != LoadImageErrorCode::OK)
  40. {
  41. return err;
  42. }
  43. TbAssembly data = _rawImage->ReadAssembly(1);
  44. const char* assName = _rawImage->GetStringFromRawIndex(data.name);
  45. const Il2CppAssembly* aotAss = GetLoadedAssembly(assName);
  46. // FIXME. not free memory.
  47. if (!aotAss)
  48. {
  49. return LoadImageErrorCode::AOT_ASSEMBLY_NOT_FIND;
  50. }
  51. if (hybridclr::metadata::IsInterpreterImage(aotAss->image))
  52. {
  53. return LoadImageErrorCode::HOMOLOGOUS_ONLY_SUPPORT_AOT_ASSEMBLY;
  54. }
  55. _aotAssembly = aotAss;
  56. return LoadImageErrorCode::OK;
  57. }
  58. const Il2CppType* AOTHomologousImage::GetModuleIl2CppType(uint32_t moduleRowIndex, uint32_t typeNamespace, uint32_t typeName, bool raiseExceptionIfNotFound)
  59. {
  60. IL2CPP_ASSERT(moduleRowIndex == 1);
  61. const char* typeNameStr = _rawImage->GetStringFromRawIndex(typeName);
  62. const char* typeNamespaceStr = _rawImage->GetStringFromRawIndex(typeNamespace);
  63. const Il2CppImage* aotImage = il2cpp::vm::Assembly::GetImage(_aotAssembly);
  64. Il2CppClass* klass = il2cpp::vm::Class::FromName(aotImage, typeNamespaceStr, typeNameStr);
  65. if (klass)
  66. {
  67. return &klass->byval_arg;
  68. }
  69. if (!raiseExceptionIfNotFound)
  70. {
  71. return nullptr;
  72. }
  73. il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetTypeLoadException(
  74. CStringToStringView(typeNamespaceStr),
  75. CStringToStringView(typeNameStr),
  76. CStringToStringView(aotImage->nameNoExt)));
  77. return nullptr;
  78. }
  79. }
  80. }