internal void LoadStage2() { Console.WriteLine("================================================== Stage 2: {0} ==================================================", File.ReferenceName); for (int typeIndex = 0; typeIndex < Types.Count; ++typeIndex) { IRType type = Types[typeIndex]; TypeDefData typeDefData = File.TypeDefTable[typeIndex]; if (typeDefData.Extends.Type != TypeDefRefOrSpecIndex.TypeDefRefOrSpecType.TypeDef || typeDefData.Extends.TypeDef != null) { type.BaseType = AppDomain.PresolveType(typeDefData.Extends); } for (int fieldIndex = 0; fieldIndex < type.Fields.Count; ++fieldIndex) { IRField field = type.Fields[fieldIndex]; field.Type = AppDomain.PresolveType(typeDefData.FieldList[fieldIndex].ExpandedSignature); if (field.Type == null) { throw new Exception(); } } } for (int methodIndex = 0; methodIndex < Methods.Count; ++methodIndex) { IRMethod method = Methods[methodIndex]; MethodDefData methodDefData = File.MethodDefTable[methodIndex]; var mGenParams = File.GenericParamTable.Where(gp => gp.Owner.Type == TypeOrMethodDefIndex.TypeOrMethodDefType.MethodDef && gp.Owner.MethodDef == methodDefData).ToList(); for (int i = 0; i < mGenParams.Count; i++) { method.GenericParameters.Add(IRType.GetMVarPlaceholder(mGenParams[i].Number)); } method.ReturnType = AppDomain.PresolveType(methodDefData.ExpandedSignature.RetType); for (int parameterIndex = 0; parameterIndex < method.Parameters.Count; ++parameterIndex) { IRParameter parameter = method.Parameters[parameterIndex]; parameter.Type = AppDomain.PresolveType(methodDefData.ExpandedSignature.Params[parameterIndex]); } for (int localIndex = 0; localIndex < method.Locals.Count; ++localIndex) { IRLocal local = method.Locals[localIndex]; local.Type = AppDomain.PresolveType(methodDefData.Body.ExpandedLocalVarSignature.LocalVars[localIndex]); } } for (int methodIndex = 0; methodIndex < Methods.Count; ++methodIndex) { IRMethod method = Methods[methodIndex]; MethodDefData methodDefData = File.MethodDefTable[methodIndex]; if (methodDefData.ExpandedSignature.HasThis && !methodDefData.ExpandedSignature.ExplicitThis) { IRParameter implicitThis = new IRParameter(this); implicitThis.ParentMethod = method; implicitThis.Type = method.ParentType.IsValueType ? AppDomain.GetPointerType(method.ParentType) : method.ParentType; method.Parameters.Insert(0, implicitThis); } } }
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); }