ruby-changes:3151
From: ko1@a...
Date: 25 Dec 2007 11:24:56 +0900
Subject: [ruby-changes:3151] ko1 - Ruby:r14643 (trunk): * compile.c (iseq_compile_each): fix stack consistency error.
ko1 2007-12-25 11:24:12 +0900 (Tue, 25 Dec 2007) New Revision: 14643 Modified files: trunk/ChangeLog trunk/bootstraptest/test_syntax.rb trunk/compile.c Log: * compile.c (iseq_compile_each): fix stack consistency error. a patch from Yusuke ENDOH <mame AT tsg.ne.jp> [ruby-dev:32720] * bootstraptest/test_syntax.rb: add 2 tests for above. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/compile.c?r1=14643&r2=14642 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14643&r2=14642 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_syntax.rb?r1=14643&r2=14642 Index: ChangeLog =================================================================== --- ChangeLog (revision 14642) +++ ChangeLog (revision 14643) @@ -1,3 +1,10 @@ +Tue Dec 25 11:20:38 2007 Koichi Sasada <ko1@a...> + + * compile.c (iseq_compile_each): fix stack consistency error. + a patch from Yusuke ENDOH <mame AT tsg.ne.jp> [ruby-dev:32720] + + * bootstraptest/test_syntax.rb: add 2 tests for above. + Tue Dec 25 11:14:20 2007 Koichi Sasada <ko1@a...> * iseq.c, vm_core.h: comment out unused fields. Index: bootstraptest/test_syntax.rb =================================================================== --- bootstraptest/test_syntax.rb (revision 14642) +++ bootstraptest/test_syntax.rb (revision 14643) @@ -690,3 +690,25 @@ end :ok } + +assert_equal 'ok', %q{ + counter = 2 + while true + counter -= 1 + break if counter == 0 + next + redo + end + :ok +} + +assert_equal 'ok', %q{ + counter = 2 + while true + counter -= 1 + break if counter == 0 + next + "#{ redo }" + end + :ok +} Index: compile.c =================================================================== --- compile.c (revision 14642) +++ compile.c (revision 14643) @@ -3027,7 +3027,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); @@ -3070,6 +3070,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 */ ); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml