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?
Advertisement
Answer
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.