[svn] r6495: nemerle/trunk/ncc/generation/ILEmitter.n
dragonfox
svnadmin at nemerle.org
Tue Aug 8 22:48:13 CEST 2006
Log:
improve generated IL for TExpr.DefaultValue
Author: dragonfox
Date: Tue Aug 8 22:48:10 2006
New Revision: 6495
Modified:
nemerle/trunk/ncc/generation/ILEmitter.n
Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n (original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n Tue Aug 8 22:48:10 2006
@@ -624,16 +624,36 @@
| DefaultValue =>
- def ty = expr.SystemType;
- if (is_void (expr.MType)) {}
- else if (ty.IsValueType || ty.IsGenericParameter) {
+ match(expr.SystemType) {
+ | _ when is_void(expr.MType) => ()
+ | ty when ty.Equals (SystemTypeCache.Char)
+ | ty when ty.Equals (SystemTypeCache.Byte)
+ | ty when ty.Equals (SystemTypeCache.SByte)
+ | ty when ty.Equals (SystemTypeCache.Int16)
+ | ty when ty.Equals (SystemTypeCache.Int32)
+ | ty when ty.Equals (SystemTypeCache.UInt16)
+ | ty when ty.Equals (SystemTypeCache.UInt32)
+ | ty when ty.Equals (SystemTypeCache.Boolean) =>
+ _ilg.Emit (OpCodes.Ldc_I4_0);
+ | ty when ty.Equals (SystemTypeCache.Int64)
+ | ty when ty.Equals (SystemTypeCache.UInt64) =>
+ _ilg.Emit (OpCodes.Ldc_I4_0);
+ _ilg.Emit (OpCodes.Conv_I8);
+ | ty when ty.Equals (SystemTypeCache.Single) =>
+ _ilg.Emit (OpCodes.Ldc_R4, 0.0f);
+ | ty when ty.Equals (SystemTypeCache.Double) =>
+ _ilg.Emit (OpCodes.Ldc_R8, 0.0d);
+ | ty when ty.Equals (SystemTypeCache.Decimal) =>
+ _ilg.Emit (OpCodes.Ldc_I4_0);
+ _ilg.Emit (OpCodes.Newobj, ty.GetConstructor (array [SystemTypeCache.Int32]));
+ | ty when ty.IsValueType || ty.IsGenericParameter =>
def local_slot = _ilg.DeclareLocal (ty);
_ilg.Emit (OpCodes.Ldloca, local_slot);
_ilg.Emit (OpCodes.Initobj, ty);
_ilg.Emit (OpCodes.Ldloc, local_slot);
+ | _ => _ilg.Emit (OpCodes.Ldnull);
}
- else
- _ilg.Emit (OpCodes.Ldnull)
+
/* load runtime representation of given type */
| TypeOf (t) =>
More information about the svn
mailing list