Пример #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CilGenericType"/> class.
        /// </summary>
        /// <param name="module">The module.</param>
        /// <param name="baseGenericType">Type of the base generic.</param>
        /// <param name="genericTypeInstanceSignature">The generic type instance signature.</param>
        /// <param name="token">The token.</param>
        /// <param name="typeModule">The type module.</param>
        public CilGenericType(ITypeModule module, RuntimeType baseGenericType, GenericInstSigType genericTypeInstanceSignature, Token token, ITypeModule typeModule) :
            base(module, token, baseGenericType.BaseType)
        {
            Debug.Assert(baseGenericType is CilRuntimeType);

            this.signature       = genericTypeInstanceSignature;
            this.baseGenericType = baseGenericType as CilRuntimeType;
            base.Attributes      = baseGenericType.Attributes;
            base.Namespace       = baseGenericType.Namespace;

            if (this.baseGenericType.IsNested)
            {
                // TODO: find generic type

                ;
            }

            // TODO: if this is a nested types, add enclosing type(s) into genericArguments first
            this.genericArguments = signature.GenericArguments;

            base.Name = GetName(typeModule);

            ResolveMethods();
            ResolveFields();

            this.containsOpenGenericArguments = CheckContainsOpenGenericParameters();
        }
Пример #2
0
        private void LoadType(Token token, IList <TypeInfo> typeInfos)
        {
            TypeInfo info = typeInfos[(int)token.RID - 1];

            if (types[token.RID - 1] != null)
            {
                return;
            }

            if (info.TypeDefRow.Extends.RID != 0)
            {
                if (info.TypeDefRow.Extends.Table == TableType.TypeDef)
                {
                    LoadType(info.TypeDefRow.Extends, typeInfos);
                }
                else if (info.TypeDefRow.Extends.Table != TableType.TypeRef)
                {
                    throw new ArgumentException(@"unexpected token type.", @"extends");
                }
            }

            RuntimeType baseType      = GetType(info.TypeDefRow.Extends);
            RuntimeType enclosingType = (info.NestedClass == token) ? types[info.EnclosingClass.RID - 1] : null;

            // Create and populate the runtime type
            CilRuntimeType type = new CilRuntimeType(
                this,
                GetString(info.TypeDefRow.TypeNameIdx),
                GetString(info.TypeDefRow.TypeNamespaceIdx),
                info.PackingSize,
                info.Size,
                token,
                baseType,
                enclosingType,
                info.TypeDefRow.Flags,
                info.TypeDefRow.Extends
                );

            LoadMethods(type, info.TypeDefRow.MethodList, info.MaxMethod);
            LoadFields(type, info.TypeDefRow.FieldList, info.MaxField);
            types[token.RID - 1] = type;
        }
Пример #3
0
        /// <summary>
        /// Loads all types From the given metadata module.
        /// </summary>
        /// <param name="module">The metadata module to load the types From.</param>
        /// <param name="moduleOffsets">The offsets into the metadata arrays, of the current module.</param>
        private void LoadTypes(IMetadataModule module, ModuleOffsets moduleOffsets)
        {
            TokenTypes        maxTypeDef, maxField, maxMethod, maxLayout, tokenLayout = TokenTypes.ClassLayout + 1;
            TypeDefRow        typeDefRow, nextTypeDefRow = new TypeDefRow();
            ClassLayoutRow    layoutRow = new ClassLayoutRow();
            IMetadataProvider md = module.Metadata;
            int         size = 0x0, packing = 0;
            int         typeOffset   = moduleOffsets.TypeOffset;
            int         methodOffset = moduleOffsets.MethodOffset;
            int         fieldOffset  = moduleOffsets.FieldOffset;
            RuntimeType rt;

            maxTypeDef = md.GetMaxTokenValue(TokenTypes.TypeDef);
            maxLayout  = md.GetMaxTokenValue(TokenTypes.ClassLayout);

            if (TokenTypes.ClassLayout < maxLayout)
            {
                md.Read(tokenLayout, out layoutRow);
            }

            TokenTypes token = TokenTypes.TypeDef + 2;

            md.Read(token, out typeDefRow);
            do
            {
                /*
                 *            string name;
                 *            md.Read(typeDefRow.TypeNameIdx, out name);
                 *            Debug.WriteLine(name);
                 */
                if (token < maxTypeDef)
                {
                    md.Read(token + 1, out nextTypeDefRow);
                    maxField  = nextTypeDefRow.FieldList;
                    maxMethod = nextTypeDefRow.MethodList;
                }
                else
                {
                    maxMethod = md.GetMaxTokenValue(TokenTypes.MethodDef) + 1;
                    maxField  = md.GetMaxTokenValue(TokenTypes.Field) + 1;
                }

                // Is this our layout info?
                if ((layoutRow.ParentTypeDefIdx + 1) == token)
                {
                    size    = layoutRow.ClassSize;
                    packing = layoutRow.PackingSize;

                    tokenLayout++;
                    if (tokenLayout <= maxLayout)
                    {
                        md.Read(tokenLayout, out layoutRow);
                    }
                }

                // Create and populate the runtime type
                rt = new CilRuntimeType(token, module, ref typeDefRow, maxField, maxMethod, packing, size);
                LoadMethods(module, rt, typeDefRow.MethodList, maxMethod, ref methodOffset);
                LoadFields(module, rt, typeDefRow.FieldList, maxField, ref fieldOffset);
                _types[typeOffset++] = rt;

                if (rtCallTypeAttribute == null)
                {
                    if (rt.Name == "InternalCallTypeAttribute" && rt.Namespace == "Mosa.Runtime.Vm")
                    {
                        rtCallTypeAttribute = rt;
                    }
                }

                packing    = size = 0;
                typeDefRow = nextTypeDefRow;
            }while (token++ < maxTypeDef);
        }