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_5@67758 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2019-08-26 14:54:04 +00:00
parent 235e64c247
commit 401da79188
6 changed files with 45 additions and 8 deletions

View File

@ -11583,8 +11583,9 @@ rb_init_parse(void)
static ID
internal_id_gen(struct parser_params *parser)
{
const ID max_id = RB_ID_SERIAL_MAX & ~0xffff;
ID id = (ID)vtable_size(lvtbl->args) + (ID)vtable_size(lvtbl->vars);
id += ((tLAST_TOKEN - ID_INTERNAL) >> ID_SCOPE_SHIFT) + 1;
id = max_id - id;
return ID_STATIC_SYM | ID_INTERNAL | (id << ID_SCOPE_SHIFT);
}

View File

@ -18,6 +18,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)
@ -338,20 +341,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))
@ -359,7 +383,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 {
@ -547,7 +571,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
@ -726,7 +750,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);
}

View File

@ -53,6 +53,10 @@ id_type(ID id)
}
typedef uint32_t rb_id_serial_t;
static const uint32_t RB_ID_SERIAL_MAX = /* 256M on LP32 */
UINT32_MAX >>
((sizeof(ID)-sizeof(rb_id_serial_t))*CHAR_BIT < RUBY_ID_SCOPE_SHIFT ?
RUBY_ID_SCOPE_SHIFT : 0);
static inline rb_id_serial_t
rb_id_to_serial(ID id)

View File

@ -599,6 +599,11 @@ class TestMethod < Test::Unit::TestCase
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], self.class.instance_method(:pmk7).parameters)
end
def test_hidden_parameters
instance_eval("def m((_)"+",(_)"*256+");end")
assert_empty(method(:m).parameters.map{|_,n|n}.compact)
end
def test_public_method_with_zsuper_method
c = Class.new
c.class_eval do

View File

@ -1120,6 +1120,9 @@ class TestProc < Test::Unit::TestCase
assert_equal([[:req]], method(:putc).parameters)
assert_equal([[:rest]], method(:p).parameters)
pr = eval("proc{|"+"(_),"*30+"|}")
assert_empty(pr.parameters.map{|_,n|n}.compact)
end
def pm0() end

View File

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.5.6"
#define RUBY_RELEASE_DATE "2019-08-26"
#define RUBY_PATCHLEVEL 177
#define RUBY_PATCHLEVEL 178
#define RUBY_RELEASE_YEAR 2019
#define RUBY_RELEASE_MONTH 8