1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* compile.c (iseq_compile_each): fix stack consistency error

(break is compiled to throw instead of jump insn).
  these problems are reported by Yusuke ENDOH <mame AT tsg.ne.jp>
* bootstraptest/test_knownbug.rb, test_syntax.rb: move fixed test.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14699 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2007-12-25 12:37:16 +00:00
parent 904b278f94
commit 633df8de16
4 changed files with 64 additions and 28 deletions

View file

@ -1,3 +1,11 @@
Tue Dec 25 21:32:54 2007 Koichi Sasada <ko1@atdot.net>
* compile.c (iseq_compile_each): fix stack consistency error
(break is compiled to throw instead of jump insn).
these problems are reported by Yusuke ENDOH <mame AT tsg.ne.jp>
* bootstraptest/test_knownbug.rb, test_syntax.rb: move fixed test.
Tue Dec 25 21:32:44 2007 Tanaka Akira <akr@fsij.org> Tue Dec 25 21:32:44 2007 Tanaka Akira <akr@fsij.org>
* parse.y (struct parser_params): make parser_ruby_sourcefile common * parse.y (struct parser_params): make parser_ruby_sourcefile common

View file

@ -2,27 +2,3 @@
# This test file concludes tests which point out known bugs. # This test file concludes tests which point out known bugs.
# So all tests will cause failure. # So all tests will cause failure.
# #
assert_normal_exit %q{
begin
raise
rescue
counter = 2
while true
counter -= 1
break if counter == 0
next
retry
end
end
}, 'reported by Yusuke ENDOH'
assert_normal_exit %q{
counter = 2
while true
counter -= 1
break if counter == 0
next
"#{ break }"
end
}, 'reported by Yusuke ENDOH'

View file

@ -689,7 +689,7 @@ assert_equal 'ok', %q{
"#{next}" "#{next}"
end end
:ok :ok
} }, 'reported by Yusuke ENDOH'
assert_equal 'ok', %q{ assert_equal 'ok', %q{
counter = 2 counter = 2
@ -700,7 +700,7 @@ assert_equal 'ok', %q{
redo redo
end end
:ok :ok
} }, 'reported by Yusuke ENDOH'
assert_equal 'ok', %q{ assert_equal 'ok', %q{
counter = 2 counter = 2
@ -711,4 +711,38 @@ assert_equal 'ok', %q{
"#{ redo }" "#{ redo }"
end end
:ok :ok
} }, 'reported by Yusuke ENDOH'
assert_normal_exit %q{
begin
raise
rescue
counter = 2
while true
counter -= 1
break if counter == 0
next
retry
end
end
}, 'reported by Yusuke ENDOH'
assert_normal_exit %q{
counter = 2
while true
counter -= 1
break if counter == 0
next
"#{ break }"
end
}, 'reported by Yusuke ENDOH'
assert_normal_exit %q{
counter = 2
while true
counter -= 1
next if counter != 0
"#{ break }"
end
}, 'reported by Yusuke ENDOH'

View file

@ -2924,12 +2924,26 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
if (iseq->compile_data->redo_label != 0) { if (iseq->compile_data->redo_label != 0) {
/* while/until */ /* while/until */
#if 0
add_ensure_iseq(ret, iseq); add_ensure_iseq(ret, iseq);
COMPILE_(ret, "break val (while/until)", node->nd_stts, COMPILE_(ret, "break val (while/until)", node->nd_stts,
iseq->compile_data->loopval_popped); iseq->compile_data->loopval_popped);
ADD_INSNL(ret, nd_line(node), jump, ADD_INSNL(ret, nd_line(node), jump,
iseq->compile_data->end_label); iseq->compile_data->end_label);
ADD_INSN(ret, nd_line(node), pop);
if (poped) {
ADD_INSN(ret, nd_line(node), pop);
}
#else
level = 0x8000 | 0x4000;
COMPILE(ret, "break val (while/until)", node->nd_stts);
ADD_INSN1(ret, nd_line(node), throw,
INT2FIX(level | 0x02) /* TAG_BREAK */ );
if (poped) {
ADD_INSN(ret, nd_line(node), pop);
}
#endif
} }
else if (iseq->type == ISEQ_TYPE_BLOCK) { else if (iseq->type == ISEQ_TYPE_BLOCK) {
break_by_insn: break_by_insn:
@ -3089,6 +3103,10 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN(ret, nd_line(node), putnil); ADD_INSN(ret, nd_line(node), putnil);
ADD_INSN1(ret, nd_line(node), throw, ADD_INSN1(ret, nd_line(node), throw,
INT2FIX(0x04) /* TAG_RETRY */ ); INT2FIX(0x04) /* TAG_RETRY */ );
if (poped) {
ADD_INSN(ret, nd_line(node), pop);
}
} }
else { else {
COMPILE_ERROR((ERROR_ARGS "Invalid retry")); COMPILE_ERROR((ERROR_ARGS "Invalid retry"));