* 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.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14643 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2007-12-25 02:24:12 +00:00
Родитель bfc19ade2e
Коммит 1af43d329f
3 изменённых файлов: 31 добавлений и 1 удалений

Просмотреть файл

@ -1,3 +1,10 @@
Tue Dec 25 11:20:38 2007 Koichi Sasada <ko1@atdot.net>
* 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@atdot.net>
* iseq.c, vm_core.h: comment out unused fields.

Просмотреть файл

@ -690,3 +690,25 @@ assert_equal 'ok', %q{
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
}

Просмотреть файл

@ -3027,7 +3027,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
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 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
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 */ );