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)); }
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)); }