12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
161fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
17578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_file.h"
187e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
197e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom#include <fcntl.h>
201f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom#include <limits.h>
21b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <stdio.h>
22d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers#include <stdlib.h>
237e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom#include <string.h>
24b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/file.h>
257e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom#include <sys/stat.h>
26c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers
27700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory>
28c7dd295a4e0cc1d15c0c96088e55a85389bade74Ian Rogers#include <sstream>
297e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
30c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier#include "art_field-inl.h"
31e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "art_method-inl.h"
325096e66d07db8041589518f8c5b0281d859d0817Vladimir Marko#include "base/file_magic.h"
332a5c4681ba19411c1cb22e9a7ab446dab910af1cAndreas Gampe#include "base/hash_map.h"
3407ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h"
35637ee0b9c10ab7732a7ee7b8335f3fff4ac1549cVladimir Marko#include "base/stl_util.h"
36e222ee0b794f941af4fb1b32fb8224e32942ea7bElliott Hughes#include "base/stringprintf.h"
3732ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier#include "base/systrace.h"
3813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao#include "class_linker-inl.h"
394f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h"
4010037c866b04550fc5461058c398c2e3e509381ajeffhao#include "dex_file_verifier.h"
41578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h"
42d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko#include "handle_scope-inl.h"
430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers#include "leb128.h"
4413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao#include "mirror/field.h"
4513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao#include "mirror/method.h"
462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/string.h"
47db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom#include "os.h"
4813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao#include "reflection.h"
49a0e180632411f7fe0edf454e571c42209ee7b540Elliott Hughes#include "safe_map.h"
50b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include "thread.h"
51d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko#include "type_lookup_table.h"
52a67249065e4c9b3cf4a7c081d95a78df28291ee9Ian Rogers#include "utf-inl.h"
537e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom#include "utils.h"
54eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "well_known_classes.h"
55b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include "zip_archive.h"
561fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
57277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#pragma GCC diagnostic push
58277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#pragma GCC diagnostic ignored "-Wshadow"
59277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#include "ScopedFd.h"
60277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#pragma GCC diagnostic pop
61277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe
621fb8620309a4e94d11879aabc33364acfa733904Carl Shapironamespace art {
631fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
6413735955f39b3b304c37d2b2840663c131262c18Ian Rogersconst uint8_t DexFile::kDexMagic[] = { 'd', 'e', 'x', '\n' };
65c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Lightconst uint8_t DexFile::kDexMagicVersions[DexFile::kNumDexVersions][DexFile::kDexVersionLen] = {
66c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  {'0', '3', '5', '\0'},
67c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  // Dex version 036 skipped because of an old dalvik bug on some versions of android where dex
68c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  // files with that version number would erroneously be accepted and run.
69c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  {'0', '3', '7', '\0'}
70c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light};
717e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
728d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogersbool DexFile::GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg) {
732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  CHECK(checksum != nullptr);
747c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  uint32_t magic;
75833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
76833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Strip ":...", which is the location
77833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const char* zip_entry_name = kClassesDex;
78833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  const char* file_part = filename;
79aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  std::string file_part_storage;
80833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
81aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  if (DexFile::IsMultiDexLocation(filename)) {
82aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    file_part_storage = GetBaseLocation(filename);
83aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    file_part = file_part_storage.c_str();
84aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    zip_entry_name = filename + file_part_storage.size() + 1;
85aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    DCHECK_EQ(zip_entry_name[-1], kMultiDexSeparator);
86833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  }
87833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
88833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  ScopedFd fd(OpenAndReadMagic(file_part, &magic, error_msg));
89fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko  if (fd.get() == -1) {
908d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    DCHECK(!error_msg->empty());
917c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom    return false;
927c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  }
937c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  if (IsZipMagic(magic)) {
942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    std::unique_ptr<ZipArchive> zip_archive(
952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier        ZipArchive::OpenFromFd(fd.release(), filename, error_msg));
962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    if (zip_archive.get() == nullptr) {
970b3ed3db963b80603c4e3d8e5df1f72b9327b24dAndreas Gampe      *error_msg = StringPrintf("Failed to open zip archive '%s' (error msg: %s)", file_part,
980b3ed3db963b80603c4e3d8e5df1f72b9327b24dAndreas Gampe                                error_msg->c_str());
995b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom      return false;
1005b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom    }
101833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    std::unique_ptr<ZipEntry> zip_entry(zip_archive->Find(zip_entry_name, error_msg));
1022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    if (zip_entry.get() == nullptr) {
103833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      *error_msg = StringPrintf("Zip archive '%s' doesn't contain %s (error msg: %s)", file_part,
104833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                zip_entry_name, error_msg->c_str());
1055b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom      return false;
1065b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom    }
1077c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom    *checksum = zip_entry->GetCrc32();
1085b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom    return true;
1095b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  }
1107c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  if (IsDexMagic(magic)) {
1112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    std::unique_ptr<const DexFile> dex_file(
1122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier        DexFile::OpenFile(fd.release(), filename, false, error_msg));
1132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    if (dex_file.get() == nullptr) {
1145b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom      return false;
11578128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom    }
1167c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom    *checksum = dex_file->GetHeader().checksum_;
1175b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom    return true;
11878128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom  }
1198d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  *error_msg = StringPrintf("Expected valid zip or dex file: '%s'", filename);
1205b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  return false;
12178128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom}
12278128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom
123833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampebool DexFile::Open(const char* filename, const char* location, std::string* error_msg,
124fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                   std::vector<std::unique_ptr<const DexFile>>* dex_files) {
12532ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier  ScopedTrace trace(std::string("Open dex file ") + location);
1262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(dex_files != nullptr) << "DexFile::Open: out-param is nullptr";
1277c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  uint32_t magic;
128fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko  ScopedFd fd(OpenAndReadMagic(filename, &magic, error_msg));
129fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko  if (fd.get() == -1) {
1308d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    DCHECK(!error_msg->empty());
131833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    return false;
1327c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  }
1337c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  if (IsZipMagic(magic)) {
134833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    return DexFile::OpenZip(fd.release(), location, error_msg, dex_files);
13569b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom  }
1367c3d13aebdd8611cae58a1048bffb13cbdc465cbBrian Carlstrom  if (IsDexMagic(magic)) {
137833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    std::unique_ptr<const DexFile> dex_file(DexFile::OpenFile(fd.release(), location, true,
138833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                              error_msg));
139833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    if (dex_file.get() != nullptr) {
140fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler      dex_files->push_back(std::move(dex_file));
141833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      return true;
142833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    } else {
143833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      return false;
144833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    }
1450dd7ddaa36a2cf37490dc166ebc21818364130a7Brian Carlstrom  }
1468d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  *error_msg = StringPrintf("Expected valid zip or dex file: '%s'", filename);
147bacce5c9324497c77f8196069e692077a2e57591Alexander Ivchenko  return false;
14869b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom}
14969b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom
1500cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampestatic bool ContainsClassesDex(int fd, const char* filename) {
1510cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  std::string error_msg;
1520cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  std::unique_ptr<ZipArchive> zip_archive(ZipArchive::OpenFromFd(fd, filename, &error_msg));
1530cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  if (zip_archive.get() == nullptr) {
1540cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe    return false;
1550cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  }
1560cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  std::unique_ptr<ZipEntry> zip_entry(zip_archive->Find(DexFile::kClassesDex, &error_msg));
1570cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  return (zip_entry.get() != nullptr);
1580cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe}
1590cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe
1600cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampebool DexFile::MaybeDex(const char* filename) {
1610cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  uint32_t magic;
1620cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  std::string error_msg;
1630cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  ScopedFd fd(OpenAndReadMagic(filename, &magic, &error_msg));
1640cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  if (fd.get() == -1) {
1650cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe    return false;
1660cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  }
1670cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  if (IsZipMagic(magic)) {
1680cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe    return ContainsClassesDex(fd.release(), filename);
1690cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  } else if (IsDexMagic(magic)) {
1700cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe    return true;
1710cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  }
1720cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  return false;
1730cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe}
1740cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe
1752dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersint DexFile::GetPermissions() const {
1762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (mem_map_.get() == nullptr) {
1772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    return 0;
1782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  } else {
1792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers    return mem_map_->GetProtect();
1802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  }
1812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
1822dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
1832d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzbool DexFile::IsReadOnly() const {
1842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  return GetPermissions() == PROT_READ;
1852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz}
1862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
187e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrombool DexFile::EnableWrite() const {
1882d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  CHECK(IsReadOnly());
1892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (mem_map_.get() == nullptr) {
1902d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz    return false;
1912d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  } else {
192e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom    return mem_map_->Protect(PROT_READ | PROT_WRITE);
1932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  }
1942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz}
1952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
196e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrombool DexFile::DisableWrite() const {
1972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  CHECK(!IsReadOnly());
1982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (mem_map_.get() == nullptr) {
1992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz    return false;
2002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  } else {
201e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom    return mem_map_->Protect(PROT_READ);
2022d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  }
2032d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz}
2042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
2053a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampestd::unique_ptr<const DexFile> DexFile::Open(const uint8_t* base, size_t size,
2063a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             const std::string& location,
2073a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             uint32_t location_checksum,
2083a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             const OatDexFile* oat_dex_file,
2093a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             bool verify,
2103a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             std::string* error_msg) {
21132ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier  ScopedTrace trace(std::string("Open dex file from RAM ") + location);
2123a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe  std::unique_ptr<const DexFile> dex_file = OpenMemory(base,
2133a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                                       size,
2143a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                                       location,
2153a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                                       location_checksum,
2163a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                                       nullptr,
2173a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                                       oat_dex_file,
2183a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                                       error_msg);
2193a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe  if (verify && !DexFileVerifier::Verify(dex_file.get(),
2203a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                         dex_file->Begin(),
2213a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                         dex_file->Size(),
2223a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                         location.c_str(),
2233a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                         error_msg)) {
2243a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe    return nullptr;
2253a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe  }
2263a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe
2273a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe  return dex_file;
2283a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe}
2293a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe
230fbef44de596d298dc6430f482dffc933a046dd28Richard Uhlerstd::unique_ptr<const DexFile> DexFile::OpenFile(int fd, const char* location, bool verify,
231fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                 std::string* error_msg) {
23232ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier  ScopedTrace trace(std::string("Open dex file ") + location);
2338d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  CHECK(location != nullptr);
234700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<MemMap> map;
235fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko  {
236fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    ScopedFd delayed_close(fd);
237fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    struct stat sbuf;
238fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    memset(&sbuf, 0, sizeof(sbuf));
239fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    if (fstat(fd, &sbuf) == -1) {
2404fa0bcd2142793e1f105b24b658de3635652b957Brian Carlstrom      *error_msg = StringPrintf("DexFile: fstat '%s' failed: %s", location, strerror(errno));
241fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko      return nullptr;
242fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    }
243fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    if (S_ISDIR(sbuf.st_mode)) {
244fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko      *error_msg = StringPrintf("Attempt to mmap directory '%s'", location);
245fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko      return nullptr;
246fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    }
247fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    size_t length = sbuf.st_size;
24842bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier    map.reset(MemMap::MapFile(length,
24942bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              PROT_READ,
25042bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              MAP_PRIVATE,
25142bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              fd,
25242bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              0,
25342bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              /*low_4gb*/false,
25442bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              location,
25542bddcec51e71d206f6d3b30a881ee6c1d50a63cMathieu Chartier                              error_msg));
256fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    if (map.get() == nullptr) {
257fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko      DCHECK(!error_msg->empty());
258fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko      return nullptr;
259fd99576d0fe25e327ca6daf44e219268a1d4779fVladimir Marko    }
2607e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
2615b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
2625b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  if (map->Size() < sizeof(DexFile::Header)) {
2638d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    *error_msg = StringPrintf(
2644fa0bcd2142793e1f105b24b658de3635652b957Brian Carlstrom        "DexFile: failed to open dex file '%s' that is too short to have a header", location);
2658d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
2665b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  }
2675b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
2685b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  const Header* dex_header = reinterpret_cast<const Header*>(map->Begin());
2695b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
270928f72bd75c385ba2708c58521171a77264d4486Andreas Gampe  std::unique_ptr<const DexFile> dex_file(OpenMemory(location, dex_header->checksum_, map.release(),
271928f72bd75c385ba2708c58521171a77264d4486Andreas Gampe                                                     error_msg));
272928f72bd75c385ba2708c58521171a77264d4486Andreas Gampe  if (dex_file.get() == nullptr) {
2738d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    *error_msg = StringPrintf("Failed to open dex file '%s' from memory: %s", location,
2748d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                              error_msg->c_str());
2758d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
276f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao  }
27754c1ceb8f67ee60b22771a76e947c504934ab937jeffhao
278928f72bd75c385ba2708c58521171a77264d4486Andreas Gampe  if (verify && !DexFileVerifier::Verify(dex_file.get(), dex_file->Begin(), dex_file->Size(),
279928f72bd75c385ba2708c58521171a77264d4486Andreas Gampe                                         location, error_msg)) {
2808d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
28154c1ceb8f67ee60b22771a76e947c504934ab937jeffhao  }
28254c1ceb8f67ee60b22771a76e947c504934ab937jeffhao
283fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  return dex_file;
2847e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
2857e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
286b7bbba49d88eae58223d9878da4069bf6d7140bfBrian Carlstromconst char* DexFile::kClassesDex = "classes.dex";
287b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
288833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampebool DexFile::OpenZip(int fd, const std::string& location, std::string* error_msg,
289fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                      std::vector<std::unique_ptr<const DexFile>>* dex_files) {
29032ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier  ScopedTrace trace("Dex file open Zip " + std::string(location));
2912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(dex_files != nullptr) << "DexFile::OpenZip: out-param is nullptr";
292700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<ZipArchive> zip_archive(ZipArchive::OpenFromFd(fd, location.c_str(), error_msg));
2938d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  if (zip_archive.get() == nullptr) {
2948d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    DCHECK(!error_msg->empty());
295833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    return false;
296b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
297833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  return DexFile::OpenFromZip(*zip_archive, location, error_msg, dex_files);
298a6cc893c4b142cd410fc956963b6f5a014e983adBrian Carlstrom}
299a6cc893c4b142cd410fc956963b6f5a014e983adBrian Carlstrom
300fbef44de596d298dc6430f482dffc933a046dd28Richard Uhlerstd::unique_ptr<const DexFile> DexFile::OpenMemory(const std::string& location,
301fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   uint32_t location_checksum,
302fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   MemMap* mem_map,
303fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   std::string* error_msg) {
3042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  return OpenMemory(mem_map->Begin(),
3052dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                    mem_map->Size(),
3062dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                    location,
3072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                    location_checksum,
3088d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                    mem_map,
309fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe                    nullptr,
3108d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                    error_msg);
3112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
3122dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
313fbef44de596d298dc6430f482dffc933a046dd28Richard Uhlerstd::unique_ptr<const DexFile> DexFile::Open(const ZipArchive& zip_archive, const char* entry_name,
314fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                             const std::string& location, std::string* error_msg,
315fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                             ZipOpenErrorCode* error_code) {
31632ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier  ScopedTrace trace("Dex file open from Zip Archive " + std::string(location));
317a004aa933a58428489e42d77f707c2b063b73747Brian Carlstrom  CHECK(!location.empty());
318833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  std::unique_ptr<ZipEntry> zip_entry(zip_archive.Find(entry_name, error_msg));
3192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (zip_entry.get() == nullptr) {
320833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    *error_code = ZipOpenErrorCode::kEntryNotFound;
3218d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
322b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
323833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  std::unique_ptr<MemMap> map(zip_entry->ExtractToMemMap(location.c_str(), entry_name, error_msg));
3242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (map.get() == nullptr) {
325833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    *error_msg = StringPrintf("Failed to extract '%s' from '%s': %s", entry_name, location.c_str(),
3268d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                              error_msg->c_str());
327833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    *error_code = ZipOpenErrorCode::kExtractToMemoryError;
3288d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
32989521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom  }
330700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<const DexFile> dex_file(OpenMemory(location, zip_entry->GetCrc32(), map.release(),
3318d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                                               error_msg));
3328d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  if (dex_file.get() == nullptr) {
3338d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    *error_msg = StringPrintf("Failed to open dex file '%s' from memory: %s", location.c_str(),
3348d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers                              error_msg->c_str());
335833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    *error_code = ZipOpenErrorCode::kDexFileError;
3368d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
337f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao  }
338e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  if (!dex_file->DisableWrite()) {
3398d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    *error_msg = StringPrintf("Failed to make dex file '%s' read only", location.c_str());
340833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    *error_code = ZipOpenErrorCode::kMakeReadOnlyError;
3418d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    return nullptr;
342e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  }
343e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  CHECK(dex_file->IsReadOnly()) << location;
344d6cec905b62dff38285b350e67d5e223346e6d66Brian Carlstrom  if (!DexFileVerifier::Verify(dex_file.get(), dex_file->Begin(), dex_file->Size(),
345d6cec905b62dff38285b350e67d5e223346e6d66Brian Carlstrom                               location.c_str(), error_msg)) {
346833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    *error_code = ZipOpenErrorCode::kVerifyError;
347d6cec905b62dff38285b350e67d5e223346e6d66Brian Carlstrom    return nullptr;
348d6cec905b62dff38285b350e67d5e223346e6d66Brian Carlstrom  }
349833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  *error_code = ZipOpenErrorCode::kNoError;
350fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  return dex_file;
351b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom}
352b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
35390e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe// Technically we do not have a limitation with respect to the number of dex files that can be in a
35490e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe// multidex APK. However, it's bad practice, as each dex file requires its own tables for symbols
35590e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe// (types, classes, methods, ...) and dex caches. So warn the user that we open a zip with what
35690e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe// seems an excessive number.
35790e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampestatic constexpr size_t kWarnOnManyDexFilesThreshold = 100;
35890e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe
359833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampebool DexFile::OpenFromZip(const ZipArchive& zip_archive, const std::string& location,
360fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                          std::string* error_msg,
361fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                          std::vector<std::unique_ptr<const DexFile>>* dex_files) {
36232ce2adefb8a3d0eda59a29f5e87c1eb43eef796Mathieu Chartier  ScopedTrace trace("Dex file open from Zip " + std::string(location));
3632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(dex_files != nullptr) << "DexFile::OpenFromZip: out-param is nullptr";
364833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  ZipOpenErrorCode error_code;
365833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  std::unique_ptr<const DexFile> dex_file(Open(zip_archive, kClassesDex, location, error_msg,
366833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                               &error_code));
367833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  if (dex_file.get() == nullptr) {
368833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    return false;
369833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  } else {
370833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    // Had at least classes.dex.
371fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler    dex_files->push_back(std::move(dex_file));
372833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
373833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    // Now try some more.
374833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
375833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    // We could try to avoid std::string allocations by working on a char array directly. As we
376833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    // do not expect a lot of iterations, this seems too involved and brittle.
377833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
37890e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe    for (size_t i = 1; ; ++i) {
37990e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe      std::string name = GetMultiDexClassesDexName(i);
38090e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe      std::string fake_location = GetMultiDexLocation(i, location.c_str());
381833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      std::unique_ptr<const DexFile> next_dex_file(Open(zip_archive, name.c_str(), fake_location,
382833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe                                                        error_msg, &error_code));
383833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      if (next_dex_file.get() == nullptr) {
384833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe        if (error_code != ZipOpenErrorCode::kEntryNotFound) {
385833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe          LOG(WARNING) << error_msg;
386833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe        }
387833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe        break;
388833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      } else {
389fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler        dex_files->push_back(std::move(next_dex_file));
390833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe      }
391833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
39290e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe      if (i == kWarnOnManyDexFilesThreshold) {
39390e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe        LOG(WARNING) << location << " has in excess of " << kWarnOnManyDexFilesThreshold
39490e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe                     << " dex files. Please consider coalescing and shrinking the number to "
39590e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe                        " avoid runtime overhead.";
39690e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe      }
39790e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe
39890e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe      if (i == std::numeric_limits<size_t>::max()) {
39990e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe        LOG(ERROR) << "Overflow in number of dex files!";
40090e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe        break;
40190e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe      }
402833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    }
403833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
404833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    return true;
405833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  }
406833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe}
407833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
408833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
409fbef44de596d298dc6430f482dffc933a046dd28Richard Uhlerstd::unique_ptr<const DexFile> DexFile::OpenMemory(const uint8_t* base,
410fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   size_t size,
411fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   const std::string& location,
412fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   uint32_t location_checksum,
413fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe                                                   MemMap* mem_map,
41407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler                                                   const OatDexFile* oat_dex_file,
415fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe                                                   std::string* error_msg) {
4167934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom  CHECK_ALIGNED(base, 4);  // various dex file structures must be word aligned
417fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe  std::unique_ptr<DexFile> dex_file(
41807b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler      new DexFile(base, size, location, location_checksum, mem_map, oat_dex_file));
4198d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  if (!dex_file->Init(error_msg)) {
420fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler    dex_file.reset();
4217e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
422fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  return std::unique_ptr<const DexFile>(dex_file.release());
4237e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
4247e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
42513735955f39b3b304c37d2b2840663c131262c18Ian RogersDexFile::DexFile(const uint8_t* base, size_t size,
4260d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom                 const std::string& location,
4270d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom                 uint32_t location_checksum,
428fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe                 MemMap* mem_map,
42907b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler                 const OatDexFile* oat_dex_file)
4300d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom    : begin_(base),
4310d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      size_(size),
4320d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      location_(location),
4330d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      location_checksum_(location_checksum),
4340d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      mem_map_(mem_map),
4350d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      header_(reinterpret_cast<const Header*>(base)),
4360d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      string_ids_(reinterpret_cast<const StringId*>(base + header_->string_ids_off_)),
4370d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      type_ids_(reinterpret_cast<const TypeId*>(base + header_->type_ids_off_)),
4380d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      field_ids_(reinterpret_cast<const FieldId*>(base + header_->field_ids_off_)),
4390d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      method_ids_(reinterpret_cast<const MethodId*>(base + header_->method_ids_off_)),
4400d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom      proto_ids_(reinterpret_cast<const ProtoId*>(base + header_->proto_ids_off_)),
44168b56858367e29461ae290fd797443a1ef6d8005Ian Rogers      class_defs_(reinterpret_cast<const ClassDef*>(base + header_->class_defs_off_)),
44207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler      oat_dex_file_(oat_dex_file) {
4432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  CHECK(begin_ != nullptr) << GetLocation();
4440d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  CHECK_GT(size_, 0U) << GetLocation();
445d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  const uint8_t* lookup_data = (oat_dex_file != nullptr)
446d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      ? oat_dex_file->GetLookupTableData()
447d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      : nullptr;
448d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  if (lookup_data != nullptr) {
449d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    if (lookup_data + TypeLookupTable::RawDataLength(*this) > oat_dex_file->GetOatFile()->End()) {
450d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      LOG(WARNING) << "found truncated lookup table in " << GetLocation();
451d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    } else {
452d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      lookup_table_.reset(TypeLookupTable::Open(lookup_data, *this));
453d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    }
454d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  }
4550d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom}
4560d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom
4576bf1915f20a11748d8d4b78ad020172bb2e6c946Jesse WilsonDexFile::~DexFile() {
4588cef0b8130b75af20fa42912a2b82dacb3dfe5d1Elliott Hughes  // We don't call DeleteGlobalRef on dex_object_ because we're only called by DestroyJavaVM, and
4598cef0b8130b75af20fa42912a2b82dacb3dfe5d1Elliott Hughes  // that's only called after DetachCurrentThread, which means there's no JNIEnv. We could
4608cef0b8130b75af20fa42912a2b82dacb3dfe5d1Elliott Hughes  // re-attach, but cleaning up these global references is not obviously useful. It's not as if
4618cef0b8130b75af20fa42912a2b82dacb3dfe5d1Elliott Hughes  // the global reference table is otherwise empty!
4626bf1915f20a11748d8d4b78ad020172bb2e6c946Jesse Wilson}
4636bf1915f20a11748d8d4b78ad020172bb2e6c946Jesse Wilson
4648d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogersbool DexFile::Init(std::string* error_msg) {
4658d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  if (!CheckMagicAndVersion(error_msg)) {
4667e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    return false;
4677e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
4687e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  return true;
4697e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
4707e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
4718d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogersbool DexFile::CheckMagicAndVersion(std::string* error_msg) const {
4726e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom  if (!IsMagicValid(header_->magic_)) {
4738d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    std::ostringstream oss;
4748d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    oss << "Unrecognized magic number in "  << GetLocation() << ":"
4756e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[0]
4766e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[1]
4776e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[2]
4786e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[3];
4798d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    *error_msg = oss.str();
4807e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    return false;
4817e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
4826e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom  if (!IsVersionValid(header_->magic_)) {
4838d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    std::ostringstream oss;
4848d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    oss << "Unrecognized version number in "  << GetLocation() << ":"
4856e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[4]
4866e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[5]
4876e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[6]
4886e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom            << " " << header_->magic_[7];
4898d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers    *error_msg = oss.str();
4907e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    return false;
4917e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
4927e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  return true;
4937e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
4947e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
49513735955f39b3b304c37d2b2840663c131262c18Ian Rogersbool DexFile::IsMagicValid(const uint8_t* magic) {
4966e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom  return (memcmp(magic, kDexMagic, sizeof(kDexMagic)) == 0);
4976e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom}
4986e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom
49913735955f39b3b304c37d2b2840663c131262c18Ian Rogersbool DexFile::IsVersionValid(const uint8_t* magic) {
50013735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* version = &magic[sizeof(kDexMagic)];
501c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  for (uint32_t i = 0; i < kNumDexVersions; i++) {
502c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light    if (memcmp(version, kDexMagicVersions[i], kDexVersionLen) == 0) {
503c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light      return true;
504c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light    }
505c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  }
506c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  return false;
5076e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom}
5086e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom
50976ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampeuint32_t DexFile::Header::GetVersion() const {
51076ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe  const char* version = reinterpret_cast<const char*>(&magic_[sizeof(kDexMagic)]);
511d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers  return atoi(version);
512d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers}
513d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
514e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartierconst DexFile::ClassDef* DexFile::FindClassDef(const char* descriptor, size_t hash) const {
515e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier  DCHECK_EQ(ComputeModifiedUtf8Hash(descriptor), hash);
516d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  if (LIKELY(lookup_table_ != nullptr)) {
517d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    const uint32_t class_def_idx = lookup_table_->Lookup(descriptor, hash);
518d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    return (class_def_idx != DexFile::kDexNoIndex) ? &GetClassDef(class_def_idx) : nullptr;
51968b56858367e29461ae290fd797443a1ef6d8005Ian Rogers  }
520d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko
52168b56858367e29461ae290fd797443a1ef6d8005Ian Rogers  // Fast path for rate no class defs case.
522d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  const uint32_t num_class_defs = NumClassDefs();
5238b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  if (num_class_defs == 0) {
52468b56858367e29461ae290fd797443a1ef6d8005Ian Rogers    return nullptr;
5257e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
526d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  const TypeId* type_id = FindTypeId(descriptor);
527d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  if (type_id != nullptr) {
528d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    uint16_t type_idx = GetIndexForTypeId(*type_id);
529d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    for (size_t i = 0; i < num_class_defs; ++i) {
530ecaebd37bc9af576ddfe1be0bd4f3889e88d6f23Ian Rogers      const ClassDef& class_def = GetClassDef(i);
531d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      if (class_def.class_idx_ == type_idx) {
532d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko        return &class_def;
533d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      }
5348b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    }
5358b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  }
53668b56858367e29461ae290fd797443a1ef6d8005Ian Rogers  return nullptr;
537e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom}
538e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
5398b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersconst DexFile::ClassDef* DexFile::FindClassDef(uint16_t type_idx) const {
5408b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  size_t num_class_defs = NumClassDefs();
5418b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  for (size_t i = 0; i < num_class_defs; ++i) {
5428b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    const ClassDef& class_def = GetClassDef(i);
5438b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    if (class_def.class_idx_ == type_idx) {
5448b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers      return &class_def;
5458b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    }
5467e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
5472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
5487e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom}
5497e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
5509b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogersconst DexFile::FieldId* DexFile::FindFieldId(const DexFile::TypeId& declaring_klass,
5519b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers                                              const DexFile::StringId& name,
5529b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers                                              const DexFile::TypeId& type) const {
5539b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  // Binary search MethodIds knowing that they are sorted by class_idx, name_idx then proto_idx
5549b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  const uint16_t class_idx = GetIndexForTypeId(declaring_klass);
5559b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  const uint32_t name_idx = GetIndexForStringId(name);
5569b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  const uint16_t type_idx = GetIndexForTypeId(type);
557f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t lo = 0;
558f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t hi = NumFieldIds() - 1;
5599b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  while (hi >= lo) {
560f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers    int32_t mid = (hi + lo) / 2;
5619b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    const DexFile::FieldId& field = GetFieldId(mid);
5629b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    if (class_idx > field.class_idx_) {
5639b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers      lo = mid + 1;
5649b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    } else if (class_idx < field.class_idx_) {
5659b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers      hi = mid - 1;
5669b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    } else {
5679b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers      if (name_idx > field.name_idx_) {
5689b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        lo = mid + 1;
5699b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers      } else if (name_idx < field.name_idx_) {
5709b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        hi = mid - 1;
5719b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers      } else {
5729b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        if (type_idx > field.type_idx_) {
5739b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers          lo = mid + 1;
5749b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        } else if (type_idx < field.type_idx_) {
5759b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers          hi = mid - 1;
5769b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        } else {
5779b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers          return &field;
5789b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers        }
5799b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers      }
5809b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    }
5819b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  }
5822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
5839b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers}
5849b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers
5859b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogersconst DexFile::MethodId* DexFile::FindMethodId(const DexFile::TypeId& declaring_klass,
5860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers                                               const DexFile::StringId& name,
5870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers                                               const DexFile::ProtoId& signature) const {
5880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Binary search MethodIds knowing that they are sorted by class_idx, name_idx then proto_idx
5899b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  const uint16_t class_idx = GetIndexForTypeId(declaring_klass);
5900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const uint32_t name_idx = GetIndexForStringId(name);
5910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const uint16_t proto_idx = GetIndexForProtoId(signature);
592f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t lo = 0;
593f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t hi = NumMethodIds() - 1;
5940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  while (hi >= lo) {
595f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers    int32_t mid = (hi + lo) / 2;
5960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::MethodId& method = GetMethodId(mid);
5970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (class_idx > method.class_idx_) {
5980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      lo = mid + 1;
5990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (class_idx < method.class_idx_) {
6000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      hi = mid - 1;
6010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
6020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      if (name_idx > method.name_idx_) {
6030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        lo = mid + 1;
6040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      } else if (name_idx < method.name_idx_) {
6050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        hi = mid - 1;
6060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      } else {
6070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        if (proto_idx > method.proto_idx_) {
6080571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          lo = mid + 1;
6090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        } else if (proto_idx < method.proto_idx_) {
6100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          hi = mid - 1;
6110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        } else {
6120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          return &method;
6130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        }
6140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      }
6150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
6160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
6172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
6180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
6190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
620637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogersconst DexFile::StringId* DexFile::FindStringId(const char* string) const {
621f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t lo = 0;
622f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t hi = NumStringIds() - 1;
6230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  while (hi >= lo) {
624f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers    int32_t mid = (hi + lo) / 2;
6250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::StringId& str_id = GetStringId(mid);
626cf5077ac14f0922b6104a8a03fd66d97a490a3ddIan Rogers    const char* str = GetStringData(str_id);
627637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    int compare = CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues(string, str);
628637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    if (compare > 0) {
629637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers      lo = mid + 1;
630637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    } else if (compare < 0) {
631637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers      hi = mid - 1;
632637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    } else {
633637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers      return &str_id;
634637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    }
635637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  }
6362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
637637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers}
638637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers
639d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenkoconst DexFile::TypeId* DexFile::FindTypeId(const char* string) const {
640d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  int32_t lo = 0;
641d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  int32_t hi = NumTypeIds() - 1;
642d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  while (hi >= lo) {
643d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    int32_t mid = (hi + lo) / 2;
644d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    const TypeId& type_id = GetTypeId(mid);
645d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    const DexFile::StringId& str_id = GetStringId(type_id.descriptor_idx_);
646d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    const char* str = GetStringData(str_id);
647d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    int compare = CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues(string, str);
648d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    if (compare > 0) {
649d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      lo = mid + 1;
650d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    } else if (compare < 0) {
651d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      hi = mid - 1;
652d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    } else {
653d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko      return &type_id;
654d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    }
655d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  }
656d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  return nullptr;
657d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko}
658d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko
659a48aef4234768ed37828df613919391c21f561a7Vladimir Markoconst DexFile::StringId* DexFile::FindStringId(const uint16_t* string, size_t length) const {
660637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  int32_t lo = 0;
661637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  int32_t hi = NumStringIds() - 1;
662637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  while (hi >= lo) {
663637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    int32_t mid = (hi + lo) / 2;
664637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers    const DexFile::StringId& str_id = GetStringId(mid);
665cf5077ac14f0922b6104a8a03fd66d97a490a3ddIan Rogers    const char* str = GetStringData(str_id);
666a48aef4234768ed37828df613919391c21f561a7Vladimir Marko    int compare = CompareModifiedUtf8ToUtf16AsCodePointValues(str, string, length);
6670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (compare > 0) {
6680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      lo = mid + 1;
6690571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (compare < 0) {
6700571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      hi = mid - 1;
6710571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
6720571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return &str_id;
6730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
6740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
6752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
6760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
6770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
6780571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersconst DexFile::TypeId* DexFile::FindTypeId(uint32_t string_idx) const {
679f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t lo = 0;
680f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t hi = NumTypeIds() - 1;
6810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  while (hi >= lo) {
682f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers    int32_t mid = (hi + lo) / 2;
6830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const TypeId& type_id = GetTypeId(mid);
6840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (string_idx > type_id.descriptor_idx_) {
6850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      lo = mid + 1;
6860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (string_idx < type_id.descriptor_idx_) {
6870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      hi = mid - 1;
6880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
6890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return &type_id;
6900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
6910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
6922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
6930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
6940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
6950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersconst DexFile::ProtoId* DexFile::FindProtoId(uint16_t return_type_idx,
6965c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko                                             const uint16_t* signature_type_idxs,
6975c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko                                             uint32_t signature_length) const {
698f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t lo = 0;
699f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers  int32_t hi = NumProtoIds() - 1;
7000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  while (hi >= lo) {
701f8582c3b87efa0245d176f768fd373e5b4289da4Ian Rogers    int32_t mid = (hi + lo) / 2;
7020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const DexFile::ProtoId& proto = GetProtoId(mid);
7030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    int compare = return_type_idx - proto.return_type_idx_;
7040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (compare == 0) {
7050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      DexFileParameterIterator it(*this, proto);
7060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      size_t i = 0;
7075c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      while (it.HasNext() && i < signature_length && compare == 0) {
7086d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers        compare = signature_type_idxs[i] - it.GetTypeIdx();
7090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        it.Next();
7100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        i++;
7110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      }
7120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      if (compare == 0) {
7130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        if (it.HasNext()) {
7140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          compare = -1;
7155c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko        } else if (i < signature_length) {
7160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          compare = 1;
7170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        }
7180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      }
7190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (compare > 0) {
7210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      lo = mid + 1;
7220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (compare < 0) {
7230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      hi = mid - 1;
7240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
7250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return &proto;
7260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  return nullptr;
7290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
7300571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7319bdf108885a27ba05fae8501725649574d7c491bVladimir Markovoid DexFile::CreateTypeLookupTable(uint8_t* storage) const {
7329bdf108885a27ba05fae8501725649574d7c491bVladimir Marko  lookup_table_.reset(TypeLookupTable::Create(*this, storage));
733d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko}
734d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko
7350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers// Given a signature place the type ids into the given vector
736d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogersbool DexFile::CreateTypeList(const StringPiece& signature, uint16_t* return_type_idx,
737d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers                             std::vector<uint16_t>* param_type_idxs) const {
7380571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (signature[0] != '(') {
7390571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return false;
7400571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7410571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t offset = 1;
7420571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t end = signature.size();
7430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool process_return = false;
7440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  while (offset < end) {
745e9c36b34efb7460f59c6766e526c9b0de8da70b3Vladimir Marko    size_t start_offset = offset;
7460571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    char c = signature[offset];
7470571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    offset++;
7480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (c == ')') {
7490571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      process_return = true;
7500571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      continue;
7510571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    while (c == '[') {  // process array prefix
7530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      if (offset >= end) {  // expect some descriptor following [
7540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        return false;
7550571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      }
7560571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      c = signature[offset];
7570571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      offset++;
7580571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (c == 'L') {  // process type descriptors
7600571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      do {
7610571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        if (offset >= end) {  // unexpected early termination of descriptor
7620571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          return false;
7630571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        }
7640571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        c = signature[offset];
7650571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        offset++;
7660571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      } while (c != ';');
7670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
768e9c36b34efb7460f59c6766e526c9b0de8da70b3Vladimir Marko    // TODO: avoid creating a std::string just to get a 0-terminated char array
769e9c36b34efb7460f59c6766e526c9b0de8da70b3Vladimir Marko    std::string descriptor(signature.data() + start_offset, offset - start_offset);
7709507fa2c9545156747a5eb248bc1af3159bfd8c8Mathieu Chartier    const DexFile::TypeId* type_id = FindTypeId(descriptor.c_str());
7712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    if (type_id == nullptr) {
7720571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return false;
7730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t type_idx = GetIndexForTypeId(*type_id);
7750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (!process_return) {
7760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      param_type_idxs->push_back(type_idx);
7770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
7780571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      *return_type_idx = type_idx;
7790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return offset == end;  // return true if the signature had reached a sensible end
7800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  return false;  // failed to correctly parse return type
7830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
7840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
785d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogersconst Signature DexFile::CreateSignature(const StringPiece& signature) const {
786d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  uint16_t return_type_idx;
787d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  std::vector<uint16_t> param_type_indices;
788d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  bool success = CreateTypeList(signature, &return_type_idx, &param_type_indices);
789d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  if (!success) {
790d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    return Signature::NoSignature();
791419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  }
792d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const ProtoId* proto_id = FindProtoId(return_type_idx, param_type_indices);
7932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (proto_id == nullptr) {
794d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    return Signature::NoSignature();
79520cfffabdc9e02b2df798bc4e6b6035d14bf4e36Brian Carlstrom  }
796d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  return Signature(this, *proto_id);
797419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro}
798419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
799e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierint32_t DexFile::GetLineNumFromPC(ArtMethod* method, uint32_t rel_pc) const {
800ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao  // For native method, lineno should be -2 to indicate it is native. Note that
801ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao  // "line number == -2" is how libcore tells from StackTraceElement.
8020cfe1fb7060576d047f7f894fc0d8b87de84fcabIan Rogers  if (method->GetCodeItemOffset() == 0) {
803ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao    return -2;
804ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao  }
805ff0f9bea6355fe0c420815f9b894e6bb634fe764Shih-wei Liao
806c8dc101f8e89feb588de3326bd9be0b84228ca2aTDYa  const CodeItem* code_item = GetCodeItem(method->GetCodeItemOffset());
8072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(code_item != nullptr) << PrettyMethod(method) << " " << GetLocation();
808195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
809195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // A method with no line number info should return -1
810195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  LineNumFromPcContext context(rel_pc, -1);
811b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  DecodeDebugPositionInfo(code_item, LineNumForPcCb, &context);
812195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  return context.line_num_;
813195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao}
814195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
815dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogersint32_t DexFile::FindTryItem(const CodeItem &code_item, uint32_t address) {
8160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Note: Signed type is important for max and min.
8170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  int32_t min = 0;
818dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  int32_t max = code_item.tries_size_ - 1;
819dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers
820dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  while (min <= max) {
821dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    int32_t mid = min + ((max - min) / 2);
822dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers
823dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    const art::DexFile::TryItem* ti = GetTryItems(code_item, mid);
824dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    uint32_t start = ti->start_addr_;
825dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    uint32_t end = start + ti->insn_count_;
8260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
8270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (address < start) {
8280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      max = mid - 1;
829dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    } else if (address >= end) {
830dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers      min = mid + 1;
831dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    } else {  // We have a winner!
832dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers      return mid;
8330571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
8340571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
8350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // No match.
8360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  return -1;
8370571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
8380571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
839dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogersint32_t DexFile::FindCatchHandlerOffset(const CodeItem &code_item, uint32_t address) {
840dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  int32_t try_item = FindTryItem(code_item, address);
841dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  if (try_item == -1) {
842dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    return -1;
843dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  } else {
844dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers    return DexFile::GetTryItems(code_item, try_item)->handler_off_;
845dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  }
846dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers}
847dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers
848b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbeckybool DexFile::DecodeDebugLocalInfo(const CodeItem* code_item, bool is_static, uint32_t method_idx,
849b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky                                   DexDebugNewLocalCb local_cb, void* context) const {
850b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  DCHECK(local_cb != nullptr);
851b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  if (code_item == nullptr) {
852b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    return false;
853b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  }
854b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  const uint8_t* stream = GetDebugInfoStream(code_item);
855b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  if (stream == nullptr) {
856b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    return false;
857b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  }
858b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  std::vector<LocalInfo> local_in_reg(code_item->registers_size_);
859195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
860b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  uint16_t arg_reg = code_item->registers_size_ - code_item->ins_size_;
8616d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  if (!is_static) {
862b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    const char* descriptor = GetMethodDeclaringClassDescriptor(GetMethodId(method_idx));
863b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].name_ = "this";
864b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].descriptor_ = descriptor;
865b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].signature_ = nullptr;
866b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].start_address_ = 0;
867b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].reg_ = arg_reg;
868b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].is_live_ = true;
869195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    arg_reg++;
870195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  }
871195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
8726d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  DexFileParameterIterator it(*this, GetMethodPrototype(GetMethodId(method_idx)));
873b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  DecodeUnsignedLeb128(&stream);  // Line.
874b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  uint32_t parameters_size = DecodeUnsignedLeb128(&stream);
875b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  uint32_t i;
876b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  for (i = 0; i < parameters_size && it.HasNext(); ++i, it.Next()) {
877195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    if (arg_reg >= code_item->registers_size_) {
878f87288782e3c2e752c3583645ab5050eda5a2e70jeffhao      LOG(ERROR) << "invalid stream - arg reg >= reg size (" << arg_reg
8792aab947ddafdd7dbabf9858cbf0364c2f68948e1Brian Carlstrom                 << " >= " << code_item->registers_size_ << ") in " << GetLocation();
880b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      return false;
881195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    }
882b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint32_t name_idx = DecodeUnsignedLeb128P1(&stream);
8830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const char* descriptor = it.GetDescriptor();
884b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].name_ = StringDataByIdx(name_idx);
885b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].descriptor_ = descriptor;
886b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].signature_ = nullptr;
887b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].start_address_ = 0;
888b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].reg_ = arg_reg;
889b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    local_in_reg[arg_reg].is_live_ = true;
89040381fb9dc4b4cf274f1e58b2cdf4396202c6189Brian Carlstrom    switch (*descriptor) {
891195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case 'D':
892195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case 'J':
893195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        arg_reg += 2;
894195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
895195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      default:
896195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        arg_reg += 1;
897195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
898195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    }
899195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  }
900b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  if (i != parameters_size || it.HasNext()) {
901f79fccbf8b5e59a0f48bec754cb7a53877b3c90fBrian Carlstrom    LOG(ERROR) << "invalid stream - problem with parameter iterator in " << GetLocation()
902f79fccbf8b5e59a0f48bec754cb7a53877b3c90fBrian Carlstrom               << " for method " << PrettyMethod(method_idx, *this);
903b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    return false;
904195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  }
905195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
906b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  uint32_t address = 0;
907195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  for (;;)  {
908195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    uint8_t opcode = *stream++;
909195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    switch (opcode) {
910195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_END_SEQUENCE:
911b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        // Emit all variables which are still alive at the end of the method.
912b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        for (uint16_t reg = 0; reg < code_item->registers_size_; reg++) {
913b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          if (local_in_reg[reg].is_live_) {
914b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky            local_in_reg[reg].end_address_ = code_item->insns_size_in_code_units_;
915b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky            local_cb(context, local_in_reg[reg]);
916b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          }
917b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        }
918b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        return true;
919195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_ADVANCE_PC:
920195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        address += DecodeUnsignedLeb128(&stream);
921195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
922195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_ADVANCE_LINE:
923b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeSignedLeb128(&stream);  // Line.
924195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
925195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_START_LOCAL:
926b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_START_LOCAL_EXTENDED: {
927b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint16_t reg = DecodeUnsignedLeb128(&stream);
928b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (reg >= code_item->registers_size_) {
929b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          LOG(ERROR) << "invalid stream - reg >= reg size (" << reg << " >= "
9302aab947ddafdd7dbabf9858cbf0364c2f68948e1Brian Carlstrom                     << code_item->registers_size_ << ") in " << GetLocation();
931b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          return false;
932195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        }
933195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
934b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint32_t name_idx = DecodeUnsignedLeb128P1(&stream);
935b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint32_t descriptor_idx = DecodeUnsignedLeb128P1(&stream);
936b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint32_t signature_idx = kDexNoIndex;
937f87288782e3c2e752c3583645ab5050eda5a2e70jeffhao        if (opcode == DBG_START_LOCAL_EXTENDED) {
938f87288782e3c2e752c3583645ab5050eda5a2e70jeffhao          signature_idx = DecodeUnsignedLeb128P1(&stream);
939f87288782e3c2e752c3583645ab5050eda5a2e70jeffhao        }
940f87288782e3c2e752c3583645ab5050eda5a2e70jeffhao
941195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        // Emit what was previously there, if anything
942b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (local_in_reg[reg].is_live_) {
943b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          local_in_reg[reg].end_address_ = address;
944b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          local_cb(context, local_in_reg[reg]);
945195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        }
946195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
947b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].name_ = StringDataByIdx(name_idx);
948b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].descriptor_ = StringByTypeIdx(descriptor_idx);
949b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].signature_ = StringDataByIdx(signature_idx);
950b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].start_address_ = address;
951b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].reg_ = reg;
952b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].is_live_ = true;
953b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
954b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      }
955b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_END_LOCAL: {
956b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint16_t reg = DecodeUnsignedLeb128(&stream);
957b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (reg >= code_item->registers_size_) {
958b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          LOG(ERROR) << "invalid stream - reg >= reg size (" << reg << " >= "
9592aab947ddafdd7dbabf9858cbf0364c2f68948e1Brian Carlstrom                     << code_item->registers_size_ << ") in " << GetLocation();
960b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          return false;
961195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        }
962b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (!local_in_reg[reg].is_live_) {
963b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          LOG(ERROR) << "invalid stream - end without start in " << GetLocation();
964b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          return false;
96530646836b4a1c6e5e80ddaea246cf9669eaa0628Elliott Hughes        }
966b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].end_address_ = address;
967b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_cb(context, local_in_reg[reg]);
968b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        local_in_reg[reg].is_live_ = false;
969195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
970b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      }
971b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_RESTART_LOCAL: {
972b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint16_t reg = DecodeUnsignedLeb128(&stream);
973b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (reg >= code_item->registers_size_) {
974b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          LOG(ERROR) << "invalid stream - reg >= reg size (" << reg << " >= "
9752aab947ddafdd7dbabf9858cbf0364c2f68948e1Brian Carlstrom                     << code_item->registers_size_ << ") in " << GetLocation();
976b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          return false;
977195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        }
978b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        // If the register is live, the "restart" is superfluous,
979b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        // and we don't want to mess with the existing start address.
980b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (!local_in_reg[reg].is_live_) {
981b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          local_in_reg[reg].start_address_ = address;
982b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          local_in_reg[reg].is_live_ = true;
983195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        }
984195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
985b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      }
986195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_SET_PROLOGUE_END:
987195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_SET_EPILOGUE_BEGIN:
988b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
989195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao      case DBG_SET_FILE:
990b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128P1(&stream);  // name.
991195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
992b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      default:
993b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        address += (opcode - DBG_FIRST_SPECIAL) / DBG_LINE_RANGE;
994195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao        break;
995195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    }
996195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  }
997195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao}
998195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
999b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbeckybool DexFile::DecodeDebugPositionInfo(const CodeItem* code_item, DexDebugNewPositionCb position_cb,
1000b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky                                      void* context) const {
1001b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  DCHECK(position_cb != nullptr);
1002b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  if (code_item == nullptr) {
1003b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    return false;
1004b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  }
100513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* stream = GetDebugInfoStream(code_item);
1006b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  if (stream == nullptr) {
1007b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    return false;
1008b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  }
1009b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
1010b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  PositionInfo entry = PositionInfo();
1011b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  entry.line_ = DecodeUnsignedLeb128(&stream);
1012b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  uint32_t parameters_size = DecodeUnsignedLeb128(&stream);
1013b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  for (uint32_t i = 0; i < parameters_size; ++i) {
1014b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    DecodeUnsignedLeb128P1(&stream);  // Parameter name.
10150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
1016b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
1017b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  for (;;)  {
1018b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint8_t opcode = *stream++;
1019b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    switch (opcode) {
1020b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_END_SEQUENCE:
1021b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        return true;  // end of stream.
1022b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_ADVANCE_PC:
1023b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.address_ += DecodeUnsignedLeb128(&stream);
1024b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1025b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_ADVANCE_LINE:
1026b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.line_ += DecodeSignedLeb128(&stream);
1027b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1028b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_START_LOCAL:
1029b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128(&stream);  // reg.
1030b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128P1(&stream);  // name.
1031b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128P1(&stream);  // descriptor.
1032b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1033b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_START_LOCAL_EXTENDED:
1034b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128(&stream);  // reg.
1035b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128P1(&stream);  // name.
1036b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128P1(&stream);  // descriptor.
1037b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128P1(&stream);  // signature.
1038b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1039b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_END_LOCAL:
1040b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_RESTART_LOCAL:
1041b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        DecodeUnsignedLeb128(&stream);  // reg.
1042b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1043b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_SET_PROLOGUE_END:
1044b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.prologue_end_ = true;
1045b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1046b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_SET_EPILOGUE_BEGIN:
1047b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.epilogue_begin_ = true;
1048b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1049b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      case DBG_SET_FILE: {
1050b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        uint32_t name_idx = DecodeUnsignedLeb128P1(&stream);
1051b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.source_file_ = StringDataByIdx(name_idx);
1052b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1053b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      }
1054b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      default: {
1055b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        int adjopcode = opcode - DBG_FIRST_SPECIAL;
1056b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.address_ += adjopcode / DBG_LINE_RANGE;
1057b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.line_ += DBG_LINE_BASE + (adjopcode % DBG_LINE_RANGE);
1058b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        if (position_cb(context, entry)) {
1059b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          return true;  // early exit.
1060b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        }
1061b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.prologue_end_ = false;
1062b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        entry.epilogue_begin_ = false;
1063b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        break;
1064b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky      }
1065b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    }
10660571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
10670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
10680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
1069b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbeckybool DexFile::LineNumForPcCb(void* raw_context, const PositionInfo& entry) {
10702435a5751431152aaeaa2faaa86b2a30d3eecfe3Elliott Hughes  LineNumFromPcContext* context = reinterpret_cast<LineNumFromPcContext*>(raw_context);
10710571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
10720571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // We know that this callback will be called in
10730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // ascending address order, so keep going until we find
10740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // a match or we've just gone past it.
1075b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  if (entry.address_ > context->address_) {
10760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    // The line number from the previous positions callback
10770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    // wil be the final result.
10780571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return true;
10790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  } else {
1080b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    context->line_num_ = entry.line_;
1081b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    return entry.address_ == context->address_;
10820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
10830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
10840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
1085833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampebool DexFile::IsMultiDexLocation(const char* location) {
1086833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  return strrchr(location, kMultiDexSeparator) != nullptr;
1087833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe}
1088833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
108990e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampestd::string DexFile::GetMultiDexClassesDexName(size_t index) {
109090e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  if (index == 0) {
109190e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe    return "classes.dex";
109290e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  } else {
109390e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe    return StringPrintf("classes%zu.dex", index + 1);
109490e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  }
109590e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe}
109690e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe
109790e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampestd::string DexFile::GetMultiDexLocation(size_t index, const char* dex_location) {
109890e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  if (index == 0) {
10994e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle    return dex_location;
11004e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  } else {
110190e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe    return StringPrintf("%s" kMultiDexSeparatorString "classes%zu.dex", dex_location, index + 1);
11024e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  }
11034e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle}
11044e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
11054e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravlestd::string DexFile::GetDexCanonicalLocation(const char* dex_location) {
11064e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  CHECK_NE(dex_location, static_cast<const char*>(nullptr));
1107aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  std::string base_location = GetBaseLocation(dex_location);
1108aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  const char* suffix = dex_location + base_location.size();
1109aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  DCHECK(suffix[0] == 0 || suffix[0] == kMultiDexSeparator);
1110aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  UniqueCPtr<const char[]> path(realpath(base_location.c_str(), nullptr));
1111aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  if (path != nullptr && path.get() != base_location) {
1112aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    return std::string(path.get()) + suffix;
1113aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  } else if (suffix[0] == 0) {
1114aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    return base_location;
11154e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  } else {
1116aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    return dex_location;
11174e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  }
11184e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle}
11194e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
112013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao// Read a signed integer.  "zwidth" is the zero-based byte count.
112113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic int32_t ReadSignedInt(const uint8_t* ptr, int zwidth) {
112213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  int32_t val = 0;
112313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (int i = zwidth; i >= 0; --i) {
112413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    val = ((uint32_t)val >> 8) | (((int32_t)*ptr++) << 24);
112513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
112613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  val >>= (3 - zwidth) * 8;
112713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return val;
112813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
112913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
113013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao// Read an unsigned integer.  "zwidth" is the zero-based byte count,
113113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao// "fill_on_right" indicates which side we want to zero-fill from.
113213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic uint32_t ReadUnsignedInt(const uint8_t* ptr, int zwidth, bool fill_on_right) {
113313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t val = 0;
113413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (int i = zwidth; i >= 0; --i) {
113513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    val = (val >> 8) | (((uint32_t)*ptr++) << 24);
113613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
113713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (!fill_on_right) {
113813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    val >>= (3 - zwidth) * 8;
113913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
114013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return val;
114113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
114213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
114313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao// Read a signed long.  "zwidth" is the zero-based byte count.
114413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic int64_t ReadSignedLong(const uint8_t* ptr, int zwidth) {
114513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  int64_t val = 0;
114613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (int i = zwidth; i >= 0; --i) {
114713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    val = ((uint64_t)val >> 8) | (((int64_t)*ptr++) << 56);
114813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
114913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  val >>= (7 - zwidth) * 8;
115013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return val;
115113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
115213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
115313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao// Read an unsigned long.  "zwidth" is the zero-based byte count,
115413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao// "fill_on_right" indicates which side we want to zero-fill from.
115513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic uint64_t ReadUnsignedLong(const uint8_t* ptr, int zwidth, bool fill_on_right) {
115613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint64_t val = 0;
115713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (int i = zwidth; i >= 0; --i) {
115813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    val = (val >> 8) | (((uint64_t)*ptr++) << 56);
115913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
116013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (!fill_on_right) {
116113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    val >>= (7 - zwidth) * 8;
116213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
116313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return val;
116413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
116513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
11667e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao// Checks that visibility is as expected. Includes special behavior for M and
11677e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao// before to allow runtime and build visibility when expecting runtime.
11687e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Haostatic bool IsVisibilityCompatible(uint32_t actual, uint32_t expected) {
11697e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao  if (expected == DexFile::kDexVisibilityRuntime) {
11707e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    int32_t sdk_version = Runtime::Current()->GetTargetSdkVersion();
11717e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    if (sdk_version > 0 && sdk_version <= 23) {
11727e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao      return actual == DexFile::kDexVisibilityRuntime || actual == DexFile::kDexVisibilityBuild;
11737e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    }
11747e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao  }
11757e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao  return actual == expected;
11767e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao}
11777e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao
117813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst DexFile::AnnotationSetItem* DexFile::FindAnnotationSetForField(ArtField* field) const {
117913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* klass = field->GetDeclaringClass();
118013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationsDirectoryItem* annotations_dir = GetAnnotationsDirectory(*klass->GetClassDef());
118113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotations_dir == nullptr) {
118213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
118313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
118413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const FieldAnnotationsItem* field_annotations = GetFieldAnnotations(annotations_dir);
118513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (field_annotations == nullptr) {
118613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
118713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
118813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t field_index = field->GetDexFieldIndex();
118913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t field_count = annotations_dir->fields_size_;
119013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < field_count; ++i) {
119113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (field_annotations[i].field_idx_ == field_index) {
119213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return GetFieldAnnotationSetItem(field_annotations[i]);
119313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
119413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
119513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return nullptr;
119613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
119713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
119813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::GetAnnotationForField(ArtField* field,
119913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                               Handle<mirror::Class> annotation_class) const {
120013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
120113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
120213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
120313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
120413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
120513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> field_class(hs.NewHandle(field->GetDeclaringClass()));
120613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return GetAnnotationObjectFromAnnotationSet(
120713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      field_class, annotation_set, kDexVisibilityRuntime, annotation_class);
120813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
120913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
121013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::ObjectArray<mirror::Object>* DexFile::GetAnnotationsForField(ArtField* field) const {
121113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
121213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
121313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> field_class(hs.NewHandle(field->GetDeclaringClass()));
121413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return ProcessAnnotationSet(field_class, annotation_set, kDexVisibilityRuntime);
121513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
121613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
12172a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::ObjectArray<mirror::String>* DexFile::GetSignatureAnnotationForField(ArtField* field)
121813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const {
121913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
122013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
122113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
122213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
122313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
122413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> field_class(hs.NewHandle(field->GetDeclaringClass()));
122513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return GetSignatureValue(field_class, annotation_set);
122613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
122713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
122813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haobool DexFile::IsFieldAnnotationPresent(ArtField* field, Handle<mirror::Class> annotation_class)
122913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const {
123013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForField(field);
123113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
123213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return false;
123313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
123413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
123513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> field_class(hs.NewHandle(field->GetDeclaringClass()));
123613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
123713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      field_class, annotation_set, kDexVisibilityRuntime, annotation_class);
123813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return annotation_item != nullptr;
123913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
124013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
124113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst DexFile::AnnotationSetItem* DexFile::FindAnnotationSetForMethod(ArtMethod* method) const {
124213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* klass = method->GetDeclaringClass();
124313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationsDirectoryItem* annotations_dir = GetAnnotationsDirectory(*klass->GetClassDef());
124413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotations_dir == nullptr) {
124513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
124613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
124713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const MethodAnnotationsItem* method_annotations = GetMethodAnnotations(annotations_dir);
124813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (method_annotations == nullptr) {
124913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
125013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
125113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t method_index = method->GetDexMethodIndex();
125213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t method_count = annotations_dir->methods_size_;
125313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < method_count; ++i) {
125413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (method_annotations[i].method_idx_ == method_index) {
125513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return GetMethodAnnotationSetItem(method_annotations[i]);
125613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
125713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
125813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return nullptr;
125913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
126013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
126113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst DexFile::ParameterAnnotationsItem* DexFile::FindAnnotationsItemForMethod(ArtMethod* method)
126213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const {
126313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* klass = method->GetDeclaringClass();
126413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationsDirectoryItem* annotations_dir = GetAnnotationsDirectory(*klass->GetClassDef());
126513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotations_dir == nullptr) {
126613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
126713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
126813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const ParameterAnnotationsItem* parameter_annotations = GetParameterAnnotations(annotations_dir);
126913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (parameter_annotations == nullptr) {
127013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
127113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
127213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t method_index = method->GetDexMethodIndex();
127313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t parameter_count = annotations_dir->parameters_size_;
127413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < parameter_count; ++i) {
127513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (parameter_annotations[i].method_idx_ == method_index) {
127613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return &parameter_annotations[i];
127713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
127813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
127913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return nullptr;
128013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
128113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
128213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::GetAnnotationDefaultValue(ArtMethod* method) const {
128313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* klass = method->GetDeclaringClass();
128413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationsDirectoryItem* annotations_dir = GetAnnotationsDirectory(*klass->GetClassDef());
128513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotations_dir == nullptr) {
128613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
128713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
128813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = GetClassAnnotationSet(annotations_dir);
128913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
129013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
129113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
129213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(annotation_set,
129313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      "Ldalvik/annotation/AnnotationDefault;", kDexVisibilitySystem);
129413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_item == nullptr) {
129513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
129613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
129713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const uint8_t* annotation = SearchEncodedAnnotation(annotation_item->annotation_, "value");
129813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation == nullptr) {
129913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
130013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
130113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t header_byte = *(annotation++);
130213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if ((header_byte & kDexAnnotationValueTypeMask) != kDexAnnotationAnnotation) {
130313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
130413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
130513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  annotation = SearchEncodedAnnotation(annotation, method->GetName());
130613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation == nullptr) {
130713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
130813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
130913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  AnnotationValue annotation_value;
131013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<2> hs(Thread::Current());
131113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> h_klass(hs.NewHandle(klass));
131205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko  size_t pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
131305792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko  Handle<mirror::Class> return_type(hs.NewHandle(
131405792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko      method->GetReturnType(true /* resolve */, pointer_size)));
131513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (!ProcessAnnotationValue(h_klass, &annotation, &annotation_value, return_type, kAllObjects)) {
131613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
131713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
131813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return annotation_value.value_.GetL();
131913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
132013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
132113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::GetAnnotationForMethod(ArtMethod* method,
132213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                Handle<mirror::Class> annotation_class) const {
132313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
132413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
132513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
132613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
132713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
132813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> method_class(hs.NewHandle(method->GetDeclaringClass()));
132913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return GetAnnotationObjectFromAnnotationSet(method_class, annotation_set,
133013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                              kDexVisibilityRuntime, annotation_class);
133113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
133213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
133313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::ObjectArray<mirror::Object>* DexFile::GetAnnotationsForMethod(ArtMethod* method) const {
133413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
133513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
133613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> method_class(hs.NewHandle(method->GetDeclaringClass()));
133713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return ProcessAnnotationSet(method_class, annotation_set, kDexVisibilityRuntime);
133813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
133913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
13402a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::ObjectArray<mirror::Class>* DexFile::GetExceptionTypesForMethod(ArtMethod* method) const {
134113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
134213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
134313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
134413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
134513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
134613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> method_class(hs.NewHandle(method->GetDeclaringClass()));
134713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return GetThrowsValue(method_class, annotation_set);
134813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
134913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
135013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::ObjectArray<mirror::Object>* DexFile::GetParameterAnnotations(ArtMethod* method) const {
135113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const ParameterAnnotationsItem* parameter_annotations = FindAnnotationsItemForMethod(method);
135213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (parameter_annotations == nullptr) {
135313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
135413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
135513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetRefList* set_ref_list =
135613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      GetParameterAnnotationSetRefList(parameter_annotations);
135713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (set_ref_list == nullptr) {
135813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
135913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
136013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t size = set_ref_list->size_;
136113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
136213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> method_class(hs.NewHandle(method->GetDeclaringClass()));
136313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return ProcessAnnotationSetRefList(method_class, set_ref_list, size);
136413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
136513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
136608305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Haomirror::ObjectArray<mirror::String>* DexFile::GetSignatureAnnotationForMethod(ArtMethod* method)
136708305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao    const {
136808305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
136908305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  if (annotation_set == nullptr) {
137008305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao    return nullptr;
137108305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  }
137208305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  StackHandleScope<1> hs(Thread::Current());
137308305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  Handle<mirror::Class> method_class(hs.NewHandle(method->GetDeclaringClass()));
137408305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  return GetSignatureValue(method_class, annotation_set);
137508305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao}
137608305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao
137713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haobool DexFile::IsMethodAnnotationPresent(ArtMethod* method, Handle<mirror::Class> annotation_class)
137813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const {
137913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForMethod(method);
138013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
138113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return false;
138213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
138313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
138413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> method_class(hs.NewHandle(method->GetDeclaringClass()));
138513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
138613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      method_class, annotation_set, kDexVisibilityRuntime, annotation_class);
13872a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return annotation_item != nullptr;
138813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
138913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
139013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst DexFile::AnnotationSetItem* DexFile::FindAnnotationSetForClass(Handle<mirror::Class> klass)
139113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const {
139213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationsDirectoryItem* annotations_dir = GetAnnotationsDirectory(*klass->GetClassDef());
139313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotations_dir == nullptr) {
139413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
139513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
139613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return GetClassAnnotationSet(annotations_dir);
139713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
139813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
139913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::GetAnnotationForClass(Handle<mirror::Class> klass,
140013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                               Handle<mirror::Class> annotation_class) const {
140113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
140213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
140313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
140413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
140513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return GetAnnotationObjectFromAnnotationSet(klass, annotation_set, kDexVisibilityRuntime,
140613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                              annotation_class);
140713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
140813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
140913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::ObjectArray<mirror::Object>* DexFile::GetAnnotationsForClass(Handle<mirror::Class> klass)
141013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const {
141113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
141213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return ProcessAnnotationSet(klass, annotation_set, kDexVisibilityRuntime);
141313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
141413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
14152a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::ObjectArray<mirror::Class>* DexFile::GetDeclaredClasses(Handle<mirror::Class> klass) const {
14162a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
14172a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_set == nullptr) {
14182a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14192a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14202a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(
14212a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_set, "Ldalvik/annotation/MemberClasses;", kDexVisibilitySystem);
14222a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_item == nullptr) {
14232a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14242a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14252a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  StackHandleScope<1> hs(Thread::Current());
14262a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::Class* class_class = mirror::Class::GetJavaLangClass();
14272a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  Handle<mirror::Class> class_array_class(hs.NewHandle(
14282a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      Runtime::Current()->GetClassLinker()->FindArrayClass(hs.Self(), &class_class)));
14292a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (class_array_class.Get() == nullptr) {
14302a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14312a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14322a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::Object* obj = GetAnnotationValue(
14332a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      klass, annotation_item, "value", class_array_class, kDexAnnotationArray);
14342a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (obj == nullptr) {
14352a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14362a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14372a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return obj->AsObjectArray<mirror::Class>();
14382a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao}
14392a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
14402a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::Class* DexFile::GetDeclaringClass(Handle<mirror::Class> klass) const {
14412a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
14422a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_set == nullptr) {
14432a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14442a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14452a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(
14462a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_set, "Ldalvik/annotation/EnclosingClass;", kDexVisibilitySystem);
14472a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_item == nullptr) {
14482a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14492a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14509865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier  mirror::Object* obj = GetAnnotationValue(klass,
14519865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                                           annotation_item,
14529865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                                           "value",
14539865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                                           ScopedNullHandle<mirror::Class>(),
14549865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                                           kDexAnnotationType);
14552a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (obj == nullptr) {
14562a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14572a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14582a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return obj->AsClass();
14592a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao}
14602a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
14612a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::Class* DexFile::GetEnclosingClass(Handle<mirror::Class> klass) const {
14622a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::Class* declaring_class = GetDeclaringClass(klass);
14632a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (declaring_class != nullptr) {
14642a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return declaring_class;
14652a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14662a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
14672a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_set == nullptr) {
14682a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14692a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14702a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(
14712a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_set, "Ldalvik/annotation/EnclosingMethod;", kDexVisibilitySystem);
14722a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_item == nullptr) {
14732a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14742a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14752a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const uint8_t* annotation = SearchEncodedAnnotation(annotation_item->annotation_, "value");
14762a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation == nullptr) {
14772a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14782a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14792a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  AnnotationValue annotation_value;
14809865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier  if (!ProcessAnnotationValue(klass,
14819865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              &annotation,
14829865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              &annotation_value,
14839865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              ScopedNullHandle<mirror::Class>(),
14849865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              kAllRaw)) {
14852a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14862a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14872a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_value.type_ != kDexAnnotationMethod) {
14882a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14892a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14902a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  StackHandleScope<2> hs(Thread::Current());
14912a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
14922a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
14932a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  ArtMethod* method = Runtime::Current()->GetClassLinker()->ResolveMethodWithoutInvokeType(
14942a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      klass->GetDexFile(), annotation_value.value_.GetI(), dex_cache, class_loader);
14952a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (method == nullptr) {
14962a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
14972a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
14982a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return method->GetDeclaringClass();
14992a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao}
15002a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
15012a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::Object* DexFile::GetEnclosingMethod(Handle<mirror::Class> klass) const {
15022a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
15032a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_set == nullptr) {
15042a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
15052a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15062a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(
15072a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_set, "Ldalvik/annotation/EnclosingMethod;", kDexVisibilitySystem);
15082a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_item == nullptr) {
15092a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
15102a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15112a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return GetAnnotationValue(
15129865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier      klass, annotation_item, "value", ScopedNullHandle<mirror::Class>(), kDexAnnotationMethod);
15132a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao}
15142a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
15152a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haobool DexFile::GetInnerClass(Handle<mirror::Class> klass, mirror::String** name) const {
15162a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
15172a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_set == nullptr) {
15182a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15192a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15202a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(
15212a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_set, "Ldalvik/annotation/InnerClass;", kDexVisibilitySystem);
15222a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_item == nullptr) {
15232a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15242a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15252a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const uint8_t* annotation = SearchEncodedAnnotation(annotation_item->annotation_, "name");
15262a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation == nullptr) {
15272a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15282a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15292a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  AnnotationValue annotation_value;
15309865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier  if (!ProcessAnnotationValue(klass,
15319865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              &annotation,
15329865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              &annotation_value,
15339865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              ScopedNullHandle<mirror::Class>(),
15349865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              kAllObjects)) {
15352a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15362a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15372a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_value.type_ != kDexAnnotationNull &&
15382a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_value.type_ != kDexAnnotationString) {
15392a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15402a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15412a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  *name = down_cast<mirror::String*>(annotation_value.value_.GetL());
15422a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return true;
15432a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao}
15442a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
15452a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haobool DexFile::GetInnerClassFlags(Handle<mirror::Class> klass, uint32_t* flags) const {
15462a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
15472a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_set == nullptr) {
15482a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15492a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15502a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const AnnotationItem* annotation_item = SearchAnnotationSet(
15512a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      annotation_set, "Ldalvik/annotation/InnerClass;", kDexVisibilitySystem);
15522a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_item == nullptr) {
15532a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15542a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15552a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  const uint8_t* annotation = SearchEncodedAnnotation(annotation_item->annotation_, "accessFlags");
15562a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation == nullptr) {
15572a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15582a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15592a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  AnnotationValue annotation_value;
15609865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier  if (!ProcessAnnotationValue(klass,
15619865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              &annotation,
15629865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              &annotation_value,
15639865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              ScopedNullHandle<mirror::Class>(),
15649865bde5d822f56c4732214c2005dfcaa41f94cfMathieu Chartier                              kAllRaw)) {
15652a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15662a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15672a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_value.type_ != kDexAnnotationInt) {
15682a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return false;
15692a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
15702a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  *flags = annotation_value.value_.GetI();
15712a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return true;
15722a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao}
15732a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
157408305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Haomirror::ObjectArray<mirror::String>* DexFile::GetSignatureAnnotationForClass(
157508305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao    Handle<mirror::Class> klass) const {
157608305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
157708305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  if (annotation_set == nullptr) {
157808305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao    return nullptr;
157908305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  }
158008305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  return GetSignatureValue(klass, annotation_set);
158108305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao}
158208305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao
158313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haobool DexFile::IsClassAnnotationPresent(Handle<mirror::Class> klass,
158413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                       Handle<mirror::Class> annotation_class) const {
158513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* annotation_set = FindAnnotationSetForClass(klass);
158613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
158713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return false;
158813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
158913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item = GetAnnotationItemFromAnnotationSet(
159013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      klass, annotation_set, kDexVisibilityRuntime, annotation_class);
15912a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return annotation_item != nullptr;
159213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
159313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
159413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::CreateAnnotationMember(Handle<mirror::Class> klass,
159513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Handle<mirror::Class> annotation_class, const uint8_t** annotation) const {
159613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Thread* self = Thread::Current();
159713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ScopedObjectAccessUnchecked soa(self);
159813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<5> hs(self);
159913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t element_name_index = DecodeUnsignedLeb128(annotation);
160013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const char* name = StringDataByIdx(element_name_index);
160113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::String> string_name(
160213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      hs.NewHandle(mirror::String::AllocFromModifiedUtf8(self, name)));
160313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
160413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ArtMethod* annotation_method =
160513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_class->FindDeclaredVirtualMethodByName(name, sizeof(void*));
160613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_method == nullptr) {
160713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
160813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
160905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko  size_t pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
161005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko  Handle<mirror::Class> method_return(hs.NewHandle(
161105792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko      annotation_method->GetReturnType(true /* resolve */, pointer_size)));
161213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
161313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  AnnotationValue annotation_value;
161413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (!ProcessAnnotationValue(klass, annotation, &annotation_value, method_return, kAllObjects)) {
161513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
161613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
161713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Object> value_object(hs.NewHandle(annotation_value.value_.GetL()));
161813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
161913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* annotation_member_class =
162013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      WellKnownClasses::ToClass(WellKnownClasses::libcore_reflect_AnnotationMember);
162113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Object> new_member(hs.NewHandle(annotation_member_class->AllocObject(self)));
162213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Method> method_object(
162313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      hs.NewHandle(mirror::Method::CreateFromArtMethod(self, annotation_method)));
162413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
162513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (new_member.Get() == nullptr || string_name.Get() == nullptr ||
162613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      method_object.Get() == nullptr || method_return.Get() == nullptr) {
162713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    LOG(ERROR) << StringPrintf("Failed creating annotation element (m=%p n=%p a=%p r=%p",
162813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        new_member.Get(), string_name.Get(), method_object.Get(), method_return.Get());
162913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
163013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
163113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
163213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  JValue result;
163313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ArtMethod* annotation_member_init =
163413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      soa.DecodeMethod(WellKnownClasses::libcore_reflect_AnnotationMember_init);
163513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t args[5] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(new_member.Get())),
163613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                       static_cast<uint32_t>(reinterpret_cast<uintptr_t>(string_name.Get())),
163713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                       static_cast<uint32_t>(reinterpret_cast<uintptr_t>(value_object.Get())),
163813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                       static_cast<uint32_t>(reinterpret_cast<uintptr_t>(method_return.Get())),
163913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                       static_cast<uint32_t>(reinterpret_cast<uintptr_t>(method_object.Get()))
164013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  };
164113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  annotation_member_init->Invoke(self, args, sizeof(args), &result, "VLLLL");
164213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (self->IsExceptionPending()) {
164313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    LOG(INFO) << "Exception in AnnotationMember.<init>";
164413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
164513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
164613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
164713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return new_member.Get();
164813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
164913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
165013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst DexFile::AnnotationItem* DexFile::GetAnnotationItemFromAnnotationSet(
165113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Handle<mirror::Class> klass, const AnnotationSetItem* annotation_set, uint32_t visibility,
165213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Handle<mirror::Class> annotation_class) const {
165313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < annotation_set->size_; ++i) {
165413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationItem* annotation_item = GetAnnotationItem(annotation_set, i);
16557e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    if (!IsVisibilityCompatible(annotation_item->visibility_, visibility)) {
165613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      continue;
165713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
165813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const uint8_t* annotation = annotation_item->annotation_;
165913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t type_index = DecodeUnsignedLeb128(&annotation);
166013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    mirror::Class* resolved_class = Runtime::Current()->GetClassLinker()->ResolveType(
166113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        klass->GetDexFile(), type_index, klass.Get());
166213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (resolved_class == nullptr) {
166313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      std::string temp;
166413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      LOG(WARNING) << StringPrintf("Unable to resolve %s annotation class %d",
166513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                   klass->GetDescriptor(&temp), type_index);
166613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      CHECK(Thread::Current()->IsExceptionPending());
166713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      Thread::Current()->ClearException();
166813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      continue;
166913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
167013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (resolved_class == annotation_class.Get()) {
167113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return annotation_item;
167213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
167313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
167413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
167513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return nullptr;
167613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
167713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
167813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::GetAnnotationObjectFromAnnotationSet(Handle<mirror::Class> klass,
167913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationSetItem* annotation_set, uint32_t visibility,
168013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Handle<mirror::Class> annotation_class) const {
168113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item =
168213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      GetAnnotationItemFromAnnotationSet(klass, annotation_set, visibility, annotation_class);
168313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_item == nullptr) {
168413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
168513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
168613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const uint8_t* annotation = annotation_item->annotation_;
168713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return ProcessEncodedAnnotation(klass, &annotation);
168813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
168913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
169013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::GetAnnotationValue(Handle<mirror::Class> klass,
169113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationItem* annotation_item, const char* annotation_name,
169213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Handle<mirror::Class> array_class, uint32_t expected_type) const {
169313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const uint8_t* annotation =
169413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SearchEncodedAnnotation(annotation_item->annotation_, annotation_name);
169513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation == nullptr) {
169613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
169713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
169813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  AnnotationValue annotation_value;
169913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (!ProcessAnnotationValue(klass, &annotation, &annotation_value, array_class, kAllObjects)) {
170013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
170113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
170213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_value.type_ != expected_type) {
170313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
170413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
170513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return annotation_value.value_.GetL();
170613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
170713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
17082a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::ObjectArray<mirror::String>* DexFile::GetSignatureValue(Handle<mirror::Class> klass,
170913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationSetItem* annotation_set) const {
171013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
171113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item =
171213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SearchAnnotationSet(annotation_set, "Ldalvik/annotation/Signature;", kDexVisibilitySystem);
171313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_item == nullptr) {
171413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
171513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
171613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* string_class = mirror::String::GetJavaLangString();
171713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> string_array_class(hs.NewHandle(
171813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      Runtime::Current()->GetClassLinker()->FindArrayClass(Thread::Current(), &string_class)));
17192a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (string_array_class.Get() == nullptr) {
17202a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
17212a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
172213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* obj =
172313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      GetAnnotationValue(klass, annotation_item, "value", string_array_class, kDexAnnotationArray);
172413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (obj == nullptr) {
172513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
172613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
17272a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return obj->AsObjectArray<mirror::String>();
172813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
172913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
17302a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Haomirror::ObjectArray<mirror::Class>* DexFile::GetThrowsValue(Handle<mirror::Class> klass,
173113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationSetItem* annotation_set) const {
173213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(Thread::Current());
173313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* annotation_item =
173413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SearchAnnotationSet(annotation_set, "Ldalvik/annotation/Throws;", kDexVisibilitySystem);
173513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_item == nullptr) {
173613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
173713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
173813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* class_class = mirror::Class::GetJavaLangClass();
173913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> class_array_class(hs.NewHandle(
174013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      Runtime::Current()->GetClassLinker()->FindArrayClass(Thread::Current(), &class_class)));
17412a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (class_array_class.Get() == nullptr) {
17422a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
17432a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
174413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* obj =
174513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      GetAnnotationValue(klass, annotation_item, "value", class_array_class, kDexAnnotationArray);
174613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (obj == nullptr) {
174713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
174813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
17492a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  return obj->AsObjectArray<mirror::Class>();
175013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
175113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
175213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::ObjectArray<mirror::Object>* DexFile::ProcessAnnotationSet(Handle<mirror::Class> klass,
175313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationSetItem* annotation_set, uint32_t visibility) const {
175413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Thread* self = Thread::Current();
175513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ScopedObjectAccessUnchecked soa(self);
175613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<2> hs(self);
175713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> annotation_array_class(hs.NewHandle(
175813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      soa.Decode<mirror::Class*>(WellKnownClasses::java_lang_annotation_Annotation__array)));
175913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_set == nullptr) {
176013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_class.Get(), 0);
176113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
176213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
176313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t size = annotation_set->size_;
176413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::ObjectArray<mirror::Object>> result(hs.NewHandle(
176513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_class.Get(), size)));
176613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (result.Get() == nullptr) {
176713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
176813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
176913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
177013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t dest_index = 0;
177113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < size; ++i) {
177213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationItem* annotation_item = GetAnnotationItem(annotation_set, i);
17737e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    // Note that we do not use IsVisibilityCompatible here because older code
17747e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    // was correct for this case.
177513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (annotation_item->visibility_ != visibility) {
177613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      continue;
177713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
177813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const uint8_t* annotation = annotation_item->annotation_;
177913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    mirror::Object* annotation_obj = ProcessEncodedAnnotation(klass, &annotation);
178013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (annotation_obj != nullptr) {
178113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      result->SetWithoutChecks<false>(dest_index, annotation_obj);
178213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      ++dest_index;
17832a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    } else if (self->IsExceptionPending()) {
17842a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      return nullptr;
178513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
178613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
178713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
178813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (dest_index == size) {
178913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return result.Get();
179013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
179113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
179213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* trimmed_result =
179313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_class.Get(), dest_index);
17942a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (trimmed_result == nullptr) {
17952a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
17962a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
17972a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao
179813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < dest_index; ++i) {
179913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    mirror::Object* obj = result->GetWithoutChecks(i);
180013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    trimmed_result->SetWithoutChecks<false>(i, obj);
180113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
180213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
180313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return trimmed_result;
180413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
180513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
180613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::ObjectArray<mirror::Object>* DexFile::ProcessAnnotationSetRefList(
180713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Handle<mirror::Class> klass, const AnnotationSetRefList* set_ref_list, uint32_t size) const {
180813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Thread* self = Thread::Current();
180913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ScopedObjectAccessUnchecked soa(self);
181013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<1> hs(self);
181113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* annotation_array_class =
181213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      soa.Decode<mirror::Class*>(WellKnownClasses::java_lang_annotation_Annotation__array);
181313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* annotation_array_array_class =
181413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      Runtime::Current()->GetClassLinker()->FindArrayClass(self, &annotation_array_class);
18152a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_array_array_class == nullptr) {
18162a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
18172a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
181813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::ObjectArray<mirror::Object>> annotation_array_array(hs.NewHandle(
181913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_array_array_class, size)));
182013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_array_array.Get() == nullptr) {
182113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    LOG(ERROR) << "Annotation set ref array allocation failed";
182213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
182313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
182413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t index = 0; index < size; ++index) {
182513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationSetRefItem* set_ref_item = &set_ref_list->list_[index];
182613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationSetItem* set_item = GetSetRefItemItem(set_ref_item);
182713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    mirror::Object* annotation_set = ProcessAnnotationSet(klass, set_item, kDexVisibilityRuntime);
182813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (annotation_set == nullptr) {
182913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
183013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
183113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    annotation_array_array->SetWithoutChecks<false>(index, annotation_set);
183213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
183313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return annotation_array_array.Get();
183413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
183513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
183613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haobool DexFile::ProcessAnnotationValue(Handle<mirror::Class> klass, const uint8_t** annotation_ptr,
183713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    AnnotationValue* annotation_value, Handle<mirror::Class> array_class,
183813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    DexFile::AnnotationResultStyle result_style) const {
183913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Thread* self = Thread::Current();
184013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* element_object = nullptr;
184113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  bool set_object = false;
184213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Primitive::Type primitive_type = Primitive::kPrimVoid;
184313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const uint8_t* annotation = *annotation_ptr;
184413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t header_byte = *(annotation++);
184513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t value_type = header_byte & kDexAnnotationValueTypeMask;
184613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t value_arg = header_byte >> kDexAnnotationValueArgShift;
184713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  int32_t width = value_arg + 1;
184813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  annotation_value->type_ = value_type;
184913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
185013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  switch (value_type) {
185113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationByte:
185213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetB(static_cast<int8_t>(ReadSignedInt(annotation, value_arg)));
185313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimByte;
185413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
185513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationShort:
185613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetS(static_cast<int16_t>(ReadSignedInt(annotation, value_arg)));
185713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimShort;
185813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
185913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationChar:
186013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetC(static_cast<uint16_t>(ReadUnsignedInt(annotation, value_arg,
186113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                                          false)));
186213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimChar;
186313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
186413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationInt:
186513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetI(ReadSignedInt(annotation, value_arg));
186613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimInt;
186713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
186813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationLong:
186913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetJ(ReadSignedLong(annotation, value_arg));
187013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimLong;
187113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
187213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationFloat:
187313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetI(ReadUnsignedInt(annotation, value_arg, true));
187413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimFloat;
187513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
187613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationDouble:
187713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetJ(ReadUnsignedLong(annotation, value_arg, true));
187813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimDouble;
187913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
188013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationBoolean:
188113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      annotation_value->value_.SetZ(value_arg != 0);
188213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      primitive_type = Primitive::kPrimBoolean;
188313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      width = 0;
188413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
188513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationString: {
188613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t index = ReadUnsignedInt(annotation, value_arg, false);
188713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
188813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        annotation_value->value_.SetI(index);
188913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
189013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        StackHandleScope<1> hs(self);
189113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
189213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        element_object = Runtime::Current()->GetClassLinker()->ResolveString(
189313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            klass->GetDexFile(), index, dex_cache);
189413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        set_object = true;
189513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (element_object == nullptr) {
189613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
189713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
189813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
189913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
190013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
190113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationType: {
190213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t index = ReadUnsignedInt(annotation, value_arg, false);
190313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
190413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        annotation_value->value_.SetI(index);
190513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
190613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        element_object = Runtime::Current()->GetClassLinker()->ResolveType(
190713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            klass->GetDexFile(), index, klass.Get());
190813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        set_object = true;
190913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (element_object == nullptr) {
1910fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao          CHECK(self->IsExceptionPending());
1911fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao          if (result_style == kAllObjects) {
1912fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao            const char* msg = StringByTypeIdx(index);
1913fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao            self->ThrowNewWrappedException("Ljava/lang/TypeNotPresentException;", msg);
1914fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao            element_object = self->GetException();
1915fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao            self->ClearException();
1916fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao          } else {
1917fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao            return false;
1918fc8d247275d06047c652abbdd368fe784bf85e67Jeff Hao          }
191913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
192013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
192113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
192213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
192313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationMethod: {
192413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t index = ReadUnsignedInt(annotation, value_arg, false);
192513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
192613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        annotation_value->value_.SetI(index);
192713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
192813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        StackHandleScope<2> hs(self);
192913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
193013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
193113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        ArtMethod* method = Runtime::Current()->GetClassLinker()->ResolveMethodWithoutInvokeType(
193213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            klass->GetDexFile(), index, dex_cache, class_loader);
193313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (method == nullptr) {
193413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
193513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
193613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        set_object = true;
193713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (method->IsConstructor()) {
193813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          element_object = mirror::Constructor::CreateFromArtMethod(self, method);
193913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        } else {
194013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          element_object = mirror::Method::CreateFromArtMethod(self, method);
194113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
194213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (element_object == nullptr) {
194313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
194413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
194513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
194613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
194713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
194813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationField: {
194913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t index = ReadUnsignedInt(annotation, value_arg, false);
195013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
195113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        annotation_value->value_.SetI(index);
195213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
195313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        StackHandleScope<2> hs(self);
195413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
195513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
195613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        ArtField* field = Runtime::Current()->GetClassLinker()->ResolveFieldJLS(
195713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            klass->GetDexFile(), index, dex_cache, class_loader);
195813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (field == nullptr) {
195913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
196013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
196113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        set_object = true;
196213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        element_object = mirror::Field::CreateFromArtField(self, field, true);
196313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (element_object == nullptr) {
196413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
196513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
196613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
196713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
196813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
196913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationEnum: {
197013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t index = ReadUnsignedInt(annotation, value_arg, false);
197113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
197213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        annotation_value->value_.SetI(index);
197313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
197413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        StackHandleScope<3> hs(self);
197513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::DexCache> dex_cache(hs.NewHandle(klass->GetDexCache()));
197613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::ClassLoader> class_loader(hs.NewHandle(klass->GetClassLoader()));
197713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        ArtField* enum_field = Runtime::Current()->GetClassLinker()->ResolveField(
197813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            klass->GetDexFile(), index, dex_cache, class_loader, true);
197913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (enum_field == nullptr) {
198013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
198113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        } else {
1982d297b554b673bbc627c8080d177defe1b4fd8c58Jeff Hao          Handle<mirror::Class> field_class(hs.NewHandle(enum_field->GetDeclaringClass()));
198313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          Runtime::Current()->GetClassLinker()->EnsureInitialized(self, field_class, true, true);
198413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          element_object = enum_field->GetObject(field_class.Get());
198513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          set_object = true;
198613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
198713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
198813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
198913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
199013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationArray:
199113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw || array_class.Get() == nullptr) {
199213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        return false;
199313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
199413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        ScopedObjectAccessUnchecked soa(self);
199513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        StackHandleScope<2> hs(self);
199613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        uint32_t size = DecodeUnsignedLeb128(&annotation);
199713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::Class> component_type(hs.NewHandle(array_class->GetComponentType()));
199813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        Handle<mirror::Array> new_array(hs.NewHandle(mirror::Array::Alloc<true>(
199913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            self, array_class.Get(), size, array_class->GetComponentSizeShift(),
200013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            Runtime::Current()->GetHeap()->GetCurrentAllocator())));
200113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (new_array.Get() == nullptr) {
200213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          LOG(ERROR) << "Annotation element array allocation failed with size " << size;
200313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
200413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
200513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        AnnotationValue new_annotation_value;
200613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        for (uint32_t i = 0; i < size; ++i) {
200713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          if (!ProcessAnnotationValue(klass, &annotation, &new_annotation_value, component_type,
200813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                      kPrimitivesOrObjects)) {
200913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            return false;
201013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          }
201113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          if (!component_type->IsPrimitive()) {
201213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            mirror::Object* obj = new_annotation_value.value_.GetL();
201313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            new_array->AsObjectArray<mirror::Object>()->SetWithoutChecks<false>(i, obj);
201413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          } else {
201513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            switch (new_annotation_value.type_) {
201613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationByte:
201713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsByteArray()->SetWithoutChecks<false>(
201813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetB());
201913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
202013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationShort:
202113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsShortArray()->SetWithoutChecks<false>(
202213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetS());
202313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
202413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationChar:
202513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsCharArray()->SetWithoutChecks<false>(
202613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetC());
202713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
202813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationInt:
202913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsIntArray()->SetWithoutChecks<false>(
203013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetI());
203113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
203213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationLong:
203313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsLongArray()->SetWithoutChecks<false>(
203413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetJ());
203513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
203613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationFloat:
203713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsFloatArray()->SetWithoutChecks<false>(
203813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetF());
203913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
204013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationDouble:
204113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsDoubleArray()->SetWithoutChecks<false>(
204213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetD());
204313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
204413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              case kDexAnnotationBoolean:
204513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                new_array->AsBooleanArray()->SetWithoutChecks<false>(
204613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                    i, new_annotation_value.value_.GetZ());
204713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                break;
204813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              default:
204913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                LOG(FATAL) << "Found invalid annotation value type while building annotation array";
205013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                return false;
205113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao            }
205213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          }
205313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
205413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        element_object = new_array.Get();
205513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        set_object = true;
205613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        width = 0;
205713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
205813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
205913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationAnnotation:
206013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
206113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        return false;
206213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
206313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      element_object = ProcessEncodedAnnotation(klass, &annotation);
206413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (element_object == nullptr) {
206513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        return false;
206613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
206713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      set_object = true;
206813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      width = 0;
206913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
207013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationNull:
207113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      if (result_style == kAllRaw) {
207213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        annotation_value->value_.SetI(0);
207313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      } else {
207413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        CHECK(element_object == nullptr);
207513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        set_object = true;
207613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
207713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      width = 0;
207813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
207913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    default:
208013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      LOG(ERROR) << StringPrintf("Bad annotation element value type 0x%02x", value_type);
208113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return false;
208213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
208313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
208413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  annotation += width;
208513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  *annotation_ptr = annotation;
208613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
208713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (result_style == kAllObjects && primitive_type != Primitive::kPrimVoid) {
208813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    element_object = BoxPrimitive(primitive_type, annotation_value->value_);
208913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    set_object = true;
209013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
209113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
209213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (set_object) {
209313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    annotation_value->value_.SetL(element_object);
209413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
209513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
209613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return true;
209713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
209813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
209913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haomirror::Object* DexFile::ProcessEncodedAnnotation(Handle<mirror::Class> klass,
210013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const uint8_t** annotation) const {
210113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t type_index = DecodeUnsignedLeb128(annotation);
210213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t size = DecodeUnsignedLeb128(annotation);
210313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
210413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Thread* self = Thread::Current();
210513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ScopedObjectAccessUnchecked soa(self);
210613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  StackHandleScope<2> hs(self);
210713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
210813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::Class> annotation_class(hs.NewHandle(
210913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      class_linker->ResolveType(klass->GetDexFile(), type_index, klass.Get())));
211013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (annotation_class.Get() == nullptr) {
211113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    LOG(INFO) << "Unable to resolve " << PrettyClass(klass.Get()) << " annotation class "
211213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao              << type_index;
211313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    DCHECK(Thread::Current()->IsExceptionPending());
211413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    Thread::Current()->ClearException();
211513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
211613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
211713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
211813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* annotation_member_class =
211913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      soa.Decode<mirror::Class*>(WellKnownClasses::libcore_reflect_AnnotationMember);
212013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Class* annotation_member_array_class =
212113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      class_linker->FindArrayClass(self, &annotation_member_class);
21222a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  if (annotation_member_array_class == nullptr) {
21232a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao    return nullptr;
21242a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  }
212513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* element_array = nullptr;
212613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (size > 0) {
212713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    element_array =
212813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        mirror::ObjectArray<mirror::Object>::Alloc(self, annotation_member_array_class, size);
212913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (element_array == nullptr) {
213013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      LOG(ERROR) << "Failed to allocate annotation member array (" << size << " elements)";
213113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
213213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
213313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
213413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
213513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  Handle<mirror::ObjectArray<mirror::Object>> h_element_array(hs.NewHandle(element_array));
213613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < size; ++i) {
213713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    mirror::Object* new_member = CreateAnnotationMember(klass, annotation_class, annotation);
213813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (new_member == nullptr) {
213913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
214013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
214113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    h_element_array->SetWithoutChecks<false>(i, new_member);
214213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
214313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
214413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  JValue result;
214513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  ArtMethod* create_annotation_method =
214613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      soa.DecodeMethod(WellKnownClasses::libcore_reflect_AnnotationFactory_createAnnotation);
214713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t args[2] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(annotation_class.Get())),
214813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                       static_cast<uint32_t>(reinterpret_cast<uintptr_t>(h_element_array.Get())) };
214913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  create_annotation_method->Invoke(self, args, sizeof(args), &result, "LLL");
215013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  if (self->IsExceptionPending()) {
215113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    LOG(INFO) << "Exception in AnnotationFactory.createAnnotation";
215213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return nullptr;
215313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
215413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
215513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return result.GetL();
215613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
215713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
215813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst DexFile::AnnotationItem* DexFile::SearchAnnotationSet(const AnnotationSetItem* annotation_set,
215913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const char* descriptor, uint32_t visibility) const {
216013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* result = nullptr;
216113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  for (uint32_t i = 0; i < annotation_set->size_; ++i) {
216213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const AnnotationItem* annotation_item = GetAnnotationItem(annotation_set, i);
21637e50a7a5a1ad947e84c425efb2e97c442f91b155Jeff Hao    if (!IsVisibilityCompatible(annotation_item->visibility_, visibility)) {
216413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      continue;
216513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
216613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const uint8_t* annotation = annotation_item->annotation_;
216713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t type_index = DecodeUnsignedLeb128(&annotation);
216813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
216913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (strcmp(descriptor, StringByTypeIdx(type_index)) == 0) {
217013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      result = annotation_item;
217113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
217213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
217313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
217413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return result;
217513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
217613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
217713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haoconst uint8_t* DexFile::SearchEncodedAnnotation(const uint8_t* annotation, const char* name) const {
217813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  DecodeUnsignedLeb128(&annotation);  // unused type_index
217913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint32_t size = DecodeUnsignedLeb128(&annotation);
218013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
218113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  while (size != 0) {
218213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t element_name_index = DecodeUnsignedLeb128(&annotation);
218313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    const char* element_name = GetStringData(GetStringId(element_name_index));
218413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (strcmp(name, element_name) == 0) {
218513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return annotation;
218613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
218713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    SkipAnnotationValue(&annotation);
218813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    size--;
218913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
219013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return nullptr;
219113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
219213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
219313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haobool DexFile::SkipAnnotationValue(const uint8_t** annotation_ptr) const {
219413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const uint8_t* annotation = *annotation_ptr;
219513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t header_byte = *(annotation++);
219613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t value_type = header_byte & kDexAnnotationValueTypeMask;
219713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  uint8_t value_arg = header_byte >> kDexAnnotationValueArgShift;
219813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  int32_t width = value_arg + 1;
219913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
220013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  switch (value_type) {
220113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationByte:
220213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationShort:
220313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationChar:
220413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationInt:
220513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationLong:
220613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationFloat:
220713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationDouble:
220813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationString:
220913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationType:
221013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationMethod:
221113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationField:
221213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationEnum:
221313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
221413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationArray:
221513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    {
221613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t size = DecodeUnsignedLeb128(&annotation);
221713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      while (size--) {
221813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (!SkipAnnotationValue(&annotation)) {
221913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
222013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
222113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
222213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      width = 0;
222313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
222413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
222513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationAnnotation:
222613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    {
222713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      DecodeUnsignedLeb128(&annotation);  // unused type_index
222813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      uint32_t size = DecodeUnsignedLeb128(&annotation);
222913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      while (size--) {
223013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        DecodeUnsignedLeb128(&annotation);  // unused element_name_index
223113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        if (!SkipAnnotationValue(&annotation)) {
223213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao          return false;
223313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao        }
223413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      }
223513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      width = 0;
223613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
223713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
223813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationBoolean:
223913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    case kDexAnnotationNull:
224013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      width = 0;
224113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      break;
224213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    default:
224313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      LOG(FATAL) << StringPrintf("Bad annotation element value byte 0x%02x", value_type);
224413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return false;
224513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
224613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
224713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  annotation += width;
224813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  *annotation_ptr = annotation;
224913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  return true;
225013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao}
225113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
22520d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstromstd::ostream& operator<<(std::ostream& os, const DexFile& dex_file) {
22530d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  os << StringPrintf("[DexFile: %s dex-checksum=%08x location-checksum=%08x %p-%p]",
22540d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom                     dex_file.GetLocation().c_str(),
22550d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom                     dex_file.GetHeader().checksum_, dex_file.GetLocationChecksum(),
22560d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom                     dex_file.Begin(), dex_file.Begin() + dex_file.Size());
22570d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  return os;
22580d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom}
22594e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
2260d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogersstd::string Signature::ToString() const {
2261d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  if (dex_file_ == nullptr) {
2262d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    CHECK(proto_id_ == nullptr);
2263d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    return "<no signature>";
2264d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  }
2265d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const DexFile::TypeList* params = dex_file_->GetProtoParameters(*proto_id_);
2266d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  std::string result;
2267d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  if (params == nullptr) {
2268d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    result += "()";
2269d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  } else {
2270d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    result += "(";
2271d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    for (uint32_t i = 0; i < params->Size(); ++i) {
2272d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers      result += dex_file_->StringByTypeIdx(params->GetTypeItem(i).type_idx_);
2273d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    }
2274d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    result += ")";
2275d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  }
2276d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  result += dex_file_->StringByTypeIdx(proto_id_->return_type_idx_);
2277d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  return result;
2278d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers}
2279d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
2280d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Markobool Signature::operator==(const StringPiece& rhs) const {
2281d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  if (dex_file_ == nullptr) {
2282d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko    return false;
2283d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  }
2284d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  StringPiece tail(rhs);
2285d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  if (!tail.starts_with("(")) {
2286d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko    return false;  // Invalid signature
2287d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  }
2288d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  tail.remove_prefix(1);  // "(";
2289d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  const DexFile::TypeList* params = dex_file_->GetProtoParameters(*proto_id_);
2290d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  if (params != nullptr) {
2291d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko    for (uint32_t i = 0; i < params->Size(); ++i) {
2292d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko      StringPiece param(dex_file_->StringByTypeIdx(params->GetTypeItem(i).type_idx_));
2293d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko      if (!tail.starts_with(param)) {
2294d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko        return false;
2295d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko      }
2296d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko      tail.remove_prefix(param.length());
2297d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko    }
2298d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  }
2299d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  if (!tail.starts_with(")")) {
2300d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko    return false;
2301d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  }
2302d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  tail.remove_prefix(1);  // ")";
2303d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  return tail == dex_file_->StringByTypeIdx(proto_id_->return_type_idx_);
2304d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko}
2305d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko
2306d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogersstd::ostream& operator<<(std::ostream& os, const Signature& sig) {
2307d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  return os << sig.ToString();
2308d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers}
2309d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
23100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers// Decodes the header section from the class data bytes.
23110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersvoid ClassDataItemIterator::ReadClassDataHeader() {
23122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  CHECK(ptr_pos_ != nullptr);
23130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  header_.static_fields_size_ = DecodeUnsignedLeb128(&ptr_pos_);
23140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  header_.instance_fields_size_ = DecodeUnsignedLeb128(&ptr_pos_);
23150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  header_.direct_methods_size_ = DecodeUnsignedLeb128(&ptr_pos_);
23160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  header_.virtual_methods_size_ = DecodeUnsignedLeb128(&ptr_pos_);
23170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
23180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
23190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersvoid ClassDataItemIterator::ReadClassDataField() {
23200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  field_.field_idx_delta_ = DecodeUnsignedLeb128(&ptr_pos_);
23210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  field_.access_flags_ = DecodeUnsignedLeb128(&ptr_pos_);
232223682bf61e91a4c34373d55b085ab7cbade3ed1bVladimir Marko  // The user of the iterator is responsible for checking if there
232323682bf61e91a4c34373d55b085ab7cbade3ed1bVladimir Marko  // are unordered or duplicate indexes.
23240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
23250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
23260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersvoid ClassDataItemIterator::ReadClassDataMethod() {
23270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  method_.method_idx_delta_ = DecodeUnsignedLeb128(&ptr_pos_);
23280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  method_.access_flags_ = DecodeUnsignedLeb128(&ptr_pos_);
23290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  method_.code_off_ = DecodeUnsignedLeb128(&ptr_pos_);
233068adbe41c7d9295da2bfc521d737ba6dabd36c98Brian Carlstrom  if (last_idx_ != 0 && method_.method_idx_delta_ == 0) {
23314fdbba09cdb16840c675608730bcd056ef27cfd6Andreas Gampe    LOG(WARNING) << "Duplicate method in " << dex_file_.GetLocation();
23326f29d0e6d5444ff84157c922c23c221567dcc6c5Brian Carlstrom  }
23330571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
23340571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
23352cebb24bfc3247d3e9be138a3350106737455918Mathieu ChartierEncodedStaticFieldValueIterator::EncodedStaticFieldValueIterator(
233682863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji    const DexFile& dex_file,
233782863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji    const DexFile::ClassDef& class_def)
233850a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    : EncodedStaticFieldValueIterator(dex_file,
233950a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      nullptr,
234050a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      nullptr,
234150a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      nullptr,
234250a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      class_def,
234350a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      -1,
234450a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      kByte) {
234582863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji}
234682863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji
234782863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro HamajiEncodedStaticFieldValueIterator::EncodedStaticFieldValueIterator(
234850a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    const DexFile& dex_file,
234950a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    Handle<mirror::DexCache>* dex_cache,
235050a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    Handle<mirror::ClassLoader>* class_loader,
235150a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    ClassLinker* linker,
23522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    const DexFile::ClassDef& class_def)
235350a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    : EncodedStaticFieldValueIterator(dex_file,
235450a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      dex_cache, class_loader,
235550a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      linker,
235650a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      class_def,
235750a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      -1,
235850a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                      kByte) {
235950a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji  DCHECK(dex_cache_ != nullptr);
236050a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji  DCHECK(class_loader_ != nullptr);
236150a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji}
236250a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji
236350a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro HamajiEncodedStaticFieldValueIterator::EncodedStaticFieldValueIterator(
236450a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    const DexFile& dex_file,
236550a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    Handle<mirror::DexCache>* dex_cache,
236650a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    Handle<mirror::ClassLoader>* class_loader,
236750a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    ClassLinker* linker,
236850a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    const DexFile::ClassDef& class_def,
236950a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    size_t pos,
237050a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji    ValueType type)
237182863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji    : dex_file_(dex_file),
237282863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji      dex_cache_(dex_cache),
237382863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji      class_loader_(class_loader),
237482863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji      linker_(linker),
237582863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji      array_size_(),
237650a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji      pos_(pos),
237750a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji      type_(type) {
237850a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji  ptr_ = dex_file.GetEncodedStaticFieldValuesArray(class_def);
23792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (ptr_ == nullptr) {
23800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    array_size_ = 0;
23810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  } else {
23820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    array_size_ = DecodeUnsignedLeb128(&ptr_);
23830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
23840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (array_size_ > 0) {
23850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    Next();
23860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
23870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
23880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
23890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersvoid EncodedStaticFieldValueIterator::Next() {
23900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  pos_++;
23910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (pos_ >= array_size_) {
23920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return;
23930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
239413735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t value_type = *ptr_++;
239513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t value_arg = value_type >> kEncodedValueArgShift;
23960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t width = value_arg + 1;  // assume and correct later
239788f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom  type_ = static_cast<ValueType>(value_type & kEncodedValueTypeMask);
23980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  switch (type_) {
23990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kBoolean:
24000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = (value_arg != 0) ? 1 : 0;
24010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    width = 0;
24020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kByte:
24040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = ReadSignedInt(ptr_, value_arg);
2405ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe    CHECK(IsInt<8>(jval_.i));
24060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kShort:
24080571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = ReadSignedInt(ptr_, value_arg);
2409ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe    CHECK(IsInt<16>(jval_.i));
24100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kChar:
24120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = ReadUnsignedInt(ptr_, value_arg, false);
2413ab1eb0d1d047e3478ebb891e5259d2f1d1dd78bdAndreas Gampe    CHECK(IsUint<16>(jval_.i));
24140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kInt:
24160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = ReadSignedInt(ptr_, value_arg);
24170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kLong:
24190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.j = ReadSignedLong(ptr_, value_arg);
24200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kFloat:
24220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = ReadUnsignedInt(ptr_, value_arg, true);
24230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kDouble:
24250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.j = ReadUnsignedLong(ptr_, value_arg, true);
24260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kString:
24280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kType:
24290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    jval_.i = ReadUnsignedInt(ptr_, value_arg, false);
24300571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24310571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kField:
243288f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom  case kMethod:
243388f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom  case kEnum:
24340571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kArray:
24350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kAnnotation:
24360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    UNIMPLEMENTED(FATAL) << ": type " << type_;
24372c4257be8191c5eefde744e8965fcefc80a0a97dIan Rogers    UNREACHABLE();
24380571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  case kNull:
24392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    jval_.l = nullptr;
24400571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    width = 0;
24410571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    break;
24420571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  default:
24430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    LOG(FATAL) << "Unreached";
24442c4257be8191c5eefde744e8965fcefc80a0a97dIan Rogers    UNREACHABLE();
24450571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
24460571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  ptr_ += width;
24470571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
24480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
2449d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool kTransactionActive>
2450c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartiervoid EncodedStaticFieldValueIterator::ReadValueToField(ArtField* field) const {
245182863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  DCHECK(dex_cache_ != nullptr);
245282863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  DCHECK(class_loader_ != nullptr);
24530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  switch (type_) {
24542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    case kBoolean: field->SetBoolean<kTransactionActive>(field->GetDeclaringClass(), jval_.z);
24552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier        break;
2456d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kByte:    field->SetByte<kTransactionActive>(field->GetDeclaringClass(), jval_.b); break;
2457d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kShort:   field->SetShort<kTransactionActive>(field->GetDeclaringClass(), jval_.s); break;
2458d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kChar:    field->SetChar<kTransactionActive>(field->GetDeclaringClass(), jval_.c); break;
2459d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kInt:     field->SetInt<kTransactionActive>(field->GetDeclaringClass(), jval_.i); break;
2460d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kLong:    field->SetLong<kTransactionActive>(field->GetDeclaringClass(), jval_.j); break;
2461d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kFloat:   field->SetFloat<kTransactionActive>(field->GetDeclaringClass(), jval_.f); break;
2462d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    case kDouble:  field->SetDouble<kTransactionActive>(field->GetDeclaringClass(), jval_.d); break;
24632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    case kNull:    field->SetObject<kTransactionActive>(field->GetDeclaringClass(), nullptr); break;
24640571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    case kString: {
2465590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier      mirror::String* resolved = linker_->ResolveString(dex_file_, jval_.i, *dex_cache_);
2466d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      field->SetObject<kTransactionActive>(field->GetDeclaringClass(), resolved);
24670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      break;
24680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
246988f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom    case kType: {
2470590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier      mirror::Class* resolved = linker_->ResolveType(dex_file_, jval_.i, *dex_cache_,
2471590fee9e8972f872301c2d16a575d579ee564beeMathieu Chartier                                                     *class_loader_);
2472d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      field->SetObject<kTransactionActive>(field->GetDeclaringClass(), resolved);
247388f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom      break;
247488f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom    }
24750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    default: UNIMPLEMENTED(FATAL) << ": type " << type_;
24760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
24770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
2478c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartiertemplate void EncodedStaticFieldValueIterator::ReadValueToField<true>(ArtField* field) const;
2479c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartiertemplate void EncodedStaticFieldValueIterator::ReadValueToField<false>(ArtField* field) const;
24800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
24810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian RogersCatchHandlerIterator::CatchHandlerIterator(const DexFile::CodeItem& code_item, uint32_t address) {
24820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  handler_.address_ = -1;
24830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  int32_t offset = -1;
24840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
24850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Short-circuit the overwhelmingly common cases.
24860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  switch (code_item.tries_size_) {
24870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    case 0:
24880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      break;
24890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    case 1: {
24900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      const DexFile::TryItem* tries = DexFile::GetTryItems(code_item, 0);
24910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      uint32_t start = tries->start_addr_;
24920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      if (address >= start) {
24930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        uint32_t end = start + tries->insn_count_;
24940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        if (address < end) {
24950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers          offset = tries->handler_off_;
24960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers        }
24970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      }
24980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      break;
24990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
25000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    default:
2501dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers      offset = DexFile::FindCatchHandlerOffset(code_item, address);
25020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
2503736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien  Init(code_item, offset);
2504736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien}
2505736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien
2506736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan ChienCatchHandlerIterator::CatchHandlerIterator(const DexFile::CodeItem& code_item,
2507736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien                                           const DexFile::TryItem& try_item) {
2508736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien  handler_.address_ = -1;
2509736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien  Init(code_item, try_item.handler_off_);
2510736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien}
2511736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien
2512736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chienvoid CatchHandlerIterator::Init(const DexFile::CodeItem& code_item,
2513736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien                                int32_t offset) {
25140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (offset >= 0) {
2515736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien    Init(DexFile::GetCatchHandlerData(code_item, offset));
25160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  } else {
25170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    // Not found, initialize as empty
25182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    current_data_ = nullptr;
25190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    remaining_count_ = -1;
25200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    catch_all_ = false;
25210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    DCHECK(!HasNext());
25220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
25230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
25240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
252513735955f39b3b304c37d2b2840663c131262c18Ian Rogersvoid CatchHandlerIterator::Init(const uint8_t* handler_data) {
25260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  current_data_ = handler_data;
25270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  remaining_count_ = DecodeSignedLeb128(&current_data_);
25280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
25290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // If remaining_count_ is non-positive, then it is the negative of
25300571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // the number of catch types, and the catches are followed by a
25310571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // catch-all handler.
25320571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (remaining_count_ <= 0) {
25330571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    catch_all_ = true;
25340571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    remaining_count_ = -remaining_count_;
25350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  } else {
25360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    catch_all_ = false;
25370571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
25380571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  Next();
25390571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
25400571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
25410571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersvoid CatchHandlerIterator::Next() {
25420571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (remaining_count_ > 0) {
25430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    handler_.type_idx_ = DecodeUnsignedLeb128(&current_data_);
25440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    handler_.address_  = DecodeUnsignedLeb128(&current_data_);
25450571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    remaining_count_--;
25460571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return;
25470571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
25480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
25490571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  if (catch_all_) {
25500571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    handler_.type_idx_ = DexFile::kDexNoIndex16;
25510571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    handler_.address_  = DecodeUnsignedLeb128(&current_data_);
25520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    catch_all_ = false;
25530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return;
25540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
25550571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
25560571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // no more handler
25570571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  remaining_count_ = -1;
25580571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers}
25590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
25601fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}  // namespace art
2561