Saturday, May 25, 2024
 Popular · Latest · Hot · Upcoming
194
rated 0 times [  197] [ 3]  / answers: 1 / hits: 77409  / 12 Years ago, sat, january 5, 2013, 12:00:00

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?


More From » node.js

 Answers
17

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.


[#81064] Friday, January 4, 2013, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
elliem

Total Points: 415
Total Questions: 117
Total Answers: 94

Location: American Samoa
Member since Fri, Aug 26, 2022
2 Years ago
;