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)
一般来说,您必须使用JS 堆栈上当前活动的函数框架cx,可以通过-- 这会告诉您有关脚本和当前正在执行的字节码的信息。虽然我记不起确切的 API,但有一些函数可以从该数据中生成 lineno(不要避免放弃文档并开始阅读jscntxt.h和朋友们,看看文档如何过时-- 它们不是自动生成的)。
还有一个警告是 JSNatives 在概念上是在其调用者的堆栈框架中执行的,因此从另一个 JSNative 调用 consoleLog 它不会说类似<native code>. 只有当从 JS 代码调用者调用时,它才会有效地执行您想要的操作。
| 归档时间: |
|
| 查看次数: |
621 次 |
| 最近记录: |