2013-04-29 22 views
5

Tôi muốn thực hiện một hàm C++ làm việc như console.log. Tôi cần biết vị trí dòng nguồn của người gọi javascript trong C++. Tôi tìm kiếm tài liệu API Debugger MDN JSAPI/JS nhưng không có kết quả.Làm thế nào để có được số lượng người gọi javascript nguồn trong SpiderMonkey JSNative gọi lại?

Sử dụng khái niệm trong javascript.

console.log("blahblahblah"); 

Và logic dự kiến ​​trong 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; 
} 

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

CẬP NHẬT

cuối cùng tôi đã tìm thấy một cách để làm cho tên tập tin và lineno. Mã lỗi xử lý bị bỏ qua.

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

Trả lời

1

Nói chung, bạn phải sử dụng hiện đang hoạt động khung chức năng trên stack JS, truy cập thông qua cx - đó sẽ cho bạn biết về kịch bản và hiện đang thực hiện bytecode. Mặc dù tôi không thể nhớ chính xác API trên đỉnh đầu của tôi, có một số chức năng sẽ sản xuất lineno từ dữ liệu đó (không được tránh từ bỏ tài liệu và bắt đầu đọc jscntxt.h và bạn bè, xem cách tài liệu có thể đã lỗi thời - chúng không được tạo tự động). Ngoài ra còn có một caveat trong đó JSNatives khái niệm thực hiện trong khung stack của người gọi của họ, do đó, gọi consoleLog từ JSNative khác nó sẽ không nói một cái gì đó như <native code>. Nó sẽ chỉ có hiệu quả làm những gì bạn muốn khi được gọi từ một người gọi JS-code.

+0

Cảm ơn thông tin của bạn. Cuối cùng tôi sử dụng 'JS_DescribeScriptedCaller' và' JS_GetScriptFilename' để lấy tên tập lệnh và thành công của lineno. – huandu

Các vấn đề liên quan