mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Allow more than 256 child irep; fix #5310
We have introduced following new instructions. * `OP_LAMBDA16` * `OP_BLOCK16` * `OP_METHOD16` * `OP_EXEC16` Each instruction uses 16 bits operand for `reps` index. Since new instructions are added, `mruby/c` VM should be updated. Due to new instructions, dump format compatibility is lost, we have increased `RITE_BINARY_MAJOR_VER`. In addition, we have decreased the size of `refcnt` in `mrb_irep` from `uint32_t` to `uint16_t`, which is reasonably big enough.
This commit is contained in:
@@ -371,6 +371,15 @@ codedump(mrb_state *mrb, const mrb_irep *irep)
|
||||
CASE(OP_METHOD, BB);
|
||||
printf("OP_METHOD\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
|
||||
break;
|
||||
CASE(OP_LAMBDA16, BS);
|
||||
printf("OP_LAMBDA\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
|
||||
break;
|
||||
CASE(OP_BLOCK16, BS);
|
||||
printf("OP_BLOCK\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
|
||||
break;
|
||||
CASE(OP_METHOD16, BS);
|
||||
printf("OP_METHOD\tR%d\tI(%d:%p)\n", a, b, (void*)irep->reps[b]);
|
||||
break;
|
||||
CASE(OP_RANGE_INC, B);
|
||||
printf("OP_RANGE_INC\tR%d\n", a);
|
||||
break;
|
||||
|
||||
@@ -2644,6 +2644,18 @@ RETRY_TRY_BLOCK:
|
||||
c = OP_L_METHOD;
|
||||
goto L_MAKE_LAMBDA;
|
||||
}
|
||||
CASE(OP_LAMBDA16, BS) {
|
||||
c = OP_L_LAMBDA;
|
||||
goto L_MAKE_LAMBDA;
|
||||
}
|
||||
CASE(OP_BLOCK16, BS) {
|
||||
c = OP_L_BLOCK;
|
||||
goto L_MAKE_LAMBDA;
|
||||
}
|
||||
CASE(OP_METHOD16, BS) {
|
||||
c = OP_L_METHOD;
|
||||
goto L_MAKE_LAMBDA;
|
||||
}
|
||||
|
||||
CASE(OP_RANGE_INC, B) {
|
||||
mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], FALSE);
|
||||
@@ -2699,7 +2711,11 @@ RETRY_TRY_BLOCK:
|
||||
NEXT;
|
||||
}
|
||||
|
||||
CASE(OP_EXEC, BB) {
|
||||
CASE(OP_EXEC16, BS)
|
||||
goto L_EXEC;
|
||||
CASE(OP_EXEC, BB)
|
||||
L_EXEC:
|
||||
{
|
||||
mrb_value recv = regs[a];
|
||||
struct RProc *p;
|
||||
const mrb_irep *nirep = irep->reps[b];
|
||||
|
||||
Reference in New Issue
Block a user