diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-07-09 05:00:53 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-07-09 05:00:53 +0000 |
commit | 37f018fdf52d0f75d66d467055f992dee1c0a420 (patch) | |
tree | af4ecc6643931eb81e8fce597b174c11d2e7dc71 /parse.y | |
parent | 9db5a7f82e711fa8dbf39462cc3db177ffec205f (diff) | |
download | ruby-37f018fdf52d0f75d66d467055f992dee1c0a420.tar.gz |
* 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
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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; } |