summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--parse.y8
-rw-r--r--test/ruby/test_symbol.rb4
3 files changed, 14 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 25bc55117c..2e703e78b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Tue Apr 29 10:21:38 2014 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * parse.y (symbols_i): like r45492, call rb_gc_resurrect().
+
Tue Apr 29 04:29:05 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
* file.c (HAVE_STRUCT_STATFS_T_F_FSTYPENAME): Add new macro for
diff --git a/parse.y b/parse.y
index 0ac1ef2708..290eb75f0f 100644
--- a/parse.y
+++ b/parse.y
@@ -10908,9 +10908,13 @@ rb_make_internal_id(void)
}
static int
-symbols_i(VALUE sym, ID value, VALUE ary)
+symbols_i(VALUE key, ID value, VALUE ary)
{
- rb_ary_push(ary, ID2SYM(value));
+ VALUE sym = ID2SYM(value);
+ if (ID_DYNAMIC_SYM_P(value)) {
+ rb_gc_resurrect(sym);
+ }
+ rb_ary_push(ary, sym);
return ST_CONTINUE;
}
diff --git a/test/ruby/test_symbol.rb b/test/ruby/test_symbol.rb
index 0cc760ae00..49580b1342 100644
--- a/test/ruby/test_symbol.rb
+++ b/test/ruby/test_symbol.rb
@@ -232,5 +232,9 @@ class TestSymbol < Test::Unit::TestCase
assert_normal_exit('".".intern;GC.start(immediate_sweep:false);eval %[GC.start;%i"."]',
'',
child_env: '--disable-gems')
+ assert_normal_exit('tap{".".intern};GC.start(immediate_sweep:false);' +
+ 'eval %[syms=Symbol.all_symbols;GC.start;syms.each(&:to_sym)]',
+ '',
+ child_env: '--disable-gems')
end
end