protected sealed override KeyValuePair <String, ulong>[] ReadNamesAndValues()
        {
            LowLevelList <KeyValuePair <String, ulong> > namesAndUnboxedValues = new LowLevelList <KeyValuePair <String, ulong> >();
            MetadataReader reader = _reader;

            foreach (FieldDefinitionHandle fieldHandle in _typeDefinition.GetFields())
            {
                FieldDefinition field = reader.GetFieldDefinition(fieldHandle);
                if (0 != (field.Attributes & FieldAttributes.Static))
                {
                    String name = reader.GetString(field.Name);

                    if ((field.Attributes & FieldAttributes.HasDefault) != FieldAttributes.HasDefault)
                    {
                        throw new BadImageFormatException();
                    }

                    ConstantHandle valueHandle = field.GetDefaultValue();

                    ulong ulValue = ReadUnboxedEnumValue(reader, valueHandle);
                    namesAndUnboxedValues.Add(new KeyValuePair <String, ulong>(name, ulValue));
                }
            }

            return(namesAndUnboxedValues.ToArray());
        }
Beispiel #2
0
        private ulong HandleConstant(EcmaModule module, ConstantHandle constantHandle)
        {
            MetadataReader reader   = module.MetadataReader;
            Constant       constant = reader.GetConstant(constantHandle);
            BlobReader     blob     = reader.GetBlobReader(constant.Value);

            switch (constant.TypeCode)
            {
            case ConstantTypeCode.Byte:
                return((ulong)blob.ReadByte());

            case ConstantTypeCode.Int16:
                return((ulong)blob.ReadInt16());

            case ConstantTypeCode.Int32:
                return((ulong)blob.ReadInt32());

            case ConstantTypeCode.Int64:
                return((ulong)blob.ReadInt64());

            case ConstantTypeCode.SByte:
                return((ulong)blob.ReadSByte());

            case ConstantTypeCode.UInt16:
                return((ulong)blob.ReadUInt16());

            case ConstantTypeCode.UInt32:
                return((ulong)blob.ReadUInt32());

            case ConstantTypeCode.UInt64:
                return((ulong)blob.ReadUInt64());
            }
            System.Diagnostics.Debug.Assert(false);
            return(0);
        }
        private Mapping <ConstantHandle> MapConstantImpl(ConstantHandle handle)
        {
            Constant         constant = _sourceMetadata.GetConstant(handle);
            Mapping <Handle> parent   = MapHandle(constant.Parent);

            if (parent.Target.IsNil)
            {
                return(new Mapping <ConstantHandle>());
            }

            ConstantHandle targetHandle;

            switch (parent.Target.Kind)
            {
            case HandleKind.Parameter:
                Parameter targetParameter = _targetMetadata.GetParameter((ParameterHandle)parent.Target);
                targetHandle = targetParameter.GetDefaultValue();
                break;

            case HandleKind.FieldDefinition:
                FieldDefinition targetFieldDefinition = _targetMetadata.GetFieldDefinition((FieldDefinitionHandle)parent.Target);
                targetHandle = targetFieldDefinition.GetDefaultValue();
                break;

            case HandleKind.PropertyDefinition:
                PropertyDefinition targetPropertyDefinition = _targetMetadata.GetPropertyDefinition((PropertyDefinitionHandle)parent.Target);
                targetHandle = targetPropertyDefinition.GetDefaultValue();
                break;

            default:
                throw new InvalidOperationException();
            }

            if (targetHandle.IsNil)
            {
                return(new Mapping <ConstantHandle>());
            }

            Constant targetConstant = _targetMetadata.GetConstant(targetHandle);

            if (constant.TypeCode != targetConstant.TypeCode)
            {
                var candidateTargets = ImmutableArray.Create(targetHandle);
                var candidateReasons = ImmutableArray.Create("Mapped constant has a different type.");
                return(new Mapping <ConstantHandle>(candidateTargets, candidateReasons));
            }

            ImmutableArray <byte> sourceContent = _sourceMetadata.GetBlobContent(constant.Value);
            ImmutableArray <byte> targetContent = _targetMetadata.GetBlobContent(targetConstant.Value);

            if (!sourceContent.SequenceEqual(targetContent))
            {
                var candidateTargets = ImmutableArray.Create(targetHandle);
                var candidateReasons = ImmutableArray.Create("Mapped constant has a different value.");
                return(new Mapping <ConstantHandle>(candidateTargets, candidateReasons));
            }

            return(new Mapping <ConstantHandle>(targetHandle));
        }
Beispiel #4
0
 public ConstantEntry(PEFile module, ConstantHandle handle)
 {
     this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
     this.module         = module;
     this.metadata       = module.Metadata;
     this.handle         = handle;
     this.constant       = metadata.GetConstant(handle);
 }
Beispiel #5
0
        private static object ConstantValueAsObject(ConstantHandle constantHandle, MetadataReader metadataReader, Type declaredType, bool raw)
        {
            object defaultValue = constantHandle.ParseConstantValue(metadataReader);

            if ((!raw) && declaredType.IsEnum && defaultValue != null)
            {
                defaultValue = Enum.ToObject(declaredType, defaultValue);
            }
            return(defaultValue);
        }
Beispiel #6
0
        private void ImportDefaultValue(ConstantHandle defaultValue, EntityHandle dstHandle)
        {
            if (!defaultValue.IsNil)
            {
                var srcConst = _reader.GetConstant(defaultValue);
                var value    = _reader.GetBlobReader(srcConst.Value).ReadConstant(srcConst.TypeCode);
                var dstConst = _builder.AddConstant(dstHandle, value);

                Trace?.Invoke($"Imported default value {_reader.ToString(srcConst)} -> {RowId(dstConst):X} = {value}");
            }
        }
        //
        // This returns the underlying enum values as "ulong" regardless of the actual underlying type. Signed integral types
        // get sign-extended into the 64-bit value, unsigned types get zero-extended.
        //
        public static ulong ReadUnboxedEnumValue(MetadataReader metadataReader, ConstantHandle constantHandle)
        {
            if (constantHandle.IsNil)
            {
                throw new BadImageFormatException();
            }

            Constant constantValue = metadataReader.GetConstant(constantHandle);

            if (constantValue.Value.IsNil)
            {
                throw new BadImageFormatException();
            }

            BlobReader reader = metadataReader.GetBlobReader(constantValue.Value);

            switch (constantValue.TypeCode)
            {
            case ConstantTypeCode.Boolean:
                return(reader.ReadBoolean() ? 1UL : 0UL);;

            case ConstantTypeCode.Char:
                return((ulong)(long)reader.ReadChar());

            case ConstantTypeCode.SByte:
                return((ulong)(long)reader.ReadSByte());

            case ConstantTypeCode.Int16:
                return((ulong)(long)reader.ReadInt16());

            case ConstantTypeCode.Int32:
                return((ulong)(long)reader.ReadInt32());

            case ConstantTypeCode.Int64:
                return((ulong)(long)reader.ReadInt64());

            case ConstantTypeCode.Byte:
                return((ulong)(long)reader.ReadByte());

            case ConstantTypeCode.UInt16:
                return((ulong)(long)reader.ReadUInt16());

            case ConstantTypeCode.UInt32:
                return((ulong)(long)reader.ReadUInt32());

            case ConstantTypeCode.UInt64:
                return((ulong)(long)reader.ReadUInt64());
            }

            throw new BadImageFormatException();
        }
Beispiel #8
0
        private ulong GetEnumRecordValue(FieldDesc field)
        {
            var ecmaField = field as EcmaField;

            if (ecmaField != null)
            {
                MetadataReader  reader             = ecmaField.MetadataReader;
                FieldDefinition fieldDef           = reader.GetFieldDefinition(ecmaField.Handle);
                ConstantHandle  defaultValueHandle = fieldDef.GetDefaultValue();
                if (!defaultValueHandle.IsNil)
                {
                    return(HandleConstant(ecmaField.Module, defaultValueHandle));
                }
            }
            return(0);
        }
        public Program.Constant ParseConstant(ConstantHandle handle)
        {
            var temp = Reader.GetConstant(handle);
            var type = ConstantTypeMap[temp.TypeCode];

            var val = Reader.GetBlobBytes(temp.Value);

            return new Program.Constant(new ElementType(type), null);
        }
Beispiel #10
0
 public static string ToString(this MetadataReader reader, ConstantHandle x) => reader.ToString(reader.GetConstant(x));
 public Mapping<ConstantHandle> MapConstant(ConstantHandle handle)
 {
     return _constants.GetOrAdd(handle, MapConstantImpl);
 }
Beispiel #12
0
 internal Handle GetParent(ConstantHandle handle)
 {
     int rowOffset = (int)(handle.RowId - 1) * this.RowSize;
     return HasConstantTag.ConvertToToken(this.Block.PeekTaggedReference(rowOffset + this.ParentOffset, this.IsHasConstantRefSizeSmall));
 }
Beispiel #13
0
 public Constant GetConstant(ConstantHandle handle)
 {
     return new Constant(this, handle.RowId);
 }
Beispiel #14
0
 internal EntityHandle GetParent(ConstantHandle handle)
 {
     int rowOffset = (handle.RowId - 1) * this.RowSize;
     return HasConstantTag.ConvertToHandle(this.Block.PeekTaggedReference(rowOffset + _ParentOffset, _IsHasConstantRefSizeSmall));
 }
Beispiel #15
0
 internal ConstantTypeCode GetType(ConstantHandle handle)
 {
     int rowOffset = (handle.RowId - 1) * this.RowSize;
     return (ConstantTypeCode)this.Block.PeekByte(rowOffset + _TypeOffset);
 }
        public static object?ToRawObject(this ConstantHandle constantHandle, MetadataReader metadataReader)
        {
            if (constantHandle.IsNil)
            {
                throw new BadImageFormatException();
            }

            Constant constantValue = metadataReader.GetConstant(constantHandle);

            // Partition II section 24.2.4:
            // The first entry in both these heaps is the empty 'blob' that consists of the single byte 0x00.
            //
            // This means zero value is valid for string and is used to represent the empty string.
            if (constantValue.Value.IsNil && constantValue.TypeCode != ConstantTypeCode.String)
            {
                throw new BadImageFormatException();
            }

            BlobReader reader = metadataReader.GetBlobReader(constantValue.Value);

            switch (constantValue.TypeCode)
            {
            case ConstantTypeCode.Boolean:
                return(reader.ReadBoolean());

            case ConstantTypeCode.Char:
                return(reader.ReadChar());

            case ConstantTypeCode.SByte:
                return(reader.ReadSByte());

            case ConstantTypeCode.Int16:
                return(reader.ReadInt16());

            case ConstantTypeCode.Int32:
                return(reader.ReadInt32());

            case ConstantTypeCode.Int64:
                return(reader.ReadInt64());

            case ConstantTypeCode.Byte:
                return(reader.ReadByte());

            case ConstantTypeCode.UInt16:
                return(reader.ReadUInt16());

            case ConstantTypeCode.UInt32:
                return(reader.ReadUInt32());

            case ConstantTypeCode.UInt64:
                return(reader.ReadUInt64());

            case ConstantTypeCode.Single:
                return(reader.ReadSingle());

            case ConstantTypeCode.Double:
                return(reader.ReadDouble());

            case ConstantTypeCode.String:
                return(reader.ReadUTF16(reader.Length));

            case ConstantTypeCode.NullReference:
                // Partition II section 22.9:
                // The encoding of Type for the nullref value is ELEMENT_TYPE_CLASS with a Value of a 4-byte zero.
                // Unlike uses of ELEMENT_TYPE_CLASS in signatures, this one is not followed by a type token.
                if (reader.ReadUInt32() == 0)
                {
                    return(null);
                }
                break;
            }
            throw new BadImageFormatException();
        }
Beispiel #17
0
 public static Constant GetConstant(this ConstantHandle handle, MetadataReader reader) => reader.GetConstant(handle);
 public ReaderConstantValue(MetadataReader reader, ConstantHandle handle)
 {
     this.reader = reader;
     this.handle = handle;
 }
        private Mapping<ConstantHandle> MapConstantImpl(ConstantHandle handle)
        {
            Constant constant = _sourceMetadata.GetConstant(handle);
            Mapping<Handle> parent = MapHandle(constant.Parent);
            if (parent.Target.IsNil)
                return new Mapping<ConstantHandle>();

            ConstantHandle targetHandle;
            switch (parent.Target.Kind)
            {
            case HandleKind.Parameter:
                Parameter targetParameter = _targetMetadata.GetParameter((ParameterHandle)parent.Target);
                targetHandle = targetParameter.GetDefaultValue();
                break;

            case HandleKind.FieldDefinition:
                FieldDefinition targetFieldDefinition = _targetMetadata.GetFieldDefinition((FieldDefinitionHandle)parent.Target);
                targetHandle = targetFieldDefinition.GetDefaultValue();
                break;

            case HandleKind.PropertyDefinition:
                PropertyDefinition targetPropertyDefinition = _targetMetadata.GetPropertyDefinition((PropertyDefinitionHandle)parent.Target);
                targetHandle = targetPropertyDefinition.GetDefaultValue();
                break;

            default:
                throw new InvalidOperationException();
            }

            if (targetHandle.IsNil)
                return new Mapping<ConstantHandle>();

            Constant targetConstant = _targetMetadata.GetConstant(targetHandle);
            if (constant.TypeCode != targetConstant.TypeCode)
            {
                var candidateTargets = ImmutableArray.Create(targetHandle);
                var candidateReasons = ImmutableArray.Create("Mapped constant has a different type.");
                return new Mapping<ConstantHandle>(candidateTargets, candidateReasons);
            }

            ImmutableArray<byte> sourceContent = _sourceMetadata.GetBlobContent(constant.Value);
            ImmutableArray<byte> targetContent = _targetMetadata.GetBlobContent(targetConstant.Value);
            if (!sourceContent.SequenceEqual(targetContent))
            {
                var candidateTargets = ImmutableArray.Create(targetHandle);
                var candidateReasons = ImmutableArray.Create("Mapped constant has a different value.");
                return new Mapping<ConstantHandle>(candidateTargets, candidateReasons);
            }

            return new Mapping<ConstantHandle>(targetHandle);
        }
Beispiel #20
0
 internal BlobHandle GetValue(ConstantHandle handle)
 {
     int rowOffset = (handle.RowId - 1) * this.RowSize;
     return BlobHandle.FromOffset(this.Block.PeekHeapReference(rowOffset + _ValueOffset, _IsBlobHeapRefSizeSmall));
 }
Beispiel #21
0
 private static bool IsNil(ConstantHandle x) => x.IsNil;
Beispiel #22
0
        public static object ToRawObject(this ConstantHandle constantHandle, MetadataReader metadataReader)
        {
            if (constantHandle.IsNil)
            {
                throw new BadImageFormatException();
            }

            Constant constantValue = metadataReader.GetConstant(constantHandle);

            if (constantValue.Value.IsNil)
            {
                throw new BadImageFormatException();
            }

            BlobReader reader = metadataReader.GetBlobReader(constantValue.Value);

            switch (constantValue.TypeCode)
            {
            case ConstantTypeCode.Boolean:
                return(reader.ReadBoolean());

            case ConstantTypeCode.Char:
                return(reader.ReadChar());

            case ConstantTypeCode.SByte:
                return(reader.ReadSByte());

            case ConstantTypeCode.Int16:
                return(reader.ReadInt16());

            case ConstantTypeCode.Int32:
                return(reader.ReadInt32());

            case ConstantTypeCode.Int64:
                return(reader.ReadInt64());

            case ConstantTypeCode.Byte:
                return(reader.ReadByte());

            case ConstantTypeCode.UInt16:
                return(reader.ReadUInt16());

            case ConstantTypeCode.UInt32:
                return(reader.ReadUInt32());

            case ConstantTypeCode.UInt64:
                return(reader.ReadUInt64());

            case ConstantTypeCode.Single:
                return(reader.ReadSingle());

            case ConstantTypeCode.Double:
                return(reader.ReadDouble());

            case ConstantTypeCode.String:
                return(reader.ReadUTF16(reader.Length));

            case ConstantTypeCode.NullReference:
                // Partition II section 22.9:
                // The encoding of Type for the nullref value is ELEMENT_TYPE_CLASS with a Value of a 4-byte zero.
                // Unlike uses of ELEMENT_TYPE_CLASS in signatures, this one is not followed by a type token.
                if (reader.ReadUInt32() == 0)
                {
                    return(null);
                }
                break;
            }
            throw new BadImageFormatException();
        }
 public Mapping <ConstantHandle> MapConstant(ConstantHandle handle)
 {
     return(_constants.GetOrAdd(handle, MapConstantImpl));
 }
Beispiel #24
0
        public void IsNil()
        {
            Assert.False(ModuleDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(AssemblyDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(InterfaceImplementationHandle.FromRowId(1).IsNil);
            Assert.False(MethodDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(MethodSpecificationHandle.FromRowId(1).IsNil);
            Assert.False(TypeDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(ExportedTypeHandle.FromRowId(1).IsNil);
            Assert.False(TypeReferenceHandle.FromRowId(1).IsNil);
            Assert.False(TypeSpecificationHandle.FromRowId(1).IsNil);
            Assert.False(MemberReferenceHandle.FromRowId(1).IsNil);
            Assert.False(FieldDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(EventDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(PropertyDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(StandaloneSignatureHandle.FromRowId(1).IsNil);
            Assert.False(MemberReferenceHandle.FromRowId(1).IsNil);
            Assert.False(FieldDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(EventDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(PropertyDefinitionHandle.FromRowId(1).IsNil);
            Assert.False(ParameterHandle.FromRowId(1).IsNil);
            Assert.False(GenericParameterHandle.FromRowId(1).IsNil);
            Assert.False(GenericParameterConstraintHandle.FromRowId(1).IsNil);
            Assert.False(ModuleReferenceHandle.FromRowId(1).IsNil);
            Assert.False(CustomAttributeHandle.FromRowId(1).IsNil);
            Assert.False(DeclarativeSecurityAttributeHandle.FromRowId(1).IsNil);
            Assert.False(ManifestResourceHandle.FromRowId(1).IsNil);
            Assert.False(ConstantHandle.FromRowId(1).IsNil);
            Assert.False(ManifestResourceHandle.FromRowId(1).IsNil);
            Assert.False(AssemblyFileHandle.FromRowId(1).IsNil);
            Assert.False(MethodImplementationHandle.FromRowId(1).IsNil);
            Assert.False(AssemblyReferenceHandle.FromRowId(1).IsNil);

            Assert.False(((EntityHandle)ModuleDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)AssemblyDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)InterfaceImplementationHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)MethodDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)MethodSpecificationHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)TypeDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)ExportedTypeHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)TypeReferenceHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)TypeSpecificationHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)MemberReferenceHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)FieldDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)EventDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)PropertyDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)StandaloneSignatureHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)MemberReferenceHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)FieldDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)EventDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)PropertyDefinitionHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)ParameterHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)GenericParameterHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)GenericParameterConstraintHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)ModuleReferenceHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)CustomAttributeHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)DeclarativeSecurityAttributeHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)ManifestResourceHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)ConstantHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)ManifestResourceHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)AssemblyFileHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)MethodImplementationHandle.FromRowId(1)).IsNil);
            Assert.False(((EntityHandle)AssemblyReferenceHandle.FromRowId(1)).IsNil);

            Assert.False(StringHandle.FromOffset(1).IsNil);
            Assert.False(BlobHandle.FromOffset(1).IsNil);
            Assert.False(UserStringHandle.FromOffset(1).IsNil);
            Assert.False(GuidHandle.FromIndex(1).IsNil);

            Assert.False(((Handle)StringHandle.FromOffset(1)).IsNil);
            Assert.False(((Handle)BlobHandle.FromOffset(1)).IsNil);
            Assert.False(((Handle)UserStringHandle.FromOffset(1)).IsNil);
            Assert.False(((Handle)GuidHandle.FromIndex(1)).IsNil);

            Assert.True(ModuleDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(AssemblyDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(InterfaceImplementationHandle.FromRowId(0).IsNil);
            Assert.True(MethodDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(MethodSpecificationHandle.FromRowId(0).IsNil);
            Assert.True(TypeDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(ExportedTypeHandle.FromRowId(0).IsNil);
            Assert.True(TypeReferenceHandle.FromRowId(0).IsNil);
            Assert.True(TypeSpecificationHandle.FromRowId(0).IsNil);
            Assert.True(MemberReferenceHandle.FromRowId(0).IsNil);
            Assert.True(FieldDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(EventDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(PropertyDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(StandaloneSignatureHandle.FromRowId(0).IsNil);
            Assert.True(MemberReferenceHandle.FromRowId(0).IsNil);
            Assert.True(FieldDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(EventDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(PropertyDefinitionHandle.FromRowId(0).IsNil);
            Assert.True(ParameterHandle.FromRowId(0).IsNil);
            Assert.True(GenericParameterHandle.FromRowId(0).IsNil);
            Assert.True(GenericParameterConstraintHandle.FromRowId(0).IsNil);
            Assert.True(ModuleReferenceHandle.FromRowId(0).IsNil);
            Assert.True(CustomAttributeHandle.FromRowId(0).IsNil);
            Assert.True(DeclarativeSecurityAttributeHandle.FromRowId(0).IsNil);
            Assert.True(ManifestResourceHandle.FromRowId(0).IsNil);
            Assert.True(ConstantHandle.FromRowId(0).IsNil);
            Assert.True(ManifestResourceHandle.FromRowId(0).IsNil);
            Assert.True(AssemblyFileHandle.FromRowId(0).IsNil);
            Assert.True(MethodImplementationHandle.FromRowId(0).IsNil);
            Assert.True(AssemblyReferenceHandle.FromRowId(0).IsNil);

            Assert.True(((EntityHandle)ModuleDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)AssemblyDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)InterfaceImplementationHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)MethodDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)MethodSpecificationHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)TypeDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)ExportedTypeHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)TypeReferenceHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)TypeSpecificationHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)MemberReferenceHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)FieldDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)EventDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)PropertyDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)StandaloneSignatureHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)MemberReferenceHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)FieldDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)EventDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)PropertyDefinitionHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)ParameterHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)GenericParameterHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)GenericParameterConstraintHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)ModuleReferenceHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)CustomAttributeHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)DeclarativeSecurityAttributeHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)ManifestResourceHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)ConstantHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)ManifestResourceHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)AssemblyFileHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)MethodImplementationHandle.FromRowId(0)).IsNil);
            Assert.True(((EntityHandle)AssemblyReferenceHandle.FromRowId(0)).IsNil);

            // heaps:
            Assert.True(StringHandle.FromOffset(0).IsNil);
            Assert.True(BlobHandle.FromOffset(0).IsNil);
            Assert.True(UserStringHandle.FromOffset(0).IsNil);
            Assert.True(GuidHandle.FromIndex(0).IsNil);

            Assert.True(((Handle)StringHandle.FromOffset(0)).IsNil);
            Assert.True(((Handle)BlobHandle.FromOffset(0)).IsNil);
            Assert.True(((Handle)UserStringHandle.FromOffset(0)).IsNil);
            Assert.True(((Handle)GuidHandle.FromIndex(0)).IsNil);

            // virtual:
            Assert.False(AssemblyReferenceHandle.FromVirtualIndex(0).IsNil);
            Assert.False(StringHandle.FromVirtualIndex(0).IsNil);
            Assert.False(BlobHandle.FromVirtualIndex(0, 0).IsNil);

            Assert.False(((Handle)AssemblyReferenceHandle.FromVirtualIndex(0)).IsNil);
            Assert.False(((Handle)StringHandle.FromVirtualIndex(0)).IsNil);
            Assert.False(((Handle)BlobHandle.FromVirtualIndex(0, 0)).IsNil);
        }
Beispiel #25
0
 internal BlobHandle GetValue(ConstantHandle handle)
 {
     int rowOffset = (int)(handle.RowId - 1) * this.RowSize;
     return BlobHandle.FromIndex(this.Block.PeekReference(rowOffset + this.ValueOffset, this.IsBlobHeapRefSizeSmall));
 }