[svn] r5981: nemerle/trunk/ncc: generation/ILEmitter.n testsuite/positive/tail-call-opt.n

malekith svnadmin at nemerle.org
Tue Nov 29 20:13:54 CET 2005


Log:
Don't emit stores to non-existant parameters. Resolves #578.

Author: malekith
Date: Tue Nov 29 20:13:53 2005
New Revision: 5981

Modified:
   nemerle/trunk/ncc/generation/ILEmitter.n
   nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n

Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n	Tue Nov 29 20:13:53 2005
@@ -933,7 +933,10 @@
         | MultipleAssign (assigns) =>
           def emit_store (local_var : LocalValue, _) {
             Mark (local_var.Location);
-            store_local (local_var);
+            if (local_var.EverUsed)
+              store_local (local_var)
+            else
+              _ilg.Emit (OpCodes.Pop);
           }
           foreach ((_, e) in assigns) emit (e);
           List.Iter (List.Rev (assigns), emit_store);

Modified: nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/tail-call-opt.n	Tue Nov 29 20:13:53 2005
@@ -130,6 +130,19 @@
     }
   }
   
+  
+      Bug578 [a] (l : list [a]) : int
+      {
+        def loop (acc : int, x : list [a]) : int // W: never used
+        {
+          match (l) {
+            | _::xs => loop(acc + 1, xs)
+            | Nil  => 0
+          }
+        };
+        loop (0, l)
+      }
+  
   Main () : void {
     mutable sum = 0;
     for (mutable i = 0; i < 20000000; i = i + 1)



More information about the svn mailing list