diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gc.c | 29 |
2 files changed, 25 insertions, 14 deletions
@@ -1,3 +1,13 @@ +Sat Nov 24 21:08:50 2012 Hiroshi Shirosaki <h.shirosaki@gmail.com> + + * gc.c (wmap_final_func): rename variables to clarify the meaning. + In wmap2obj the key is WeakRef and the value is referenced object. + In obj2wmap the key is referenced object and the value is an array + of WeakRef. + + * gc.c (wmap_finalize): ditto. + [ruby-core:49044] [Bug #7304] + Sat Nov 24 21:01:55 2012 Hiroshi Shirosaki <h.shirosaki@gmail.com> * array.c (rb_ary_delete_same_obj): new function for WeakRef. @@ -3749,39 +3749,40 @@ wmap_allocate(VALUE klass) static int wmap_final_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing) { - VALUE obj, ary; + VALUE wmap, ary; if (!existing) return ST_STOP; - obj = (VALUE)arg, ary = (VALUE)*value; - rb_ary_delete_same_obj(ary, obj); + wmap = (VALUE)arg, ary = (VALUE)*value; + rb_ary_delete_same_obj(ary, wmap); if (!RARRAY_LEN(ary)) return ST_DELETE; return ST_CONTINUE; } static VALUE -wmap_finalize(VALUE self, VALUE obj) +wmap_finalize(VALUE self, VALUE objid) { - st_data_t key, data; - VALUE rids; + st_data_t orig, wmap, data; + VALUE obj, rids; long i; struct weakmap *w; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w); /* Get reference from object id. */ - obj = obj ^ FIXNUM_FLAG; /* unset FIXNUM_FLAG */ + obj = objid ^ FIXNUM_FLAG; /* unset FIXNUM_FLAG */ /* obj is original referenced object and/or weak reference. */ - key = (st_data_t)obj; - if (st_delete(w->obj2wmap, &key, &data)) { + orig = (st_data_t)obj; + if (st_delete(w->obj2wmap, &orig, &data)) { rids = (VALUE)data; for (i = 0; i < RARRAY_LEN(rids); ++i) { - data = (st_data_t)RARRAY_PTR(rids)[i]; - st_delete(w->wmap2obj, &data, NULL); + wmap = (st_data_t)RARRAY_PTR(rids)[i]; + st_delete(w->wmap2obj, &wmap, NULL); } } - key = (st_data_t)obj; - if (st_delete(w->wmap2obj, &key, &data)) { - st_update(w->obj2wmap, data, wmap_final_func, (st_data_t)obj); + wmap = (st_data_t)obj; + if (st_delete(w->wmap2obj, &wmap, &orig)) { + wmap = (st_data_t)obj; + st_update(w->obj2wmap, orig, wmap_final_func, wmap); } return self; } |