diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2019-05-17 17:08:31 +0300 |
---|---|---|
committer | Aaron Patterson <tenderlove@ruby-lang.org> | 2019-05-17 17:08:31 +0300 |
commit | ea3e7e268546599883b25d9a33d26e042461ac25 (patch) | |
tree | 56e36b4147651fbe1c9f73848b76bed164aaf4aa /gc.c | |
parent | 0723c107f4fb39f60113b44dd21d875c90da5456 (diff) | |
download | ruby-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.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -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: |