diff --git a/src/Makefile.in b/src/Makefile.in
index 2f7b2e6546eddb40960a7da9b548170b8217bb86..a6915482b1faad06fc2ad90193b785c02c4f5c42 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,5 +1,5 @@
 #
-# $Id: Makefile.in,v 1.265 2001/07/03 07:51:45 hubbe Exp $
+# $Id: Makefile.in,v 1.266 2001/07/06 17:17:48 grubba Exp $
 #
 
 # This line is needed on some machines.
@@ -321,20 +321,15 @@ hilfe: $(TMP_BINDIR)/hilfe Makefile
 # FIXME: Make this a configure option
 .c.o:
 	@echo "Compiling $<" ;\
+	rm -f $@.fail >/dev/null 2>&1; \
 	if $(CC) $(CFLAGS) -c $< -o $@ ; then : ; else \
 	  echo "WARNING: Compiler failure! Trying without optimization!" >&2;\
-	  echo "echo $(CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@" >&2 ;\
+	  echo "$(CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@" >&2 ;\
+	  echo "$(CC) $(PREFLAGS) $(CFLAGS) -c $< -o $@" >$@.fail ;\
 	  NO_ULIMIT=yes; \
 	  export NO_ULIMIT; \
 	  if $(CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@ ; then : ; else \
-	    err=$$?; \
-	    if test "x$(FALLBACK_CC)" = "x"; then \
-	      exit $$err; \
-	    else \
-	      echo "WARNING: Compiler failure! Trying fallback compiler!" >&2;\
-	      echo "echo $(FALLBACK_CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@" >&2 ;\
-	      $(FALLBACK_CC) $(PREFLAGS) $(NOOPTFLAGS) -c $< -o $@ ;\
-	    fi; \
+	    exit $$?; \
 	  fi; \
 	fi
 
@@ -386,7 +381,7 @@ install_interactive: pike hilfe pike-module aclocal
 
 # tidy up a bit
 tidy:
-	-rm -f *.o *.obj *.pp *.protos core y.output y.tab.c y.tab.h
+	-rm -f *.fail *.o *.obj *.pp *.protos core y.output y.tab.c y.tab.h
 	-rm -f $(TMP_BINDIR)/core *.o *.i *.i~ testsuite
 
 # make clean
@@ -703,7 +698,7 @@ modules/linker_options: modules-stamp
 module.o:  modules/modlist_headers.h modules/modlist.h
 
 $(SRCDIR)/interpret_protos.h_src: $(SRCDIR)/interpret_functions.h
-	$(CPP) $(PREFLAGS) $(SRCDIR)/interpret_functions.h | $(SRCDIR)/strip_opcodes >$(SRCDIR)/interpret_protos.h_src || { rm $(SRCDIR)/interpret_protos.h_src; exit 1; }
+	$(CPP) $(PREFLAGS) -DGEN_PROTOS $(SRCDIR)/interpret_functions.h | $(SRCDIR)/strip_opcodes >$(SRCDIR)/interpret_protos.h_src || { rm $(SRCDIR)/interpret_protos.h_src; exit 1; }
 
 lex.o: $(SRCDIR)/lex.c $(SRCDIR)/interpret_protos.h
 
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index f1a602aaf983330a6b74f9ca672e99bb54598af3..c002a6bf56675d694c5ba5ed610f743a1430522e 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -1,69 +1,91 @@
 /*
- * $Id: interpret_functions.h,v 1.68 2001/07/06 14:07:55 grubba Exp $
+ * $Id: interpret_functions.h,v 1.69 2001/07/06 17:17:49 grubba Exp $
  *
  * Opcode definitions for the interpreter.
  */
 
 #include "global.h"
 
-OPCODE0(F_UNDEFINED,"push UNDEFINED")
+#ifdef AUTO_BIGNUM
+#define DO_IF_BIGNUM(CODE)	CODE
+#else /* !AUTO_BIGNUM */
+#define DO_IF_BIGNUM(CODE)
+#endif /* AUTO_BIGNUM */
+
+#ifdef GEN_PROTOS
+/* Used to generate the interpret_protos.h file. */
+#define OPCODE0(A, B, C)		OPCODE0(A, B) C
+#define OPCODE1(A, B, C)		OPCODE1(A, B) C
+#define OPCODE2(A, B, C)		OPCODE2(A, B) C
+#define OPCODE0_TAIL(A, B, C)		OPCODE0_TAIL(A, B) C
+#define OPCODE1_TAIL(A, B, C)		OPCODE1_TAIL(A, B) C
+#define OPCODE2_TAIL(A, B, C)		OPCODE2_TAIL(A, B) C
+#define OPCODE0_JUMP(A, B, C)		OPCODE0_JUMP(A, B) C
+#define OPCODE1_JUMP(A, B, C)		OPCODE1_JUMP(A, B) C
+#define OPCODE2_JUMP(A, B, C)		OPCODE2_JUMP(A, B) C
+#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
+#endif /* GEN_PROTOS */
+
+OPCODE0(F_UNDEFINED,"push UNDEFINED", {
   push_int(0);
   Pike_sp[-1].subtype=NUMBER_UNDEFINED;
-BREAK;
+});
 
-OPCODE0(F_CONST0, "push 0")
+OPCODE0(F_CONST0, "push 0", {
   push_int(0);
-BREAK;
+});
 
-OPCODE0(F_CONST1, "push 1")
+OPCODE0(F_CONST1, "push 1", {
   push_int(1);
-BREAK;
+});
 
-OPCODE0(F_CONST_1,"push -1")
+OPCODE0(F_CONST_1,"push -1", {
   push_int(-1);
-BREAK;
+});
 
-OPCODE0(F_BIGNUM, "push 0x7fffffff")
+OPCODE0(F_BIGNUM, "push 0x7fffffff", {
   push_int(0x7fffffff);
-BREAK;
+});
 
-OPCODE1(F_NUMBER, "push int")
+OPCODE1(F_NUMBER, "push int", {
   push_int(arg1);
-BREAK;
+});
 
-OPCODE1(F_NEG_NUMBER,"push -int")
+OPCODE1(F_NEG_NUMBER,"push -int", {
   push_int(-arg1);
-BREAK;
+});
 
-OPCODE1(F_CONSTANT,"constant")
+OPCODE1(F_CONSTANT, "constant", {
   push_svalue(& Pike_fp->context.prog->constants[arg1].sval);
   print_return_value();
-BREAK;
+});
 
 /* The rest of the basic 'push value' instructions */	
 
-OPCODE1_TAIL(F_MARK_AND_STRING,"mark & string")
+OPCODE1_TAIL(F_MARK_AND_STRING,"mark & string", {
   *(Pike_mark_sp++)=Pike_sp;
 
-OPCODE1(F_STRING,"string")
-  copy_shared_string(Pike_sp->u.string,Pike_fp->context.prog->strings[arg1]);
-  Pike_sp->type=PIKE_T_STRING;
-  Pike_sp->subtype=0;
-  Pike_sp++;
-  print_return_value();
-BREAK;
+  OPCODE1(F_STRING, "string", {
+    copy_shared_string(Pike_sp->u.string,Pike_fp->context.prog->strings[arg1]);
+    Pike_sp->type=PIKE_T_STRING;
+    Pike_sp->subtype=0;
+    Pike_sp++;
+    print_return_value();
+  });
+});
 
 
-OPCODE1(F_ARROW_STRING,"->string")
+OPCODE1(F_ARROW_STRING, "->string", {
   copy_shared_string(Pike_sp->u.string,Pike_fp->context.prog->strings[arg1]);
   Pike_sp->type=PIKE_T_STRING;
   Pike_sp->subtype=1; /* Magic */
   Pike_sp++;
   print_return_value();
-BREAK;
+});
 
-OPCODE1(F_LOOKUP_LFUN, "->lfun")
-{
+OPCODE1(F_LOOKUP_LFUN, "->lfun", {
   struct svalue tmp;
   struct object *o;
   int id;
@@ -90,28 +112,26 @@ OPCODE1(F_LOOKUP_LFUN, "->lfun")
   free_svalue(Pike_sp-1);
   Pike_sp[-1] = tmp;
   print_return_value();
-}
-BREAK;
+});
 
-OPCODE0(F_FLOAT,"push float")
+OPCODE0(F_FLOAT, "push float", {
   /* FIXME, this opcode uses 'pc' which is not allowed.. */
   Pike_sp->type=PIKE_T_FLOAT;
   MEMCPY((void *)&Pike_sp->u.float_number, pc, sizeof(FLOAT_TYPE));
   pc+=sizeof(FLOAT_TYPE);
   Pike_sp++;
-BREAK;
+});
 
-OPCODE1(F_LFUN, "local function")
+OPCODE1(F_LFUN, "local function", {
   Pike_sp->u.object=Pike_fp->current_object;
   add_ref(Pike_fp->current_object);
   Pike_sp->subtype=arg1+Pike_fp->context.identifier_level;
   Pike_sp->type=PIKE_T_FUNCTION;
   Pike_sp++;
   print_return_value();
-BREAK;
+});
 
-OPCODE1(F_TRAMPOLINE, "trampoline")
-{
+OPCODE1(F_TRAMPOLINE, "trampoline", {
   struct object *o=low_clone(pike_trampoline_program);
   add_ref( ((struct pike_trampoline *)(o->storage))->frame=Pike_fp );
   ((struct pike_trampoline *)(o->storage))->func=arg1+Pike_fp->context.identifier_level;
@@ -120,55 +140,53 @@ OPCODE1(F_TRAMPOLINE, "trampoline")
   Pike_sp[-1].subtype = pike_trampoline_program->lfuns[LFUN_CALL];
   Pike_sp[-1].type = T_FUNCTION;
   print_return_value();
-}
-BREAK;
+});
 
 /* The not so basic 'push value' instructions */
 
-OPCODE1_TAIL(F_MARK_AND_GLOBAL,"mark & global")
+OPCODE1_TAIL(F_MARK_AND_GLOBAL, "mark & global", {
   *(Pike_mark_sp++)=Pike_sp;
 
-OPCODE1(F_GLOBAL,"global")
-  low_object_index_no_free(Pike_sp,
-			   Pike_fp->current_object,
-			   arg1 + Pike_fp->context.identifier_level);
-  Pike_sp++;
-  print_return_value();
-BREAK;
+  OPCODE1(F_GLOBAL, "global", {
+    low_object_index_no_free(Pike_sp,
+			     Pike_fp->current_object,
+			     arg1 + Pike_fp->context.identifier_level);
+    Pike_sp++;
+    print_return_value();
+  });
+});
 
-OPCODE2_TAIL(F_MARK_AND_EXTERNAL,"mark & external")
+OPCODE2_TAIL(F_MARK_AND_EXTERNAL, "mark & external", {
   *(Pike_mark_sp++)=Pike_sp;
 
-OPCODE2(F_EXTERNAL,"external")
-{
-  struct external_variable_context loc;
+  OPCODE2(F_EXTERNAL,"external", {
+    struct external_variable_context loc;
 
-  loc.o=Pike_fp->current_object;
-  if(!loc.o->prog)
-    Pike_error("Cannot access parent of destructed object.\n");
+    loc.o=Pike_fp->current_object;
+    if(!loc.o->prog)
+      Pike_error("Cannot access parent of destructed object.\n");
 
-  loc.parent_identifier=Pike_fp->fun;
-  loc.inherit=INHERIT_FROM_INT(loc.o->prog, Pike_fp->fun);
+    loc.parent_identifier=Pike_fp->fun;
+    loc.inherit=INHERIT_FROM_INT(loc.o->prog, Pike_fp->fun);
   
-  find_external_context(&loc, arg2);
+    find_external_context(&loc, arg2);
 
-#ifdef PIKE_DEBUG
-  TRACE((5,"-   Identifier=%d Offset=%d\n",
-	 arg1,
-	 loc.inherit->identifier_level));
-#endif
+    DO_IF_DEBUG({
+      TRACE((5,"-   Identifier=%d Offset=%d\n",
+	     arg1,
+	     loc.inherit->identifier_level));
+    });
 
-  low_object_index_no_free(Pike_sp,
-			   loc.o,
-			   arg1 + loc.inherit->identifier_level);
-  Pike_sp++;
-  print_return_value();
-}
-BREAK;
+    low_object_index_no_free(Pike_sp,
+			     loc.o,
+			     arg1 + loc.inherit->identifier_level);
+    Pike_sp++;
+    print_return_value();
+  });
+});
 
 
-OPCODE2(F_EXTERNAL_LVALUE,"& external")
-{
+OPCODE2(F_EXTERNAL_LVALUE, "& external", {
   struct external_variable_context loc;
 
   loc.o=Pike_fp->current_object;
@@ -180,44 +198,42 @@ OPCODE2(F_EXTERNAL_LVALUE,"& external")
   
   find_external_context(&loc, arg2);
 
-#ifdef PIKE_DEBUG
-  TRACE((5,"-   Identifier=%d Offset=%d\n",
-	 arg1,
-	 loc.inherit->identifier_level));
-#endif
+  DO_IF_DEBUG({
+    TRACE((5,"-   Identifier=%d Offset=%d\n",
+	   arg1,
+	   loc.inherit->identifier_level));
+  });
 
 
   ref_push_object(loc.o);
   Pike_sp->type=T_LVALUE;
   Pike_sp->u.integer=arg1 + loc.inherit->identifier_level;
   Pike_sp++;
-}
-BREAK;
+});
 
-OPCODE1(F_MARK_AND_LOCAL, "mark & local")
+OPCODE1(F_MARK_AND_LOCAL, "mark & local", {
   *(Pike_mark_sp++) = Pike_sp;
   push_svalue( Pike_fp->locals + arg1);
   print_return_value();
-BREAK;
+});
 
-OPCODE1(F_LOCAL, "local")
+OPCODE1(F_LOCAL, "local", {
   push_svalue( Pike_fp->locals + arg1);
   print_return_value();
-BREAK;
+});
 
-OPCODE2(F_2_LOCALS, "2 locals")
+OPCODE2(F_2_LOCALS, "2 locals", {
   push_svalue( Pike_fp->locals + arg1);
   print_return_value();
   push_svalue( Pike_fp->locals + arg2);
   print_return_value();
-BREAK;
+});
 
-OPCODE2(F_LOCAL_2_LOCAL, "local = local")
+OPCODE2(F_LOCAL_2_LOCAL, "local = local", {
   assign_svalue(Pike_fp->locals + arg1, Pike_fp->locals + arg2);
-BREAK;
+});
 
-OPCODE2(F_LOCAL_2_GLOBAL, "global = local")
-{
+OPCODE2(F_LOCAL_2_GLOBAL, "global = local", {
   INT32 tmp = arg1 + Pike_fp->context.identifier_level;
   struct identifier *i;
 
@@ -236,28 +252,24 @@ OPCODE2(F_LOCAL_2_GLOBAL, "global = local")
 			   i->run_time_type,
 			   Pike_fp->locals + arg2);
   }
-}
-BREAK;
+});
 
-OPCODE2(F_GLOBAL_2_LOCAL,"local = global")
-{
+OPCODE2(F_GLOBAL_2_LOCAL, "local = global", {
   INT32 tmp = arg1 + Pike_fp->context.identifier_level;
   free_svalue(Pike_fp->locals + arg2);
   low_object_index_no_free(Pike_fp->locals + arg2,
 			   Pike_fp->current_object,
 			   tmp);
-}
-BREAK;
+});
 
-OPCODE1(F_LOCAL_LVALUE, "& local")
+OPCODE1(F_LOCAL_LVALUE, "& local", {
   Pike_sp[0].type = T_LVALUE;
   Pike_sp[0].u.lval = Pike_fp->locals + arg1;
   Pike_sp[1].type = T_VOID;
   Pike_sp += 2;
-BREAK;
+});
 
-OPCODE2(F_LEXICAL_LOCAL,"lexical local")
-{
+OPCODE2(F_LEXICAL_LOCAL, "lexical local", {
   struct pike_frame *f=Pike_fp;
   while(arg2--)
   {
@@ -266,11 +278,9 @@ OPCODE2(F_LEXICAL_LOCAL,"lexical local")
   }
   push_svalue(f->locals + arg1);
   print_return_value();
-}
-BREAK;
+});
 
-OPCODE2(F_LEXICAL_LOCAL_LVALUE,"&lexical local")
-{
+OPCODE2(F_LEXICAL_LOCAL_LVALUE, "&lexical local", {
   struct pike_frame *f=Pike_fp;
   while(arg2--)
   {
@@ -281,10 +291,9 @@ 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;
+});
 
-OPCODE1(F_ARRAY_LVALUE, "[ lvalues ]")
+OPCODE1(F_ARRAY_LVALUE, "[ lvalues ]", {
   f_aggregate(arg1*2);
   Pike_sp[-1].u.array->flags |= ARRAY_LVALUE;
   Pike_sp[-1].u.array->type_field |= BIT_UNFINISHED | BIT_MIXED;
@@ -293,9 +302,9 @@ OPCODE1(F_ARRAY_LVALUE, "[ lvalues ]")
   Pike_sp[-1].type = T_ARRAY_LVALUE;
   dmalloc_touch_svalue(Pike_sp);
   Pike_sp++;
-BREAK;
+});
 
-OPCODE1(F_CLEAR_2_LOCAL, "clear 2 local")
+OPCODE1(F_CLEAR_2_LOCAL, "clear 2 local", {
   free_svalues(Pike_fp->locals + arg1, 2, -1);
   Pike_fp->locals[arg1].type = PIKE_T_INT;
   Pike_fp->locals[arg1].subtype = 0;
@@ -303,10 +312,9 @@ OPCODE1(F_CLEAR_2_LOCAL, "clear 2 local")
   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")
-{
+OPCODE1(F_CLEAR_4_LOCAL, "clear 4 local", {
   int e;
   free_svalues(Pike_fp->locals + arg1, 4, -1);
   for(e = 0; e < 4; e++)
@@ -315,21 +323,20 @@ OPCODE1(F_CLEAR_4_LOCAL, "clear 4 local")
     Pike_fp->locals[arg1+e].subtype = 0;
     Pike_fp->locals[arg1+e].u.integer = 0;
   }
-}
-BREAK;
+});
 
-OPCODE1(F_CLEAR_LOCAL, "clear local")
+OPCODE1(F_CLEAR_LOCAL, "clear local", {
   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")
+OPCODE1(F_INC_LOCAL, "++local", {
   if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
-#ifdef AUTO_BIGNUM
+      DO_IF_BIGNUM(
       && (!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
-#endif /* AUTO_BIGNUM */
+      )
       )
   {
     push_int(++(Pike_fp->locals[arg1].u.integer));
@@ -339,15 +346,15 @@ OPCODE1(F_INC_LOCAL, "++local")
     f_add(2);
     assign_svalue(Pike_fp->locals+arg1,Pike_sp-1);
   }
-BREAK;
+});
 
-OPCODE1(F_POST_INC_LOCAL, "local++")
+OPCODE1(F_POST_INC_LOCAL, "local++", {
   push_svalue( Pike_fp->locals + arg1);
 
   if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
-#ifdef AUTO_BIGNUM
+      DO_IF_BIGNUM(
       && (!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
-#endif /* AUTO_BIGNUM */
+      )
       )
   {
     Pike_fp->locals[arg1].u.integer++;
@@ -357,13 +364,13 @@ OPCODE1(F_POST_INC_LOCAL, "local++")
     f_add(2);
     stack_pop_to(Pike_fp->locals + arg1);
   }
-BREAK;
+});
 
-OPCODE1(F_INC_LOCAL_AND_POP, "++local and pop")
+OPCODE1(F_INC_LOCAL_AND_POP, "++local and pop", {
   if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
-#ifdef AUTO_BIGNUM
+      DO_IF_BIGNUM(
       && (!INT_TYPE_ADD_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
-#endif /* AUTO_BIGNUM */
+      )
       )
   {
     Pike_fp->locals[arg1].u.integer++;
@@ -373,13 +380,13 @@ OPCODE1(F_INC_LOCAL_AND_POP, "++local and pop")
     f_add(2);
     stack_pop_to(Pike_fp->locals + arg1);
   }
-BREAK;
+});
 
-OPCODE1(F_DEC_LOCAL, "--local")
+OPCODE1(F_DEC_LOCAL, "--local", {
   if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
-#ifdef AUTO_BIGNUM
+      DO_IF_BIGNUM(
       && (!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
-#endif /* AUTO_BIGNUM */
+      )
       )
   {
     push_int(--(Pike_fp->locals[arg1].u.integer));
@@ -389,15 +396,15 @@ OPCODE1(F_DEC_LOCAL, "--local")
     o_subtract();
     assign_svalue(Pike_fp->locals+arg1,Pike_sp-1);
   }
-BREAK;
+});
 
-OPCODE1(F_POST_DEC_LOCAL, "local--")
+OPCODE1(F_POST_DEC_LOCAL, "local--", {
   push_svalue( Pike_fp->locals + arg1);
 
   if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
-#ifdef AUTO_BIGNUM
+      DO_IF_BIGNUM(
       && (!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
-#endif /* AUTO_BIGNUM */
+      )
       )
   {
     Pike_fp->locals[arg1].u.integer--;
@@ -408,13 +415,13 @@ OPCODE1(F_POST_DEC_LOCAL, "local--")
     stack_pop_to(Pike_fp->locals + arg1);
   }
   /* Pike_fp->locals[instr].u.integer--; */
-BREAK;
+});
 
-OPCODE1(F_DEC_LOCAL_AND_POP, "--local and pop")
+OPCODE1(F_DEC_LOCAL_AND_POP, "--local and pop", {
   if( (Pike_fp->locals[arg1].type == PIKE_T_INT)
-#ifdef AUTO_BIGNUM
+      DO_IF_BIGNUM(
       && (!INT_TYPE_SUB_OVERFLOW(Pike_fp->locals[arg1].u.integer, 1))
-#endif /* AUTO_BIGNUM */
+      )
       )
   {
     Pike_fp->locals[arg1].u.integer--;
@@ -424,16 +431,16 @@ OPCODE1(F_DEC_LOCAL_AND_POP, "--local and pop")
     o_subtract();
     stack_pop_to(Pike_fp->locals + arg1);
   }
-BREAK;
+});
 
-OPCODE0(F_LTOSVAL, "lvalue to svalue")
+OPCODE0(F_LTOSVAL, "lvalue to svalue", {
   dmalloc_touch_svalue(Pike_sp-2);
   dmalloc_touch_svalue(Pike_sp-1);
   lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2);
   Pike_sp++;
-BREAK;
+});
 
-OPCODE0(F_LTOSVAL2, "ltosval2")
+OPCODE0(F_LTOSVAL2, "ltosval2", {
   dmalloc_touch_svalue(Pike_sp-3);
   dmalloc_touch_svalue(Pike_sp-2);
   dmalloc_touch_svalue(Pike_sp-1);
@@ -457,9 +464,9 @@ OPCODE0(F_LTOSVAL2, "ltosval2")
     s.u.integer = 0;
     assign_lvalue(Pike_sp-4, &s);
   }
-BREAK;
+});
 
-OPCODE0(F_LTOSVAL3, "ltosval3")
+OPCODE0(F_LTOSVAL3, "ltosval3", {
   Pike_sp[0] = Pike_sp[-1];
   Pike_sp[-1] = Pike_sp[-2];
   Pike_sp[-2].type = PIKE_T_INT;
@@ -481,9 +488,9 @@ OPCODE0(F_LTOSVAL3, "ltosval3")
     s.u.integer = 0;
     assign_lvalue(Pike_sp-5, &s);
   }
-BREAK;
+});
 
-OPCODE0(F_ADD_TO_AND_POP, "+= and pop")
+OPCODE0(F_ADD_TO_AND_POP, "+= and pop", {
   Pike_sp[0]=Pike_sp[-1];
   Pike_sp[-1].type=PIKE_T_INT;
   Pike_sp++;
@@ -492,9 +499,9 @@ OPCODE0(F_ADD_TO_AND_POP, "+= and pop")
   if( Pike_sp[-1].type == PIKE_T_INT &&
       Pike_sp[-2].type == PIKE_T_INT  )
   {
-#ifdef AUTO_BIGNUM
+    DO_IF_BIGNUM(
     if(!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, Pike_sp[-2].u.integer))
-#endif
+    )
     {
       /* Optimization for a rather common case. Makes it 30% faster. */
       Pike_sp[-1].u.integer += Pike_sp[-2].u.integer;
@@ -524,10 +531,9 @@ OPCODE0(F_ADD_TO_AND_POP, "+= and pop")
   pop_n_elems(3);
  add_and_pop_done:
    ; /* make gcc happy */
-BREAK;
+});
 
-OPCODE1(F_GLOBAL_LVALUE, "& global")
-{
+OPCODE1(F_GLOBAL_LVALUE, "& global", {
   struct identifier *i;
   INT32 tmp=arg1 + Pike_fp->context.identifier_level;
   if(!Pike_fp->current_object->prog)
@@ -548,16 +554,14 @@ OPCODE1(F_GLOBAL_LVALUE, "& global")
   }
   Pike_sp[1].type=T_VOID;
   Pike_sp+=2;
-}
-BREAK;
+});
 
-OPCODE0(F_INC, "++x")
-{
+OPCODE0(F_INC, "++x", {
   union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);
   if(u
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
      && !INT_TYPE_ADD_OVERFLOW(u->integer, 1)
-#endif
+     )
      )
   {
     instr=++ u->integer;
@@ -570,16 +574,14 @@ OPCODE0(F_INC, "++x")
     assign_lvalue(Pike_sp-3, Pike_sp-1);
     stack_unlink(2);
   }
-}
-BREAK;
+});
 
-OPCODE0(F_DEC, "--x")
-{
+OPCODE0(F_DEC, "--x", {
   union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);
   if(u
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
      && !INT_TYPE_SUB_OVERFLOW(u->integer, 1)
-#endif
+     )
      )
   {
     instr=-- u->integer;
@@ -592,16 +594,14 @@ OPCODE0(F_DEC, "--x")
     assign_lvalue(Pike_sp-3, Pike_sp-1);
     stack_unlink(2);
   }
-}
-BREAK;
+});
 
-OPCODE0(F_DEC_AND_POP, "x-- and pop")
-{
+OPCODE0(F_DEC_AND_POP, "x-- and pop", {
   union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);
   if(u
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
      && !INT_TYPE_SUB_OVERFLOW(u->integer, 1)
-#endif
+     )
 )
   {
     -- u->integer;
@@ -613,16 +613,14 @@ OPCODE0(F_DEC_AND_POP, "x-- and pop")
     assign_lvalue(Pike_sp-3, Pike_sp-1);
     pop_n_elems(3);
   }
-}
-BREAK;
+});
 
-OPCODE0(F_INC_AND_POP, "x++ and pop")
-{
+OPCODE0(F_INC_AND_POP, "x++ and pop", {
   union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);
   if(u
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
      && !INT_TYPE_ADD_OVERFLOW(u->integer, 1)
-#endif
+     )
      )
   {
     instr=++ u->integer;
@@ -634,16 +632,14 @@ OPCODE0(F_INC_AND_POP, "x++ and pop")
     assign_lvalue(Pike_sp-3, Pike_sp-1);
     pop_n_elems(3);
   }
-}
-BREAK;
+});
 
-OPCODE0(F_POST_INC, "x++")
-{
+OPCODE0(F_POST_INC, "x++", {
   union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);
   if(u
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
      && !INT_TYPE_ADD_OVERFLOW(u->integer, 1)
-#endif
+     )
      )
   {
     instr=u->integer ++;
@@ -659,16 +655,14 @@ OPCODE0(F_POST_INC, "x++")
     stack_unlink(2);
     print_return_value();
   }
-}
-BREAK;
+});
 
-OPCODE0(F_POST_DEC, "x--")
-{
+OPCODE0(F_POST_DEC, "x--", {
   union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT);
   if(u
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
      && !INT_TYPE_SUB_OVERFLOW(u->integer, 1)
-#endif
+     )
      )
   {
     instr=u->integer --;
@@ -684,48 +678,46 @@ OPCODE0(F_POST_DEC, "x--")
     stack_unlink(2);
     print_return_value();
   }
-}
-BREAK;
+});
 
-OPCODE1(F_ASSIGN_LOCAL,"assign local")
+OPCODE1(F_ASSIGN_LOCAL, "assign local", {
   assign_svalue(Pike_fp->locals+arg1,Pike_sp-1);
-BREAK;
+});
 
-OPCODE0(F_ASSIGN, "assign")
+OPCODE0(F_ASSIGN, "assign", {
   assign_lvalue(Pike_sp-3,Pike_sp-1);
   free_svalue(Pike_sp-3);
   free_svalue(Pike_sp-2);
   Pike_sp[-3]=Pike_sp[-1];
   Pike_sp-=2;
-BREAK;
+});
 
-OPCODE2(F_APPLY_ASSIGN_LOCAL_AND_POP,"apply, assign local and pop")
+OPCODE2(F_APPLY_ASSIGN_LOCAL_AND_POP, "apply, assign local and pop", {
   apply_svalue(&((Pike_fp->context.prog->constants + arg1)->sval),
 	       DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)));
   free_svalue(Pike_fp->locals+arg2);
   Pike_fp->locals[arg2]=Pike_sp[-1];
   Pike_sp--;
-BREAK;
+});
 
-OPCODE2(F_APPLY_ASSIGN_LOCAL,"apply, assign local")
+OPCODE2(F_APPLY_ASSIGN_LOCAL, "apply, assign local", {
   apply_svalue(&((Pike_fp->context.prog->constants + arg1)->sval),
 	       DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)));
   assign_svalue(Pike_fp->locals+arg2, Pike_sp-1);
-BREAK;
+});
 
-OPCODE0(F_ASSIGN_AND_POP, "assign and pop")
+OPCODE0(F_ASSIGN_AND_POP, "assign and pop", {
   assign_lvalue(Pike_sp-3, Pike_sp-1);
   pop_n_elems(3);
-BREAK;
+});
 
-OPCODE1(F_ASSIGN_LOCAL_AND_POP, "assign local and pop")
+OPCODE1(F_ASSIGN_LOCAL_AND_POP, "assign local and pop", {
   free_svalue(Pike_fp->locals + arg1);
   Pike_fp->locals[arg1] = Pike_sp[-1];
   Pike_sp--;
-BREAK;
+});
 
-OPCODE1(F_ASSIGN_GLOBAL, "assign global")
-{
+OPCODE1(F_ASSIGN_GLOBAL, "assign global", {
   struct identifier *i;
   INT32 tmp=arg1 + Pike_fp->context.identifier_level;
   if(!Pike_fp->current_object->prog)
@@ -742,11 +734,9 @@ OPCODE1(F_ASSIGN_GLOBAL, "assign global")
 			   i->run_time_type,
 			   Pike_sp-1);
   }
-}
-BREAK;
+});
 
-OPCODE1(F_ASSIGN_GLOBAL_AND_POP, "assign global and pop")
-{
+OPCODE1(F_ASSIGN_GLOBAL_AND_POP, "assign global and pop", {
   struct identifier *i;
   INT32 tmp=arg1 + Pike_fp->context.identifier_level;
   if(!Pike_fp->current_object->prog)
@@ -768,70 +758,71 @@ OPCODE1(F_ASSIGN_GLOBAL_AND_POP, "assign global and pop")
 			   Pike_sp-1);
     pop_stack();
   }
-}
-BREAK;
+});
 
 
 /* Stack machine stuff */
 
-OPCODE0(F_POP_VALUE, "pop")
+OPCODE0(F_POP_VALUE, "pop", {
   pop_stack();
-BREAK;
+});
 
-OPCODE1(F_POP_N_ELEMS, "pop_n_elems")
+OPCODE1(F_POP_N_ELEMS, "pop_n_elems", {
   pop_n_elems(arg1);
-BREAK;
+});
 
-OPCODE0_TAIL(F_MARK2,"mark mark")
+OPCODE0_TAIL(F_MARK2, "mark mark", {
   *(Pike_mark_sp++)=Pike_sp;
 
 /* This opcode is only used when running with -d. Identical to F_MARK,
  * but with a different name to make the debug printouts more clear. */
-OPCODE0_TAIL(F_SYNCH_MARK,"synch mark")
+  OPCODE0_TAIL(F_SYNCH_MARK, "synch mark", {
 
-OPCODE0(F_MARK,"mark")
-  *(Pike_mark_sp++)=Pike_sp;
-BREAK;
+    OPCODE0(F_MARK, "mark", {
+      *(Pike_mark_sp++)=Pike_sp;
+    });
+  });
+});
 
-OPCODE1(F_MARK_X, "mark Pike_sp-X")
+OPCODE1(F_MARK_X, "mark Pike_sp-X", {
   *(Pike_mark_sp++)=Pike_sp-arg1;
-BREAK;
+});
 
-OPCODE0(F_POP_MARK, "pop mark")
+OPCODE0(F_POP_MARK, "pop mark", {
   --Pike_mark_sp;
-BREAK;
+});
 
-OPCODE0(F_POP_TO_MARK, "pop to mark")
+OPCODE0(F_POP_TO_MARK, "pop to mark", {
   pop_n_elems(Pike_sp - *--Pike_mark_sp);
-BREAK;
+});
 
 /* These opcodes are only used when running with -d. The reason for
  * the two aliases is mainly to keep the indentation in asm debug
  * output. */
-OPCODE0(F_CLEANUP_SYNCH_MARK, "cleanup synch mark")
-OPCODE0_TAIL(F_POP_SYNCH_MARK, "pop synch mark")
-  if (*--Pike_mark_sp != Pike_sp && d_flag) {
-    ptrdiff_t should = *Pike_mark_sp - Pike_interpreter.evaluator_stack;
-    ptrdiff_t is = Pike_sp - Pike_interpreter.evaluator_stack;
-    if (Pike_sp - *Pike_mark_sp > 0) /* not always same as Pike_sp > *Pike_mark_sp */
-      /* Some attempt to recover, just to be able to report the backtrace. */
-      pop_n_elems(Pike_sp - *Pike_mark_sp);
-    fatal("Stack out of synch - should be %ld, is %ld.\n",
-	  DO_NOT_WARN((long)should), DO_NOT_WARN((long)is));
-  }
-BREAK;
+OPCODE0(F_CLEANUP_SYNCH_MARK, "cleanup synch mark", {
+  OPCODE0_TAIL(F_POP_SYNCH_MARK, "pop synch mark", {
+    if (*--Pike_mark_sp != Pike_sp && d_flag) {
+      ptrdiff_t should = *Pike_mark_sp - Pike_interpreter.evaluator_stack;
+      ptrdiff_t is = Pike_sp - Pike_interpreter.evaluator_stack;
+      if (Pike_sp - *Pike_mark_sp > 0) /* not always same as Pike_sp > *Pike_mark_sp */
+	/* Some attempt to recover, just to be able to report the backtrace. */
+	pop_n_elems(Pike_sp - *Pike_mark_sp);
+      fatal("Stack out of synch - should be %ld, is %ld.\n",
+	    DO_NOT_WARN((long)should), DO_NOT_WARN((long)is));
+    }
+  });
+});
 
-OPCODE0(F_CLEAR_STRING_SUBTYPE, "clear string subtype")
+OPCODE0(F_CLEAR_STRING_SUBTYPE, "clear string subtype", {
   if(Pike_sp[-1].type==PIKE_T_STRING) Pike_sp[-1].subtype=0;
-BREAK;
+});
 
       /* Jumps */
-OPCODE0_JUMP(F_BRANCH,"branch")
+OPCODE0_JUMP(F_BRANCH, "branch", {
   DOJUMP();
-BREAK;
+});
 
-OPCODE2(F_BRANCH_IF_NOT_LOCAL_ARROW,"branch if !local->x")
-{
+OPCODE2_JUMP(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];
@@ -840,22 +831,22 @@ OPCODE2(F_BRANCH_IF_NOT_LOCAL_ARROW,"branch if !local->x")
   Pike_sp++;
   index_no_free(Pike_sp-1,Pike_fp->locals+arg2, &tmp);
   print_return_value();
-}
 
-      /* Fall through */
+  /* Fall through */
 
-OPCODE0_TAILJUMP(F_BRANCH_WHEN_ZERO,"branch if zero")
-  if(!IS_ZERO(Pike_sp-1))
-  {
-    SKIPJUMP();
-  }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();
+  });
+});
 
       
-OPCODE0_JUMP(F_BRANCH_WHEN_NON_ZERO,"branch if not zero")
+OPCODE0_JUMP(F_BRANCH_WHEN_NON_ZERO, "branch if not zero", {
   if(IS_ZERO(Pike_sp-1))
   {
     SKIPJUMP();
@@ -863,9 +854,9 @@ OPCODE0_JUMP(F_BRANCH_WHEN_NON_ZERO,"branch if not zero")
     DOJUMP();
   }
   pop_stack();
-BREAK
+});
 
-OPCODE1_JUMP(F_BRANCH_IF_TYPE_IS_NOT,"branch if type is !=")
+OPCODE1_JUMP(F_BRANCH_IF_TYPE_IS_NOT, "branch if type is !=", {
 /*  fprintf(stderr,"******BRANCH IF TYPE IS NOT***** %s\n",get_name_of_type(arg1)); */
   if(Pike_sp[-1].type == T_OBJECT &&
      Pike_sp[-1].u.object->prog)
@@ -887,25 +878,25 @@ OPCODE1_JUMP(F_BRANCH_IF_TYPE_IS_NOT,"branch if type is !=")
     DOJUMP();
   }
   pop_stack();
-BREAK
+});
 
-OPCODE1_JUMP(F_BRANCH_IF_LOCAL,"branch if local")
+OPCODE1_JUMP(F_BRANCH_IF_LOCAL, "branch if local", {
   if(IS_ZERO(Pike_fp->locals + arg1))
   {
     SKIPJUMP();
   }else{
     DOJUMP();
   }
-BREAK;
+});
 
-OPCODE1_JUMP(F_BRANCH_IF_NOT_LOCAL, "branch if !local")
+OPCODE1_JUMP(F_BRANCH_IF_NOT_LOCAL, "branch if !local", {
   if(!IS_ZERO(Pike_fp->locals + arg1))
   {
     SKIPJUMP();
   }else{
     DOJUMP();
   }
-BREAK;
+});
 
       CJUMP(F_BRANCH_WHEN_EQ, is_eq);
       CJUMP(F_BRANCH_WHEN_NE,!is_eq);
@@ -914,7 +905,7 @@ BREAK;
       CJUMP(F_BRANCH_WHEN_GT, is_gt);
       CJUMP(F_BRANCH_WHEN_GE,!is_lt);
 
-OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_ZERO, "branch & pop if zero")
+OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_ZERO, "branch & pop if zero", {
   if(!IS_ZERO(Pike_sp-1))
   {
     SKIPJUMP();
@@ -922,9 +913,9 @@ OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_ZERO, "branch & pop if zero")
     DOJUMP();
     pop_stack();
   }
-BREAK;
+});
 
-OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_NON_ZERO, "branch & pop if !zero")
+OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_NON_ZERO, "branch & pop if !zero", {
   if(IS_ZERO(Pike_sp-1))
   {
     SKIPJUMP();
@@ -932,9 +923,9 @@ OPCODE0_JUMP(F_BRANCH_AND_POP_WHEN_NON_ZERO, "branch & pop if !zero")
     DOJUMP();
     pop_stack();
   }
-BREAK;
+});
 
-OPCODE0_JUMP(F_LAND, "&&")
+OPCODE0_JUMP(F_LAND, "&&", {
   if(!IS_ZERO(Pike_sp-1))
   {
     SKIPJUMP();
@@ -942,9 +933,9 @@ OPCODE0_JUMP(F_LAND, "&&")
   }else{
     DOJUMP();
   }
-BREAK;
+});
 
-OPCODE0_JUMP(F_LOR, "||")
+OPCODE0_JUMP(F_LOR, "||", {
   if(IS_ZERO(Pike_sp-1))
   {
     SKIPJUMP();
@@ -952,9 +943,9 @@ OPCODE0_JUMP(F_LOR, "||")
   }else{
     DOJUMP();
   }
-BREAK;
+});
 
-OPCODE0_JUMP(F_EQ_OR, "==||")
+OPCODE0_JUMP(F_EQ_OR, "==||", {
   if(!is_eq(Pike_sp-2,Pike_sp-1))
   {
     pop_n_elems(2);
@@ -964,9 +955,9 @@ OPCODE0_JUMP(F_EQ_OR, "==||")
     push_int(1);
     DOJUMP();
   }
-BREAK;
+});
 
-OPCODE0_JUMP(F_EQ_AND, "==&&")
+OPCODE0_JUMP(F_EQ_AND, "==&&", {
   if(is_eq(Pike_sp-2,Pike_sp-1))
   {
     pop_n_elems(2);
@@ -976,9 +967,9 @@ OPCODE0_JUMP(F_EQ_AND, "==&&")
     push_int(0);
     DOJUMP();
   }
-BREAK;
+});
 
-OPCODE0_JUMP(F_CATCH, "catch")
+OPCODE0_JUMP(F_CATCH, "catch", {
   switch (o_catch(pc+sizeof(INT32))) {
   case 1:
     /* There was a return inside the evaluated code */
@@ -989,22 +980,19 @@ OPCODE0_JUMP(F_CATCH, "catch")
   default:
     pc+=GET_JUMP();
   }
-BREAK;
+});
 
-OPCODE0(F_ESCAPE_CATCH, "escape catch")
-{
+OPCODE0(F_ESCAPE_CATCH, "escape catch", {
   Pike_fp->pc = pc;
   return -2;
-}
-BREAK;
+});
 
-OPCODE0(F_THROW_ZERO, "throw(0)")
+OPCODE0(F_THROW_ZERO, "throw(0)", {
   push_int(0);
   f_throw(1);
-BREAK;
+});
 
-OPCODE1(F_SWITCH, "switch")
-{
+OPCODE1(F_SWITCH, "switch", {
   INT32 tmp;
   tmp=switch_lookup(Pike_fp->context.prog->
 		    constants[arg1].sval.u.array,Pike_sp-1);
@@ -1013,11 +1001,9 @@ OPCODE1(F_SWITCH, "switch")
   if(*(INT32*)pc < 0) fast_check_threads_etc(7);
   pc+=*(INT32*)pc;
   pop_stack();
-}
-BREAK;
+});
 
-OPCODE1(F_SWITCH_ON_INDEX, "switch on index")
-{
+OPCODE1(F_SWITCH_ON_INDEX, "switch on index", {
   INT32 tmp;
   struct svalue s;
   index_no_free(&s,Pike_sp-2,Pike_sp-1);
@@ -1030,11 +1016,9 @@ OPCODE1(F_SWITCH_ON_INDEX, "switch on index")
   pc+=(tmp>=0 ? 1+tmp*2 : 2*~tmp) * sizeof(INT32);
   if(*(INT32*)pc < 0) fast_check_threads_etc(7);
   pc+=*(INT32*)pc;
-}
-BREAK;
+});
 
-OPCODE2(F_SWITCH_ON_LOCAL, "switch on local")
-{
+OPCODE2(F_SWITCH_ON_LOCAL, "switch on local", {
   INT32 tmp;
   tmp=switch_lookup(Pike_fp->context.prog->
 		    constants[arg2].sval.u.array,Pike_fp->locals + arg1);
@@ -1042,8 +1026,7 @@ OPCODE2(F_SWITCH_ON_LOCAL, "switch on local")
   pc+=(tmp>=0 ? 1+tmp*2 : 2*~tmp) * sizeof(INT32);
   if(*(INT32*)pc < 0) fast_check_threads_etc(7);
   pc+=*(INT32*)pc;
-}
-BREAK;
+});
 
 
       /* FIXME: Does this need bignum tests? /Fixed - Hubbe */
@@ -1064,8 +1047,7 @@ BREAK;
  * l2:
  * loop(l1)
  */
-OPCODE0_JUMP(F_LOOP, "loop") /* loopcnt */
-{
+OPCODE0_JUMP(F_LOOP, "loop", { /* loopcnt */
   /* Use >= and 1 to be able to reuse the 1 for the subtraction. */
   push_int(1);
   if (!is_lt(sp-2, sp-1)) {
@@ -1075,8 +1057,7 @@ OPCODE0_JUMP(F_LOOP, "loop") /* loopcnt */
     pop_n_elems(2);
     SKIPJUMP();
   }
-}
-BREAK;
+});
 
       CASE(F_FOREACH) /* array, lvalue, X, i */
       {
@@ -1107,12 +1088,10 @@ BREAK;
 	break;
       }
 
-OPCODE0(F_MAKE_ITERATOR,"Iterator")
-{
+OPCODE0(F_MAKE_ITERATOR, "Iterator", {
   extern void f_Iterator(INT32);
   f_Iterator(1);
-}
-BREAK;
+});
 
 
       CASE(F_NEW_FOREACH) /* iterator, lvalue, lvalue */
@@ -1188,17 +1167,17 @@ BREAK;
       }
       return -1;
 
-OPCODE0(F_NEGATE, "unary minus")
+OPCODE0(F_NEGATE, "unary minus", {
   if(Pike_sp[-1].type == PIKE_T_INT)
   {
-#ifdef AUTO_BIGNUM
-    if(INT_TYPE_NEG_OVERFLOW(Pike_sp[-1].u.integer))
-    {
-      convert_stack_top_to_bignum();
-      o_negate();
-    }
-    else
-#endif /* AUTO_BIGNUM */
+    DO_IF_BIGNUM(
+      if(INT_TYPE_NEG_OVERFLOW(Pike_sp[-1].u.integer))
+      {
+	convert_stack_top_to_bignum();
+	o_negate();
+      }
+      else
+      )
       Pike_sp[-1].u.integer =- Pike_sp[-1].u.integer;
   }
   else if(Pike_sp[-1].type == PIKE_T_FLOAT)
@@ -1207,13 +1186,13 @@ OPCODE0(F_NEGATE, "unary minus")
   }else{
     o_negate();
   }
-BREAK;
+});
 
-OPCODE0(F_COMPL, "~")
+OPCODE0(F_COMPL, "~", {
   o_compl();
-BREAK;
+});
 
-OPCODE0(F_NOT, "!")
+OPCODE0(F_NOT, "!", {
   switch(Pike_sp[-1].type)
   {
   case PIKE_T_INT:
@@ -1237,15 +1216,15 @@ OPCODE0(F_NOT, "!")
     Pike_sp[-1].type=PIKE_T_INT;
     Pike_sp[-1].u.integer=0;
   }
-BREAK;
+});
 
-OPCODE0(F_LSH, "<<")
+OPCODE0(F_LSH, "<<", {
   o_lsh();
-BREAK;
+});
 
-OPCODE0(F_RSH, ">>")
+OPCODE0(F_RSH, ">>", {
   o_rsh();
-BREAK;
+});
 
       COMPARISMENT(F_EQ, is_eq(Pike_sp-2,Pike_sp-1));
       COMPARISMENT(F_NE,!is_eq(Pike_sp-2,Pike_sp-1));
@@ -1254,15 +1233,15 @@ BREAK;
       COMPARISMENT(F_LT, is_lt(Pike_sp-2,Pike_sp-1));
       COMPARISMENT(F_LE,!is_gt(Pike_sp-2,Pike_sp-1));
 
-OPCODE0(F_ADD, "+")
+OPCODE0(F_ADD, "+", {
   f_add(2);
-BREAK;
+});
 
-OPCODE0(F_ADD_INTS, "int+int")
+OPCODE0(F_ADD_INTS, "int+int", {
   if(Pike_sp[-1].type == T_INT && Pike_sp[-2].type == T_INT 
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
       && (!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, Pike_sp[-2].u.integer))
-#endif
+      )
     )
   {
     Pike_sp[-2].u.integer+=Pike_sp[-1].u.integer;
@@ -1270,9 +1249,9 @@ OPCODE0(F_ADD_INTS, "int+int")
   }else{
     f_add(2);
   }
-BREAK;
+});
 
-OPCODE0(F_ADD_FLOATS, "float+float")
+OPCODE0(F_ADD_FLOATS, "float+float", {
   if(Pike_sp[-1].type == T_FLOAT && Pike_sp[-2].type == T_FLOAT)
   {
     Pike_sp[-2].u.float_number+=Pike_sp[-1].u.float_number;
@@ -1280,41 +1259,41 @@ OPCODE0(F_ADD_FLOATS, "float+float")
   }else{
     f_add(2);
   }
-BREAK;
+});
 
-OPCODE0(F_SUBTRACT, "-")
+OPCODE0(F_SUBTRACT, "-", {
   o_subtract();
-BREAK;
+});
 
-OPCODE0(F_AND, "&")
+OPCODE0(F_AND, "&", {
   o_and();
-BREAK;
+});
 
-OPCODE0(F_OR, "|")
+OPCODE0(F_OR, "|", {
   o_or();
-BREAK;
+});
 
-OPCODE0(F_XOR, "^")
+OPCODE0(F_XOR, "^", {
   o_xor();
-BREAK;
+});
 
-OPCODE0(F_MULTIPLY, "*")
+OPCODE0(F_MULTIPLY, "*", {
   o_multiply();
-BREAK;
+});
 
-OPCODE0(F_DIVIDE, "/")
+OPCODE0(F_DIVIDE, "/", {
   o_divide();
-BREAK;
+});
 
-OPCODE0(F_MOD, "%")
+OPCODE0(F_MOD, "%", {
   o_mod();
-BREAK;
+});
 
-OPCODE1(F_ADD_INT, "add integer")
+OPCODE1(F_ADD_INT, "add integer", {
   if(Pike_sp[-1].type == T_INT
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
       && (!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, arg1))
-#endif
+      )
      )
   {
     Pike_sp[-1].u.integer+=arg1;
@@ -1322,13 +1301,13 @@ OPCODE1(F_ADD_INT, "add integer")
     push_int(arg1);
     f_add(2);
   }
-BREAK;
+});
 
-OPCODE1(F_ADD_NEG_INT, "add -integer")
+OPCODE1(F_ADD_NEG_INT, "add -integer", {
   if(Pike_sp[-1].type == T_INT
-#ifdef AUTO_BIGNUM
+     DO_IF_BIGNUM(
       && (!INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, -arg1))
-#endif
+      )
      )
   {
     Pike_sp[-1].u.integer-=arg1;
@@ -1336,9 +1315,9 @@ OPCODE1(F_ADD_NEG_INT, "add -integer")
     push_int(-arg1);
     f_add(2);
   }
-BREAK;
+});
 
-OPCODE0(F_PUSH_ARRAY, "@")
+OPCODE0(F_PUSH_ARRAY, "@", {
   switch(Pike_sp[-1].type)
   {
   default:
@@ -1361,30 +1340,27 @@ OPCODE0(F_PUSH_ARRAY, "@")
   }
   Pike_sp--;
   push_array_items(Pike_sp->u.array);
-BREAK;
+});
 
-OPCODE2(F_LOCAL_LOCAL_INDEX, "local[local]")
-{
+OPCODE2(F_LOCAL_LOCAL_INDEX, "local[local]", {
   struct svalue *s=Pike_fp->locals+arg1;
   if(s->type == PIKE_T_STRING) s->subtype=0;
   Pike_sp++->type=PIKE_T_INT;
   index_no_free(Pike_sp-1,Pike_fp->locals+arg2,s);
-}
-BREAK;
+});
 
-OPCODE1(F_LOCAL_INDEX, "local index")
-{
-  struct svalue tmp,*s=Pike_fp->locals+arg1;
+OPCODE1(F_LOCAL_INDEX, "local index", {
+  struct svalue tmp;
+  struct svalue *s = Pike_fp->locals+arg1;
   if(s->type == PIKE_T_STRING) s->subtype=0;
   index_no_free(&tmp,Pike_sp-1,s);
   free_svalue(Pike_sp-1);
   Pike_sp[-1]=tmp;
-}
-BREAK;
+});
 
-OPCODE2(F_GLOBAL_LOCAL_INDEX, "global[local]")
-{
-  struct svalue tmp,*s;
+OPCODE2(F_GLOBAL_LOCAL_INDEX, "global[local]", {
+  struct svalue tmp;
+  struct svalue *s;
   low_object_index_no_free(Pike_sp,
 			   Pike_fp->current_object,
 			   arg1 + Pike_fp->context.identifier_level);
@@ -1394,11 +1370,9 @@ OPCODE2(F_GLOBAL_LOCAL_INDEX, "global[local]")
   index_no_free(&tmp,Pike_sp-1,s);
   free_svalue(Pike_sp-1);
   Pike_sp[-1]=tmp;
-}
-BREAK;
+});
 
-OPCODE2(F_LOCAL_ARROW, "local->x")
-{
+OPCODE2(F_LOCAL_ARROW, "local->x", {
   struct svalue tmp;
   tmp.type=PIKE_T_STRING;
   tmp.u.string=Pike_fp->context.prog->strings[arg1];
@@ -1407,12 +1381,11 @@ OPCODE2(F_LOCAL_ARROW, "local->x")
   Pike_sp++;
   index_no_free(Pike_sp-1,Pike_fp->locals+arg2, &tmp);
   print_return_value();
-}
-BREAK;
+});
 
-OPCODE1(F_ARROW, "->x")
-{
-  struct svalue tmp,tmp2;
+OPCODE1(F_ARROW, "->x", {
+  struct svalue tmp;
+  struct svalue tmp2;
   tmp.type=PIKE_T_STRING;
   tmp.u.string=Pike_fp->context.prog->strings[arg1];
   tmp.subtype=1;
@@ -1420,12 +1393,11 @@ OPCODE1(F_ARROW, "->x")
   free_svalue(Pike_sp-1);
   Pike_sp[-1]=tmp2;
   print_return_value();
-}
-BREAK;
+});
 
-OPCODE1(F_STRING_INDEX, "string index")
-{
-  struct svalue tmp,tmp2;
+OPCODE1(F_STRING_INDEX, "string index", {
+  struct svalue tmp;
+  struct svalue tmp2;
   tmp.type=PIKE_T_STRING;
   tmp.u.string=Pike_fp->context.prog->strings[arg1];
   tmp.subtype=0;
@@ -1433,8 +1405,7 @@ OPCODE1(F_STRING_INDEX, "string index")
   free_svalue(Pike_sp-1);
   Pike_sp[-1]=tmp2;
   print_return_value();
-}
-BREAK;
+});
 
       CASE(F_POS_INT_INDEX);
       push_int(GET_ARG());
@@ -1457,33 +1428,33 @@ BREAK;
       print_return_value();
       break;
 
-OPCODE2(F_MAGIC_INDEX, "::`[]")
+OPCODE2(F_MAGIC_INDEX, "::`[]", {
   push_magic_index(magic_index_program, arg2, arg1);
-BREAK;
+});
 
-OPCODE2(F_MAGIC_SET_INDEX, "::`[]=")
+OPCODE2(F_MAGIC_SET_INDEX, "::`[]=", {
   push_magic_index(magic_set_index_program, arg2, arg1);
-BREAK;
+});
 
-OPCODE0(F_CAST, "cast")
+OPCODE0(F_CAST, "cast", {
   f_cast();
-BREAK;
+});
 
-OPCODE0(F_CAST_TO_INT, "cast_to_int")
+OPCODE0(F_CAST_TO_INT, "cast_to_int", {
   o_cast_to_int();
-BREAK;
+});
 
-OPCODE0(F_CAST_TO_STRING, "cast_to_string")
+OPCODE0(F_CAST_TO_STRING, "cast_to_string", {
   o_cast_to_string();
-BREAK;
+});
 
-OPCODE0(F_SOFT_CAST, "soft cast")
+OPCODE0(F_SOFT_CAST, "soft cast", {
   /* Stack: type_string, value */
-#ifdef PIKE_DEBUG
-  if (Pike_sp[-2].type != T_TYPE) {
-    fatal("Argument 1 to soft_cast isn't a type!\n");
-  }
-#endif /* PIKE_DEBUG */
+  DO_IF_DEBUG({
+    if (Pike_sp[-2].type != T_TYPE) {
+      fatal("Argument 1 to soft_cast isn't a type!\n");
+    }
+  });
   if (runtime_options & RUNTIME_CHECK_TYPES) {
     struct pike_type *sval_type = get_type_of_svalue(Pike_sp-1);
     if (!pike_types_le(sval_type, Pike_sp[-2].u.type)) {
@@ -1527,33 +1498,31 @@ OPCODE0(F_SOFT_CAST, "soft cast")
       }
     }
     free_type(sval_type);
-#ifdef PIKE_DEBUG
-    if (d_flag > 2) {
-      struct pike_string *t = describe_type(Pike_sp[-2].u.type);
-      fprintf(stderr, "Soft cast to %s\n", t->str);
-      free_string(t);
-    }
-#endif /* PIKE_DEBUG */
+
+    DO_IF_DEBUG({
+      if (d_flag > 2) {
+	struct pike_string *t = describe_type(Pike_sp[-2].u.type);
+	fprintf(stderr, "Soft cast to %s\n", t->str);
+	free_string(t);
+      }
+    });
   }
   stack_swap();
   pop_stack();
-BREAK;
+});
 
-OPCODE0(F_RANGE, "range")
+OPCODE0(F_RANGE, "range", {
   o_range();
-BREAK;
+});
 
-OPCODE0(F_COPY_VALUE, "copy_value")
-{
+OPCODE0(F_COPY_VALUE, "copy_value", {
   struct svalue tmp;
   copy_svalues_recursively_no_free(&tmp,Pike_sp-1,1,0);
   free_svalue(Pike_sp-1);
   Pike_sp[-1]=tmp;
-}
-BREAK;
+});
 
-OPCODE0(F_INDIRECT, "indirect")
-{
+OPCODE0(F_INDIRECT, "indirect", {
   struct svalue s;
   lvalue_to_svalue_no_free(&s,Pike_sp-2);
   if(s.type != PIKE_T_STRING)
@@ -1570,26 +1539,25 @@ OPCODE0(F_INDIRECT, "indirect")
     Pike_sp-=2;
     push_object(o);
   }
-}
-print_return_value();
-BREAK;
+  print_return_value();
+});
       
-OPCODE0(F_SIZEOF, "sizeof")
+OPCODE0(F_SIZEOF, "sizeof", {
   instr=pike_sizeof(Pike_sp-1);
   pop_stack();
   push_int(instr);
-BREAK;
+});
 
-OPCODE1(F_SIZEOF_LOCAL, "sizeof local")
+OPCODE1(F_SIZEOF_LOCAL, "sizeof local", {
   push_int(pike_sizeof(Pike_fp->locals+arg1));
-BREAK;
+});
 
-OPCODE1(F_SSCANF, "sscanf")
+OPCODE1(F_SSCANF, "sscanf", {
   o_sscanf(arg1);
-BREAK;
+});
 
 #define MKAPPLY(OP,OPCODE,NAME,TYPE,  ARG2, ARG3)			   \
-OP(PIKE_CONCAT(F_,OPCODE),NAME)					   \
+OP(PIKE_CONCAT(F_,OPCODE),NAME, {					   \
 if(low_mega_apply(TYPE,DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)),	   \
 		  ARG2, ARG3))						   \
 {									   \
@@ -1597,9 +1565,9 @@ if(low_mega_apply(TYPE,DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)),	   \
   Pike_fp->flags |= PIKE_FRAME_RETURN_INTERNAL;				   \
   pc=Pike_fp->pc;							   \
 }									   \
-BREAK;									   \
+});									   \
 									   \
-OP(PIKE_CONCAT3(F_,OPCODE,_AND_POP),NAME " & pop")			   \
+OP(PIKE_CONCAT3(F_,OPCODE,_AND_POP),NAME " & pop", {			   \
   if(low_mega_apply(TYPE, DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)), \
 		    ARG2, ARG3))					   \
   {									   \
@@ -1609,10 +1577,9 @@ OP(PIKE_CONCAT3(F_,OPCODE,_AND_POP),NAME " & pop")			   \
   }else{								   \
     pop_stack();							   \
   }									   \
-BREAK;									   \
+});									   \
 									   \
-OP(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN),NAME " & return")		   \
-{									   \
+OP(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN),NAME " & return", {		   \
   if(low_mega_apply(TYPE,DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)),  \
 		    ARG2,ARG3))						   \
   {									   \
@@ -1622,20 +1589,19 @@ OP(PIKE_CONCAT3(F_,OPCODE,_AND_RETURN),NAME " & return")		   \
   }else{								   \
     goto do_dumb_return;						   \
   }									   \
-}									   \
-BREAK									   \
+});									   \
 									   \
-OP(PIKE_CONCAT(F_MARK_,OPCODE),"mark, " NAME)			   \
-if(low_mega_apply(TYPE,0,						   \
-		  ARG2, ARG3))						   \
-{									   \
-  Pike_fp->next->pc=pc;							   \
-  Pike_fp->flags |= PIKE_FRAME_RETURN_INTERNAL;				   \
-  pc=Pike_fp->pc;							   \
-}									   \
-BREAK;									   \
+OP(PIKE_CONCAT(F_MARK_,OPCODE),"mark, " NAME, {				   \
+  if(low_mega_apply(TYPE,0,						   \
+		    ARG2, ARG3))					   \
+  {									   \
+    Pike_fp->next->pc=pc;						   \
+    Pike_fp->flags |= PIKE_FRAME_RETURN_INTERNAL;			   \
+    pc=Pike_fp->pc;							   \
+  }									   \
+});									   \
 									   \
-OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_POP),"mark, " NAME " & pop")	   \
+OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_POP),"mark, " NAME " & pop", {	   \
   if(low_mega_apply(TYPE, 0,						   \
 		    ARG2, ARG3))					   \
   {									   \
@@ -1645,10 +1611,9 @@ OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_POP),"mark, " NAME " & pop")	   \
   }else{								   \
     pop_stack();							   \
   }									   \
-BREAK;									   \
+});									   \
 									   \
-OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN),"mark, " NAME " & return") \
-{									   \
+OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN),"mark, " NAME " & return", {   \
   if(low_mega_apply(TYPE,0,						   \
 		    ARG2,ARG3))						   \
   {									   \
@@ -1658,8 +1623,7 @@ OP(PIKE_CONCAT3(F_MARK_,OPCODE,_AND_RETURN),"mark, " NAME " & return") \
   }else{								   \
     goto do_dumb_return;						   \
   }									   \
-}									   \
-BREAK
+})
 
 
 MKAPPLY(OPCODE1,CALL_LFUN,"call lfun",APPLY_LOW,
@@ -1710,64 +1674,47 @@ MKAPPLY(OPCODE0,CALL_FUNCTION,"call function",APPLY_STACK, 0,0);
 (*(Pike_fp->context.prog->constants[arg1].sval.u.efun->function))(ARGS)
 #endif
 
-OPCODE1(F_CALL_BUILTIN,"call builtin")
-{
+OPCODE1(F_CALL_BUILTIN, "call builtin", {
   DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)));
-}
-BREAK;
+});
 
-OPCODE1(F_CALL_BUILTIN_AND_POP,"call builtin & pop")
-{
+OPCODE1(F_CALL_BUILTIN_AND_POP,"call builtin & pop", {
   DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)));
   pop_stack();
-}
-BREAK;
+});
 
-OPCODE1(F_CALL_BUILTIN_AND_RETURN,"call builtin & return")
-{
+OPCODE1(F_CALL_BUILTIN_AND_RETURN,"call builtin & return", {
   DO_CALL_BUILTIN(DO_NOT_WARN((INT32)(Pike_sp - *--Pike_mark_sp)));
   goto do_dumb_return;
-}
-BREAK;
+});
 
 
-OPCODE1(F_MARK_CALL_BUILTIN,"mark, call builtin")
-{
+OPCODE1(F_MARK_CALL_BUILTIN, "mark, call builtin", {
   DO_CALL_BUILTIN(0);
-}
-BREAK;
+});
 
-OPCODE1(F_MARK_CALL_BUILTIN_AND_POP,"mark, call builtin & pop")
-{
+OPCODE1(F_MARK_CALL_BUILTIN_AND_POP, "mark, call builtin & pop", {
   DO_CALL_BUILTIN(0);
   pop_stack();
-}
-BREAK;
+});
 
-OPCODE1(F_MARK_CALL_BUILTIN_AND_RETURN,"mark, call builtin & return")
-{
+OPCODE1(F_MARK_CALL_BUILTIN_AND_RETURN, "mark, call builtin & return", {
   DO_CALL_BUILTIN(0);
   goto do_dumb_return;
-}
-BREAK;
+});
 
 
-OPCODE1(F_CALL_BUILTIN1,"call builtin 1")
-{
+OPCODE1(F_CALL_BUILTIN1, "call builtin 1", {
   DO_CALL_BUILTIN(1);
-}
-BREAK;
+});
 
-OPCODE1(F_CALL_BUILTIN1_AND_POP,"call builtin1 & pop")
-{
+OPCODE1(F_CALL_BUILTIN1_AND_POP, "call builtin1 & pop", {
   DO_CALL_BUILTIN(1);
   pop_stack();
-}
-BREAK;
+});
 
 /* Assume that the number of arguments is correct */
-OPCODE1_JUMP(F_COND_RECUR,"recur if not overloaded")
-{
+OPCODE1_JUMP(F_COND_RECUR, "recur if not overloaded", {
   /* FIXME:
    * this test should actually test if this function is
    * overloaded or not. Currently it only tests if
@@ -1787,68 +1734,68 @@ OPCODE1_JUMP(F_COND_RECUR,"recur if not overloaded")
     }
     DONE;
   }
-}
-/* FALL THROUGH */
 
-/* Assume that the number of arguments is correct */
-/* FIXME: Use new recursion stuff */
-OPCODE0_TAILJUMP(F_RECUR,"recur")
-OPCODE0_TAILJUMP(F_RECUR_AND_POP,"recur & pop")
-{
-  int opcode = instr;
-  unsigned char *addr;
-  struct pike_frame *new_frame;
-
-  fast_check_threads_etc(6);
-  check_c_stack(8192);
-  check_stack(256);
-
-  new_frame=alloc_pike_frame();
-  new_frame[0]=Pike_fp[0];
-
-  new_frame->refs=1;
-  new_frame->next=Pike_fp;
-
-  new_frame->save_sp = new_frame->expendible = new_frame->locals = *--Pike_mark_sp;
-  new_frame->num_args = new_frame->args =
-    DO_NOT_WARN((INT32)(Pike_sp - new_frame->locals));
-  new_frame->save_mark_sp = Pike_mark_sp;
-  new_frame->mark_sp_base = Pike_mark_sp;
-
-  addr=pc+GET_JUMP();
-  new_frame->num_locals=EXTRACT_UCHAR(addr-2);
-
-#ifdef PIKE_DEBUG
-  if(new_frame->num_args != EXTRACT_UCHAR(addr-1))
-    fatal("Wrong number of arguments in F_RECUR %d!=%d\n",
-	  new_frame->num_args, EXTRACT_UCHAR(addr-1));
-
-  if(t_flag > 3)
-    fprintf(stderr,"-    Allocating %d extra locals.\n",
-	    new_frame->num_locals - new_frame->num_args);
-#endif
-
-  clear_svalues(Pike_sp, new_frame->num_locals - new_frame->num_args);
-  Pike_sp += new_frame->num_locals - new_frame->args;
-
-  if(new_frame->scope) add_ref(new_frame->scope);
-  add_ref(new_frame->current_object);
-  add_ref(new_frame->context.prog);
-  if(new_frame->context.parent)
-    add_ref(new_frame->context.parent);
-  Pike_fp->pc=pc+sizeof(INT32);
-  Pike_fp=new_frame;
-  pc=addr;
-  new_frame->flags=PIKE_FRAME_RETURN_INTERNAL;
-  if (opcode == F_RECUR_AND_POP-F_OFFSET)
-    new_frame->flags|=PIKE_FRAME_RETURN_POP;
-}
-BREAK
+  /* FALL THROUGH */
+
+  /* Assume that the number of arguments is correct */
+  /* FIXME: Use new recursion stuff */
+  OPCODE0_TAILJUMP(F_RECUR, "recur", {
+    OPCODE0_TAILJUMP(F_RECUR_AND_POP, "recur & pop", {
+      int opcode = instr;
+      unsigned char *addr;
+      struct pike_frame *new_frame;
+
+      fast_check_threads_etc(6);
+      check_c_stack(8192);
+      check_stack(256);
+
+      new_frame=alloc_pike_frame();
+      new_frame[0]=Pike_fp[0];
+
+      new_frame->refs=1;
+      new_frame->next=Pike_fp;
+
+      new_frame->save_sp = new_frame->expendible =
+	new_frame->locals = *--Pike_mark_sp;
+      new_frame->num_args = new_frame->args =
+	DO_NOT_WARN((INT32)(Pike_sp - new_frame->locals));
+      new_frame->save_mark_sp = Pike_mark_sp;
+      new_frame->mark_sp_base = Pike_mark_sp;
+
+      addr=pc+GET_JUMP();
+      new_frame->num_locals=EXTRACT_UCHAR(addr-2);
+
+      DO_IF_DEBUG({
+	if(new_frame->num_args != EXTRACT_UCHAR(addr-1))
+	  fatal("Wrong number of arguments in F_RECUR %d!=%d\n",
+		new_frame->num_args, EXTRACT_UCHAR(addr-1));
+
+	if(t_flag > 3)
+	  fprintf(stderr,"-    Allocating %d extra locals.\n",
+		  new_frame->num_locals - new_frame->num_args);
+      });
+
+      clear_svalues(Pike_sp, new_frame->num_locals - new_frame->num_args);
+      Pike_sp += new_frame->num_locals - new_frame->args;
+
+      if(new_frame->scope) add_ref(new_frame->scope);
+      add_ref(new_frame->current_object);
+      add_ref(new_frame->context.prog);
+      if(new_frame->context.parent)
+	add_ref(new_frame->context.parent);
+      Pike_fp->pc=pc+sizeof(INT32);
+      Pike_fp=new_frame;
+      pc=addr;
+      new_frame->flags=PIKE_FRAME_RETURN_INTERNAL;
+      if (opcode == F_RECUR_AND_POP-F_OFFSET)
+	new_frame->flags|=PIKE_FRAME_RETURN_POP;
+    });
+  });
+});
 
 /* Assume that the number of arguments is correct */
 /* FIXME: adjust Pike_mark_sp */
-OPCODE0_JUMP(F_TAIL_RECUR,"tail recursion")
-{
+OPCODE0_JUMP(F_TAIL_RECUR, "tail recursion", {
   int x;
   INT32 num_locals;
   unsigned char *addr;
@@ -1860,19 +1807,19 @@ OPCODE0_JUMP(F_TAIL_RECUR,"tail recursion")
   num_locals=EXTRACT_UCHAR(addr-2);
 
 
-#ifdef PIKE_DEBUG
-  if(args != EXTRACT_UCHAR(addr-1))
-    fatal("Wrong number of arguments in F_TAIL_RECUR %d != %d\n",
-	  args, EXTRACT_UCHAR(addr-1));
-#endif
+  DO_IF_DEBUG({
+    if(args != EXTRACT_UCHAR(addr-1))
+      fatal("Wrong number of arguments in F_TAIL_RECUR %d != %d\n",
+	    args, EXTRACT_UCHAR(addr-1));
+  });
 
   if(Pike_sp-args != Pike_fp->locals)
   {
-#ifdef PIKE_DEBUG
-    if (Pike_sp < Pike_fp->locals + args)
-      fatal("Pike_sp (%p) < Pike_fp->locals (%p) + args (%d)\n",
-	    Pike_sp, Pike_fp->locals, args);
-#endif
+    DO_IF_DEBUG({
+      if (Pike_sp < Pike_fp->locals + args)
+	fatal("Pike_sp (%p) < Pike_fp->locals (%p) + args (%d)\n",
+	      Pike_sp, Pike_fp->locals, args);
+    });
     assign_svalues(Pike_fp->locals, Pike_sp-args, args, BIT_MIXED);
     pop_n_elems(Pike_sp - (Pike_fp->locals + args));
   }
@@ -1880,36 +1827,30 @@ OPCODE0_JUMP(F_TAIL_RECUR,"tail recursion")
   clear_svalues(Pike_sp, num_locals - args);
   Pike_sp += num_locals - args;
 
-#ifdef PIKE_DEBUG
-  if(Pike_sp != Pike_fp->locals + Pike_fp->num_locals)
-    fatal("Sp whacked!\n");
-#endif
+  DO_IF_DEBUG({
+    if(Pike_sp != Pike_fp->locals + Pike_fp->num_locals)
+      fatal("Sp whacked!\n");
+  });
 
   pc=addr;
-}
-BREAK
+});
 
-OPCODE0(F_BREAKPOINT,"breakpoint")
-{
+OPCODE0(F_BREAKPOINT, "breakpoint", {
   extern void o_breakpoint(void);
   o_breakpoint();
   pc--;
-}
-BREAK;
+});
 
-OPCODE0(F_THIS_OBJECT,"this_object")
-{
+OPCODE0(F_THIS_OBJECT, "this_object", {
   if(Pike_fp)
   {
     ref_push_object(Pike_fp->current_object);
   }else{
     push_int(0);
   }
-}
-BREAK;
+});
 
-OPCODE0(F_ZERO_TYPE,"zero_type")
-{
+OPCODE0(F_ZERO_TYPE, "zero_type", {
   if(Pike_sp[-1].type != T_INT)
   {
     pop_stack();
@@ -1918,5 +1859,4 @@ OPCODE0(F_ZERO_TYPE,"zero_type")
     Pike_sp[-1].u.integer=Pike_sp[-1].subtype;
     Pike_sp[-1].subtype=NUMBER_NUMBER;
   }
-}
-BREAK;
+});
diff --git a/src/interpreter.h b/src/interpreter.h
index 6fb0fff6ad826869035956ee4cb79f6f0ba60dc9..3a944180dd7d4ece3a4e778b6ff721990698b27b 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -9,14 +9,14 @@
 #define GET_ARG() (backlog[backlogp].arg=(\
   instr=prefix,\
   prefix=0,\
-  instr+=EXTRACT_UCHAR(pc++),\
+  instr += (pc++)[0],\
   (t_flag>3 ? sprintf(trace_buffer,"-    Arg = %ld\n",(long)instr),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\
   instr))
 
 #define GET_ARG2() (backlog[backlogp].arg2=(\
   instr=prefix2,\
   prefix2=0,\
-  instr+=EXTRACT_UCHAR(pc++),\
+  instr += (pc++)[0],\
   (t_flag>3 ? sprintf(trace_buffer,"-    Arg2 = %ld\n",(long)instr),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\
   instr))
 
@@ -27,10 +27,12 @@
 #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_ARG() (instr=prefix,prefix=0,instr+(pc++)[0])
+#define GET_ARG2() (instr=prefix2,prefix2=0,instr+(pc++)[0])
 #define GET_JUMP() EXTRACT_INT(pc)
 #define SKIPJUMP() pc+=sizeof(INT32)
+
 #endif
 
 #define DOJUMP() \
@@ -40,24 +42,25 @@
 #define STEP_BREAK_LINE
 #endif
 
-static int eval_instruction(unsigned char *pc)
+static int eval_instruction(PIKE_OPCODE_T *pc)
 {
   unsigned INT32 prefix2=0,instr, prefix=0;
   debug_malloc_touch(Pike_fp);
   while(1)
   {
     Pike_fp->pc = pc;
-    instr=EXTRACT_UCHAR(pc++);
+    instr = (pc++)[0];
 
     STEP_BREAK_LINE
     
 #ifdef PIKE_DEBUG
+
     if(t_flag > 2)
     {
       char *file, *f;
       INT32 linep;
 
-      file=get_line(pc-1,Pike_fp->context.prog,&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,
@@ -159,11 +162,11 @@ static int eval_instruction(unsigned char *pc)
       CASE(F_PREFIX_768); prefix+=768; break;
       CASE(F_PREFIX_1024); prefix+=1024; break;
       CASE(F_PREFIX_24BITX256);
-      prefix+=EXTRACT_UCHAR(pc++)<<24;
+      prefix += (pc++)[0]<<24;
       CASE(F_PREFIX_WORDX256);
-      prefix+=EXTRACT_UCHAR(pc++)<<16;
+      prefix += (pc++)[0]<<16;
       CASE(F_PREFIX_CHARX256);
-      prefix+=EXTRACT_UCHAR(pc++)<<8;
+      prefix += (pc++)[0]<<8;
       break;
 
       /* Support to allow large arguments */
@@ -172,45 +175,52 @@ static int eval_instruction(unsigned char *pc)
       CASE(F_PREFIX2_768); prefix2+=768; break;
       CASE(F_PREFIX2_1024); prefix2+=1024; break;
       CASE(F_PREFIX2_24BITX256);
-      prefix2+=EXTRACT_UCHAR(pc++)<<24;
+      prefix2 += (pc++)[0]<<24;
       CASE(F_PREFIX2_WORDX256);
-      prefix2+=EXTRACT_UCHAR(pc++)<<16;
+      prefix2 += (pc++)[0]<<16;
       CASE(F_PREFIX2_CHARX256);
-      prefix2+=EXTRACT_UCHAR(pc++)<<8;
+      prefix2 += (pc++)[0]<<8;
       break;
 
 
 #define INTERPRETER
 
-#define OPCODE0(OP,DESC) CASE(OP); {
-#define OPCODE1(OP,DESC) CASE(OP); { \
-  INT32 arg1=GET_ARG();
+#define OPCODE0(OP, DESC, CODE) CASE(OP); CODE; break
+#define OPCODE1(OP, DESC, CODE) CASE(OP); { \
+    INT32 arg1=GET_ARG(); \
+    CODE; \
+  } break
 
-#define OPCODE2(OP,DESC) CASE(OP); { \
-  INT32 arg1=GET_ARG(); \
-  INT32 arg2=GET_ARG2();
+#define OPCODE2(OP, DESC, CODE) CASE(OP); { \
+    INT32 arg1=GET_ARG(); \
+    INT32 arg2=GET_ARG2(); \
+    CODE; \
+  } break
 
+#define OPCODE0_TAIL(OP, DESC, CODE) CASE(OP); CODE
+#define OPCODE1_TAIL(OP, DESC, CODE) CASE(OP); CODE
+#define OPCODE2_TAIL(OP, DESC, CODE) CASE(OP); CODE
 
-#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); {
-#define OPCODE0_TAILJUMP(OP,DESC) } CASE(OP) {;
+#define OPCODE0_JUMP(OP, DESC, CODE) CASE(OP); CODE; break
+#define OPCODE0_TAILJUMP(OP, DESC, CODE) CASE(OP); CODE
 
 /* 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 OPCODE1_TAILJUMP(OP,DESC) } CASE(OP) {; 
-#define OPCODE2_TAILJUMP(OP,DESC) } CASE(OP) {; 
+#define OPCODE1_JUMP(OP, DESC, CODE) CASE(OP); { \
+    INT32 arg1=GET_ARG(); \
+    CODE; \
+  } break
+
+#define OPCODE2_JUMP(OP, DESC, CODE) CASE(OP); { \
+    INT32 arg1=GET_ARG(); \
+    INT32 arg2=GET_ARG2(); \
+    CODE; \
+  } break
+
+#define OPCODE1_TAILJUMP(OP, DESC, CODE) CASE(OP); CODE
+#define OPCODE2_TAILJUMP(OP, DESC, CODE) CASE(OP); CODE
 
 
 #define BREAK break; }