diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2023-04-14 15:04:55 -0400 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2023-04-14 18:01:14 -0400 |
commit | 31e67a476f2262e01a0829e8ab5e6d8a97e0724e (patch) | |
tree | d377bc8b6ca4ba6f390bd6679408ebbfa173f914 /bootstraptest | |
parent | 4501fb8b467cd40da5e160b82db7ea1a10d9e7ca (diff) | |
download | ruby-31e67a476f2262e01a0829e8ab5e6d8a97e0724e.tar.gz |
YJIT: Fix false object collection when setting ivar
Previously, setinstancevariable could generate code that calls
`rb_ensure_iv_list_size()` without first updating `cfp->sp`. This means
in the event that a GC start from within said routine the top few
objects would not be marked, causing them to be falsly collected.
Call `jit_prepare_routine_call()` first.
[Bug #19601]
Diffstat (limited to 'bootstraptest')
-rw-r--r-- | bootstraptest/test_yjit.rb | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/bootstraptest/test_yjit.rb b/bootstraptest/test_yjit.rb index 99de63eafa..7cf39f2126 100644 --- a/bootstraptest/test_yjit.rb +++ b/bootstraptest/test_yjit.rb @@ -1,3 +1,23 @@ +# Regression test for GC mishap while doing shape transition +assert_equal '[:ok]', %q{ + # [Bug #19601] + class RegressionTest + def initialize + @a = @b = @fourth_ivar_does_shape_transition = nil + end + + def extender + @first_extended_ivar = [:ok] + end + end + + GC.stress = true + + # Used to crash due to GC run in rb_ensure_iv_list_size() + # not marking the newly allocated [:ok]. + RegressionTest.new.extender.itself +} + assert_equal 'true', %q{ # regression test for tracking type of locals for too long def local_setting_cmp(five) |