diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-02-01 16:07:48 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-02-01 16:20:58 +0900 |
| commit | d759a73525f2bff367433454e4d2851f7c193693 (patch) | |
| tree | 8b6007bb9a1d90e0a46a0b21cb124147f9eddfec /src/vm.c | |
| parent | bd6b48fa3b352bbcb97463dcb95e30db37bff2e4 (diff) | |
| download | mruby-d759a73525f2bff367433454e4d2851f7c193693.tar.gz mruby-d759a73525f2bff367433454e4d2851f7c193693.zip | |
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.
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -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]; |
