From e4256538fd3488bbf0aef14124f7dfcf5027eb17 Mon Sep 17 00:00:00 2001 From: usa Date: Mon, 7 Jul 2014 02:49:13 +0000 Subject: merge revision(s) 45845,45847: [Backport #9786] * parse.y (local_tbl_gen): remove local variables duplicated with arguments. [ruby-core:60501] [Bug #9486] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@46731 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ parse.y | 31 +++++++++++++------------------ test/ruby/test_variable.rb | 6 ++++++ version.h | 6 +++--- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3e8e56f6c0..d0d8d71952 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ +Mon Jul 7 11:47:51 2014 Nobuyoshi Nakada + + * parse.y (local_tbl_gen): remove local variables duplicated with + arguments. + Thu Jul 3 15:17:22 2014 Koichi Sasada + [ruby-core:60501] [Bug #9486] * vm.c (rb_vm_pop_cfunc_frame): added. It cares c_return event. The patch base by drkaes (Stefan Kaes). [Bug #9321] diff --git a/parse.y b/parse.y index 3cbf8feb24..1ec06a3431 100644 --- a/parse.y +++ b/parse.y @@ -9563,31 +9563,26 @@ local_pop_gen(struct parser_params *parser) } #ifndef RIPPER -static ID* -vtable_tblcpy(ID *buf, const struct vtable *src) -{ - int i, cnt = vtable_size(src); - - if (cnt > 0) { - buf[0] = cnt; - for (i = 0; i < cnt; i++) { - buf[i] = src->tbl[i]; - } - return buf; - } - return 0; -} - static ID* local_tbl_gen(struct parser_params *parser) { - int cnt = vtable_size(lvtbl->args) + vtable_size(lvtbl->vars); + int cnt_args = vtable_size(lvtbl->args); + int cnt_vars = vtable_size(lvtbl->vars); + int cnt = cnt_args + cnt_vars; + int i, j; ID *buf; if (cnt <= 0) return 0; buf = ALLOC_N(ID, cnt + 1); - vtable_tblcpy(buf+1, lvtbl->args); - vtable_tblcpy(buf+vtable_size(lvtbl->args)+1, lvtbl->vars); + MEMCPY(buf+1, lvtbl->args->tbl, ID, cnt_args); + /* remove IDs duplicated to warn shadowing */ + for (i = 0, j = cnt_args+1; i < cnt_vars; ++i) { + ID id = lvtbl->vars->tbl[i]; + if (!vtable_included(lvtbl->args, id)) { + buf[j++] = id; + } + } + if (--j < cnt) REALLOC_N(buf, ID, (cnt = j) + 1); buf[0] = cnt; return buf; } diff --git a/test/ruby/test_variable.rb b/test/ruby/test_variable.rb index 32b3d61573..a7cdd57c02 100644 --- a/test/ruby/test_variable.rb +++ b/test/ruby/test_variable.rb @@ -83,6 +83,12 @@ class TestVariable < Test::Unit::TestCase end.call end + def test_shadowing_local_variables + bug9486 = '[ruby-core:60501] [Bug #9486]' + x = tap {|x| break local_variables} + assert_equal([:x, :bug9486, :x], x) + end + def test_global_variable_0 assert_in_out_err(["-e", "$0='t'*1000;print $0"], "", /\At+\z/, []) end diff --git a/version.h b/version.h index 9c75d15a3f..062ffbb179 100644 --- a/version.h +++ b/version.h @@ -1,10 +1,10 @@ #define RUBY_VERSION "2.0.0" -#define RUBY_RELEASE_DATE "2014-07-04" -#define RUBY_PATCHLEVEL 515 +#define RUBY_RELEASE_DATE "2014-07-07" +#define RUBY_PATCHLEVEL 516 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 7 -#define RUBY_RELEASE_DAY 4 +#define RUBY_RELEASE_DAY 7 #include "ruby/version.h" -- cgit v1.2.3