pike.git/
lib/
master.pike.in
Branch:
Tag:
Non-build tags
All tags
No tags
2003-03-27
2003-03-27 02:32:04 by Martin Stjernholm <mast@lysator.liu.se>
3d21a613e5c65856311e837cc5232d9cf39491d9 (
275
lines) (+
171
/-
104
)
[
Show
|
Annotate
]
Branch:
7.9
Improved RESOLV_DEBUG output.
Rev: lib/master.pike.in:1.263
6:
// Pike is distributed under GPL, LGPL and MPL. See the file COPYING // for more information. //
-
// $Id: master.pike.in,v 1.
262
2003/03/
20
18
:
00
:
36
mast Exp $
+
// $Id: master.pike.in,v 1.
263
2003/03/
27
02
:
32
:
04
mast Exp $
#pike __REAL_VERSION__
71:
#define capitalize(X) (upper_case((X)[..0])+(X)[1..]) #define write(X) _static_modules.files()->_stdout->write(X)
+
#ifdef RESOLV_DEBUG
+
+
#if constant (thread_local)
+
static object resolv_msg_depth = thread_local();
+
#define GET_RESOLV_MSG_DEPTH (resolv_msg_depth->get())
+
#define INC_RESOLV_MSG_DEPTH() (resolv_msg_depth->set (resolv_msg_depth->get() + 1))
+
#define DEC_RESOLV_MSG_DEPTH() (resolv_msg_depth->set (resolv_msg_depth->get() - 1))
+
#else
+
static int resolv_msg_depth;
+
#define GET_RESOLV_MSG_DEPTH resolv_msg_depth
+
#define INC_RESOLV_MSG_DEPTH() (++resolv_msg_depth)
+
#define DEC_RESOLV_MSG_DEPTH() (--resolv_msg_depth)
+
#endif
+
+
void resolv_debug (string fmt, mixed... args)
+
{
+
string pad = " " * GET_RESOLV_MSG_DEPTH;
+
if (sizeof (args)) fmt = sprintf (fmt, @args);
+
if (fmt[-1] == '\n')
+
fmt = pad + replace (fmt[..sizeof (fmt) - 2], "\n", "\n" + pad) + "\n";
+
else
+
fmt = pad + replace (fmt, "\n", "\n" + pad);
+
werror (fmt);
+
}
+
+
#else // !RESOLV_DEBUG
+
#define INC_RESOLV_MSG_DEPTH() 0
+
#define DEC_RESOLV_MSG_DEPTH() 0
+
#define resolv_debug(X...) do {} while (0)
+
#endif // !RESOLV_DEBUG
+
//! @appears error //! Throws an error. A more readable version of the code //! @tt{throw( ({ sprintf(f, @@args), backtrace() }) )@}.
530:
#endif { if(!zero_type (ret=programs[fname])) {
-
#ifdef
RESOLV_DEBUG
-
werror
("low_findprog
:
%s returning cached (no autoreload)\n"
-
" %O\n"
, fname
, ret
);
-
#endif
+
resolv_debug
("low_findprog %s
:
returning cached (no autoreload)\n", fname);
return ret; } }
560:
#ifdef PIKE_AUTORELOAD if (load_time[fname] > s[3]) if (!zero_type (ret=programs[fname])) {
-
#ifdef
RESOLV_DEBUG
-
werror
("low_findprog
:
%s returning cached (autoreload)\n", fname);
-
#endif
+
resolv_debug
("low_findprog %s
:
returning cached (autoreload)\n", fname);
return ret; } #endif
578:
{ mixed err=catch { AUTORELOAD_CHECK_FILE(oname);
+
resolv_debug ("low_findprog %s: decoding dumped\n", fname);
+
INC_RESOLV_MSG_DEPTH();
ret = decode_value(master_read_file(oname), (handler && handler->get_codec || get_codec)(fname, mkobj));
-
#ifdef
RESOLV_
DEBUG
-
werror
("low_findprog
:
%s
returning
decoded
dump\n
", fname);
-
#endif
+
DEC_
RESOLV_
MSG_DEPTH();
+
resolv_debug
("low_findprog %s
:
dump
decode
ok\n
", fname);
return programs[fname] = ret; };
-
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("low_findprog %s: dump decode failed\n", fname);
m_delete(programs, fname); if (handler && handler->compile_warning) { handler->compile_warning(oname, 0,
608:
} }
-
#ifdef
RESOLV_DEBUG
-
werror
("low_findprog
:
%s compiling, mkobj:%O\n", fname, mkobj);
-
#endif
+
resolv_debug
("low_findprog %s
:
compiling, mkobj:
%O\n", fname, mkobj);
+
INC_RESOLV_MSG_DEPTH();
programs[fname]=ret=__empty_program(0, fname); if ( mixed e=catch { ret=compile_file(fname,
619:
mkobj? (objects[ret]=__null_program()) : 0); } ) {
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("low_findprog %s: compilation failed\n", fname);
m_delete(objects, ret); ret=programs[fname]=0; // Negative cache. throw(e); }
-
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("low_findprog %s: compilation ok\n", fname);
break; #if constant(load_module) case ".so":
632:
} ret=load_module(fakeroot(fname));
-
#ifdef
RESOLV_DEBUG
-
werror
("low_findprog
:
%s loaded binary\n", fname);
-
#endif
+
resolv_debug
("low_findprog %s
:
loaded binary\n", fname);
#endif /* load_module */ }
642:
return programs[fname]=ret; }
-
#ifdef
RESOLV
_
DEBUG
-
werror
("low_findprog
:
%s file not found\n", fname);
-
#endif
+
resolv
_
debug
("low_findprog %s
:
file not found\n", fname);
return 0; }
751:
string current_file, object|void handler) {
-
return
low_cast_to_program(pname, current_file, handler);
+
resolv_debug
("cast_to_program(%O, %O)\n", pname, current_file);
+
INC_RESOLV_MSG_DEPTH();
+
program ret =
low_cast_to_program(pname, current_file, handler);
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("cast_to_program(%O, %O) => %O\n", pname, current_file, ret);
+
return ret;
}
877:
//! is called from the compiler. program handle_inherit(string pname, string current_file, object|void handler) {
-
return
cast_to_program(pname, current_file, handler);
+
resolv_debug
("handle_inherit(%O, %O)\n", pname, current_file);
+
INC_RESOLV_MSG_DEPTH();
+
program ret = low_
cast_to_program(pname, current_file, handler);
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("handle_inherit(%O, %O) => %O\n", pname, current_file, ret);
+
return ret;
} mapping (program:object) objects=([object_program(this_object()):this_object()]);
900:
//! may also receive more arguments in the future. object cast_to_object(string oname, string current_file) {
+
resolv_debug ("cast_to_object(%O, %O)\n", oname, current_file);
+
INC_RESOLV_MSG_DEPTH();
object o = low_cast_to_object(oname, current_file);
-
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("cast_to_object(%O, %O) => %O\n", oname, current_file, o);
if (objectp (o)) return o; error("Cast '"+oname+"' to object failed"+ ((current_file && current_file!="-")?sprintf(" for '%s'",current_file):"")+".\n");
920:
void create(string d, object|void h) {
-
#ifdef
MODULE_TRACE
-
werror
("
%*ndirnode
(%O,%O)
;\n
",
sizeof(backtrace())-1,
d,h);
-
#endif
+
resolv_debug
("
dirnode
(%O,%O)
created\n
",d,h);
dirname=d; handler=h; fc[dirname]=this_object();
942:
{ int `!() {
-
#ifdef
MODULE_TRACE
-
werror
("
%*ndirnode
(%O)->module_checker()->`!()\n",
-
sizeof
(
backtrace(
)
),dirname)
;
-
#endif
+
resolv_debug
("
dirnode
(%O)->module_checker()->`!()\n",
dirname);
+
INC_RESOLV_MSG_DEPTH
();
if (catch { if(module=findmodule(dirname+"/module", handler)) {
959:
cache=([]); _cache_full=0; }
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("dirnode(%O)->module_checker()->`!() => %s\n",
+
dirname, !module ? "doesn't exist" : "exists");
+
return !module;
}) { // findmodule() failed. This can occur due to circularities // between encode_value()'ed programs.
966:
// "Cannot call functions in unfinished objects." // Pretend not to exist for now...
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("dirnode(%O)->module_checker()->`!() => failure, doesn't exist\n",
+
dirname);
return 1; }
-
-
return !module;
+
} mixed `[](string index) {
-
#ifdef
MODULE_TRACE
-
werror
("
%*ndirnode
(%O)->module_checker()[%O]
\n
",
-
sizeof(backtrace()),
dirname,index);
-
#endif
-
if(
module
)
return
module[index];
+
resolv_debug
("
dirnode
(%O)->module_checker()[%O]
=> %O\n
",
+
dirname,
index
, module && module[index]
);
+
return
module
&&
module[index];
} array(string) _indices() { if(module) return indices(module); } array _values() { if(module) return values(module); }
986:
static mixed ind(string index) {
-
#ifdef
MODULE_TRACE
-
werror
("
%*nDirnode
(%O)
ind
[
%O
] -> ???
\n",
-
sizeof
(
backtrace(
)
),dirname,index)
;
-
#endif
+
resolv_debug
("
dirnode
(%O)
->
ind
(
%O
)
\n",
dirname,
index);
+
INC_RESOLV_MSG_DEPTH
();
+
if(module) {
-
#ifdef MODULE_TRACE
-
werror("%*nDirnode(%O) module[%O] -> ???\n",
-
sizeof(backtrace()),dirname,index);
-
#endif
+
mixed o; // _describe(module); if(!zero_type(o=module[index])) {
-
#ifdef
MODULE
_
TRACE
-
werror
("
%*nDirnode
(%O)
module[
%O
]
-
> %O\n",
-
sizeof(backtrace()),
dirname,index, o);
-
#endif
+
DEC
_
RESOLV_MSG_DEPTH();
+
resolv_debug
("
dirnode
(%O)
->ind(
%O
)
=
>
found
%O\n",
+
dirname,
index, o);
return o; } }
1017:
ret=1; break; }
-
if(!ret)
+
if(!ret)
{
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("dirnode(%O)->ind(%O) => no file match\n", dirname, index);
return UNDEFINED;
-
+
}
-
index
= dirname+"/"+index;
-
#ifdef MODULE_TRACE
-
werror("%*nDirnode(%O) findmodule(%O)\n",
-
sizeof(backtrace()), dirname, index);
-
#endif
+
string
fullname
= dirname+"/"+index;
object o;
-
if(objectp(o=findmodule(
index
, handler)))
+
if(objectp(o=findmodule(
fullname
, handler)))
{ if(mixed tmp=o->_module_value) o=tmp;
-
#ifdef
MODULE
_
TRACE
-
werror
("
%*nDirnode
(%O)
findmodule
(%O) =
=
> %O\n",
-
sizeof(backtrace()),
dirname, index, o);
-
#endif
+
DEC
_
RESOLV_MSG_DEPTH();
+
resolv_debug
("
dirnode
(%O)
->ind
(%O) =>
found submodule
%O\n",
+
dirname, index, o);
return o; }
-
if (program p=cast_to_program(
index
, 0, handler ))
+
if (program p=cast_to_program(
fullname
, 0, handler ))
{
-
#ifdef
MODULE
_
TRACE
-
werror
("
%*nDirnode
(%O)
cast_to_program
(%O) =
=
> %O\n",
-
sizeof(backtrace()),
dirname, index, p);
-
#endif
+
DEC
_
RESOLV_MSG_DEPTH();
+
resolv_debug
("
dirnode
(%O)
->ind
(%O) =>
found subprogram
%O\n",
+
dirname, index, p);
return p; }
-
#ifdef
MODULE
_
TRACE
-
werror
("
%*nDirnode
(%O)->
`[]
(%O)
FAILED\n
",
-
sizeof(backtrace()),
dirname, index);
-
#endif
+
DEC
_
RESOLV_MSG_DEPTH();
+
resolv_debug
("
dirnode
(%O)->
ind
(%O)
=> not found\n
",
+
dirname, index);
return UNDEFINED; }
1060:
if(!zero_type(ret=cache[index])) { #ifdef MODULE_TRACE
-
werror("%*nDirnode(%O) cache[%O]
-
> %O%s\n",
+
werror("%*nDirnode(%O) cache[%O]
=
> %O%s\n",
sizeof(backtrace()),dirname,index, ret, (ret != ZERO_TYPE)?"":" (zero_type)"); #endif
1090:
static int(0..1) _cache_full; void fill_cache() {
-
#
ifdef
RESOLV_DEBUG
+
#
if
0
werror(describe_backtrace(({ sprintf("Filling cache in dirnode %O\n", dirname), backtrace() })));
-
#endif
/* RESOLV_DEBUG */
+
#endif
if (_cache_full) { return; }
1173:
void create(array(object|mapping) _joined_modules) { joined_modules = _joined_modules;
+
resolv_debug ("joinnode(%O) created\n", joined_modules);
} static mixed ind(string index) {
-
+
resolv_debug ("joinnode(%O)->ind(%O)\n", joined_modules, index);
+
INC_RESOLV_MSG_DEPTH();
+
array(mixed) res = ({}); foreach(joined_modules, object|mapping o) {
1189:
// Only join directorynodes (or joinnodes). res += ({ ret }); } else if ( !zero_type(ret) ) {
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("joinnode(%O)->ind(%O) => found %O\n",
+
joined_modules, index, ret);
return (ret); } else { // Ignore
1196:
} } }
-
if (sizeof(res) > 1)
+
+
if (sizeof(res) > 1)
{
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("joinnode(%O)->ind(%O) => new joinnode\n",
+
joined_modules, index);
return joinnode(res);
-
else if (sizeof(res))
+
}
+
+
else if (sizeof(res))
{
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("joinnode(%O)->ind(%O) => found %O\n",
+
joined_modules, index, res[0]);
return res[0];
-
+
}
+
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("joinnode(%O)->ind(%O) => not found\n", joined_modules, index);
return UNDEFINED; }
1228:
static int _cache_full; void fill_cache() {
-
#
ifdef
RESOLV_DEBUG
+
#
if
0
werror(describe_backtrace(({ "Filling cache in joinnode\n", backtrace() })));
-
#endif
/* RESOLV_DEBUG */
+
#endif
if (_cache_full) { return; }
1280:
object findmodule(string fullname, object|void handler) { object o;
-
#ifdef
MODULE
_
TRACE
-
werror
("
%*nfindmodule
(%O)\n",
sizeof(backtrace()),
fullname);
-
#endif
+
resolv
_
debug
("
findmodule
(%O)\n",
fullname);
if(!zero_type(o=fc[fullname])) {
-
//
werror("fc[%O] -> %O\n",fullname, o);
-
if (objectp(o)
)
return
o
;
-
if
(
o
=
=
0
)
return
UNDEFINED
;
+
if (objectp(o)
||
o
!= 0) {
+
resolv_debug
(
"findmodule(%O)
=
>
found %O (cached
)
\n",
fullname,
o)
;
return o; }
-
+
resolv_debug ("findmodule(%O) => not found (cached)\n", fullname);
+
return UNDEFINED;
+
}
if(Stat stat=master_file_stat(fakeroot(fullname+".pmod"))) {
-
if(stat[1]==-2)
+
if(stat[1]==-2)
{
+
resolv_debug ("findmodule(%O) => new dirnode\n", fullname);
return dirnode(fullname+".pmod", handler); }
-
+
}
-
if(objectp (o = low_cast_to_object(fullname+".pmod", "/.", handler)))
+
INC_RESOLV_MSG_DEPTH();
+
+
if(objectp (o = low_cast_to_object(fullname+".pmod", "/.", handler)))
{
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("findmodule(%O) => got object %O\n", fullname, o);
return fc[fullname]=o;
-
+
}
#if constant(load_module)
-
if(master_file_stat(fakeroot(fullname+".so")))
-
return
fc[fullname] = low_cast_to_object(fullname, "/.", handler);
+
if(master_file_stat(fakeroot(fullname+".so")))
{
+
o
=
fc[fullname] = low_cast_to_object(fullname, "/.", handler);
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("findmodule(%O) => got .so object %O\n", fullname, o);
+
return o;
+
}
#endif
-
+
DEC_RESOLV_MSG_DEPTH();
+
resolv_debug ("findmodule(%O) => not found\n", fullname);
return fc[fullname] = 0; }
1320:
} else { path = combine_path_with_cwd(what); }
-
#ifdef MODULE_TRACE
-
werror("%*nhandle_import(%O, %O, %O)\n",
-
sizeof(backtrace()), what, current_file, handler);
-
#endif /* MODULE_TRACE */
+
if (handler) {
-
+
resolv_debug ("handle_import(%O, %O, %O) => new dirnode with handler\n",
+
what, current_file, handler);
return dirnode(path, handler); }
-
if(fc[path]) return fc[path];
+
if(fc[path])
{
+
resolv_debug ("handle_import(%O, %O) => found %O (cached)\n",
+
what, current_file, fc[path]);
+
return fc[path];
+
}
+
resolv_debug ("handle_import(%O, %O) => new dirnode\n", what, current_file);
return dirnode(path); }
1530:
mixed resolv(string identifier, string|void current_file, object|void current_handler) {
-
#ifdef
RESOLV_DEBUG
-
werror
("
Resolv
(%O, %O)\n",identifier, current_file);
-
#endif
/*
RESOLV_
DEBUG */
+
resolv_debug
("
resolv
(%O, %O)\n",identifier, current_file);
+
INC_
RESOLV_
MSG_DEPTH();
// FIXME: Support having the cache in the handler? if( no_resolv[ identifier ] ) {
-
#ifdef
RESOLV_
DEBUG
-
werror
("
Resolv
(%O, %O) => excluded\n",identifier, current_file);
-
#endif /* RESOLV_DEBUG */
+
DEC_
RESOLV_
MSG_DEPTH();
+
resolv_debug
("
resolv
(%O, %O) => excluded\n",identifier, current_file);
return UNDEFINED; }
1552:
string id=identifier+":"+(current_file ? dirname(current_file) : "-"); if( zero_type (ret = resolv_cache[id]) != 1 ) {
-
// werror("Resolv cached(%O) => %O (%d)\n",id,resolv_cache[id],zero_type(resolv_cache[id]));
+
#ifdef RESOLV_DEBUG
-
+
DEC_RESOLV_MSG_DEPTH();
if (ret == ZERO_TYPE)
-
werror
("
Resolv
(%O, %O) => not found (cached)\n",identifier, current_file);
+
resolv_debug
("
resolv
(%O, %O) => not found (cached)\n",identifier, current_file);
else
-
werror
("
Resolv
(%O, %O) => found %O (cached)\n",identifier, current_file, ret);
+
resolv_debug
("
resolv
(%O, %O) => found %O (cached)\n",identifier, current_file, ret);
#endif /* RESOLV_DEBUG */ return ret == ZERO_TYPE ? UNDEFINED : ret; }
1569:
ret=ret[index]; } resolv_cache[id] = zero_type (ret) ? ZERO_TYPE : ret;
+
DEC_RESOLV_MSG_DEPTH();
#ifdef RESOLV_DEBUG if (zero_type (ret))
-
werror
("
Resolv
(%O, %O) => not found\n",identifier, current_file);
+
resolv_debug
("
resolv
(%O, %O) => not found\n",identifier, current_file);
else
-
werror
("
Resolv
(%O, %O) => found %O\n",identifier, current_file, ret);
+
resolv_debug
("
resolv
(%O, %O) => found %O\n",identifier, current_file, ret);
#endif /* RESOLV_DEBUG */ return ret; }