diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-10 06:47:15 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-10 06:47:15 +0000 |
commit | 1b29c00f00e42ade9858142b512b6eab211fb223 (patch) | |
tree | 1edede9d169f5cf0c44fcfba5489ca6041061f9e | |
parent | 14979f2161e2d2f799f2b8b351d1cb451d13416b (diff) | |
download | ruby-1b29c00f00e42ade9858142b512b6eab211fb223.tar.gz |
* gc.c (allrefs_add): push obj only if allrefs table doesn't have
obj.
* gc.c (allrefs_roots_i): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44113 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | gc.c | 11 |
2 files changed, 15 insertions, 3 deletions
@@ -1,3 +1,10 @@ +Tue Dec 10 15:46:03 2013 Koichi Sasada <ko1@atdot.net> + + * gc.c (allrefs_add): push obj only if allrefs table doesn't have + obj. + + * gc.c (allrefs_roots_i): ditto. + Tue Dec 10 15:28:10 2013 Koichi Sasada <ko1@atdot.net> * gc.c (RGENGC_CHECK_MODE): separate checkers to different modes. @@ -4231,7 +4231,8 @@ allrefs_add(struct allrefs *data, VALUE obj) struct reflist *refs; if (st_lookup(data->references, obj, (st_data_t *)&refs)) { - return reflist_add(refs, data->root_obj); + reflist_add(refs, data->root_obj); + return 0; } else { refs = reflist_create(data->root_obj); @@ -4244,9 +4245,11 @@ static void allrefs_i(VALUE obj, void *ptr) { struct allrefs *data = (struct allrefs *)ptr; - if (allrefs_add(data, obj)) /* follow new reference */ + + if (allrefs_add(data, obj)) { push_mark_stack(&data->objspace->mark_stack, obj); } +} static void allrefs_roots_i(VALUE obj, void *ptr) @@ -4254,9 +4257,11 @@ allrefs_roots_i(VALUE obj, void *ptr) struct allrefs *data = (struct allrefs *)ptr; if (strlen(data->category) == 0) rb_bug("!!!"); data->root_obj = MAKE_ROOTSIG(data->category); - allrefs_add(data, obj); + + if (allrefs_add(data, obj)) { push_mark_stack(&data->objspace->mark_stack, obj); } +} static st_table * objspace_allrefs(rb_objspace_t *objspace) |