2013-04-29 8 views
5

Chcę zaimplementować funkcję C++ działającą jak console.log. Muszę znać pozycję wiersza kodu źródłowego javascript w C++. Przeszukuję dokumenty interfejsu API MDN JSAPI/JS Debugger, ale bez rezultatu.Jak uzyskać numer linii źródłowej dzwoniącego javascript w wywołaniu zwrotnym JSNative SpiderMonkey?

Użycie pojęcia w javascript.

console.log("blahblahblah"); 

Oczekiwana logika w 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

I wreszcie znaleźć sposób, aby uzyskać nazwę pliku i lineno. Kod obsługi błędów został pominięty.

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

Odpowiedz

1

Generalnie trzeba użyć aktualnie aktywną funkcję ramki na stosie JS, dostępną poprzez cx - że powie ci o skrypcie i aktualnie wykonywanego kodu bajtowego. Chociaż nie pamiętam dokładnego API z mojej głowy, jest jakaś funkcja, która będzie produkować płótno z tych danych (nie unikaj rezygnacji z dokumentów i zacznij czytać jscntxt.h i przyjaciół, widząc jak dokumenty mogą być nieaktualne - nie są generowane automatycznie).

Istnieje również zastrzeżenie, że JSNatives są konceptualnie wykonywane w ramce stosu rozmówcy, więc wywołanie funkcji consoleLog z innego JSNative nie będzie oznaczać czegoś takiego jak <native code>. Skutecznie wykona tylko to, co chcesz, po wywołaniu z wywołującego kod JS.

+0

Dziękujemy za informacje. W końcu używam 'JS_DescribeScriptedCaller' i' JS_GetScriptFilename', aby uzyskać nazwę pliku skryptu i lineno. – huandu

Powiązane problemy