Files
RedHotRoast-ios/HybridCLRData/LocalIl2CppData-OSXEditor/il2cpp/libil2cpp/hybridclr/interpreter/InterpreterDefs.h
T
2026-07-17 14:03:00 +08:00

123 lines
2.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include "../CommonDef.h"
#include "../metadata/MetadataDef.h"
namespace hybridclr
{
namespace interpreter
{
// from obj or arg
enum class LocationDataType : uint8_t
{
I1,
U1,
I2,
U2,
U8,
S_N, // struct size = 3567 > 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, "require 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 MethodInfo* 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
{
bool passbyValWhenInvoke;
LocationDataType type;
uint16_t stackObjectSize;
};
struct InterpMethodInfo
{
byte* codes;
MethodArgDesc* args;
uint64_t* resolveDatas;
const InterpExceptionClause* exClauses;
uint32_t argStackObjectSize;
uint32_t retStackObjectSize : 24;
uint32_t initLocals : 8;
uint32_t localStackSize; // args + locals StackObject size
uint32_t maxStackSize; // args + locals + evalstack size
uint32_t argCount : 8;
uint32_t codeLength : 24;
uint32_t localVarBaseOffset;
uint32_t evalStackBaseOffset;
uint32_t exClauseCount;
};
}
}