From b1693aa9e9d33cc63b587374b9bf75872527eaa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Fri, 7 Apr 2000 18:42:51 -0700 Subject: [PATCH] a little bit better module dumping Rev: bin/install.pike:1.54 Rev: lib/master.pike.in:1.112 Rev: lib/modules/Standards.pmod/ASN1.pmod/Types.pmod:1.13 Rev: src/dumpmodule.pike:1.9 Rev: src/modules/Regexp/module.pmod.in:1.3 --- bin/install.pike | 1 + lib/master.pike.in | 13 ++- .../Standards.pmod/ASN1.pmod/Types.pmod | 3 + src/dumpmodule.pike | 95 +++++++++++++++---- src/modules/Regexp/module.pmod.in | 6 ++ 5 files changed, 95 insertions(+), 23 deletions(-) diff --git a/bin/install.pike b/bin/install.pike index b667ef3bf5..3706e5c2ae 100644 --- a/bin/install.pike +++ b/bin/install.pike @@ -1141,6 +1141,7 @@ void do_install() if(sizeof(to_dump)) { + rm("dumpmodule.log"); status("Dumping modules, please wait..."); foreach(to_dump, string mod) rm(mod+".o"); /* Dump 50 modules at a time */ diff --git a/lib/master.pike.in b/lib/master.pike.in index ae2185f463..be7b7d9200 100644 --- a/lib/master.pike.in +++ b/lib/master.pike.in @@ -1,6 +1,6 @@ /* -*- Pike -*- * - * $Id: master.pike.in,v 1.111 2000/03/30 21:06:53 grubba Exp $ + * $Id: master.pike.in,v 1.112 2000/04/08 01:30:19 hubbe Exp $ * * Master-file for Pike. * @@ -574,7 +574,7 @@ object cast_to_object(string oname, string current_file) if(object o=low_cast_to_object(oname, current_file)) return o; error("Cast '"+oname+"' to object failed"+ - (current_file?sprintf("for '%s'",current_file):"")+".\n"); + ((current_file && current_file!="-")?sprintf(" for '%s'",current_file):"")+".\n"); return 0; } @@ -1646,30 +1646,33 @@ class Codec function functionof(string x) { if(sscanf(x,"efun:%s",x)) return f[x]; + if(sscanf(x,"resolv:%s",x)) return resolv(x); return 0; } object objectof(string x) { if(sscanf(x,"efun:%s",x)) return f[x]; + if(sscanf(x,"resolv:%s",x)) return resolv(x); return cast_to_object(x,0); } program programof(string x) { if(sscanf(x,"efun:%s",x)) return f[x]; - + if(sscanf(x,"resolv:%s",x)) return resolv(x); return cast_to_program(x,0); } mixed encode_object(object x) { + if(x->_encode) return x->_encode(); error("Cannot encode objects yet.\n"); } - mixed decode_object(object x) + mixed decode_object(object o, mixed data) { - error("Cannot encode objects yet.\n"); + o->_decode(data); } } diff --git a/lib/modules/Standards.pmod/ASN1.pmod/Types.pmod b/lib/modules/Standards.pmod/ASN1.pmod/Types.pmod index 0a8f8fd824..c4a9176ae2 100644 --- a/lib/modules/Standards.pmod/ASN1.pmod/Types.pmod +++ b/lib/modules/Standards.pmod/ASN1.pmod/Types.pmod @@ -390,6 +390,9 @@ class asn1_identifier return this_object(); } + mixed _encode() { return id; } + void _decode(mixed data) { id=data; } + object append(int ...args) { return object_program(this_object())(@id, @args); diff --git a/src/dumpmodule.pike b/src/dumpmodule.pike index 6f9fb1a07a..90f0019d4b 100755 --- a/src/dumpmodule.pike +++ b/src/dumpmodule.pike @@ -13,15 +13,21 @@ class FakeMaster } } -#define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) ) +#define error(X) throw( ({ (X), backtrace() }) ) + +mapping function_names=([]); + class Codec { + string last_id; + string nameof(mixed x) { +// if(logfile) logfile->write("%O\n",x); // werror("%O\n",x); if(p!=x) - if(mixed tmp=search(all_constants(),x)) - return "efun:"+tmp; + if(mixed tmp=function_names[x]) + return tmp; switch(sprintf("%t",x)) { @@ -40,13 +46,28 @@ class Codec break; case "object": - if(mixed tmp=search(master()->objects,x)) + if(program p=search(master()->objects,x)) { - if(tmp=search(master()->programs,tmp)) + if(string tmp=search(master()->programs,p)) { return tmp; + }else{ +#if 0 + werror("Completely failed to find this program:\n"); + _describe(p); +#endif } } + if(object_program(x) == master()->dirnode) + { + /* FIXME: this is a bit ad-hoc */ + string dirname=x->dirname; + dirname-=".pmod"; + sscanf(dirname,"%*slib/modules/%s",dirname); + dirname=replace(dirname,"/","."); + if(master()->resolv(dirname) == x) + return "resolv:"+dirname; + } break; } return ([])[0]; @@ -57,6 +78,9 @@ class Codec if(sscanf(x,"efun:%s",x)) return all_constants()[x]; + if(sscanf(x,"resolv:%s",x)) + return master()->resolv(x); + werror("Failed to decode %s\n",x); return 0; } @@ -67,6 +91,9 @@ class Codec if(sscanf(x,"efun:%s",x)) return all_constants()[x]; + if(sscanf(x,"resolv:%s",x)) + return master()->resolv(x); + if(object tmp=(object)x) return tmp; werror("Failed to decode %s\n",x); return 0; @@ -78,6 +105,9 @@ class Codec if(sscanf(x,"efun:%s",x)) return all_constants()[x]; + if(sscanf(x,"resolv:%s",x)) + return master()->resolv(x); + if(sscanf(x,"_static_modules.%s",x)) { return (program)_static_modules[x]; @@ -90,13 +120,22 @@ class Codec mixed encode_object(object x) { -// _describe(x); + if(x->_encode) return x->_encode(); +// if(logfile) +// logfile->write("Cannot encode objects yet: %s\n",master()->stupid_describe(x,100000)); +#if 0 + werror("\n>>>>>>encode object was called for:<<<<<<\n"); + _describe(x); + werror("\n"); +#endif error("Cannot encode objects yet.\n"); // error(sprintf("Cannot encode objects yet. %O\n",indices(x))); } - mixed decode_object(object x) + mixed decode_object(program p, mixed data) { + object ret=p(@data[0]); + if(sizeof(data)>1) ret->_decode(data[1]); error("Cannot encode objects yet.\n"); } } @@ -104,15 +143,29 @@ class Codec int quiet=0; Stdio.File logfile; -void log(string file, int line, string err) + +class Handler { - if(!logfile) return; - logfile->write("================================================\n"); - logfile->write(sprintf("%s:%d:%s\n",file,line,err)); + void compile_error(string file,int line,string err) + { + if(!logfile) return; + logfile->write(sprintf("%s:%d:%s\n",file,line,err)); + } + + void compile_warning(string file,int line,string err) + { + if(!logfile) return; + logfile->write(sprintf("%s:%d:%s\n",file,line,err)); + } } + + void dumpit(string file) { + if(logfile) + logfile->write("##%s##\n",file); + if(!quiet) werror(file +": "); @@ -130,10 +183,10 @@ void dumpit(string file) werror("does not exist.\n"); break; } - if(programp(p=compile_file(file))) + if(programp(p=compile_file(file, Handler()))) { string s=encode_value(p, Codec()); - p=decode_value(s,Codec()); + p=decode_value(s,master()->Codec()); if(programp(p)) { Stdio.File(file + ".o","wct")->write(s); @@ -169,8 +222,8 @@ void dumpit(string file) werror("X"); if(logfile) { - err[0]="While dumping "+file+": "+err[0]; - logfile->write("================================================\n"); +// err[0]="While dumping "+file+": "+err[0]; +// logfile->write("================================================\n"); logfile->write(master()->describe_backtrace(err)); } }else{ @@ -182,16 +235,23 @@ void dumpit(string file) int main(int argc, string *argv) { + foreach( (array)all_constants(), [string name, mixed func]) + function_names[func]="efun:"+name; + + function_names[Stdio.stdin]="resolv:Stdio.stdin"; + function_names[Stdio.stdout]="resolv:Stdio.stdout"; + function_names[Stdio.stderr]="resolv:Stdio.stderr"; + function_names[_static_modules.Builtin]="resolv:_"; + if(argv[1]=="--quiet") { quiet=1; argv=argv[1..]; - master()->set_inhibit_compile_errors(log); // FIXME: Make this a command line option.. // It should not be done when running a binary dist // installation... - logfile=Stdio.File("dumpmodule.log","cwt"); + logfile=Stdio.File("dumpmodule.log","caw"); // werror("Dumping modules "); } @@ -199,7 +259,6 @@ int main(int argc, string *argv) { quiet=2; argv=argv[1..]; - master()->set_inhibit_compile_errors(log); logfile=0; } diff --git a/src/modules/Regexp/module.pmod.in b/src/modules/Regexp/module.pmod.in index 9892111844..87d107805c 100644 --- a/src/modules/Regexp/module.pmod.in +++ b/src/modules/Regexp/module.pmod.in @@ -49,9 +49,15 @@ class Regexp { case 'O': return sprintf("Regexp(%O)", regexp_string); + + case 's': + return regexp_string; } return 0; } + + mixed _encode() { return regexp_string; } + mixed _decode(string s) { create(s); } } program _module_value=Regexp; -- GitLab