summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
authorÉtienne Barrié <etienne.barrie@gmail.com>2024-07-29 12:15:02 +0200
committerJean Boussier <jean.boussier@gmail.com>2024-09-05 12:46:02 +0200
commita99707cd9c6a1d53cf8ebc883dc210219bd67a28 (patch)
treef435c276f693070ff3102ded5ed2cea3adcc1493 /test/ruby
parent63cbe3f6ac9feb44a2e43b1f853e2ca7e049316c (diff)
Optimized instruction for Array#freeze
If an Array which is empty or only using literals is frozen, we detect this as a peephole optimization and change the instructions to be `opt_ary_freeze`. [Feature #20684] Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/11406
Diffstat (limited to 'test/ruby')
-rw-r--r--test/ruby/test_optimization.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/test/ruby/test_optimization.rb b/test/ruby/test_optimization.rb
index a7a0582dbb..671f7d7ed5 100644
--- a/test/ruby/test_optimization.rb
+++ b/test/ruby/test_optimization.rb
@@ -749,6 +749,52 @@ class TestRubyOptimization < Test::Unit::TestCase
end
end
+ def test_peephole_array_freeze
+ code = "#{<<~'begin;'}\n#{<<~'end;'}"
+ begin;
+ [1].freeze
+ end;
+ iseq = RubyVM::InstructionSequence.compile(code)
+ insn = iseq.disasm
+ assert_match(/opt_ary_freeze/, insn)
+ assert_no_match(/duparray/, insn)
+ assert_no_match(/send/, insn)
+ assert_predicate([1].freeze, :frozen?)
+ assert_in_out_err([], <<~RUBY, [":ok"])
+ class Array
+ prepend Module.new {
+ def freeze
+ :ok
+ end
+ }
+ end
+ p [1].freeze
+ RUBY
+ end
+
+ def test_peephole_array_freeze_empty
+ code = "#{<<~'begin;'}\n#{<<~'end;'}"
+ begin;
+ [].freeze
+ end;
+ iseq = RubyVM::InstructionSequence.compile(code)
+ insn = iseq.disasm
+ assert_match(/opt_ary_freeze/, insn)
+ assert_no_match(/duparray/, insn)
+ assert_no_match(/send/, insn)
+ assert_predicate([].freeze, :frozen?)
+ assert_in_out_err([], <<~RUBY, [":ok"])
+ class Array
+ prepend Module.new {
+ def freeze
+ :ok
+ end
+ }
+ end
+ p [].freeze
+ RUBY
+ end
+
def test_branch_condition_backquote
bug = '[ruby-core:80740] [Bug #13444] redefined backquote should be called'
class << self