Ejemplo n.º 1
0
        /// <summary>
        /// Loads all fields defined in the module.
        /// </summary>
        /// <param name="declaringType">The type, which declared the method.</param>
        /// <param name="first">The first field token to load.</param>
        /// <param name="last">The last field token to load (non-inclusive.)</param>
        private void LoadFields(RuntimeType declaringType, Token first, Token last)
        {
            Token maxRVA      = GetMaxTokenValue(TableType.FieldRVA);
            Token maxLayout   = GetMaxTokenValue(TableType.FieldLayout);
            Token tokenRva    = new Token(TableType.FieldRVA, 1);
            Token tokenLayout = new Token(TableType.FieldLayout, 1);

            FieldRVARow    fieldRVA    = (maxRVA.RID != 0) ? metadataProvider.ReadFieldRVARow(tokenRva) : new FieldRVARow();
            FieldLayoutRow fieldLayout = (maxLayout.RID != 0) ? metadataProvider.ReadFieldLayoutRow(tokenLayout) : new FieldLayoutRow();

            foreach (Token token in first.Upto(last.PreviousRow))
            {
                FieldRow fieldRow = metadataProvider.ReadFieldRow(token);
                uint     rva      = 0;
                uint     layout   = 0;

                // Static fields have an optional RVA, non-static may have a layout assigned
                if ((fieldRow.Flags & FieldAttributes.HasFieldRVA) == FieldAttributes.HasFieldRVA)
                {
                    // Move to the RVA of this field
                    while (fieldRVA.Field.RID < token.RID && tokenRva.RID <= maxRVA.RID)
                    {
                        fieldRVA = metadataProvider.ReadFieldRVARow(tokenRva);
                        tokenRva = tokenRva.NextRow;
                    }

                    // Does this field have an RVA?
                    if (token == fieldRVA.Field && tokenRva.RID <= maxRVA.RID)
                    {
                        rva      = fieldRVA.Rva;
                        tokenRva = tokenRva.NextRow;
                        if (tokenRva.RID < maxRVA.RID)
                        {
                            fieldRVA = metadataProvider.ReadFieldRVARow(tokenRva);
                        }
                    }
                }

                if ((fieldRow.Flags & FieldAttributes.HasDefault) == FieldAttributes.HasDefault)
                {
                    // FIXME: Has a default value.
                    //Debug.Assert(false);
                }

                // Layout only exists for non-static fields
                if ((fieldRow.Flags & FieldAttributes.Static) != FieldAttributes.Static)
                {
                    // Move to the layout of this field
                    while (fieldLayout.Field.RID < token.RID && tokenLayout.RID <= maxLayout.RID)
                    {
                        fieldLayout = metadataProvider.ReadFieldLayoutRow(tokenLayout);
                        tokenLayout = tokenLayout.NextRow;
                    }

                    // Does this field have layout?
                    if (token == fieldLayout.Field && tokenLayout.RID <= maxLayout.RID)
                    {
                        layout      = fieldLayout.Offset;
                        tokenLayout = tokenLayout.NextRow;
                        if (tokenLayout.RID < maxLayout.RID)
                        {
                            fieldLayout = metadataProvider.ReadFieldLayoutRow(tokenLayout);
                        }
                    }
                }

                // Load the field metadata
                CilRuntimeField field = new CilRuntimeField(
                    this,
                    GetString(fieldRow.Name),
                    GetFieldSignature(fieldRow.Signature),
                    token,
                    layout,
                    rva,
                    declaringType,
                    fieldRow.Flags
                    );

                declaringType.Fields.Add(field);
                fields[token.RID - 1] = field;
            }

            /* FIXME:
             * Load FieldMarshal tables
             * as needed afterwards. All Generics have been loaded, fields can receive
             * their signature in the load method above.
             */
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Loads all fields defined in the module.
        /// </summary>
        /// <param name="module">The metadata module to load fields form.</param>
        /// <param name="declaringType">The type, which declared the method.</param>
        /// <param name="first">The first field token to load.</param>
        /// <param name="last">The last field token to load (non-inclusive.)</param>
        /// <param name="offset">The offset in the fields array.</param>
        private void LoadFields(IMetadataModule module, RuntimeType declaringType, TokenTypes first, TokenTypes last, ref int offset)
        {
            IMetadataProvider md          = module.Metadata;
            TokenTypes        maxRVA      = md.GetMaxTokenValue(TokenTypes.FieldRVA),
                              maxLayout   = md.GetMaxTokenValue(TokenTypes.FieldLayout),
                              tokenRva    = TokenTypes.FieldRVA + 1,
                              tokenLayout = TokenTypes.FieldLayout + 1;
            FieldRow       field;
            FieldRVARow    fieldRVA = new FieldRVARow();
            FieldLayoutRow fieldLayout = new FieldLayoutRow();
            IntPtr         rva, layout;

            if (TokenTypes.FieldRVA < maxRVA)
            {
                md.Read(tokenRva, out fieldRVA);
            }
            if (TokenTypes.FieldLayout < maxLayout)
            {
                md.Read(tokenLayout, out fieldLayout);
            }

            for (TokenTypes token = first; token < last; token++)
            {
                // Read the _stackFrameIndex
                md.Read(token, out field);
                layout = rva = IntPtr.Zero;

                // Static fields have an optional RVA, non-static may have a layout assigned
                if ((field.Flags & FieldAttributes.HasFieldRVA) == FieldAttributes.HasFieldRVA)
                {
                    // Move to the RVA of this field
                    while (fieldRVA.FieldTableIdx < token && tokenRva <= maxRVA)
                    {
                        md.Read(tokenRva++, out fieldRVA);
                    }

                    // Does this field have an RVA?
                    if (token == fieldRVA.FieldTableIdx && tokenRva <= maxRVA)
                    {
                        rva = new IntPtr(fieldRVA.Rva);
                        tokenRva++;
                        if (tokenRva < maxRVA)
                        {
                            md.Read(tokenRva, out fieldRVA);
                        }
                    }
                }

                if ((field.Flags & FieldAttributes.HasDefault) == FieldAttributes.HasDefault)
                {
                    // FIXME: Has a default value.
                    //Debug.Assert(false);
                }

                // Layout only exists for non-static fields
                if ((field.Flags & FieldAttributes.Static) != FieldAttributes.Static)
                {
                    // Move to the layout of this field
                    while (fieldLayout.Field < token && tokenLayout <= maxLayout)
                    {
                        md.Read(tokenLayout++, out fieldLayout);
                    }

                    // Does this field have layout?
                    if (token == fieldLayout.Field && tokenLayout <= maxLayout)
                    {
                        layout = new IntPtr(fieldLayout.Offset);
                        tokenLayout++;
                        if (tokenLayout < maxLayout)
                        {
                            md.Read(tokenLayout, out fieldLayout);
                        }
                    }
                }

                // Load the field metadata
                _fields[offset++] = new CilRuntimeField(module, ref field, layout, rva, declaringType);
            }

            /* FIXME:
             * Load FieldMarshal tables
             * as needed afterwards. All Generics have been loaded, fields can receive
             * their signature in the load method above.
             */
        }