山本です。

>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