From: Hidetoshi NAGAI Date: 2005-02-01T18:45:49+09:00 Subject: [ruby-dev:25611] Re: some problems on ext/tk/sample/**/*.rb 永井@知能.九工大です. 調査をありがとうございます. From: H.Yamamoto Subject: [ruby-dev:25609] Re: some problems on ext/tk/sample/**/*.rb Date: Tue, 1 Feb 2005 17:06:30 +0900 Message-ID: <20050201170617.8CF43D68.ocean@m2.ccsnet.ne.jp> > あれから調べていたのですが、なぜ namespace が壊れるのか > ようやくわかりました。結論から言うと、Tcl のメニューを > 押したとき ruby 側のコールバックが呼ばれますが、そこで > Kernel.exit を呼ぶと、現在の実装では Tcl の環境をまたいで > longjmp が行われてしまいます。そのため、フレームとして > 登録されていたスタックな CallFrame が Pop されず残って > しまい、フレームの破壊につながったと考えられます。 (snip) > ruby_eval 中に ruby_stop してもいいのかわかりませんが、とりあえず下のように > すると落ちなくなりました。本当は Tcl_SetResult などを使って、Tcl の環境を > 安全に通過した後、Tcl_GetResult を見て lib_eventloop_launcher で exit(2) > すべきなのかもしれません。(試してないので不可能かもしれませんが) う〜〜〜〜む.難しいところですねぇ... この修正を適用してしまうと,次のようなケースが動かなくなってしまいます. ---------------------------------------------- require 'tk' b = TkButton.new(:command=>proc{exit}) begin b.invoke rescue SystemExit puts "Ignore Exit" end puts "normal exit" ---------------------------------------------- これが通らないのは受け入れがたいと思われますので, 「臭いものに蓋」の状態であることは十分に承知してはいますが, 今は revert しないでおきます. 調査していただいたおかげで問題の原因はわかったわけですから, 適切な解決方法がないかをもう少し考えてみます. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp