From: Masahiro S. ()
<sa...@to...> - 2006-06-14 15:33:02
|
酒井です。 From: "Kouhei Sutou" <ko...@co...> Date: Wed, 14 Jun 2006 17:12:08 +0900 > 須藤です. > > 06/06/14 に 酒井政裕 Masahiro Sakai<sa...@to...> さんは書きました: > > > > それは,一番最後の > > > > > > http://www.rubyist.net/~nobu/t/20060614.html#p01 > > > > > > で言われている「境界面でラップする」という解決法を具体的にど > > > のように実現すればよいかがわかりません.だれか教えてもらえま > > > せんか? > > > > コールバックで発生した例外等を、glib側にリターンする前にどこかに保存しておいて、 > > glib側からruby側にリターンしたときに、それを再び投げるということでしょう。 > > やっぱりそういうことですか.でも,その「再び投げる」がいつに > なるのかということがわからないです.って,↓の中にも書いてあ > りますね. > > > 以前にも似たような話が出たことはあります。 > > http://ruby-gnome2.sourceforge.jp/ja/sfmltoj.cgi?key=/mailarchive/forum.php%3Fthread_id%3D1905665%26forum_id%3D9432 glib側からruby側に戻ってくる個所のうち、内部で例外が発生した可能性ある 個所の全てに、「例外が発生していないかチェックして例外を再発生させるコー ド」をいれることになるんじゃないでしょうか。 それから、glib側でさらに処理が続き再びRubyのコードが呼ばれるような場合、 例えばgtkのメインループ等では、処理の中断をする必要があるでしょう。 ですが、そのようなAPIが常に存在するとは限らないはずです。 結局、例外や大域ジャンプを再送出するのは現実的ではないと思いますよ。 > ただ,「再び投げる」というのが実現できたとしても,Ruby側に > リターン出来る場合はすぐにリターンした方が自然な気がします > (現在の動作と同じ).そうしたい場合はRuby側にリターンでき > るかどうかがわからないといけないと思いますが,そういうこと > ってできるのでしょうか. 大域脱出して安全かどうかはglib側がどんな処理を行っているかによりますが、 一般にglibのコードはlongjmpで脱出することなんか考えずに設計されているので、 ドキュメントに特別な記述のない限り、まず危険と考えるべきでしょう。 現在問題が起らないとしてもそれはたまたまだと思います。 -- 酒井 政裕 / Masahiro Sakai |