1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

merge revision(s) 56208,56663: [Backport #12905]

* compile.c (iseq_peephole_optimize): enable tail call
	  optimization inside a conditional block.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@56715 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2016-11-11 15:35:29 +00:00
parent a6f510959e
commit c5ee9b3868
4 changed files with 44 additions and 3 deletions

View file

@ -230,7 +230,7 @@ class TestRubyOptimization < Test::Unit::TestCase
assert_equal true, MyObj.new == nil
end
def self.tailcall(klass, src, file = nil, path = nil, line = nil)
def self.tailcall(klass, src, file = nil, path = nil, line = nil, tailcall: true)
unless file
loc, = caller_locations(1, 1)
file = loc.path
@ -238,7 +238,7 @@ class TestRubyOptimization < Test::Unit::TestCase
end
RubyVM::InstructionSequence.new("proc {|_|_.class_eval {#{src}}}",
file, (path || file), line,
tailcall_optimization: true,
tailcall_optimization: tailcall,
trace_instruction: false)
.eval[klass]
end
@ -334,6 +334,35 @@ class TestRubyOptimization < Test::Unit::TestCase
message(bug12565) {disasm(:add_one_and_two)})
end
def test_tailcall_condition_block
bug = '[ruby-core:78015] [Bug #12905]'
src = "#{<<-"begin;"}\n#{<<-"end;"}"
begin;
def run(current, final)
if current < final
run(current+1, final)
else
nil
end
end
end;
obj = Object.new
self.class.tailcall(obj.singleton_class, src, tailcall: false)
e = assert_raise(SystemStackError) {
obj.run(1, Float::INFINITY)
}
level = e.backtrace_locations.size
obj = Object.new
self.class.tailcall(obj.singleton_class, src, tailcall: true)
level *= 2
mesg = message {"#{bug}: #{$!.backtrace_locations.size} / #{level} stack levels"}
assert_nothing_raised(SystemStackError, mesg) {
obj.run(1, level)
}
end
class Bug10557
def [](_)
block_given?