diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-07-31 14:10:09 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-07-31 14:10:09 +0000 |
commit | 41d6bc37e95bb51456d0d27da832c51cf701b5ee (patch) | |
tree | be547c9f45474332e1e5fbf48a08bd545be4f61b /symbol.c | |
parent | 4e12051fe885f93eb5ce8eb114f6ee944b417035 (diff) |
merge revision(s) d0ba4abf1a00339ebbb5d405db3240a8bdb7b68b,54eac83b2ad77ddea84fa6d66c09e0bb014cf61e: [Backport #15786]
Add RB_ID_SERIAL_MAX
Hide internal IDs
* parse.y (internal_id): number the ID serial for internal use by
counting down from the neary maximum value, not to accidentally
match permanent IDs.
[Bug #15768]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67718 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'symbol.c')
-rw-r--r-- | symbol.c | 36 |
1 files changed, 30 insertions, 6 deletions
@@ -19,6 +19,9 @@ #ifndef SYMBOL_DEBUG # define SYMBOL_DEBUG 0 #endif +#ifndef CHECK_ID_SERIAL +# define CHECK_ID_SERIAL SYMBOL_DEBUG +#endif #define SYMBOL_PINNED_P(sym) (RSYMBOL(sym)->id&~ID_SCOPE_MASK) @@ -375,20 +378,41 @@ set_id_entry(rb_id_serial_t num, VALUE str, VALUE sym) } static VALUE -get_id_entry(rb_id_serial_t num, const enum id_entry_type t) +get_id_serial_entry(rb_id_serial_t num, ID id, const enum id_entry_type t) { if (num && num <= global_symbols.last_id) { size_t idx = num / ID_ENTRY_UNIT; VALUE ids = global_symbols.ids; VALUE ary; if (idx < (size_t)RARRAY_LEN(ids) && !NIL_P(ary = rb_ary_entry(ids, (long)idx))) { - VALUE result = rb_ary_entry(ary, (long)(num % ID_ENTRY_UNIT) * ID_ENTRY_SIZE + t); - if (!NIL_P(result)) return result; + long pos = (long)(num % ID_ENTRY_UNIT) * ID_ENTRY_SIZE; + VALUE result = rb_ary_entry(ary, pos + t); + if (NIL_P(result)) return 0; +#if CHECK_ID_SERIAL + if (id) { + VALUE sym = result; + if (t != ID_ENTRY_SYM) + sym = rb_ary_entry(ary, pos + ID_ENTRY_SYM); + if (STATIC_SYM_P(sym)) { + if (STATIC_SYM2ID(sym) != id) return 0; + } + else { + if (RSYMBOL(sym)->id != id) return 0; + } + } +#endif + return result; } } return 0; } +static VALUE +get_id_entry(ID id, const enum id_entry_type t) +{ + return get_id_serial_entry(rb_id_to_serial(id), id, t); +} + static inline ID #ifdef __GNUC__ __attribute__((unused)) @@ -396,7 +420,7 @@ __attribute__((unused)) rb_id_serial_to_id(rb_id_serial_t num) { if (is_notop_id((ID)num)) { - VALUE sym = get_id_entry(num, ID_ENTRY_SYM); + VALUE sym = get_id_serial_entry(num, 0, ID_ENTRY_SYM); return SYM2ID(sym); } else { @@ -584,7 +608,7 @@ lookup_str_sym(const VALUE str) static VALUE lookup_id_str(ID id) { - return get_id_entry(rb_id_to_serial(id), ID_ENTRY_STR); + return get_id_entry(id, ID_ENTRY_STR); } ID @@ -763,7 +787,7 @@ VALUE rb_id2sym(ID x) { if (!DYNAMIC_ID_P(x)) return STATIC_ID2SYM(x); - return get_id_entry(rb_id_to_serial(x), ID_ENTRY_SYM); + return get_id_entry(x, ID_ENTRY_SYM); } |