Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjbevain <jbevain@gmail.com>2010-09-07 19:20:59 +0400
committerjbevain <jbevain@gmail.com>2010-09-07 19:20:59 +0400
commit37d907f7c5670efb8f44a3fa2aabb7c04075e2ae (patch)
tree33282d88d149c61b2232d9bde00274fa3b752265
parent9fc6e2198f3bd60f18f4a6e6739df46b5d35df34 (diff)
Fix constant type coalescing
-rw-r--r--Mono.Cecil/AssemblyWriter.cs58
1 files 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);
}
}