summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-17 04:25:18 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-17 04:25:18 +0000
commitebaec402a7b3ee6c88aaaaa7fa3dfb103f614a40 (patch)
tree54efcf78b8bd69a52e579853f11ea54d7dc2040c /parse.y
parent82068396594c85a3686cb73a52a57cb60745b394 (diff)
* parse.y, compile.c (set_arguments): fix to support in-paren
parameter (ex: def foo((a, b))). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12287 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y22
1 files changed, 12 insertions, 10 deletions
diff --git a/parse.y b/parse.y
index 5d9242cb8d..d1b39f4581 100644
--- a/parse.y
+++ b/parse.y
@@ -2689,16 +2689,11 @@ primary : literal
/*%%%*/
ID id = internal_id();
ID *tbl = ALLOC_N(ID, 2);
- NODE *args = NEW_ARGS(1 /* m */, 0 /* o */);
- NODE *init;
+ NODE *args =new_args(NEW_NODE(NODE_ARGS_AUX, 0, 1 /* nd_plen */,
+ node_assign($2, NEW_DVAR(id))),
+ 0, 0, 0, 0);
NODE *scope = NEW_NODE(NODE_SCOPE, tbl, $8, args);
tbl[0] = 1; tbl[1] = id;
-
- init = node_assign($2, NEW_DVAR(id));
- args->nd_next = NEW_ARGS_AUX(0, 0);
- args->nd_next->nd_next = NEW_ARGS_AUX(0, 0);
- args->nd_next->nd_next->nd_next = init;
-
$$ = NEW_FOR(0, $5, scope);
fixpos($$, $2);
/*%
@@ -4114,7 +4109,12 @@ f_arg_item : f_norm_arg
/*%%%*/
ID tid = internal_id();
arg_var(tid);
- $2->nd_value = NEW_DVAR(tid);
+ if (dyna_in_block()) {
+ $2->nd_value = NEW_DVAR(tid);
+ }
+ else {
+ $2->nd_value = NEW_LVAR(tid);
+ }
$$ = NEW_ARGS_AUX(tid, 1);
$$->nd_next = $2;
/*%
@@ -4128,11 +4128,12 @@ f_arg : f_arg_item
/*%c
{
$$ = rb_ary_new3(1, $1);
- }
+n }
c%*/
| f_arg ',' f_arg_item
{
/*%%%*/
+ $$ = $1;
$$->nd_plen++;
$$->nd_next = block_append($$->nd_next, $3->nd_next);
rb_gc_force_recycle((VALUE)$3);
@@ -7928,6 +7929,7 @@ new_args_gen(struct parser_params *parser, NODE *m, NODE *o, ID r, NODE *p, ID b
node = NEW_ARGS(m ? m->nd_plen : 0, o);
i1 = m ? m->nd_next : 0;
node->nd_next = NEW_ARGS_AUX(r, b);
+
if (p) {
i2 = p->nd_next;
node->nd_next->nd_next = NEW_ARGS_AUX(p->nd_pid, p->nd_plen);