aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-09 02:13:03 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-09 02:13:03 +0000
commit17a65c320d9ce3bce3d7fe0177d74bf78314b8fa (patch)
treec0dd92ac4fa45ecc0f92c5de908626e324b16bcb /parse.y
parent787af09e4e7500f5670078e9cf6b0381c14a2372 (diff)
downloadruby-17a65c320d9ce3bce3d7fe0177d74bf78314b8fa.tar.gz
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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49193 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y36
1 files changed, 23 insertions, 13 deletions
diff --git a/parse.y b/parse.y
index 1a12001dec..4821e08b1e 100644
--- a/parse.y
+++ b/parse.y
@@ -2405,7 +2405,7 @@ aref_args : none
| 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
| 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
| 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
| 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
| 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
| 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
/*%%%*/
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
| 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);
%*/