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);