aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-05-17 17:08:31 +0300
committerAaron Patterson <tenderlove@ruby-lang.org>2019-05-17 17:08:31 +0300
commitea3e7e268546599883b25d9a33d26e042461ac25 (patch)
tree56e36b4147651fbe1c9f73848b76bed164aaf4aa /gc.c
parent0723c107f4fb39f60113b44dd21d875c90da5456 (diff)
downloadruby-ea3e7e268546599883b25d9a33d26e042461ac25.tar.gz
Prevent Dynamic -> Static symbols from moving
If a dynamic symbol has been converted to a static symbol, it gets added to the global ID list and should no longer move. C extensions can pass symbols to rb_sym2id and those symbols should no longer be movable. When the symbol is passed to rb_sym2id, the `id` member is set, so we can use its existence to prevent movement.
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/gc.c b/gc.c
index f344bb88b1..bf495bab4e 100644
--- a/gc.c
+++ b/gc.c
@@ -7256,6 +7256,10 @@ gc_is_moveable_obj(rb_objspace_t *objspace, VALUE obj)
case T_ZOMBIE:
return FALSE;
break;
+ case T_SYMBOL:
+ if (DYNAMIC_SYM_P(obj) && (RSYMBOL(obj)->id & ~ID_SCOPE_MASK)) {
+ return FALSE;
+ }
case T_STRING:
case T_OBJECT:
case T_FLOAT:
@@ -7266,7 +7270,6 @@ gc_is_moveable_obj(rb_objspace_t *objspace, VALUE obj)
case T_MODULE:
case T_REGEXP:
case T_DATA:
- case T_SYMBOL:
case T_MATCH:
case T_STRUCT:
case T_HASH: