diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-11-26 10:34:31 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-11-26 10:34:31 +0900 |
| commit | 7150c6753933f12a2ba63769fb7b3a44cfcddd3d (patch) | |
| tree | cddfd89197039d98cac827837e58bd3041d88a2a /src/vm.c | |
| parent | 6dedd6a940194881c3b66124ff277c4cb14d08bd (diff) | |
| download | mruby-7150c6753933f12a2ba63769fb7b3a44cfcddd3d.tar.gz mruby-7150c6753933f12a2ba63769fb7b3a44cfcddd3d.zip | |
Make `OP_JMP*` operand address to be relative.
Jump target address is `operand (16bit)` + `address of next instruction`.
In addition, `ilen` was made `uint32_t` so that `iseq` length limitation
of 65536 is removed. Only jump target address should be within signed
16bit (-32768 .. 32767).
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -1274,26 +1274,26 @@ RETRY_TRY_BLOCK: } CASE(OP_JMP, S) { - pc = irep->iseq+a; + pc += (int16_t)a; JUMP; } CASE(OP_JMPIF, BS) { if (mrb_test(regs[a])) { - pc = irep->iseq+b; + pc += (int16_t)b; JUMP; } NEXT; } CASE(OP_JMPNOT, BS) { if (!mrb_test(regs[a])) { - pc = irep->iseq+b; + pc += (int16_t)b; JUMP; } NEXT; } CASE(OP_JMPNIL, BS) { if (mrb_nil_p(regs[a])) { - pc = irep->iseq+b; + pc += (int16_t)b; JUMP; } NEXT; @@ -1306,6 +1306,7 @@ RETRY_TRY_BLOCK: mrb_assert(mrb_integer_p(target)); a = (uint32_t)mrb_integer(target); mrb_assert(a >= 0 && a < irep->ilen); + a = a - (pc - irep->iseq); } CHECKPOINT_MAIN(RBREAK_TAG_JUMP) { ch = catch_handler_find(mrb, mrb->c->ci, pc, MRB_CATCH_FILTER_ENSURE); @@ -1319,7 +1320,7 @@ RETRY_TRY_BLOCK: CHECKPOINT_END(RBREAK_TAG_JUMP); mrb->exc = NULL; /* clear break object */ - pc = irep->iseq + a; + pc += (int16_t)a; JUMP; } |
