5

我想实现一个像 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;
}
4

1 回答 1

1

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

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

于 2013-04-29T16:34:53.350 回答