5

console.log のように機能する C++ 関数を実装したいと考えています。C++ での JavaScript 呼び出し元のソース行の位置を知る必要があります。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;
}

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

アップデート

私はついに filename と 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。ドキュメントが古くなっている可能性があるため) -- それらは自動生成されません)。

また、JSNatives は呼び出し元のスタック フレームで概念的に実行されるため、別の JSNative から consoleLog を呼び出すと、<native code>. JS コードの呼び出し元から呼び出されたときにのみ、必要なことを効果的に実行します。

于 2013-04-29T16:34:53.350 に答える