[svn] r5993: nemerle/trunk/ncc: testsuite/positive/yield.n
typing/TypedTree.n typing/Typer.n
malekith
svnadmin at nemerle.org
Sun Dec 4 13:07:14 CET 2005
Log:
yield: fix references to instance variables of declaring class.
Author: malekith
Date: Sun Dec 4 13:07:13 2005
New Revision: 5993
Modified:
nemerle/trunk/ncc/testsuite/positive/yield.n
nemerle/trunk/ncc/typing/TypedTree.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 Sun Dec 4 13:07:13 2005
@@ -10,12 +10,43 @@
}
}
+[Record]
+class D : IEnumerable [string]
+{
+ mutable a : int;
+ ene : string;
+ due : string;
+ static rabe : string = "trzy";
+
+ public GetEnumerator () : IEnumerator [string]
+ {
+ ++a;
+ do_get (a)
+ }
+
+ do_get (qux : int) : IEnumerator [string]
+ {
+ // yield qux.ToString ();
+ yield ene;
+ yield this.due;
+ yield rabe;
+ }
+}
+
foreach (e in C ())
System.Console.WriteLine (e);
foreach (e in C ())
System.Console.WriteLine (e);
+def d = D (3, "raz", "dwa");
+
+foreach (e in d)
+ System.Console.WriteLine (e);
+
+foreach (e in d)
+ System.Console.WriteLine (e);
+
/*
BEGIN-OUTPUT
42
@@ -24,5 +55,11 @@
42
13
77
+raz
+dwa
+trzy
+raz
+dwa
+trzy
END-OUTPUT
*/
Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n (original)
+++ nemerle/trunk/ncc/typing/TypedTree.n Sun Dec 4 13:07:13 2005
@@ -432,7 +432,7 @@
| This
| Base { base_ctor : IMethod; }
| TypeConversion { mutable expr : TExpr; target_type : TyVar; kind : ConversionKind; }
- | Sequence { e1 : TExpr; mutable e2 : TExpr; }
+ | Sequence { mutable e1 : TExpr; mutable e2 : TExpr; }
| Tuple { args : list [TExpr]; }
| Array { args : list [TExpr]; dimensions : list [TExpr]; }
| TypeOf { target_type : TyVar; }
@@ -452,7 +452,7 @@
// invalid after T3
| DefFunctionsIn { funs : list [Fun_header]; mutable body : TExpr; }
- | Match { expr : TExpr; mutable cases : list [Match_case]; }
+ | Match { expr : TExpr; cases : list [Match_case]; }
| SelfTailCall { parms : list [Parm]; }
| LocalFunRef { decl : LocalValue; type_parms : list [TyVar]; }
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Sun Dec 4 13:07:13 2005
@@ -1409,7 +1409,9 @@
| PT.PExpr.This =>
- if (is_method) {
+ if (inside_yielding_function)
+ TypeExpr (<[ $(This () : typed)._N_this ]>, expected)
+ else if (is_method) {
_ = Expect (expected, current_type.GetMemType (), "`this'");
This ()
} else
@@ -2353,11 +2355,16 @@
match (expr) {
// FIXME | PT.PExpr.ToComplete
| PT.PExpr.Ref (name) when is_method =>
+ def th () {
+ if (inside_yielding_function) TypeExpr (<[ this ]>)
+ else This ()
+ }
+
solver.PushState ();
- def res = Option.UnSome (TypeMember (This (), name.Id, expected));
+ def res = Option.UnSome (TypeMember (th (), name.Id, expected));
solver.PopState ();
if (res.IsEmpty) []
- else Option.UnSome (TypeMember (This (), name.Id, expected))
+ else Option.UnSome (TypeMember (th (), name.Id, expected))
| _ => []
};
@@ -3048,7 +3055,7 @@
public MoveNext () : bool
{
_N_MoveNext_exit : {
- match (_N_state) {
+ match (-42) {
// AddYieldStateMachine will add something here
| 0 => {}
| _ => _N_MoveNext_exit (false)
@@ -3140,7 +3147,7 @@
AddYieldStateMachine (e : TExpr) : void
{
match (e) {
- | Block (_, Block (_, Sequence (Match as m, _))) =>
+ | Block (_, Block (_, Sequence (Match as m, _) as s)) =>
mutable cnt = 1;
def cases = yield_labels.Rev ().Map (fun (id) {
def cntpat = Pattern.Literal (InternalType.Int32, Literal.FromInt (cnt));
@@ -3148,7 +3155,9 @@
def yes = TExpr.Literal (InternalType.Boolean, Literal.Bool (true));
Match_case ([(cntpat, yes, [])], TExpr.Goto (m.Type, id, 1), false)
});
- m.cases = cases + m.cases;
+ def state =
+ TypeExpr (<[ $(This () : typed)._N_state ]>, InternalType.Int32);
+ s.e1 = TExpr.Match (m.Type, state, cases + m.cases)
| _ => Util.ice ($ "e = $e")
}
}
More information about the svn
mailing list