From 37d907f7c5670efb8f44a3fa2aabb7c04075e2ae Mon Sep 17 00:00:00 2001 From: jbevain Date: Tue, 7 Sep 2010 17:20:59 +0200 Subject: Fix constant type coalescing --- Mono.Cecil/AssemblyWriter.cs | 58 +++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/AssemblyWriter.cs index 8dbc117..3c64145 100644 --- a/Mono.Cecil/AssemblyWriter.cs +++ b/Mono.Cecil/AssemblyWriter.cs @@ -1646,6 +1646,21 @@ namespace Mono.Cecil { case ElementType.ByRef: case ElementType.Sentinel: return GetConstantType (((TypeSpecification) constant_type).ElementType, constant); + case ElementType.Boolean: + case ElementType.Char: + case ElementType.I: + case ElementType.I1: + case ElementType.I2: + case ElementType.I4: + case ElementType.I8: + case ElementType.U: + case ElementType.U1: + case ElementType.U2: + case ElementType.U4: + case ElementType.U8: + case ElementType.R4: + case ElementType.R8: + return constant == null ? etype : GetConstantType (constant.GetType ()); default: return etype; } @@ -1891,7 +1906,7 @@ namespace Mono.Cecil { signature.WriteConstantString ((string) value); break; default: - signature.WriteConstantPrimitive (type, value); + signature.WriteConstantPrimitive (value); break; } @@ -2200,9 +2215,9 @@ namespace Mono.Cecil { WriteBytes (Encoding.Unicode.GetBytes (value)); } - public void WriteConstantPrimitive (ElementType type, object value) + public void WriteConstantPrimitive (object value) { - WritePrimitiveValue (type, value); + WritePrimitiveValue (value); } public void WriteCustomAttributeConstructorArguments (CustomAttribute attribute) @@ -2285,52 +2300,55 @@ namespace Mono.Cecil { WriteCustomAttributeEnumValue (type, value); break; default: - WritePrimitiveValue (etype, value); + WritePrimitiveValue (value); break; } } - void WritePrimitiveValue (ElementType type, object value) + void WritePrimitiveValue (object value) { - switch (type) { - case ElementType.Boolean: + if (value == null) + throw new ArgumentNullException (); + + switch (Type.GetTypeCode (value.GetType ())) { + case TypeCode.Boolean: WriteByte ((byte) (((bool) value) ? 1 : 0)); break; - case ElementType.U1: + case TypeCode.Byte: WriteByte ((byte) value); break; - case ElementType.I1: - WriteByte ((byte) (sbyte) value); + case TypeCode.SByte: + WriteSByte ((sbyte) value); break; - case ElementType.I2: + case TypeCode.Int16: WriteInt16 ((short) value); break; - case ElementType.U2: + case TypeCode.UInt16: WriteUInt16 ((ushort) value); break; - case ElementType.Char: + case TypeCode.Char: WriteInt16 ((short) (char) value); break; - case ElementType.I4: + case TypeCode.Int32: WriteInt32 ((int) value); break; - case ElementType.U4: + case TypeCode.UInt32: WriteUInt32 ((uint) value); break; - case ElementType.R4: + case TypeCode.Single: WriteSingle ((float) value); break; - case ElementType.I8: + case TypeCode.Int64: WriteInt64 ((long) value); break; - case ElementType.U8: + case TypeCode.UInt64: WriteUInt64 ((ulong) value); break; - case ElementType.R8: + case TypeCode.Double: WriteDouble ((double) value); break; default: - throw new NotSupportedException (type.ToString ()); + throw new NotSupportedException (value.GetType ().FullName); } } -- cgit v1.2.3