好吧,责备似乎是说错误 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 并启用了链接时间优化:跨对象调用可能内联了一个 null 实现,从而消除了变量的活性,在这种情况下,可能会出现相同的 GC 危险弹回来。