3

Bondi と呼ばれる独自の JavaScript サーバー側言語を作成しました。最近、新しいスパイダー モンキーにアップグレードされました。

JS がローカル ルートに入り、ローカル ルートを離れる関数が 1.8.5 API からなくなった/役に立たなくなったJS_AnchorPtr(varname)ので、コンパイラがへの参照を削除していないことを確認するために、関数呼び出しの最後にアンカー ポインター() を使用するだけで十分ですか?ガベージコレクターを幸せに保ちますか?

JS_EnterLocalRootScope へのすべての参照を削除してテストしてきました (こちらを参照) / ローカル ルート スコープを残しJS_AnchorPtr()て、スクリプトの末尾に追加します。

スパイダー モンキーのソース コードで AnchorPoint 関数を調べました。何を推測します...それは何もしません。ドコもありません。ガベージコレクターがそれらを殺さないように、これらの変数の言及を取得できるようにするためだけに使用しています。

4

1 に答える 1

2

まあ、バグ 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 実装があることは正しいです! アイデアは、パラメーターとして生き続ける変数を使用して共有オブジェクトシンボルへの呼び出しを実行している限り、呼び出し元の関数は、何もしない呼び出しを実行するために、マシンの状態でその値を保持する必要があるということですこれは js::Anchor よりも perf にとって厄介です。

SpiderMonkey に対して静的にリンクしていて、リンク時の最適化が有効になっている場合、1 つの潜在的なトラップがあります。オブジェクト間の呼び出しが null 実装でインライン化され、変数の活性が失われる可能性があります。この場合、同じ GC ハザードが発生する可能性があります。ポップアップします。

于 2012-02-26T11:19:42.023 に答える