singrdk/base/Windows/mkmsil/msil/MetaDataField.cs

158 lines
5.2 KiB
C#

//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
namespace Bartok.MSIL
{
using System;
public class MetaDataField: MetaDataObject {
// Constructor Methods
internal MetaDataField(short flags, string name, Signature signature) {
this.flags = flags;
this.name = name;
this.signature = signature;
}
internal void resolveReferences(MetaDataLoader loader) {
this.signature = this.signature.resolve(loader);
}
internal void resolveReferences(MetaDataTypeDefinition parent) {
this.parent = parent;
}
internal void resolveReferences(MetaDataFieldRVA fieldRVA) {
this.fieldRVA = fieldRVA;
}
internal void resolveReferences(MetaDataConstant constant) {
this.constant = constant;
}
internal void resolveReferences(MetaDataFieldLayout fieldLayout) {
this.layout = fieldLayout;
}
// Access Methods
// Bitmask described by FieldAttributes
public int Flags {
get {
return this.flags;
}
}
public string Name {
get {
return this.name;
}
}
public SignatureField Signature {
get {
return (SignatureField) this.signature;
}
}
public MetaDataTypeDefinition Parent {
get {
return this.parent;
}
}
public Object DefaultValue {
get {
if ((this.flags & (int) FieldAttributes.HasDefault) != 0 &&
this.constant != null) {
return this.constant.Value;
}
else if ((this.flags & (int) FieldAttributes.HasFieldRVA) != 0 &&
this.fieldRVA != null) {
return this.fieldRVA.DataBytes;
}
else {
return null;
}
}
}
public int RVA {
get {
if ((this.flags & (int) FieldAttributes.HasFieldRVA) != 0 &&
this.fieldRVA != null) {
return this.fieldRVA.RVA;
}
else {
return 0;
}
}
}
public MetaDataFieldLayout Layout {
get {
return this.layout;
}
}
// Debug Methods
public override String ToString() {
return ("MetaDataField("+this.flags.ToString("x4")+","+
this.name+","+this.signature+")");
}
public override String ToStringLong() {
return ("MetaDataField("+this.flags.ToString("x4")+","+
this.parent.FullName+"."+this.name+","+this.signature+
((this.DefaultValue!=null)?("["+this.DefaultValue+"]"):"")+
")");
}
// State
private readonly int flags;
private readonly string name;
private Signature signature;
private MetaDataTypeDefinition parent;
private MetaDataFieldRVA fieldRVA;
private MetaDataConstant constant;
private MetaDataFieldLayout layout;
// Internal Classes
// Section 22.1.3 of ECMA spec, Section II
public enum FieldAttributes {
// member access mask - Use this mask to retrieve accessibility information.
FieldAccessMask = 0x0007,
PrivateScope = 0x0000, // Member not referenceable.
Private = 0x0001, // Accessible only by the parent type.
FamANDAssem = 0x0002, // Accessible by sub-types only in this Assembly.
Assembly = 0x0003, // Accessibly by anyone in the Assembly.
Family = 0x0004, // Accessible only by type and sub-types.
FamORAssem = 0x0005, // Accessibly by sub-types anywhere, plus anyone in assembly.
Public = 0x0006, // Accessibly by anyone who has visibility to this scope.
// end member access mask
// field contract attributes.
Static = 0x0010, // Defined on type, else per instance.
InitOnly = 0x0020, // Field may only be initialized, not written to after init.
Literal = 0x0040, // Value is compile time constant.
NotSerialized = 0x0080, // Field does not have to be serialized when type is remoted.
SpecialName = 0x0200, // field is special. Name describes how.
// interop attributes
PinvokeImpl = 0x2000,// Implementation is forwarded through pinvoke.
// Reserved flags for runtime use only.
ReservedMask = 0x9500,
RTSpecialName = 0x0400, // Runtime(metadata internal APIs) should check name encoding.
HasFieldMarshal = 0x1000, // Field has marshalling information.
HasDefault = 0x8000, // Field has default.
HasFieldRVA = 0x0100 // Field has RVA.
}
}
}