diff --git a/src/interpreter.h b/src/interpreter.h
index da3debe82a32e6a01590d5e0510dc1d0e3ed26df..11d270f2b841f504b65e18095d49074da2ef9f51 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -1,6 +1,8 @@
 
 #undef GET_ARG
 #undef GET_ARG2
+#undef GET_JUMP
+#undef SKIPJUMP
 
 #ifdef PIKE_DEBUG
 
@@ -15,14 +17,25 @@
   instr=prefix2,\
   prefix2=0,\
   instr+=EXTRACT_UCHAR(pc++),\
-  (t_flag>3 ? sprintf(trace_buffer,"-    Arg2= %ld\n",(long)instr),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\
+  (t_flag>3 ? sprintf(trace_buffer,"-    Arg2 = %ld\n",(long)instr),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\
   instr))
 
+#define GET_JUMP() (backlog[backlogp].arg=(\
+  (t_flag>3 ? sprintf(trace_buffer,"-    Target = %+ld\n",(long)EXTRACT_INT(pc)),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\
+  EXTRACT_INT(pc)))
+
+#define SKIPJUMP() (GET_JUMP(), pc+=sizeof(INT32))
+
 #else
 #define GET_ARG() (instr=prefix,prefix=0,instr+EXTRACT_UCHAR(pc++))
 #define GET_ARG2() (instr=prefix2,prefix2=0,instr+EXTRACT_UCHAR(pc++))
+#define GET_JUMP() EXTRACT_INT(pc)
+#define SKIPJUMP() pc+=sizeof(INT32)
 #endif
 
+#define DOJUMP() \
+ do { int tmp; tmp=GET_JUMP(); pc+=tmp; if(tmp < 0) fast_check_threads_etc(6); }while(0)
+
 static int eval_instruction(unsigned char *pc)
 {
   unsigned INT32 prefix2=0,instr, prefix=0;
@@ -33,8 +46,42 @@ static int eval_instruction(unsigned char *pc)
     instr=EXTRACT_UCHAR(pc++);
 
 #ifdef PIKE_DEBUG
+    if(t_flag > 2)
+    {
+      char *file, *f;
+      INT32 linep;
+
+      file=get_line(pc-1,Pike_fp->context.prog,&linep);
+      while((f=STRCHR(file,'/'))) file=f+1;
+      fprintf(stderr,"- %s:%4ld:(%lx): %-25s %4ld %4ld\n",
+	      file,(long)linep,
+	      DO_NOT_WARN((long)(pc-Pike_fp->context.prog->program-1)),
+	      get_f_name(instr + F_OFFSET),
+	      DO_NOT_WARN((long)(Pike_sp-Pike_interpreter.evaluator_stack)),
+	      DO_NOT_WARN((long)(Pike_mark_sp-Pike_interpreter.mark_stack)));
+    }
+
+    if(instr + F_OFFSET < F_MAX_OPCODE) 
+      ADD_RUNNED(instr + F_OFFSET);
+
     if(d_flag)
     {
+      backlogp++;
+      if(backlogp >= BACKLOG) backlogp=0;
+
+      if(backlog[backlogp].program)
+	free_program(backlog[backlogp].program);
+
+      backlog[backlogp].program=Pike_fp->context.prog;
+      add_ref(Pike_fp->context.prog);
+      backlog[backlogp].instruction=instr;
+      backlog[backlogp].pc=pc;
+      backlog[backlogp].stack = Pike_sp - Pike_interpreter.evaluator_stack;
+      backlog[backlogp].mark_stack = Pike_mark_sp - Pike_interpreter.mark_stack;
+#ifdef _REENTRANT
+      backlog[backlogp].thread_id=Pike_interpreter.thread_id;
+#endif
+
 #ifdef _REENTRANT
       CHECK_INTERPRETER_LOCK();
       if(OBJ2THREAD(Pike_interpreter.thread_id)->state.thread_id != Pike_interpreter.thread_id)
@@ -79,22 +126,6 @@ static int eval_instruction(unsigned char *pc)
       
       if(d_flag > 9) do_debug();
 
-      backlogp++;
-      if(backlogp >= BACKLOG) backlogp=0;
-
-      if(backlog[backlogp].program)
-	free_program(backlog[backlogp].program);
-
-      backlog[backlogp].program=Pike_fp->context.prog;
-      add_ref(Pike_fp->context.prog);
-      backlog[backlogp].instruction=instr;
-      backlog[backlogp].pc=pc;
-      backlog[backlogp].stack = Pike_sp - Pike_interpreter.evaluator_stack;
-      backlog[backlogp].mark_stack = Pike_mark_sp - Pike_interpreter.mark_stack;
-#ifdef _REENTRANT
-      backlog[backlogp].thread_id=Pike_interpreter.thread_id;
-#endif
-
       debug_malloc_touch(Pike_fp->current_object);
       switch(d_flag)
       {
@@ -112,24 +143,6 @@ static int eval_instruction(unsigned char *pc)
 	  break;
       }
     }
-
-    if(t_flag > 2)
-    {
-      char *file, *f;
-      INT32 linep;
-
-      file=get_line(pc-1,Pike_fp->context.prog,&linep);
-      while((f=STRCHR(file,'/'))) file=f+1;
-      fprintf(stderr,"- %s:%4ld:(%lx): %-25s %4ld %4ld\n",
-	      file,(long)linep,
-	      DO_NOT_WARN((long)(pc-Pike_fp->context.prog->program-1)),
-	      get_f_name(instr + F_OFFSET),
-	      DO_NOT_WARN((long)(Pike_sp-Pike_interpreter.evaluator_stack)),
-	      DO_NOT_WARN((long)(Pike_mark_sp-Pike_interpreter.mark_stack)));
-    }
-
-    if(instr + F_OFFSET < F_MAX_OPCODE) 
-      ADD_RUNNED(instr + F_OFFSET);
 #endif
 
     switch(instr)