From: "H.Yamamoto" Date: 2005-01-28T01:05:23+09:00 Subject: [ruby-dev:25569] Re: some problems on ext/tk/sample/**/*.rb 山本です。 >Tcl_Eval を使わない方法だと,逆に SEGV の可能性が >高くなってしまいました.(^_^; >仕方ないのでその代りに別のチェックを追加してみました. >これでもダメなら本当にお手上げ (少なくとも現時点では) ですので, >問題となっている終了処理を bcc32 の場合だけ一切行わないように >修正することにします.(;_;) 落ちなくなったようです。お疲れ様でした・・・ 下のパッチをつくったところ、bcc32 では Tcl_Eval の後 namespace が(おそらく不正な値に)変化し、その後の Tcl コマンドで落ちることがはっきりしました。 tcl8.3以前で Tcl_Eval(ip, "foreach id [after info] { after cancel $id }") が落ちていたというのも、実は同じ理由なんでしょうか? 問題は「なぜ bcc32 では namespace が変化するのか」ですが・・・ Index: tcltklib.c =================================================================== RCS file: /src/ruby/ext/tk/tcltklib.c,v retrieving revision 1.1 diff -u -w -b -p -r1.1 tcltklib.c --- tcltklib.c 25 Jan 2005 14:31:44 -0000 1.1 +++ tcltklib.c 27 Jan 2005 15:12:05 -0000 @@ -222,6 +222,22 @@ struct tcltkip { int return_value; /* return value */ }; +static int +tcl_eval(ip, string) + Tcl_Interp *ip; + const char *string; +{ + int i; + + printf("%d ", Tcl_GetCurrentNamespace(ip)); + i = Tcl_Eval(ip, string); + printf("-------> %d : %s\n", Tcl_GetCurrentNamespace(ip), string); + return i; +} + +#undef Tcl_Eval +#define Tcl_Eval(ip, string) tcl_eval(ip, string) + static struct tcltkip * get_ip(self) VALUE self; /////////////////////////////////////////////////////////////// E:\ruby-cvs\bcc32>ruby19 \tktestmultiwin.rb 49571192 -------> 49571192 : info slaves 49571192 -------> 49571192 : proc __ruby_tcltklib_cancel_after_scripts__ {} {for each id [after info] {after cancel $id}} 49571192 -------> 20352 : __ruby_tcltklib_cancel_after_scripts__ E:/ruby-cvs/bcc32/.ext/tk.rb:1180: [BUG] Segmentation fault ruby 1.9.0 (2005-01-27) [i386-bccwin32] Abnormal program termination E:\ruby-cvs\bcc32>ruby19 ..\ruby\ext\tk\sample\menubar1.rb 49571192 -------> 49571192 : info slaves 49571192 -------> 49571192 : proc __ruby_tcltklib_cancel_after_scripts__ {} {for each id [after info] {after cancel $id}} 49571192 -------> 37808004 : __ruby_tcltklib_cancel_after_scripts__ E:/ruby-cvs/bcc32/.ext/tk.rb:1180: [BUG] Segmentation fault ruby 1.9.0 (2005-01-27) [i386-bccwin32] Abnormal program termination /////////////////////////////////////////////////////////////// E:\ruby-cvs\win32>ruby19 \tktestmultiwin.rb 46368920 -------> 46368920 : info slaves 46368920 -------> 46368920 : proc __ruby_tcltklib_cancel_after_scripts__ {} {for each id [after info] {after cancel $id}} 46368920 -------> 46368920 : __ruby_tcltklib_cancel_after_scripts__ 46368920 -------> 46368920 : INTERP_FINALIZE_HOOK E:\ruby-cvs\win32>ruby19 ..\ruby\ext\tk\sample\menubar1.rb 46330368 -------> 46330368 : info slaves 46330368 -------> 46330368 : proc __ruby_tcltklib_cancel_after_scripts__ {} {for each id [after info] {after cancel $id}} 46330368 -------> 46330368 : __ruby_tcltklib_cancel_after_scripts__ 46330368 -------> 46330368 : INTERP_FINALIZE_HOOK