From 37f018fdf52d0f75d66d467055f992dee1c0a420 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 9 Jul 2014 05:00:53 +0000 Subject: [PATCH] * parse.y (symbols_i): delete garbage symbols for Symbol.all_symbols. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46763 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ parse.y | 16 +++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6d249cc1e7..630a61619b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed Jul 9 12:21:55 2014 Koichi Sasada + + * parse.y (symbols_i): delete garbage symbols for Symbol.all_symbols. + Wed Jul 9 05:49:08 2014 Eric Wong * thread_pthread.h (struct rb_global_vm_lock_struct): diff --git a/parse.y b/parse.y index 79c9e342d9..7b47522583 100644 --- a/parse.y +++ b/parse.y @@ -10891,11 +10891,18 @@ static int symbols_i(VALUE key, ID value, VALUE ary) { VALUE sym = ID2SYM(value); - if (ID_DYNAMIC_SYM_P(value)) { - sym = dsymbol_check(sym); + + if (DYNAMIC_SYM_P(sym) && !SYMBOL_PINNED_P(sym) && rb_objspace_garbage_object_p(sym)) { + st_data_t sym_data = (st_data_t)sym; + st_delete(global_symbols.id_str, &sym_data, NULL); + RSYMBOL(sym)->fstr = 0; + return ST_DELETE; } - rb_ary_push(ary, sym); - return ST_CONTINUE; + else { + rb_ary_push(ary, sym); + return ST_CONTINUE; + } + } /* @@ -10918,7 +10925,6 @@ VALUE rb_sym_all_symbols(void) { VALUE ary = rb_ary_new2(global_symbols.str_id->num_entries); - st_foreach(global_symbols.str_id, symbols_i, ary); return ary; }