Open qryxip opened 1 year ago
issue作成ありがとうございます!
正直C-unwind
に切り替えると何ができるようになるのかが分からないなと思いました!
例えばPythonでC APIを使った時に、try~catch
できるとかなら便利そうですが、実際そうなのかどうかちょっとよくわからないんですよね。Pythonのctypesの実装による・・・?
なのでまあメリットはぶっちゃけわからんなと思いました! ただデメリットは(ほぼ)ないと思うので、そういう意味では導入をしても別にいいのかなという気持ちです。
プルリクいただけたらマージすると思います!
よく考えたら当たり前だったのですが、RustのパニックはそのままC++の例外とかとしては解釈されません。
なのでvoicevox_on_panic(void (*hook)(const *VoicevoxRustPanicInfo))
みたいなAPIを生やし、RustのパニックをC++の例外とかに変換するフックを用意する形になると思います。
(参考: std::panic::set_hook
)
この形式がちゃんと動作するかですが、試した人が既におり、ちゃんと動くと言ってよいように思えました。
なるほどです! この関数を利用するほど固いコードを書く人がいるのか少し疑問ですが、100行くらいの追加で実装できるならまあありかなと感じました。 テストがめちゃくちゃ大変そうですね…!
このissueはcloseして新たにissueを作る感じでしょうか?
内容
C APIの
extern "C"
を、Rust 1.71で使えるようになったextern "C-unwind"
に置き換えます。C-unwind ABI - Announcing Rust 1.71.0 - Rust Blog
これにより、C APIも #505 のようにできることが期待できます。
Pros 良くなる点
(追記) Rustのパニックを出したときの挙動は保証されていて、コールバックからC++の例外とかが発射されたときがUBだったらしい (例えextern "C"
からパニックを送出しようとする行為がそもそもUBらしく、プロセスの強制終了も実は保証されている動作ではなかったらしい?panic=abort
であっても)Cons 悪くなる点
218 の効果が若干薄くなる
実現方法
VOICEVOXのバージョン
N/A
OSの種類/ディストリ/バージョン
その他