Duktape JavaScript インタープリターの Rust ラッパーに取り組んでいます。通常の使用例では、コール スタックは次のようになります。
- Rust: 任意のアプリケーション コード。
- Rust: 私のライブラリ ラッパー。
- C: Duktape の通訳者です。
- Rust: 私の Rust コード。
- Rust: アプリケーション コードへの任意のコールバック。
(5) が を呼び出すとどうなりますpanic!
か? IRC のさまざまな Rust 開発者によると、panic!
(3) のような非 Rust コールフレーム内からの試行は、未定義の動作を引き起こす可能性があります。
しかし、Rust のドキュメントによると、a をキャッチする唯一の方法は、追加のスレッドを生成するpanic!
を使用することです。std::task::try
他rustrt::unwind::try
の制限の中でも特に、1 つのスレッド内で 2 回入れ子にすることはできません。
Benjamin Herr によって提案された 1 つの解決策は、(5) のコードがパニックになった場合にプロセスを中止することです。私は彼のソリューションを としてパッケージ化しましたがabort_on_panic
、「プログラム全体をクラッシュさせますが、少なくとも物事を微妙に破壊することはありません」を含む「仕事」の値に対して、うまくいくようです:
abort_on_panic!("cannot panic inside this block", {
panic!("something went wrong!");
});
std::task::try
しかし、スレッド/タスク作成のオーバーヘッドなしでエミュレートする方法はありますか?