[前][次][番号順一覧][スレッド一覧]

ruby-changes:59407

From: Koichi <ko1@a...>
Date: Mon, 23 Dec 2019 17:23:05 +0900 (JST)
Subject: [ruby-changes:59407] 100fc2750b (master): fix wmap_finalize.

https://git.ruby-lang.org/ruby.git/commit/?id=100fc2750b

From 100fc2750b8f2c4dbe0aaa6c622bbf5f6d61e3c0 Mon Sep 17 00:00:00 2001
From: Koichi Sasada <ko1@a...>
Date: Mon, 23 Dec 2019 17:04:31 +0900
Subject: fix wmap_finalize.

wmap_finalize expects id2ref() returns a corresponding object
even if the object is dead. Make id2ref_obj_tbl() for this
purpose.

diff --git a/gc.c b/gc.c
index 728aea9..131ffb8 100644
--- a/gc.c
+++ b/gc.c
@@ -3608,6 +3608,18 @@ rb_objspace_garbage_object_p(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L3608
     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) https://github.com/ruby/ruby/blob/trunk/gc.c#L3664
         }
     }
 
-    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)) https://github.com/ruby/ruby/blob/trunk/gc.c#L10454
 
     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;
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]