add compaction support to weak maps
This commit is contained in:
parent
255e22a827
commit
33d7a58ffb
18
gc.c
18
gc.c
@ -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
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user