diff --git a/src/interpret.c b/src/interpret.c
index e682d22842ee05bb5e0597cd15f6ee115dfc5eac..3761802e6c3b3dd96531395a2a8c1cef402ec52a 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: interpret.c,v 1.235 2001/07/27 08:32:03 hubbe Exp $");
+RCSID("$Id: interpret.c,v 1.236 2001/07/27 15:02:03 grubba Exp $");
 #include "interpret.h"
 #include "object.h"
 #include "program.h"
@@ -809,6 +809,14 @@ C }
 #define OPCODE1_TAILJUMP(O,N,C) OPCODE1(O,N,C)
 #define OPCODE2_TAILJUMP(O,N,C) OPCODE2(O,N,C)
 
+#define OPCODE0_RETURN(O,N,C) OPCODE0(O,N,C)
+#define OPCODE1_RETURN(O,N,C) OPCODE1(O,N,C)
+#define OPCODE2_RETURN(O,N,C) OPCODE2(O,N,C)
+
+#define OPCODE0_RETURNJUMP(O,N,C) OPCODE0(O,N,C)
+#define OPCODE1_RETURNJUMP(O,N,C) OPCODE1(O,N,C)
+#define OPCODE2_RETURNJUMP(O,N,C) OPCODE2(O,N,C)
+
 #undef HAVE_COMPUTED_GOTO
 
 #ifdef __GNUC__
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 286a816c50680b9b03c08ccaa5a9ae72ebd31679..ab6fcf35aa3ab3554b83039f1787891df9c73851 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -1,5 +1,5 @@
 /*
- * $Id: interpret_functions.h,v 1.83 2001/07/27 08:32:03 hubbe Exp $
+ * $Id: interpret_functions.h,v 1.84 2001/07/27 15:02:04 grubba Exp $
  *
  * Opcode definitions for the interpreter.
  */
@@ -41,6 +41,12 @@
 #define OPCODE0_TAILJUMP(A, B, C)	OPCODE0_TAILJUMP(A, B) C
 #define OPCODE1_TAILJUMP(A, B, C)	OPCODE1_TAILJUMP(A, B) C
 #define OPCODE2_TAILJUMP(A, B, C)	OPCODE2_TAILJUMP(A, B) C
+#define OPCODE0_RETURN(A, B, C)		OPCODE0_RETURN(A, B) C
+#define OPCODE1_RETURN(A, B, C)		OPCODE1_RETURN(A, B) C
+#define OPCODE2_RETURN(A, B, C)		OPCODE2_RETURN(A, B) C
+#define OPCODE0_TAILRETURN(A, B, C)	OPCODE0_TAILRETURN(A, B) C
+#define OPCODE1_TAILRETURN(A, B, C)	OPCODE1_TAILRETURN(A, B) C
+#define OPCODE2_TAILRETURN(A, B, C)	OPCODE2_TAILRETURN(A, B) C
 #endif /* GEN_PROTOS */
 
 
@@ -1117,7 +1123,7 @@ OPCODE0_JUMP(F_CATCH, "catch", {
   /* NOT_REACHED */
 });
 
-OPCODE0(F_ESCAPE_CATCH, "escape catch", {
+OPCODE0_RETURN(F_ESCAPE_CATCH, "escape catch", {
   Pike_fp->pc = PROG_COUNTER;
   INTER_ESCAPE_CATCH;
 });
@@ -1267,7 +1273,7 @@ OPCODE0_JUMP(F_NEW_FOREACH, "foreach++", { /* iterator, lvalue, lvalue */
 });
 
 
-OPCODE1(F_RETURN_LOCAL,"return local",{
+OPCODE1_RETURN(F_RETURN_LOCAL,"return local",{
   DO_IF_DEBUG(
     /* special case! Pike_interpreter.mark_stack may be invalid at the time we
      * call return -1, so we must call the callbacks here to
@@ -1288,26 +1294,26 @@ OPCODE1(F_RETURN_LOCAL,"return local",{
 });
 
 
-OPCODE0(F_RETURN_IF_TRUE,"return if true",{
+OPCODE0_RETURN(F_RETURN_IF_TRUE,"return if true",{
   if(!IS_ZERO(Pike_sp-1)) DO_RETURN;
   pop_stack();
 });
 
-OPCODE0(F_RETURN_1,"return 1",{
+OPCODE0_RETURN(F_RETURN_1,"return 1",{
   push_int(1);
   DO_RETURN;
 });
 
-OPCODE0(F_RETURN_0,"return 0",{
+OPCODE0_RETURN(F_RETURN_0,"return 0",{
   push_int(0);
   DO_RETURN;
 });
 
-OPCODE0(F_RETURN, "return", {
+OPCODE0_RETURN(F_RETURN, "return", {
   DO_RETURN;
 });
 
-OPCODE0(F_DUMB_RETURN,"dumb return", {
+OPCODE0_RETURN(F_DUMB_RETURN,"dumb return", {
   DO_DUMB_RETURN;
 });
 
@@ -1725,7 +1731,8 @@ OP(PIKE_CONCAT3(F_,OPCODE,_AND_POP),NAME " & pop", {			   \
   }									   \
 });									   \
 									   \
-OP(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN),NAME " & return", {		   \
+PIKE_CONCAT(OP,_RETURN)(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN),		   \
+			NAME " & return", {				   \
   if(low_mega_apply(TYPE,DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)),  \
 		    ARG2,ARG3))						   \
   {									   \
@@ -1760,7 +1767,8 @@ OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_POP),"mark, " NAME " & pop", {	   \
   }									   \
 });									   \
 									   \
-OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN),"mark, " NAME " & return", {   \
+PIKE_CONCAT(OP,_RETURN)(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN),	   \
+			"mark, " NAME " & return", {			   \
   if(low_mega_apply(TYPE,0,						   \
 		    ARG2,ARG3))						   \
   {									   \
@@ -1831,7 +1839,7 @@ OPCODE1(F_CALL_BUILTIN_AND_POP,"call builtin & pop", {
   pop_stack();
 });
 
-OPCODE1(F_CALL_BUILTIN_AND_RETURN,"call builtin & return", {
+OPCODE1_RETURN(F_CALL_BUILTIN_AND_RETURN,"call builtin & return", {
   DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)));
   DO_DUMB_RETURN;
 });
@@ -1846,7 +1854,7 @@ OPCODE1(F_MARK_CALL_BUILTIN_AND_POP, "mark, call builtin & pop", {
   pop_stack();
 });
 
-OPCODE1(F_MARK_CALL_BUILTIN_AND_RETURN, "mark, call builtin & return", {
+OPCODE1_RETURN(F_MARK_CALL_BUILTIN_AND_RETURN, "mark, call builtin & return", {
   DO_CALL_BUILTIN(0);
   DO_DUMB_RETURN;
 });
diff --git a/src/interpreter.h b/src/interpreter.h
index e7fa871d75352f074ac1e57f7aba1b9c07f3b499..344fc53268b92d72798825d8ce6199ca9f2a622b 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -278,6 +278,13 @@ static int eval_instruction(PIKE_OPCODE_T *pc)
 #define OPCODE1_TAIL(OP, DESC, CODE) CASE(OP); CODE
 #define OPCODE2_TAIL(OP, DESC, CODE) CASE(OP); CODE
 
+#define OPCODE0_RETURN(OP, DESC, CODE) OPCODE0(OP, DESC, CODE)
+#define OPCODE1_RETURN(OP, DESC, CODE) OPCODE1(OP, DESC, CODE)
+#define OPCODE2_RETURN(OP, DESC, CODE) OPCODE2(OP, DESC, CODE)
+#define OPCODE0_TAILRETURN(OP, DESC, CODE) OPCODE0_TAIL(OP, DESC, CODE)
+#define OPCODE1_TAILRETURN(OP, DESC, CODE) OPCODE1_TAIL(OP, DESC, CODE)
+#define OPCODE2_TAILRETURN(OP, DESC, CODE) OPCODE2_TAIL(OP, DESC, CODE)
+
 #define OPCODE0_JUMP(OP, DESC, CODE) CASE(OP); CODE; DONE
 #define OPCODE0_TAILJUMP(OP, DESC, CODE) CASE(OP); CODE
 
@@ -341,6 +348,12 @@ static int eval_instruction(PIKE_OPCODE_T *pc)
 #define OPCODE0_TAILJUMP(OP,DESC)	LABEL(OP),
 #define OPCODE1_TAILJUMP(OP,DESC)	LABEL(OP),
 #define OPCODE2_TAILJUMP(OP,DESC)	LABEL(OP),
+#define OPCODE0_RETURN(OP,DESC)		LABEL(OP),
+#define OPCODE1_RETURN(OP,DESC)		LABEL(OP),
+#define OPCODE2_RETURN(OP,DESC)		LABEL(OP),
+#define OPCODE0_TAILRETURN(OP,DESC)	LABEL(OP),
+#define OPCODE1_TAILRETURN(OP,DESC)	LABEL(OP),
+#define OPCODE2_TAILRETURN(OP,DESC)	LABEL(OP),
 
  init_strap:
   strap = &&normal_strap;
diff --git a/src/lex.c b/src/lex.c
index 8017dde19c0079be86c2a1902eb20f956bb8b64e..b4570f400b64d0a6fdf8dd4e3959875302c5a446 100644
--- a/src/lex.c
+++ b/src/lex.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: lex.c,v 1.99 2001/07/24 13:51:53 grubba Exp $");
+RCSID("$Id: lex.c,v 1.100 2001/07/27 15:02:05 grubba Exp $");
 #include "language.h"
 #include "array.h"
 #include "lex.h"
@@ -165,6 +165,13 @@ void exit_lex(void)
 #define OPCODE1_TAILJUMP(OP,DESC) void PIKE_CONCAT(opcode_,OP)(INT32);
 #define OPCODE2_TAILJUMP(OP,DESC) void PIKE_CONCAT(opcode_,OP)(INT32,INT32);
 
+#define OPCODE0_RETURN(OP, DESC) OPCODE0(OP, DESC)
+#define OPCODE1_RETURN(OP, DESC) OPCODE1(OP, DESC)
+#define OPCODE2_RETURN(OP, DESC) OPCODE2(OP, DESC)
+#define OPCODE0_TAILRETURN(OP, DESC) OPCODE0_TAIL(OP, DESC)
+#define OPCODE1_TAILRETURN(OP, DESC) OPCODE1_TAIL(OP, DESC)
+#define OPCODE2_TAILRETURN(OP, DESC) OPCODE2_TAIL(OP, DESC)
+
 #include "interpret_protos.h"
 
 #undef OPCODE0
diff --git a/src/opcodes.h b/src/opcodes.h
index 3b9f138f90412d1f22322a1ef69d16ea9c3cd9b0..d86676f5b19e7bc5f550952f53e860a504f2b8da 100644
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: opcodes.h,v 1.22 2001/07/24 13:51:53 grubba Exp $
+ * $Id: opcodes.h,v 1.23 2001/07/27 15:02:05 grubba Exp $
  */
 #ifndef OPCODES_H
 #define OPCODES_H
@@ -28,6 +28,12 @@
 #define OPCODE0_TAILJUMP(X,Y) X,
 #define OPCODE1_TAILJUMP(X,Y) X,
 #define OPCODE2_TAILJUMP(X,Y) X,
+#define OPCODE0_RETURN(X,Y) X,
+#define OPCODE1_RETURN(X,Y) X,
+#define OPCODE2_RETURN(X,Y) X,
+#define OPCODE0_TAILRETURN(X,Y) X,
+#define OPCODE1_TAILRETURN(X,Y) X,
+#define OPCODE2_TAILRETURN(X,Y) X,
 
 enum Pike_opcodes
 {
@@ -114,6 +120,12 @@ enum Pike_opcodes
 #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
 
 
 /* Prototypes begin here */