まつもと ゆきひろです

In message "[ruby-dev:3969] Re: I want to catch all jump"
    on 98/12/25, Shugo Maeda <shugo / aianet.ne.jp> 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として受け取った値を使います.

                                まつもと ゆきひろ /:|)