diff --git a/bin/precompile.pike b/bin/precompile.pike
index 3de8ccacc1e1d8b2dc3777eb33f5ca44245a4889..98c51cda8f0a938fa006caa3e6ea2edc9fd52058 100644
--- a/bin/precompile.pike
+++ b/bin/precompile.pike
@@ -179,10 +179,13 @@ string convert_type(array s)
       if(sizeof(s)<2) return "tMultiset";
       return "tSet("+convert_type(s[1][1..sizeof(s[1])-2])+")";
     case "mapping": 
+    {
       if(sizeof(s)<2) return "tMapping";
+      mixed tmp=s[1][1..sizeof(s[1])-2];
       return "tMap("+
-	convert_type((s[1]/({":"}))[0])+","+
-	  convert_type((s[1]/({":"}))[1])+")";
+	convert_type((tmp/({":"}))[0])+","+
+	  convert_type((tmp/({":"}))[1])+")";
+    }
     case "object": 
       return "tObj";
 
@@ -192,6 +195,9 @@ string convert_type(array s)
       return "tFunc";
     case "mixed": 
       return "tMix";
+
+    default:
+      return sprintf("ERR%O",s);
   }
 }
 
@@ -322,16 +328,20 @@ int main(int argc, array(string) argv)
 
     ret+=({
       sprintf("\n#line %d %O\n",rettype[0]->line,file),
-      sprintf("void f_%s(INT32 args)\n{\n",name),
+      sprintf("void f_%s(INT32 args) {\n",name),
     });
 
     args=map(args,parse_arg);
 
     foreach(args, mapping arg)
-      ret+=({  sprintf("%s%s;\n",arg->ctype, arg->name) });
+      ret+=({
+//	sprintf("\n#line %d %O\n",rettype[0]->line,file),
+	sprintf("%s %s;\n",arg->ctype, arg->name)
+      });
 
 
     addfuncs+=({
+      sprintf("\n#line %d %O\n",rettype[0]->line,file),
       sprintf("  %s(%O,f_%s,tFunc(%s,%s),%s);\n",
 	      attributes->efun ? "ADD_EFUN" : "ADD_FUNCTION",
 	      name,
@@ -348,6 +358,7 @@ int main(int argc, array(string) argv)
 
     argnum=0;
     ret+=({
+//      sprintf("\n#line %d %O\n",rettype[0]->line,file),
       sprintf("if(args != %d) wrong_number_of_args_error(%O,args,%d);\n",
 	      sizeof(args),
 	      name,
@@ -357,6 +368,7 @@ int main(int argc, array(string) argv)
     int sp=-sizeof(args);
     foreach(args, mapping arg)
       {
+//	ret+=({ sprintf("\n#line %d %O\n",rettype[0]->line,file), });
 	if(arg->basetype != "mixed")
 	{
 	  ret+=({
@@ -373,7 +385,7 @@ int main(int argc, array(string) argv)
 	{
 	  case "int":
 	    ret+=({
-	      sprintf("%s=sp[%d].integer;\n",
+	      sprintf("%s=sp[%d].u.integer;\n",
 		      arg->name,
 		      sp)
 	    });
@@ -381,7 +393,7 @@ int main(int argc, array(string) argv)
 
 	  case "float":
 	    ret+=({
-	      sprintf("%s=sp[%d].float_number;\n",
+	      sprintf("%s=sp[%d].u.float_number;\n",
 		      arg->name,
 		      sp)
 	    });
diff --git a/src/builtin.cmod b/src/builtin.cmod
index 0082d1ad23faa77a1795cb875724ae71abcaa100..c1d8d80aa89180e909325ac97d96a676a4a385fc 100644
--- a/src/builtin.cmod
+++ b/src/builtin.cmod
@@ -19,6 +19,7 @@
 #include "module_support.h"
 #include "cyclic.h"
 #include "bignum.h"
+#include "main.h"
 
 
 PIKEFUN array column(array tmp, mixed val)
@@ -69,6 +70,34 @@ PIKEFUN multiset(1) mkmultiset(array(1=mixed) a)
   RETURN mkmultiset(a);
 }
 
+PIKEFUN int trace(int t)
+  efun;
+  optflags OPT_SIDE_EFFECT;
+{
+  pop_n_elems(args);
+  push_int(t_flag);
+  t_flag=t;
+}
+
+PIKEFUN string ctime(int x)
+  efun;
+  optflags OPT_TRY_OPTIMIZE;
+{
+  time_t i=(time_t)x;
+  RETURN make_shared_string(ctime(&i));
+}
+
+PIKEFUN mapping(1:2) mkmapping(array(1=mixed) a, array(2=mixed) b)
+  efun;
+  optflags OPT_TRY_OPTIMIZE;
+{
+  if(a->size != b->size)
+    bad_arg_error("mkmapping", sp-args, args, 2, "array", sp+1-args,
+		  "mkmapping called on arrays of different sizes (%d != %d)\n",
+		  a->size, b->size);
+
+  RETURN mkmapping(a,b);
+}
 
 void init_builtin(void)
 {
diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 11cbe15543fcd401513c48deedb68ad5dc9a6a66..b6a5d62a55a2efa0500fe29e496f7b350c27b205 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: builtin_functions.c,v 1.276 2000/05/25 02:18:35 hubbe Exp $");
+RCSID("$Id: builtin_functions.c,v 1.277 2000/05/25 05:18:52 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "pike_macros.h"
@@ -80,16 +80,6 @@ void debug_f_aggregate(INT32 args)
   push_array(a); /* beware, macro */
 }
 
-void f_trace(INT32 args)
-{
-  extern int t_flag;
-  INT_TYPE t;
-
-  get_all_args("trace", args, "%i", &t);
-  pop_n_elems(args);
-  push_int(t_flag);
-  t_flag = t;
-}
 
 void f_hash(INT32 args)
 {
@@ -147,16 +137,6 @@ void f_copy_value(INT32 args)
   dmalloc_touch_svalue(sp-1);
 }
 
-void f_ctime(INT32 args)
-{
-  time_t i;
-  INT_TYPE x;
-  get_all_args("ctime",args,"%i",&x);
-  i=(time_t)x;
-  pop_n_elems(args);
-  push_string(make_shared_string(ctime(&i)));
-}
-
 struct case_info {
   int low;	/* low end of range. */
   int mode;
@@ -2367,21 +2347,6 @@ void f_compile(INT32 args)
   push_program(p);
 }
 
-void f_mkmapping(INT32 args)
-{
-  struct mapping *m;
-  struct array *a,*b;
-  get_all_args("mkmapping",args,"%a%a",&a,&b);
-  if(a->size != b->size)
-    bad_arg_error("mkmapping", sp-args, args, 2, "array", sp+1-args,
-		  "mkmapping called on arrays of different sizes (%d != %d)\n",
-		  a->size, b->size);
-
-  m=mkmapping(sp[-args].u.array, sp[1-args].u.array);
-  pop_n_elems(args);
-  push_mapping(m);
-}
-
 #define SETFLAG(FLAGS,FLAG,ONOFF) \
   FLAGS = (FLAGS & ~FLAG) | ( ONOFF ? FLAG : 0 )
 void f_set_weak_flag(INT32 args)
@@ -5776,9 +5741,6 @@ void init_builtin_efuns(void)
   ADD_EFUN("crypt",f_crypt,
 	   tOr(tFunc(tStr,tStr),tFunc(tStr tStr,tInt)),OPT_EXTERNAL_DEPEND);
   
-/* function(int:string) */
-  ADD_EFUN("ctime",f_ctime,tFunc(tInt,tStr),OPT_TRY_OPTIMIZE);
-  
 /* function(object|void:void) */
   ADD_EFUN("destruct",f_destruct,tFunc(tOr(tObj,tVoid),tVoid),OPT_SIDE_EFFECT);
   
@@ -5842,12 +5804,6 @@ void init_builtin_efuns(void)
 /* function(mixed:int) */
   ADD_EFUN("mappingp",f_mappingp,tFunc(tMix,tInt),OPT_TRY_OPTIMIZE);
   
-/* function(array(1=mixed),array(2=mixed):mapping(1:2)) */
-  ADD_EFUN("mkmapping",f_mkmapping,
-	   tFunc(tArr(tSetvar(1,tMix)) tArr(tSetvar(2,tMix)),
-		 tMap(tVar(1),tVar(2))),OPT_TRY_OPTIMIZE);
-
-
 /* function(1=mixed,int:1) */
   ADD_EFUN("set_weak_flag",f_set_weak_flag,
 	   tFunc(tSetvar(1,tMix) tInt,tVar(1)),OPT_SIDE_EFFECT);
@@ -5993,8 +5949,6 @@ void init_builtin_efuns(void)
 	       tFunc(tInt2Plus,tFlt)),
 	   OPT_EXTERNAL_DEPEND);
   
-/* function(int:int) */
-  ADD_EFUN("trace",f_trace,tFunc(tInt,tInt),OPT_SIDE_EFFECT);
   /* function(array(0=mixed):array(0)) */
   ADD_FUNCTION("transpose",f_transpose,
 	       tFunc(tArr(tSetvar(0,tMix)),tArr(tVar(0))), 0);