From: Yusuke ENDOH Date: 2007-12-25T04:46:06+09:00 Subject: [ruby-dev:32720] Re: next dumps core when poped is 0 遠藤です。 next だけでなく redo にも問題がありました (まぬけな見落としすみません) 。 以下で落ちます。 counter = 2 while true counter -= 1 break if counter == 0 next "#{ redo }" end また、redo に関しては以下だけでも落ちます。 counter = 2 while true counter -= 1 break if counter == 0 next redo end 多分以下で直ると思うのですが、redo の throw の直前に putnil が 足りないのが今まで発症しなかったのはちょっと不思議です。 ここはこれで正しくて、他の問題とかだったらすみません。 Index: compile.c =================================================================== --- compile.c (revision 14631) +++ compile.c (working copy) @@ -3026,7 +3026,7 @@ if (iseq->compile_data->redo_label) { debugs("redo in while"); #if 1 - pop_after_throw = 1; + pop_after_throw = poped; goto redo_by_throw; #else add_ensure_iseq(ret, iseq); @@ -3069,6 +3069,7 @@ ip = ip->parent_iseq; } if (ip != 0) { + ADD_INSN(ret, nd_line(node), putnil); ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x05) /* TAG_REDO */ ); -- Yusuke ENDOH