summaryrefslogtreecommitdiff
path: root/runtime/dex_file.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/dex_file.cc')
-rw-r--r--runtime/dex_file.cc28
1 files changed, 11 insertions, 17 deletions
diff --git a/runtime/dex_file.cc b/runtime/dex_file.cc
index 7b0c46bcfe..af79207834 100644
--- a/runtime/dex_file.cc
+++ b/runtime/dex_file.cc
@@ -486,20 +486,18 @@ const Signature DexFile::CreateSignature(const StringPiece& signature) const {
return Signature(this, *proto_id);
}
-int32_t DexFile::FindTryItem(const CodeItem &code_item, uint32_t address) {
- // Note: Signed type is important for max and min.
- int32_t min = 0;
- int32_t max = code_item.tries_size_ - 1;
+int32_t DexFile::FindTryItem(const TryItem* try_items, uint32_t tries_size, uint32_t address) {
+ uint32_t min = 0;
+ uint32_t max = tries_size;
+ while (min < max) {
+ const uint32_t mid = (min + max) / 2;
- while (min <= max) {
- int32_t mid = min + ((max - min) / 2);
-
- const art::DexFile::TryItem* ti = GetTryItems(code_item, mid);
- uint32_t start = ti->start_addr_;
- uint32_t end = start + ti->insn_count_;
+ const art::DexFile::TryItem& ti = try_items[mid];
+ const uint32_t start = ti.start_addr_;
+ const uint32_t end = start + ti.insn_count_;
if (address < start) {
- max = mid - 1;
+ max = mid;
} else if (address >= end) {
min = mid + 1;
} else { // We have a winner!
@@ -511,12 +509,8 @@ int32_t DexFile::FindTryItem(const CodeItem &code_item, uint32_t address) {
}
int32_t DexFile::FindCatchHandlerOffset(const CodeItem &code_item, uint32_t address) {
- int32_t try_item = FindTryItem(code_item, address);
- if (try_item == -1) {
- return -1;
- } else {
- return DexFile::GetTryItems(code_item, try_item)->handler_off_;
- }
+ int32_t try_item = FindTryItem(GetTryItems(code_item, 0), code_item.tries_size_, address);
+ return (try_item == -1) ? -1 : DexFile::GetTryItems(code_item, try_item)->handler_off_;
}
bool DexFile::LineNumForPcCb(void* raw_context, const PositionInfo& entry) {