Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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);
        }