/// <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. */ }
/// <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. */ }