diff --git a/src/Makefile.in b/src/Makefile.in
index 1e8738a8fa25895f9551a9364dedab2569311d39..0e15f9e0dc5ffe18fb6d4bd79629432f21f974d9 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,5 +1,5 @@
 #
-# $Id: Makefile.in,v 1.219 2000/11/30 20:13:38 grubba Exp $
+# $Id: Makefile.in,v 1.220 2000/12/01 03:19:00 hubbe Exp $
 #
 
 # This line is needed on some machines.
@@ -611,10 +611,12 @@ module_objects: $(MODULE_REQUIREMENTS)
 	touch modules/modlist.h
 
 interpret_protos.h: $(SRCDIR)/interpret_functions.h
-	egrep '^OPCODE' <$(SRCDIR)/interpret_functions.h >interpret_protos.h
+	egrep '^OPCODE' <$(SRCDIR)/interpret_functions.h >$(SRCDIR)/interpret_protos.h
 
 lex.o: $(SRCDIR)/lex.c interpret_protos.h
 
+interpret.o: $(SRCDIR)/lex.c interpret_protos.h
+
 lex_t.o: $(SRCDIR)/lex_t.c interpret_protos.h
 
 language.o: $(SRCDIR)/language.c $(SRCDIR)/object.h $(SRCDIR)/interpret.h $(SRCDIR)/program.h
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 73952d83337293611d94aa41916d652b16cb53b5..b98d36a195510e34de5bbbea4d2091bd3c15ee0d 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -1,5 +1,5 @@
 /*
- * $Id: interpret_functions.h,v 1.32 2000/09/25 23:41:33 hubbe Exp $
+ * $Id: interpret_functions.h,v 1.33 2000/12/01 03:19:00 hubbe Exp $
  *
  * Opcode definitions for the interpreter.
  */
@@ -873,6 +873,36 @@ OPCODE1(F_SWITCH, "switch")
 }
 BREAK;
 
+OPCODE1(F_SWITCH_ON_INDEX, "switch on index")
+{
+  INT32 tmp;
+  struct svalue s;
+  index_no_free(&s,Pike_sp-2,Pike_sp-1);
+  Pike_sp++[0]=s;
+
+  tmp=switch_lookup(Pike_fp->context.prog->
+		    constants[arg1].sval.u.array,Pike_sp-1);
+  pop_n_elems(3);
+  pc=(unsigned char *)DO_ALIGN(pc,sizeof(INT32));
+  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")
+{
+  INT32 tmp;
+  tmp=switch_lookup(Pike_fp->context.prog->
+		    constants[arg2].sval.u.array,Pike_fp->locals + arg1);
+  pc=(unsigned char *)DO_ALIGN(pc,sizeof(INT32));
+  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 */
       LOOP(F_INC_LOOP, 1, <, is_lt);
       LOOP(F_DEC_LOOP, -1, >, is_gt);
diff --git a/src/opcodes.h b/src/opcodes.h
index c53034c6ef34df5e47da75dca0d822508b79cd1f..5527fb2ba5115df1a4a5a139a68187cbb107540d 100644
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: opcodes.h,v 1.7 2000/12/01 01:13:44 hubbe Exp $
+ * $Id: opcodes.h,v 1.8 2000/12/01 03:19:01 hubbe Exp $
  */
 #ifndef OPCODES_H
 #define OPCODES_H
@@ -16,226 +16,139 @@
  * These values are used by the stack machine, and can not be directly
  * called from Pike.
  */
-#define	F_OFFSET	257
-#define	F_PREFIX_256	258
-#define	F_PREFIX_512	259
-#define	F_PREFIX_768	260
-#define	F_PREFIX_1024	261
-#define	F_PREFIX_CHARX256	262
-#define	F_PREFIX_WORDX256	263
-#define	F_PREFIX_24BITX256	264
-#define	F_PREFIX2_256	265
-#define	F_PREFIX2_512	266
-#define	F_PREFIX2_768	267
-#define	F_PREFIX2_1024	268
-#define	F_PREFIX2_CHARX256	269
-#define	F_PREFIX2_WORDX256	270
-#define	F_PREFIX2_24BITX256	271
-#define	F_POP_VALUE	272
-#define	F_POP_N_ELEMS	273
-#define	F_MARK	274
-#define	F_MARK2	275
-#define	F_MARK_X	276
-#define	F_POP_MARK	277
-#define	F_CALL_LFUN	278
-#define	F_CALL_LFUN_AND_POP	279
-#define	F_CALL_LFUN_AND_RETURN	280
-#define	F_APPLY	281
-#define	F_APPLY_AND_POP	282
-#define	F_MARK_APPLY	283
-#define	F_MARK_APPLY_POP	284
-#define	F_APPLY_AND_RETURN	285
-#define	F_MARK_AND_STRING	286
-#define	F_APPLY_ASSIGN_LOCAL	287
-#define	F_APPLY_ASSIGN_LOCAL_AND_POP	288
-
-#define	F_BRANCH	289
-#define	F_BRANCH_WHEN_ZERO	290
-#define	F_BRANCH_WHEN_NON_ZERO	291
-#define	F_BRANCH_AND_POP_WHEN_ZERO	292
-#define	F_BRANCH_AND_POP_WHEN_NON_ZERO	293
-#define	F_BRANCH_WHEN_LT	294
-#define	F_BRANCH_WHEN_GT	295
-#define	F_BRANCH_WHEN_LE	296
-#define	F_BRANCH_WHEN_GE	297
-#define	F_BRANCH_WHEN_EQ	298
-#define	F_BRANCH_WHEN_NE	299
-#define	F_BRANCH_IF_LOCAL	300
-#define	F_BRANCH_IF_NOT_LOCAL	301
-#define	F_BRANCH_IF_NOT_LOCAL_ARROW	302
-#define	F_INC_LOOP	303
-#define	F_DEC_LOOP	304
-#define	F_INC_NEQ_LOOP	305
-#define	F_DEC_NEQ_LOOP	306
-#define	F_RECUR	307
-#define	F_TAIL_RECUR	308
-#define	F_COND_RECUR	309
-
-#define	F_LEXICAL_LOCAL	310
-#define	F_LEXICAL_LOCAL_LVALUE	311
-
-#define	F_INDEX	312
-#define	F_ARROW	313
-#define	F_INDIRECT	314
-#define	F_STRING_INDEX	315
-#define	F_LOCAL_INDEX	316
-#define	F_LOCAL_LOCAL_INDEX	317
-#define	F_LOCAL_ARROW	318
-#define	F_GLOBAL_LOCAL_INDEX	319
-#define	F_POS_INT_INDEX	320
-#define	F_NEG_INT_INDEX	321
-#define	F_MAGIC_INDEX	322
-#define	F_MAGIC_SET_INDEX	323
-#define	F_LTOSVAL	324
-#define	F_LTOSVAL2	325
-#define	F_PUSH_ARRAY	326
-#define	F_RANGE	327
-#define	F_COPY_VALUE	328
-
-/*
- * Basic value pushing
- */
-#define	F_LFUN	329
-#define	F_TRAMPOLINE	330
-#define	F_GLOBAL	331
-#define	F_GLOBAL_LVALUE	332
-#define	F_LOCAL	333
-#define	F_2_LOCALS	334
-#define	F_LOCAL_LVALUE	335
-#define	F_MARK_AND_LOCAL	336
-#define	F_EXTERNAL	337
-#define	F_EXTERNAL_LVALUE	338
-#define	F_CLEAR_LOCAL	339
-#define	F_CLEAR_2_LOCAL	340
-#define	F_CLEAR_4_LOCAL	341
-#define	F_CLEAR_STRING_SUBTYPE	342
-#define	F_CONSTANT	343
-#define	F_FLOAT	344
-#define	F_STRING	345
-#define	F_ARROW_STRING	346
-#define	F_NUMBER	347
-#define	F_NEG_NUMBER	348
-#define	F_CONST_1	349
-#define	F_CONST0	350
-#define	F_CONST1	351
-#define	F_BIGNUM	352
-#define	F_UNDEFINED	353
+#define OPCODE0(X,Y) X,
+#define OPCODE1(X,Y) X,
+#define OPCODE2(X,Y) X,
+#define OPCODE0_TAIL(X,Y) X,
+#define OPCODE1_TAIL(X,Y) X,
+#define OPCODE2_TAIL(X,Y) X,
+#define OPCODE0_JUMP(X,Y) X,
+#define OPCODE1_JUMP(X,Y) X,
+#define OPCODE2_JUMP(X,Y) X,
+#define OPCODE0_TAILJUMP(X,Y) X,
+#define OPCODE1_TAILJUMP(X,Y) X,
+#define OPCODE2_TAILJUMP(X,Y) X,
+
+enum Pike_opcodes
+{
+  F_OFFSET = 257,
+  F_PREFIX_256,
+  F_PREFIX_512,
+  F_PREFIX_768,
+  F_PREFIX_1024,
+  F_PREFIX_CHARX256,
+  F_PREFIX_WORDX256,
+  F_PREFIX_24BITX256,
+  F_PREFIX2_256,
+  F_PREFIX2_512,
+  F_PREFIX2_768,
+  F_PREFIX2_1024,
+  F_PREFIX2_CHARX256,
+  F_PREFIX2_WORDX256,
+  F_PREFIX2_24BITX256,
+  F_APPLY,
+  F_APPLY_AND_POP,
+  F_APPLY_AND_RETURN,
+
+  F_BRANCH_AND_POP_WHEN_ZERO,
+  F_BRANCH_AND_POP_WHEN_NON_ZERO,
+  F_BRANCH_WHEN_LT,
+  F_BRANCH_WHEN_GT,
+  F_BRANCH_WHEN_LE,
+  F_BRANCH_WHEN_GE,
+  F_BRANCH_WHEN_EQ,
+  F_BRANCH_WHEN_NE,
+  F_BRANCH_IF_NOT_LOCAL,
+  F_INC_LOOP,
+  F_DEC_LOOP,
+  F_INC_NEQ_LOOP,
+  F_DEC_NEQ_LOOP,
+
+  F_INDEX,
+  F_POS_INT_INDEX,
+  F_NEG_INT_INDEX,
 
 /*
  * These are the predefined functions that can be accessed from Pike.
  */
-#define	F_INC	354
-#define	F_DEC	355
-#define	F_POST_INC	356
-#define	F_POST_DEC	357
-#define	F_INC_AND_POP	358
-#define	F_DEC_AND_POP	359
-#define	F_INC_LOCAL	360
-#define	F_INC_LOCAL_AND_POP	361
-#define	F_POST_INC_LOCAL	362
-#define	F_DEC_LOCAL	363
-#define	F_DEC_LOCAL_AND_POP	364
-#define	F_POST_DEC_LOCAL	365
-#define	F_RETURN	366
-#define	F_DUMB_RETURN	367
-#define	F_RETURN_0	368
-#define	F_RETURN_1	369
-#define	F_RETURN_LOCAL	370
-#define	F_RETURN_IF_TRUE	371
-#define	F_THROW_ZERO	372
-
-#define	F_ASSIGN	373
-#define	F_ASSIGN_AND_POP	374
-#define	F_ASSIGN_LOCAL	375
-#define	F_ASSIGN_LOCAL_AND_POP	376
-#define	F_ASSIGN_GLOBAL	377
-#define	F_ASSIGN_GLOBAL_AND_POP	378
-#define	F_LOCAL_2_LOCAL	379
-#define	F_LOCAL_2_GLOBAL	380
-#define	F_GLOBAL_2_LOCAL	381
-#define	F_ADD	382
-#define	F_SUBTRACT	383
-#define	F_ADD_INT	384
-#define	F_ADD_NEG_INT	385
-#define	F_ADD_TO_AND_POP	386
-#define	F_ADD_FLOATS	387
-#define	F_ADD_INTS	388
-#define	F_MULTIPLY	389
-#define	F_DIVIDE	390
-#define	F_MOD	391
-
-#define	F_LT	392
-#define	F_GT	393
-#define	F_EQ	394
-#define	F_GE	395
-#define	F_LE	396
-#define	F_NE	397
-#define	F_NEGATE	398
-#define	F_NOT	399
-#define	F_COMPL	400
-#define	F_AND	401
-#define	F_OR	402
-#define	F_XOR	403
-#define	F_LSH	404
-#define	F_RSH	405
-#define	F_LAND	406
-#define	F_LOR	407
-#define	F_EQ_OR	408
-#define	F_EQ_AND	409
-
-#define	F_SWITCH	410
-#define	F_SSCANF	411
-#define	F_CATCH	412
-#define	F_CAST	413
-#define	F_SOFT_CAST	414
-#define	F_FOREACH	415
-
-#define	F_SIZEOF	416
-#define	F_SIZEOF_LOCAL	417
-#define	F_CALL_FUNCTION	418
-#define	F_CALL_FUNCTION_AND_RETURN	419
-
+  F_RETURN,
+  F_DUMB_RETURN,
+  F_RETURN_0,
+  F_RETURN_1,
+  F_RETURN_LOCAL,
+  F_RETURN_IF_TRUE,
+
+  F_LT,
+  F_GT,
+  F_EQ,
+  F_GE,
+  F_LE,
+  F_NE,
+  F_LAND,
+  F_LOR,
+  F_EQ_OR,
+  F_EQ_AND,
+
+  F_CATCH,
+  F_FOREACH,
+
+  F_CALL_FUNCTION,
+  F_CALL_FUNCTION_AND_RETURN,
+
+#include "interpret_protos.h"
 /*
  * These are token values that needn't have an associated code for the
  * compiled file
  */
-#define	F_MAX_OPCODE	420
-
-#define	F_ADD_EQ	422
-#define	F_AND_EQ	423
-#define	F_ARG_LIST	424
-#define	F_COMMA_EXPR	425
-#define	F_BREAK	427
-#define	F_CASE	428
-#define	F_CONTINUE	432
-#define	F_DEFAULT	433
-#define	F_DIV_EQ	434
-#define	F_DO	435
-#define	F_EFUN_CALL	439
-#define	F_FOR	443
-#define	F_IDENTIFIER	446
-#define	F_LSH_EQ	458
-#define	F_LVALUE_LIST	459
-#define	F_ARRAY_LVALUE	460
-#define	F_MOD_EQ	463
-#define	F_MULT_EQ	464
-#define	F_OR_EQ	467
-#define	F_RSH_EQ	473
-#define	F_SUB_EQ	478
-#define	F_VAL_LVAL	480
-#define	F_XOR_EQ	483
-#define	F_NOP	484
-
-#define	F_ALIGN	486
-#define	F_POINTER	487
-#define	F_LABEL	488
-#define	F_DATA	489
-#define	F_START_FUNCTION	490
-#define	F_BYTE	491
-
-#define F_NOTREACHED 492
-
-#define	F_MAX_INSTR	493
+  F_MAX_OPCODE,
+
+  F_ADD_EQ,
+  F_AND_EQ,
+  F_ARG_LIST,
+  F_COMMA_EXPR,
+  F_BREAK,
+  F_CASE,
+  F_CONTINUE,
+  F_DEFAULT,
+  F_DIV_EQ,
+  F_DO,
+  F_EFUN_CALL,
+  F_FOR,
+  F_IDENTIFIER,
+  F_LSH_EQ,
+  F_LVALUE_LIST,
+  F_MOD_EQ,
+  F_MULT_EQ,
+  F_OR_EQ,
+  F_RSH_EQ,
+  F_SUB_EQ,
+  F_VAL_LVAL,
+  F_XOR_EQ,
+  F_NOP,
+
+  F_ALIGN,
+  F_POINTER,
+  F_LABEL,
+  F_DATA,
+  F_START_FUNCTION,
+  F_BYTE,
+  F_NOTREACHED,
+  F_MAX_INSTR
+};
+
+#undef OPCODE0
+#undef OPCODE1
+#undef OPCODE2
+#undef OPCODE0_TAIL
+#undef OPCODE1_TAIL
+#undef OPCODE2_TAIL
+#undef OPCODE0_JUMP
+#undef OPCODE1_JUMP
+#undef OPCODE2_JUMP
+#undef OPCODE0_TAILJUMP
+#undef OPCODE1_TAILJUMP
+#undef OPCODE2_TAILJUMP
+
 
 /* Prototypes begin here */
 void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind);
diff --git a/src/peep.in b/src/peep.in
index 2cc10eb315f623771c4bbf88b50c9593db199bc1..6572285fb0595e639c5beaa6d1e92517f39f1d5f 100644
--- a/src/peep.in
+++ b/src/peep.in
@@ -1,5 +1,5 @@
 //
-// $Id: peep.in,v 1.42 2000/12/01 01:13:46 hubbe Exp $
+// $Id: peep.in,v 1.43 2000/12/01 03:19:01 hubbe Exp $
 //
 
 NOP :
@@ -149,6 +149,8 @@ MARK LOCAL [ $3o != F_SIZEOF && $3o != F_INDEX ]: MARK_AND_LOCAL ($2a)
 MARK STRING : MARK_AND_STRING($2a)
 LOCAL SIZEOF: SIZEOF_LOCAL ($1a)
 STRING INDEX: STRING_INDEX ($1a)
+INDEX SWITCH: SWITCH_ON_INDEX($2a)
+LOCAL SWITCH: SWITCH_ON_LOCAL($1a,$2a)
 
 STRING CLEAR_STRING_SUBTYPE: STRING ($1a)
 CONST0 CLEAR_STRING_SUBTYPE: CONST0