summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mrbconf.h4
-rw-r--r--include/mruby.h4
-rw-r--r--src/vm.c12
3 files changed, 17 insertions, 3 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h
index 17f6a0fc3..74cbd308b 100644
--- a/include/mrbconf.h
+++ b/include/mrbconf.h
@@ -50,6 +50,7 @@
//#define DISABLE_TIME /* Time class */
//#define DISABLE_STRUCT /* Struct class */
//#define DISABLE_STDIO /* use of stdio */
+//#define DISABLE_DEBUG /* hooks for debugger */
/* Now DISABLE_GEMS is added as a command line flag in Rakefile, */
/* we do not need to set it here. */
@@ -118,6 +119,9 @@ typedef short mrb_sym;
#ifndef DISABLE_STDIO
#define ENABLE_STDIO
#endif
+#ifndef DISABLE_DEBUG
+#define ENABLE_DEBUG
+#endif
#ifndef FALSE
# define FALSE 0
diff --git a/include/mruby.h b/include/mruby.h
index fb73b60b9..bebbf6b04 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -133,6 +133,10 @@ typedef struct mrb_state {
struct RNode *local_svar;/* regexp */
#endif
+#ifdef ENABLE_DEBUG
+ void (*hook_vm_fetch_code)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
+#endif
+
struct RClass *eException_class;
struct RClass *eStandardError_class;
diff --git a/src/vm.c b/src/vm.c
index 7ad113d3b..5dc96fd65 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -480,13 +480,19 @@ argnum_error(mrb_state *mrb, int num)
mrb->exc = (struct RObject*)mrb_object(exc);
}
+#ifdef ENABLE_DEBUG
+#define HOOK_MRB_VM_FETCH_CODE(mrb, irep, pc, regs) ((mrb)->hook_vm_fetch_code ? (mrb)->hook_vm_fetch_code((mrb), (irep), (pc), (regs)) : NULL)
+#else
+#define HOOK_MRB_VM_FETCH_CODE(mrb, irep, pc, regs)
+#endif
+
#ifdef __GNUC__
#define DIRECT_THREADED
#endif
#ifndef DIRECT_THREADED
-#define INIT_DISPATCH for (;;) { i = *pc; switch (GET_OPCODE(i)) {
+#define INIT_DISPATCH for (;;) { i = *pc; HOOK_MRB_VM_FETCH_CODE(mrb, irep, pc, regs); switch (GET_OPCODE(i)) {
#define CASE(op) case op:
#define NEXT pc++; break
#define JUMP break
@@ -496,8 +502,8 @@ argnum_error(mrb_state *mrb, int num)
#define INIT_DISPATCH JUMP; return mrb_nil_value();
#define CASE(op) L_ ## op:
-#define NEXT i=*++pc; goto *optable[GET_OPCODE(i)]
-#define JUMP i=*pc; goto *optable[GET_OPCODE(i)]
+#define NEXT i=*++pc; HOOK_MRB_VM_FETCH_CODE(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
+#define JUMP i=*pc; HOOK_MRB_VM_FETCH_CODE(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
#define END_DISPATCH