Modified: MacRuby/trunk/compiler.cpp (5269 => 5270)
--- MacRuby/trunk/compiler.cpp 2011-03-10 00:01:04 UTC (rev 5269)
+++ MacRuby/trunk/compiler.cpp 2011-03-10 02:00:13 UTC (rev 5270)
@@ -3041,7 +3041,7 @@
}
Value *
-RoxorCompiler::compile_call(NODE *node)
+RoxorCompiler::compile_call(NODE *node, bool use_tco)
{
NODE *recv = node->nd_recv;
NODE *args = node->nd_args;
@@ -3105,8 +3105,9 @@
}
// Recursive method call optimization. Not for everyone.
- if (!block_given && !super_call && !splat_args && !block_declaration
- && positive_arity && mid == current_mid && recv == NULL) {
+ if (use_tco && !block_given && !super_call && !splat_args
+ && !block_declaration && positive_arity && mid == current_mid
+ && recv == NULL) {
Function *f = bb->getParent();
const unsigned long argc = args == NULL ? 0 : args->nd_alen;
@@ -3146,10 +3147,7 @@
// Compile regular dispatch call.
bb = elseBB;
- ID old_current_mid = current_mid;
- current_mid = 0; // To force a normal dispatch compilation.
- Value *unoptz_value = compile_call(node);
- current_mid = old_current_mid;
+ Value *unoptz_value = compile_call(node, false);
elseBB = bb;
BranchInst::Create(mergeBB, bb);
Modified: MacRuby/trunk/compiler.h (5269 => 5270)
--- MacRuby/trunk/compiler.h 2011-03-10 00:01:04 UTC (rev 5269)
+++ MacRuby/trunk/compiler.h 2011-03-10 02:00:13 UTC (rev 5270)
@@ -339,7 +339,7 @@
Value *compile_node0(NODE *node);
Function *compile_scope(NODE *node);
- Value *compile_call(NODE *node);
+ Value *compile_call(NODE *node, bool use_tco=true);
Value *compile_yield(NODE *node);
Instruction *compile_protected_call(Value *imp, Value **args_begin,
Value **args_end);