using dnlib.DotNet; using HybridCLR.Editor.Meta; using System; using System.Collections.Generic; using System.Reflection; using UnityEngine; namespace HybridCLR.Editor.ABI { public class TypeInfo : IEquatable { public static readonly TypeInfo s_void = new TypeInfo(ParamOrReturnType.VOID); public static readonly TypeInfo s_i1 = new TypeInfo(ParamOrReturnType.I1); public static readonly TypeInfo s_u1 = new TypeInfo(ParamOrReturnType.U1); public static readonly TypeInfo s_i2 = new TypeInfo(ParamOrReturnType.I2); public static readonly TypeInfo s_u2 = new TypeInfo(ParamOrReturnType.U2); public static readonly TypeInfo s_i4 = new TypeInfo(ParamOrReturnType.I4); public static readonly TypeInfo s_u4 = new TypeInfo(ParamOrReturnType.U4); public static readonly TypeInfo s_i8 = new TypeInfo(ParamOrReturnType.I8); public static readonly TypeInfo s_u8 = new TypeInfo(ParamOrReturnType.U8); public static readonly TypeInfo s_r4 = new TypeInfo(ParamOrReturnType.R4); public static readonly TypeInfo s_r8 = new TypeInfo(ParamOrReturnType.R8); public static readonly TypeInfo s_i = new TypeInfo(ParamOrReturnType.I); public static readonly TypeInfo s_u = new TypeInfo(ParamOrReturnType.U); public static readonly TypeInfo s_typedByRef = new TypeInfo(ParamOrReturnType.TYPEDBYREF); public const string strTypedByRef = "typedbyref"; public TypeInfo(ParamOrReturnType portype, TypeSig klass = null, int typeId = 0) { PorType = portype; Klass = klass; _typeId = typeId; } public ParamOrReturnType PorType { get; } public TypeSig Klass { get; } public bool IsStruct => PorType == ParamOrReturnType.STRUCT; public bool IsPrimitiveType => PorType <= ParamOrReturnType.U; private readonly int _typeId; public int TypeId => _typeId; public bool Equals(TypeInfo other) { return PorType == other.PorType && TypeEqualityComparer.Instance.Equals(Klass, other.Klass); } public override bool Equals(object obj) { return Equals((TypeInfo)obj); } public override int GetHashCode() { return (int)PorType * 23 + (Klass != null ? TypeEqualityComparer.Instance.GetHashCode(Klass) : 0); } public bool NeedExpandValue() { return PorType >= ParamOrReturnType.I1 && PorType <= ParamOrReturnType.U2; } public string CreateSigName() { switch (PorType) { case ParamOrReturnType.VOID: return "v"; case ParamOrReturnType.I1: return "i1"; case ParamOrReturnType.U1: return "u1"; case ParamOrReturnType.I2: return "i2"; case ParamOrReturnType.U2: return "u2"; case ParamOrReturnType.I4: return "i4"; case ParamOrReturnType.U4: return "u4"; case ParamOrReturnType.I8: return "i8"; case ParamOrReturnType.U8: return "u8"; case ParamOrReturnType.R4: return "r4"; case ParamOrReturnType.R8: return "r8"; case ParamOrReturnType.I: return "i"; case ParamOrReturnType.U: return "u"; case ParamOrReturnType.TYPEDBYREF: return strTypedByRef; case ParamOrReturnType.STRUCT: return $"s{_typeId}"; default: throw new NotSupportedException(PorType.ToString()); }; } public string GetTypeName() { switch (PorType) { case ParamOrReturnType.VOID: return "void"; case ParamOrReturnType.I1: return "int8_t"; case ParamOrReturnType.U1: return "uint8_t"; case ParamOrReturnType.I2: return "int16_t"; case ParamOrReturnType.U2: return "uint16_t"; case ParamOrReturnType.I4: return "int32_t"; case ParamOrReturnType.U4: return "uint32_t"; case ParamOrReturnType.I8: return "int64_t"; case ParamOrReturnType.U8: return "uint64_t"; case ParamOrReturnType.R4: return "float"; case ParamOrReturnType.R8: return "double"; case ParamOrReturnType.I: return "intptr_t"; case ParamOrReturnType.U: return "uintptr_t"; case ParamOrReturnType.TYPEDBYREF: return "Il2CppTypedRef"; case ParamOrReturnType.STRUCT: return $"__struct_{_typeId}__"; default: throw new NotImplementedException(PorType.ToString()); }; } } }