summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKJ Tsanaktsidis <[email protected]>2023-11-11 16:12:12 +1100
committerAlan Wu <[email protected]>2023-11-24 13:16:15 -0500
commite201b81f79828c30500947fe8c8ea3c515e3d112 ()
tree3c19de035b64f275f567efdda321f4bb90761523
parent99e1f7b60717bc5ca3b160f10f4a8fe1521cba7c (diff)
Mark cc->cme_ for refinement callcaches as well
This is required for the same reason that super CC needs it. See 36023d5cb751d62fca0c27901c07527b20170f4d. Reproducer: def cached_foo_callsite(obj) = obj.foo class Foo def foo = :v1 module R refine Foo do def foo = :unused end end end obj = Foo.new cached_foo_callsite(obj) # set up cc with cme for foo=:v1 class Foo def foo = :v2 end GC.start # cme for foo=:v1 collected, if not reachable by cached_foo_callsite cached_foo_callsite(obj) [Bug #19994]
-rw-r--r--gc.c7
1 files changed, 4 insertions, 3 deletions
@@ -7216,12 +7216,13 @@ gc_mark_imemo(rb_objspace_t *objspace, VALUE obj)
* - On the multi-Ractors, cme will be collected with global GC
* so that it is safe if GC is not interleaving while accessing
* cc and cme.
- * - However, cc_type_super is not chained from cc so the cc->cme
- * should be marked.
*/
{
const struct rb_callcache *cc = (const struct rb_callcache *)obj;
- if (vm_cc_super_p(cc)) {
gc_mark(objspace, (VALUE)cc->cme_);
}
}