summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorktsj <ktsj@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-01 00:07:58 +0000
committerktsj <ktsj@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-01 00:07:58 +0000
commitf6686b51325dc039652555c6724d7c1c960dd242 (patch)
tree893e8afc899b86d1fef06df4dfff68861d181b8a /parse.y
parentf265ce708d975d32db295fc85c7e92d89c7f6d20 (diff)
* parse.y (rb_str_dynamic_intern): set mark bit if dynamic symbol
is before sweeping. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y8
1 files changed, 7 insertions, 1 deletions
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);