diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 2917206eb03911b09cd4f052dee1b3daab1c28ba..9a963175fc780378321fc069d961a897df35920e 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: interpret_functions.h,v 1.111 2002/10/28 13:01:31 nilsson Exp $
+|| $Id: interpret_functions.h,v 1.112 2002/11/02 15:43:45 grubba Exp $
 */
 
 /*
@@ -52,6 +52,12 @@
 #define OPCODE0_TAILRETURN(A, B, F, C)	OPCODE0_TAILRETURN(A, B, F) --- C
 #define OPCODE1_TAILRETURN(A, B, F, C)	OPCODE1_TAILRETURN(A, B, F) --- C
 #define OPCODE2_TAILRETURN(A, B, F, C)	OPCODE2_TAILRETURN(A, B, F) --- C
+#define OPCODE0_BRANCH(A, B, F, C)	OPCODE0_BRANCH(A, B, F) --- C
+#define OPCODE1_BRANCH(A, B, F, C)	OPCODE1_BRANCH(A, B, F) --- C
+#define OPCODE2_BRANCH(A, B, F, C)	OPCODE2_BRANCH(A, B, F) --- C
+#define OPCODE0_TAILBRANCH(A, B, F, C)	OPCODE0_TAILBRANCH(A, B, F) --- C
+#define OPCODE1_TAILBRANCH(A, B, F, C)	OPCODE1_TAILBRANCH(A, B, F) --- C
+#define OPCODE2_TAILBRANCH(A, B, F, C)	OPCODE2_TAILBRANCH(A, B, F) --- C
 #endif /* GEN_PROTOS */
 
 
@@ -69,6 +75,16 @@
 #define INTER_RETURN return -1
 #endif
 
+/* BRANCH opcodes use these two to indicate whether the
+ * branch should be taken or not.
+ */
+#ifndef DO_BRANCH
+#define DO_BRANCH	DOJUMP
+#endif
+#ifndef DONT_BRANCH
+#define DONT_BRANCH	SKIPJUMP
+#endif
+
 #ifndef OVERRIDE_JUMPS
 
 #undef GET_JUMP
@@ -1159,10 +1175,11 @@ OPCODE0_JUMP(F_CATCH, "catch", 0, {
     /* There was a return inside the evaluated code */
     DO_DUMB_RETURN;
   case 2:
+    /* Escape catch, continue after the escape instruction. */
     DO_JUMP_TO(Pike_fp->pc);
     break;
   default:
-    DO_JUMP_TO(PROG_COUNTER + GET_JUMP());
+    DOJUMP();
   }
   /* NOT_REACHED */
 });
diff --git a/src/interpreter.h b/src/interpreter.h
index a40ada534fa2984611bab5cdad1f5be6ab24ad3c..bfc5be41bbc3fda7acb345d03424a85cd8720e76 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: interpreter.h,v 1.78 2002/10/11 01:39:32 nilsson Exp $
+|| $Id: interpreter.h,v 1.79 2002/11/02 15:34:35 grubba Exp $
 */
 
 #undef LOW_GET_ARG
@@ -315,6 +315,13 @@ static int eval_instruction(PIKE_OPCODE_T *pc)
 #define OPCODE1_TAILJUMP(OP, DESC, FLAGS, CODE) CASE(OP); CODE
 #define OPCODE2_TAILJUMP(OP, DESC, FLAGS, CODE) CASE(OP); CODE
 
+#define OPCODE0_BRANCH		OPCODE0_JUMP
+#define OPCODE1_BRANCH		OPCODE1_JUMP
+#define OPCODE2_BRANCH		OPCODE2_JUMP
+#define OPCODE0_TAILBRANCH	OPCODE0_TAILJUMP
+#define OPCODE1_TAILBRANCH	OPCODE1_TAILJUMP
+#define OPCODE2_TAILBRANCH	OPCODE2_TAILJUMP
+
 #include "interpret_functions.h"
 
 #ifndef HAVE_COMPUTED_GOTO      
@@ -340,6 +347,18 @@ static int eval_instruction(PIKE_OPCODE_T *pc)
 #undef OPCODE0_TAILJUMP
 #undef OPCODE1_TAILJUMP
 #undef OPCODE2_TAILJUMP
+#undef OPCODE0_RETURN
+#undef OPCODE1_RETURN
+#undef OPCODE2_RETURN
+#undef OPCODE0_TAILRETURN
+#undef OPCODE1_TAILRETURN
+#undef OPCODE2_TAILRETURN
+#undef OPCODE0_BRANCH
+#undef OPCODE1_BRANCH
+#undef OPCODE2_BRANCH
+#undef OPCODE0_TAILBRANCH
+#undef OPCODE1_TAILBRANCH
+#undef OPCODE2_TAILBRANCH
 #undef LABEL
 #define LABEL(OP)			&&PIKE_CONCAT(LABEL_,OP)
 #define NULL_LABEL(OP)			NULL
diff --git a/src/opcodes.h b/src/opcodes.h
index da7573029acbefc90b120a565a4b2b1f74fc988a..ee3d1e837af12a0c3db2e3e70b1507016325594f 100644
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: opcodes.h,v 1.30 2002/10/11 01:39:34 nilsson Exp $
+|| $Id: opcodes.h,v 1.31 2002/11/02 15:29:34 grubba Exp $
 */
 
 #ifndef OPCODES_H
@@ -10,10 +10,6 @@
 
 /* Opcodes */
 
-/*
- * These values are used by the stack machine, and can not be directly
- * called from Pike.
- */
 #define OPCODE0(X,Y,F) X,
 #define OPCODE1(X,Y,F) X,
 #define OPCODE2(X,Y,F) X,
@@ -32,9 +28,19 @@
 #define OPCODE0_TAILRETURN(X,Y,F) X,
 #define OPCODE1_TAILRETURN(X,Y,F) X,
 #define OPCODE2_TAILRETURN(X,Y,F) X,
+#define OPCODE0_BRANCH(X,Y,F) X,
+#define OPCODE1_BRANCH(X,Y,F) X,
+#define OPCODE2_BRANCH(X,Y,F) X,
+#define OPCODE0_TAILBRANCH(X,Y,F) X,
+#define OPCODE1_TAILBRANCH(X,Y,F) X,
+#define OPCODE2_TAILBRANCH(X,Y,F) X,
 
 enum Pike_opcodes
 {
+  /*
+   * These values are used by the stack machine, and can not be directly
+   * called from Pike.
+   */
   F_OFFSET = 257,
   F_PREFIX_256,
   F_PREFIX_512,
@@ -51,19 +57,19 @@ enum Pike_opcodes
   F_PREFIX2_WORDX256,
   F_PREFIX2_24BITX256,
 
-/*
- * These are the predefined functions that can be accessed from Pike.
- */
+  /*
+   * These are the predefined functions that can be accessed from Pike.
+   */
 
 #include "interpret_protos.h"
 
   /* Used to mark an entry point from eval_instruction(). */
   F_ENTRY,
 
-/*
- * These are token values that needn't have an associated code for the
- * compiled file
- */
+  /*
+   * These are token values that needn't have an associated code for the
+   * compiled file
+   */
   F_MAX_OPCODE,
 
   F_ADD_EQ,
@@ -127,6 +133,12 @@ enum Pike_opcodes
 #undef OPCODE0_TAILRETURN
 #undef OPCODE1_TAILRETURN
 #undef OPCODE2_TAILRETURN
+#undef OPCODE0_BRANCH
+#undef OPCODE1_BRANCH
+#undef OPCODE2_BRANCH
+#undef OPCODE0_TAILBRANCH
+#undef OPCODE1_TAILBRANCH
+#undef OPCODE2_TAILBRANCH
 
 
 /* Prototypes begin here */