Skip to content

Commit 3e04f7b

Browse files
authored
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."
1 parent 70a9e5f commit 3e04f7b

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

imemo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ rb_imemo_mark_and_move(VALUE obj, bool reference_updating)
309309
}
310310
}
311311
else {
312-
if (vm_cc_super_p(cc) || vm_cc_refinement_p(cc)) {
312+
if (cc->klass && (vm_cc_super_p(cc) || vm_cc_refinement_p(cc))) {
313313
rb_gc_mark_movable((VALUE)cc->cme_);
314314
rb_gc_mark_movable((VALUE)cc->klass);
315315
}

0 commit comments

Comments
 (0)