1
0
Fork 0
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:
shugo 2012-08-22 02:25:16 +00:00
parent 7a69af7461
commit bf797ed9b0
3 changed files with 29 additions and 1 deletions

View file

@ -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.

View file

@ -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

View file

@ -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);