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

hua*_*ndu 5 javascript debugging spidermonkey

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

javascript中的概念用法.

console.log("blahblahblah");
Run Code Online (Sandbox Code Playgroud)

和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;
}
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

我终于找到了获取文件名和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;
}
Run Code Online (Sandbox Code Playgroud)

cdl*_*ary 1

一般来说,您必须使用JS 堆栈上当前活动的函数框架cx,可以通过-- 这会告诉您有关脚本和当前正在执行的字节码的信息。虽然我记不起确切的 API,但有一些函数可以从该数据中生成 lineno(不要避免放弃文档并开始阅读jscntxt.h和朋友们,看看文档如何过时-- 它们不是自动生成的)。

还有一个警告是 JSNatives 在概念上是在其调用者的堆栈框架中执行的,因此从另一个 JSNative 调用 consoleLog 它不会说类似<native code>. 只有当从 JS 代码调用者调用时,它才会有效地执行您想要的操作。