aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--parse.y8
2 files changed, 12 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2ff34a0ca2..e0d0ba990f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Apr 1 08:58:39 2014 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * parse.y (rb_str_dynamic_intern): set mark bit if dynamic symbol
+ is before sweeping.
+
Tue Apr 1 07:37:00 2014 NARUSE, Yui <naruse@ruby-lang.org>
* addr2line.c (fill_lines): use dynsym, which is used for dynamic
diff --git a/parse.y b/parse.y
index 3f756ce8dc..680242daa0 100644
--- a/parse.y
+++ b/parse.y
@@ -10705,7 +10705,13 @@ rb_str_dynamic_intern(VALUE str)
ID id, type;
if (st_lookup(global_symbols.sym_id, str, &id)) {
- return ID2SYM(id);
+ VALUE sym = ID2SYM(id);
+ if (!STATIC_SYM_P(sym)) {
+ /* because of lazy sweep, dynamic symbol may be unmarked already and swept
+ * at next time */
+ rb_gc_resurrect(sym);
+ }
+ return sym;
}
enc = rb_enc_get(str);