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, ¶m_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 ¶meter_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(¤t_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(¤t_data_); 25440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers handler_.address_ = DecodeUnsignedLeb128(¤t_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(¤t_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