[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