Revert "Remove `OP_EXT[123]` from operands."

This reverts commit fd10c723.

I thought it was OK to restrict index value within 1 byte, but in some
cases index value could be 16 bits (2 bytes). I had several ideas to
address the issue, but reverting `fd10c723` is the easiest way. The
biggest reason is `mruby/c` still supports `OP_EXT[123]`, so that they
don't need any additional work.
parent b2b0329d
...@@ -111,14 +111,9 @@ $ bin/mruby -r lib1.rb -r lib2.rb < app.mrb ...@@ -111,14 +111,9 @@ $ bin/mruby -r lib1.rb -r lib2.rb < app.mrb
`mruby3` introduces a few new instructions. `mruby3` introduces a few new instructions.
Instructions that access pool[i]/syms[i] where i>255. Instructions that load a 16/32-bit integer.
* `OP_LOADL16`
* `OP_STRING16`
* `OP_LOADSYM16`
Instructions that load a 32-bit integer.
* `OP_LOADI16`
* `OP_LOADI32` * `OP_LOADI32`
Instruction that unwinds jump table for rescue/ensure. Instruction that unwinds jump table for rescue/ensure.
......
...@@ -27,7 +27,6 @@ sign) of operands. ...@@ -27,7 +27,6 @@ sign) of operands.
| `OP_NOP` | `-` | `no operation` | | `OP_NOP` | `-` | `no operation` |
| `OP_MOVE` | `BB` | `R(a) = R(b)` | | `OP_MOVE` | `BB` | `R(a) = R(b)` |
| `OP_LOADL` | `BB` | `R(a) = Pool(b)` | | `OP_LOADL` | `BB` | `R(a) = Pool(b)` |
| `OP_LOADL16` | `BS` | `R(a) = Pool(b)` |
| `OP_LOADI` | `BB` | `R(a) = mrb_int(b)` | | `OP_LOADI` | `BB` | `R(a) = mrb_int(b)` |
| `OP_LOADINEG` | `BB` | `R(a) = mrb_int(-b)` | | `OP_LOADINEG` | `BB` | `R(a) = mrb_int(-b)` |
| `OP_LOADI__1` | `B` | `R(a) = mrb_int(-1)` | | `OP_LOADI__1` | `B` | `R(a) = mrb_int(-1)` |
...@@ -42,7 +41,6 @@ sign) of operands. ...@@ -42,7 +41,6 @@ sign) of operands.
| `OP_LOADI16` | `BS` | `R(a) = mrb_int(b)` | | `OP_LOADI16` | `BS` | `R(a) = mrb_int(b)` |
| `OP_LOADI32` | `BSS` | `R(a) = mrb_int((b<<16)+c)` | | `OP_LOADI32` | `BSS` | `R(a) = mrb_int((b<<16)+c)` |
| `OP_LOADSYM` | `BB` | `R(a) = Syms(b)` | | `OP_LOADSYM` | `BB` | `R(a) = Syms(b)` |
| `OP_LOADSYM16` | `BS` | `R(a) = Syms(b)` |
| `OP_LOADNIL` | `B` | `R(a) = nil` | | `OP_LOADNIL` | `B` | `R(a) = nil` |
| `OP_LOADSELF` | `B` | `R(a) = self` | | `OP_LOADSELF` | `B` | `R(a) = self` |
| `OP_LOADT` | `B` | `R(a) = true` | | `OP_LOADT` | `B` | `R(a) = true` |
...@@ -106,24 +104,19 @@ sign) of operands. ...@@ -106,24 +104,19 @@ sign) of operands.
| `OP_APOST` | `BBB` | `*R(a),R(a+1)..R(a+c) = R(a)[b..]` | | `OP_APOST` | `BBB` | `*R(a),R(a+1)..R(a+c) = R(a)[b..]` |
| `OP_INTERN` | `B` | `R(a) = intern(R(a))` | | `OP_INTERN` | `B` | `R(a) = intern(R(a))` |
| `OP_STRING` | `BB` | `R(a) = str_dup(Lit(b))` | | `OP_STRING` | `BB` | `R(a) = str_dup(Lit(b))` |
| `OP_STRING16` | `BS` | `R(a) = str_dup(Lit(b))` |
| `OP_STRCAT` | `B` | `str_cat(R(a),R(a+1))` | | `OP_STRCAT` | `B` | `str_cat(R(a),R(a+1))` |
| `OP_HASH` | `BB` | `R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1))` | | `OP_HASH` | `BB` | `R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1))` |
| `OP_HASHADD` | `BB` | `R(a) = hash_push(R(a),R(a+1)..R(a+b*2))` | | `OP_HASHADD` | `BB` | `R(a) = hash_push(R(a),R(a+1)..R(a+b*2))` |
| `OP_HASHCAT` | `B` | `R(a) = hash_cat(R(a),R(a+1))` | | `OP_HASHCAT` | `B` | `R(a) = hash_cat(R(a),R(a+1))` |
| `OP_LAMBDA` | `BB` | `R(a) = lambda(SEQ[b],OP_L_LAMBDA)` | | `OP_LAMBDA` | `BB` | `R(a) = lambda(SEQ[b],OP_L_LAMBDA)` |
| `OP_LAMBDA16` | `BS` | `R(a) = lambda(SEQ[b],OP_L_LAMBDA)` |
| `OP_BLOCK` | `BB` | `R(a) = lambda(SEQ[b],OP_L_BLOCK)` | | `OP_BLOCK` | `BB` | `R(a) = lambda(SEQ[b],OP_L_BLOCK)` |
| `OP_BLOCK16` | `BS` | `R(a) = lambda(SEQ[b],OP_L_BLOCK)` |
| `OP_METHOD` | `BB` | `R(a) = lambda(SEQ[b],OP_L_METHOD)` | | `OP_METHOD` | `BB` | `R(a) = lambda(SEQ[b],OP_L_METHOD)` |
| `OP_METHOD16` | `BS` | `R(a) = lambda(SEQ[b],OP_L_METHOD)` |
| `OP_RANGE_INC` | `B` | `R(a) = range_new(R(a),R(a+1),FALSE)` | | `OP_RANGE_INC` | `B` | `R(a) = range_new(R(a),R(a+1),FALSE)` |
| `OP_RANGE_EXC` | `B` | `R(a) = range_new(R(a),R(a+1),TRUE)` | | `OP_RANGE_EXC` | `B` | `R(a) = range_new(R(a),R(a+1),TRUE)` |
| `OP_OCLASS` | `B` | `R(a) = ::Object` | | `OP_OCLASS` | `B` | `R(a) = ::Object` |
| `OP_CLASS` | `BB` | `R(a) = newclass(R(a),Syms(b),R(a+1))` | | `OP_CLASS` | `BB` | `R(a) = newclass(R(a),Syms(b),R(a+1))` |
| `OP_MODULE` | `BB` | `R(a) = newmodule(R(a),Syms(b))` | | `OP_MODULE` | `BB` | `R(a) = newmodule(R(a),Syms(b))` |
| `OP_EXEC` | `BB` | `R(a) = blockexec(R(a),SEQ[b])` | | `OP_EXEC` | `BB` | `R(a) = blockexec(R(a),SEQ[b])` |
| `OP_EXEC16` | `BS` | `R(a) = blockexec(R(a),SEQ[b])` |
| `OP_DEF` | `BB` | `R(a).newmethod(Syms(b),R(a+1))` | | `OP_DEF` | `BB` | `R(a).newmethod(Syms(b),R(a+1))` |
| `OP_ALIAS` | `BB` | `alias_method(target_class,Syms(a),Syms(b))` | | `OP_ALIAS` | `BB` | `alias_method(target_class,Syms(a),Syms(b))` |
| `OP_UNDEF` | `B` | `undef_method(target_class,Syms(a))` | | `OP_UNDEF` | `B` | `undef_method(target_class,Syms(a))` |
...@@ -131,5 +124,8 @@ sign) of operands. ...@@ -131,5 +124,8 @@ sign) of operands.
| `OP_TCLASS` | `B` | `R(a) = target_class` | | `OP_TCLASS` | `B` | `R(a) = target_class` |
| `OP_DEBUG` | `BBB` | `print a,b,c` | | `OP_DEBUG` | `BBB` | `print a,b,c` |
| `OP_ERR` | `B` | `raise(LocalJumpError, Lit(a))` | | `OP_ERR` | `B` | `raise(LocalJumpError, Lit(a))` |
| `OP_EXT1` | `-` | `make 1st operand 16bit` |
| `OP_EXT2` | `-` | `make 2nd operand 16bit` |
| `OP_EXT3` | `-` | `make 1st and 2nd operands 16bit` |
| `OP_STOP` | `-` | `stop VM` | | `OP_STOP` | `-` | `stop VM` |
|------------------|--------------|--------------------------------------------------------| |------------------|--------------|--------------------------------------------------------|
...@@ -40,4 +40,34 @@ enum mrb_insn { ...@@ -40,4 +40,34 @@ enum mrb_insn {
#define FETCH_S() do {a=READ_S();} while (0) #define FETCH_S() do {a=READ_S();} while (0)
#define FETCH_W() do {a=READ_W();} while (0) #define FETCH_W() do {a=READ_W();} while (0)
/* with OP_EXT1 (1st 16bit) */
#define FETCH_Z_1() FETCH_Z()
#define FETCH_B_1() FETCH_S()
#define FETCH_BB_1() do {a=READ_S(); b=READ_B();} while (0)
#define FETCH_BBB_1() do {a=READ_S(); b=READ_B(); c=READ_B();} while (0)
#define FETCH_BS_1() do {a=READ_S(); b=READ_S();} while (0)
#define FETCH_BSS_1() do {a=READ_S(); b=READ_S();c=READ_S();} while (0)
#define FETCH_S_1() FETCH_S()
#define FETCH_W_1() FETCH_W()
/* with OP_EXT2 (2nd 16bit) */
#define FETCH_Z_2() FETCH_Z()
#define FETCH_B_2() FETCH_B()
#define FETCH_BB_2() do {a=READ_B(); b=READ_S();} while (0)
#define FETCH_BBB_2() do {a=READ_B(); b=READ_S(); c=READ_B();} while (0)
#define FETCH_BS_2() FETCH_BS()
#define FETCH_BSS_2() FETCH_BSS()
#define FETCH_S_2() FETCH_S()
#define FETCH_W_2() FETCH_W()
/* with OP_EXT3 (1st & 2nd 16bit) */
#define FETCH_Z_3() FETCH_Z()
#define FETCH_B_3() FETCH_B()
#define FETCH_BB_3() do {a=READ_S(); b=READ_S();} while (0)
#define FETCH_BBB_3() do {a=READ_S(); b=READ_S(); c=READ_B();} while (0)
#define FETCH_BS_3() do {a=READ_S(); b=READ_S();} while (0)
#define FETCH_BSS_3() FETCH_BSS_1()
#define FETCH_S_3() FETCH_S()
#define FETCH_W_3() FETCH_W()
#endif /* MRUBY_OPCODE_H */ #endif /* MRUBY_OPCODE_H */
...@@ -15,7 +15,6 @@ operation code operands semantics ...@@ -15,7 +15,6 @@ operation code operands semantics
OPCODE(NOP, Z) /* no operation */ OPCODE(NOP, Z) /* no operation */
OPCODE(MOVE, BB) /* R(a) = R(b) */ OPCODE(MOVE, BB) /* R(a) = R(b) */
OPCODE(LOADL, BB) /* R(a) = Pool(b) */ OPCODE(LOADL, BB) /* R(a) = Pool(b) */
OPCODE(LOADL16, BS) /* R(a) = Pool(b) */
OPCODE(LOADI, BB) /* R(a) = mrb_int(b) */ OPCODE(LOADI, BB) /* R(a) = mrb_int(b) */
OPCODE(LOADINEG, BB) /* R(a) = mrb_int(-b) */ OPCODE(LOADINEG, BB) /* R(a) = mrb_int(-b) */
OPCODE(LOADI__1, B) /* R(a) = mrb_int(-1) */ OPCODE(LOADI__1, B) /* R(a) = mrb_int(-1) */
...@@ -30,7 +29,6 @@ OPCODE(LOADI_7, B) /* R(a) = mrb_int(7) */ ...@@ -30,7 +29,6 @@ OPCODE(LOADI_7, B) /* R(a) = mrb_int(7) */
OPCODE(LOADI16, BS) /* R(a) = mrb_int(b) */ OPCODE(LOADI16, BS) /* R(a) = mrb_int(b) */
OPCODE(LOADI32, BSS) /* R(a) = mrb_int((b<<16)+c) */ OPCODE(LOADI32, BSS) /* R(a) = mrb_int((b<<16)+c) */
OPCODE(LOADSYM, BB) /* R(a) = Syms(b) */ OPCODE(LOADSYM, BB) /* R(a) = Syms(b) */
OPCODE(LOADSYM16, BS) /* R(a) = Syms(b) */
OPCODE(LOADNIL, B) /* R(a) = nil */ OPCODE(LOADNIL, B) /* R(a) = nil */
OPCODE(LOADSELF, B) /* R(a) = self */ OPCODE(LOADSELF, B) /* R(a) = self */
OPCODE(LOADT, B) /* R(a) = true */ OPCODE(LOADT, B) /* R(a) = true */
...@@ -94,24 +92,19 @@ OPCODE(ASET, BBB) /* R(a)[c] = R(b) */ ...@@ -94,24 +92,19 @@ OPCODE(ASET, BBB) /* R(a)[c] = R(b) */
OPCODE(APOST, BBB) /* *R(a),R(a+1)..R(a+c) = R(a)[b..] */ OPCODE(APOST, BBB) /* *R(a),R(a+1)..R(a+c) = R(a)[b..] */
OPCODE(INTERN, B) /* R(a) = intern(R(a)) */ OPCODE(INTERN, B) /* R(a) = intern(R(a)) */
OPCODE(STRING, BB) /* R(a) = str_dup(Pool(b)) */ OPCODE(STRING, BB) /* R(a) = str_dup(Pool(b)) */
OPCODE(STRING16, BS) /* R(a) = str_dup(Pool(b)) */
OPCODE(STRCAT, B) /* str_cat(R(a),R(a+1)) */ OPCODE(STRCAT, B) /* str_cat(R(a),R(a+1)) */
OPCODE(HASH, BB) /* R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1)) */ OPCODE(HASH, BB) /* R(a) = hash_new(R(a),R(a+1)..R(a+b*2-1)) */
OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b*2)) */ OPCODE(HASHADD, BB) /* R(a) = hash_push(R(a),R(a+1)..R(a+b*2)) */
OPCODE(HASHCAT, B) /* R(a) = hash_cat(R(a),R(a+1)) */ OPCODE(HASHCAT, B) /* R(a) = hash_cat(R(a),R(a+1)) */
OPCODE(LAMBDA, BB) /* R(a) = lambda(SEQ[b],L_LAMBDA) */ OPCODE(LAMBDA, BB) /* R(a) = lambda(SEQ[b],L_LAMBDA) */
OPCODE(LAMBDA16, BS) /* R(a) = lambda(SEQ[b],L_LAMBDA) */
OPCODE(BLOCK, BB) /* R(a) = lambda(SEQ[b],L_BLOCK) */ OPCODE(BLOCK, BB) /* R(a) = lambda(SEQ[b],L_BLOCK) */
OPCODE(BLOCK16, BS) /* R(a) = lambda(SEQ[b],L_BLOCK) */
OPCODE(METHOD, BB) /* R(a) = lambda(SEQ[b],L_METHOD) */ OPCODE(METHOD, BB) /* R(a) = lambda(SEQ[b],L_METHOD) */
OPCODE(METHOD16, BS) /* R(a) = lambda(SEQ[b],L_METHOD) */
OPCODE(RANGE_INC, B) /* R(a) = range_new(R(a),R(a+1),FALSE) */ OPCODE(RANGE_INC, B) /* R(a) = range_new(R(a),R(a+1),FALSE) */
OPCODE(RANGE_EXC, B) /* R(a) = range_new(R(a),R(a+1),TRUE) */ OPCODE(RANGE_EXC, B) /* R(a) = range_new(R(a),R(a+1),TRUE) */
OPCODE(OCLASS, B) /* R(a) = ::Object */ OPCODE(OCLASS, B) /* R(a) = ::Object */
OPCODE(CLASS, BB) /* R(a) = newclass(R(a),Syms(b),R(a+1)) */ OPCODE(CLASS, BB) /* R(a) = newclass(R(a),Syms(b),R(a+1)) */
OPCODE(MODULE, BB) /* R(a) = newmodule(R(a),Syms(b)) */ OPCODE(MODULE, BB) /* R(a) = newmodule(R(a),Syms(b)) */
OPCODE(EXEC, BB) /* R(a) = blockexec(R(a),SEQ[b]) */ OPCODE(EXEC, BB) /* R(a) = blockexec(R(a),SEQ[b]) */
OPCODE(EXEC16, BS) /* R(a) = blockexec(R(a),SEQ[b]) */
OPCODE(DEF, BB) /* R(a).newmethod(Syms(b),R(a+1)) */ OPCODE(DEF, BB) /* R(a).newmethod(Syms(b),R(a+1)) */
OPCODE(ALIAS, BB) /* alias_method(target_class,Syms(a),Syms(b)) */ OPCODE(ALIAS, BB) /* alias_method(target_class,Syms(a),Syms(b)) */
OPCODE(UNDEF, B) /* undef_method(target_class,Syms(a)) */ OPCODE(UNDEF, B) /* undef_method(target_class,Syms(a)) */
...@@ -119,4 +112,7 @@ OPCODE(SCLASS, B) /* R(a) = R(a).singleton_class */ ...@@ -119,4 +112,7 @@ OPCODE(SCLASS, B) /* R(a) = R(a).singleton_class */
OPCODE(TCLASS, B) /* R(a) = target_class */ OPCODE(TCLASS, B) /* R(a) = target_class */
OPCODE(DEBUG, BBB) /* print a,b,c */ OPCODE(DEBUG, BBB) /* print a,b,c */
OPCODE(ERR, B) /* raise(LocalJumpError, Pool(a)) */ OPCODE(ERR, B) /* raise(LocalJumpError, Pool(a)) */
OPCODE(EXT1, Z) /* make 1st operand (a) 16bit */
OPCODE(EXT2, Z) /* make 2nd operand (b) 16bit */
OPCODE(EXT3, Z) /* make 1st and 2nd operands 16bit */
OPCODE(STOP, Z) /* stop VM */ OPCODE(STOP, Z) /* stop VM */
This diff is collapsed.
This diff is collapsed.
...@@ -1004,7 +1004,7 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb ...@@ -1004,7 +1004,7 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb
#ifndef DIRECT_THREADED #ifndef DIRECT_THREADED
#define INIT_DISPATCH for (;;) { insn = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (insn) { #define INIT_DISPATCH for (;;) { insn = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (insn) {
#define CASE(insn,ops) case insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc; #define CASE(insn,ops) case insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc; L_ ## insn ## _BODY:
#define NEXT goto L_END_DISPATCH #define NEXT goto L_END_DISPATCH
#define JUMP NEXT #define JUMP NEXT
#define END_DISPATCH L_END_DISPATCH:;}} #define END_DISPATCH L_END_DISPATCH:;}}
...@@ -1012,7 +1012,7 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb ...@@ -1012,7 +1012,7 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const struct RProc *proc, mrb
#else #else
#define INIT_DISPATCH JUMP; return mrb_nil_value(); #define INIT_DISPATCH JUMP; return mrb_nil_value();
#define CASE(insn,ops) L_ ## insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc; #define CASE(insn,ops) L_ ## insn: pc++; FETCH_ ## ops (); mrb->c->ci->pc = pc; L_ ## insn ## _BODY:
#define NEXT insn=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[insn] #define NEXT insn=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[insn]
#define JUMP NEXT #define JUMP NEXT
...@@ -1137,11 +1137,7 @@ RETRY_TRY_BLOCK: ...@@ -1137,11 +1137,7 @@ RETRY_TRY_BLOCK:
NEXT; NEXT;
} }
CASE(OP_LOADL16, BS) {
goto op_loadl;
}
CASE(OP_LOADL, BB) { CASE(OP_LOADL, BB) {
op_loadl:
switch (pool[b].tt) { /* number */ switch (pool[b].tt) { /* number */
case IREP_TT_INT32: case IREP_TT_INT32:
regs[a] = mrb_int_value(mrb, (mrb_int)pool[b].u.i32); regs[a] = mrb_int_value(mrb, (mrb_int)pool[b].u.i32);
...@@ -1213,11 +1209,6 @@ RETRY_TRY_BLOCK: ...@@ -1213,11 +1209,6 @@ RETRY_TRY_BLOCK:
NEXT; NEXT;
} }
CASE(OP_LOADSYM16, BS) {
SET_SYM_VALUE(regs[a], syms[b]);
NEXT;
}
CASE(OP_LOADNIL, B) { CASE(OP_LOADNIL, B) {
SET_NIL_VALUE(regs[a]); SET_NIL_VALUE(regs[a]);
NEXT; NEXT;
...@@ -1616,7 +1607,7 @@ RETRY_TRY_BLOCK: ...@@ -1616,7 +1607,7 @@ RETRY_TRY_BLOCK:
mrb->c->ci->stack[0] = mrb_nil_value(); mrb->c->ci->stack[0] = mrb_nil_value();
a = 0; a = 0;
c = OP_R_NORMAL; c = OP_R_NORMAL;
goto L_RETURN; goto L_OP_RETURN_BODY;
} }
pool = irep->pool; pool = irep->pool;
syms = irep->syms; syms = irep->syms;
...@@ -2661,12 +2652,9 @@ RETRY_TRY_BLOCK: ...@@ -2661,12 +2652,9 @@ RETRY_TRY_BLOCK:
NEXT; NEXT;
} }
CASE(OP_STRING16, BS) {
goto op_string;
}
CASE(OP_STRING, BB) { CASE(OP_STRING, BB) {
size_t len; size_t len;
op_string:
len = pool[b].tt >> 2; len = pool[b].tt >> 2;
if (pool[b].tt & IREP_TT_SFLAG) { if (pool[b].tt & IREP_TT_SFLAG) {
regs[a] = mrb_str_new_static(mrb, pool[b].u.str, len); regs[a] = mrb_str_new_static(mrb, pool[b].u.str, len);
...@@ -2744,18 +2732,6 @@ RETRY_TRY_BLOCK: ...@@ -2744,18 +2732,6 @@ RETRY_TRY_BLOCK:
c = OP_L_METHOD; c = OP_L_METHOD;
goto L_MAKE_LAMBDA; 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) { CASE(OP_RANGE_INC, B) {
mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], FALSE); mrb_value val = mrb_range_new(mrb, regs[a], regs[a+1], FALSE);
...@@ -2811,10 +2787,7 @@ RETRY_TRY_BLOCK: ...@@ -2811,10 +2787,7 @@ RETRY_TRY_BLOCK:
NEXT; NEXT;
} }
CASE(OP_EXEC16, BS)
goto L_EXEC;
CASE(OP_EXEC, BB) CASE(OP_EXEC, BB)
L_EXEC:
{ {
mrb_value recv = regs[a]; mrb_value recv = regs[a];
struct RProc *p; struct RProc *p;
...@@ -2911,6 +2884,37 @@ RETRY_TRY_BLOCK: ...@@ -2911,6 +2884,37 @@ RETRY_TRY_BLOCK:
NEXT; NEXT;
} }
CASE(OP_EXT1, Z) {
insn = READ_B();
switch (insn) {
#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _1(); goto L_OP_ ## insn ## _BODY;
#include "mruby/ops.h"
#undef OPCODE
}
pc--;
NEXT;
}
CASE(OP_EXT2, Z) {
insn = READ_B();
switch (insn) {
#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _2(); goto L_OP_ ## insn ## _BODY;
#include "mruby/ops.h"
#undef OPCODE
}
pc--;
NEXT;
}
CASE(OP_EXT3, Z) {
uint8_t insn = READ_B();
switch (insn) {
#define OPCODE(insn,ops) case OP_ ## insn: FETCH_ ## ops ## _3(); goto L_OP_ ## insn ## _BODY;
#include "mruby/ops.h"
#undef OPCODE
}
pc--;
NEXT;
}
CASE(OP_STOP, Z) { CASE(OP_STOP, Z) {
/* stop VM */ /* stop VM */
CHECKPOINT_RESTORE(RBREAK_TAG_STOP) { CHECKPOINT_RESTORE(RBREAK_TAG_STOP) {
......
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