From: matz@... (Yukihiro Matsumoto) Date: 1999-01-06T13:38:06+09:00 Subject: [ruby-dev:4064] Re: I want to catch all jump まつもと ゆきひろです In message "[ruby-dev:3969] Re: I want to catch all jump" on 98/12/25, Shugo Maeda writes: |前田です。 お正月の間に前田さんの希望をかなえました. |ふと思ったのですが、プログラムにRubyをリンクしてrb_load()や |rb_eval_string()を呼ぶ場合、rb_rescueなどでくるむのは結構 |面倒なので、 | |int rb_load_safely(char *filename, VALUE priv); |/* 成功した場合0、失敗したらTAG_RETURNなどを返す */ |VALUE rb_eval_safely(char *str, int *status); |/* statusにrb_load_safelyの戻り値と同じ値が与えられる */ | |のような例外を補足してくれる関数を用意するのはどうでしょう。 用意しました.APIは void rb_load_protect(char *file, int wrap, int *state); VALUE rb_eval_protect(char *str, int *state); VALUE rb_protect(VALUE (*func)(), int *state); です.stateは成功したら0,それ以外ではTAG_RETURNなどが返りま す.この値がヘッダファイルに書いてないのは問題ですが,そのう ちに改善します. 大域脱出の再生成の関数も用意しました. void rb_tag_jump(int tag); tagには上記関数群でstateとして受け取った値を使います. まつもと ゆきひろ /:|)