55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
|
#include "Il2CppCompatibleDef.h"
|
||
|
|
||
|
#include "vm/Runtime.h"
|
||
|
|
||
|
#include "metadata/MetadataModule.h"
|
||
|
#include "interpreter/InterpreterModule.h"
|
||
|
|
||
|
|
||
|
namespace hybridclr
|
||
|
{
|
||
|
Il2CppMethodPointer InitAndGetInterpreterDirectlyCallMethodPointerSlow(MethodInfo* method)
|
||
|
{
|
||
|
IL2CPP_ASSERT(!method->initInterpCallMethodPointer);
|
||
|
method->initInterpCallMethodPointer = true;
|
||
|
bool isAdjustorThunkMethod = IS_CLASS_VALUE_TYPE(method->klass) && hybridclr::metadata::IsInstanceMethod(method);
|
||
|
if (hybridclr::metadata::MetadataModule::IsImplementedByInterpreter(method))
|
||
|
{
|
||
|
method->methodPointerCallByInterp = interpreter::InterpreterModule::GetMethodPointer(method);
|
||
|
if (isAdjustorThunkMethod)
|
||
|
{
|
||
|
method->virtualMethodPointerCallByInterp = interpreter::InterpreterModule::GetAdjustThunkMethodPointer(method);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
method->virtualMethodPointerCallByInterp = method->methodPointerCallByInterp;
|
||
|
}
|
||
|
if (method->invoker_method == nullptr
|
||
|
#if HYBRIDCLR_UNITY_2021_OR_NEW
|
||
|
|| method->invoker_method == il2cpp::vm::Runtime::GetMissingMethodInvoker()
|
||
|
|| method->has_full_generic_sharing_signature
|
||
|
#endif
|
||
|
)
|
||
|
{
|
||
|
method->invoker_method = hybridclr::interpreter::InterpreterModule::GetMethodInvoker(method);
|
||
|
}
|
||
|
#if HYBRIDCLR_UNITY_2021_OR_NEW
|
||
|
if (method->methodPointer == nullptr || method->has_full_generic_sharing_signature)
|
||
|
{
|
||
|
method->methodPointer = method->methodPointerCallByInterp;
|
||
|
}
|
||
|
if (method->virtualMethodPointer == nullptr || method->has_full_generic_sharing_signature)
|
||
|
{
|
||
|
method->virtualMethodPointer = method->virtualMethodPointerCallByInterp;
|
||
|
}
|
||
|
#else
|
||
|
if (method->methodPointer == nullptr)
|
||
|
{
|
||
|
method->methodPointer = method->virtualMethodPointerCallByInterp;
|
||
|
}
|
||
|
#endif
|
||
|
method->isInterpterImpl = true;
|
||
|
}
|
||
|
return method->methodPointerCallByInterp;
|
||
|
}
|
||
|
}
|