[#21338] $SAFE=4 での autoload — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

21 messages 2003/09/04
[#21346] Re: $SAFE=4 での autoload — nobu.nakada@... 2003/09/04

なかだです。

[#21359] Re: $SAFE=4 での autoload — Hidetoshi NAGAI <nagai@...> 2003/09/05

永井@知能.九工大です.

[#21419] Makefile.inのlex.c — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

15 messages 2003/09/28

[ruby-dev:21445] Re: break from block yielded in until

From: nobu.nakada@...
Date: 2003-09-30 10:06:23 UTC
List: ruby-dev #21445
なかだです。

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はできる。
    中田 伸悦

In This Thread