我在我的C++應用程序中嵌入了Spidermonkey。我需要在本地C++中實現一些自定義Javascript函數,這些函數傳遞給jsval。我需要防止jsval意外收集垃圾。它是正確的,我做到這一點:Spidermonkey和垃圾回收
(1)在一個init程序:
static jsval vp; // a STATIC variable, value unknown
JSBool init((JSContext *cx, uintN argc, jsval *vp) {
JS_AddValueRoot(cx, &vp);
}
(2)在一個C++函數執行Javascript函數的setter():
JSBool setter(JSContext *cx, uintN argc, jsval *vp) {
...
vp=...;// set to some JSObject and hopefully makes any previous JSObject available for gc
}
(3)在執行Javascript函數getter()的同一編譯單元內的第二個C++函數調用中:
JSBool getter(JSContext *cx, uintN argc, jsval *vp) {
jsval somethingelse = vp; //directly retrieve the static value stored by setter()
....
}
我的javascript腳本使用的函數調用是這樣的:
init();
setter(...);
some_other_function_call_that_causes_gc();
getter();
setter(...);
some_other_function_call_that_causes_gc();
getter();
....
some_other_function_call_that_causes_gc();
setter(...);
some_other_function_call_that_causes_gc();
getter();
注意,我從來沒有叫JS_RemoveRoot(),因爲靜態jsval VP是我jsval 2個函數調用之間傳遞的永久存儲。並且,假設以前存儲在jsval中的任何JSObject都可用於垃圾收集,我會在setter()中將新值設置到gc紮根靜態變量vp中。
這些正確的方法來創建gc可以通過函數調用傳遞的臨時變量?特別是,我的setter()方法替代了以前的JSObject,使得現有的JSObject可用於gc(即沒有內存泄漏/崩潰)。
編輯:爲什麼我相信垃圾收集是一個問題的原因是:
https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide
根據第JSAPI概念,使用Javascript價值觀:
一個JSVal本身並不能保護它來自垃圾的物品 收藏家
https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips
示例3說「當你去」並顯示如何將jsval分配給根。
我沒有看到爲什麼變量會在垃圾回收的風險?你能否指出這一點。 – Jivings 2012-03-07 10:45:21
因爲在我的Javascript腳本中,我正在調用setter()和getter之間的其他Javascript函數。請注意,setter()設置它的值,然後,另一個函數getter()獲取該值。 – JavaMan 2012-03-07 10:48:14
有多少功能並不重要。如果沒有對它的引用,東西只會是GC。也許我不瞭解這個問題。你有證據表明GC正在刪除你需要的變量嗎? – Jivings 2012-03-07 11:04:49