#include "Engine.h" #include "codegen/il2cpp-codegen.h" #include "Interpreter.h" #include "MemoryUtil.h" namespace hybridclr { namespace interpreter { InterpFrame* InterpFrameGroup::EnterFrameFromInterpreter(const InterpMethodInfo* imi, StackObject* argBase) { #if IL2CPP_ENABLE_PROFILER il2cpp_codegen_profiler_method_enter(imi->method); #endif int32_t oldStackTop = _machineState.GetStackTop(); StackObject* stackBasePtr = _machineState.AllocStackSlot(imi->maxStackSize - imi->argStackObjectSize); InterpFrame* newFrame = _machineState.PushFrame(); *newFrame = { imi, argBase, oldStackTop, nullptr, nullptr, nullptr, 0, 0, _machineState.GetLocalPoolBottomIdx() }; PUSH_STACK_FRAME(imi->method); return newFrame; } InterpFrame* InterpFrameGroup::EnterFrameFromNative(const InterpMethodInfo* imi, StackObject* argBase) { #if IL2CPP_ENABLE_PROFILER il2cpp_codegen_profiler_method_enter(imi->method); #endif int32_t oldStackTop = _machineState.GetStackTop(); StackObject* stackBasePtr = _machineState.AllocStackSlot(imi->maxStackSize); InterpFrame* newFrame = _machineState.PushFrame(); *newFrame = { imi, stackBasePtr, oldStackTop, nullptr, nullptr, nullptr, 0, 0, _machineState.GetLocalPoolBottomIdx() }; // if not prepare arg stack. copy from args if (imi->args) { IL2CPP_ASSERT(imi->argCount == metadata::GetActualArgumentNum(imi->method)); CopyStackObject(stackBasePtr, argBase, imi->argStackObjectSize); } PUSH_STACK_FRAME(imi->method); return newFrame; } InterpFrame* InterpFrameGroup::LeaveFrame() { IL2CPP_ASSERT(_machineState.GetFrameTopIdx() > _frameBaseIdx); POP_STACK_FRAME(); InterpFrame* frame = _machineState.GetTopFrame(); #if IL2CPP_ENABLE_PROFILER il2cpp_codegen_profiler_method_exit(frame->method->method); #endif if (frame->exFlowBase) { _machineState.SetExceptionFlowTop(frame->exFlowBase); } _machineState.PopFrame(); _machineState.SetStackTop(frame->oldStackTop); _machineState.SetLocalPoolBottomIdx(frame->oldLocalPoolBottomIdx); return _machineState.GetFrameTopIdx() > _frameBaseIdx ? _machineState.GetTopFrame() : nullptr; } } }