parse.y: support anonymous block argument introduced by Ruby3.1.

parent bd88870a
...@@ -1334,17 +1334,19 @@ lambda_body(codegen_scope *s, node *tree, int blk) ...@@ -1334,17 +1334,19 @@ lambda_body(codegen_scope *s, node *tree, int blk)
if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) { if (ma > 0x1f || oa > 0x1f || pa > 0x1f || ka > 0x1f) {
codegen_error(s, "too many formal arguments"); codegen_error(s, "too many formal arguments");
} }
/* (23bits = 5:5:1:5:5:1:1) */
a = MRB_ARGS_REQ(ma) a = MRB_ARGS_REQ(ma)
| MRB_ARGS_OPT(oa) | MRB_ARGS_OPT(oa)
| (ra? MRB_ARGS_REST() : 0) | (ra? MRB_ARGS_REST() : 0)
| MRB_ARGS_POST(pa) | MRB_ARGS_POST(pa)
| MRB_ARGS_KEY(ka, kd) | MRB_ARGS_KEY(ka, kd)
| (ba? MRB_ARGS_BLOCK() : 0); | (ba? MRB_ARGS_BLOCK() : 0);
s->ainfo = (((ma+oa) & 0x3f) << 7) /* (12bits = 5:1:5:1) */ genop_W(s, OP_ENTER, a);
/* (12bits = 5:1:5:1) */
s->ainfo = (((ma+oa) & 0x3f) << 7)
| ((ra & 0x1) << 6) | ((ra & 0x1) << 6)
| ((pa & 0x1f) << 1) | ((pa & 0x1f) << 1)
| ((ka | kd) != 0 ? 0x01 : 0x00); | ((ka | kd) ? 1 : 0);
genop_W(s, OP_ENTER, a);
/* generate jump table for optional arguments initializer */ /* generate jump table for optional arguments initializer */
pos = new_label(s); pos = new_label(s);
for (i=0; i<oa; i++) { for (i=0; i<oa; i++) {
...@@ -2066,7 +2068,7 @@ false_always(node *tree) ...@@ -2066,7 +2068,7 @@ false_always(node *tree)
} }
static void static void
gen_blkmove(codegen_scope *s, int ainfo, int lv) gen_blkmove(codegen_scope *s, uint16_t ainfo, int lv)
{ {
int m1 = (ainfo>>7)&0x3f; int m1 = (ainfo>>7)&0x3f;
int r = (ainfo>>6)&0x1; int r = (ainfo>>6)&0x1;
...@@ -3102,7 +3104,17 @@ codegen(codegen_scope *s, node *tree, int val) ...@@ -3102,7 +3104,17 @@ codegen(codegen_scope *s, node *tree, int val)
break; break;
case NODE_BLOCK_ARG: case NODE_BLOCK_ARG:
codegen(s, tree, val); if (!tree) {
int idx = lv_idx(s, MRB_OPSYM_2(s->mrb, and));
if (idx == 0) {
codegen_error(s, "no anonymous block argument");
}
gen_move(s, cursp(), idx, val);
}
else {
codegen(s, tree, val);
}
break; break;
case NODE_INT: case NODE_INT:
......
...@@ -2603,6 +2603,10 @@ block_arg : tAMPER arg ...@@ -2603,6 +2603,10 @@ block_arg : tAMPER arg
{ {
$$ = new_block_arg(p, $2); $$ = new_block_arg(p, $2);
} }
| tAMPER
{
$$ = new_block_arg(p, 0);
}
; ;
opt_block_arg : comma block_arg opt_block_arg : comma block_arg
...@@ -3944,6 +3948,10 @@ f_block_arg : blkarg_mark tIDENTIFIER ...@@ -3944,6 +3948,10 @@ f_block_arg : blkarg_mark tIDENTIFIER
{ {
$$ = $2; $$ = $2;
} }
| blkarg_mark
{
$$ = intern_op(and);
}
; ;
opt_f_block_arg : ',' f_block_arg opt_f_block_arg : ',' f_block_arg
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment