mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* vm_insnhelper.c (vm_setup_method): should not enable tail call
optimization for frames with VM_FRAME_FLAG_FINISH. [ruby-dev:46065] [Bug #6901] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36771 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7a69af7461
commit
bf797ed9b0
3 changed files with 29 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Wed Aug 22 11:23:35 2012 Shugo Maeda <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
* vm_insnhelper.c (vm_setup_method): should not enable tail call
|
||||||
|
optimization for frames with VM_FRAME_FLAG_FINISH.
|
||||||
|
[ruby-dev:46065] [Bug #6901]
|
||||||
|
|
||||||
Wed Aug 22 11:20:47 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
Wed Aug 22 11:20:47 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* lib/rubygems/test_case.rb: run test with psych if exist.
|
* lib/rubygems/test_case.rb: run test with psych if exist.
|
||||||
|
|
|
@ -160,4 +160,25 @@ class TestRubyOptimization < Test::Unit::TestCase
|
||||||
EOF
|
EOF
|
||||||
assert_equal(9131, Tailcall.new.fact(3000).to_s.size, bug4082)
|
assert_equal(9131, Tailcall.new.fact(3000).to_s.size, bug4082)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_tailcall_with_block
|
||||||
|
bug6901 = '[ruby-dev:46065]'
|
||||||
|
|
||||||
|
option = {
|
||||||
|
tailcall_optimization: true,
|
||||||
|
trace_instruction: false,
|
||||||
|
}
|
||||||
|
iseq = RubyVM::InstructionSequence.new(<<-EOF, "Bug#6901", bug6901, nil, option).eval
|
||||||
|
def identity(val)
|
||||||
|
val
|
||||||
|
end
|
||||||
|
|
||||||
|
def delay
|
||||||
|
-> {
|
||||||
|
identity(yield)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
EOF
|
||||||
|
assert_equal(123, delay { 123 }.call, bug6901)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -510,7 +510,8 @@ vm_setup_method(rb_thread_t *th, rb_control_frame_t *cfp,
|
||||||
|
|
||||||
sp = rsp + iseq->arg_size;
|
sp = rsp + iseq->arg_size;
|
||||||
|
|
||||||
if (LIKELY(!(flag & VM_CALL_TAILCALL_BIT))) {
|
if (LIKELY(!(flag & VM_CALL_TAILCALL_BIT) ||
|
||||||
|
VM_FRAME_TYPE_FINISH_P(th->cfp))) {
|
||||||
if (0) printf("local_size: %d, arg_size: %d\n",
|
if (0) printf("local_size: %d, arg_size: %d\n",
|
||||||
iseq->local_size, iseq->arg_size);
|
iseq->local_size, iseq->arg_size);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue