なかだです。

At Fri, 10 Oct 2003 23:47:45 +0900,
Yukihiro Matsumoto wrote:
> |> 最終的にはrb_funcall_with_block()のようなAPIを用意するんじゃ
> |> ないかと思います。
> |
> |それはメソッド呼び出し専用ですよね。C用のAPIとしては直接使える
> |block_pass()的なものも需要がありそうな気がします。
> 
> それはrb_iterate()なのでは? あ、blockとしてProcが使いたいと
> いうこと?

てことです。

  関数 -> block 	rb_iterate()
  関数 -> Proc		rb_proc_new()
  block -> Proc		rb_block_proc()
  Proc -> block		rb_block_pass()? rb_proc_block()?

> |それはそれとして、[ruby-dev:21568,21569]では不十分でした。
> |prot_tagだけではなくてネストするインタープリタの状態をすべて復
> |帰しないと、巻き戻されたスタック上のポインタをたどってしまうの
> |で、スレッドの中からスレッドを作るときにまずいことになります。
> 
> 今まで指摘された問題が無いということであれば、コミットしても
> いいといえばいいんですが、規模が大きいだけにちょっと不安があ
> ります。

スタックを巻き戻すのはrb_thread_yield()を使ったときだけに限定し
てるので、rb_protect()を特別扱いしなくてもいいような気がして来
ましたが、巻き戻す位置をスレッドごとに覚えておかなけりゃいけな
そうです。

こういう構造体をrb_thread_tから参照するようにしたいんだけど、名
前が思い付かない…。

    struct hoge {
        struct hoge *prev;
        struct FRAME *frame;
        struct SCOPE *scope;
        struct BLOCK *block;
        struct iter *iter;
        struct tag *tag;
        NODE *cref;
    };

暫定版。
http://nokada.jin.gr.jp/ruby/rewinding-thread.diff

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦