Что ж, похоже, виноват, что ошибка 519949 рекомендует использовать js :: Anchor, чтобы консервативный сканер стека подхватил его.
Обратите внимание, что консервативный сканер может найтилюбая вещь GC, которая находится в стеке или в регистрах, поэтому единственный действительно сложный случай - когда вы используете производные значения, когда «владеющая» вещь GC может быть мертвой, например:
{
JSString *str = GetMeSomeStringYo();
const jschar *chars = str->chars();
// Note, |str| is not "live" here, but the derived |chars| is!
// The conservative stack scanner won't see |chars| and know
// to keep |str| alive, so we should be anchoring |str|.
DoSomethingThatCanCauseGC();
return chars[0];
}
Если выиспользуя C, JS_AnchorPtr в конце функции должно быть достаточно.Вы правы, что функция имеет реализацию nop!Идея состоит в том, что до тех пор, пока он выполняет вызов символа общего объекта с переменной, чтобы сохранить ее в качестве параметра, вызывающая функция будет иметь , чтобы сохранить это значение в состоянии машины для выполнениябездействующий звонок.Это более отстойно для perf, чем js :: Anchor.
Существует одна потенциальная ловушка в маловероятном случае, когда вы статически связываетесь со SpiderMonkey и у вас включена оптимизация времени соединения: вызов между объектами может быть встроеннулевая реализация, исключающая жизнеспособность переменной, и в этом случае могут появиться те же опасности GC.