[svn] r5990: nemerle/trunk/ncc: generation/Typer3.n testsuite/positive/closures.n typing/Typer2.n

malekith svnadmin at nemerle.org
Thu Dec 1 10:19:00 CET 2005


Log:
When a local function is expanded to a loop, move its closure variables to parent's function closure.

Author: malekith
Date: Thu Dec  1 10:18:59 2005
New Revision: 5990

Modified:
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/testsuite/positive/closures.n
   nemerle/trunk/ncc/typing/Typer2.n

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Thu Dec  1 10:18:59 2005
@@ -430,6 +430,8 @@
     {
       if (hd.id == current_method.id) {
         PlainRef (current_closure)
+      } else if (hd.usage == FunctionUsage.UsedJustOnce) {
+        ClosureRef (hd.decl.DefinedIn)
       } else if (closure_fields == null) {
         Util.cassert (closure_parms != null);
         Util.cassert (closure_parms.Contains (hd.id), $ "no clo parm for $(hd.name)");

Modified: nemerle/trunk/ncc/testsuite/positive/closures.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/closures.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/closures.n	Thu Dec  1 10:18:59 2005
@@ -27,11 +27,21 @@
         assert (foo.Hello == 42);
         Nemerle.IO.printf("%d\n",foo.Hello);
         
-def foo () {
+        def foo () {
   try { 4242 } finally { System.Console.WriteLine ("foo"); }
-}
+        }
+
+        System.Console.WriteLine (None ().WithDefault (foo ()));
 
-System.Console.WriteLine (None ().WithDefault (foo ()))
+        ble: {
+          def l = [1,2,3];
+          foreach (x in l) {
+            _ = fun () { x }
+            when (x > 2) ble ();
+          }
+          System.Console.WriteLine ("oops");
+        }
+        System.Console.WriteLine ("qux");
   }
 
   public static Bug581 () : void
@@ -55,5 +65,6 @@
 42
 foo
 4242
+qux
 END-OUTPUT
 */

Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n	(original)
+++ nemerle/trunk/ncc/typing/Typer2.n	Thu Dec  1 10:18:59 2005
@@ -64,6 +64,7 @@
     public this (ty : TypeBuilder, fn : MethodBuilder, used_yield : bool)
     {
       current_fun = fn.GetHeader ();
+      current_fun.usage = FunctionUsage.Used;
       top_level_fun = fn;
       current_type = ty;
       this.used_yield = used_yield;
@@ -396,10 +397,13 @@
 
       foreach (v in locals)
         match (v.ValKind) {
-          | LocalValue.Kind.Function (h, _) 
-            when !h.closure_vars.IsEmpty || !h.typarms.IsEmpty =>
-            // we cannot yet deal with expanding these to loops
+          | LocalValue.Kind.Function (h, _) =>
             when (h.usage == FunctionUsage.UsedJustOnce)
+              if (h.typarms is []) {
+                current_fun.closure_vars += h.closure_vars;
+                h.closure_vars = [];
+              } else
+                // we cannot yet deal with expanding these to loops
               h.usage = FunctionUsage.Used
           | _ => ()
         }
@@ -430,7 +434,7 @@
               Message.Error (v.loc, $ "cannot store ref/out parameters in"
                                       " closures ($v)");
             | _ => ()
-          };
+          }
           v.InClosure = true;
           v.DefinedIn.closure_vars = v :: v.DefinedIn.closure_vars;
         }
@@ -656,7 +660,7 @@
 
 
     [Nemerle.NotImplemented]
-    ExpandYield (expr : TExpr) : TExpr
+    static ExpandYield (expr : TExpr) : TExpr
     {
     }
 



More information about the svn mailing list