ZK_Framework/HybridCLRData/LocalIl2CppData-WindowsEditor/il2cpp/libil2cpp/hybridclr/Il2CppCompatibleDef.h

287 lines
8.7 KiB
C++

#pragma once
#include "il2cpp-config.h"
#include "codegen/il2cpp-codegen-metadata.h"
#include "il2cpp-class-internals.h"
#include "vm/Array.h"
#include "vm/Type.h"
#include "vm/Runtime.h"
#include "vm/GlobalMetadataFileInternals.h"
#include "icalls/mscorlib/System/Type.h"
#include "gc/GarbageCollector.h"
#if HYBRIDCLR_UNITY_2020
#include "icalls/mscorlib/System/MonoType.h"
#elif HYBRIDCLR_UNITY_2021_OR_NEW
#include "icalls/mscorlib/System/RuntimeType.h"
#include "icalls/mscorlib/System/RuntimeTypeHandle.h"
#elif HYBRIDCLR_UNITY_2019
#include "icalls/mscorlib/System/MonoType.h"
#if IL2CPP_SIZEOF_VOID_P == 8
#define PLATFORM_ARCH_64 1
#else
#define PLATFORM_ARCH_64 0
#endif
#elif !defined(HYBRIDCLR_UNITY_VERSION)
#error "please run 'HybridCLR/Generate/All' before building"
#else
#error "unsupported unity version"
#endif
#if IL2CPP_BYTE_ORDER != IL2CPP_LITTLE_ENDIAN
#error "only support litten endian"
#endif
#if PLATFORM_ARCH_64
#define HYBRIDCLR_ARCH_64 1
#else
#define HYBRIDCLR_ARCH_64 0
#endif
#define PTR_SIZE IL2CPP_SIZEOF_VOID_P
#if HYBRIDCLR_ARCH_64 || HYBRIDCLR_TARGET_X86
#define SUPPORT_MEMORY_NOT_ALIGMENT_ACCESS 1
#else
#define SUPPORT_MEMORY_NOT_ALIGMENT_ACCESS 0
#endif
#ifndef ENABLE_PLACEHOLDER_DLL
#define ENABLE_PLACEHOLDER_DLL 1
#endif
#if IL2CPP_ENABLE_WRITE_BARRIERS
#define HYBRIDCLR_ENABLE_WRITE_BARRIERS 1
#else
#define HYBRIDCLR_ENABLE_WRITE_BARRIERS 0
#endif
#if UNITY_ENGINE_TUANJIE
#define HYBRIDCLR_MALLOC(size) IL2CPP_MALLOC(size, IL2CPP_MEM_META_POOL)
#define HYBRIDCLR_MALLOC_ALIGNED(size, alignment) IL2CPP_MALLOC_ALIGNED(size, alignment, IL2CPP_MEM_META_POOL)
#define HYBRIDCLR_MALLOC_ZERO(size) IL2CPP_MALLOC_ZERO(size, IL2CPP_MEM_META_POOL)
#define HYBRIDCLR_CALLOC(count, size) IL2CPP_CALLOC(count, size, IL2CPP_MEM_META_POOL)
#define HYBRIDCLR_FREE(ptr) IL2CPP_FREE(ptr, IL2CPP_MEM_META_POOL)
#define HYBRIDCLR_FREE_ALIGNED(ptr) IL2CPP_FREE_ALIGNED(ptr, IL2CPP_MEM_META_POOL)
#define HYBRIDCLR_METADATA_MALLOC(size) il2cpp::vm::MetadataMalloc(size, IL2CPP_MSTAT_TYPE)
#define HYBRIDCLR_METADATA_CALLOC(count, size) il2cpp::vm::MetadataCalloc(count, size, IL2CPP_MSTAT_TYPE)
#else
#define HYBRIDCLR_MALLOC(size) IL2CPP_MALLOC(size)
#define HYBRIDCLR_MALLOC_ALIGNED(size, alignment) IL2CPP_MALLOC_ALIGNED(size, alignment)
#define HYBRIDCLR_MALLOC_ZERO(size) IL2CPP_MALLOC_ZERO(size)
#define HYBRIDCLR_CALLOC(count, size) IL2CPP_CALLOC(count, size)
#define HYBRIDCLR_FREE(ptr) IL2CPP_FREE(ptr)
#define HYBRIDCLR_FREE_ALIGNED(ptr) IL2CPP_FREE_ALIGNED(ptr)
#define HYBRIDCLR_METADATA_MALLOC(size) il2cpp::vm::MetadataMalloc(size)
#define HYBRIDCLR_METADATA_CALLOC(count, size) il2cpp::vm::MetadataCalloc(count, size)
#endif
namespace hybridclr
{
extern const char* g_placeHolderAssemblies[];
Il2CppMethodPointer InitAndGetInterpreterDirectlyCallMethodPointerSlow(MethodInfo* method);
inline Il2CppMethodPointer InitAndGetInterpreterDirectlyCallMethodPointer(const MethodInfo* method)
{
Il2CppMethodPointer methodPointer = method->methodPointerCallByInterp;
if (methodPointer)
{
return methodPointer;
}
if (method->initInterpCallMethodPointer)
{
return methodPointer;
}
return InitAndGetInterpreterDirectlyCallMethodPointerSlow(const_cast<MethodInfo*>(method));
}
inline Il2CppMethodPointer InitAndGetInterpreterDirectlyCallVirtualMethodPointer(const MethodInfo* method)
{
Il2CppMethodPointer methodPointer = method->virtualMethodPointerCallByInterp;
if (methodPointer)
{
return methodPointer;
}
if (method->initInterpCallMethodPointer)
{
return methodPointer;
}
InitAndGetInterpreterDirectlyCallMethodPointerSlow(const_cast<MethodInfo*>(method));
return method->virtualMethodPointerCallByInterp;
}
inline void HYBRIDCLR_SET_WRITE_BARRIER(void** ptr)
{
#if HYBRIDCLR_ENABLE_WRITE_BARRIERS
il2cpp::gc::GarbageCollector::SetWriteBarrier(ptr);
#endif
}
inline void HYBRIDCLR_SET_WRITE_BARRIER(void** ptr, size_t size)
{
#if HYBRIDCLR_ENABLE_WRITE_BARRIERS
il2cpp::gc::GarbageCollector::SetWriteBarrier(ptr, size);
#endif
}
}
#if HYBRIDCLR_UNITY_2019 || HYBRIDCLR_UNITY_2020
inline bool IS_CLASS_VALUE_TYPE(const Il2CppClass* klass)
{
return klass->valuetype;
}
inline bool IS_CCTOR_FINISH_OR_NO_CCTOR(const Il2CppClass* klass)
{
return (klass->cctor_finished) || !(klass->has_cctor);
}
inline const Il2CppType* GET_METHOD_PARAMETER_TYPE(const ParameterInfo& param)
{
return param.parameter_type;
}
inline uint32_t GET_CUSTOM_ATTRIBUTE_TYPE_RANGE_START(const Il2CppCustomAttributeTypeRange& tr)
{
return tr.start;
}
inline void SET_IL2CPPTYPE_VALUE_TYPE(Il2CppType& type, bool v)
{
}
inline void COPY_IL2CPPTYPE_VALUE_TYPE_FLAG(Il2CppType& dst, const Il2CppType& src)
{
}
#define GET_ARRAY_ELEMENT_ADDRESS load_array_elema
#define VALUE_TYPE_METHOD_POINTER_IS_ADJUST_METHOD 1
namespace hybridclr
{
inline Il2CppReflectionType* GetReflectionTypeFromName(Il2CppString* name)
{
return il2cpp::icalls::mscorlib::System::Type::internal_from_name(name, true, false);
}
inline void ConstructDelegate(Il2CppDelegate* delegate, Il2CppObject* target, const MethodInfo* method)
{
delegate->method_ptr = InitAndGetInterpreterDirectlyCallVirtualMethodPointer(method);
delegate->method = method;
delegate->target = target;
//il2cpp::vm::Type::ConstructDelegate(delegate, target, InitAndGetInterpreterDirectlyCallMethodPointer(method), method);
}
inline const MethodInfo* GetGenericVirtualMethod(const MethodInfo* result, const MethodInfo* inflateMethod)
{
return il2cpp::vm::Runtime::GetGenericVirtualMethod(result, inflateMethod);
}
inline void* GetNulllableDataOffset(void* nullableObj, Il2CppClass* nullableClass)
{
uint32_t field_offset = nullableClass->fields[0].offset - sizeof(Il2CppObject); // offset of value field
return (uint8_t*)nullableObj + field_offset;
}
inline uint8_t* GetNulllableHasValueOffset(void* nullableObj, Il2CppClass* nullableClass)
{
uint32_t field_offset = nullableClass->fields[1].offset - sizeof(Il2CppObject); // offset of has_value field
return (uint8_t*)nullableObj + field_offset;
}
inline Il2CppString* GetKlassFullName(const Il2CppType* type)
{
Il2CppReflectionType* refType = il2cpp::icalls::mscorlib::System::Type::internal_from_handle((intptr_t)type);
return il2cpp::icalls::mscorlib::System::MonoType::getFullName(refType, false, false);
}
}
#elif HYBRIDCLR_UNITY_2021_OR_NEW
inline bool IS_CLASS_VALUE_TYPE(const Il2CppClass* klass)
{
return klass->byval_arg.valuetype;
}
inline bool IS_CCTOR_FINISH_OR_NO_CCTOR(const Il2CppClass* klass)
{
return klass->cctor_finished_or_no_cctor;
}
inline const Il2CppType* GET_METHOD_PARAMETER_TYPE(const Il2CppType* param)
{
return param;
}
inline uint32_t GET_CUSTOM_ATTRIBUTE_TYPE_RANGE_START(const Il2CppCustomAttributeTypeRange& tr)
{
return tr.startOffset;
}
inline void SET_IL2CPPTYPE_VALUE_TYPE(Il2CppType& type, bool v)
{
type.valuetype = v;
}
inline void COPY_IL2CPPTYPE_VALUE_TYPE_FLAG(Il2CppType& dst, const Il2CppType& src)
{
dst.valuetype = src.valuetype;
}
#define GET_ARRAY_ELEMENT_ADDRESS il2cpp_array_addr_with_size
#define VALUE_TYPE_METHOD_POINTER_IS_ADJUST_METHOD 0
namespace hybridclr
{
inline Il2CppReflectionType* GetReflectionTypeFromName(Il2CppString* name)
{
return il2cpp::icalls::mscorlib::System::RuntimeTypeHandle::internal_from_name(name, nullptr, nullptr, true, false, false);
}
inline void ConstructDelegate(Il2CppDelegate* delegate, Il2CppObject* target, const MethodInfo* method)
{
delegate->target = target;
delegate->method = method;
delegate->invoke_impl = InitAndGetInterpreterDirectlyCallVirtualMethodPointer(method);
delegate->invoke_impl_this = target;
}
inline const MethodInfo* GetGenericVirtualMethod(const MethodInfo* result, const MethodInfo* inflateMethod)
{
#if HYBRIDCLR_UNITY_2021
VirtualInvokeData vid;
il2cpp::vm::Runtime::GetGenericVirtualMethod(result, inflateMethod, &vid);
return vid.method;
#else
return il2cpp::metadata::GenericMethod::GetGenericVirtualMethod(result, inflateMethod);
#endif
}
inline void* GetNulllableDataOffset(void* nullableObj, Il2CppClass* nullableClass)
{
uint32_t field_offset = nullableClass->fields[1].offset - sizeof(Il2CppObject); // offset of value field
return (uint8_t*)nullableObj + field_offset;
}
inline uint8_t* GetNulllableHasValueOffset(void* nullableObj, Il2CppClass* nullableClass)
{
uint32_t field_offset = nullableClass->fields[0].offset - sizeof(Il2CppObject); // offset of has_value field
return (uint8_t*)nullableObj + field_offset;
}
inline Il2CppString* GetKlassFullName(const Il2CppType* type)
{
Il2CppReflectionType* refType = il2cpp::icalls::mscorlib::System::Type::internal_from_handle((intptr_t)type);
return il2cpp::icalls::mscorlib::System::RuntimeType::getFullName((Il2CppReflectionRuntimeType*)refType, false, false);
}
}
#endif