summaryrefslogtreecommitdiffstats
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
commit4bc977eb797818636a8662e15c9ad31dfd299bb6 (patch)
treec1fd7e93ba1f5f98a3a2b6ecc0e3226886d65eb8 /parse.y
parentdae780ba0b567f3faef4e8c1439c6c0841532bff (diff)
downloadruby-4bc977eb797818636a8662e15c9ad31dfd299bb6.tar.gz
ruby-4bc977eb797818636a8662e15c9ad31dfd299bb6.tar.xz
ruby-4bc977eb797818636a8662e15c9ad31dfd299bb6.zip
* parse.y (args, mrhs): flattens literal array splats.
git-svn-id: http://svn.ruby-lang.org/repos/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 51e9136c6..15cde4247 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;