add compaction support to weak maps

This commit is contained in:
Aaron Patterson 2019-08-01 13:44:54 -07:00
parent 255e22a827
commit 33d7a58ffb
No known key found for this signature in database
GPG Key ID: 953170BCB4FFAFC6

18
gc.c
View File

@ -10129,25 +10129,18 @@ wmap_mark_map(st_data_t key, st_data_t val, st_data_t arg)
} }
#endif #endif
static int static void
wmap_pin_obj(st_data_t key, st_data_t val, st_data_t arg) wmap_compact(void *ptr)
{ {
rb_objspace_t *objspace = (rb_objspace_t *)arg; struct weakmap *w = ptr;
VALUE obj = (VALUE)val; if (w->wmap2obj) rb_gc_update_tbl_refs(w->wmap2obj);
if (obj && is_live_object(objspace, obj)) { if (w->obj2wmap) rb_gc_update_tbl_refs(w->obj2wmap);
gc_pin(objspace, obj);
}
else {
return ST_DELETE;
}
return ST_CONTINUE;
} }
static void static void
wmap_mark(void *ptr) wmap_mark(void *ptr)
{ {
struct weakmap *w = ptr; struct weakmap *w = ptr;
if (w->wmap2obj) st_foreach(w->wmap2obj, wmap_pin_obj, (st_data_t)&rb_objspace);
#if WMAP_DELETE_DEAD_OBJECT_IN_MARK #if WMAP_DELETE_DEAD_OBJECT_IN_MARK
if (w->obj2wmap) st_foreach(w->obj2wmap, wmap_mark_map, (st_data_t)&rb_objspace); if (w->obj2wmap) st_foreach(w->obj2wmap, wmap_mark_map, (st_data_t)&rb_objspace);
#endif #endif
@ -10197,6 +10190,7 @@ static const rb_data_type_t weakmap_type = {
wmap_mark, wmap_mark,
wmap_free, wmap_free,
wmap_memsize, wmap_memsize,
wmap_compact,
}, },
0, 0, RUBY_TYPED_FREE_IMMEDIATELY 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
}; };