summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorKazuaki Tanaka <[email protected]>2016-09-20 23:07:28 +0000
committerKazuaki Tanaka <[email protected]>2016-09-20 23:07:28 +0000
commit968ebac00183b2d015be89349d10c4ee96664e47 (patch)
treeb2712bb8684d26ecf44f06f534284358f40ab1b8 /src
parentc698c67e106efae8ed7c68025b115cd3f7f06512 (diff)
downloadmruby-968ebac00183b2d015be89349d10c4ee96664e47.tar.gz
mruby-968ebac00183b2d015be89349d10c4ee96664e47.zip
Bytecode decoder support, MRB_BYTECODE_DECODE_OPTION
Diffstat (limited to 'src')
-rw-r--r--src/vm.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/vm.c b/src/vm.c
index cf8bae723..d0c86c6c7 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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