diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-12-28 04:54:28 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-12-28 04:54:28 +0000 |
commit | 952ed33b13ef4343066c5a38ce22445c92d7f6c2 (patch) | |
tree | e9503ecd92488c29e3c98c42ca3654cf11dc26f6 | |
parent | dd038cb69dfdfea92da94148e947d08d0d7f4c49 (diff) | |
download | ruby-952ed33b13ef4343066c5a38ce22445c92d7f6c2.tar.gz |
parse.y: fix internal IDs conflict
* parse.y (f_kwrest, new_args_tail_gen): unnamed rest keyword and
keywords bits arguments should be unique. since internal IDs
depend on the local variable index in the current scope, new ID
should be made before popping those vtables.
[ruby-core:67157] [Bug #10659]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | parse.y | 4 | ||||
-rw-r--r-- | test/ruby/test_keyword.rb | 20 |
3 files changed, 31 insertions, 1 deletions
@@ -1,3 +1,11 @@ +Sun Dec 28 13:54:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * parse.y (f_kwrest, new_args_tail_gen): unnamed rest keyword and + keywords bits arguments should be unique. since internal IDs + depend on the local variable index in the current scope, new ID + should be made before popping those vtables. + [ruby-core:67157] [Bug #10659] + Sat Dec 27 20:12:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> * ext/json/generator/generator.c (JSON_Generator_State_type): add @@ -4829,6 +4829,7 @@ f_kwrest : kwrest_mark tIDENTIFIER | kwrest_mark { $$ = internal_id(); + arg_var($$); } ; @@ -9768,6 +9769,8 @@ new_args_tail_gen(struct parser_params *parser, NODE *k, ID kr, ID b) kwn = kwn->nd_next; } + kw_bits = internal_id(); + if (kr && is_junk_id(kr)) vtable_pop(lvtbl->args, 1); vtable_pop(lvtbl->args, vtable_size(required_kw_vars) + vtable_size(kw_vars) + (b != 0)); for (i=0; i<vtable_size(required_kw_vars); i++) arg_var(required_kw_vars->tbl[i]); @@ -9775,7 +9778,6 @@ new_args_tail_gen(struct parser_params *parser, NODE *k, ID kr, ID b) vtable_free(required_kw_vars); vtable_free(kw_vars); - kw_bits = internal_id(); arg_var(kw_bits); if (kr) arg_var(kr); if (b) arg_var(b); diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb index d24cd5b0fc..82d6407fe3 100644 --- a/test/ruby/test_keyword.rb +++ b/test/ruby/test_keyword.rb @@ -539,4 +539,24 @@ class TestKeywordArguments < Test::Unit::TestCase o.foo {raise "unreachable"} } end + + def test_super_with_anon_restkeywords + bug10659 = '[ruby-core:67157] [Bug #10659]' + + foo = Class.new do + def foo(**h) + h + end + end + + class << (obj = foo.new) + def foo(bar: "bar", **) + super + end + end + + assert_nothing_raised(TypeError, bug10659) { + assert_equal({:bar => "bar"}, obj.foo, bug10659) + } + end end |