我想实现像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;
}
答案 0 :(得分:1)
通常,您必须使用JS堆栈上的当前活动的功能框架,可通过cx
访问 - 这将告诉您脚本和当前正在执行的字节码。虽然我不记得我头脑中的确切API,但是有一些函数会从该数据中产生lineno(不要放弃放弃文档并开始阅读jscntxt.h
和朋友,看看如何文档可能已过时 - 它们不是自动生成的。
还有一个警告,即JSNatives在其调用者的堆栈帧中概念性地执行,因此从另一个JSNative调用consoleLog它不会说<native code>
之类的东西。它只会在从JS代码调用者调用时有效地执行您想要的操作。