// This function returns the name of a given function. It does this by
// converting the function to a string, then using a regular expression
// to extract the function name from the resulting code.
function funcname(f) {
var s = f.toString().match(/function (\w*)/)[1];
if ((s == null) || (s.length == 0)) return "anonymous";
return s;
}
// This function returns a string that contains a "stack trace."
function stacktrace() {
var s = ""; // This is the string we'll return.
// Loop through the stack of functions, using the caller property of
// one arguments object to refer to the next arguments object on the
// stack.
for(var a = arguments.caller; a != null; a = a.caller) {
// Add the name of the current function to the return value.
s += funcname(a.callee) + "\n";
// Because of a bug in Navigator 4.0, we need this line to break.
// a.caller will equal a rather than null when we reach the end
// of the stack. The following line works around this.
if (a.caller == a) break;
}
return s;
}