internal static int GetSize(BaseDesktopHeapType type, ClrElementType cet) { // todo: What if we have a struct which is not fully constructed (null MT, // null type) and need to get the size of the field? switch (cet) { case ClrElementType.Struct: if (type == null) { return(1); } return(type.BaseSize); case ClrElementType.Int8: case ClrElementType.UInt8: case ClrElementType.Boolean: return(1); case ClrElementType.Float: case ClrElementType.Int32: case ClrElementType.UInt32: return(4); case ClrElementType.Double: // double case ClrElementType.Int64: case ClrElementType.UInt64: return(8); case ClrElementType.String: case ClrElementType.Class: case ClrElementType.Array: case ClrElementType.SZArray: case ClrElementType.Object: case ClrElementType.NativeInt: // native int case ClrElementType.NativeUInt: // native unsigned int case ClrElementType.Pointer: case ClrElementType.FunctionPointer: case ClrElementType.Unknown: case ClrElementType.Var: if (type == null) { return(IntPtr.Size); // todo: fixme } return((int)type.DesktopHeap.PointerSize); case ClrElementType.UInt16: case ClrElementType.Int16: case ClrElementType.Char: // u2 return(2); } throw new Exception("Unexpected element type."); }
public List <ClrInterface> InitInterfaces() { if (DesktopModule == null) { _interfaces = DesktopHeap.EmptyInterfaceList; return(null); } BaseDesktopHeapType baseType = BaseType as BaseDesktopHeapType; List <ClrInterface> interfaces = baseType != null ? new List <ClrInterface>(baseType.Interfaces) : null; MetaDataImport import = DesktopModule.GetMetadataImport(); if (import == null) { _interfaces = DesktopHeap.EmptyInterfaceList; return(null); } foreach (int token in import.EnumerateInterfaceImpls((int)_token)) { if (import.GetInterfaceImplProps(token, out int mdClass, out int mdIFace)) { if (interfaces == null) { interfaces = new List <ClrInterface>(); } var result = GetInterface(import, mdIFace); if (result != null && !interfaces.Contains(result)) { interfaces.Add(result); } } } if (interfaces == null) { _interfaces = DesktopHeap.EmptyInterfaceList; } else { _interfaces = interfaces.ToArray(); } return(interfaces); }
private static BaseDesktopHeapType GetType(DesktopGCHeap heap, IFieldData data, IntPtr sig, int sigLen, ClrElementType elementType) { BaseDesktopHeapType result = null; ulong mt = data.TypeMethodTable; if (mt != 0) { result = (BaseDesktopHeapType)heap.GetTypeByMethodTable(mt, 0); } if (result == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int etype = 0; if (res = sigParser.GetCallingConvInfo(out int sigType)) { Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); } res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); // Generic instantiation if (etype == 0x15) { res = res && sigParser.GetElemType(out etype); } if (res) { ClrElementType type = (ClrElementType)etype; if (type == ClrElementType.Array) { res = sigParser.PeekElemType(out etype); res = res && sigParser.SkipExactlyOne(); int ranks = 0; res = res && sigParser.GetData(out ranks); if (res) { result = heap.GetArrayType((ClrElementType)etype, ranks, null); } } else if (type == ClrElementType.SZArray) { res = sigParser.PeekElemType(out etype); type = (ClrElementType)etype; if (DesktopRuntimeBase.IsObjectReference(type)) { result = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray); } else { result = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null); } } else if (type == ClrElementType.Pointer) { // Only deal with single pointers for now and types that have already been constructed res = sigParser.GetElemType(out etype); type = (ClrElementType)etype; sigParser.GetToken(out int token); BaseDesktopHeapType innerType = (BaseDesktopHeapType)heap.GetGCHeapTypeFromModuleAndToken(data.Module, Convert.ToUInt32(token)); if (innerType == null) { innerType = (BaseDesktopHeapType)heap.GetBasicType(type); } result = heap.CreatePointerType(innerType, type, null); } else if (type == ClrElementType.Object || type == ClrElementType.Class) { result = (BaseDesktopHeapType)heap.ObjectType; } else { // struct, then try to get the token int token = 0; if (etype == 0x11 || etype == 0x12) { res = res && sigParser.GetToken(out token); } if (token != 0) { result = (BaseDesktopHeapType)heap.GetGCHeapTypeFromModuleAndToken(data.Module, (uint)token); } if (result == null) { if ((result = (BaseDesktopHeapType)heap.GetBasicType((ClrElementType)etype)) == null) { result = heap.ErrorType; } } } } } if (result == null) { result = (BaseDesktopHeapType)heap.GetBasicType(elementType); } } else if (elementType != ClrElementType.Class) { result.ElementType = elementType; } if (result.IsArray && result.ComponentType == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int etype = 0; if (res = sigParser.GetCallingConvInfo(out int sigType)) { Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); } res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); res = res && sigParser.GetElemType(out etype); // Generic instantiation if (etype == 0x15) { res = res && sigParser.GetElemType(out etype); } // If it's a class or struct, then try to get the token int token = 0; if (etype == 0x11 || etype == 0x12) { res = res && sigParser.GetToken(out token); } if (token != 0) { result.ComponentType = heap.GetGCHeapTypeFromModuleAndToken(data.Module, (uint)token); } else if (result.ComponentType == null) { if ((result.ComponentType = heap.GetBasicType((ClrElementType)etype)) == null) { result.ComponentType = heap.ErrorType; } } } } return(result); }
public DesktopStaticField(DesktopGCHeap heap, IFieldData field, BaseDesktopHeapType containingType, string name, FieldAttributes attributes, object defaultValue, IntPtr sig, int sigLen) { _field = field; _name = name; _attributes = attributes; _type = (BaseDesktopHeapType)heap.GetTypeByMethodTable(field.TypeMethodTable, 0); _defaultValue = defaultValue; _heap = heap; _token = field.FieldToken; if (_type != null && ElementType != ClrElementType.Class) { _type.ElementType = ElementType; } _containingType = containingType; if (_type == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int etype = 0; if (res = sigParser.GetCallingConvInfo(out int sigType)) { Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); } res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); if (res) { ClrElementType type = (ClrElementType)etype; if (type == ClrElementType.Array) { res = sigParser.PeekElemType(out etype); res = res && sigParser.SkipExactlyOne(); int ranks = 0; res = res && sigParser.GetData(out ranks); if (res) { _type = heap.GetArrayType((ClrElementType)etype, ranks, null); } } else if (type == ClrElementType.SZArray) { res = sigParser.PeekElemType(out etype); type = (ClrElementType)etype; if (DesktopRuntimeBase.IsObjectReference(type)) { _type = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray); } else { _type = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null); } } else if (type == ClrElementType.Pointer) { // Only deal with single pointers for now and types that have already been constructed res = sigParser.GetElemType(out etype); type = (ClrElementType)etype; sigParser.GetToken(out int token); BaseDesktopHeapType innerType = (BaseDesktopHeapType)heap.GetGCHeapTypeFromModuleAndToken(field.Module, Convert.ToUInt32(token)); if (innerType == null) { innerType = (BaseDesktopHeapType)heap.GetBasicType(type); } _type = heap.CreatePointerType(innerType, type, null); } } } } if (_type == null) { _typeResolver = new Lazy <ClrType>(() => { ClrType type = (BaseDesktopHeapType)TryBuildType(_heap); if (type == null) { type = (BaseDesktopHeapType)heap.GetBasicType(ElementType); } return(type); }); } }
internal static int GetSize(BaseDesktopHeapType type, ClrElementType cet) { // todo: What if we have a struct which is not fully constructed (null MT, // null type) and need to get the size of the field? switch (cet) { case ClrElementType.Struct: if (type == null) return 1; return type.BaseSize; case ClrElementType.Int8: case ClrElementType.UInt8: case ClrElementType.Boolean: return 1; case ClrElementType.Float: case ClrElementType.Int32: case ClrElementType.UInt32: return 4; case ClrElementType.Double: // double case ClrElementType.Int64: case ClrElementType.UInt64: return 8; case ClrElementType.String: case ClrElementType.Class: case ClrElementType.Array: case ClrElementType.SZArray: case ClrElementType.Object: case ClrElementType.NativeInt: // native int case ClrElementType.NativeUInt: // native unsigned int case ClrElementType.Pointer: case ClrElementType.FunctionPointer: if (type == null) return IntPtr.Size; // todo: fixme return (int)type.DesktopHeap.PointerSize; case ClrElementType.UInt16: case ClrElementType.Int16: case ClrElementType.Char: // u2 return 2; } throw new Exception("Unexpected element type."); }
public DesktopStaticField(DesktopGCHeap heap, IFieldData field, BaseDesktopHeapType containingType, string name, FieldAttributes attributes, object defaultValue, IntPtr sig, int sigLen) { _field = field; _name = name; _attributes = attributes; _type = (BaseDesktopHeapType)heap.GetGCHeapType(field.TypeMethodTable, 0); _defaultValue = defaultValue; _heap = heap; if (_type != null && ElementType != ClrElementType.Class) _type.ElementType = ElementType; _containingType = containingType; if (_type == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int sigType, etype = 0; if (res = sigParser.GetCallingConvInfo(out sigType)) Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); if (res) { ClrElementType type = (ClrElementType)etype; if (type == ClrElementType.Array) { res = sigParser.PeekElemType(out etype); res = res && sigParser.SkipExactlyOne(); int ranks = 0; res = res && sigParser.GetData(out ranks); if (res) _type = heap.GetArrayType((ClrElementType)etype, ranks, null); } else if (type == ClrElementType.SZArray) { res = sigParser.PeekElemType(out etype); type = (ClrElementType)etype; if (DesktopRuntimeBase.IsObjectReference(type)) _type = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray); else _type = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null); } else if (type == ClrElementType.Pointer) { // Only deal with single pointers for now and types that have already been constructed res = sigParser.GetElemType(out etype); type = (ClrElementType)etype; int token; sigParser.GetToken(out token); BaseDesktopHeapType innerType = (BaseDesktopHeapType)heap.GetGCHeapTypeFromModuleAndToken(field.Module, Convert.ToUInt32(token)); if (innerType == null) { innerType = (BaseDesktopHeapType)heap.GetBasicType(type); } _type = heap.CreatePointerType(innerType, type, null); } } } if (_type == null) _type = (BaseDesktopHeapType)TryBuildType(_heap); if (_type == null) _type = (BaseDesktopHeapType)heap.GetBasicType(ElementType); } }
public DesktopInstanceField(DesktopGCHeap heap, IFieldData data, string name, FieldAttributes attributes, IntPtr sig, int sigLen) { _name = name; _field = data; _attributes = attributes; ulong mt = data.TypeMethodTable; if (mt != 0) { _type = (BaseDesktopHeapType)heap.GetGCHeapType(mt, 0); } if (_type == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int sigType, etype = 0; if (res = sigParser.GetCallingConvInfo(out sigType)) { Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); } res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); if (res) { ClrElementType type = (ClrElementType)etype; if (type == ClrElementType.Array) { res = sigParser.PeekElemType(out etype); res = res && sigParser.SkipExactlyOne(); int ranks = 0; res = res && sigParser.GetData(out ranks); if (res) { _type = heap.GetArrayType((ClrElementType)etype, ranks, null); } } else if (type == ClrElementType.SZArray) { res = sigParser.PeekElemType(out etype); type = (ClrElementType)etype; if (DesktopRuntimeBase.IsObjectReference(type)) { _type = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray); } else { _type = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null); } } else if (type == ClrElementType.Pointer) { // Only deal with single pointers for now and types that have already been constructed res = sigParser.GetElemType(out etype); type = (ClrElementType)etype; int token; sigParser.GetToken(out token); BaseDesktopHeapType innerType = (BaseDesktopHeapType)heap.GetGCHeapTypeFromModuleAndToken(data.Module, Convert.ToUInt32(token)); if (innerType == null) { innerType = (BaseDesktopHeapType)heap.GetBasicType(type); } _type = heap.CreatePointerType(innerType, type, null); } } } if (_type == null) { _type = (BaseDesktopHeapType)heap.GetBasicType(ElementType); } } else if (ElementType != ClrElementType.Class) { _type.ElementType = ElementType; } }
public DesktopStaticField(DesktopGCHeap heap, IFieldData field, BaseDesktopHeapType containingType, string name, FieldAttributes attributes, object defaultValue, IntPtr sig, int sigLen) { m_field = field; m_name = name; m_attributes = attributes; m_type = (BaseDesktopHeapType)heap.GetGCHeapType(field.TypeMethodTable, 0); m_defaultValue = defaultValue; m_heap = heap; if (m_type != null && ElementType != ClrElementType.Class) { m_type.SetElementType(ElementType); } m_containingType = containingType; if (m_type == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int sigType, etype = 0; if (res = sigParser.GetCallingConvInfo(out sigType)) { Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); } res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); if (res) { ClrElementType type = (ClrElementType)etype; if (type == ClrElementType.Array) { res = sigParser.PeekElemType(out etype); res = res && sigParser.SkipExactlyOne(); int ranks = 0; res = res && sigParser.GetData(out ranks); if (res) { m_type = heap.GetArrayType((ClrElementType)etype, ranks, null); } } else if (type == ClrElementType.SZArray) { res = sigParser.PeekElemType(out etype); type = (ClrElementType)etype; if (DesktopRuntimeBase.IsObjectReference(type)) { m_type = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray); } else { m_type = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null); } } } } if (m_type == null) { m_type = (BaseDesktopHeapType)TryBuildType(m_heap); } if (m_type == null) { m_type = (BaseDesktopHeapType)heap.GetBasicType(ElementType); } } }
public DesktopStaticField(DesktopGCHeap heap, IFieldData field, BaseDesktopHeapType containingType, string name, FieldAttributes attributes, object defaultValue, IntPtr sig, int sigLen) { m_field = field; m_name = name; m_attributes = attributes; m_type = (BaseDesktopHeapType)heap.GetGCHeapType(field.TypeMethodTable, 0); m_defaultValue = defaultValue; m_heap = heap; if (m_type != null && ElementType != ClrElementType.Class) m_type.SetElementType(ElementType); m_containingType = containingType; if (m_type == null) { if (sig != IntPtr.Zero && sigLen > 0) { SigParser sigParser = new SigParser(sig, sigLen); bool res; int sigType, etype = 0; if (res = sigParser.GetCallingConvInfo(out sigType)) Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD); res = res && sigParser.SkipCustomModifiers(); res = res && sigParser.GetElemType(out etype); if (res) { ClrElementType type = (ClrElementType)etype; if (type == ClrElementType.Array) { res = sigParser.PeekElemType(out etype); res = res && sigParser.SkipExactlyOne(); int ranks = 0; res = res && sigParser.GetData(out ranks); if (res) m_type = heap.GetArrayType((ClrElementType)etype, ranks, null); } else if (type == ClrElementType.SZArray) { res = sigParser.PeekElemType(out etype); type = (ClrElementType)etype; if (DesktopRuntimeBase.IsObjectReference(type)) m_type = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray); else m_type = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null); } } } if (m_type == null) m_type = (BaseDesktopHeapType)TryBuildType(m_heap); if (m_type == null) m_type = (BaseDesktopHeapType)heap.GetBasicType(ElementType); } }
public DesktopException(ulong objRef, BaseDesktopHeapType type) { _object = objRef; _type = type; }