如何在SpiderMonkey JSNative回调中获取javascript调用者源代码行?

时间:2013-04-29 04:37:28

标签: javascript debugging spidermonkey

我想实现像console.log一样的C ++函数。我需要知道javascript调用者在C ++中的源代码行位置。我搜索MDN JSAPI / JS Debugger API文档但没有结果。

javascript中的概念用法。

console.log("blahblahblah");

C ++中的预期逻辑。

JSBool consoleLog(JSContext *cx, unsigned argc, jsval *vp) {
    // expect to get caller info including filename, lineno.

    // write "blahblahblah" and caller info in my log system.

    return JS_TRUE;
}

==============

更新

我终于找到了获取文件名和lineno的方法。错误处理代码被省略。

#include "jsdbgapi.h"

JSBool consoleLog(JSContext *cx, unsigned argc, jsval *vp) {
    JSScript *script;
    unsigned int lineno;
    JS_DescribeScriptedCaller(cx, &script, &lineno);
    const char *filename = JS_GetScriptFilename(cx, script);

    // use filename and lineno to write log...

    return JS_TRUE;
}

1 个答案:

答案 0 :(得分:1)

通常,您必须使用JS堆栈上的当前活动的功能框架,可通过cx访问 - 这将告诉您脚本和当前正在执行的字节码。虽然我不记得我头脑中的确切API,但是有一些函数会从该数据中产生lineno(不要放弃放弃文档并开始阅读jscntxt.h和朋友,看看如何文档可能已过时 - 它们不是自动生成的。

还有一个警告,即JSNatives在其调用者的堆栈帧中概念性地执行,因此从另一个JSNative调用consoleLog它不会说<native code>之类的东西。它只会在从JS代码调用者调用时有效地执行您想要的操作。