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:
parent
904b278f94
commit
633df8de16
4 changed files with 64 additions and 28 deletions
|
@ -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>
|
||||
|
||||
* parse.y (struct parser_params): make parser_ruby_sourcefile common
|
||||
|
|
|
@ -2,27 +2,3 @@
|
|||
# This test file concludes tests which point out known bugs.
|
||||
# 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'
|
||||
|
|
|
@ -689,7 +689,7 @@ assert_equal 'ok', %q{
|
|||
"#{next}"
|
||||
end
|
||||
:ok
|
||||
}
|
||||
}, 'reported by Yusuke ENDOH'
|
||||
|
||||
assert_equal 'ok', %q{
|
||||
counter = 2
|
||||
|
@ -700,7 +700,7 @@ assert_equal 'ok', %q{
|
|||
redo
|
||||
end
|
||||
:ok
|
||||
}
|
||||
}, 'reported by Yusuke ENDOH'
|
||||
|
||||
assert_equal 'ok', %q{
|
||||
counter = 2
|
||||
|
@ -711,4 +711,38 @@ assert_equal 'ok', %q{
|
|||
"#{ redo }"
|
||||
end
|
||||
: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'
|
||||
|
||||
|
|
20
compile.c
20
compile.c
|
@ -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) {
|
||||
/* while/until */
|
||||
#if 0
|
||||
add_ensure_iseq(ret, iseq);
|
||||
COMPILE_(ret, "break val (while/until)", node->nd_stts,
|
||||
iseq->compile_data->loopval_popped);
|
||||
ADD_INSNL(ret, nd_line(node), jump,
|
||||
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) {
|
||||
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_INSN1(ret, nd_line(node), throw,
|
||||
INT2FIX(0x04) /* TAG_RETRY */ );
|
||||
|
||||
if (poped) {
|
||||
ADD_INSN(ret, nd_line(node), pop);
|
||||
}
|
||||
}
|
||||
else {
|
||||
COMPILE_ERROR((ERROR_ARGS "Invalid retry"));
|
||||
|
|
Loading…
Reference in a new issue