/// <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; } } }
/// <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; } } } }