From 04c177e277cad6e3c785de00238ef48c3fbe027a Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 24 Oct 2012 03:00:39 +0000 Subject: * ext/objspace/objspace.c (reachable_object_from_i): change data structure of the result of reachable objects. Keys of table contains object_id of each reachable objects. Value of table is an object itself or an instance of InternalObjectWrapper. To avoid duplication, we use st_table and object_id keys. * ext/objspace/objspace.c (type2sym): bug fix. Should use `i' instead of `type'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37310 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/objspace/objspace.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'ext/objspace') diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c index 1fbf148ef8..41abed90f4 100644 --- a/ext/objspace/objspace.c +++ b/ext/objspace/objspace.c @@ -302,7 +302,7 @@ type2sym(int i) CASE_TYPE(T_ICLASS); CASE_TYPE(T_ZOMBIE); #undef CASE_TYPE - default: rb_bug("type2sym: unknown type (%d)", (int)type); + default: rb_bug("type2sym: unknown type (%d)", i); } return type; } @@ -684,21 +684,23 @@ static void reachable_object_from_i(VALUE obj, void *data_ptr) { struct rof_data *data = (struct rof_data *)data_ptr; + VALUE key = obj; + VALUE val = obj; if (rb_objspace_markable_object_p(obj)) { if (rb_objspace_internal_object_p(obj)) { - obj = iow_newobj(obj); - rb_ary_push(data->internals, obj); + val = iow_newobj(obj); + rb_ary_push(data->internals, val); } - st_insert(data->refs, obj, Qtrue); + st_insert(data->refs, key, val); } } static int -collect_keys(st_data_t key, st_data_t value, st_data_t data) +collect_values(st_data_t key, st_data_t value, st_data_t data) { VALUE ary = (VALUE)data; - rb_ary_push(ary, (VALUE)key); + rb_ary_push(ary, (VALUE)value); return ST_CONTINUE; } @@ -759,7 +761,7 @@ reachable_objects_from(VALUE self, VALUE obj) rb_objspace_reachable_objects_from(obj, reachable_object_from_i, &data); - st_foreach(data.refs, collect_keys, (st_data_t)ret); + st_foreach(data.refs, collect_values, (st_data_t)ret); return ret; } else { -- cgit v1.2.3