How can one get the name and line of a function that called the current one? I would like to have a rudimentary debugging function like this (with npmlog defining log.debug):
function debug() {
var callee, line;
/* MAGIC */
log.debug(callee + ":" + line, arguments)
}
When called from another function it would be something like this:
function hello() {
debug("world!")
}
// outputs something like:
// "hello:2 'world!'"
For clarity, what I want is essentially analogous to this in Python:
import inspect
def caller():
return inspect.stack()[2][3]
// line no from getframeinfo().lineno
Is there a Node equivalent to accomplish this?
Using info from here: Accessing line number in V8 JavaScript (Chrome & Node.js)
you can add some prototypes to provide access to this info from V8:
Object.defineProperty(global, '__stack', {
get: function() {
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = function(_, stack) {
return stack;
};
var err = new Error;
Error.captureStackTrace(err, arguments.callee);
var stack = err.stack;
Error.prepareStackTrace = orig;
return stack;
}
});
Object.defineProperty(global, '__line', {
get: function() {
return __stack[1].getLineNumber();
}
});
Object.defineProperty(global, '__function', {
get: function() {
return __stack[1].getFunctionName();
}
});
function foo() {
console.log(__line);
console.log(__function);
}
foo()
Returns '28' and 'foo', respectively.
I found and installed the node-stack-trace module (installed with npm install stack-trace), and then defined echo as:
function echo() {
var args, file, frame, line, method;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
frame = stackTrace.get()[1];
file = path.basename(frame.getFileName());
line = frame.getLineNumber();
method = frame.getFunctionName();
args.unshift("" + file + ":" + line + " in " + method + "()");
return log.info.apply(log, args); // changed 'debug' to canonical npmlog 'info'
};