山本です。
現在 tcltklib.c をリファクタリングしていますが、tcl_protect と tcl_check_result を
統合しようとして問題につきあたりました。
1. ip_ruby_cmd_body に下のような部分があるのですが、これを残したまま統合するのは
難しそうです。rb_rescue2 は例外をブロックしませんし、例外を通してしまうと
tcl 環境をまたいでスタック破壊してしまうことがわかった以上、もはやこのコードは
安全ではなく、残していてもしかたないと思います。消してもいいでしょうか?
(できれば tcl_check_result の #if 0 (SystemExit) も消したいです)
#if 0
ret = rb_rescue2(ip_ruby_cmd_core, (VALUE)arg,
ip_ruby_cmd_rescue, arg->failed,
rb_eStandardError, rb_eScriptError, rb_eSystemExit,
(VALUE)0);
#else
2. tcl_protect に下のような部分があるのですが、rb_jump_tag で例外を発生してしまうと、
上述の理由でスタック破壊につながります。ここはどう対処すべきでしょうか。
case TAG_RETRY:
case TAG_REDO:
if (NIL_P(ruby_errinfo)) {
rb_jump_tag(status); /* danger */
以上の二点です。よろしくお願いします。