summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-08-01 13:44:54 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2019-08-05 08:55:34 -0700
commit33d7a58ffb193cb2ca200ff5b3c649a72d190d21 (patch)
tree7fb8a9fa42fb95bb5871906468701af5723e7f4a /gc.c
parent255e22a8272cd951a6cf8983b7720546e859d1eb (diff)
add compaction support to weak maps
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/gc.c b/gc.c
index 3684133323..7a948a71bb 100644
--- a/gc.c
+++ b/gc.c
@@ -10129,25 +10129,18 @@ wmap_mark_map(st_data_t key, st_data_t val, st_data_t arg)
}
#endif
-static int
-wmap_pin_obj(st_data_t key, st_data_t val, st_data_t arg)
+static void
+wmap_compact(void *ptr)
{
- rb_objspace_t *objspace = (rb_objspace_t *)arg;
- VALUE obj = (VALUE)val;
- if (obj && is_live_object(objspace, obj)) {
- gc_pin(objspace, obj);
- }
- else {
- return ST_DELETE;
- }
- return ST_CONTINUE;
+ struct weakmap *w = ptr;
+ if (w->wmap2obj) rb_gc_update_tbl_refs(w->wmap2obj);
+ if (w->obj2wmap) rb_gc_update_tbl_refs(w->obj2wmap);
}
static void
wmap_mark(void *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 (w->obj2wmap) st_foreach(w->obj2wmap, wmap_mark_map, (st_data_t)&rb_objspace);
#endif
@@ -10197,6 +10190,7 @@ static const rb_data_type_t weakmap_type = {
wmap_mark,
wmap_free,
wmap_memsize,
+ wmap_compact,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};