From 846ea1727fd34b4eb7c5a9b9d2643d04567c8f86 Mon Sep 17 00:00:00 2001 From: mame Date: Thu, 22 May 2008 14:45:54 +0000 Subject: * compile.c (get_destination_insn, get_next_insn, get_prev_insn): peephole optimization should not ignore ISEQ_ELEMENT_ADJUST. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16535 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ bootstraptest/test_jump.rb | 11 +++++++++++ compile.c | 6 +++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 735a359d07..a63e1f4ba6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu May 22 23:45:17 2008 Yusuke Endoh + + * 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 * marshal.c (check_dump_arg, check_load_arg): check if reentered. diff --git a/bootstraptest/test_jump.rb b/bootstraptest/test_jump.rb index bc1a613b56..77467337c2 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 5e2400a2c2..ec8b26f33b 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; -- cgit v1.2.3