diff --git a/src/interpret.c b/src/interpret.c
index 4094ff3a5bde68f7c8efe96333c7f47b51e33e8e..2b5e0601602943cf5a565accd83eb19d27155fcc 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: interpret.c,v 1.144 2000/04/19 16:03:30 mast Exp $");
+RCSID("$Id: interpret.c,v 1.145 2000/04/21 00:29:48 hubbe Exp $");
 #include "interpret.h"
 #include "object.h"
 #include "program.h"
@@ -417,6 +417,8 @@ static char trace_buffer[200];
 #define DOJUMP() \
  do { int tmp; tmp=EXTRACT_INT(pc); pc+=tmp; if(tmp < 0) fast_check_threads_etc(6); }while(0)
 
+#define SKIPJUMP() pc+=sizeof(INT32)
+
 #define COMPARISMENT(ID,EXPR) \
 CASE(ID); \
 instr=EXPR; \
@@ -522,7 +524,6 @@ void dump_backlog(void)
 }
 
 #endif
-
 static int o_catch(unsigned char *pc);
 
 #ifdef PIKE_DEBUG
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 1ef9d46a56ccbb535152546daa7cbca4bad39681..e9903ee4d89e91de956f544b7797764a7c06529e 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -1,5 +1,5 @@
 /*
- * $Id: interpret_functions.h,v 1.14 2000/04/20 22:30:08 grubba Exp $
+ * $Id: interpret_functions.h,v 1.15 2000/04/21 00:29:48 hubbe Exp $
  *
  * Opcode definitions for the interpreter.
  */
@@ -190,7 +190,6 @@ OPCODE2(F_EXTERNAL,"external")
 			   arg1 + inherit->identifier_level);
   Pike_sp++;
   print_return_value();
-  break;
 }
 BREAK;
 
@@ -235,9 +234,7 @@ OPCODE2(F_EXTERNAL_LVALUE,"& external")
   Pike_sp->type=T_LVALUE;
   Pike_sp->u.integer=id + inherit->identifier_level;
   Pike_sp++;
-  break;
 }
-
 BREAK;
 
 OPCODE1(F_MARK_AND_LOCAL, "mark & local")
@@ -312,7 +309,6 @@ OPCODE2(F_LEXICAL_LOCAL,"lexical local")
   }
   push_svalue(f->locals + arg1);
   print_return_value();
-  break;
 }
 BREAK;
 
@@ -328,7 +324,6 @@ OPCODE2(F_LEXICAL_LOCAL_LVALUE,"&lexical local")
   Pike_sp[0].u.lval=f->locals+arg1;
   Pike_sp[1].type=T_VOID;
   Pike_sp+=2;
-  break;
 }
 BREAK;
 
@@ -344,53 +339,49 @@ OPCODE1(F_ARRAY_LVALUE, "[ lvalues ]")
 BREAK;
 
 OPCODE1(F_CLEAR_2_LOCAL, "clear 2 local")
-  instr = arg1;
-  free_svalues(Pike_fp->locals + instr, 2, -1);
-  Pike_fp->locals[instr].type = PIKE_T_INT;
-  Pike_fp->locals[instr].subtype = 0;
-  Pike_fp->locals[instr].u.integer = 0;
-  Pike_fp->locals[instr+1].type = PIKE_T_INT;
-  Pike_fp->locals[instr+1].subtype = 0;
-  Pike_fp->locals[instr+1].u.integer = 0;
+  free_svalues(Pike_fp->locals + arg1, 2, -1);
+  Pike_fp->locals[arg1].type = PIKE_T_INT;
+  Pike_fp->locals[arg1].subtype = 0;
+  Pike_fp->locals[arg1].u.integer = 0;
+  Pike_fp->locals[arg1+1].type = PIKE_T_INT;
+  Pike_fp->locals[arg1+1].subtype = 0;
+  Pike_fp->locals[arg1+1].u.integer = 0;
 BREAK;
 
 OPCODE1(F_CLEAR_4_LOCAL, "clear 4 local")
 {
   int e;
-  instr = arg1;
-  free_svalues(Pike_fp->locals + instr, 4, -1);
+  free_svalues(Pike_fp->locals + arg1, 4, -1);
   for(e = 0; e < 4; e++)
   {
-    Pike_fp->locals[instr+e].type = PIKE_T_INT;
-    Pike_fp->locals[instr+e].subtype = 0;
-    Pike_fp->locals[instr+e].u.integer = 0;
+    Pike_fp->locals[arg1+e].type = PIKE_T_INT;
+    Pike_fp->locals[arg1+e].subtype = 0;
+    Pike_fp->locals[arg1+e].u.integer = 0;
   }
 }
 BREAK;
 
 OPCODE1(F_CLEAR_LOCAL, "clear local")
-  instr = arg1;
-  free_svalue(Pike_fp->locals + instr);
-  Pike_fp->locals[instr].type = PIKE_T_INT;
-  Pike_fp->locals[instr].subtype = 0;
-  Pike_fp->locals[instr].u.integer = 0;
+  free_svalue(Pike_fp->locals + arg1);
+  Pike_fp->locals[arg1].type = PIKE_T_INT;
+  Pike_fp->locals[arg1].subtype = 0;
+  Pike_fp->locals[arg1].u.integer = 0;
 BREAK;
 
 OPCODE1(F_INC_LOCAL, "++local")
-  instr = arg1;
-  if( (Pike_fp->locals[instr].type == PIKE_T_INT)
+  if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
 #ifdef AUTO_BIGNUM
-      && (!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[instr].u.integer, 1))
+      && (!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
 #endif /* AUTO_BIGNUM */
       )
   {
-    Pike_fp->locals[instr].u.integer++;
-    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+instr);
+    Pike_fp->locals[arg1].u.integer++;
+    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+arg1);
   } else {
-    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+instr);
+    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+arg1);
     push_int(1);
     f_add(2);
-    assign_svalue(Pike_fp->locals+instr,Pike_sp-1);
+    assign_svalue(Pike_fp->locals+arg1,Pike_sp-1);
   }
 BREAK;
 
@@ -430,20 +421,19 @@ OPCODE1(F_INC_LOCAL_AND_POP, "++local and pop")
 BREAK;
 
 OPCODE1(F_DEC_LOCAL, "--local")
-  instr = arg1;
-  if( (Pike_fp->locals[instr].type == PIKE_T_INT)
+  if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
 #ifdef AUTO_BIGNUM
-      && (!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[instr].u.integer, 1))
+      && (!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
 #endif /* AUTO_BIGNUM */
       )
   {
-    Pike_fp->locals[instr].u.integer--;
-    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+instr);
+    Pike_fp->locals[arg1].u.integer--;
+    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+arg1);
   } else {
-    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+instr);
+    assign_svalue_no_free(Pike_sp++,Pike_fp->locals+arg1);
     push_int(1);
     o_subtract();
-    assign_svalue(Pike_fp->locals+instr,Pike_sp-1);
+    assign_svalue(Pike_fp->locals+arg1,Pike_sp-1);
   }
 BREAK;
 
@@ -791,8 +781,11 @@ OPCODE1(F_POP_N_ELEMS, "pop_n_elems")
   pop_n_elems(arg1);
 BREAK;
 
-      CASE(F_MARK2); *(Pike_mark_sp++)=Pike_sp;
-      CASE(F_MARK); *(Pike_mark_sp++)=Pike_sp; break;
+OPCODE0_TAIL(F_MARK2,"mark mark")
+  *(Pike_mark_sp++)=Pike_sp;
+OPCODE0(F_MARK,"mark")
+  *(Pike_mark_sp++)=Pike_sp;
+BREAK;
 
 OPCODE1(F_MARK_X, "mark sp-X")
   *(Pike_mark_sp++)=Pike_sp-arg1;
@@ -807,60 +800,59 @@ OPCODE0(F_CLEAR_STRING_SUBTYPE, "clear string subtype")
 BREAK;
 
       /* Jumps */
-      CASE(F_BRANCH);
-      DOJUMP();
-      break;
+OPCODE0_JUMP(F_BRANCH,"branch")
+  DOJUMP();
+BREAK;
 
-      CASE(F_BRANCH_IF_NOT_LOCAL_ARROW);
-      {
-	struct svalue tmp;
-	tmp.type=PIKE_T_STRING;
-	tmp.u.string=Pike_fp->context.prog->strings[GET_ARG()];
-	tmp.subtype=1;
-	Pike_sp->type=PIKE_T_INT;	
-	Pike_sp++;
-	index_no_free(Pike_sp-1,Pike_fp->locals+GET_ARG2() , &tmp);
-	print_return_value();
-      }
+OPCODE2(F_BRANCH_IF_NOT_LOCAL_ARROW,"branch if !local->x")
+{
+  struct svalue tmp;
+  tmp.type=PIKE_T_STRING;
+  tmp.u.string=Pike_fp->context.prog->strings[arg1];
+  tmp.subtype=1;
+  Pike_sp->type=PIKE_T_INT;	
+  Pike_sp++;
+  index_no_free(Pike_sp-1,Pike_fp->locals+arg2, &tmp);
+  print_return_value();
+}
 
       /* Fall through */
 
-      CASE(F_BRANCH_WHEN_ZERO);
-      if(!IS_ZERO(Pike_sp-1))
-      {
-	pc+=sizeof(INT32);
-      }else{
-	DOJUMP();
-      }
-      pop_stack();
-      break;
+OPCODE0_TAILJUMP(F_BRANCH_WHEN_ZERO,"branch if zero")
+  if(!IS_ZERO(Pike_sp-1))
+  {
+    SKIPJUMP();
+  }else{
+    DOJUMP();
+  }
+  pop_stack();
+BREAK;
 
       
-      CASE(F_BRANCH_WHEN_NON_ZERO);
-      if(IS_ZERO(Pike_sp-1))
-      {
-	pc+=sizeof(INT32);
-      }else{
-	DOJUMP();
-      }
-      pop_stack();
-      break;
+OPCODE0_JUMP(F_BRANCH_WHEN_NON_ZERO,"branch if not zero")
+  if(IS_ZERO(Pike_sp-1))
+  {
+    SKIPJUMP();
+  }else{
+    DOJUMP();
+  }
+  pop_stack();
+BREAK
 
-      CASE(F_BRANCH_IF_LOCAL);
-      instr=GET_ARG();
-      if(IS_ZERO(Pike_fp->locals + instr))
-      {
-	pc+=sizeof(INT32);
-      }else{
-	DOJUMP();
-      }
-      break;
+OPCODE1_JUMP(F_BRANCH_IF_LOCAL,"branch if local")
+  if(IS_ZERO(Pike_fp->locals + arg1))
+  {
+    SKIPJUMP();
+  }else{
+    DOJUMP();
+  }
+BREAK;
 
       CASE(F_BRANCH_IF_NOT_LOCAL);
       instr=GET_ARG();
       if(!IS_ZERO(Pike_fp->locals + instr))
       {
-	pc+=sizeof(INT32);
+	SKIPJUMP();
       }else{
 	DOJUMP();
       }
@@ -876,7 +868,7 @@ BREAK;
       CASE(F_BRANCH_AND_POP_WHEN_ZERO);
       if(!IS_ZERO(Pike_sp-1))
       {
-	pc+=sizeof(INT32);
+	SKIPJUMP();
       }else{
 	DOJUMP();
 	pop_stack();
@@ -886,7 +878,7 @@ BREAK;
       CASE(F_BRANCH_AND_POP_WHEN_NON_ZERO);
       if(IS_ZERO(Pike_sp-1))
       {
-	pc+=sizeof(INT32);
+	SKIPJUMP();
       }else{
 	DOJUMP();
 	pop_stack();
@@ -896,7 +888,7 @@ BREAK;
       CASE(F_LAND);
       if(!IS_ZERO(Pike_sp-1))
       {
-	pc+=sizeof(INT32);
+	SKIPJUMP();
 	pop_stack();
       }else{
 	DOJUMP();
@@ -906,7 +898,7 @@ BREAK;
       CASE(F_LOR);
       if(IS_ZERO(Pike_sp-1))
       {
-	pc+=sizeof(INT32);
+	SKIPJUMP();
 	pop_stack();
       }else{
 	DOJUMP();
@@ -917,7 +909,7 @@ BREAK;
       if(!is_eq(Pike_sp-2,Pike_sp-1))
       {
 	pop_n_elems(2);
-	pc+=sizeof(INT32);
+	SKIPJUMP();
       }else{
 	pop_n_elems(2);
 	push_int(1);
@@ -929,7 +921,7 @@ BREAK;
       if(is_eq(Pike_sp-2,Pike_sp-1))
       {
 	pop_n_elems(2);
-	pc+=sizeof(INT32);
+	SKIPJUMP();
       }else{
 	pop_n_elems(2);
 	push_int(0);
@@ -983,7 +975,7 @@ BREAK;
 	  pc+=EXTRACT_INT(pc);
 	  Pike_sp[-1].u.integer++;
 	}else{
-	  pc+=sizeof(INT32);
+	  SKIPJUMP();
 	}
 	break;
       }
diff --git a/src/interpreter.h b/src/interpreter.h
index e6c2df64fd251784fa45a9ee518defa57e11822e..2b32803c578243feb4ca85ea22a0bcf04e9f924e 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -1,3 +1,4 @@
+
 #undef GET_ARG
 #undef GET_ARG2
 
@@ -151,10 +152,29 @@ static int eval_instruction(unsigned char *pc)
   INT32 arg1=GET_ARG(); \
   INT32 arg2=GET_ARG2();
 
+
 #define OPCODE0_TAIL(OP,DESC) CASE(OP);
 #define OPCODE1_TAIL(OP,DESC) CASE(OP);
 #define OPCODE2_TAIL(OP,DESC) CASE(OP);
 
+#define OPCODE0_JUMP(OP,DESC) CASE(OP); {
+
+/* These are something of a special case as they
+ * requires a POINTER stored explicitly after
+ * the instruction itself.
+ */
+#define OPCODE1_JUMP(OP,DESC) CASE(OP); { \
+  INT32 arg1=GET_ARG(); \
+
+#define OPCODE2_JUMP(OP,DESC) CASE(OP); { \
+  INT32 arg1=GET_ARG(); \
+  INT32 arg2=GET_ARG2();
+
+#define OPCODE0_TAILJUMP(OP,DESC) CASE(OP);
+#define OPCODE1_TAILJUMP(OP,DESC) CASE(OP); 
+#define OPCODE2_TAILJUMP(OP,DESC) CASE(OP); 
+
+
 
 #define BREAK break; }
      
diff --git a/src/lex.c b/src/lex.c
index dc6d3a75de66b7ad31ef709b0dc26c176d145155..053732ae51b2fd115a46efa3c099f0650111769b 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: lex.c,v 1.76 2000/04/20 22:30:21 grubba Exp $");
+RCSID("$Id: lex.c,v 1.77 2000/04/21 00:29:48 hubbe Exp $");
 #include "language.h"
 #include "array.h"
 #include "lex.h"
@@ -79,6 +79,14 @@ void exit_lex(void)
 #define OPCODE1_TAIL(OP,DESC) { DESC, OP, I_HASARG },
 #define OPCODE2_TAIL(OP,DESC) { DESC, OP, I_TWO_ARGS },
 
+#define OPCODE0_JUMP(OP,DESC) { DESC, OP, I_ISJUMP },
+#define OPCODE1_JUMP(OP,DESC) { DESC, OP, I_HASARG },
+#define OPCODE2_JUMP(OP,DESC) { DESC, OP, I_TWO_ARGS },
+
+#define OPCODE0_TAILJUMP(OP,DESC) { DESC, OP, I_ISJUMP },
+#define OPCODE1_TAILJUMP(OP,DESC) { DESC, OP, I_HASARG },
+#define OPCODE2_TAILJUMP(OP,DESC) { DESC, OP, I_TWO_ARGS },
+
 #define LEXER
 
 struct keyword instr_names[]=
@@ -125,12 +133,7 @@ struct keyword instr_names[]=
 { "for",		F_FOR,0 },
 { "index",              F_INDEX,0 },
 
-{ "branch",             F_BRANCH, I_ISJUMP },
-{ "branch non zero",	F_BRANCH_WHEN_NON_ZERO, I_ISJUMP },	
-{ "branch if local",	F_BRANCH_IF_LOCAL, I_HASARG },	
 { "branch if !local",	F_BRANCH_IF_NOT_LOCAL, I_HASARG },	
-{ "branch if ! local->x",	F_BRANCH_IF_NOT_LOCAL_ARROW, I_TWO_ARGS },
-{ "branch when zero",	F_BRANCH_WHEN_ZERO, I_ISJUMP },	
 { "branch if <",	F_BRANCH_WHEN_LT, I_ISJUMP },
 { "branch if >",	F_BRANCH_WHEN_GT, I_ISJUMP },
 { "branch if <=",	F_BRANCH_WHEN_LE, I_ISJUMP },
@@ -155,8 +158,6 @@ struct keyword instr_names[]=
 { "local function call",F_CALL_LFUN, I_HASARG },
 { "local function call and pop",F_CALL_LFUN_AND_POP, I_HASARG },
 { "lvalue_list",	F_LVALUE_LIST,0 },	
-{ "mark",               F_MARK,0 },
-{ "mark mark",          F_MARK2,0 },
 { "return",		F_RETURN,0 },
 { "return 0",		F_RETURN_0,0 },
 { "return 1",		F_RETURN_1,0 },
diff --git a/src/peep.c b/src/peep.c
index e2387e890ecb1bbbe1c95631d23986479f8d77b4..93f4c2a7aae5e2d615a52290d4745602f3086f1e 100644
--- a/src/peep.c
+++ b/src/peep.c
@@ -14,7 +14,7 @@
 #include "stuff.h"
 #include "bignum.h"
 
-RCSID("$Id: peep.c,v 1.30 2000/04/20 02:41:45 hubbe Exp $");
+RCSID("$Id: peep.c,v 1.31 2000/04/21 00:29:48 hubbe Exp $");
 
 struct p_instr_s
 {
@@ -345,6 +345,7 @@ void assemble(void)
       {
       case I_ISJUMP:
 	ins_f_byte(c->opcode);
+
       case I_ISPOINTER:
 #ifdef PIKE_DEBUG
 	if(c->arg > max_label || c->arg < 0) fatal("Jump to unknown label?\n");