Use Named Reference

This commit is contained in:
ydah 2025-01-09 10:31:57 +09:00 committed by Yudai Takada
parent c721301132
commit 7790aa89f9

28
parse.y
View File

@ -4507,7 +4507,7 @@ primary : inline_primary
compstmt(stmts) compstmt(stmts)
k_end k_end
{ {
restore_block_exit(p, $1); restore_block_exit(p, $k_for);
/* /*
* for a, b, c in e * for a, b, c in e
* #=> * #=>
@ -4520,34 +4520,34 @@ primary : inline_primary
ID id = internal_id(p); ID id = internal_id(p);
rb_node_args_aux_t *m = NEW_ARGS_AUX(0, 0, &NULL_LOC); rb_node_args_aux_t *m = NEW_ARGS_AUX(0, 0, &NULL_LOC);
rb_node_args_t *args; rb_node_args_t *args;
NODE *scope, *internal_var = NEW_DVAR(id, &@2); NODE *scope, *internal_var = NEW_DVAR(id, &@for_var);
rb_ast_id_table_t *tbl = rb_ast_new_local_table(p->ast, 1); rb_ast_id_table_t *tbl = rb_ast_new_local_table(p->ast, 1);
tbl->ids[0] = id; /* internal id */ tbl->ids[0] = id; /* internal id */
switch (nd_type($2)) { switch (nd_type($for_var)) {
case NODE_LASGN: case NODE_LASGN:
case NODE_DASGN: /* e.each {|internal_var| a = internal_var; ... } */ case NODE_DASGN: /* e.each {|internal_var| a = internal_var; ... } */
set_nd_value(p, $2, internal_var); set_nd_value(p, $for_var, internal_var);
id = 0; id = 0;
m->nd_plen = 1; m->nd_plen = 1;
m->nd_next = $2; m->nd_next = $for_var;
break; break;
case NODE_MASGN: /* e.each {|*internal_var| a, b, c = (internal_var.length == 1 && Array === (tmp = internal_var[0]) ? tmp : internal_var); ... } */ 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), NO_LEX_CTXT, &@2); m->nd_next = node_assign(p, $for_var, NEW_FOR_MASGN(internal_var, &@for_var), NO_LEX_CTXT, &@for_var);
break; break;
default: /* e.each {|*internal_var| @a, B, c[1], d.attr = internal_val; ... } */ default: /* e.each {|*internal_var| @a, B, c[1], d.attr = internal_val; ... } */
m->nd_next = node_assign(p, (NODE *)NEW_MASGN(NEW_LIST($2, &@2), 0, &@2), internal_var, NO_LEX_CTXT, &@2); m->nd_next = node_assign(p, (NODE *)NEW_MASGN(NEW_LIST($for_var, &@for_var), 0, &@for_var), internal_var, NO_LEX_CTXT, &@for_var);
} }
/* {|*internal_id| <m> = internal_id; ... } */ /* {|*internal_id| <m> = internal_id; ... } */
args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &@2), &@2); args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &@for_var), &@for_var);
scope = NEW_SCOPE2(tbl, args, $8, &@$); scope = NEW_SCOPE2(tbl, args, $compstmt, &@$);
if ($6 == keyword_do_cond) { if ($do == keyword_do_cond) {
$$ = NEW_FOR($5, scope, &@$, &@1, &@3, &@6, &@9); $$ = NEW_FOR($5, scope, &@$, &@k_for, &@keyword_in, &@do, &@k_end);
} else { } else {
$$ = NEW_FOR($5, scope, &@$, &@1, &@3, &NULL_LOC, &@9); $$ = NEW_FOR($5, scope, &@$, &@k_for, &@keyword_in, &NULL_LOC, &@k_end);
} }
fixpos($$, $2); fixpos($$, $for_var);
/*% ripper: for!($:2, $:5, $:8) %*/ /*% ripper: for!($:for_var, $:expr_value, $:compstmt) %*/
} }
| k_class cpath superclass | k_class cpath superclass
{ {