Я встраиваю Spidermonkey в свое приложение C ++.Мне нужно реализовать некоторые пользовательские функции Javascript на нативном C ++, которые передают jsval.Мне нужно защитить jsval от случайного сбора мусора.Правильно ли мне сделать это:
(1) В процедуре инициализации:
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) Во втором вызове функции C ++ в том же модуле компиляции, реализующем функцию get JavaScript ():
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 (), поскольку static jsval vp является постоянным хранилищем для моего jsval, передаваемого между 2 вызовами функций.И я продолжаю устанавливать новые значения в статическую переменную gc с корневым доступом vp в моем setter (), предполагая, что любой предыдущий JSObject, сохраненный в jsval, будет доступен для сборки мусора.
Это правильные способы создания временных переменных с корневым доступом gcчто можно передать через вызов функции?В частности, это способ, которым мой setter () заменяет предыдущий JSObject правильным способом сделать существующий JSObject доступным для gc (т.е. без утечки памяти / сбоя).
EDIT: причина, по которой я считаю сборку мусорапроблема заключается в том, что:
https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide
В разделе JSAPI Concepts, Javascript Values:
jsval сам по себе не защищает своего референта от мусорасборщик
https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips
Пример 3 говорит " Root по мере движения " и показывает, как jsval должен быть назначен корню.