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
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_DEX_FILE_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_DEX_FILE_H_
191fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
20700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory>
210c424cb96c8e7d6d5e5c9399036481619eba556cElliott Hughes#include <string>
2268b56858367e29461ae290fd797443a1ef6d8005Ian Rogers#include <unordered_map>
2374eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom#include <vector>
247e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2507ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h"
26b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers#include "base/mutex.h"  // For Locks::mutator_lock_.
2703b6eafba8ace9a9c4d5ee9c47723d1910ccd7a8Ian Rogers#include "base/value_object.h"
28578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "globals.h"
2908f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers#include "invoke_type.h"
306bf1915f20a11748d8d4b78ad020172bb2e6c946Jesse Wilson#include "jni.h"
3113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao#include "jvalue.h"
3213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao#include "mirror/object_array.h"
3308f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers#include "modifiers.h"
3468b56858367e29461ae290fd797443a1ef6d8005Ian Rogers#include "utf.h"
351fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
361fb8620309a4e94d11879aabc33364acfa733904Carl Shapironamespace art {
371fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
38e810452722ac83b294d1f7aa80bdd88e547d5af0Brian Carlstrom// TODO: remove dependencies on mirror classes, primarily by moving
39e810452722ac83b294d1f7aa80bdd88e547d5af0Brian Carlstrom// EncodedStaticFieldValueIterator to its own file.
402dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror {
41ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  class ClassLoader;
42ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  class DexCache;
432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}  // namespace mirror
44c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartierclass ArtField;
45e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierclass ArtMethod;
462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersclass ClassLinker;
472a5c4681ba19411c1cb22e9a7ab446dab910af1cAndreas Gampetemplate <class Key, class Value, class EmptyFn, class HashFn, class Pred, class Alloc>
482a5c4681ba19411c1cb22e9a7ab446dab910af1cAndreas Gampeclass HashMap;
49576ca0cd692c0b6ae70e776de91015b8ff000a08Ian Rogersclass MemMap;
5007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhlerclass OatDexFile;
51d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogersclass Signature;
52eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartiertemplate<class T> class Handle;
53fc0e94bed3f88ed7e50854fd8dfaf5dcb345250fIan Rogersclass StringPiece;
54d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenkoclass TypeLookupTable;
55a6cc893c4b142cd410fc956963b6f5a014e983adBrian Carlstromclass ZipArchive;
56a6cc893c4b142cd410fc956963b6f5a014e983adBrian Carlstrom
577e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom// TODO: move all of the macro functionality into the DexCache class.
58f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstromclass DexFile {
591fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro public:
6031349988d7c44fe453bde9525fd10a371e543c28Roland Levillain  // First Dex format version supporting default methods.
61f0fe04cbaf189702e9dad7252ed834cb4735c877Alex Light  static const uint32_t kDefaultMethodsVersion = 37;
6231349988d7c44fe453bde9525fd10a371e543c28Roland Levillain  // First Dex format version enforcing class definition ordering rules.
6331349988d7c44fe453bde9525fd10a371e543c28Roland Levillain  static const uint32_t kClassDefinitionOrderEnforcedVersion = 37;
6431349988d7c44fe453bde9525fd10a371e543c28Roland Levillain
6513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static const uint8_t kDexMagic[];
66c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  static constexpr size_t kNumDexVersions = 2;
67c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  static constexpr size_t kDexVersionLen = 4;
68c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  static const uint8_t kDexMagicVersions[kNumDexVersions][kDexVersionLen];
69c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light
7013735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static constexpr size_t kSha1DigestSize = 20;
7113735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static constexpr uint32_t kDexEndianConstant = 0x12345678;
727e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
73b7bbba49d88eae58223d9878da4069bf6d7140bfBrian Carlstrom  // name of the DexFile entry within a zip archive
74b7bbba49d88eae58223d9878da4069bf6d7140bfBrian Carlstrom  static const char* kClassesDex;
75b7bbba49d88eae58223d9878da4069bf6d7140bfBrian Carlstrom
767e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // The value of an invalid index.
777e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  static const uint32_t kDexNoIndex = 0xFFFFFFFF;
787e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // The value of an invalid index.
800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  static const uint16_t kDexNoIndex16 = 0xFFFF;
811fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
82c49618160d5fa64ca4883d2e09fa34b83491c8eaAlex Light  // The separator character in MultiDex locations.
83833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  static constexpr char kMultiDexSeparator = ':';
84833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
85833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // A string version of the previous. This is a define so that we can merge string literals in the
86833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // preprocessor.
87833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  #define kMultiDexSeparatorString ":"
88833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
897e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw header_item.
907e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct Header {
917e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint8_t magic_[8];
927934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom    uint32_t checksum_;  // See also location_checksum_
937e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint8_t signature_[kSha1DigestSize];
94f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao    uint32_t file_size_;  // size of entire file
957e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t header_size_;  // offset to start of next section
967e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t endian_tag_;
970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t link_size_;  // unused
980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t link_off_;  // unused
990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t map_off_;  // unused
1000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t string_ids_size_;  // number of StringIds
1010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t string_ids_off_;  // file offset of StringIds array
1020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t type_ids_size_;  // number of TypeIds, we don't support more than 65535
1030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t type_ids_off_;  // file offset of TypeIds array
1040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t proto_ids_size_;  // number of ProtoIds, we don't support more than 65535
1050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t proto_ids_off_;  // file offset of ProtoIds array
1060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t field_ids_size_;  // number of FieldIds
1070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t field_ids_off_;  // file offset of FieldIds array
1080571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t method_ids_size_;  // number of MethodIds
1090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t method_ids_off_;  // file offset of MethodIds array
1100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t class_defs_size_;  // number of ClassDefs
1110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t class_defs_off_;  // file offset of ClassDef array
1120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t data_size_;  // unused
1130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t data_off_;  // unused
114a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
11576ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe    // Decode the dex magic version
11676ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe    uint32_t GetVersion() const;
11776ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe
118d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
119d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(Header);
1207e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
1211fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
12210037c866b04550fc5461058c398c2e3e509381ajeffhao  // Map item type codes.
12310037c866b04550fc5461058c398c2e3e509381ajeffhao  enum {
12410037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeHeaderItem               = 0x0000,
12510037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeStringIdItem             = 0x0001,
12610037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeTypeIdItem               = 0x0002,
12710037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeProtoIdItem              = 0x0003,
12810037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeFieldIdItem              = 0x0004,
12910037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeMethodIdItem             = 0x0005,
13010037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeClassDefItem             = 0x0006,
13110037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeMapList                  = 0x1000,
13210037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeTypeList                 = 0x1001,
13310037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeAnnotationSetRefList     = 0x1002,
13410037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeAnnotationSetItem        = 0x1003,
13510037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeClassDataItem            = 0x2000,
13610037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeCodeItem                 = 0x2001,
13710037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeStringDataItem           = 0x2002,
13810037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeDebugInfoItem            = 0x2003,
13910037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeAnnotationItem           = 0x2004,
14010037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeEncodedArrayItem         = 0x2005,
14110037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexTypeAnnotationsDirectoryItem = 0x2006,
14210037c866b04550fc5461058c398c2e3e509381ajeffhao  };
14310037c866b04550fc5461058c398c2e3e509381ajeffhao
14410037c866b04550fc5461058c398c2e3e509381ajeffhao  struct MapItem {
14510037c866b04550fc5461058c398c2e3e509381ajeffhao    uint16_t type_;
14610037c866b04550fc5461058c398c2e3e509381ajeffhao    uint16_t unused_;
14710037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t size_;
14810037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t offset_;
149a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
15010037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
15110037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(MapItem);
15210037c866b04550fc5461058c398c2e3e509381ajeffhao  };
15310037c866b04550fc5461058c398c2e3e509381ajeffhao
15410037c866b04550fc5461058c398c2e3e509381ajeffhao  struct MapList {
15510037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t size_;
15610037c866b04550fc5461058c398c2e3e509381ajeffhao    MapItem list_[1];
157a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
15810037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
15910037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(MapList);
16010037c866b04550fc5461058c398c2e3e509381ajeffhao  };
16110037c866b04550fc5461058c398c2e3e509381ajeffhao
1627e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw string_id_item.
1637e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct StringId {
1647e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t string_data_off_;  // offset in bytes from the base address
165a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
166d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
167d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(StringId);
1687e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
1697e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
1707e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw type_id_item.
1717e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct TypeId {
1727e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t descriptor_idx_;  // index into string_ids
173a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
174d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
175d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(TypeId);
1767e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
1777e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
1787e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw field_id_item.
1797e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct FieldId {
1800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t class_idx_;  // index into type_ids_ array for defining class
1810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t type_idx_;  // index into type_ids_ array for field type
1820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t name_idx_;  // index into string_ids_ array for field name
183a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
184d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
185d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(FieldId);
1867e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
1877e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
1887e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw method_id_item.
1897e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct MethodId {
1900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t class_idx_;  // index into type_ids_ array for defining class
1910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t proto_idx_;  // index into proto_ids_ array for method prototype
1920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t name_idx_;  // index into string_ids_ array for method name
193a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
194d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
195d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(MethodId);
1967e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
1977e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
1987e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw proto_id_item.
1997e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct ProtoId {
2000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t shorty_idx_;  // index into string_ids array for shorty descriptor
2010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t return_type_idx_;  // index into type_ids array for return type
2020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t pad_;             // padding = 0
2037e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t parameters_off_;  // file offset to type_list for parameter types
204a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
205d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
206d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(ProtoId);
2077e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
2087e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2097e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw class_def_item.
2107e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct ClassDef {
2110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t class_idx_;  // index into type_ids_ array for this class
2120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t pad1_;  // padding = 0
2137e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t access_flags_;
2140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t superclass_idx_;  // index into type_ids_ array for superclass
2150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t pad2_;  // padding = 0
2167e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t interfaces_off_;  // file offset to TypeList
2174a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom    uint32_t source_file_idx_;  // index into string_ids_ for source file name
2187e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t annotations_off_;  // file offset to annotations_directory_item
2197e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t class_data_off_;  // file offset to class_data_item
2207e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t static_values_off_;  // file offset to EncodedArray
221a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
2225182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    // Returns the valid access flags, that is, Java modifier bits relevant to the ClassDef type
2235182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    // (class or interface). These are all in the lower 16b and do not contain runtime flags.
2245182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    uint32_t GetJavaAccessFlags() const {
2255182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      // Make sure that none of our runtime-only flags are set.
226575e78c41ece0dec969d31f46be563d4eb7ae43bAndreas Gampe      static_assert((kAccValidClassFlags & kAccJavaFlagsMask) == kAccValidClassFlags,
227575e78c41ece0dec969d31f46be563d4eb7ae43bAndreas Gampe                    "Valid class flags not a subset of Java flags");
228575e78c41ece0dec969d31f46be563d4eb7ae43bAndreas Gampe      static_assert((kAccValidInterfaceFlags & kAccJavaFlagsMask) == kAccValidInterfaceFlags,
229575e78c41ece0dec969d31f46be563d4eb7ae43bAndreas Gampe                    "Valid interface flags not a subset of Java flags");
2305182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe
2315182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      if ((access_flags_ & kAccInterface) != 0) {
2325182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe        // Interface.
2335182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe        return access_flags_ & kAccValidInterfaceFlags;
2345182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      } else {
2355182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe        // Class.
2365182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe        return access_flags_ & kAccValidClassFlags;
2375182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      }
2385182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    }
2395182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe
240d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
241d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(ClassDef);
2427e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
2437e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2447e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw type_item.
2457e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct TypeItem {
2467e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint16_t type_idx_;  // index into type_ids section
247a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
248d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
249d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(TypeItem);
2507e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
2517e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2527e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw type_list.
2537e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  class TypeList {
2547e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom   public:
2557e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t Size() const {
2567e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom      return size_;
2577e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
2587e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2597e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    const TypeItem& GetTypeItem(uint32_t idx) const {
260b24bd9912579358687d45aec748853f1c53b4774Sebastien Hertz      DCHECK_LT(idx, this->size_);
2617e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom      return this->list_[idx];
2627e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
2637e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
26431a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe    // Size in bytes of the part of the list that is common.
26531a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe    static constexpr size_t GetHeaderSize() {
26631a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe      return 4U;
26731a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe    }
26831a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe
26931a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe    // Size in bytes of the whole type list including all the stored elements.
27031a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe    static constexpr size_t GetListSize(size_t count) {
27131a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe      return GetHeaderSize() + sizeof(TypeItem) * count;
27231a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe    }
27331a7a0c981c5f6244b2c8c3a0c39f3e1d41ce154Andreas Gampe
2747e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom   private:
2757e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    uint32_t size_;  // size of the list, in entries
2767e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    TypeItem list_[1];  // elements of the list
277d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(TypeList);
2787e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
2797e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2807e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Raw code_item.
2817e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  struct CodeItem {
282c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin    uint16_t registers_size_;            // the number of registers used by this code
283c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin                                         //   (locals + parameters)
284c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin    uint16_t ins_size_;                  // the number of words of incoming arguments to the method
285c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin                                         //   that this code is for
286c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin    uint16_t outs_size_;                 // the number of words of outgoing argument space required
287c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin                                         //   by this code for method invocation
288c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin    uint16_t tries_size_;                // the number of try_items for this instance. If non-zero,
289c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin                                         //   then these appear as the tries array just after the
290c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin                                         //   insns in this instance.
291c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin    uint32_t debug_info_off_;            // file offset to debug info stream
292d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers    uint32_t insns_size_in_code_units_;  // size of the insns array, in 2 byte code units
293c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin    uint16_t insns_[1];                  // actual array of bytecode.
294a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
295d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
296d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(CodeItem);
2977e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  };
2987e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
2992eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro  // Raw try_item.
3002eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro  struct TryItem {
3012eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro    uint32_t start_addr_;
3022eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro    uint16_t insn_count_;
3032eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro    uint16_t handler_off_;
304a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
305d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
306d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(TryItem);
3072eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro  };
3082eaa968bcd171248c50cea0bbe2c5cfdf9aabb80Carl Shapiro
30910037c866b04550fc5461058c398c2e3e509381ajeffhao  // Annotation constants.
31010037c866b04550fc5461058c398c2e3e509381ajeffhao  enum {
31110037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexVisibilityBuild         = 0x00,     /* annotation visibility */
31210037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexVisibilityRuntime       = 0x01,
31310037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexVisibilitySystem        = 0x02,
31410037c866b04550fc5461058c398c2e3e509381ajeffhao
31510037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationByte          = 0x00,
31610037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationShort         = 0x02,
31710037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationChar          = 0x03,
31810037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationInt           = 0x04,
31910037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationLong          = 0x06,
32010037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationFloat         = 0x10,
32110037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationDouble        = 0x11,
32210037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationString        = 0x17,
32310037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationType          = 0x18,
32410037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationField         = 0x19,
32510037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationMethod        = 0x1a,
32610037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationEnum          = 0x1b,
32710037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationArray         = 0x1c,
32810037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationAnnotation    = 0x1d,
32910037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationNull          = 0x1e,
33010037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationBoolean       = 0x1f,
33110037c866b04550fc5461058c398c2e3e509381ajeffhao
33210037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationValueTypeMask = 0x1f,     /* low 5 bits */
33310037c866b04550fc5461058c398c2e3e509381ajeffhao    kDexAnnotationValueArgShift = 5,
33410037c866b04550fc5461058c398c2e3e509381ajeffhao  };
33510037c866b04550fc5461058c398c2e3e509381ajeffhao
33610037c866b04550fc5461058c398c2e3e509381ajeffhao  struct AnnotationsDirectoryItem {
33710037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t class_annotations_off_;
33810037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t fields_size_;
33910037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t methods_size_;
34010037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t parameters_size_;
341a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
34210037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
34310037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(AnnotationsDirectoryItem);
34410037c866b04550fc5461058c398c2e3e509381ajeffhao  };
34510037c866b04550fc5461058c398c2e3e509381ajeffhao
34610037c866b04550fc5461058c398c2e3e509381ajeffhao  struct FieldAnnotationsItem {
34710037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t field_idx_;
34810037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t annotations_off_;
349a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
35010037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
35110037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(FieldAnnotationsItem);
35210037c866b04550fc5461058c398c2e3e509381ajeffhao  };
35310037c866b04550fc5461058c398c2e3e509381ajeffhao
35410037c866b04550fc5461058c398c2e3e509381ajeffhao  struct MethodAnnotationsItem {
35510037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t method_idx_;
35610037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t annotations_off_;
357a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
35810037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
35910037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(MethodAnnotationsItem);
36010037c866b04550fc5461058c398c2e3e509381ajeffhao  };
36110037c866b04550fc5461058c398c2e3e509381ajeffhao
36210037c866b04550fc5461058c398c2e3e509381ajeffhao  struct ParameterAnnotationsItem {
36310037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t method_idx_;
36410037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t annotations_off_;
365a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
36610037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
36710037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(ParameterAnnotationsItem);
36810037c866b04550fc5461058c398c2e3e509381ajeffhao  };
36910037c866b04550fc5461058c398c2e3e509381ajeffhao
37010037c866b04550fc5461058c398c2e3e509381ajeffhao  struct AnnotationSetRefItem {
37110037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t annotations_off_;
372a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
37310037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
37410037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefItem);
37510037c866b04550fc5461058c398c2e3e509381ajeffhao  };
37610037c866b04550fc5461058c398c2e3e509381ajeffhao
37710037c866b04550fc5461058c398c2e3e509381ajeffhao  struct AnnotationSetRefList {
37810037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t size_;
37910037c866b04550fc5461058c398c2e3e509381ajeffhao    AnnotationSetRefItem list_[1];
380a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
38110037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
38210037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefList);
38310037c866b04550fc5461058c398c2e3e509381ajeffhao  };
38410037c866b04550fc5461058c398c2e3e509381ajeffhao
38510037c866b04550fc5461058c398c2e3e509381ajeffhao  struct AnnotationSetItem {
38610037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t size_;
38710037c866b04550fc5461058c398c2e3e509381ajeffhao    uint32_t entries_[1];
388a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
38910037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
39010037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(AnnotationSetItem);
39110037c866b04550fc5461058c398c2e3e509381ajeffhao  };
39210037c866b04550fc5461058c398c2e3e509381ajeffhao
39310037c866b04550fc5461058c398c2e3e509381ajeffhao  struct AnnotationItem {
39410037c866b04550fc5461058c398c2e3e509381ajeffhao    uint8_t visibility_;
39510037c866b04550fc5461058c398c2e3e509381ajeffhao    uint8_t annotation_[1];
396a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
39710037c866b04550fc5461058c398c2e3e509381ajeffhao   private:
39810037c866b04550fc5461058c398c2e3e509381ajeffhao    DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
39910037c866b04550fc5461058c398c2e3e509381ajeffhao  };
40010037c866b04550fc5461058c398c2e3e509381ajeffhao
40113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  struct AnnotationValue {
40213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    JValue value_;
40313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint8_t type_;
40413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  };
40513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
40613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  enum AnnotationResultStyle {  // private
40713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    kAllObjects,
40813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    kPrimitivesOrObjects,
40913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    kAllRaw
41013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  };
41113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
4125b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // Returns the checksum of a file for comparison with GetLocationChecksum().
4135b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // For .dex files, this is the header checksum.
4145b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // For zip files, this is the classes.dex zip entry CRC32 checksum.
4155b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // Return true if the checksum could be found, false otherwise.
4168d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  static bool GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg);
41778128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom
418833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Opens .dex files found in the container, guessing the container format based on file extension.
419833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  static bool Open(const char* filename, const char* location, std::string* error_msg,
420fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                   std::vector<std::unique_ptr<const DexFile>>* dex_files);
421262bf46ddc91e5b4fbd367127ff21a1877d939f2jeffhao
4220cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  // Checks whether the given file has the dex magic, or is a zip file with a classes.dex entry.
4230cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  // If this function returns false, Open will not succeed. The inverse is not true, however.
4240cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe  static bool MaybeDex(const char* filename);
4250cba004b97245300d7f39318d5921ee8edbef1acAndreas Gampe
42689521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom  // Opens .dex file, backed by existing memory
427fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  static std::unique_ptr<const DexFile> Open(const uint8_t* base, size_t size,
428fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                             const std::string& location,
429fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                             uint32_t location_checksum,
43007b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler                                             const OatDexFile* oat_dex_file,
4313a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             bool verify,
4323a2bd29d274f60fdcfabebb052078edef0190164Andreas Gampe                                             std::string* error_msg);
43389521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom
434833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Open all classesXXX.dex files from a zip archive.
435833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  static bool OpenFromZip(const ZipArchive& zip_archive, const std::string& location,
436fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                          std::string* error_msg,
437fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                          std::vector<std::unique_ptr<const DexFile>>* dex_files);
438a6cc893c4b142cd410fc956963b6f5a014e983adBrian Carlstrom
4397e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Closes a .dex file.
440f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  virtual ~DexFile();
4417e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
442a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  const std::string& GetLocation() const {
443a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom    return location_;
444a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  }
445a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
446cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe  // For normal dex files, location and base location coincide. If a dex file is part of a multidex
447cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe  // archive, the base location is the name of the originating jar/apk, stripped of any internal
448cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe  // classes*.dex path.
449aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  static std::string GetBaseLocation(const char* location) {
450aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    const char* pos = strrchr(location, kMultiDexSeparator);
451aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    if (pos == nullptr) {
452aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko      return location;
453cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe    } else {
454aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko      return std::string(location, pos - location);
455aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    }
456aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko  }
457aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko
458e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  static std::string GetBaseLocation(const std::string& location) {
459e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler    return GetBaseLocation(location.c_str());
460e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  }
461e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler
462e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  // Returns the ':classes*.dex' part of the dex location. Returns an empty
463e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  // string if there is no multidex suffix for the given location.
464e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  // The kMultiDexSeparator is included in the returned suffix.
465e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  static std::string GetMultiDexSuffix(const std::string& location) {
466e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler    size_t pos = location.rfind(kMultiDexSeparator);
467aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    if (pos == std::string::npos) {
468e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler      return "";
469aa4497db59f1eeec954f2ba5da6d458fcdf9b3a4Vladimir Marko    } else {
470e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler      return location.substr(pos);
471cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe    }
472cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe  }
473cb8f9e8a2941971c049b26745ea713c859342d9bAndreas Gampe
474e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  std::string GetBaseLocation() const {
475e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler    return GetBaseLocation(location_);
476e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler  }
477e5fed03772144595c0904faf3d6974cc55214c8cRichard Uhler
4785b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // For DexFiles directly from .dex files, this is the checksum from the DexFile::Header.
4795b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  // For DexFiles opened from a zip files, this will be the ZipEntry CRC32 of classes.dex.
4805b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  uint32_t GetLocationChecksum() const {
4815b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom    return location_checksum_;
4825b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  }
4835b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
484a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  const Header& GetHeader() const {
4852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
4867e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    return *header_;
4870e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  }
4880e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
4890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Decode the dex magic version
49076ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe  uint32_t GetVersion() const {
49176ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe    return GetHeader().GetVersion();
49276ed99d5ec208d5adcd63b41c2c290194ee0ecf7Andreas Gampe  }
493d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers
4946e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom  // Returns true if the byte string points to the magic value.
49513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static bool IsMagicValid(const uint8_t* magic);
4966e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom
4976e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom  // Returns true if the byte string after the magic is the correct value.
49813735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static bool IsVersionValid(const uint8_t* magic);
4996e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom
5007e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Returns the number of string identifiers in the .dex file.
5017e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  size_t NumStringIds() const {
5022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
5037e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    return header_->string_ids_size_;
5040e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  }
5050e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
5060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the StringId at the specified index.
5070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const StringId& GetStringId(uint32_t idx) const {
5084f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers    DCHECK_LT(idx, NumStringIds()) << GetLocation();
5090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return string_ids_[idx];
5105fafe2b12d465cdee6fab76a06c78cef0a6776b6Carl Shapiro  }
5115fafe2b12d465cdee6fab76a06c78cef0a6776b6Carl Shapiro
5120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t GetIndexForStringId(const StringId& string_id) const {
51361e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_GE(&string_id, string_ids_) << GetLocation();
51461e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_LT(&string_id, string_ids_ + header_->string_ids_size_) << GetLocation();
5150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return &string_id - string_ids_;
5165fafe2b12d465cdee6fab76a06c78cef0a6776b6Carl Shapiro  }
5175fafe2b12d465cdee6fab76a06c78cef0a6776b6Carl Shapiro
5180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  int32_t GetStringLength(const StringId& string_id) const;
5190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
520dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  // Returns a pointer to the UTF-8 string data referred to by the given string_id as well as the
521dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  // length of the string when decoded as a UTF-16 string. Note the UTF-16 length is not the same
522dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  // as the string length of the string data.
523dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  const char* GetStringDataAndUtf16Length(const StringId& string_id, uint32_t* utf16_length) const;
5240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
5250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* GetStringData(const StringId& string_id) const {
526dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers    uint32_t ignored;
527dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers    return GetStringDataAndUtf16Length(string_id, &ignored);
5280e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  }
5290e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
530dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  // Index version of GetStringDataAndUtf16Length.
531dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  const char* StringDataAndUtf16LengthByIdx(uint32_t idx, uint32_t* utf16_length) const {
5320571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (idx == kDexNoIndex) {
533dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers      *utf16_length = 0;
5342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier      return nullptr;
5350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
5360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const StringId& string_id = GetStringId(idx);
537dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers    return GetStringDataAndUtf16Length(string_id, utf16_length);
5380e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro  }
5390e5d75d5ca2b8a44fab0c862276a466cbab39859Carl Shapiro
5400571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* StringDataByIdx(uint32_t idx) const {
54145651fde99f52546e71241bb0e8a10d16a9f216aElliott Hughes    uint32_t unicode_length;
542dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers    return StringDataAndUtf16LengthByIdx(idx, &unicode_length);
5430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
5440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
545637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  // Looks up a string id for a given modified utf8 string.
546637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  const StringId* FindStringId(const char* string) const;
547637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers
548d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  const TypeId* FindTypeId(const char* string) const;
549d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko
550637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  // Looks up a string id for a given utf16 string.
551a48aef4234768ed37828df613919391c21f561a7Vladimir Marko  const StringId* FindStringId(const uint16_t* string, size_t length) const;
5520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
5530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the number of type identifiers in the .dex file.
55468b56858367e29461ae290fd797443a1ef6d8005Ian Rogers  uint32_t NumTypeIds() const {
5552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
5560571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_->type_ids_size_;
557578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
5581fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
5590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the TypeId at the specified index.
5600571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const TypeId& GetTypeId(uint32_t idx) const {
5614f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers    DCHECK_LT(idx, NumTypeIds()) << GetLocation();
5620571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return type_ids_[idx];
563578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
5641fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
5650571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint16_t GetIndexForTypeId(const TypeId& type_id) const {
56661e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_GE(&type_id, type_ids_) << GetLocation();
56761e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_LT(&type_id, type_ids_ + header_->type_ids_size_) << GetLocation();
5680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    size_t result = &type_id - type_ids_;
56961e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    DCHECK_LT(result, 65536U) << GetLocation();
5700571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return static_cast<uint16_t>(result);
571578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
5721fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
5730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Get the descriptor string associated with a given type index.
57445651fde99f52546e71241bb0e8a10d16a9f216aElliott Hughes  const char* StringByTypeIdx(uint32_t idx, uint32_t* unicode_length) const {
5750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const TypeId& type_id = GetTypeId(idx);
576dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers    return StringDataAndUtf16LengthByIdx(type_id.descriptor_idx_, unicode_length);
5770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
5780571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
5790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* StringByTypeIdx(uint32_t idx) const {
5800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    const TypeId& type_id = GetTypeId(idx);
5810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringDataByIdx(type_id.descriptor_idx_);
582578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
5831fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
584d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom  // Returns the type descriptor string of a type id.
585d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom  const char* GetTypeDescriptor(const TypeId& type_id) const {
5860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringDataByIdx(type_id.descriptor_idx_);
5870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
5880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
5890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Looks up a type for the given string index
5900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const TypeId* FindTypeId(uint32_t string_idx) const;
5910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
5920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the number of field identifiers in the .dex file.
5930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t NumFieldIds() const {
5942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
5950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_->field_ids_size_;
5960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
5970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
5980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the FieldId at the specified index.
5990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const FieldId& GetFieldId(uint32_t idx) const {
600b24bd9912579358687d45aec748853f1c53b4774Sebastien Hertz    DCHECK_LT(idx, NumFieldIds()) << GetLocation();
6010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return field_ids_[idx];
602d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom  }
603d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom
6049b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  uint32_t GetIndexForFieldId(const FieldId& field_id) const {
60561e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_GE(&field_id, field_ids_) << GetLocation();
60661e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_LT(&field_id, field_ids_ + header_->field_ids_size_) << GetLocation();
6079b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers    return &field_id - field_ids_;
6089b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  }
6099b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers
6109b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  // Looks up a field by its declaring class, name and type
6119b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  const FieldId* FindFieldId(const DexFile::TypeId& declaring_klass,
6129b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers                             const DexFile::StringId& name,
6139b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers                             const DexFile::TypeId& type) const;
6149b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers
6156b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  // Returns the declaring class descriptor string of a field id.
6166b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  const char* GetFieldDeclaringClassDescriptor(const FieldId& field_id) const {
617b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom    const DexFile::TypeId& type_id = GetTypeId(field_id.class_idx_);
618b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom    return GetTypeDescriptor(type_id);
619b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom  }
620b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom
6216b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  // Returns the class descriptor string of a field id.
6226b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  const char* GetFieldTypeDescriptor(const FieldId& field_id) const {
6236b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    const DexFile::TypeId& type_id = GetTypeId(field_id.type_idx_);
6246b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom    return GetTypeDescriptor(type_id);
6256b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  }
6266b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom
627b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom  // Returns the name of a field id.
628b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom  const char* GetFieldName(const FieldId& field_id) const {
6290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringDataByIdx(field_id.name_idx_);
6300571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
6310571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
6320571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the number of method identifiers in the .dex file.
6330571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t NumMethodIds() const {
6342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
6350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_->method_ids_size_;
6360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
6370571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
6380571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the MethodId at the specified index.
6390571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const MethodId& GetMethodId(uint32_t idx) const {
6404f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers    DCHECK_LT(idx, NumMethodIds()) << GetLocation();
6410571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return method_ids_[idx];
642b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom  }
643b9edb841423dfe60e193fcffd25994398c91baa2Brian Carlstrom
6440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t GetIndexForMethodId(const MethodId& method_id) const {
64561e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_GE(&method_id, method_ids_) << GetLocation();
64661e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_LT(&method_id, method_ids_ + header_->method_ids_size_) << GetLocation();
6470571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return &method_id - method_ids_;
6480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
6490571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
6509b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  // Looks up a method by its declaring class, name and proto_id
6519b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers  const MethodId* FindMethodId(const DexFile::TypeId& declaring_klass,
6529b1a4f425711c26d0465d54a1cb95ec4a813322aIan Rogers                               const DexFile::StringId& name,
6530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers                               const DexFile::ProtoId& signature) const;
6540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
6556b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  // Returns the declaring class descriptor string of a method id.
6566b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom  const char* GetMethodDeclaringClassDescriptor(const MethodId& method_id) const {
6577540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom    const DexFile::TypeId& type_id = GetTypeId(method_id.class_idx_);
6587540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom    return GetTypeDescriptor(type_id);
6597540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom  }
6607540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom
66198eacac683b78e60799323e8c7d59e7214808639jeffhao  // Returns the prototype of a method id.
662aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  const ProtoId& GetMethodPrototype(const MethodId& method_id) const {
663aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom    return GetProtoId(method_id.proto_idx_);
664aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom  }
665aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
666d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  // Returns a representation of the signature of a method id.
667d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const Signature GetMethodSignature(const MethodId& method_id) const;
66898eacac683b78e60799323e8c7d59e7214808639jeffhao
6697540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom  // Returns the name of a method id.
6707540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom  const char* GetMethodName(const MethodId& method_id) const {
6710571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringDataByIdx(method_id.name_idx_);
67268ad649d3918f2eed3a37209c01a7f0a0faf09f0Calin Juravle  }
67368ad649d3918f2eed3a37209c01a7f0a0faf09f0Calin Juravle
67468ad649d3918f2eed3a37209c01a7f0a0faf09f0Calin Juravle  // Returns the shorty of a method by its index.
67568ad649d3918f2eed3a37209c01a7f0a0faf09f0Calin Juravle  const char* GetMethodShorty(uint32_t idx) const {
67668ad649d3918f2eed3a37209c01a7f0a0faf09f0Calin Juravle    return StringDataByIdx(GetProtoId(GetMethodId(idx).proto_idx_).shorty_idx_);
6777540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom  }
6787540ff4b6ad0ff5d8c5f60658b66155caf3a7cbcBrian Carlstrom
6790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the shorty of a method id.
6800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* GetMethodShorty(const MethodId& method_id) const {
6810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_);
6827e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
68345651fde99f52546e71241bb0e8a10d16a9f216aElliott Hughes  const char* GetMethodShorty(const MethodId& method_id, uint32_t* length) const {
684cf5077ac14f0922b6104a8a03fd66d97a490a3ddIan Rogers    // Using the UTF16 length is safe here as shorties are guaranteed to be ASCII characters.
685dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers    return StringDataAndUtf16LengthByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_, length);
6866d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  }
6870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the number of class definitions in the .dex file.
68868b56858367e29461ae290fd797443a1ef6d8005Ian Rogers  uint32_t NumClassDefs() const {
6892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
6900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_->class_defs_size_;
6917e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
6927e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
6930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the ClassDef at the specified index.
6948b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  const ClassDef& GetClassDef(uint16_t idx) const {
695b24bd9912579358687d45aec748853f1c53b4774Sebastien Hertz    DCHECK_LT(idx, NumClassDefs()) << GetLocation();
6960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return class_defs_[idx];
6977e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
6987e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
6998b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  uint16_t GetIndexForClassDef(const ClassDef& class_def) const {
70061e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_GE(&class_def, class_defs_) << GetLocation();
70161e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_LT(&class_def, class_defs_ + header_->class_defs_size_) << GetLocation();
7020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return &class_def - class_defs_;
7037e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
7047e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
7050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the class descriptor string of a class definition.
7060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* GetClassDescriptor(const ClassDef& class_def) const {
7070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringByTypeIdx(class_def.class_idx_);
7087e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
7097e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
710e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier  // Looks up a class definition by its class descriptor. Hash must be
711e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier  // ComputeModifiedUtf8Hash(descriptor).
712e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier  const ClassDef* FindClassDef(const char* descriptor, size_t hash) const;
7130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7148b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  // Looks up a class definition by its type index.
7158b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  const ClassDef* FindClassDef(uint16_t type_idx) const;
7167e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
7177e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  const TypeList* GetInterfacesList(const ClassDef& class_def) const {
7187e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    if (class_def.interfaces_off_ == 0) {
7192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier        return nullptr;
7207e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    } else {
72113735955f39b3b304c37d2b2840663c131262c18Ian Rogers      const uint8_t* addr = begin_ + class_def.interfaces_off_;
7227e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom      return reinterpret_cast<const TypeList*>(addr);
7237e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
724578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
7257e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
7260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns a pointer to the raw memory mapped class_data_item
72713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* GetClassData(const ClassDef& class_def) const {
7280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (class_def.class_data_off_ == 0) {
7292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier      return nullptr;
7300571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
73130fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers      return begin_ + class_def.class_data_off_;
7320571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
7332fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao  }
7342fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao
7350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  //
7366d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  const CodeItem* GetCodeItem(const uint32_t code_off) const {
7379139e008abe30b7beaf4afd6533228a1dd9b202cAlex Light    DCHECK_LT(code_off, size_) << "Code item offset larger then maximum allowed offset";
7386d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers    if (code_off == 0) {
7392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier      return nullptr;  // native or abstract method
7407e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    } else {
74113735955f39b3b304c37d2b2840663c131262c18Ian Rogers      const uint8_t* addr = begin_ + code_off;
7427e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom      return reinterpret_cast<const CodeItem*>(addr);
7437e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
7447e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
7457e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
7460571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* GetReturnTypeDescriptor(const ProtoId& proto_id) const {
7470571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringByTypeIdx(proto_id.return_type_idx_);
7480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7490571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7500571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the number of prototype identifiers in the .dex file.
7510571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t NumProtoIds() const {
7522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    DCHECK(header_ != nullptr) << GetLocation();
7530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_->proto_ids_size_;
7540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7550571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7560571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Returns the ProtoId at the specified index.
7570571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const ProtoId& GetProtoId(uint32_t idx) const {
7584f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers    DCHECK_LT(idx, NumProtoIds()) << GetLocation();
7590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return proto_ids_[idx];
7600571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7610571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7620571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint16_t GetIndexForProtoId(const ProtoId& proto_id) const {
76361e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_GE(&proto_id, proto_ids_) << GetLocation();
76461e513c3fc245f12876259a68696fbcd99ff45ecBrian Carlstrom    CHECK_LT(&proto_id, proto_ids_ + header_->proto_ids_size_) << GetLocation();
7650571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return &proto_id - proto_ids_;
7660571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
7670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Looks up a proto id for a given return type and signature type list
769d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const ProtoId* FindProtoId(uint16_t return_type_idx,
7705c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko                             const uint16_t* signature_type_idxs, uint32_t signature_length) const;
7715c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  const ProtoId* FindProtoId(uint16_t return_type_idx,
7725c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko                             const std::vector<uint16_t>& signature_type_idxs) const {
7735c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    return FindProtoId(return_type_idx, &signature_type_idxs[0], signature_type_idxs.size());
7745c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  }
7750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Given a signature place the type ids into the given vector, returns true on success
777d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  bool CreateTypeList(const StringPiece& signature, uint16_t* return_type_idx,
778d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers                      std::vector<uint16_t>* param_type_idxs) const;
7790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
780d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  // Create a Signature from the given string signature or return Signature::NoSignature if not
781d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  // possible.
782d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const Signature CreateSignature(const StringPiece& signature) const;
7830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
7847e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Returns the short form method descriptor for the given prototype.
7857e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  const char* GetShorty(uint32_t proto_idx) const {
7867e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    const ProtoId& proto_id = GetProtoId(proto_idx);
7870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return StringDataByIdx(proto_id.shorty_idx_);
788578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
7897e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
7907e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  const TypeList* GetProtoParameters(const ProtoId& proto_id) const {
7917e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    if (proto_id.parameters_off_ == 0) {
7922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier      return nullptr;
7937e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    } else {
79413735955f39b3b304c37d2b2840663c131262c18Ian Rogers      const uint8_t* addr = begin_ + proto_id.parameters_off_;
7957e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom      return reinterpret_cast<const TypeList*>(addr);
7967e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
797578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
7987e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
79913735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* GetEncodedStaticFieldValuesArray(const ClassDef& class_def) const {
8007e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    if (class_def.static_values_off_ == 0) {
8017e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom      return 0;
8027e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    } else {
80330fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers      return begin_ + class_def.static_values_off_;
8047e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
8057e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
8067e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
8072dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  static const TryItem* GetTryItems(const CodeItem& code_item, uint32_t offset);
8082fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao
8092fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao  // Get the base of the encoded data for the given DexCode.
81013735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static const uint8_t* GetCatchHandlerData(const CodeItem& code_item, uint32_t offset) {
81113735955f39b3b304c37d2b2840663c131262c18Ian Rogers    const uint8_t* handler_data =
81213735955f39b3b304c37d2b2840663c131262c18Ian Rogers        reinterpret_cast<const uint8_t*>(GetTryItems(code_item, code_item.tries_size_));
8132fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao    return handler_data + offset;
8142fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao  }
8152fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao
816dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  // Find which try region is associated with the given address (ie dex pc). Returns -1 if none.
817dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  static int32_t FindTryItem(const CodeItem &code_item, uint32_t address);
818dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers
819dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  // Find the handler offset associated with the given address (ie dex pc). Returns -1 if none.
820dbbc99d2a197592aee8fdaf01253e426c9dff1d8Ian Rogers  static int32_t FindCatchHandlerOffset(const CodeItem &code_item, uint32_t address);
8212fb9753c58ce1a511fd6996856840120eb2930dbShih-wei Liao
822195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Get the pointer to the start of the debugging data
82313735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* GetDebugInfoStream(const CodeItem* code_item) const {
8246852942773fde6ac40cec204f5ad63daacd3c74dDavid Srbecky    // Check that the offset is in bounds.
8256852942773fde6ac40cec204f5ad63daacd3c74dDavid Srbecky    // Note that although the specification says that 0 should be used if there
8266852942773fde6ac40cec204f5ad63daacd3c74dDavid Srbecky    // is no debug information, some applications incorrectly use 0xFFFFFFFF.
8276852942773fde6ac40cec204f5ad63daacd3c74dDavid Srbecky    if (code_item->debug_info_off_ == 0 || code_item->debug_info_off_ >= size_) {
8282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier      return nullptr;
829195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    } else {
83030fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers      return begin_ + code_item->debug_info_off_;
831195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    }
832195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  }
833195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
834b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  struct PositionInfo {
835b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    PositionInfo()
836b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        : address_(0),
837b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          line_(0),
838b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          source_file_(nullptr),
839b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          prologue_end_(false),
840b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          epilogue_begin_(false) {
841b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    }
842b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
843b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint32_t address_;  // In 16-bit code units.
844b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint32_t line_;  // Source code line number starting at 1.
845b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    const char* source_file_;  // nullptr if the file from ClassDef still applies.
846b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    bool prologue_end_;
847b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    bool epilogue_begin_;
848b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  };
849b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
850195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Callback for "new position table entry".
851195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Returning true causes the decoder to stop early.
852b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  typedef bool (*DexDebugNewPositionCb)(void* context, const PositionInfo& entry);
853b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
854b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  struct LocalInfo {
855b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    LocalInfo()
856b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky        : name_(nullptr),
857b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          descriptor_(nullptr),
858b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          signature_(nullptr),
859b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          start_address_(0),
860b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          end_address_(0),
861b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          reg_(0),
862b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky          is_live_(false) {
863b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    }
864195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
865b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    const char* name_;  // E.g., list.  It can be nullptr if unknown.
866b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    const char* descriptor_;  // E.g., Ljava/util/LinkedList;
867b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    const char* signature_;  // E.g., java.util.LinkedList<java.lang.Integer>
868b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint32_t start_address_;  // PC location where the local is first defined.
869b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint32_t end_address_;  // PC location where the local is no longer defined.
870b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    uint16_t reg_;  // Dex register which stores the values.
871b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky    bool is_live_;  // Is the local defined and live.
872b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  };
873b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
874b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  // Callback for "new locals table entry".
875b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  typedef void (*DexDebugNewLocalCb)(void* context, const LocalInfo& entry);
876195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
877b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  static bool LineNumForPcCb(void* context, const PositionInfo& entry);
878195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
87913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationsDirectoryItem* GetAnnotationsDirectory(const ClassDef& class_def) const {
88013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (class_def.annotations_off_ == 0) {
88113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
88213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
88313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const AnnotationsDirectoryItem*>(begin_ + class_def.annotations_off_);
88413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
88513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
88613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
88713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* GetClassAnnotationSet(const AnnotationsDirectoryItem* anno_dir) const {
88813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (anno_dir->class_annotations_off_ == 0) {
88913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
89013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
89113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const AnnotationSetItem*>(begin_ + anno_dir->class_annotations_off_);
89213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
89313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
89413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
89513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const FieldAnnotationsItem* GetFieldAnnotations(const AnnotationsDirectoryItem* anno_dir) const {
89613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (anno_dir->fields_size_ == 0) {
89713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
89813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
89913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const FieldAnnotationsItem*>(&anno_dir[1]);
90013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
90113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
90213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
90313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const MethodAnnotationsItem* GetMethodAnnotations(const AnnotationsDirectoryItem* anno_dir)
90413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const {
90513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (anno_dir->methods_size_ == 0) {
90613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
90713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
90813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      // Skip past the header and field annotations.
90913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const uint8_t* addr = reinterpret_cast<const uint8_t*>(&anno_dir[1]);
91013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      addr += anno_dir->fields_size_ * sizeof(FieldAnnotationsItem);
91113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const MethodAnnotationsItem*>(addr);
91213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
91313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
91413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
91513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const ParameterAnnotationsItem* GetParameterAnnotations(const AnnotationsDirectoryItem* anno_dir)
91613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const {
91713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (anno_dir->parameters_size_ == 0) {
91813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
91913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
92013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      // Skip past the header, field annotations, and method annotations.
92113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const uint8_t* addr = reinterpret_cast<const uint8_t*>(&anno_dir[1]);
92213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      addr += anno_dir->fields_size_ * sizeof(FieldAnnotationsItem);
92313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      addr += anno_dir->methods_size_ * sizeof(MethodAnnotationsItem);
92413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const ParameterAnnotationsItem*>(addr);
92513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
92613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
92713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
92813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* GetFieldAnnotationSetItem(const FieldAnnotationsItem& anno_item) const {
92913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t offset = anno_item.annotations_off_;
93013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (offset == 0) {
93113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
93213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
93313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset);
93413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
93513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
93613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
93713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* GetMethodAnnotationSetItem(const MethodAnnotationsItem& anno_item)
93813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const {
93913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t offset = anno_item.annotations_off_;
94013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (offset == 0) {
94113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
94213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
94313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset);
94413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
94513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
94613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
94713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetRefList* GetParameterAnnotationSetRefList(
94813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const ParameterAnnotationsItem* anno_item) const {
94913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t offset = anno_item->annotations_off_;
95013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (offset == 0) {
95113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
95213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
95313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return reinterpret_cast<const AnnotationSetRefList*>(begin_ + offset);
95413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
95513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
95613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* GetAnnotationItem(const AnnotationSetItem* set_item, uint32_t index) const {
95713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    DCHECK_LE(index, set_item->size_);
95813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t offset = set_item->entries_[index];
95913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (offset == 0) {
96013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
96113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    } else {
96213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return reinterpret_cast<const AnnotationItem*>(begin_ + offset);
96313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
96413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
96513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
96613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* GetSetRefItemItem(const AnnotationSetRefItem* anno_item) const {
96713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    uint32_t offset = anno_item->annotations_off_;
96813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    if (offset == 0) {
96913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      return nullptr;
97013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    }
97113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao    return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset);
97213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  }
97313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
97413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* FindAnnotationSetForField(ArtField* field) const
97513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
97613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* GetAnnotationForField(ArtField* field, Handle<mirror::Class> annotation_class)
97713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const SHARED_REQUIRES(Locks::mutator_lock_);
97813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* GetAnnotationsForField(ArtField* field) const
97913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
9802a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForField(ArtField* field) const
98113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
98213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  bool IsFieldAnnotationPresent(ArtField* field, Handle<mirror::Class> annotation_class) const
98313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
98413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
98513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* FindAnnotationSetForMethod(ArtMethod* method) const
98613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
98713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const ParameterAnnotationsItem* FindAnnotationsItemForMethod(ArtMethod* method) const
98813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
98913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* GetAnnotationDefaultValue(ArtMethod* method) const
99013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
99113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* GetAnnotationForMethod(ArtMethod* method, Handle<mirror::Class> annotation_class)
99213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const SHARED_REQUIRES(Locks::mutator_lock_);
99313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* GetAnnotationsForMethod(ArtMethod* method) const
99413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
9952a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::ObjectArray<mirror::Class>* GetExceptionTypesForMethod(ArtMethod* method) const
99613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
99713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* GetParameterAnnotations(ArtMethod* method) const
99813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
99908305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForMethod(ArtMethod* method) const
100008305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
100113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  bool IsMethodAnnotationPresent(ArtMethod* method, Handle<mirror::Class> annotation_class) const
100213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
100313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
100413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationSetItem* FindAnnotationSetForClass(Handle<mirror::Class> klass) const
100513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
100613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* GetAnnotationForClass(Handle<mirror::Class> klass,
100713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                        Handle<mirror::Class> annotation_class) const
100813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
100913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* GetAnnotationsForClass(Handle<mirror::Class> klass) const
101013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10112a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::ObjectArray<mirror::Class>* GetDeclaredClasses(Handle<mirror::Class> klass) const
10122a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10132a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::Class* GetDeclaringClass(Handle<mirror::Class> klass) const
10142a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10152a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::Class* GetEnclosingClass(Handle<mirror::Class> klass) const
10162a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10172a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::Object* GetEnclosingMethod(Handle<mirror::Class> klass) const
10182a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10192a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  bool GetInnerClass(Handle<mirror::Class> klass, mirror::String** name) const
10202a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10212a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  bool GetInnerClassFlags(Handle<mirror::Class> klass, uint32_t* flags) const
10222a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
102308305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao  mirror::ObjectArray<mirror::String>* GetSignatureAnnotationForClass(Handle<mirror::Class> klass)
102408305325d3468d5ef413eb0b36b1ea1b3746a6c4Jeff Hao      const SHARED_REQUIRES(Locks::mutator_lock_);
102513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  bool IsClassAnnotationPresent(Handle<mirror::Class> klass, Handle<mirror::Class> annotation_class)
102613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const SHARED_REQUIRES(Locks::mutator_lock_);
102713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
102813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* CreateAnnotationMember(Handle<mirror::Class> klass,
102913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                         Handle<mirror::Class> annotation_class,
103013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                         const uint8_t** annotation) const
103113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
103213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* GetAnnotationItemFromAnnotationSet(Handle<mirror::Class> klass,
103313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                           const AnnotationSetItem* annotation_set,
103413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                           uint32_t visibility,
103513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                           Handle<mirror::Class> annotation_class)
103613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const SHARED_REQUIRES(Locks::mutator_lock_);
103713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* GetAnnotationObjectFromAnnotationSet(Handle<mirror::Class> klass,
103813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                       const AnnotationSetItem* annotation_set,
103913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                       uint32_t visibility,
104013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                       Handle<mirror::Class> annotation_class) const
104113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
104213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* GetAnnotationValue(Handle<mirror::Class> klass,
104313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                     const AnnotationItem* annotation_item,
104413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                     const char* annotation_name,
104513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                     Handle<mirror::Class> array_class,
104613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                     uint32_t expected_type) const
104713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
10482a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::ObjectArray<mirror::String>* GetSignatureValue(Handle<mirror::Class> klass,
104913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                         const AnnotationSetItem* annotation_set)
105013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const SHARED_REQUIRES(Locks::mutator_lock_);
10512a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao  mirror::ObjectArray<mirror::Class>* GetThrowsValue(Handle<mirror::Class> klass,
10522a5892f9ebcd4b7bd7343db50e578bd24b8e55a6Jeff Hao                                                     const AnnotationSetItem* annotation_set) const
105313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
105413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* ProcessAnnotationSet(Handle<mirror::Class> klass,
105513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                            const AnnotationSetItem* annotation_set,
105613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                                            uint32_t visibility) const
105713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
105813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::ObjectArray<mirror::Object>* ProcessAnnotationSetRefList(Handle<mirror::Class> klass,
105913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      const AnnotationSetRefList* set_ref_list, uint32_t size) const
106013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
106113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  bool ProcessAnnotationValue(Handle<mirror::Class> klass, const uint8_t** annotation_ptr,
106213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                              AnnotationValue* annotation_value, Handle<mirror::Class> return_class,
106313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                              DexFile::AnnotationResultStyle result_style) const
106413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
106513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  mirror::Object* ProcessEncodedAnnotation(Handle<mirror::Class> klass,
106613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                           const uint8_t** annotation) const
106713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
106813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const AnnotationItem* SearchAnnotationSet(const AnnotationSetItem* annotation_set,
106913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao                                            const char* descriptor, uint32_t visibility) const
107013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
107113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  const uint8_t* SearchEncodedAnnotation(const uint8_t* annotation, const char* name) const
107213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
107313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao  bool SkipAnnotationValue(const uint8_t** annotation_ptr) const
107413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao      SHARED_REQUIRES(Locks::mutator_lock_);
107513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao
1076195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Debug info opcodes and constants
1077195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  enum {
1078195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_END_SEQUENCE         = 0x00,
1079195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_ADVANCE_PC           = 0x01,
1080195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_ADVANCE_LINE         = 0x02,
1081195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_START_LOCAL          = 0x03,
1082195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_START_LOCAL_EXTENDED = 0x04,
1083195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_END_LOCAL            = 0x05,
1084195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_RESTART_LOCAL        = 0x06,
1085195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_SET_PROLOGUE_END     = 0x07,
1086195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_SET_EPILOGUE_BEGIN   = 0x08,
1087195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_SET_FILE             = 0x09,
1088195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_FIRST_SPECIAL        = 0x0a,
1089195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_LINE_BASE            = -4,
1090195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    DBG_LINE_RANGE           = 15,
1091195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  };
1092195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
1093195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  struct LineNumFromPcContext {
1094ca190666fb11820153f74274c495ba1f913d8a69Ian Rogers    LineNumFromPcContext(uint32_t address, uint32_t line_num)
1095ca190666fb11820153f74274c495ba1f913d8a69Ian Rogers        : address_(address), line_num_(line_num) {}
1096195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    uint32_t address_;
1097195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao    uint32_t line_num_;
1098d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom   private:
1099d2fbb2bd2448f0872878258727aa1eb2558a0c3bBrian Carlstrom    DISALLOW_COPY_AND_ASSIGN(LineNumFromPcContext);
1100195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  };
1101195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
1102195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Determine the source file line number based on the program counter.
1103195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // "pc" is an offset, in 16-bit units, from the start of the method's code.
1104195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  //
1105195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Returns -1 if no match was found (possibly because the source files were
1106195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // compiled without "-g", so no line number information is present).
1107195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // Returns -2 for native methods (as expected in exception traces).
1108195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  //
1109195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao  // This is used by runtime; therefore use art::Method not art::DexFile::Method.
1110e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  int32_t GetLineNumFromPC(ArtMethod* method, uint32_t rel_pc) const
111190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
1112195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
111391d65e024846717fce3572106cffe9b957b8902cRoland Levillain  // Returns false if there is no debugging information or if it cannot be decoded.
1114b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  bool DecodeDebugLocalInfo(const CodeItem* code_item, bool is_static, uint32_t method_idx,
1115b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky                            DexDebugNewLocalCb local_cb, void* context) const;
1116b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky
111791d65e024846717fce3572106cffe9b957b8902cRoland Levillain  // Returns false if there is no debugging information or if it cannot be decoded.
1118b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  bool DecodeDebugPositionInfo(const CodeItem* code_item, DexDebugNewPositionCb position_cb,
1119b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky                               void* context) const;
1120195487cb0b11e64917df01f8d55671344db2e97fShih-wei Liao
11210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* GetSourceFile(const ClassDef& class_def) const {
11227e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    if (class_def.source_file_idx_ == 0xffffffff) {
11232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier      return nullptr;
11247e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    } else {
11250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return StringDataByIdx(class_def.source_file_idx_);
11267e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom    }
11277e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  }
11287e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
11292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  int GetPermissions() const;
11301c849e5badc85b6753dee0c0487729b2c0529f51Ian Rogers
11312d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  bool IsReadOnly() const;
11322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
1133e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  bool EnableWrite() const;
11342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
1135e0948e13d5a4552e6a2728087573c07961e4a4f9Brian Carlstrom  bool DisableWrite() const;
11362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
113713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* Begin() const {
11388b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    return begin_;
11398b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  }
11408b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers
11418b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  size_t Size() const {
11428b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    return size_;
11438b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers  }
11448b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers
114590e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  // Return the name of the index-th classes.dex in a multidex zip file. This is classes.dex for
114690e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  // index == 0, and classes{index + 1}.dex else.
114790e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  static std::string GetMultiDexClassesDexName(size_t index);
114890e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe
114990e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  // Return the (possibly synthetic) dex location for a multidex entry. This is dex_location for
115090e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  // index == 0, and dex_location + multi-dex-separator + GetMultiDexClassesDexName(index) else.
115190e34043ff7bf8926e8fe6a6d5011a9daa68d320Andreas Gampe  static std::string GetMultiDexLocation(size_t index, const char* dex_location);
11524e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
11534e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  // Returns the canonical form of the given dex location.
11544e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //
11554e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  // There are different flavors of "dex locations" as follows:
11564e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  // the file name of a dex file:
11574e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     The actual file path that the dex file has on disk.
11584e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  // dex_location:
11594e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     This acts as a key for the class linker to know which dex file to load.
11604e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     It may correspond to either an old odex file or a particular dex file
11614e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     inside an oat file. In the first case it will also match the file name
11624e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     of the dex file. In the second case (oat) it will include the file name
11634e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     and possibly some multidex annotation to uniquely identify it.
11644e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  // canonical_dex_location:
11654e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  //     the dex_location where it's file name part has been made canonical.
11664e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle  static std::string GetDexCanonicalLocation(const char* dex_location);
11674e1d579d6401fef2dd57b16f8d406e33221a69d9Calin Juravle
116807b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler  const OatDexFile* GetOatDexFile() const {
116907b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler    return oat_dex_file_;
1170fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe  }
1171fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe
1172d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  TypeLookupTable* GetTypeLookupTable() const {
1173d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko    return lookup_table_.get();
1174d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  }
1175d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko
11769bdf108885a27ba05fae8501725649574d7c491bVladimir Marko  void CreateTypeLookupTable(uint8_t* storage = nullptr) const;
1177d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko
11787e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom private:
117958ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom  // Opens a .dex file
1180fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  static std::unique_ptr<const DexFile> OpenFile(int fd, const char* location,
1181fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                 bool verify, std::string* error_msg);
118258ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
1183833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Opens dex files from within a .jar, .zip, or .apk file
1184833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  static bool OpenZip(int fd, const std::string& location, std::string* error_msg,
1185fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                      std::vector<std::unique_ptr<const DexFile>>* dex_files);
1186833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
1187833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  enum class ZipOpenErrorCode {  // private
1188833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    kNoError,
1189833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    kEntryNotFound,
1190833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    kExtractToMemoryError,
1191833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    kDexFileError,
1192833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    kMakeReadOnlyError,
1193833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe    kVerifyError
1194833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  };
1195833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
11962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  // Opens .dex file from the entry_name in a zip archive. error_code is undefined when non-null
1197833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // return.
1198fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  static std::unique_ptr<const DexFile> Open(const ZipArchive& zip_archive, const char* entry_name,
1199fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                             const std::string& location, std::string* error_msg,
1200fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                             ZipOpenErrorCode* error_code);
120158ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom
120289521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom  // Opens a .dex file at the given address backed by a MemMap
1203fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  static std::unique_ptr<const DexFile> OpenMemory(const std::string& location,
1204fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   uint32_t location_checksum,
1205fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   MemMap* mem_map,
1206fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   std::string* error_msg);
120789521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom
120889521898b56f2ebc3fb68acfb6bc6dde9b6f5c38Brian Carlstrom  // Opens a .dex file at the given address, optionally backed by a MemMap
1209fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler  static std::unique_ptr<const DexFile> OpenMemory(const uint8_t* dex_file,
1210fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   size_t size,
1211fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   const std::string& location,
1212fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   uint32_t location_checksum,
1213fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   MemMap* mem_map,
121407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler                                                   const OatDexFile* oat_dex_file,
1215fbef44de596d298dc6430f482dffc933a046dd28Richard Uhler                                                   std::string* error_msg);
12167e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
121713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  DexFile(const uint8_t* base, size_t size,
121828db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom          const std::string& location,
121928db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom          uint32_t location_checksum,
1220fd9eb3923dcf417afcf5ed4ebb13867fd10f2de3Andreas Gampe          MemMap* mem_map,
122107b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler          const OatDexFile* oat_dex_file);
1222f6174e8a1566bb357e82506f7ec97dc359c90eb2jeffhao
12237e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Top-level initializer that calls other Init methods.
12248d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  bool Init(std::string* error_msg);
12257e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12266e3b1d900cc456a2717944f1f562a2f4df000705Brian Carlstrom  // Returns true if the header magic and version numbers are of the expected values.
12278d31bbd3d6536de12bc20e3d29cfe03fe848f9daIan Rogers  bool CheckMagicAndVersion(std::string* error_msg) const;
12287e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
1229833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // Check whether a location denotes a multidex dex file. This is a very simple check: returns
1230833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  // whether the string contains the separator character.
1231833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe  static bool IsMultiDexLocation(const char* location);
1232833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
1233833a48501d560c9fa7fc78ef619888138c2d374fAndreas Gampe
12347e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // The base address of the memory mapping.
123513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* const begin_;
12367e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12377e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // The size of the underlying memory allocation in bytes.
123862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers  const size_t size_;
12397e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
124064bf5a33d55aa779ef452552a466943002d39e4fElliott Hughes  // Typically the dex file name when available, alternatively some identifying string.
1241a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  //
1242a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // The ClassLinker will use this to match DexFiles the boot class
1243a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  // path to DexCache::GetLocation when loading from an image.
1244a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom  const std::string location_;
1245a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
12465b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom  const uint32_t location_checksum_;
12475b332c89fa3fdd7dc184b22c2587d28af304d019Brian Carlstrom
124833f741eefef8f8012f6c190b39355f2e0430d535Brian Carlstrom  // Manages the underlying memory allocation.
1249700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers  std::unique_ptr<MemMap> mem_map_;
12507e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12517e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the header section.
12520d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const Header* const header_;
12537e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12547e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the base of the string identifier list.
12550d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const StringId* const string_ids_;
12567e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12577e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the base of the type identifier list.
12580d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const TypeId* const type_ids_;
12597e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12607e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the base of the field identifier list.
12610d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const FieldId* const field_ids_;
12627e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12637e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the base of the method identifier list.
12640d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const MethodId* const method_ids_;
12657e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12667e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the base of the prototype identifier list.
12670d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const ProtoId* const proto_ids_;
12687e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom
12697e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom  // Points to the base of the class definition list.
12700d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstrom  const ClassDef* const class_defs_;
127168b56858367e29461ae290fd797443a1ef6d8005Ian Rogers
127207b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler  // If this dex file was loaded from an oat file, oat_dex_file_ contains a
127307b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler  // pointer to the OatDexFile it was loaded from. Otherwise oat_dex_file_ is
127407b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler  // null.
127507b3c2351bb527ea91c084dc19434600af9ae66bRichard Uhler  const OatDexFile* oat_dex_file_;
1276d9786b0e5be23ea0258405165098b4216579209cArtem Udovichenko  mutable std::unique_ptr<TypeLookupTable> lookup_table_;
1277e6215c0ec4b1bb71b722fdbf7e62eaf3be8a91d5Andreas Gampe
1278e6215c0ec4b1bb71b722fdbf7e62eaf3be8a91d5Andreas Gampe  friend class DexFileVerifierTest;
127976172164667d565c1d3316935a24b0d9712bb2f6Mathieu Chartier  ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName);  // for constructor
12801fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro};
1281e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier
1282e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartierstruct DexFileReference {
1283e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  DexFileReference(const DexFile* file, uint32_t idx) : dex_file(file), index(idx) { }
1284e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  const DexFile* dex_file;
1285e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier  uint32_t index;
1286e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier};
1287e5f13e57ff8fa36342beb33830b3ec5942a61ccaMathieu Chartier
12880d6adac2550113da33d42e88f0d87a57b25c5a60Brian Carlstromstd::ostream& operator<<(std::ostream& os, const DexFile& dex_file);
12891fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
12900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers// Iterate over a dex file's ProtoId's paramters
12910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersclass DexFileParameterIterator {
12920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers public:
12930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  DexFileParameterIterator(const DexFile& dex_file, const DexFile::ProtoId& proto_id)
12940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      : dex_file_(dex_file), size_(0), pos_(0) {
12950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    type_list_ = dex_file_.GetProtoParameters(proto_id);
12962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    if (type_list_ != nullptr) {
12970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      size_ = type_list_->Size();
12980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
12990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool HasNext() const { return pos_ < size_; }
1301b06e28e5b9fbabe3e69b18f31bf353eaff5d0c1fDavid Srbecky  size_t Size() const { return size_; }
13020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  void Next() { ++pos_; }
13036d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers  uint16_t GetTypeIdx() {
13040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return type_list_->GetTypeItem(pos_).type_idx_;
13050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const char* GetDescriptor() {
13076d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers    return dex_file_.StringByTypeIdx(GetTypeIdx());
13080571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers private:
13100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const DexFile& dex_file_;
13110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const DexFile::TypeList* type_list_;
13120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t size_;
13130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t pos_;
13140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  DISALLOW_IMPLICIT_CONSTRUCTORS(DexFileParameterIterator);
13150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers};
13160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
1317d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers// Abstract the signature of a method.
131803b6eafba8ace9a9c4d5ee9c47723d1910ccd7a8Ian Rogersclass Signature : public ValueObject {
1319d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers public:
1320d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  std::string ToString() const;
1321d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1322d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  static Signature NoSignature() {
1323d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    return Signature();
1324d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  }
1325d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1326dfb325e0ddd746cd8f7c2e3723b3a573eb7cc111Ian Rogers  bool operator==(const Signature& rhs) const;
1327d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  bool operator!=(const Signature& rhs) const {
1328d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    return !(*this == rhs);
1329d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  }
1330d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1331d9cffeaa478bd30ad89a9dfc9680a27ce5efaadfVladimir Marko  bool operator==(const StringPiece& rhs) const;
1332d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1333d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers private:
1334d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  Signature(const DexFile* dex, const DexFile::ProtoId& proto) : dex_file_(dex), proto_id_(&proto) {
1335d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  }
1336d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1337d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  Signature() : dex_file_(nullptr), proto_id_(nullptr) {
1338d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  }
1339d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1340d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  friend class DexFile;
1341d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
1342d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const DexFile* const dex_file_;
1343d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers  const DexFile::ProtoId* const proto_id_;
1344d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers};
1345d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogersstd::ostream& operator<<(std::ostream& os, const Signature& sig);
1346d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers
13470571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers// Iterate and decode class_data_item
13480571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersclass ClassDataItemIterator {
13490571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers public:
135013735955f39b3b304c37d2b2840663c131262c18Ian Rogers  ClassDataItemIterator(const DexFile& dex_file, const uint8_t* raw_class_data_item)
13510571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      : dex_file_(dex_file), pos_(0), ptr_pos_(raw_class_data_item), last_idx_(0) {
13520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ReadClassDataHeader();
13530571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (EndOfInstanceFieldsPos() > 0) {
13540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataField();
13550571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (EndOfVirtualMethodsPos() > 0) {
13560571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataMethod();
13570571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
13580571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t NumStaticFields() const {
13600571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_.static_fields_size_;
13610571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13620571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t NumInstanceFields() const {
13630571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_.instance_fields_size_;
13640571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13650571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t NumDirectMethods() const {
13660571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_.direct_methods_size_;
13670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t NumVirtualMethods() const {
13690571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_.virtual_methods_size_;
13700571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13710571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool HasNextStaticField() const {
13720571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return pos_ < EndOfStaticFieldsPos();
13730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool HasNextInstanceField() const {
13750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return pos_ >= EndOfStaticFieldsPos() && pos_ < EndOfInstanceFieldsPos();
13760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool HasNextDirectMethod() const {
13780571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return pos_ >= EndOfInstanceFieldsPos() && pos_ < EndOfDirectMethodsPos();
13790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool HasNextVirtualMethod() const {
13810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return pos_ >= EndOfDirectMethodsPos() && pos_ < EndOfVirtualMethodsPos();
13820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
13830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  bool HasNext() const {
13840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return pos_ < EndOfVirtualMethodsPos();
13850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
1386637c65b1e431fd90195b71c141b3590bd81cc91aIan Rogers  inline void Next() {
13870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    pos_++;
13880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (pos_ < EndOfStaticFieldsPos()) {
13890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = GetMemberIndex();
13900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataField();
13910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (pos_ == EndOfStaticFieldsPos() && NumInstanceFields() > 0) {
13920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = 0;  // transition to next array, reset last index
13930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataField();
13940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (pos_ < EndOfInstanceFieldsPos()) {
13950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = GetMemberIndex();
13960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataField();
13970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (pos_ == EndOfInstanceFieldsPos() && NumDirectMethods() > 0) {
13980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = 0;  // transition to next array, reset last index
13990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataMethod();
14000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (pos_ < EndOfDirectMethodsPos()) {
14010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = GetMemberIndex();
14020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataMethod();
14030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (pos_ == EndOfDirectMethodsPos() && NumVirtualMethods() > 0) {
14040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = 0;  // transition to next array, reset last index
14050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataMethod();
14060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else if (pos_ < EndOfVirtualMethodsPos()) {
14070571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      last_idx_ = GetMemberIndex();
14080571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      ReadClassDataMethod();
14090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
14100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      DCHECK(!HasNext());
14110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
14120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t GetMemberIndex() const {
14140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (pos_ < EndOfInstanceFieldsPos()) {
14150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return last_idx_ + field_.field_idx_delta_;
14160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
1417b24bd9912579358687d45aec748853f1c53b4774Sebastien Hertz      DCHECK_LT(pos_, EndOfVirtualMethodsPos());
14180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return last_idx_ + method_.method_idx_delta_;
14190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
14200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14215182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  uint32_t GetRawMemberAccessFlags() const {
14220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    if (pos_ < EndOfInstanceFieldsPos()) {
14230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return field_.access_flags_;
14240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } else {
1425b24bd9912579358687d45aec748853f1c53b4774Sebastien Hertz      DCHECK_LT(pos_, EndOfVirtualMethodsPos());
14260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return method_.access_flags_;
14270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
14280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14295182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  uint32_t GetFieldAccessFlags() const {
14305182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    return GetRawMemberAccessFlags() & kAccValidFieldFlags;
14315182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  }
14325182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  uint32_t GetMethodAccessFlags() const {
14335182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    return GetRawMemberAccessFlags() & kAccValidMethodFlags;
14345182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  }
14355182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  bool MemberIsNative() const {
14365182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    return GetRawMemberAccessFlags() & kAccNative;
14375182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  }
14385182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  bool MemberIsFinal() const {
14395182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe    return GetRawMemberAccessFlags() & kAccFinal;
14405182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe  }
144108f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  InvokeType GetMethodInvokeType(const DexFile::ClassDef& class_def) const {
144208f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers    if (HasNextDirectMethod()) {
14435182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      if ((GetRawMemberAccessFlags() & kAccStatic) != 0) {
144408f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers        return kStatic;
144508f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers      } else {
144608f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers        return kDirect;
144708f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers      }
144808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers    } else {
14495182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      DCHECK_EQ(GetRawMemberAccessFlags() & kAccStatic, 0U);
145008f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers      if ((class_def.access_flags_ & kAccInterface) != 0) {
145108f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers        return kInterface;
14525182932cf6704b53e957f7b4be021fe505a55e22Andreas Gampe      } else if ((GetRawMemberAccessFlags() & kAccConstructor) != 0) {
145308f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers        return kSuper;
145408f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers      } else {
145508f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers        return kVirtual;
145608f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers      }
145708f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers    }
145808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  }
14590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const DexFile::CodeItem* GetMethodCodeItem() const {
14600571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return dex_file_.GetCodeItem(method_.code_off_);
14610571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14620571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t GetMethodCodeItemOffset() const {
14630571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return method_.code_off_;
14640571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
1465e6215c0ec4b1bb71b722fdbf7e62eaf3be8a91d5Andreas Gampe  const uint8_t* DataPointer() const {
1466e6215c0ec4b1bb71b722fdbf7e62eaf3be8a91d5Andreas Gampe    return ptr_pos_;
1467e6215c0ec4b1bb71b722fdbf7e62eaf3be8a91d5Andreas Gampe  }
146813735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* EndDataPointer() const {
146910037c866b04550fc5461058c398c2e3e509381ajeffhao    CHECK(!HasNext());
147010037c866b04550fc5461058c398c2e3e509381ajeffhao    return ptr_pos_;
147110037c866b04550fc5461058c398c2e3e509381ajeffhao  }
1472a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
14730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers private:
14740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // A dex file's class_data_item is leb128 encoded, this structure holds a decoded form of the
14750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // header for a class_data_item
14760571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  struct ClassDataHeader {
14770571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t static_fields_size_;  // the number of static fields
14780571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t instance_fields_size_;  // the number of instance fields
14790571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t direct_methods_size_;  // the number of direct methods
14800571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t virtual_methods_size_;  // the number of virtual methods
14810571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  } header_;
14820571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
14830571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Read and decode header from a class_data_item stream into header
14840571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  void ReadClassDataHeader();
14850571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
14860571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t EndOfStaticFieldsPos() const {
14870571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return header_.static_fields_size_;
14880571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14890571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t EndOfInstanceFieldsPos() const {
14900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return EndOfStaticFieldsPos() + header_.instance_fields_size_;
14910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14920571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t EndOfDirectMethodsPos() const {
14930571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return EndOfInstanceFieldsPos() + header_.direct_methods_size_;
14940571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14950571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t EndOfVirtualMethodsPos() const {
14960571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    return EndOfDirectMethodsPos() + header_.virtual_methods_size_;
14970571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  }
14980571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
14990571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // A decoded version of the field of a class_data_item
15000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  struct ClassDataField {
15010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t field_idx_delta_;  // delta of index into the field_ids array for FieldId
15020571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t access_flags_;  // access flags for the field
15030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ClassDataField() :  field_idx_delta_(0), access_flags_(0) {}
1504a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
15050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers   private:
15060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    DISALLOW_COPY_AND_ASSIGN(ClassDataField);
1507ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  };
1508ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  ClassDataField field_;
15090571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15100571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Read and decode a field from a class_data_item stream into field
15110571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  void ReadClassDataField();
15120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // A decoded version of the method of a class_data_item
15140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  struct ClassDataMethod {
15150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t method_idx_delta_;  // delta of index into the method_ids array for MethodId
15160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t access_flags_;
15170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t code_off_;
15180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    ClassDataMethod() : method_idx_delta_(0), access_flags_(0), code_off_(0) {}
1519a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
15200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers   private:
15210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    DISALLOW_COPY_AND_ASSIGN(ClassDataMethod);
1522ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  };
1523ee0fa76b2e5d39ad36d1ff144b2d0270df81e606Elliott Hughes  ClassDataMethod method_;
15240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  // Read and decode a method from a class_data_item stream into method
15260571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  void ReadClassDataMethod();
15270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const DexFile& dex_file_;
15290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  size_t pos_;  // integral number of items passed
153013735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* ptr_pos_;  // pointer into stream of class_data_item
15310571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  uint32_t last_idx_;  // last read field or method index to apply delta to
15320571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  DISALLOW_IMPLICIT_CONSTRUCTORS(ClassDataItemIterator);
15330571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers};
15340571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersclass EncodedStaticFieldValueIterator {
15360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers public:
153782863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  // A constructor for static tools. You cannot call
153882863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  // ReadValueToField() for an object created by this.
153982863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  EncodedStaticFieldValueIterator(const DexFile& dex_file,
154082863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji                                  const DexFile::ClassDef& class_def);
154182863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji
154282863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  // A constructor meant to be called from runtime code.
154350a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji  EncodedStaticFieldValueIterator(const DexFile& dex_file,
154450a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  Handle<mirror::DexCache>* dex_cache,
1545eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier                                  Handle<mirror::ClassLoader>* class_loader,
154650a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  ClassLinker* linker,
154750a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  const DexFile::ClassDef& class_def)
154890443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
15490571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
1550d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz  template<bool kTransactionActive>
155190443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier  void ReadValueToField(ArtField* field) const SHARED_REQUIRES(Locks::mutator_lock_);
15520571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15536a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers  bool HasNext() const { return pos_ < array_size_; }
15540571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15550571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  void Next();
1556a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
15570571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  enum ValueType {
15580571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kByte = 0x00,
15590571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kShort = 0x02,
15600571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kChar = 0x03,
15610571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kInt = 0x04,
15620571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kLong = 0x06,
15630571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kFloat = 0x10,
15640571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kDouble = 0x11,
15650571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kString = 0x17,
15660571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kType = 0x18,
15670571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kField = 0x19,
15680571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kMethod = 0x1a,
15690571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kEnum = 0x1b,
15700571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kArray = 0x1c,
15710571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kAnnotation = 0x1d,
15720571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kNull = 0x1e,
15730571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    kBoolean = 0x1f
15740571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  };
15750571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
157682863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  ValueType GetValueType() const { return type_; }
157782863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji  const jvalue& GetJavaValue() const { return jval_; }
157882863f0ce9fa45f6b14d12c35a6a50e2772ab26aShinichiro Hamaji
157988f365433dd8412a80258847e0b0359b125c06c2Brian Carlstrom private:
158050a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji  EncodedStaticFieldValueIterator(const DexFile& dex_file,
158150a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  Handle<mirror::DexCache>* dex_cache,
158250a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  Handle<mirror::ClassLoader>* class_loader,
158350a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  ClassLinker* linker,
158450a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  const DexFile::ClassDef& class_def,
158550a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  size_t pos,
158650a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji                                  ValueType type);
158750a2f8deb8982c11966764ada4c01df95d8310c5Shinichiro Hamaji
158813735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static constexpr uint8_t kEncodedValueTypeMask = 0x1f;  // 0b11111
158913735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static constexpr uint8_t kEncodedValueArgShift = 5;
15900571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
15910571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  const DexFile& dex_file_;
1592eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  Handle<mirror::DexCache>* const dex_cache_;  // Dex cache to resolve literal objects.
1593eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  Handle<mirror::ClassLoader>* const class_loader_;  // ClassLoader to resolve types.
15942dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  ClassLinker* linker_;  // Linker to resolve literal objects.
15952dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  size_t array_size_;  // Size of array.
15962dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  size_t pos_;  // Current position.
159713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  const uint8_t* ptr_;  // Pointer into encoded data array.
15982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  ValueType type_;  // Type of current encoded value.
15992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  jvalue jval_;  // Value of current encoded value.
16000571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  DISALLOW_IMPLICIT_CONSTRUCTORS(EncodedStaticFieldValueIterator);
16010571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers};
160288f365433dd8412a80258847e0b0359b125c06c2Brian Carlstromstd::ostream& operator<<(std::ostream& os, const EncodedStaticFieldValueIterator::ValueType& code);
16030571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
16040571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogersclass CatchHandlerIterator {
16050571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  public:
16060571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    CatchHandlerIterator(const DexFile::CodeItem& code_item, uint32_t address);
1607736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien
1608736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien    CatchHandlerIterator(const DexFile::CodeItem& code_item,
1609736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien                         const DexFile::TryItem& try_item);
1610736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien
161113735955f39b3b304c37d2b2840663c131262c18Ian Rogers    explicit CatchHandlerIterator(const uint8_t* handler_data) {
16120571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      Init(handler_data);
16130571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
16140571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
16150571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint16_t GetHandlerTypeIndex() const {
16160571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return handler_.type_idx_;
16170571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
16180571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    uint32_t GetHandlerAddress() const {
16190571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return handler_.address_;
16200571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
16210571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    void Next();
16220571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    bool HasNext() const {
16230571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return remaining_count_ != -1 || catch_all_;
16240571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
16250571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    // End of this set of catch blocks, convenience method to locate next set of catch blocks
162613735955f39b3b304c37d2b2840663c131262c18Ian Rogers    const uint8_t* EndDataPointer() const {
16270571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      CHECK(!HasNext());
16280571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      return current_data_;
16290571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    }
1630a21039c3ae2b20e44ceb2735251c04d0aac89afdElliott Hughes
16310571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers  private:
1632736df0253aa65ebccb29ddb6443c31b7730ca3e5Logan Chien    void Init(const DexFile::CodeItem& code_item, int32_t offset);
163313735955f39b3b304c37d2b2840663c131262c18Ian Rogers    void Init(const uint8_t* handler_data);
16340571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
16350571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    struct CatchHandlerItem {
16360571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      uint16_t type_idx_;  // type index of the caught exception type
16370571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers      uint32_t address_;  // handler address
16380571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    } handler_;
163913735955f39b3b304c37d2b2840663c131262c18Ian Rogers    const uint8_t* current_data_;  // the current handler in dex file.
16400571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    int32_t remaining_count_;   // number of handlers not read.
16410571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers    bool catch_all_;            // is there a handler that will catch all exceptions in case
16420571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers                                // that all typed handler does not match.
16430571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers};
16440571d357843c53e042f370f5f2c2e9aa3fe803a9Ian Rogers
16451fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro}  // namespace art
16461fb8620309a4e94d11879aabc33364acfa733904Carl Shapiro
1647fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_DEX_FILE_H_
1648