summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-02-17 23:11:49 -0800
committerYukihiro "Matz" Matsumoto <[email protected]>2013-02-17 23:11:49 -0800
commit66a7b04b251aa33d557f9515f8cac16560266c3c (patch)
tree5b9f1336456543bb5533ac108d7599b9d49cbc96 /src
parent9b06a4506ed2ae222b19cafd184c66521b720581 (diff)
parentbc44d06c7374d5b925d8936227e6976622365a3e (diff)
downloadmruby-66a7b04b251aa33d557f9515f8cac16560266c3c.tar.gz
mruby-66a7b04b251aa33d557f9515f8cac16560266c3c.zip
Merge pull request #845 from masuidrive/hook_fetch
Added a hook at VM code fetch.
Diffstat (limited to 'src')
-rw-r--r--src/vm.c12
1 files changed, 9 insertions, 3 deletions
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