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>
|
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
|
||||||
|
|
|
@ -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'
|
|
||||||
|
|
|
@ -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'
|
||||||
|
|
||||||
|
|
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) {
|
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"));
|
||||||
|
|
Loading…
Reference in a new issue