summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Marko <vmarko@google.com>2015-06-18 17:40:00 +0100
committerVladimir Marko <vmarko@google.com>2015-06-18 19:25:42 +0100
commit07c6f5a3eb17e08f3f2d850e130896f63c80911f (patch)
treeb154de00da25ccc0284100bb54dc393754a8d925
parente71eb1d7cdc59127b6fcf101230376ce7c892a89 (diff)
downloadart-07c6f5a3eb17e08f3f2d850e130896f63c80911f.tar.gz
art-07c6f5a3eb17e08f3f2d850e130896f63c80911f.tar.bz2
art-07c6f5a3eb17e08f3f2d850e130896f63c80911f.zip
Quick: Don't expect move-exception in every catch block.
The dalvik bytecode doesn't require a move-exception in a catch handler that ignores the exception. Bug: 21873167 (cherry picked from commit 2d1a0a408fd148f7b2a2d670e6942ec3d920f875) Change-Id: Ia00e5791fabdd1b88e9a63b741600ed63d918703
-rw-r--r--compiler/dex/mir_graph.cc11
-rw-r--r--test/800-smali/expected.txt1
-rw-r--r--test/800-smali/smali/b_21873167.smali18
-rw-r--r--test/800-smali/src/Main.java1
4 files changed, 26 insertions, 5 deletions
diff --git a/compiler/dex/mir_graph.cc b/compiler/dex/mir_graph.cc
index 9fa5148ce..920be0b4e 100644
--- a/compiler/dex/mir_graph.cc
+++ b/compiler/dex/mir_graph.cc
@@ -398,12 +398,13 @@ bool MIRGraph::IsBadMonitorExitCatch(NarrowDexOffset monitor_exit_offset,
DCHECK(monitor_exit->Opcode() == Instruction::MONITOR_EXIT);
int monitor_reg = monitor_exit->VRegA_11x();
const Instruction* check_insn = Instruction::At(current_code_item_->insns_ + catch_offset);
- DCHECK(check_insn->Opcode() == Instruction::MOVE_EXCEPTION);
- if (check_insn->VRegA_11x() == monitor_reg) {
- // Unexpected move-exception to the same register. Probably not the pattern we're looking for.
- return false;
+ if (check_insn->Opcode() == Instruction::MOVE_EXCEPTION) {
+ if (check_insn->VRegA_11x() == monitor_reg) {
+ // Unexpected move-exception to the same register. Probably not the pattern we're looking for.
+ return false;
+ }
+ check_insn = check_insn->Next();
}
- check_insn = check_insn->Next();
while (true) {
int dest = -1;
bool wide = false;
diff --git a/test/800-smali/expected.txt b/test/800-smali/expected.txt
index a6b216bf3..c5728b560 100644
--- a/test/800-smali/expected.txt
+++ b/test/800-smali/expected.txt
@@ -16,4 +16,5 @@ MoveExc
MoveExceptionOnEntry
EmptySparseSwitch
b/20224106
+b/21873167
Done!
diff --git a/test/800-smali/smali/b_21873167.smali b/test/800-smali/smali/b_21873167.smali
new file mode 100644
index 000000000..c0c09cbbf
--- /dev/null
+++ b/test/800-smali/smali/b_21873167.smali
@@ -0,0 +1,18 @@
+.class public LB21873167;
+.super Ljava/lang/Object;
+
+.method public constructor <init>()V
+ .registers 1
+ invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+ return-void
+.end method
+
+.method public test()V
+ .registers 1
+ :start
+ monitor-enter p0
+ monitor-exit p0
+ :end
+ return-void
+ .catchall {:start .. :end} :end
+.end method
diff --git a/test/800-smali/src/Main.java b/test/800-smali/src/Main.java
index 3e8836408..7196de145 100644
--- a/test/800-smali/src/Main.java
+++ b/test/800-smali/src/Main.java
@@ -81,6 +81,7 @@ public class Main {
null));
testCases.add(new TestCase("b/20224106", "B20224106", "run", null, new VerifyError(),
0));
+ testCases.add(new TestCase("b/21873167", "B21873167", "test", null, null, null));
}
public void runTests() {