diff options
-rw-r--r-- | compiler/optimizing/builder.cc | 2 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.cc | 2 | ||||
-rw-r--r-- | test/800-smali/expected.txt | 1 | ||||
-rw-r--r-- | test/800-smali/smali/EmptySparseSwitch.smali | 17 | ||||
-rw-r--r-- | test/800-smali/src/Main.java | 2 |
5 files changed, 21 insertions, 3 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 2cac93dd8c..ec7fd62975 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -1024,8 +1024,6 @@ void HGraphBuilder::BuildSparseSwitch(const Instruction& instruction, uint32_t d HInstruction* value = LoadLocal(instruction.VRegA(), Primitive::kPrimInt); uint16_t num_entries = table.GetNumEntries(); - // There should be at least one entry here. - DCHECK_GT(num_entries, 0U); for (size_t i = 0; i < num_entries; i++) { BuildSwitchCaseHelper(instruction, i, i == static_cast<size_t>(num_entries) - 1, table, value, diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 3b98e47010..47e9bf537b 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -1086,7 +1086,7 @@ bool MethodVerifier::CheckSwitchTargets(uint32_t cur_offset) { const uint16_t* insns = code_item_->insns_ + cur_offset; /* make sure the start of the switch is in range */ int32_t switch_offset = insns[1] | ((int32_t) insns[2]) << 16; - if ((int32_t) cur_offset + switch_offset < 0 || cur_offset + switch_offset + 2 >= insn_count) { + if ((int32_t) cur_offset + switch_offset < 0 || cur_offset + switch_offset + 2 > insn_count) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "invalid switch start: at " << cur_offset << ", switch offset " << switch_offset << ", count " << insn_count; diff --git a/test/800-smali/expected.txt b/test/800-smali/expected.txt index 019dc14d24..5922257d01 100644 --- a/test/800-smali/expected.txt +++ b/test/800-smali/expected.txt @@ -14,4 +14,5 @@ b/18800943 (1) b/18800943 (2) MoveExc MoveExceptionOnEntry +EmptySparseSwitch Done! diff --git a/test/800-smali/smali/EmptySparseSwitch.smali b/test/800-smali/smali/EmptySparseSwitch.smali new file mode 100644 index 0000000000..29592c1208 --- /dev/null +++ b/test/800-smali/smali/EmptySparseSwitch.smali @@ -0,0 +1,17 @@ +.class public LEmptySparseSwitch; + +.super Ljava/lang/Object; + +.method public static run()V + .registers 2 + + const v0, 0 + + sparse-switch v0, :SparseSwitch + + return-void + + :SparseSwitch + .sparse-switch + .end sparse-switch +.end method diff --git a/test/800-smali/src/Main.java b/test/800-smali/src/Main.java index b23896d198..3e0b1f99ed 100644 --- a/test/800-smali/src/Main.java +++ b/test/800-smali/src/Main.java @@ -77,6 +77,8 @@ public class Main { null)); testCases.add(new TestCase("MoveExceptionOnEntry", "MoveExceptionOnEntry", "moveExceptionOnEntry", new Object[]{0}, new VerifyError(), null)); + testCases.add(new TestCase("EmptySparseSwitch", "EmptySparseSwitch", "run", null, null, + null)); } public void runTests() { |