[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