private BlobHandle GetFieldSignatureBlobHandle(FieldDesc field)
        {
            var fieldDef        = field.GetTypicalFieldDefinition();
            var embeddedSigData = field.GetEmbeddedSignatureData();
            EmbeddedSignatureDataEmitter signatureDataEmitter;

            if (embeddedSigData != null && embeddedSigData.Length != 0)
            {
                signatureDataEmitter = new EmbeddedSignatureDataEmitter(embeddedSigData, this);
            }
            else
            {
                signatureDataEmitter = EmbeddedSignatureDataEmitter.EmptySingleton;
            }

            BlobBuilder memberRefSig = new BlobBuilder();

            EncodeFieldSignature(memberRefSig, field.FieldType, signatureDataEmitter);

            if (!signatureDataEmitter.Complete)
            {
                throw new ArgumentException();
            }

            var sigBlob = _metadataBuilder.GetOrAddBlob(memberRefSig);

            return(sigBlob);
        }
Exemple #2
0
 private void InitializeFieldReference(Cts.FieldDesc entity, MemberReference record)
 {
     record.Name      = HandleString(entity.Name);
     record.Parent    = HandleType(entity.OwningType);
     record.Signature = new FieldSignature
     {
         Type = HandleType(entity.GetTypicalFieldDefinition().FieldType),
         // TODO: CustomModifiers
     };
 }
        /// <summary>
        /// Creates an open instantiation of a field. Given Foo&lt;T&gt;.Field, returns
        /// Foo&lt;!0&gt;.Field. If the owning type is not generic, returns the <paramref name="field"/>.
        /// </summary>
        public static FieldDesc InstantiateAsOpen(this FieldDesc field)
        {
            Debug.Assert(field.GetTypicalFieldDefinition() == field);

            TypeDesc owner = field.OwningType;

            if (owner.HasInstantiation)
            {
                var instantiatedOwner = (InstantiatedType)owner.InstantiateAsOpen();
                return(field.Context.GetFieldForInstantiatedType(field, instantiatedOwner));
            }

            return(field);
        }
Exemple #4
0
 public override MetadataRecord HandleQualifiedField(Cts.FieldDesc field)
 {
     if (_policy.GeneratesMetadata(field) && field.GetTypicalFieldDefinition() == field)
     {
         QualifiedField record = new QualifiedField();
         record.Field         = HandleFieldDefinition(field);
         record.EnclosingType = (TypeDefinition)HandleType(field.OwningType);
         return(record);
     }
     else
     {
         return(HandleFieldReference(field));
     }
 }
Exemple #5
0
        public virtual FieldDesc InstantiateSignature(Instantiation typeInstantiation, Instantiation methodInstantiation)
        {
            FieldDesc field = this;

            TypeDesc owningType             = field.OwningType;
            TypeDesc instantiatedOwningType = owningType.InstantiateSignature(typeInstantiation, methodInstantiation);

            if (owningType != instantiatedOwningType)
            {
                field = instantiatedOwningType.Context.GetFieldForInstantiatedType(field.GetTypicalFieldDefinition(), (InstantiatedType)instantiatedOwningType);
            }

            return(field);
        }
Exemple #6
0
 /// <summary>
 /// Gets an object representing the static data for RVA mapped fields from the PE image.
 /// </summary>
 public ObjectNode GetFieldRvaData(FieldDesc field)
 {
     if (field.GetType() == typeof(Internal.IL.Stubs.PInvokeLazyFixupField))
     {
         var pInvokeFixup = (Internal.IL.Stubs.PInvokeLazyFixupField)field;
         PInvokeMetadata metadata = pInvokeFixup.PInvokeMetadata;
         return NodeFactory.PInvokeMethodFixup(metadata.Module, metadata.Name);
     }
     else
     {
         // Use the typical field definition in case this is an instantiated generic type
         field = field.GetTypicalFieldDefinition();
         return NodeFactory.ReadOnlyDataBlob(NameMangler.GetMangledFieldName(field),
             ((EcmaField)field).GetFieldRvaData(), NodeFactory.Target.PointerSize);
     }
 }
        public EntityHandle GetFieldRef(FieldDesc field)
        {
            if (_fieldRefs.TryGetValue(field, out var handle))
            {
                return(handle);
            }

            EntityHandle fieldHandle;

            EntityHandle typeHandle = GetTypeRef((MetadataType)field.OwningType);
            StringHandle fieldName  = _metadataBuilder.GetOrAddString(field.Name);

            var sigBlob = GetFieldSignatureBlobHandle(field.GetTypicalFieldDefinition());

            fieldHandle = _metadataBuilder.AddMemberReference(typeHandle, fieldName, sigBlob);

            _fieldRefs.Add(field, fieldHandle);
            return(fieldHandle);
        }
Exemple #8
0
 private Field HandleFieldDefinition(Cts.FieldDesc field)
 {
     Debug.Assert(field.GetTypicalFieldDefinition() == field);
     Debug.Assert(_policy.GeneratesMetadata(field));
     return((Field)_fields.GetOrCreate(field, _initFieldDef ?? (_initFieldDef = InitializeFieldDefinition)));
 }
Exemple #9
0
 internal FieldForInstantiatedType(FieldDesc fieldDef, InstantiatedType instantiatedType)
 {
     Debug.Assert(fieldDef.GetTypicalFieldDefinition() == fieldDef);
     _fieldDef         = fieldDef;
     _instantiatedType = instantiatedType;
 }
Exemple #10
0
 private MemberReference HandleFieldReference(Cts.FieldDesc field)
 {
     Debug.Assert(field.GetTypicalFieldDefinition() == field);
     Debug.Assert(!_policy.GeneratesMetadata(field));
     return((MemberReference)_fields.GetOrCreate(field, _initFieldRef ?? (_initFieldRef = InitializeFieldReference)));
 }
        protected internal override bool ComputeHasGCStaticBase(FieldDesc field)
        {
            Debug.Assert(field.IsStatic);

            if (field is NativeLayoutFieldDesc)
            {
                return ((NativeLayoutFieldDesc)field).FieldStorage == Internal.NativeFormat.FieldStorage.GCStatic;
            }

            TypeDesc fieldType = field.FieldType;
            if (fieldType.IsValueType)
            {
                FieldDesc typicalField = field.GetTypicalFieldDefinition();

                if (field != typicalField)
                {
                    if (typicalField.FieldType.IsSignatureVariable)
                        return true;
                }
                if (fieldType.IsEnum || fieldType.IsPrimitive)
                    return false;
                return true;
            }
            else
                return fieldType.IsGCPointer;
        }