[svn] r6004: nemerle/trunk/ncc/generation: ILEmitter.n Typer4.n

malekith svnadmin at nemerle.org
Wed Dec 7 10:56:58 CET 2005


Log:
Don't emit tail call when we need Constrained, or some parameters (including this!) are passed byref. Needs testcases for this stuff.

Author: malekith
Date: Wed Dec  7 10:56:57 2005
New Revision: 6004

Modified:
   nemerle/trunk/ncc/generation/ILEmitter.n
   nemerle/trunk/ncc/generation/Typer4.n

Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n	Wed Dec  7 10:56:57 2005
@@ -998,8 +998,17 @@
           emit_parms (method_params);
           Mark (expr.loc);
 
-          when (base_object.NeedsConstrained)
+          if (base_object.NeedsConstrained) {
+            def is_tail = expr.GenerateTail;
+            when (is_tail) {
+              expr.GenerateTail = false;
+              _ilg.Emit (OpCodes.Tailcall);
+            }
             _ilg.Emit (OpCodes.Constrained, base_object.SystemType);
+            emit_method_call (expr, is_value_type || notvirt, method_inf);
+            when (is_tail)
+              _ilg.Emit (OpCodes.Ret);
+          } else
           emit_method_call (expr, is_value_type || notvirt, method_inf)
 
 

Modified: nemerle/trunk/ncc/generation/Typer4.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer4.n	(original)
+++ nemerle/trunk/ncc/generation/Typer4.n	Wed Dec  7 10:56:57 2005
@@ -360,7 +360,18 @@
             else
               if (is_top && Options.GeneralTailCallOpt) {
                 expr.GenerateTail = true;
-                true
+                foreach (p in parms)
+                  when (p.kind != ParmKind.Normal)
+                    expr.GenerateTail = false;
+
+                match (func) {
+                  | MethodRef (obj = obj)
+                    when obj.NeedsConstrained || obj.MType.IsValueType =>
+                    expr.GenerateTail = false;
+                  | _ => {}
+                }
+
+                expr.GenerateTail
               } else false
             
           | Tuple (exprs) =>



More information about the svn mailing list