summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-12 07:18:49 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-12 07:18:49 +0000
commit126297de1572ca791074a0437f63ab83c4c0a014 (patch)
treec1fd7e93ba1f5f98a3a2b6ecc0e3226886d65eb8 /parse.y
parenta10ded3ba0f6da6b4f881cd23858aef3d9eb5f29 (diff)
* 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.y43
1 files changed, 39 insertions, 4 deletions
diff --git a/parse.y b/parse.y
index 51e9136c60..15cde42474 100644
--- a/parse.y
+++ b/parse.y
@@ -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;