예제 #1
0
        public override IEnumerable <ClrGenericParameter> EnumerateGenericParameters()
        {
            // We won't recover from Module being null, so we'll return an empty params list from that.
            ClrModule?module = Module;

            if (module is null)
            {
                yield break;
            }

            // We'll return default if we can't get MetdataImport.  This effectively means we'll try again
            // to get MetadataImport later.
            MetadataImport?import = module.MetadataImport;

            if (import == null)
            {
                yield break;
            }

            foreach (int token in import.EnumerateGenericParams(MetadataToken))
            {
                if (import.GetGenericParamProps(token, out int index, out GenericParameterAttributes attributes, out string?name))
                {
                    yield return(new ClrGenericParameter(token, index, attributes, name));
                }
            }
        }
예제 #2
0
        public ClrmdType(ClrHeap heap, ClrType?baseType, ClrModule?module, ITypeData data)
        {
            if (data is null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            Helpers          = data.Helpers;
            MethodTable      = data.MethodTable;
            Heap             = heap;
            BaseType         = baseType;
            Module           = module;
            MetadataToken    = data.Token;
            Shared           = data.IsShared;
            StaticSize       = data.BaseSize;
            ContainsPointers = data.ContainsPointers;
            IsShared         = data.IsShared;

            // If there are no methods, preempt the expensive work to create methods
            if (data.MethodCount == 0)
            {
                _methods = Array.Empty <ClrMethod>();
            }

            DebugOnlyLoadLazyValues();
        }
예제 #3
0
 public ClrmdGenericType(IClrObjectHelpers helpers, ClrHeap heap, ClrModule?module, ClrGenericParameter clrGenericParameter)
 {
     ClrObjectHelpers = helpers ?? throw new ArgumentNullException(nameof(helpers));
     Heap             = heap ?? throw new ArgumentNullException(nameof(heap));
     Module           = module;
     GenericParameter = clrGenericParameter;
 }
예제 #4
0
        private ILInfo?GetILInfo()
        {
            IDataReader?dataReader = _helpers.DataReader;

            if (dataReader is null)
            {
                return(null);
            }

            ClrModule?module = Type?.Module;

            if (module is null)
            {
                return(null);
            }

            MetadataImport?mdImport = module.MetadataImport;

            if (mdImport is null)
            {
                return(null);
            }

            uint rva = mdImport.GetRva(MetadataToken);

            ulong il = _helpers.GetILForModule(module.Address, rva);

            if (il != 0)
            {
                if (dataReader.Read(il, out byte b))
                {
                    bool isTinyHeader = (b & (IMAGE_COR_ILMETHOD.FormatMask >> 1)) == IMAGE_COR_ILMETHOD.TinyFormat;
                    if (isTinyHeader)
                    {
                        ulong address    = il + 1;
                        int   len        = b >> (int)(IMAGE_COR_ILMETHOD.FormatShift - 1);
                        uint  localToken = IMAGE_COR_ILMETHOD.mdSignatureNil;

                        return(new ILInfo(address, len, 0, localToken));
                    }
                    else if (dataReader.Read(il, out uint flags))
                    {
                        int   len        = dataReader.Read <int>(il + 4);
                        uint  localToken = dataReader.Read <uint>(il + 8);
                        ulong address    = il + 12;

                        return(new ILInfo(address, len, flags, localToken));
                    }
                }
            }

            return(null);
        }
예제 #5
0
파일: ClrModule.cs 프로젝트: wilvk/clrmd
        public bool Equals(ClrModule?other)
        {
            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            if (other is null)
            {
                return(false);
            }

            return(Address == other.Address);
        }
예제 #6
0
        public ClrmdArrayType(ClrHeap heap, ClrType?baseType, ClrModule?module, ITypeData data, string?name = null)
            : base(heap, baseType, module, data, name)
        {
            if (data is null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            ComponentSize = data.ComponentSize;
            ulong componentMT = data.ComponentMethodTable;

            if (componentMT != 0)
            {
                _componentType = Helpers.Factory.GetOrCreateType(heap, componentMT, 0);
            }
        }
예제 #7
0
        /// <summary>
        /// Flushes the DAC cache.  This function <b>must</b> be called any time you expect to call the same function
        /// but expect different results.  For example, after walking the heap, you need to call Flush before
        /// attempting to walk the heap again.
        /// </summary>
        public override void FlushCachedData()
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(nameof(ClrRuntime));
            }

            _heap         = null;
            _bcl          = null;
            _threads      = default;
            _domains      = default;
            _systemDomain = null;
            _sharedDomain = null;

            _helpers.DataReader.FlushCachedData();
            _helpers.FlushCachedData();
        }
예제 #8
0
        internal static ClrType?GetTypeForFieldSig(ITypeFactory factory, SigParser sigParser, ClrHeap heap, ClrModule?module)
        {
            ClrType?result = null;
            bool    res;
            int     etype = 0;

            if (res = sigParser.GetCallingConvInfo(out int sigType))
            {
                DebugOnly.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)
                    {
                        ClrType inner = factory.GetOrCreateBasicType((ClrElementType)etype);
                        result = factory.GetOrCreateArrayType(inner, ranks);
                    }
                }
                else if (type == ClrElementType.SZArray)
                {
                    sigParser.PeekElemType(out etype);
                    type = (ClrElementType)etype;

                    if (type.IsObjectReference())
                    {
                        result = factory.GetOrCreateBasicType(ClrElementType.SZArray);
                    }
                    else
                    {
                        ClrType inner = factory.GetOrCreateBasicType((ClrElementType)etype);
                        result = factory.GetOrCreateArrayType(inner, 1);
                    }
                }
                else if (type == ClrElementType.Pointer)
                {
                    // Only deal with single pointers for now and types that have already been constructed
                    sigParser.GetElemType(out etype);
                    type = (ClrElementType)etype;

                    sigParser.GetToken(out int token);

                    if (module != null)
                    {
                        ClrType?innerType = factory.GetOrCreateTypeFromToken(module, (uint)token);
                        if (innerType is null)
                        {
                            innerType = factory.GetOrCreateBasicType(type);
                        }

                        result = factory.GetOrCreatePointerType(innerType, 1);
                    }
                }
                else if (type == ClrElementType.Object || type == ClrElementType.Class)
                {
                    result = heap.ObjectType;
                }
                else
                {
                    // struct, then try to get the token
                    int token = 0;
                    if (etype == 0x11 || etype == 0x12)
                    {
                        sigParser.GetToken(out token);
                    }

                    if (token != 0 && module != null)
                    {
                        result = factory.GetOrCreateTypeFromToken(module, (uint)token);
                    }

                    if (result is null)
                    {
                        result = factory.GetOrCreateBasicType((ClrElementType)etype);
                    }
                }
            }

            if (result is null)
            {
                return(result);
            }

            if (result.IsArray && result.ComponentType is null && result is ClrmdArrayType clrmdType)
            {
                etype = 0;

                if (res = sigParser.GetCallingConvInfo(out sigType))
                {
                    DebugOnly.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD);
                }

                res = res && sigParser.SkipCustomModifiers();
                res = res && sigParser.GetElemType(out etype);

                _ = res && sigParser.GetElemType(out etype);

                // Generic instantiation
                if (etype == 0x15)
                {
                    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)
                {
                    sigParser.GetToken(out token);
                }

                if (token != 0 && module != null)
                {
                    clrmdType.SetComponentType(factory.GetOrCreateTypeFromToken(module, (uint)token));
                }
                else
                {
                    clrmdType.SetComponentType(factory.GetOrCreateBasicType((ClrElementType)etype));
                }
            }

            return(result);
        }
예제 #9
0
 public void Initialize()
 {
     _    = AppDomains;
     _bcl = _helpers.GetBaseClassLibrary(this);
 }