Commit 968ebac0 authored by Kazuaki Tanaka's avatar Kazuaki Tanaka

Bytecode decoder support, MRB_BYTECODE_DECODE_OPTION

parent c698c67e
...@@ -176,6 +176,10 @@ typedef struct mrb_state { ...@@ -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); void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
#endif #endif
#ifdef MRB_BYTECODE_DECODE_OPTION
void (*bytecode_decoder)(struct mrb_state* mrb, mrb_code *code);
#endif
struct RClass *eException_class; struct RClass *eException_class;
struct RClass *eStandardError_class; struct RClass *eStandardError_class;
struct RObject *nomem_err; /* pre-allocated NoMemoryError */ struct RObject *nomem_err; /* pre-allocated NoMemoryError */
......
...@@ -719,13 +719,20 @@ argnum_error(mrb_state *mrb, mrb_int num) ...@@ -719,13 +719,20 @@ argnum_error(mrb_state *mrb, mrb_int num)
#define CODE_FETCH_HOOK(mrb, irep, pc, regs) #define CODE_FETCH_HOOK(mrb, irep, pc, regs)
#endif #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 #if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER
#define DIRECT_THREADED #define DIRECT_THREADED
#endif #endif
#ifndef DIRECT_THREADED #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 CASE(op) case op:
#define NEXT pc++; break #define NEXT pc++; break
#define JUMP break #define JUMP break
...@@ -735,8 +742,8 @@ argnum_error(mrb_state *mrb, mrb_int num) ...@@ -735,8 +742,8 @@ argnum_error(mrb_state *mrb, mrb_int num)
#define INIT_DISPATCH JUMP; return mrb_nil_value(); #define INIT_DISPATCH JUMP; return mrb_nil_value();
#define CASE(op) L_ ## op: #define CASE(op) L_ ## op:
#define NEXT 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=*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 #define END_DISPATCH
......
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