internal void LoadStage1() { Console.WriteLine("================================================== Stage 1: {0} ==================================================", File.ReferenceName); foreach (TypeDefData typeDefData in File.TypeDefTable) { Types.Add(new IRType(this)); } foreach (FieldData fieldData in File.FieldTable) { Fields.Add(new IRField(this)); } foreach (MethodDefData methodDefData in File.MethodDefTable) { Methods.Add(new IRMethod(this)); } for (int typeIndex = 0; typeIndex < Types.Count; ++typeIndex) { IRType type = Types[typeIndex]; TypeDefData typeDefData = File.TypeDefTable[typeIndex]; type.Namespace = typeDefData.TypeNamespace; type.Name = typeDefData.TypeName; var genParams = File.GenericParamTable.Where(gp => gp.Owner.Type == TypeOrMethodDefIndex.TypeOrMethodDefType.TypeDef && gp.Owner.TypeDef == typeDefData).ToList(); for (int i = 0; i < genParams.Count; i++) { type.GenericParameters.Add(IRType.GetVarPlaceholder(genParams[i].Number)); } foreach (FieldData fieldData in typeDefData.FieldList) { IRField field = Fields[fieldData.TableIndex]; field.Name = fieldData.Name; field.ParentType = type; type.Fields.Add(field); } foreach (MethodDefData methodDefData in typeDefData.MethodList) { IRMethod method = Methods[methodDefData.TableIndex]; method.Name = methodDefData.Name; method.ParentType = type; method.IsStatic = (methodDefData.Flags & MethodAttributes.Static) == MethodAttributes.Static; type.Methods.Add(method); foreach (ParamData paramData in methodDefData.ParamList) { IRParameter parameter = new IRParameter(this); parameter.ParentMethod = method; method.Parameters.Add(parameter); } if (methodDefData.Body != null && methodDefData.Body.ExpandedLocalVarSignature != null) { method.MaximumStackDepth = methodDefData.Body.MaxStack; foreach (SigLocalVar sigLocalVar in methodDefData.Body.ExpandedLocalVarSignature.LocalVars) { IRLocal local = new IRLocal(this); local.ParentMethod = method; local.Index = (uint)method.Locals.Count; method.Locals.Add(local); } } } } for (int typeIndex = 0; typeIndex < Types.Count; ++typeIndex) { IRType type = Types[typeIndex]; TypeDefData typeDefData = File.TypeDefTable[typeIndex]; foreach (TypeDefData nestedTypeDefData in typeDefData.NestedClassList) { IRType nestedType = Types[nestedTypeDefData.TableIndex]; nestedType.Namespace = type.Namespace + "." + type.Name; type.NestedTypes.Add(nestedType); } } if (CORLibrary) { AppDomain.CacheCORTypes(this); } }
public IRType PresolveType(SigType pSigType) { IRType type = null; switch (pSigType.ElementType) { case SigElementType.Void: type = System_Void; break; case SigElementType.Boolean: type = System_Boolean; break; case SigElementType.Char: type = System_Char; break; case SigElementType.I1: type = System_SByte; break; case SigElementType.U1: type = System_Byte; break; case SigElementType.I2: type = System_Int16; break; case SigElementType.U2: type = System_UInt16; break; case SigElementType.I4: type = System_Int32; break; case SigElementType.U4: type = System_UInt32; break; case SigElementType.I8: type = System_Int64; break; case SigElementType.U8: type = System_UInt64; break; case SigElementType.R4: type = System_Single; break; case SigElementType.R8: type = System_Double; break; case SigElementType.String: type = System_String; break; case SigElementType.Pointer: { if (pSigType.PtrVoid) { type = GetPointerType(System_Void); } else { type = GetPointerType(PresolveType(pSigType.PtrType)); } break; } case SigElementType.ValueType: type = PresolveType(pSigType.CLIFile.ExpandTypeDefRefOrSpecToken(pSigType.ValueTypeDefOrRefOrSpecToken)); break; case SigElementType.Class: type = PresolveType(pSigType.CLIFile.ExpandTypeDefRefOrSpecToken(pSigType.ClassTypeDefOrRefOrSpecToken)); break; case SigElementType.Array: type = GetArrayType(PresolveType(pSigType.ArrayType)); break; case SigElementType.GenericInstantiation: { IRType genericType = PresolveType(pSigType.CLIFile.ExpandTypeDefRefOrSpecToken(pSigType.GenericInstTypeDefOrRefOrSpecToken)); List <IRType> genericTypeParameters = new List <IRType>(); foreach (SigType paramType in pSigType.GenericInstGenArgs) { genericTypeParameters.Add(PresolveType(paramType)); } type = PresolveGenericType(genericType, genericTypeParameters); break; } case SigElementType.IPointer: type = System_IntPtr; break; case SigElementType.UPointer: type = System_UIntPtr; break; case SigElementType.Object: type = System_Object; break; case SigElementType.SingleDimensionArray: type = GetArrayType(PresolveType(pSigType.SZArrayType)); break; case SigElementType.Var: type = IRType.GetVarPlaceholder(pSigType.VarNumber); break; case SigElementType.MethodVar: type = IRType.GetMVarPlaceholder(pSigType.MVarNumber); break; case SigElementType.Type: type = System_Type; break; default: break; } if (type == null) { throw new NullReferenceException(); } return(type); }