[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