diff --git a/bin/mkpeep.pike b/bin/mkpeep.pike
index 50aff846427d5b4e70d49bf0ee1d44d1c65defe6..9d96a001d7b7bceb122ebb062108e546cfa46f6a 100755
--- a/bin/mkpeep.pike
+++ b/bin/mkpeep.pike
@@ -1,6 +1,6 @@
 #!/usr/local/bin/pike
 
-/* $Id: mkpeep.pike,v 1.7 1998/04/01 00:47:18 hubbe Exp $ */
+/* $Id: mkpeep.pike,v 1.8 1998/04/27 09:53:47 hubbe Exp $ */
 
 import Simulate;
 
@@ -283,6 +283,7 @@ void dump2(mixed *data,int ind)
       }
       write(sprintf("%*n{\n",ind));
       ind+=2;
+#if 0
 
       if(sizeof(d[1]))
       {
@@ -329,8 +330,25 @@ void dump2(mixed *data,int ind)
 	write(sprintf("%*ndebug();\n",ind));
       }
       write(sprintf("%*nfifo_len+=%d;\n",ind,q+JUMPBACK));
-      write(sprintf("%*ncontinue;\n",ind));
+#else
+
+      write("%*ndo_optimization(%d,\n",ind,d[2]);
+
+      for(i=0;i<sizeof(d[1]);i++)
+      {
+	if(i+1<sizeof(d[1]) && d[1][i+1][0]=='(')
+	{
+	  string tmp=d[1][i+1];
+	  write("%*n                2,%s,%s,\n",ind,d[1][i],treat(tmp[1..strlen(tmp)-2]));
+	  i++;
+	}else{
+	  write("%*n                1,%s,\n",ind,d[1][i]);
+	}
+      }
+      write("%*n                0);\n",ind);
 
+#endif
+      write(sprintf("%*ncontinue;\n",ind));
       ind-=2;
       write(sprintf("%*n}\n",ind,test));
     }
diff --git a/src/peep.c b/src/peep.c
index 3da51755f60033700edd1c9ff6601093c6181925..66ceeb7f23de6bf9b7ceb7e091d078093f598b76 100644
--- a/src/peep.c
+++ b/src/peep.c
@@ -12,7 +12,7 @@
 #include "peep.h"
 #include "dmalloc.h"
 
-RCSID("$Id: peep.c,v 1.21 1998/04/01 00:47:48 hubbe Exp $");
+RCSID("$Id: peep.c,v 1.22 1998/04/27 09:54:16 hubbe Exp $");
 
 struct p_instr_s
 {
@@ -373,7 +373,6 @@ int insopt2(int f, int cl, struct pike_string *cf)
   return insopt(f,0,cl, cf);
 }
 
-
 static void debug(void)
 {
   if(fifo_len > (long)instrbuf.s.len / (long)sizeof(p_instr))
@@ -393,7 +392,7 @@ static void debug(void)
 }
 
 
-static p_instr *instr(int offset)
+static INLINE p_instr *instr(int offset)
 {
   p_instr *p;
 
@@ -414,7 +413,7 @@ static p_instr *instr(int offset)
   }
 }
 
-static int opcode(int offset)
+static INLINE int opcode(int offset)
 {
   p_instr *a;
   a=instr(offset);
@@ -422,7 +421,7 @@ static int opcode(int offset)
   return -1;
 }
 
-static int argument(int offset)
+static INLINE int argument(int offset)
 {
   p_instr *a;
   a=instr(offset);
@@ -469,6 +468,47 @@ static void pop_n_opcodes(int n)
   eye+=n;
 }
 
+static void do_optimization(int topop, ...)
+{
+  va_list arglist;
+  struct pike_string *cf;
+  int q=-1;
+  INT32 cl=instr(0)->line;
+  copy_shared_string(cf,instr(0)->file);
+  pop_n_opcodes(topop);
+  va_start(arglist, topop);
+  
+  while(1)
+  {
+    q++;
+    switch(va_arg(arglist, int))
+    {
+      case 0:
+	break;
+      case 1:
+      {
+	int i=va_arg(arglist, int);
+	insopt2(i,cl,cf);
+	continue;
+      }
+      case 2:
+      {
+	int i=va_arg(arglist, int);
+	int j=va_arg(arglist, int);
+	insopt(i,j,cl,cf);
+	continue;
+      }
+    }
+    break;
+  }
+
+  va_end(arglist);
+  fifo_len+=q;
+  free_string(cf);
+  debug();
+  fifo_len+=q + 3;
+}
+
 
 static void asm_opt(void)
 {