From 53a07a1d45c587285285f9fb1dd974cd1763391b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Thu, 25 May 2000 13:08:27 -0700 Subject: [PATCH] some more cleanups Rev: bin/precompile.pike:1.6 Rev: lib/modules/Parser.pmod/C.pmod:1.5 --- bin/precompile.pike | 110 ++++++++++++++++++++++----------- lib/modules/Parser.pmod/C.pmod | 6 +- 2 files changed, 77 insertions(+), 39 deletions(-) diff --git a/bin/precompile.pike b/bin/precompile.pike index 761794a2ca..5f3649d48a 100644 --- a/bin/precompile.pike +++ b/bin/precompile.pike @@ -29,12 +29,18 @@ * optflags; OPT_TRY_OPTIMIZE | OPT_SIDE_EFFECT etc. * type; tInt, tMix etc. use this type instead of automatically * generating type from the prototype + * errname; The name used when throwing errors. + * name; The name used when doing add_function. * * * BUGS/LIMITATIONS * o Parenthesis must match, even within #if 0 * o Not all Pike types are supported yet * o No support for class variables yet + * o No support for set_init/exit/gc_mark/gc_check_callback + * o Does not generate pike_module_init/exit automatically yet + * o No support for 'char *', 'double' etc. + * */ #define PC Parser.C @@ -77,6 +83,17 @@ array(PC.Token) strip(array(PC.Token) t) case '\n': case '\r': continue; + + case '/': + if(strlen(x->text)>1) + { + switch(x->text[1]) + { + case '/': + case '*': + continue; + } + } } }else{ x=strip(x); @@ -157,6 +174,7 @@ mapping(string:string) parse_arg(array x) ret->basetype="mixed"; ret->ctype=cname(ret->basetype); ret->typename=merge(recursive(strip_type_assignments,ret->type)); + ret->line=ret->name->line; return ret; } @@ -196,7 +214,7 @@ string convert_type(array s) return "tObj"; case "program": - return "tProg"; + return "tProgram"; case "function": return "tFunc"; case "mixed": @@ -366,55 +384,73 @@ array convert(array x) foreach(args, mapping arg) ret+=({ - sprintf("%s %s;\n",arg->ctype, arg->name) + PC.Token(sprintf("%s %s;\n",arg->ctype, arg->name),arg->line), }); addfuncs+=({ - sprintf(" %s(%O,f_%s,tFunc(%s,%s),%s);\n", - attributes->efun ? "ADD_EFUN" : "ADD_FUNCTION", - name, - name, - attributes->type ? attributes->type : - Array.map(args->type,convert_type)*" ", - convert_type(rettype), - (attributes->efun ? attributes->optflags : - attributes->flags )|| "0" , - ) + PC.Token(sprintf(" %s(%O,f_%s,tFunc(%s,%s),%s);\n", + attributes->efun ? "ADD_EFUN" : "ADD_FUNCTION", + attributes->name || name, + name, + attributes->type ? attributes->type : + Array.map(args->type,convert_type)*" ", + convert_type(rettype), + (attributes->efun ? attributes->optflags : + attributes->flags )|| "0" , + ),proto[0]->line), }); int argnum; argnum=0; ret+=({ - sprintf("if(args != %d) wrong_number_of_args_error(%O,args,%d);\n", - sizeof(args), - name, - sizeof(args)) + PC.Token(sprintf("if(args != %d) wrong_number_of_args_error(%O,args,%d);\n", + sizeof(args), + name, + sizeof(args)), proto[0]->line) }); int sp=-sizeof(args); foreach(args, mapping arg) { - if(arg->basetype != "mixed") + switch((string)arg->basetype) { - ret+=({ - sprintf("if(sp[%d].type != PIKE_T_%s)\n", - sp,upper_case(arg->basetype->text)), - sprintf(" SIMPLE_BAD_ARG_ERROR(%O,%d,%O);\n", - name, - argnum+1, - arg->typename), - }); + default: + ret+=({ + PC.Token(sprintf("if(sp[%d].type != PIKE_T_%s)\n", + sp,upper_case(arg->basetype->text)),arg->line) + }); + break; + + case "program": + ret+=({ + PC.Token(sprintf("if(!( %s=program_from_svalue(sp%+d)))\n", + arg->name,sp),arg->line) + }); + break; + + case "mixed": + } + + switch((string)arg->basetype) + { + default: + ret+=({ + PC.Token(sprintf(" SIMPLE_BAD_ARG_ERROR(%O,%d,%O);\n", + attributes->errname || attributes->name || name, + argnum+1, + arg->typename),arg->line), + }); + + case "mixed": } switch(objectp(arg->basetype) ? arg->basetype->text : arg->basetype ) { case "int": ret+=({ - sprintf("%s=sp[%d].u.integer;\n", - arg->name, - sp) + sprintf("%s=sp[%d].u.integer;\n",arg->name,sp) }); break; @@ -426,22 +462,24 @@ array convert(array x) }); break; + case "mixed": ret+=({ - sprintf("%s=sp%+d;\n", - arg->name, - sp) + PC.Token(sprintf("%s=sp%+d; dmalloc_touch_svalue(sp%+d);\n", + arg->name, + sp,sp),arg->line), }); break; default: ret+=({ - sprintf("%s=sp[%d].u.%s;\n", - arg->name, - sp, - arg->basetype) + PC.Token(sprintf("debug_malloc_pass(%s=sp[%d].u.%s);\n", + arg->name, + sp, + arg->basetype),arg->line) }); - + + case "program": } argnum++; sp++; diff --git a/lib/modules/Parser.pmod/C.pmod b/lib/modules/Parser.pmod/C.pmod index b31026e29c..876d208dfd 100644 --- a/lib/modules/Parser.pmod/C.pmod +++ b/lib/modules/Parser.pmod/C.pmod @@ -224,7 +224,7 @@ class Token return predef::`+(@s,text); } - mixed _cast(string to) + mixed cast(string to) { if(to=="string") return text; } @@ -296,9 +296,9 @@ string reconstitute_with_line_numbers(array(string|object(Token)|array) tokens) (tok->file && tok->file != file)) { if(strlen(ret) && ret[-1]!='\n') ret+="\n"; - ret+=sprintf("#line %d %O\n",tok->line,tok->file); line=tok->line; - file=tok->file; + if(tok->file) file=tok->file; + ret+=sprintf("#line %d %O\n",line,file); } tok=tok->text; } -- GitLab