summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-01-16 15:12:15 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-01-16 15:12:15 +0000
commitf8a0c7d6290e775f24a89e0bfe71aa15c9da9728 (patch)
treec159fcfe6eecf4e7eb1c3c6fd1f6e43042ca3b62 /parse.y
parent0160006b591e831c9237dda500fe8a409899510b (diff)
parse.y: Refactor for-statement generation
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61879 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y32
1 files changed, 14 insertions, 18 deletions
diff --git a/parse.y b/parse.y
index 3bc4954b16..6260846050 100644
--- a/parse.y
+++ b/parse.y
@@ -2563,34 +2563,30 @@ primary : literal
* e.each{|x| a, = x}
*/
ID id = internal_id(p);
- ID *tbl = ALLOC_N(ID, 2);
NODE *m = NEW_ARGS_AUX(0, 0, &NULL_LOC);
- NODE *args, *scope;
+ NODE *args, *scope, *internal_var = NEW_DVAR(id, &@2);
+ ID *tbl = ALLOC_N(ID, 2);
+ tbl[0] = 1 /* length of local var table */; tbl[1] = id /* internal id */;
+ add_mark_object(p, (VALUE)rb_imemo_alloc_new((VALUE)tbl, 0, 0, 0));
switch (nd_type($2)) {
- case NODE_MASGN:
- m->nd_next = node_assign(p, $2, NEW_FOR_MASGN(NEW_DVAR(id, &@2), &@2), &@2);
- args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &@2), &@2);
- break;
case NODE_LASGN:
case NODE_DASGN:
- case NODE_DASGN_CURR:
- $2->nd_value = NEW_DVAR(id, &@2);
+ case NODE_DASGN_CURR: /* e.each {|internal_var| a = internal_var; ... } */
+ $2->nd_value = internal_var;
+ id = 0;
m->nd_plen = 1;
m->nd_next = $2;
- args = new_args(p, m, 0, 0, 0, new_args_tail(p, 0, 0, 0, &@2), &@2);
break;
- default:
- {
- NODE *masgn = NEW_MASGN(NEW_LIST($2, &@2), 0, &@2);
- m->nd_next = node_assign(p, masgn, NEW_DVAR(id, &@2), &@2);
- args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &@2), &@2);
- break;
- }
+ case NODE_MASGN: /* e.each {|*internal_var| a, b, c = (internal_var.length == 1 && Array === (tmp = internal_var[0]) ? tmp : internal_var); ... } */
+ m->nd_next = node_assign(p, $2, NEW_FOR_MASGN(internal_var, &@2), &@2);
+ break;
+ default: /* e.each {|*internal_var| @a, B, c[1], d.attr = internal_val; ... } */
+ m->nd_next = node_assign(p, NEW_MASGN(NEW_LIST($2, &@2), 0, &@2), internal_var, &@2);
}
- add_mark_object(p, (VALUE)rb_imemo_alloc_new((VALUE)tbl, 0, 0, 0));
+ /* {|*internal_id| <m> = internal_id; ... } */
+ args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &@2), &@2);
scope = NEW_NODE(NODE_SCOPE, tbl, $5, args, &@$);
- tbl[0] = 1; tbl[1] = id;
$$ = NEW_FOR($4, scope, &@$);
fixpos($$, $2);
/*%