summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--bootstraptest/test_jump.rb11
-rw-r--r--compile.c6
3 files changed, 19 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 735a359d0..a63e1f4ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu May 22 23:45:17 2008 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * compile.c (get_destination_insn, get_next_insn, get_prev_insn):
+ peephole optimization should not ignore ISEQ_ELEMENT_ADJUST.
+
Thu May 22 20:20:54 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* marshal.c (check_dump_arg, check_load_arg): check if reentered.
diff --git a/bootstraptest/test_jump.rb b/bootstraptest/test_jump.rb
index bc1a613b5..77467337c 100644
--- a/bootstraptest/test_jump.rb
+++ b/bootstraptest/test_jump.rb
@@ -248,3 +248,14 @@ assert_equal "1", %q{
end
end
}, "[ruby-dev:31698]"
+
+assert_normal_exit %q{
+ f = 0
+ 1.times do
+ begin
+ f += 1
+ ensure
+ redo unless f > 2
+ end
+ end
+}
diff --git a/compile.c b/compile.c
index 5e2400a2c..ec8b26f33 100644
--- a/compile.c
+++ b/compile.c
@@ -1362,7 +1362,7 @@ get_destination_insn(INSN *iobj)
list = lobj->link.next;
while (list) {
- if (list->type == ISEQ_ELEMENT_INSN) {
+ if (list->type == ISEQ_ELEMENT_INSN || list->type == ISEQ_ELEMENT_ADJUST) {
break;
}
list = list->next;
@@ -1376,7 +1376,7 @@ get_next_insn(INSN *iobj)
LINK_ELEMENT *list = iobj->link.next;
while (list) {
- if (list->type == ISEQ_ELEMENT_INSN) {
+ if (list->type == ISEQ_ELEMENT_INSN || list->type == ISEQ_ELEMENT_ADJUST) {
return list;
}
list = list->next;
@@ -1390,7 +1390,7 @@ get_prev_insn(INSN *iobj)
LINK_ELEMENT *list = iobj->link.prev;
while (list) {
- if (list->type == ISEQ_ELEMENT_INSN) {
+ if (list->type == ISEQ_ELEMENT_INSN || list->type == ISEQ_ELEMENT_ADJUST) {
return list;
}
list = list->prev;