ruby-changes:37112
From: nobu <ko1@a...>
Date: Fri, 9 Jan 2015 11:13:13 +0900 (JST)
Subject: [ruby-changes:37112] nobu:r49193 (trunk): parse.y: eliminate empty hashes
nobu 2015-01-09 11:13:03 +0900 (Fri, 09 Jan 2015) New Revision: 49193 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49193 Log: parse.y: eliminate empty hashes * parse.y (assocs, assoc): eliminate splatting empty literal hashes. [ruby-core:67446] [Bug #10719] * compile.c (compile_array_): supprt splatted hash in hash type. Modified files: trunk/ChangeLog trunk/compile.c trunk/parse.y trunk/test/ruby/test_syntax.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 49192) +++ ChangeLog (revision 49193) @@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Fri Jan 9 11:13:01 2015 Nobuyoshi Nakada <nobu@r...> + + * parse.y (assocs, assoc): eliminate splatting empty literal + hashes. [ruby-core:67446] [Bug #10719] + + * compile.c (compile_array_): supprt splatted hash in hash type. + Fri Jan 9 10:57:09 2015 Vit Ondruch <vondruch@r...> * configure.in (RUBY_SETJMP_TYPE): Remove superfluous semicolon Index: compile.c =================================================================== --- compile.c (revision 49192) +++ compile.c (revision 49193) @@ -2467,11 +2467,14 @@ compile_array_(rb_iseq_t *iseq, LINK_ANC https://github.com/ruby/ruby/blob/trunk/compile.c#L2467 rb_bug("compile_array: This node is not NODE_ARRAY, but %s", ruby_node_name(nd_type(node))); } - if (type == COMPILE_ARRAY_TYPE_HASH && !node->nd_head) { - opt_p = 0; + if (type != COMPILE_ARRAY_TYPE_ARRAY && !node->nd_head) { kw = node->nd_next; - node = kw->nd_next; - kw = kw->nd_head; + node = 0; + if (kw) { + opt_p = 0; + node = kw->nd_next; + kw = kw->nd_head; + } break; } if (opt_p && nd_type(node->nd_head) != NODE_LIT) { Index: parse.y =================================================================== --- parse.y (revision 49192) +++ parse.y (revision 49193) @@ -2405,7 +2405,7 @@ aref_args : none https://github.com/ruby/ruby/blob/trunk/parse.y#L2405 | args ',' assocs trailer { /*%%%*/ - $$ = arg_append($1, new_hash($3)); + $$ = $3 ? arg_append($1, new_hash($3)) : $1; /*% $$ = arg_add_assocs($1, $3); %*/ @@ -2413,7 +2413,7 @@ aref_args : none https://github.com/ruby/ruby/blob/trunk/parse.y#L2413 | assocs trailer { /*%%%*/ - $$ = NEW_LIST(new_hash($1)); + $$ = $1 ? NEW_LIST(new_hash($1)) : 0; /*% $$ = arg_add_assocs(arg_new(), $1); %*/ @@ -2443,7 +2443,7 @@ opt_call_args : none https://github.com/ruby/ruby/blob/trunk/parse.y#L2443 | args ',' assocs ',' { /*%%%*/ - $$ = arg_append($1, new_hash($3)); + $$ = $3 ? arg_append($1, new_hash($3)) : $1; /*% $$ = arg_add_assocs($1, $3); %*/ @@ -2451,7 +2451,7 @@ opt_call_args : none https://github.com/ruby/ruby/blob/trunk/parse.y#L2451 | assocs ',' { /*%%%*/ - $$ = NEW_LIST(new_hash($1)); + $$ = $1 ? NEW_LIST(new_hash($1)) : 0; /*% $$ = arg_add_assocs(arg_new(), $1); %*/ @@ -2478,7 +2478,7 @@ call_args : command https://github.com/ruby/ruby/blob/trunk/parse.y#L2478 | assocs opt_block_arg { /*%%%*/ - $$ = NEW_LIST(new_hash($1)); + $$ = NEW_LIST($1 ? new_hash($1) : 0); $$ = arg_blk_pass($$, $2); /*% $$ = arg_add_assocs(arg_new(), $1); @@ -2488,7 +2488,7 @@ call_args : command https://github.com/ruby/ruby/blob/trunk/parse.y#L2488 | args ',' assocs opt_block_arg { /*%%%*/ - $$ = arg_append($1, new_hash($3)); + $$ = $3 ? arg_append($1, new_hash($3)) : $1; $$ = arg_blk_pass($$, $4); /*% $$ = arg_add_optblock(arg_add_assocs($1, $3), $4); @@ -5039,13 +5039,19 @@ assocs : assoc https://github.com/ruby/ruby/blob/trunk/parse.y#L5039 /*%%%*/ NODE *assocs = $1; NODE *tail = $3; - if (assocs->nd_head && - !tail->nd_head && nd_type(tail->nd_next) == NODE_ARRAY && - nd_type(tail->nd_next->nd_head) == NODE_HASH) { - /* DSTAR */ - tail = tail->nd_next->nd_head->nd_head; + if (!assocs) { + assocs = tail; } - $$ = list_concat(assocs, tail); + else if (tail) { + if (assocs->nd_head && + !tail->nd_head && nd_type(tail->nd_next) == NODE_ARRAY && + nd_type(tail->nd_next->nd_head) == NODE_HASH) { + /* DSTAR */ + tail = tail->nd_next->nd_head->nd_head; + } + assocs = list_concat(assocs, tail); + } + $$ = assocs; /*% $$ = rb_ary_push($1, $3); %*/ @@ -5083,7 +5089,11 @@ assoc : arg_value tASSOC arg_value https://github.com/ruby/ruby/blob/trunk/parse.y#L5089 | tDSTAR arg_value { /*%%%*/ - $$ = list_append(NEW_LIST(0), $2); + if (nd_type($2) == NODE_HASH && + !($2->nd_head && $2->nd_head->nd_alen)) + $$ = 0; + else + $$ = list_append(NEW_LIST(0), $2); /*% $$ = dispatch1(assoc_splat, $2); %*/ Index: test/ruby/test_syntax.rb =================================================================== --- test/ruby/test_syntax.rb (revision 49192) +++ test/ruby/test_syntax.rb (revision 49193) @@ -136,6 +136,13 @@ class TestSyntax < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_syntax.rb#L136 assert_equal([1, 2], a, bug10315) end + def test_keyword_empty_splat + assert_separately([], <<-'end;') + bug10719 = '[ruby-core:67446] [Bug #10719]' + assert_valid_syntax("foo(a: 1, **{})", bug10719) + end; + end + def test_keyword_self_reference bug9593 = '[ruby-core:61299] [Bug #9593]' o = Object.new -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/