コード例 #1
0
        /// <summary>
        /// Processes the specified type's fields to fill in required data.
        /// </summary>
        /// <param name="TheLibrary">The library from which the type originated.</param>
        /// <param name="theTypeInfo">The type info to process.</param>
        public static void ProcessTypeFields(IL.ILLibrary TheLibrary, TypeInfo theTypeInfo)
        {
            if (theTypeInfo.ProcessedFields)
            {
                return;
            }

            theTypeInfo.ProcessedFields = true;

            int totalOffset = 0;

            //Base class fields
            if (theTypeInfo.UnderlyingType.BaseType != null)
            {
                Type baseType = theTypeInfo.UnderlyingType.BaseType;
                if (!baseType.AssemblyQualifiedName.Contains("mscorlib"))
                {
                    totalOffset = TheLibrary.GetTypeInfo(baseType).SizeOnHeapInBytes;
                }
            }

            foreach (FieldInfo aFieldInfo in theTypeInfo.FieldInfos)
            {
                if (!aFieldInfo.IsStatic)
                {
                    aFieldInfo.OffsetInBytes = totalOffset;
                    TypeInfo fieldTypeInfo = TheLibrary.GetTypeInfo(aFieldInfo.FieldType);
                    totalOffset += fieldTypeInfo.IsValueType ? fieldTypeInfo.SizeOnHeapInBytes : fieldTypeInfo.SizeOnStackInBytes;
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Processes the specified type info to fill in the required data.
        /// </summary>
        /// <param name="TheLibrary">The library from which the type originated.</param>
        /// <param name="theTypeInfo">The type info to process.</param>
        public static void ProcessType(IL.ILLibrary TheLibrary, TypeInfo theTypeInfo)
        {
            if (theTypeInfo.Processed)
            {
                return;
            }

            theTypeInfo.Processed = true;

            theTypeInfo.IsGCManaged = GetIsGCManaged(theTypeInfo.UnderlyingType);

            if (theTypeInfo.IsValueType || theTypeInfo.IsPointer)
            {
                theTypeInfo.SizeOnStackInBytes = GetSizeOnStackInBytes(theTypeInfo.UnderlyingType);
                theTypeInfo.SizeOnHeapInBytes  = GetSizeOnHeapInBytes(theTypeInfo.UnderlyingType);
            }
            else
            {
                theTypeInfo.SizeOnStackInBytes = GetSizeOnStackInBytes(theTypeInfo.UnderlyingType);

                theTypeInfo.SizeOnHeapInBytes = 0;
                if (theTypeInfo.UnderlyingType.BaseType != null)
                {
                    Type baseType = theTypeInfo.UnderlyingType.BaseType;
                    if (!baseType.AssemblyQualifiedName.Contains("mscorlib"))
                    {
                        TypeInfo baseTypeInfo = TheLibrary.GetTypeInfo(baseType, false);
                        ProcessType(TheLibrary, baseTypeInfo);
                        theTypeInfo.SizeOnHeapInBytes += baseTypeInfo.SizeOnHeapInBytes;
                    }
                }
                foreach (FieldInfo aFieldInfo in theTypeInfo.FieldInfos)
                {
                    if (!aFieldInfo.IsStatic)
                    {
                        TypeInfo fieldTypeInfo = TheLibrary.GetTypeInfo(aFieldInfo.FieldType, false);
                        if (fieldTypeInfo.IsValueType || fieldTypeInfo.IsPointer)
                        {
                            ProcessType(TheLibrary, fieldTypeInfo);
                        }
                        theTypeInfo.SizeOnHeapInBytes += fieldTypeInfo.IsValueType ? fieldTypeInfo.SizeOnHeapInBytes : Options.AddressSizeInBytes;
                    }
                }
            }
        }