[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