diff options
author | Koichi Sasada <[email protected]> | 2019-12-23 17:04:31 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2019-12-23 17:04:31 +0900 |
commit | 100fc2750b8f2c4dbe0aaa6c622bbf5f6d61e3c0 (patch) | |
tree | c7954594111f1333b32d10aa4c59534b309f77f9 /gc.c | |
parent | 9eeaae432b9a894e28e3906435f3d454d8fd025c (diff) |
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.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -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; |