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:
Alan Wu 2025-03-16 16:00:08 -04:00 committed by GitHub
parent 70a9e5f6eb
commit 3e04f7b69f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
Notes: git 2025-03-16 20:00:26 +00:00
Merged: https://github.com/ruby/ruby/pull/12936

Merged-By: XrXr

View File

@ -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);
}