#pragma once #include "../CommonDef.h" #include "../metadata/MetadataDef.h" namespace hybridclr { namespace interpreter { // from obj or arg enum class LocationDataType { I1, U1, I2, U2, U8, S_N, // struct size = 3,5,6,7, > 8, size is described by stackObjectSize }; union StackObject { uint64_t __u64; void* ptr; // can't adjust position. will raise native_invoke init args bugs. bool b; int8_t i8; uint8_t u8; int16_t i16; uint16_t u16; int32_t i32; uint32_t u32; int64_t i64; uint64_t u64; float f4; double f8; Il2CppObject* obj; Il2CppString* str; Il2CppObject** ptrObj; }; static_assert(sizeof(StackObject) == 8, "requrie 8 bytes"); enum class ExceptionFlowType { Exception, Catch, Leave, }; struct InterpMethodInfo; struct ExceptionFlowInfo { ExceptionFlowType exFlowType; int32_t throwOffset; Il2CppException* ex; int32_t nextExClauseIndex; int32_t leaveTarget; }; struct InterpFrame { const InterpMethodInfo* method; StackObject* stackBasePtr; int32_t oldStackTop; void* ret; byte* ip; ExceptionFlowInfo* exFlowBase; int32_t exFlowCount; int32_t exFlowCapaticy; int32_t oldLocalPoolBottomIdx; ExceptionFlowInfo* GetCurExFlow() const { return exFlowCount > 0 ? exFlowBase + exFlowCount - 1 : nullptr; } ExceptionFlowInfo* GetPrevExFlow() const { return exFlowCount > 1 ? exFlowBase + exFlowCount - 2 : nullptr; } }; struct InterpExceptionClause { metadata::CorILExceptionClauseType flags; int32_t tryBeginOffset; int32_t tryEndOffset; int32_t handlerBeginOffset; int32_t handlerEndOffset; int32_t filterBeginOffset; Il2CppClass* exKlass; }; struct MethodArgDesc { LocationDataType type; uint32_t stackObjectSize; bool passbyValWhenInvoke; }; struct InterpMethodInfo { const MethodInfo* method; MethodArgDesc* args; uint32_t argCount; uint32_t argStackObjectSize; byte* codes; uint32_t codeLength; uint32_t maxStackSize; // args + locals + evalstack size uint32_t localVarBaseOffset; uint32_t evalStackBaseOffset; uint32_t localStackSize; // args + locals StackObject size std::vector<uint64_t> resolveDatas; std::vector<InterpExceptionClause*> exClauses; bool initLocals; }; } }