Transform.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "Transform.h"
  2. #include <unordered_set>
  3. #include "TransformContext.h"
  4. #include "../metadata/MethodBodyCache.h"
  5. namespace hybridclr
  6. {
  7. namespace transform
  8. {
  9. InterpMethodInfo* HiTransform::Transform(const MethodInfo* methodInfo)
  10. {
  11. TemporaryMemoryArena pool;
  12. metadata::Image* image = metadata::MetadataModule::GetUnderlyingInterpreterImage(methodInfo);
  13. IL2CPP_ASSERT(image);
  14. metadata::MethodBodyCache::EnableShrinkMethodBodyCache(false);
  15. metadata::MethodBody* methodBody = metadata::MethodBodyCache::GetMethodBody(image, methodInfo->token);
  16. if (methodBody == nullptr || methodBody->ilcodes == nullptr)
  17. {
  18. TEMP_FORMAT(errMsg, "Method body is null. %s.%s::%s", methodInfo->klass->namespaze, methodInfo->klass->name, methodInfo->name);
  19. il2cpp::vm::Exception::Raise(il2cpp::vm::Exception::GetExecutionEngineException(errMsg));
  20. }
  21. InterpMethodInfo* result = new (HYBRIDCLR_METADATA_MALLOC(sizeof(InterpMethodInfo))) InterpMethodInfo;
  22. il2cpp::utils::dynamic_array<uint64_t> resolveDatas;
  23. TransformContext ctx(image, methodInfo, *methodBody, pool, resolveDatas);
  24. ctx.TransformBody(0, 0, *result);
  25. metadata::MethodBodyCache::EnableShrinkMethodBodyCache(true);
  26. return result;
  27. }
  28. }
  29. }