ruby-changes:56727
From: nagachika <ko1@a...>
Date: Wed, 31 Jul 2019 23:10:33 +0900 (JST)
Subject: [ruby-changes:56727] nagachika: 41d6bc37e9 (ruby_2_6): merge revision(s) d0ba4abf1a00339ebbb5d405db3240a8bdb7b68b,54eac83b2ad77ddea84fa6d66c09e0bb014cf61e: [Backport #15786]
https://git.ruby-lang.org/ruby.git/commit/?id=41d6bc37e9 From 41d6bc37e95bb51456d0d27da832c51cf701b5ee Mon Sep 17 00:00:00 2001 From: nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> Date: Wed, 31 Jul 2019 14:10:09 +0000 Subject: 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 diff --git a/parse.y b/parse.y index 8e7dfec..aa067f6 100644 --- a/parse.y +++ b/parse.y @@ -10810,8 +10810,9 @@ rb_init_parse(void) https://github.com/ruby/ruby/blob/trunk/parse.y#L10810 static ID internal_id(struct parser_params *p) { + const ID max_id = RB_ID_SERIAL_MAX & ~0xffff; ID id = (ID)vtable_size(p->lvtbl->args) + (ID)vtable_size(p->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); } diff --git a/symbol.c b/symbol.c index ae6003e..f3506a0 100644 --- a/symbol.c +++ b/symbol.c @@ -19,6 +19,9 @@ https://github.com/ruby/ruby/blob/trunk/symbol.c#L19 #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) https://github.com/ruby/ruby/blob/trunk/symbol.c#L378 } 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)) https://github.com/ruby/ruby/blob/trunk/symbol.c#L420 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) https://github.com/ruby/ruby/blob/trunk/symbol.c#L608 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 https://github.com/ruby/ruby/blob/trunk/symbol.c#L787 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); } diff --git a/symbol.h b/symbol.h index 56568a9..0d09b20 100644 --- a/symbol.h +++ b/symbol.h @@ -53,6 +53,10 @@ id_type(ID id) https://github.com/ruby/ruby/blob/trunk/symbol.h#L53 } 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) diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index 3b14b49..3a71865 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -599,6 +599,11 @@ class TestMethod < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_method.rb#L599 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 diff --git a/test/ruby/test_proc.rb b/test/ruby/test_proc.rb index 8e8f719..9ae1de6 100644 --- a/test/ruby/test_proc.rb +++ b/test/ruby/test_proc.rb @@ -1137,6 +1137,9 @@ class TestProc < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_proc.rb#L1137 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 diff --git a/version.h b/version.h index 6d22451..590f1b2 100644 --- a/version.h +++ b/version.h @@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/version.h#L1 #define RUBY_VERSION "2.6.3" #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 69 +#define RUBY_PATCHLEVEL 70 #define RUBY_RELEASE_YEAR 2019 #define RUBY_RELEASE_MONTH 7 -#define RUBY_RELEASE_DAY 28 +#define RUBY_RELEASE_DAY 31 #include "ruby/version.h" -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/