Only mark cc->cme_
on valid imemo_callcache
We observed T_NONE on `cc->cme_` on a --repeat-count=50 run a compaction test on CI: http://ci.rvm.jp/results/trunk-repeat50@ruby-sp2-noble-docker/5654900 During reference updating for imemo_callcache in rb_imemo_mark_and_move(), if `cc->klass` is not live, but `cc->_cme` is live and moved, we go to the vm_cc_invalidate() path which leaves `cc->_cme` not updated and stale. In the next marking run after compaction, CME would've become a T_NONE. So to quote the comment above "... cc is invalidated by `vm_cc_invalidate()` and cc->cme is not be accessed."
This commit is contained in:
parent
70a9e5f6eb
commit
3e04f7b69f
Notes:
git
2025-03-16 20:00:26 +00:00
Merged: https://github.com/ruby/ruby/pull/12936 Merged-By: XrXr
2
imemo.c
2
imemo.c
@ -309,7 +309,7 @@ rb_imemo_mark_and_move(VALUE obj, bool reference_updating)
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (vm_cc_super_p(cc) || vm_cc_refinement_p(cc)) {
|
||||
if (cc->klass && (vm_cc_super_p(cc) || vm_cc_refinement_p(cc))) {
|
||||
rb_gc_mark_movable((VALUE)cc->cme_);
|
||||
rb_gc_mark_movable((VALUE)cc->klass);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user