public void CustomModifiersEncoder_AddModifier()
        {
            var b = new BlobBuilder();
            var e = new CustomModifiersEncoder(b);

            Assert.Same(b, e.Builder);

            var a = e.AddModifier(MetadataTokens.TypeDefinitionHandle(1), true);

            AssertEx.Equal(new byte[] { 0x20, 0x04 }, b.ToArray());
            Assert.Same(b, a.Builder);
            b.Clear();

            e.AddModifier(MetadataTokens.TypeReferenceHandle(1), false);
            AssertEx.Equal(new byte[] { 0x1f, 0x05 }, b.ToArray());
            b.Clear();

            e.AddModifier(MetadataTokens.TypeSpecificationHandle(1), false);
            AssertEx.Equal(new byte[] { 0x1f, 0x06 }, b.ToArray());
            b.Clear();

            AssertExtensions.Throws <ArgumentException>("type", () => e.AddModifier(default(EntityHandle), true));
            AssertExtensions.Throws <ArgumentException>("type", () => e.AddModifier(default(TypeDefinitionHandle), true));
            AssertExtensions.Throws <ArgumentException>("type", () => e.AddModifier(default(TypeReferenceHandle), true));
            AssertExtensions.Throws <ArgumentException>("type", () => e.AddModifier(default(TypeSpecificationHandle), true));
            AssertExtensions.Throws <ArgumentException>(null, () => e.AddModifier(MetadataTokens.FieldDefinitionHandle(1), true));
        }
        private BlobHandle SerializeLocalConstantSignature(ILocalDefinition localConstant)
        {
            var builder = new BlobBuilder();

            // TODO: BlobEncoder.LocalConstantSignature

            // CustomMod*
            var encoder = new CustomModifiersEncoder(builder);

            SerializeCustomModifiers(encoder, localConstant.CustomModifiers);

            var type     = localConstant.Type;
            var typeCode = type.TypeCode(Context);

            object value = localConstant.CompileTimeValue.Value;

            // PrimitiveConstant or EnumConstant
            if (value is decimal)
            {
                builder.WriteByte((byte)SignatureTypeKind.ValueType);
                builder.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(GetTypeHandle(type)));

                builder.WriteDecimal((decimal)value);
            }
            else if (value is DateTime)
            {
                builder.WriteByte((byte)SignatureTypeKind.ValueType);
                builder.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(GetTypeHandle(type)));

                builder.WriteDateTime((DateTime)value);
            }
            else if (typeCode == PrimitiveTypeCode.String)
            {
                builder.WriteByte((byte)ConstantTypeCode.String);
                if (value == null)
                {
                    builder.WriteByte(0xff);
                }
                else
                {
                    builder.WriteUTF16((string)value);
                }
            }
            else if (value != null)
            {
                // TypeCode
                builder.WriteByte((byte)GetConstantTypeCode(value));

                // Value
                builder.WriteConstant(value);

                // EnumType
                if (type.IsEnum)
                {
                    builder.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(GetTypeHandle(type)));
                }
            }
            else if (this.module.IsPlatformType(type, PlatformType.SystemObject))
            {
                builder.WriteByte((byte)SignatureTypeCode.Object);
            }
            else
            {
                builder.WriteByte((byte)(type.IsValueType ? SignatureTypeKind.ValueType : SignatureTypeKind.Class));
                builder.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(GetTypeHandle(type)));
            }

            return(_debugMetadataOpt.GetOrAddBlob(builder));
        }
Beispiel #3
0
        public void CustomModifiersEncoder_AddModifier()
        {
            var b = new BlobBuilder();
            var e = new CustomModifiersEncoder(b);
            Assert.Same(b, e.Builder);

            var a = e.AddModifier(MetadataTokens.TypeDefinitionHandle(1), true);
            AssertEx.Equal(new byte[] { 0x20, 0x04 }, b.ToArray());
            Assert.Same(b, a.Builder);
            b.Clear();

            e.AddModifier(MetadataTokens.TypeReferenceHandle(1), false);
            AssertEx.Equal(new byte[] { 0x1f, 0x05 }, b.ToArray());
            b.Clear();

            e.AddModifier(MetadataTokens.TypeSpecificationHandle(1), false);
            AssertEx.Equal(new byte[] { 0x1f, 0x06 }, b.ToArray());
            b.Clear();

            Assert.Throws<ArgumentException>(() => e.AddModifier(default(EntityHandle), true));
            Assert.Throws<ArgumentException>(() => e.AddModifier(default(TypeDefinitionHandle), true));
            Assert.Throws<ArgumentException>(() => e.AddModifier(default(TypeReferenceHandle), true));
            Assert.Throws<ArgumentException>(() => e.AddModifier(default(TypeSpecificationHandle), true));
            Assert.Throws<ArgumentException>(() => e.AddModifier(MetadataTokens.FieldDefinitionHandle(1), true));
        }