Skip to content

Commit

Permalink
* compile.c (iseq_compile_each): fix stack consistency error
Browse files Browse the repository at this point in the history
  (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
  • Loading branch information
ko1 committed Dec 25, 2007
1 parent 904b278 commit 633df8d
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 28 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
@@ -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
Expand Down
24 changes: 0 additions & 24 deletions bootstraptest/test_knownbug.rb
Expand Up @@ -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'
40 changes: 37 additions & 3 deletions bootstraptest/test_syntax.rb
Expand Up @@ -689,7 +689,7 @@ def foo
"#{next}"
end
:ok
}
}, 'reported by Yusuke ENDOH'

assert_equal 'ok', %q{
counter = 2
Expand All @@ -700,7 +700,7 @@ def foo
redo
end
:ok
}
}, 'reported by Yusuke ENDOH'

assert_equal 'ok', %q{
counter = 2
Expand All @@ -711,4 +711,38 @@ def foo
"#{ 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 changes: 19 additions & 1 deletion compile.c
Expand Up @@ -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:
Expand Down Expand Up @@ -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"));
Expand Down

0 comments on commit 633df8d

Please sign in to comment.