From ac5fd58700b5576bfdd89ffe06dd4302b6721e5f Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 7 Dec 2023 14:53:05 -0800 Subject: YJIT: Fix on-stack ISEQ comparison for auto_compact (#9164) --- test/ruby/test_yjit.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'test/ruby') diff --git a/test/ruby/test_yjit.rb b/test/ruby/test_yjit.rb index e87e062948..de96a85ded 100644 --- a/test/ruby/test_yjit.rb +++ b/test/ruby/test_yjit.rb @@ -1102,6 +1102,31 @@ class TestYJIT < Test::Unit::TestCase RUBY end + def test_code_gc_with_auto_compact + assert_compiles((code_gc_helpers + <<~'RUBY'), exits: :any, result: :ok, mem_size: 1, code_gc: true) + # Test ISEQ moves in the middle of code GC + GC.auto_compact = true + + fiber = Fiber.new { + # Loop to call the same basic block again after Fiber.yield + while true + Fiber.yield(nil.to_i) + end + } + + return :not_paged1 unless add_pages(250) # use some pages + return :broken_resume1 if fiber.resume != 0 # leave an on-stack code as well + + add_pages(2000) # use a whole lot of pages to run out of 1MiB + return :broken_resume2 if fiber.resume != 0 # on-stack code should be callable + + code_gc_count = RubyVM::YJIT.runtime_stats[:code_gc_count] + return :"code_gc_#{code_gc_count}" if code_gc_count == 0 + + :ok + RUBY + end + def test_code_gc_partial_last_page # call_threshold: 2 to avoid JIT-ing code_gc itself. If code_gc were JITed right before # code_gc is called, the last page would be on stack. -- cgit v1.2.3