mirror of
https://github.com/ruby/ruby.git
synced 2025-09-16 09:04:05 +02:00
compile.c: skip opt_* insns for fstr args with block given
* compile.c (iseq_compile_each): only emit opt_str_freeze, opt_aref_with, and opt_aset_with insn when no block is given [Bug #10557] [ruby-core:66595] * test/ruby/test_optimization.rb (test_block_given_aset_aref): new test for bug thanks to Bartosz Kopinski. (test_string_freeze): additional assertion for object_id git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48869 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
61a8e7ebf7
commit
fcf6fa8781
3 changed files with 51 additions and 3 deletions
|
@ -118,6 +118,7 @@ class TestRubyOptimization < Test::Unit::TestCase
|
|||
|
||||
def test_string_freeze
|
||||
assert_equal "foo", "foo".freeze
|
||||
assert_equal "foo".freeze.object_id, "foo".freeze.object_id
|
||||
assert_redefine_method('String', 'freeze', 'assert_nil "foo".freeze')
|
||||
end
|
||||
|
||||
|
@ -253,4 +254,39 @@ class TestRubyOptimization < Test::Unit::TestCase
|
|||
EOF
|
||||
assert_equal(123, delay { 123 }.call, bug6901)
|
||||
end
|
||||
|
||||
class Bug10557
|
||||
def [](_)
|
||||
block_given?
|
||||
end
|
||||
|
||||
def []=(_, _)
|
||||
block_given?
|
||||
end
|
||||
end
|
||||
|
||||
def test_block_given_aset_aref
|
||||
bug10557 = '[ruby-core:66595]'
|
||||
assert_equal(true, Bug10557.new.[](nil){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[](0){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[](false){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[](''){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[]=(nil, 1){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[]=(0, 1){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[]=(false, 1){}, bug10557)
|
||||
assert_equal(true, Bug10557.new.[]=('', 1){}, bug10557)
|
||||
end
|
||||
|
||||
def test_string_freeze_block
|
||||
assert_separately([], <<-"end;")# do
|
||||
class String
|
||||
undef freeze
|
||||
def freeze
|
||||
block_given?
|
||||
end
|
||||
end
|
||||
assert_equal(true, "block".freeze {})
|
||||
assert_equal(false, "block".freeze)
|
||||
end;
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue