From: nobu.nakada@... Date: 2003-09-30T19:06:23+09:00 Subject: [ruby-dev:21445] Re: break from block yielded in until なかだです。 At Tue, 30 Sep 2003 17:58:59 +0900, Yukihiro Matsumoto wrote: > |これに関連すると思うのですが,拡張ライブラリで rb_catch してから > |rb_yield していると,つまり,以下のようなコードを C で書いてある > |と,break がブロックを抜けずに rb_catch で止まってしまいます。 > | > |Ruby で書いてあると大丈夫で,C で書いてあると止まるようです。 > |rb_iterate の場合だとどうなるのかは試していません。 > > 実際に問題を起こすCコードを見せてもらえませんか。こっちで試 > 行錯誤してC化して、再現しなかったら無駄な手間ですから。 rb_catch()からrb_iterate(), catch_i(), rb_f_catch(), rb_yield_0(), rb_yield()と呼び出されますが、ruby_scopeがずっと 共通になっているためrb_iterate()のPROT_ITERで止まってしまうよう です。 うーん、rb_iterate()でPUSH_SCOPE()してしまっていいんだろうか。 rb_catch()でしたほうがいいような気がしなくもない。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.541 diff -u -2 -p -r1.541 eval.c --- eval.c 30 Sep 2003 00:21:13 -0000 1.541 +++ eval.c 30 Sep 2003 10:01:47 -0000 @@ -4441,4 +4441,5 @@ rb_iterate(it_proc, data1, bl_proc, data PUSH_BLOCK(0, node); + PUSH_SCOPE(); PUSH_TAG(PROT_ITER); state = EXEC_TAG(); @@ -4456,4 +4457,5 @@ rb_iterate(it_proc, data1, bl_proc, data } POP_TAG(); + POP_SCOPE(); POP_BLOCK(); POP_ITER(); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦