[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