[svn] r6010: nemerle/trunk/ncc: generation/ILEmitter.n generation/Typer3.n hierarchy/ClassMembers.n typing...

malekith svnadmin at nemerle.org
Thu Dec 15 22:35:31 CET 2005


Log:
Clean some yield stuff up. Make it work more.

Author: malekith
Date: Thu Dec 15 22:35:29 2005
New Revision: 6010

Modified:
   nemerle/trunk/ncc/generation/ILEmitter.n
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/typing/TypedTree.n
   nemerle/trunk/ncc/typing/Typer.n
   nemerle/trunk/ncc/typing/Typer2.n

Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n	Thu Dec 15 22:35:29 2005
@@ -80,6 +80,7 @@
       when (type_.TyparmsCount > 0)
         match (type_.GetMembers ().Find (is_proper_method)) {
           | Some (m) =>
+            //Message.Debug ($ "tot=$type_of_this m=$m");
             _ = TypeBuilder.GetMethod (type_of_this, 
                                        m.GetHandle () :> Emit.MethodBuilder);
           | None => {}

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Thu Dec 15 22:35:29 2005
@@ -428,14 +428,15 @@
     /** Return code referencing closure of [hd].  */
     ClosureRef (hd : Fun_header) : TExpr
     {
-      if (current_method.name == "_N_yielding_function") {
+      if (hd.usage == FunctionUsage.UsedJustOnce) {
+        ClosureRef (hd.decl.DefinedIn)
+      } else if (current_method.name == "_N_yielding_function") {
+        // Message.Debug ($ "lookup $(hd.name) from $(current_method.name)");
         Util.cassert (hd.id == current_method.id ||
                       current_method.decl.DefinedIn.id == hd.id);
         TExpr.This (local_function_type.GetMemType ())
       } else 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)");
@@ -659,16 +660,14 @@
     }
 
 
-    PrepareEnumeratorObject () : Parsetree.ClassMember
+    static PrepareEnumeratorObject (yield_type : TyVar) : Parsetree.ClassMember
     {
-      def yield_type = Option.UnSome (the_method.yield_stuff) [0];
-
       <[ decl:
         class $(Macros.NewSymbol ("Enumerator") : name) :
           System.Collections.IEnumerator,
-          System.Collections.Generic.IEnumerator [$yield_type]
+          System.Collections.Generic.IEnumerator [$(yield_type : typed)]
         {
-          public Current : $yield_type
+          public Current : $(yield_type : typed)
           {
             get { this._N_current }
           }
@@ -726,15 +725,17 @@
             subst.Apply (t.DeepFix ())
         }
 
+        def uses_yield = current_local_fun.yield_type != null;
+
         def clo_decl = 
-          if (the_method.yield_stuff.IsNone)
+          if (!uses_yield)
             <[ decl:
               private sealed class $(Macros.NewSymbol ("closure") : name)
               {
                 internal this () {}
               }
             ]>
-          else PrepareEnumeratorObject ();
+          else PrepareEnumeratorObject (fix_type (current_local_fun.yield_type));
 
         def clo_type = CurrentType.DefineNestedType (clo_decl, do_fixup = false);
         clo_type.forced_typarms = new_tp;
@@ -785,7 +786,7 @@
         clo_type.HasBeenUsed = true;
         clo_type.Compile ();
 
-        when (the_method.yield_stuff.IsSome)
+        when (uses_yield)
           SetEnumeratorBody (clo_type, subst);
 
         [TExpr.DefValIn (InternalType.Void, closure_val, ctor_call, null)]

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Thu Dec 15 22:35:29 2005
@@ -598,8 +598,6 @@
 
   internal mutable overridden_method : IMethod;
 
-  internal mutable yield_stuff : option [PT.PExpr * list [PT.Fun_parm]] = None ();
-
   is_var_args : bool;
 
   public GetMethodBase () : MethodBase
@@ -848,21 +846,8 @@
         | (x, _) => x
       };
 
-    def ret_type = bind (f.header.ret_type);
-    match (ret_type.Fix ()) {
-      | Class (tc, [_])
-        when tc.Equals (InternalType.Generic_IEnumerator_tc) =>
-        match (f.header.ret_type) {
-          | <[ $_ [ $t ] ]> =>
-            // we need it at the parsetree level
-            yield_stuff = Some ((t, f.header.parms));
-          | _ => {}
-        }
-      | _ => {}
-    }
-
     fun_header = Fun_header (
-      ret_type = ret_type,
+      ret_type = bind (f.header.ret_type),
       typarms = typarms,
       name = this.name,
       parms = parms,

Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n	(original)
+++ nemerle/trunk/ncc/typing/TypedTree.n	Thu Dec 15 22:35:29 2005
@@ -222,6 +222,7 @@
     public mutable all_locals : list [LocalValue] = [];
     internal mutable children_funs : list [Fun_header] = [];
     internal mutable uses_try_block : bool;
+    internal mutable yield_type : TyVar;
 
     // FIXME: move to hashtables in t3
     internal mutable used_closures : list [Fun_header];

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Thu Dec 15 22:35:29 2005
@@ -67,7 +67,6 @@
     mutable skip_n_return : bool;
     
     mutable inside_yielding_function : bool;
-    yield_stuff : option [PT.PExpr * list [PT.Fun_parm]];
     mutable yield_labels : list [int];
 
     #region Toplevel typing
@@ -79,8 +78,6 @@
     {
       solver = Passes.Solver;
       current_type = m.DeclaringType;
-      yield_stuff = m.yield_stuff;
-      m.yield_stuff = None ();
       parent_typer = None ();
       env = current_type.GlobalEnv;
       current_fun = m.GetHeader ();
@@ -148,11 +145,11 @@
                 
             | _ is SwitchToYielding =>
               log (TYPING, "got STY, trying again");
-              m.yield_stuff = yield_stuff;
+              current_fun.yield_type = GetYieldType ();
               def errcnt = Message.ErrorCount;
               // just in case
               put_in_error_mode ();
-              m.Body = MakeEnumeratorClass (m.Body);
+              m.Body = WrapYieldingFunction (m.Body);
               inside_yielding_function = true;
               when (errcnt == Message.ErrorCount)
                 RunTyper ();
@@ -3035,7 +3032,7 @@
             }
           } else if (ns.Equals (yield_macro)) {
             when (! inside_yielding_function) {
-              _ = GetYieldStuff ();
+              _ = GetYieldType ();
               log (TYPING, "throwing STY");
               throw SwitchToYielding ();
             }
@@ -3050,13 +3047,13 @@
     
 
     #region yield handling
-    MakeEnumeratorClass (body : PT.PExpr) : PT.PExpr
+    WrapYieldingFunction (body : PT.PExpr) : PT.PExpr
     {
-      def (yield_type, _) = GetYieldStuff ();
+      def yield_type = GetYieldType ();
 
       def new_body =
         <[
-          mutable _N_current = Nemerle.Extensions.DefaultValue ($yield_type);
+          mutable _N_current = $(TExpr.DefaultValue (yield_type) : typed);
           mutable _N_state = 0;
 
           def _N_yielding_function () : bool
@@ -3082,20 +3079,20 @@
     }
 
 
-    GetYieldStuff () : PT.PExpr * list [PT.Fun_parm]
+    GetYieldType () : TyVar
     {
       match (parent_typer) {
-        | Some (t) => t.GetYieldStuff ()
-        | None =>
-          match (yield_stuff) {
-            | Some (x) => x
+        | Some (t) => t.GetYieldType ()
             | None =>
+          match (current_fun.ret_type.Fix ()) {
+            | Class (tc, [t])
+              when tc.Equals (InternalType.Generic_IEnumerator_tc) => t
+            | t =>
               ReportError (messenger,
                            $ "yield used in a function returning "
-                             "$(current_fun.ret_type) (it "
-                             "should be System.Collections.Generic."
+                             "$t (it should be System.Collections.Generic."
                              "IEnumerator[T])");
-              (<[ object ]>, [])
+              InternalType.Object
          }
       }
     }

Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n	(original)
+++ nemerle/trunk/ncc/typing/Typer2.n	Thu Dec 15 22:35:29 2005
@@ -72,7 +72,7 @@
 
       messenger = Passes.Solver.CurrentMessenger;
 
-      inside_yielding_function = fn.yield_stuff.IsSome;
+      inside_yielding_function =  current_fun.yield_type != null;
     }
     
 



More information about the svn mailing list