2013-04-29 60 views
5

我想实现一个像console.log一样工作的C++函数。我需要知道C++中的javascript调用者的源代码行位置。我搜索MDN JSAPI/JS调试器API文档,但没有结果。如何在SpiderMonkey JSNative回调中获取javascript调用者源代码行号?

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; 
} 

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

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; 
} 

回答

1

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

JSNatives在概念上在其调用者的堆栈框架中执行时也有一个警告,因此从另一个JSNative调用consoleLog它不会说类似<native code>的东西。它只会在从JS代码调用者调用时才有效地做到你想要的。

+0

感谢您的信息。我最终使用'JS_DescribeScriptedCaller'和'JS_GetScriptFilename'来成功获取脚本文件名和行号。 – huandu 2013-06-13 09:51:50

相关问题