From: matz@... (Yukihiro Matsumoto) Date: 1999-10-13T18:31:29+09:00 Subject: [ruby-dev:8012] Re: [BUG] iterator & raise まつもと ゆきひろです In message "[ruby-dev:8009] [BUG] iterator & raise" on 99/10/13, Minero Aoki writes: |以下のスクリプトが落ちます。 |Ruby は ruby version 1.4.2 1999-09-18 [i686-linux] です。 どうもです。その周辺には他のバグもいました。 パッチです。CVSにもチェックインしておきます。 --- eval.c 1999/10/12 04:53:32 1.10 +++ eval.c 1999/10/13 09:30:25 @@ -5550,4 +5550,5 @@ data->orig_thread = rb_thread_current(); data->iter = data->prev?Qtrue:Qfalse; + data->tag = 0; /* should not point into stack */ frame_dup(&data->frame); if (data->iter) { @@ -5590,4 +5591,5 @@ { struct BLOCK * volatile old_block; + struct BLOCK _block; struct BLOCK *data; volatile VALUE result = Qnil; @@ -5601,5 +5603,6 @@ /* PUSH BLOCK from data */ old_block = ruby_block; - ruby_block = data; + _block = *data; + ruby_block = &_block; PUSH_ITER(ITER_CUR); ruby_frame->iter = ITER_CUR; @@ -5626,4 +5629,5 @@ PUSH_TAG(PROT_NONE); + _block.tag = prot_tag; state = EXEC_TAG(); if (state == 0) { @@ -5691,4 +5695,5 @@ VALUE block = rb_eval(self, node->nd_body); struct BLOCK * volatile old_block; + struct BLOCK _block; struct BLOCK *data; volatile VALUE result = Qnil; @@ -5713,9 +5718,11 @@ /* PUSH BLOCK from data */ old_block = ruby_block; - ruby_block = data; + _block = *data; + ruby_block = &_block; PUSH_ITER(ITER_PRE); ruby_frame->iter = ITER_PRE; PUSH_TAG(PROT_NONE); + _block.tag = prot_tag; state = EXEC_TAG(); if (state == 0) { @@ -5725,5 +5732,5 @@ POP_TAG(); POP_ITER(); - if (ruby_block->tag->dst == state) { + if (_block.tag->dst == state) { state &= TAG_MASK; orphan = 2;