diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-12 07:18:49 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-12 07:18:49 +0000 |
commit | 126297de1572ca791074a0437f63ab83c4c0a014 (patch) | |
tree | c1fd7e93ba1f5f98a3a2b6ecc0e3226886d65eb8 /parse.y | |
parent | a10ded3ba0f6da6b4f881cd23858aef3d9eb5f29 (diff) | |
download | ruby-126297de1572ca791074a0437f63ab83c4c0a014.tar.gz |
* parse.y (args, mrhs): flattens literal array splats.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15444 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 43 |
1 files changed, 39 insertions, 4 deletions
@@ -369,6 +369,7 @@ static NODE *new_evstr_gen(struct parser_params*,NODE*); #define new_evstr(n) new_evstr_gen(parser,n) static NODE *evstr2dstr_gen(struct parser_params*,NODE*); #define evstr2dstr(n) evstr2dstr_gen(parser,n) +static NODE *splat_array(NODE*); static NODE *call_bin_op_gen(struct parser_params*,NODE*,ID,NODE*); #define call_bin_op(recv,id,arg1) call_bin_op_gen(parser, recv,id,arg1) @@ -2445,7 +2446,13 @@ args : arg_value | args ',' arg_value { /*%%%*/ - $$ = arg_append($1, $3); + NODE *n1; + if ((n1 = splat_array($1)) != 0) { + $$ = list_append(n1, $3); + } + else { + $$ = arg_append($1, $3); + } /*% $$ = arg_add($1, $3); %*/ @@ -2453,7 +2460,14 @@ args : arg_value | args ',' tSTAR arg_value { /*%%%*/ - $$ = arg_concat($1, $4); + NODE *n1; + if (nd_type($4) == NODE_ARRAY && + (n1 = splat_array($1)) != 0) { + $$ = list_concat(n1, $4); + } + else { + $$ = arg_concat($1, $4); + } /*% $$ = arg_add_star($1, $4); %*/ @@ -2463,7 +2477,13 @@ args : arg_value mrhs : args ',' arg_value { /*%%%*/ - $$ = arg_append($1, $3); + NODE *n1; + if ((n1 = splat_array($1)) != 0) { + $$ = list_append(n1, $3); + } + else { + $$ = arg_append($1, $3); + } /*% $$ = mrhs_add(args2mrhs($1), $3); %*/ @@ -2471,7 +2491,14 @@ mrhs : args ',' arg_value | args ',' tSTAR arg_value { /*%%%*/ - $$ = arg_concat($1, $4); + NODE *n1; + if (nd_type($4) == NODE_ARRAY && + (n1 = splat_array($1)) != 0) { + $$ = list_concat(n1, $4); + } + else { + $$ = arg_concat($1, $4); + } /*% $$ = mrhs_add_star(args2mrhs($1), $4); %*/ @@ -7799,6 +7826,14 @@ arg_add_gen(struct parser_params *parser, NODE *node1, NODE *node2) } static NODE * +splat_array(NODE* node) +{ + if (nd_type(node) == NODE_SPLAT) node = node->nd_head; + if (nd_type(node) == NODE_ARRAY) return node; + return 0; +} + +static NODE * node_assign_gen(struct parser_params *parser, NODE *lhs, NODE *rhs) { if (!lhs) return 0; |