diff options
| author | Kazuaki Tanaka <[email protected]> | 2016-09-20 23:07:28 +0000 |
|---|---|---|
| committer | Kazuaki Tanaka <[email protected]> | 2016-09-20 23:07:28 +0000 |
| commit | 968ebac00183b2d015be89349d10c4ee96664e47 (patch) | |
| tree | b2712bb8684d26ecf44f06f534284358f40ab1b8 | |
| parent | c698c67e106efae8ed7c68025b115cd3f7f06512 (diff) | |
| download | mruby-968ebac00183b2d015be89349d10c4ee96664e47.tar.gz mruby-968ebac00183b2d015be89349d10c4ee96664e47.zip | |
Bytecode decoder support, MRB_BYTECODE_DECODE_OPTION
| -rw-r--r-- | include/mruby.h | 4 | ||||
| -rw-r--r-- | src/vm.c | 13 |
2 files changed, 14 insertions, 3 deletions
diff --git a/include/mruby.h b/include/mruby.h index 63c0fca3d..57121fecf 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -176,6 +176,10 @@ typedef struct mrb_state { void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs); #endif +#ifdef MRB_BYTECODE_DECODE_OPTION + void (*bytecode_decoder)(struct mrb_state* mrb, mrb_code *code); +#endif + struct RClass *eException_class; struct RClass *eStandardError_class; struct RObject *nomem_err; /* pre-allocated NoMemoryError */ @@ -719,13 +719,20 @@ argnum_error(mrb_state *mrb, mrb_int num) #define CODE_FETCH_HOOK(mrb, irep, pc, regs) #endif +#ifdef MRB_BYTECODE_DECODE_OPTION +#define BYTECODE_DECODER(x) if( (mrb)->bytecode_decoder ) (mrb)->bytecode_decoder((mrb), (x)) +#else +#define BYTECODE_DECODER(x) (x); +#endif + + #if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER #define DIRECT_THREADED #endif #ifndef DIRECT_THREADED -#define INIT_DISPATCH for (;;) { i = *pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) { +#define INIT_DISPATCH for (;;) { i = BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) { #define CASE(op) case op: #define NEXT pc++; break #define JUMP break @@ -735,8 +742,8 @@ argnum_error(mrb_state *mrb, mrb_int num) #define INIT_DISPATCH JUMP; return mrb_nil_value(); #define CASE(op) L_ ## op: -#define NEXT i=*++pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)] -#define JUMP i=*pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)] +#define NEXT i=BYTECODE_DECODER(*++pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)] +#define JUMP i=BYTECODE_DECODER(*pc); CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)] #define END_DISPATCH |
