aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-12-23 17:04:31 +0900
committerKoichi Sasada <ko1@atdot.net>2019-12-23 17:04:31 +0900
commit100fc2750b8f2c4dbe0aaa6c622bbf5f6d61e3c0 (patch)
treec7954594111f1333b32d10aa4c59534b309f77f9 /gc.c
parent9eeaae432b9a894e28e3906435f3d454d8fd025c (diff)
downloadruby-100fc2750b8f2c4dbe0aaa6c622bbf5f6d61e3c0.tar.gz
fix wmap_finalize.
wmap_finalize expects id2ref() returns a corresponding object even if the object is dead. Make id2ref_obj_tbl() for this purpose.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 728aea9408..131ffb8246 100644
--- a/gc.c
+++ b/gc.c
@@ -3608,6 +3608,18 @@ rb_objspace_garbage_object_p(VALUE obj)
return is_garbage_object(objspace, obj);
}
+static VALUE
+id2ref_obj_tbl(rb_objspace_t *objspace, VALUE objid)
+{
+ VALUE orig;
+ if (st_lookup(objspace->id_to_obj_tbl, objid, &orig)) {
+ return orig;
+ }
+ else {
+ return Qundef;
+ }
+}
+
/*
* call-seq:
* ObjectSpace._id2ref(object_id) -> an_object
@@ -3652,7 +3664,7 @@ id2ref(VALUE objid)
}
}
- if (st_lookup(objspace->id_to_obj_tbl, objid, &orig) &&
+ if ((orig = id2ref_obj_tbl(objspace, objid)) != Qundef &&
is_live_object(objspace, orig)) {
return orig;
}
@@ -10442,7 +10454,9 @@ wmap_finalize(RB_BLOCK_CALL_FUNC_ARGLIST(objid, self))
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
/* Get reference from object id. */
- obj = id2ref(objid);
+ if ((obj = id2ref_obj_tbl(&rb_objspace, objid)) == Qundef) {
+ rb_bug("wmap_finalize: objid is not found.");
+ }
/* obj is original referenced object and/or weak reference. */
orig = (st_data_t)obj;