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