コード例 #1
0
ファイル: TableHeap.cs プロジェクト: hj1980/Mosa
        /// <summary>
        /// Reads the specified token.
        /// </summary>
        /// <param name="token">The token.</param>
        /// <param name="result">The result.</param>
        public void Read(TokenTypes token, out ClassLayoutRow result)
        {
            if ((token & TokenTypes.TableMask) != TokenTypes.ClassLayout)
                throw new ArgumentException ("Invalid token type for ClassLayoutRow.", "token");

            using (BinaryReader reader = CreateReaderForToken (token))
            {
                result = new ClassLayoutRow (reader.ReadInt16 (), reader.ReadInt32 (), ReadIndexValue (reader, TokenTypes.TypeDef));
            }
        }
コード例 #2
0
 void IMetadataProvider.Read(TokenTypes token, out ClassLayoutRow result)
 {
     TableHeap theap = (TableHeap)_streams[(int)HeapType.Tables];
     theap.Read(token, out result);
 }
コード例 #3
0
        /// <summary>
        /// Loads all types from the given metadata module.
        /// </summary>
        private void LoadTypes()
        {
            TokenTypes maxTypeDef, maxField, maxMethod, maxLayout, tokenLayout = TokenTypes.ClassLayout + 1;
            TypeDefRow typeDefRow, nextTypeDefRow = new TypeDefRow();
            ClassLayoutRow layoutRow = new ClassLayoutRow();
            int size = 0x0, packing = 0;
            int typeOffset = 0;
            int methodOffset = 0;
            int fieldOffset = 0;
            RuntimeType rt;

            maxTypeDef = metadata.GetMaxTokenValue(TokenTypes.TypeDef);
            maxLayout = metadata.GetMaxTokenValue(TokenTypes.ClassLayout);
            maxMethod = metadata.GetMaxTokenValue(TokenTypes.MethodDef);
            maxField = metadata.GetMaxTokenValue(TokenTypes.Field);

            if (TokenTypes.ClassLayout < maxLayout)
                layoutRow = metadata.ReadClassLayoutRow(tokenLayout);

            TokenTypes token = TokenTypes.TypeDef + 1;
            typeDefRow = metadata.ReadTypeDefRow(token);

            for (; token <= maxTypeDef; token++)
            {
                TokenTypes maxNextMethod, maxNextField;
                string name = metadata.ReadString(typeDefRow.TypeNameIdx);

                //Debug.Write(((uint)token).ToString("X") + ": ");
                //Debug.Write(typeDefRow.TypeNameIdx.ToString("X") + ": ");
                //Debug.Write(metadata.ReadString(typeDefRow.TypeNameIdx));

                if (token < maxTypeDef)
                {
                    nextTypeDefRow = metadata.ReadTypeDefRow(token + 1);
                    maxNextField = nextTypeDefRow.FieldList;
                    maxNextMethod = nextTypeDefRow.MethodList;

                    if (maxNextMethod > maxMethod)
                        maxNextMethod = maxMethod + 1;
                    if (maxNextField > maxField)
                        maxNextField = maxField + 1;
                }
                else
                {
                    maxNextMethod = maxMethod + 1;
                    maxNextField = maxField + 1;
                }

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

                    //Debug.Write(" [Size: " + size.ToString() + "]");

                    tokenLayout++;
                    if (tokenLayout <= maxLayout)
                        layoutRow = metadata.ReadClassLayoutRow(tokenLayout);
                }
                //Debug.WriteLine(string.Empty);

                // Create and populate the runtime type
                rt = new CilRuntimeType(this, token, typeDefRow, maxNextField, maxNextMethod, packing, size);
                LoadMethods(rt, typeDefRow.MethodList, maxNextMethod, ref methodOffset);
                LoadFields(rt, typeDefRow.FieldList, maxNextField, ref fieldOffset);
                types[typeOffset++] = rt;

                packing = size = 0;
                typeDefRow = nextTypeDefRow;
            }
        }