diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-16 15:12:15 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-16 15:12:15 +0000 |
commit | f8a0c7d6290e775f24a89e0bfe71aa15c9da9728 (patch) | |
tree | c159fcfe6eecf4e7eb1c3c6fd1f6e43042ca3b62 /parse.y | |
parent | 0160006b591e831c9237dda500fe8a409899510b (diff) | |
download | ruby-f8a0c7d6290e775f24a89e0bfe71aa15c9da9728.tar.gz |
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.y | 32 |
1 files changed, 14 insertions, 18 deletions
@@ -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); /*% |