[svn] r6008: nemerle/trunk/ncc: testsuite/positive/yield.n typing/Typer.n

malekith svnadmin at nemerle.org
Thu Dec 15 13:39:46 CET 2005


Log:
Add yield labels to function at the correct level.

Author: malekith
Date: Thu Dec 15 13:39:46 2005
New Revision: 6008

Modified:
   nemerle/trunk/ncc/testsuite/positive/yield.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/testsuite/positive/yield.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/yield.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/yield.n	Thu Dec 15 13:39:46 2005
@@ -33,6 +33,15 @@
   }
 }
 
+class E : IEnumerable [int] 
+{
+  public GetEnumerator () : IEnumerator [int]
+  {
+    for (mutable i = 1; i < 5; ++i)
+      yield i;
+  }
+}
+
 foreach (e in C ())
   System.Console.WriteLine (e);
 
@@ -47,6 +56,9 @@
 foreach (e in d)
   System.Console.WriteLine (e);
 
+foreach (e in E ())
+  System.Console.WriteLine (e);
+
 /*
 BEGIN-OUTPUT
 42
@@ -63,5 +75,9 @@
 raz
 dwa
 trzy
+1
+2
+3
+4
 END-OUTPUT
 */

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Thu Dec 15 13:39:46 2005
@@ -68,7 +68,7 @@
     
     mutable inside_yielding_function : bool;
     yield_stuff : option [PT.PExpr * list [PT.Fun_parm]];
-    mutable yield_labels : list [int] = [];
+    mutable yield_labels : list [int];
 
     #region Toplevel typing
     class SwitchToYielding : System.Exception { }
@@ -265,6 +265,12 @@
         })
       }
 
+      when (inside_yielding_function &&
+            current_fun.name == "_N_yielding_function") {
+        Util.cassert (yield_labels == null); 
+        yield_labels = [];
+      }
+
       match (current_fun.body) {
         | FunBody.Parsed (e) =>
           def skip_n_return =
@@ -3096,10 +3102,9 @@
     {
       Util.cassert (solver.IsTopLevel);
       def label_no = Util.next_id ();
-      yield_labels ::= label_no;
+      def state_no = AddYieldLabel (label_no);
       def label =
         TExpr.Label (InternalType.Void, label_no, VoidLiteral ());
-      def state_no = yield_labels.Length;
       
       TypeExpr (<[ 
         {
@@ -3111,6 +3116,18 @@
       ]>)
     }
 
+
+    AddYieldLabel (no : int) : int
+    {
+      if (yield_labels == null)
+        Option.UnSome (parent_typer).AddYieldLabel (no)
+      else {
+        yield_labels ::= no;
+        yield_labels.Length
+      }
+    }
+
+
     AddYieldStateMachine (e : TExpr) : void
     {
       match (e) {



More information about the svn mailing list