Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ART_RUNTIME_DEX_FILE_H_
     18 #define ART_RUNTIME_DEX_FILE_H_
     19 
     20 #include <memory>
     21 #include <string>
     22 #include <unordered_map>
     23 #include <vector>
     24 
     25 #include "base/hash_map.h"
     26 #include "base/logging.h"
     27 #include "base/mutex.h"  // For Locks::mutator_lock_.
     28 #include "globals.h"
     29 #include "invoke_type.h"
     30 #include "jni.h"
     31 #include "modifiers.h"
     32 #include "utf.h"
     33 
     34 namespace art {
     35 
     36 // TODO: remove dependencies on mirror classes, primarily by moving
     37 // EncodedStaticFieldValueIterator to its own file.
     38 namespace mirror {
     39   class ArtField;
     40   class ArtMethod;
     41   class ClassLoader;
     42   class DexCache;
     43 }  // namespace mirror
     44 class ClassLinker;
     45 class MemMap;
     46 class OatFile;
     47 class Signature;
     48 template<class T> class Handle;
     49 class StringPiece;
     50 class ZipArchive;
     51 
     52 // TODO: move all of the macro functionality into the DexCache class.
     53 class DexFile {
     54  public:
     55   static const byte kDexMagic[];
     56   static const byte kDexMagicVersion[];
     57   static const size_t kSha1DigestSize = 20;
     58   static const uint32_t kDexEndianConstant = 0x12345678;
     59 
     60   // name of the DexFile entry within a zip archive
     61   static const char* kClassesDex;
     62 
     63   // The value of an invalid index.
     64   static const uint32_t kDexNoIndex = 0xFFFFFFFF;
     65 
     66   // The value of an invalid index.
     67   static const uint16_t kDexNoIndex16 = 0xFFFF;
     68 
     69   // The separator charactor in MultiDex locations.
     70   static constexpr char kMultiDexSeparator = ':';
     71 
     72   // A string version of the previous. This is a define so that we can merge string literals in the
     73   // preprocessor.
     74   #define kMultiDexSeparatorString ":"
     75 
     76   // Raw header_item.
     77   struct Header {
     78     uint8_t magic_[8];
     79     uint32_t checksum_;  // See also location_checksum_
     80     uint8_t signature_[kSha1DigestSize];
     81     uint32_t file_size_;  // size of entire file
     82     uint32_t header_size_;  // offset to start of next section
     83     uint32_t endian_tag_;
     84     uint32_t link_size_;  // unused
     85     uint32_t link_off_;  // unused
     86     uint32_t map_off_;  // unused
     87     uint32_t string_ids_size_;  // number of StringIds
     88     uint32_t string_ids_off_;  // file offset of StringIds array
     89     uint32_t type_ids_size_;  // number of TypeIds, we don't support more than 65535
     90     uint32_t type_ids_off_;  // file offset of TypeIds array
     91     uint32_t proto_ids_size_;  // number of ProtoIds, we don't support more than 65535
     92     uint32_t proto_ids_off_;  // file offset of ProtoIds array
     93     uint32_t field_ids_size_;  // number of FieldIds
     94     uint32_t field_ids_off_;  // file offset of FieldIds array
     95     uint32_t method_ids_size_;  // number of MethodIds
     96     uint32_t method_ids_off_;  // file offset of MethodIds array
     97     uint32_t class_defs_size_;  // number of ClassDefs
     98     uint32_t class_defs_off_;  // file offset of ClassDef array
     99     uint32_t data_size_;  // unused
    100     uint32_t data_off_;  // unused
    101 
    102    private:
    103     DISALLOW_COPY_AND_ASSIGN(Header);
    104   };
    105 
    106   // Map item type codes.
    107   enum {
    108     kDexTypeHeaderItem               = 0x0000,
    109     kDexTypeStringIdItem             = 0x0001,
    110     kDexTypeTypeIdItem               = 0x0002,
    111     kDexTypeProtoIdItem              = 0x0003,
    112     kDexTypeFieldIdItem              = 0x0004,
    113     kDexTypeMethodIdItem             = 0x0005,
    114     kDexTypeClassDefItem             = 0x0006,
    115     kDexTypeMapList                  = 0x1000,
    116     kDexTypeTypeList                 = 0x1001,
    117     kDexTypeAnnotationSetRefList     = 0x1002,
    118     kDexTypeAnnotationSetItem        = 0x1003,
    119     kDexTypeClassDataItem            = 0x2000,
    120     kDexTypeCodeItem                 = 0x2001,
    121     kDexTypeStringDataItem           = 0x2002,
    122     kDexTypeDebugInfoItem            = 0x2003,
    123     kDexTypeAnnotationItem           = 0x2004,
    124     kDexTypeEncodedArrayItem         = 0x2005,
    125     kDexTypeAnnotationsDirectoryItem = 0x2006,
    126   };
    127 
    128   struct MapItem {
    129     uint16_t type_;
    130     uint16_t unused_;
    131     uint32_t size_;
    132     uint32_t offset_;
    133 
    134    private:
    135     DISALLOW_COPY_AND_ASSIGN(MapItem);
    136   };
    137 
    138   struct MapList {
    139     uint32_t size_;
    140     MapItem list_[1];
    141 
    142    private:
    143     DISALLOW_COPY_AND_ASSIGN(MapList);
    144   };
    145 
    146   // Raw string_id_item.
    147   struct StringId {
    148     uint32_t string_data_off_;  // offset in bytes from the base address
    149 
    150    private:
    151     DISALLOW_COPY_AND_ASSIGN(StringId);
    152   };
    153 
    154   // Raw type_id_item.
    155   struct TypeId {
    156     uint32_t descriptor_idx_;  // index into string_ids
    157 
    158    private:
    159     DISALLOW_COPY_AND_ASSIGN(TypeId);
    160   };
    161 
    162   // Raw field_id_item.
    163   struct FieldId {
    164     uint16_t class_idx_;  // index into type_ids_ array for defining class
    165     uint16_t type_idx_;  // index into type_ids_ array for field type
    166     uint32_t name_idx_;  // index into string_ids_ array for field name
    167 
    168    private:
    169     DISALLOW_COPY_AND_ASSIGN(FieldId);
    170   };
    171 
    172   // Raw method_id_item.
    173   struct MethodId {
    174     uint16_t class_idx_;  // index into type_ids_ array for defining class
    175     uint16_t proto_idx_;  // index into proto_ids_ array for method prototype
    176     uint32_t name_idx_;  // index into string_ids_ array for method name
    177 
    178    private:
    179     DISALLOW_COPY_AND_ASSIGN(MethodId);
    180   };
    181 
    182   // Raw proto_id_item.
    183   struct ProtoId {
    184     uint32_t shorty_idx_;  // index into string_ids array for shorty descriptor
    185     uint16_t return_type_idx_;  // index into type_ids array for return type
    186     uint16_t pad_;             // padding = 0
    187     uint32_t parameters_off_;  // file offset to type_list for parameter types
    188 
    189    private:
    190     DISALLOW_COPY_AND_ASSIGN(ProtoId);
    191   };
    192 
    193   // Raw class_def_item.
    194   struct ClassDef {
    195     uint16_t class_idx_;  // index into type_ids_ array for this class
    196     uint16_t pad1_;  // padding = 0
    197     uint32_t access_flags_;
    198     uint16_t superclass_idx_;  // index into type_ids_ array for superclass
    199     uint16_t pad2_;  // padding = 0
    200     uint32_t interfaces_off_;  // file offset to TypeList
    201     uint32_t source_file_idx_;  // index into string_ids_ for source file name
    202     uint32_t annotations_off_;  // file offset to annotations_directory_item
    203     uint32_t class_data_off_;  // file offset to class_data_item
    204     uint32_t static_values_off_;  // file offset to EncodedArray
    205 
    206     // Returns the valid access flags, that is, Java modifier bits relevant to the ClassDef type
    207     // (class or interface). These are all in the lower 16b and do not contain runtime flags.
    208     uint32_t GetJavaAccessFlags() const {
    209       // Make sure that none of our runtime-only flags are set.
    210       COMPILE_ASSERT((kAccValidClassFlags & kAccJavaFlagsMask) == kAccValidClassFlags,
    211                      valid_class_flags_not_subset_of_java_flags);
    212       COMPILE_ASSERT((kAccValidInterfaceFlags & kAccJavaFlagsMask) == kAccValidInterfaceFlags,
    213                      valid_interface_flags_not_subset_of_java_flags);
    214 
    215       if ((access_flags_ & kAccInterface) != 0) {
    216         // Interface.
    217         return access_flags_ & kAccValidInterfaceFlags;
    218       } else {
    219         // Class.
    220         return access_flags_ & kAccValidClassFlags;
    221       }
    222     }
    223 
    224    private:
    225     DISALLOW_COPY_AND_ASSIGN(ClassDef);
    226   };
    227 
    228   // Raw type_item.
    229   struct TypeItem {
    230     uint16_t type_idx_;  // index into type_ids section
    231 
    232    private:
    233     DISALLOW_COPY_AND_ASSIGN(TypeItem);
    234   };
    235 
    236   // Raw type_list.
    237   class TypeList {
    238    public:
    239     uint32_t Size() const {
    240       return size_;
    241     }
    242 
    243     const TypeItem& GetTypeItem(uint32_t idx) const {
    244       DCHECK_LT(idx, this->size_);
    245       return this->list_[idx];
    246     }
    247 
    248     // Size in bytes of the part of the list that is common.
    249     static constexpr size_t GetHeaderSize() {
    250       return 4U;
    251     }
    252 
    253     // Size in bytes of the whole type list including all the stored elements.
    254     static constexpr size_t GetListSize(size_t count) {
    255       return GetHeaderSize() + sizeof(TypeItem) * count;
    256     }
    257 
    258    private:
    259     uint32_t size_;  // size of the list, in entries
    260     TypeItem list_[1];  // elements of the list
    261     DISALLOW_COPY_AND_ASSIGN(TypeList);
    262   };
    263 
    264   // Raw code_item.
    265   struct CodeItem {
    266     uint16_t registers_size_;
    267     uint16_t ins_size_;
    268     uint16_t outs_size_;
    269     uint16_t tries_size_;
    270     uint32_t debug_info_off_;  // file offset to debug info stream
    271     uint32_t insns_size_in_code_units_;  // size of the insns array, in 2 byte code units
    272     uint16_t insns_[1];
    273 
    274    private:
    275     DISALLOW_COPY_AND_ASSIGN(CodeItem);
    276   };
    277 
    278   // Raw try_item.
    279   struct TryItem {
    280     uint32_t start_addr_;
    281     uint16_t insn_count_;
    282     uint16_t handler_off_;
    283 
    284    private:
    285     DISALLOW_COPY_AND_ASSIGN(TryItem);
    286   };
    287 
    288   // Annotation constants.
    289   enum {
    290     kDexVisibilityBuild         = 0x00,     /* annotation visibility */
    291     kDexVisibilityRuntime       = 0x01,
    292     kDexVisibilitySystem        = 0x02,
    293 
    294     kDexAnnotationByte          = 0x00,
    295     kDexAnnotationShort         = 0x02,
    296     kDexAnnotationChar          = 0x03,
    297     kDexAnnotationInt           = 0x04,
    298     kDexAnnotationLong          = 0x06,
    299     kDexAnnotationFloat         = 0x10,
    300     kDexAnnotationDouble        = 0x11,
    301     kDexAnnotationString        = 0x17,
    302     kDexAnnotationType          = 0x18,
    303     kDexAnnotationField         = 0x19,
    304     kDexAnnotationMethod        = 0x1a,
    305     kDexAnnotationEnum          = 0x1b,
    306     kDexAnnotationArray         = 0x1c,
    307     kDexAnnotationAnnotation    = 0x1d,
    308     kDexAnnotationNull          = 0x1e,
    309     kDexAnnotationBoolean       = 0x1f,
    310 
    311     kDexAnnotationValueTypeMask = 0x1f,     /* low 5 bits */
    312     kDexAnnotationValueArgShift = 5,
    313   };
    314 
    315   struct AnnotationsDirectoryItem {
    316     uint32_t class_annotations_off_;
    317     uint32_t fields_size_;
    318     uint32_t methods_size_;
    319     uint32_t parameters_size_;
    320 
    321    private:
    322     DISALLOW_COPY_AND_ASSIGN(AnnotationsDirectoryItem);
    323   };
    324 
    325   struct FieldAnnotationsItem {
    326     uint32_t field_idx_;
    327     uint32_t annotations_off_;
    328 
    329    private:
    330     DISALLOW_COPY_AND_ASSIGN(FieldAnnotationsItem);
    331   };
    332 
    333   struct MethodAnnotationsItem {
    334     uint32_t method_idx_;
    335     uint32_t annotations_off_;
    336 
    337    private:
    338     DISALLOW_COPY_AND_ASSIGN(MethodAnnotationsItem);
    339   };
    340 
    341   struct ParameterAnnotationsItem {
    342     uint32_t method_idx_;
    343     uint32_t annotations_off_;
    344 
    345    private:
    346     DISALLOW_COPY_AND_ASSIGN(ParameterAnnotationsItem);
    347   };
    348 
    349   struct AnnotationSetRefItem {
    350     uint32_t annotations_off_;
    351 
    352    private:
    353     DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefItem);
    354   };
    355 
    356   struct AnnotationSetRefList {
    357     uint32_t size_;
    358     AnnotationSetRefItem list_[1];
    359 
    360    private:
    361     DISALLOW_COPY_AND_ASSIGN(AnnotationSetRefList);
    362   };
    363 
    364   struct AnnotationSetItem {
    365     uint32_t size_;
    366     uint32_t entries_[1];
    367 
    368    private:
    369     DISALLOW_COPY_AND_ASSIGN(AnnotationSetItem);
    370   };
    371 
    372   struct AnnotationItem {
    373     uint8_t visibility_;
    374     uint8_t annotation_[1];
    375 
    376    private:
    377     DISALLOW_COPY_AND_ASSIGN(AnnotationItem);
    378   };
    379 
    380   // Returns the checksum of a file for comparison with GetLocationChecksum().
    381   // For .dex files, this is the header checksum.
    382   // For zip files, this is the classes.dex zip entry CRC32 checksum.
    383   // Return true if the checksum could be found, false otherwise.
    384   static bool GetChecksum(const char* filename, uint32_t* checksum, std::string* error_msg);
    385 
    386   // Opens .dex files found in the container, guessing the container format based on file extension.
    387   static bool Open(const char* filename, const char* location, std::string* error_msg,
    388                    std::vector<const DexFile*>* dex_files);
    389 
    390   // Opens .dex file, backed by existing memory
    391   static const DexFile* Open(const uint8_t* base, size_t size,
    392                              const std::string& location,
    393                              uint32_t location_checksum,
    394                              const OatFile* oat_file,
    395                              std::string* error_msg) {
    396     return OpenMemory(base, size, location, location_checksum, NULL, oat_file, error_msg);
    397   }
    398 
    399   // Open all classesXXX.dex files from a zip archive.
    400   static bool OpenFromZip(const ZipArchive& zip_archive, const std::string& location,
    401                           std::string* error_msg, std::vector<const DexFile*>* dex_files);
    402 
    403   // Closes a .dex file.
    404   virtual ~DexFile();
    405 
    406   const std::string& GetLocation() const {
    407     return location_;
    408   }
    409 
    410   // For normal dex files, location and base location coincide. If a dex file is part of a multidex
    411   // archive, the base location is the name of the originating jar/apk, stripped of any internal
    412   // classes*.dex path.
    413   static std::string GetBaseLocation(const char* location) {
    414     const char* pos = strrchr(location, kMultiDexSeparator);
    415     if (pos == nullptr) {
    416       return location;
    417     } else {
    418       return std::string(location, pos - location);
    419     }
    420   }
    421 
    422   std::string GetBaseLocation() const {
    423     size_t pos = location_.rfind(kMultiDexSeparator);
    424     if (pos == std::string::npos) {
    425       return location_;
    426     } else {
    427       return location_.substr(0, pos);
    428     }
    429   }
    430 
    431   // For DexFiles directly from .dex files, this is the checksum from the DexFile::Header.
    432   // For DexFiles opened from a zip files, this will be the ZipEntry CRC32 of classes.dex.
    433   uint32_t GetLocationChecksum() const {
    434     return location_checksum_;
    435   }
    436 
    437   const Header& GetHeader() const {
    438     DCHECK(header_ != NULL) << GetLocation();
    439     return *header_;
    440   }
    441 
    442   // Decode the dex magic version
    443   uint32_t GetVersion() const;
    444 
    445   // Returns true if the byte string points to the magic value.
    446   static bool IsMagicValid(const byte* magic);
    447 
    448   // Returns true if the byte string after the magic is the correct value.
    449   static bool IsVersionValid(const byte* magic);
    450 
    451   // Returns the number of string identifiers in the .dex file.
    452   size_t NumStringIds() const {
    453     DCHECK(header_ != NULL) << GetLocation();
    454     return header_->string_ids_size_;
    455   }
    456 
    457   // Returns the StringId at the specified index.
    458   const StringId& GetStringId(uint32_t idx) const {
    459     DCHECK_LT(idx, NumStringIds()) << GetLocation();
    460     return string_ids_[idx];
    461   }
    462 
    463   uint32_t GetIndexForStringId(const StringId& string_id) const {
    464     CHECK_GE(&string_id, string_ids_) << GetLocation();
    465     CHECK_LT(&string_id, string_ids_ + header_->string_ids_size_) << GetLocation();
    466     return &string_id - string_ids_;
    467   }
    468 
    469   int32_t GetStringLength(const StringId& string_id) const;
    470 
    471   // Returns a pointer to the UTF-8 string data referred to by the given string_id as well as the
    472   // length of the string when decoded as a UTF-16 string. Note the UTF-16 length is not the same
    473   // as the string length of the string data.
    474   const char* GetStringDataAndUtf16Length(const StringId& string_id, uint32_t* utf16_length) const;
    475 
    476   const char* GetStringData(const StringId& string_id) const {
    477     uint32_t ignored;
    478     return GetStringDataAndUtf16Length(string_id, &ignored);
    479   }
    480 
    481   // Index version of GetStringDataAndUtf16Length.
    482   const char* StringDataAndUtf16LengthByIdx(uint32_t idx, uint32_t* utf16_length) const {
    483     if (idx == kDexNoIndex) {
    484       *utf16_length = 0;
    485       return NULL;
    486     }
    487     const StringId& string_id = GetStringId(idx);
    488     return GetStringDataAndUtf16Length(string_id, utf16_length);
    489   }
    490 
    491   const char* StringDataByIdx(uint32_t idx) const {
    492     uint32_t unicode_length;
    493     return StringDataAndUtf16LengthByIdx(idx, &unicode_length);
    494   }
    495 
    496   // Looks up a string id for a given modified utf8 string.
    497   const StringId* FindStringId(const char* string) const;
    498 
    499   // Looks up a string id for a given utf16 string.
    500   const StringId* FindStringId(const uint16_t* string) const;
    501 
    502   // Returns the number of type identifiers in the .dex file.
    503   uint32_t NumTypeIds() const {
    504     DCHECK(header_ != NULL) << GetLocation();
    505     return header_->type_ids_size_;
    506   }
    507 
    508   // Returns the TypeId at the specified index.
    509   const TypeId& GetTypeId(uint32_t idx) const {
    510     DCHECK_LT(idx, NumTypeIds()) << GetLocation();
    511     return type_ids_[idx];
    512   }
    513 
    514   uint16_t GetIndexForTypeId(const TypeId& type_id) const {
    515     CHECK_GE(&type_id, type_ids_) << GetLocation();
    516     CHECK_LT(&type_id, type_ids_ + header_->type_ids_size_) << GetLocation();
    517     size_t result = &type_id - type_ids_;
    518     DCHECK_LT(result, 65536U) << GetLocation();
    519     return static_cast<uint16_t>(result);
    520   }
    521 
    522   // Get the descriptor string associated with a given type index.
    523   const char* StringByTypeIdx(uint32_t idx, uint32_t* unicode_length) const {
    524     const TypeId& type_id = GetTypeId(idx);
    525     return StringDataAndUtf16LengthByIdx(type_id.descriptor_idx_, unicode_length);
    526   }
    527 
    528   const char* StringByTypeIdx(uint32_t idx) const {
    529     const TypeId& type_id = GetTypeId(idx);
    530     return StringDataByIdx(type_id.descriptor_idx_);
    531   }
    532 
    533   // Returns the type descriptor string of a type id.
    534   const char* GetTypeDescriptor(const TypeId& type_id) const {
    535     return StringDataByIdx(type_id.descriptor_idx_);
    536   }
    537 
    538   // Looks up a type for the given string index
    539   const TypeId* FindTypeId(uint32_t string_idx) const;
    540 
    541   // Returns the number of field identifiers in the .dex file.
    542   size_t NumFieldIds() const {
    543     DCHECK(header_ != NULL) << GetLocation();
    544     return header_->field_ids_size_;
    545   }
    546 
    547   // Returns the FieldId at the specified index.
    548   const FieldId& GetFieldId(uint32_t idx) const {
    549     DCHECK_LT(idx, NumFieldIds()) << GetLocation();
    550     return field_ids_[idx];
    551   }
    552 
    553   uint32_t GetIndexForFieldId(const FieldId& field_id) const {
    554     CHECK_GE(&field_id, field_ids_) << GetLocation();
    555     CHECK_LT(&field_id, field_ids_ + header_->field_ids_size_) << GetLocation();
    556     return &field_id - field_ids_;
    557   }
    558 
    559   // Looks up a field by its declaring class, name and type
    560   const FieldId* FindFieldId(const DexFile::TypeId& declaring_klass,
    561                              const DexFile::StringId& name,
    562                              const DexFile::TypeId& type) const;
    563 
    564   // Returns the declaring class descriptor string of a field id.
    565   const char* GetFieldDeclaringClassDescriptor(const FieldId& field_id) const {
    566     const DexFile::TypeId& type_id = GetTypeId(field_id.class_idx_);
    567     return GetTypeDescriptor(type_id);
    568   }
    569 
    570   // Returns the class descriptor string of a field id.
    571   const char* GetFieldTypeDescriptor(const FieldId& field_id) const {
    572     const DexFile::TypeId& type_id = GetTypeId(field_id.type_idx_);
    573     return GetTypeDescriptor(type_id);
    574   }
    575 
    576   // Returns the name of a field id.
    577   const char* GetFieldName(const FieldId& field_id) const {
    578     return StringDataByIdx(field_id.name_idx_);
    579   }
    580 
    581   // Returns the number of method identifiers in the .dex file.
    582   size_t NumMethodIds() const {
    583     DCHECK(header_ != NULL) << GetLocation();
    584     return header_->method_ids_size_;
    585   }
    586 
    587   // Returns the MethodId at the specified index.
    588   const MethodId& GetMethodId(uint32_t idx) const {
    589     DCHECK_LT(idx, NumMethodIds()) << GetLocation();
    590     return method_ids_[idx];
    591   }
    592 
    593   uint32_t GetIndexForMethodId(const MethodId& method_id) const {
    594     CHECK_GE(&method_id, method_ids_) << GetLocation();
    595     CHECK_LT(&method_id, method_ids_ + header_->method_ids_size_) << GetLocation();
    596     return &method_id - method_ids_;
    597   }
    598 
    599   // Looks up a method by its declaring class, name and proto_id
    600   const MethodId* FindMethodId(const DexFile::TypeId& declaring_klass,
    601                                const DexFile::StringId& name,
    602                                const DexFile::ProtoId& signature) const;
    603 
    604   // Returns the declaring class descriptor string of a method id.
    605   const char* GetMethodDeclaringClassDescriptor(const MethodId& method_id) const {
    606     const DexFile::TypeId& type_id = GetTypeId(method_id.class_idx_);
    607     return GetTypeDescriptor(type_id);
    608   }
    609 
    610   // Returns the prototype of a method id.
    611   const ProtoId& GetMethodPrototype(const MethodId& method_id) const {
    612     return GetProtoId(method_id.proto_idx_);
    613   }
    614 
    615   // Returns a representation of the signature of a method id.
    616   const Signature GetMethodSignature(const MethodId& method_id) const;
    617 
    618   // Returns the name of a method id.
    619   const char* GetMethodName(const MethodId& method_id) const {
    620     return StringDataByIdx(method_id.name_idx_);
    621   }
    622 
    623   // Returns the shorty of a method id.
    624   const char* GetMethodShorty(const MethodId& method_id) const {
    625     return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_);
    626   }
    627   const char* GetMethodShorty(const MethodId& method_id, uint32_t* length) const {
    628     // Using the UTF16 length is safe here as shorties are guaranteed to be ASCII characters.
    629     return StringDataAndUtf16LengthByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_, length);
    630   }
    631   // Returns the number of class definitions in the .dex file.
    632   uint32_t NumClassDefs() const {
    633     DCHECK(header_ != NULL) << GetLocation();
    634     return header_->class_defs_size_;
    635   }
    636 
    637   // Returns the ClassDef at the specified index.
    638   const ClassDef& GetClassDef(uint16_t idx) const {
    639     DCHECK_LT(idx, NumClassDefs()) << GetLocation();
    640     return class_defs_[idx];
    641   }
    642 
    643   uint16_t GetIndexForClassDef(const ClassDef& class_def) const {
    644     CHECK_GE(&class_def, class_defs_) << GetLocation();
    645     CHECK_LT(&class_def, class_defs_ + header_->class_defs_size_) << GetLocation();
    646     return &class_def - class_defs_;
    647   }
    648 
    649   // Returns the class descriptor string of a class definition.
    650   const char* GetClassDescriptor(const ClassDef& class_def) const {
    651     return StringByTypeIdx(class_def.class_idx_);
    652   }
    653 
    654   // Looks up a class definition by its class descriptor. Hash must be
    655   // ComputeModifiedUtf8Hash(descriptor).
    656   const ClassDef* FindClassDef(const char* descriptor, size_t hash) const;
    657 
    658   // Looks up a class definition by its type index.
    659   const ClassDef* FindClassDef(uint16_t type_idx) const;
    660 
    661   const TypeList* GetInterfacesList(const ClassDef& class_def) const {
    662     if (class_def.interfaces_off_ == 0) {
    663         return NULL;
    664     } else {
    665       const byte* addr = begin_ + class_def.interfaces_off_;
    666       return reinterpret_cast<const TypeList*>(addr);
    667     }
    668   }
    669 
    670   // Returns a pointer to the raw memory mapped class_data_item
    671   const byte* GetClassData(const ClassDef& class_def) const {
    672     if (class_def.class_data_off_ == 0) {
    673       return NULL;
    674     } else {
    675       return begin_ + class_def.class_data_off_;
    676     }
    677   }
    678 
    679   //
    680   const CodeItem* GetCodeItem(const uint32_t code_off) const {
    681     if (code_off == 0) {
    682       return NULL;  // native or abstract method
    683     } else {
    684       const byte* addr = begin_ + code_off;
    685       return reinterpret_cast<const CodeItem*>(addr);
    686     }
    687   }
    688 
    689   const char* GetReturnTypeDescriptor(const ProtoId& proto_id) const {
    690     return StringByTypeIdx(proto_id.return_type_idx_);
    691   }
    692 
    693   // Returns the number of prototype identifiers in the .dex file.
    694   size_t NumProtoIds() const {
    695     DCHECK(header_ != NULL) << GetLocation();
    696     return header_->proto_ids_size_;
    697   }
    698 
    699   // Returns the ProtoId at the specified index.
    700   const ProtoId& GetProtoId(uint32_t idx) const {
    701     DCHECK_LT(idx, NumProtoIds()) << GetLocation();
    702     return proto_ids_[idx];
    703   }
    704 
    705   uint16_t GetIndexForProtoId(const ProtoId& proto_id) const {
    706     CHECK_GE(&proto_id, proto_ids_) << GetLocation();
    707     CHECK_LT(&proto_id, proto_ids_ + header_->proto_ids_size_) << GetLocation();
    708     return &proto_id - proto_ids_;
    709   }
    710 
    711   // Looks up a proto id for a given return type and signature type list
    712   const ProtoId* FindProtoId(uint16_t return_type_idx,
    713                              const uint16_t* signature_type_idxs, uint32_t signature_length) const;
    714   const ProtoId* FindProtoId(uint16_t return_type_idx,
    715                              const std::vector<uint16_t>& signature_type_idxs) const {
    716     return FindProtoId(return_type_idx, &signature_type_idxs[0], signature_type_idxs.size());
    717   }
    718 
    719   // Given a signature place the type ids into the given vector, returns true on success
    720   bool CreateTypeList(const StringPiece& signature, uint16_t* return_type_idx,
    721                       std::vector<uint16_t>* param_type_idxs) const;
    722 
    723   // Create a Signature from the given string signature or return Signature::NoSignature if not
    724   // possible.
    725   const Signature CreateSignature(const StringPiece& signature) const;
    726 
    727   // Returns the short form method descriptor for the given prototype.
    728   const char* GetShorty(uint32_t proto_idx) const {
    729     const ProtoId& proto_id = GetProtoId(proto_idx);
    730     return StringDataByIdx(proto_id.shorty_idx_);
    731   }
    732 
    733   const TypeList* GetProtoParameters(const ProtoId& proto_id) const {
    734     if (proto_id.parameters_off_ == 0) {
    735       return NULL;
    736     } else {
    737       const byte* addr = begin_ + proto_id.parameters_off_;
    738       return reinterpret_cast<const TypeList*>(addr);
    739     }
    740   }
    741 
    742   const byte* GetEncodedStaticFieldValuesArray(const ClassDef& class_def) const {
    743     if (class_def.static_values_off_ == 0) {
    744       return 0;
    745     } else {
    746       return begin_ + class_def.static_values_off_;
    747     }
    748   }
    749 
    750   static const TryItem* GetTryItems(const CodeItem& code_item, uint32_t offset);
    751 
    752   // Get the base of the encoded data for the given DexCode.
    753   static const byte* GetCatchHandlerData(const CodeItem& code_item, uint32_t offset) {
    754     const byte* handler_data =
    755         reinterpret_cast<const byte*>(GetTryItems(code_item, code_item.tries_size_));
    756     return handler_data + offset;
    757   }
    758 
    759   // Find which try region is associated with the given address (ie dex pc). Returns -1 if none.
    760   static int32_t FindTryItem(const CodeItem &code_item, uint32_t address);
    761 
    762   // Find the handler offset associated with the given address (ie dex pc). Returns -1 if none.
    763   static int32_t FindCatchHandlerOffset(const CodeItem &code_item, uint32_t address);
    764 
    765   // Get the pointer to the start of the debugging data
    766   const byte* GetDebugInfoStream(const CodeItem* code_item) const {
    767     if (code_item->debug_info_off_ == 0) {
    768       return NULL;
    769     } else {
    770       return begin_ + code_item->debug_info_off_;
    771     }
    772   }
    773 
    774   // Callback for "new position table entry".
    775   // Returning true causes the decoder to stop early.
    776   typedef bool (*DexDebugNewPositionCb)(void* context, uint32_t address, uint32_t line_num);
    777 
    778   // Callback for "new locals table entry". "signature" is an empty string
    779   // if no signature is available for an entry.
    780   typedef void (*DexDebugNewLocalCb)(void* context, uint16_t reg,
    781                                      uint32_t start_address,
    782                                      uint32_t end_address,
    783                                      const char* name,
    784                                      const char* descriptor,
    785                                      const char* signature);
    786 
    787   static bool LineNumForPcCb(void* context, uint32_t address, uint32_t line_num);
    788 
    789   // Debug info opcodes and constants
    790   enum {
    791     DBG_END_SEQUENCE         = 0x00,
    792     DBG_ADVANCE_PC           = 0x01,
    793     DBG_ADVANCE_LINE         = 0x02,
    794     DBG_START_LOCAL          = 0x03,
    795     DBG_START_LOCAL_EXTENDED = 0x04,
    796     DBG_END_LOCAL            = 0x05,
    797     DBG_RESTART_LOCAL        = 0x06,
    798     DBG_SET_PROLOGUE_END     = 0x07,
    799     DBG_SET_EPILOGUE_BEGIN   = 0x08,
    800     DBG_SET_FILE             = 0x09,
    801     DBG_FIRST_SPECIAL        = 0x0a,
    802     DBG_LINE_BASE            = -4,
    803     DBG_LINE_RANGE           = 15,
    804   };
    805 
    806   struct LocalInfo {
    807     LocalInfo()
    808         : name_(NULL), descriptor_(NULL), signature_(NULL), start_address_(0), is_live_(false) {}
    809 
    810     const char* name_;  // E.g., list
    811     const char* descriptor_;  // E.g., Ljava/util/LinkedList;
    812     const char* signature_;  // E.g., java.util.LinkedList<java.lang.Integer>
    813     uint16_t start_address_;  // PC location where the local is first defined.
    814     bool is_live_;  // Is the local defined and live.
    815 
    816    private:
    817     DISALLOW_COPY_AND_ASSIGN(LocalInfo);
    818   };
    819 
    820   struct LineNumFromPcContext {
    821     LineNumFromPcContext(uint32_t address, uint32_t line_num)
    822         : address_(address), line_num_(line_num) {}
    823     uint32_t address_;
    824     uint32_t line_num_;
    825    private:
    826     DISALLOW_COPY_AND_ASSIGN(LineNumFromPcContext);
    827   };
    828 
    829   void InvokeLocalCbIfLive(void* context, int reg, uint32_t end_address,
    830                            LocalInfo* local_in_reg, DexDebugNewLocalCb local_cb) const {
    831     if (local_cb != NULL && local_in_reg[reg].is_live_) {
    832       local_cb(context, reg, local_in_reg[reg].start_address_, end_address,
    833           local_in_reg[reg].name_, local_in_reg[reg].descriptor_,
    834           local_in_reg[reg].signature_ != NULL ? local_in_reg[reg].signature_ : "");
    835     }
    836   }
    837 
    838   // Determine the source file line number based on the program counter.
    839   // "pc" is an offset, in 16-bit units, from the start of the method's code.
    840   //
    841   // Returns -1 if no match was found (possibly because the source files were
    842   // compiled without "-g", so no line number information is present).
    843   // Returns -2 for native methods (as expected in exception traces).
    844   //
    845   // This is used by runtime; therefore use art::Method not art::DexFile::Method.
    846   int32_t GetLineNumFromPC(mirror::ArtMethod* method, uint32_t rel_pc) const
    847       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
    848 
    849   void DecodeDebugInfo(const CodeItem* code_item, bool is_static, uint32_t method_idx,
    850                        DexDebugNewPositionCb position_cb, DexDebugNewLocalCb local_cb,
    851                        void* context) const;
    852 
    853   const char* GetSourceFile(const ClassDef& class_def) const {
    854     if (class_def.source_file_idx_ == 0xffffffff) {
    855       return NULL;
    856     } else {
    857       return StringDataByIdx(class_def.source_file_idx_);
    858     }
    859   }
    860 
    861   int GetPermissions() const;
    862 
    863   bool IsReadOnly() const;
    864 
    865   bool EnableWrite() const;
    866 
    867   bool DisableWrite() const;
    868 
    869   const byte* Begin() const {
    870     return begin_;
    871   }
    872 
    873   size_t Size() const {
    874     return size_;
    875   }
    876 
    877   static std::string GetMultiDexClassesDexName(size_t number, const char* dex_location);
    878 
    879   // Returns the canonical form of the given dex location.
    880   //
    881   // There are different flavors of "dex locations" as follows:
    882   // the file name of a dex file:
    883   //     The actual file path that the dex file has on disk.
    884   // dex_location:
    885   //     This acts as a key for the class linker to know which dex file to load.
    886   //     It may correspond to either an old odex file or a particular dex file
    887   //     inside an oat file. In the first case it will also match the file name
    888   //     of the dex file. In the second case (oat) it will include the file name
    889   //     and possibly some multidex annotation to uniquely identify it.
    890   // canonical_dex_location:
    891   //     the dex_location where it's file name part has been made canonical.
    892   static std::string GetDexCanonicalLocation(const char* dex_location);
    893 
    894   const OatFile* GetOatFile() const {
    895     return oat_file_;
    896   }
    897 
    898  private:
    899   // Opens a .dex file
    900   static const DexFile* OpenFile(int fd, const char* location, bool verify, std::string* error_msg);
    901 
    902   // Opens dex files from within a .jar, .zip, or .apk file
    903   static bool OpenZip(int fd, const std::string& location, std::string* error_msg,
    904                       std::vector<const DexFile*>* dex_files);
    905 
    906   enum class ZipOpenErrorCode {  // private
    907     kNoError,
    908     kEntryNotFound,
    909     kExtractToMemoryError,
    910     kDexFileError,
    911     kMakeReadOnlyError,
    912     kVerifyError
    913   };
    914 
    915   // Opens .dex file from the entry_name in a zip archive. error_code is undefined when non-nullptr
    916   // return.
    917   static const DexFile* Open(const ZipArchive& zip_archive, const char* entry_name,
    918                              const std::string& location, std::string* error_msg,
    919                              ZipOpenErrorCode* error_code);
    920 
    921   // Opens a .dex file at the given address backed by a MemMap
    922   static const DexFile* OpenMemory(const std::string& location,
    923                                    uint32_t location_checksum,
    924                                    MemMap* mem_map,
    925                                    std::string* error_msg);
    926 
    927   // Opens a .dex file at the given address, optionally backed by a MemMap
    928   static const DexFile* OpenMemory(const byte* dex_file,
    929                                    size_t size,
    930                                    const std::string& location,
    931                                    uint32_t location_checksum,
    932                                    MemMap* mem_map,
    933                                    const OatFile* oat_file,
    934                                    std::string* error_msg);
    935 
    936   DexFile(const byte* base, size_t size,
    937           const std::string& location,
    938           uint32_t location_checksum,
    939           MemMap* mem_map,
    940           const OatFile* oat_file);
    941 
    942   // Top-level initializer that calls other Init methods.
    943   bool Init(std::string* error_msg);
    944 
    945   // Returns true if the header magic and version numbers are of the expected values.
    946   bool CheckMagicAndVersion(std::string* error_msg) const;
    947 
    948   void DecodeDebugInfo0(const CodeItem* code_item, bool is_static, uint32_t method_idx,
    949       DexDebugNewPositionCb position_cb, DexDebugNewLocalCb local_cb,
    950       void* context, const byte* stream, LocalInfo* local_in_reg) const;
    951 
    952   // Check whether a location denotes a multidex dex file. This is a very simple check: returns
    953   // whether the string contains the separator character.
    954   static bool IsMultiDexLocation(const char* location);
    955 
    956 
    957   // The base address of the memory mapping.
    958   const byte* const begin_;
    959 
    960   // The size of the underlying memory allocation in bytes.
    961   const size_t size_;
    962 
    963   // Typically the dex file name when available, alternatively some identifying string.
    964   //
    965   // The ClassLinker will use this to match DexFiles the boot class
    966   // path to DexCache::GetLocation when loading from an image.
    967   const std::string location_;
    968 
    969   const uint32_t location_checksum_;
    970 
    971   // Manages the underlying memory allocation.
    972   std::unique_ptr<MemMap> mem_map_;
    973 
    974   // Points to the header section.
    975   const Header* const header_;
    976 
    977   // Points to the base of the string identifier list.
    978   const StringId* const string_ids_;
    979 
    980   // Points to the base of the type identifier list.
    981   const TypeId* const type_ids_;
    982 
    983   // Points to the base of the field identifier list.
    984   const FieldId* const field_ids_;
    985 
    986   // Points to the base of the method identifier list.
    987   const MethodId* const method_ids_;
    988 
    989   // Points to the base of the prototype identifier list.
    990   const ProtoId* const proto_ids_;
    991 
    992   // Points to the base of the class definition list.
    993   const ClassDef* const class_defs_;
    994 
    995   // Number of misses finding a class def from a descriptor.
    996   mutable Atomic<uint32_t> find_class_def_misses_;
    997 
    998   struct UTF16EmptyFn {
    999     void MakeEmpty(std::pair<const char*, const ClassDef*>& pair) const {
   1000       pair.first = nullptr;
   1001       pair.second = nullptr;
   1002     }
   1003     bool IsEmpty(const std::pair<const char*, const ClassDef*>& pair) const {
   1004       if (pair.first == nullptr) {
   1005         DCHECK(pair.second == nullptr);
   1006         return true;
   1007       }
   1008       return false;
   1009     }
   1010   };
   1011   struct UTF16HashCmp {
   1012     // Hash function.
   1013     size_t operator()(const char* key) const {
   1014       return ComputeModifiedUtf8Hash(key);
   1015     }
   1016     // std::equal function.
   1017     bool operator()(const char* a, const char* b) const {
   1018       return CompareModifiedUtf8ToModifiedUtf8AsUtf16CodePointValues(a, b) == 0;
   1019     }
   1020   };
   1021   typedef HashMap<const char*, const ClassDef*, UTF16EmptyFn, UTF16HashCmp, UTF16HashCmp> Index;
   1022   mutable Atomic<Index*> class_def_index_;
   1023   mutable Mutex build_class_def_index_mutex_ DEFAULT_MUTEX_ACQUIRED_AFTER;
   1024 
   1025   // The oat file this dex file was loaded from. May be null in case the dex file is not coming
   1026   // from an oat file, e.g., directly from an apk.
   1027   const OatFile* oat_file_;
   1028 };
   1029 std::ostream& operator<<(std::ostream& os, const DexFile& dex_file);
   1030 
   1031 // Iterate over a dex file's ProtoId's paramters
   1032 class DexFileParameterIterator {
   1033  public:
   1034   DexFileParameterIterator(const DexFile& dex_file, const DexFile::ProtoId& proto_id)
   1035       : dex_file_(dex_file), size_(0), pos_(0) {
   1036     type_list_ = dex_file_.GetProtoParameters(proto_id);
   1037     if (type_list_ != NULL) {
   1038       size_ = type_list_->Size();
   1039     }
   1040   }
   1041   bool HasNext() const { return pos_ < size_; }
   1042   void Next() { ++pos_; }
   1043   uint16_t GetTypeIdx() {
   1044     return type_list_->GetTypeItem(pos_).type_idx_;
   1045   }
   1046   const char* GetDescriptor() {
   1047     return dex_file_.StringByTypeIdx(GetTypeIdx());
   1048   }
   1049  private:
   1050   const DexFile& dex_file_;
   1051   const DexFile::TypeList* type_list_;
   1052   uint32_t size_;
   1053   uint32_t pos_;
   1054   DISALLOW_IMPLICIT_CONSTRUCTORS(DexFileParameterIterator);
   1055 };
   1056 
   1057 // Abstract the signature of a method.
   1058 class Signature {
   1059  public:
   1060   std::string ToString() const;
   1061 
   1062   static Signature NoSignature() {
   1063     return Signature();
   1064   }
   1065 
   1066   bool operator==(const Signature& rhs) const;
   1067   bool operator!=(const Signature& rhs) const {
   1068     return !(*this == rhs);
   1069   }
   1070 
   1071   bool operator==(const StringPiece& rhs) const;
   1072 
   1073  private:
   1074   Signature(const DexFile* dex, const DexFile::ProtoId& proto) : dex_file_(dex), proto_id_(&proto) {
   1075   }
   1076 
   1077   Signature() : dex_file_(nullptr), proto_id_(nullptr) {
   1078   }
   1079 
   1080   friend class DexFile;
   1081 
   1082   const DexFile* const dex_file_;
   1083   const DexFile::ProtoId* const proto_id_;
   1084 };
   1085 std::ostream& operator<<(std::ostream& os, const Signature& sig);
   1086 
   1087 // Iterate and decode class_data_item
   1088 class ClassDataItemIterator {
   1089  public:
   1090   ClassDataItemIterator(const DexFile& dex_file, const byte* raw_class_data_item)
   1091       : dex_file_(dex_file), pos_(0), ptr_pos_(raw_class_data_item), last_idx_(0) {
   1092     ReadClassDataHeader();
   1093     if (EndOfInstanceFieldsPos() > 0) {
   1094       ReadClassDataField();
   1095     } else if (EndOfVirtualMethodsPos() > 0) {
   1096       ReadClassDataMethod();
   1097     }
   1098   }
   1099   uint32_t NumStaticFields() const {
   1100     return header_.static_fields_size_;
   1101   }
   1102   uint32_t NumInstanceFields() const {
   1103     return header_.instance_fields_size_;
   1104   }
   1105   uint32_t NumDirectMethods() const {
   1106     return header_.direct_methods_size_;
   1107   }
   1108   uint32_t NumVirtualMethods() const {
   1109     return header_.virtual_methods_size_;
   1110   }
   1111   bool HasNextStaticField() const {
   1112     return pos_ < EndOfStaticFieldsPos();
   1113   }
   1114   bool HasNextInstanceField() const {
   1115     return pos_ >= EndOfStaticFieldsPos() && pos_ < EndOfInstanceFieldsPos();
   1116   }
   1117   bool HasNextDirectMethod() const {
   1118     return pos_ >= EndOfInstanceFieldsPos() && pos_ < EndOfDirectMethodsPos();
   1119   }
   1120   bool HasNextVirtualMethod() const {
   1121     return pos_ >= EndOfDirectMethodsPos() && pos_ < EndOfVirtualMethodsPos();
   1122   }
   1123   bool HasNext() const {
   1124     return pos_ < EndOfVirtualMethodsPos();
   1125   }
   1126   inline void Next() {
   1127     pos_++;
   1128     if (pos_ < EndOfStaticFieldsPos()) {
   1129       last_idx_ = GetMemberIndex();
   1130       ReadClassDataField();
   1131     } else if (pos_ == EndOfStaticFieldsPos() && NumInstanceFields() > 0) {
   1132       last_idx_ = 0;  // transition to next array, reset last index
   1133       ReadClassDataField();
   1134     } else if (pos_ < EndOfInstanceFieldsPos()) {
   1135       last_idx_ = GetMemberIndex();
   1136       ReadClassDataField();
   1137     } else if (pos_ == EndOfInstanceFieldsPos() && NumDirectMethods() > 0) {
   1138       last_idx_ = 0;  // transition to next array, reset last index
   1139       ReadClassDataMethod();
   1140     } else if (pos_ < EndOfDirectMethodsPos()) {
   1141       last_idx_ = GetMemberIndex();
   1142       ReadClassDataMethod();
   1143     } else if (pos_ == EndOfDirectMethodsPos() && NumVirtualMethods() > 0) {
   1144       last_idx_ = 0;  // transition to next array, reset last index
   1145       ReadClassDataMethod();
   1146     } else if (pos_ < EndOfVirtualMethodsPos()) {
   1147       last_idx_ = GetMemberIndex();
   1148       ReadClassDataMethod();
   1149     } else {
   1150       DCHECK(!HasNext());
   1151     }
   1152   }
   1153   uint32_t GetMemberIndex() const {
   1154     if (pos_ < EndOfInstanceFieldsPos()) {
   1155       return last_idx_ + field_.field_idx_delta_;
   1156     } else {
   1157       DCHECK_LT(pos_, EndOfVirtualMethodsPos());
   1158       return last_idx_ + method_.method_idx_delta_;
   1159     }
   1160   }
   1161   uint32_t GetRawMemberAccessFlags() const {
   1162     if (pos_ < EndOfInstanceFieldsPos()) {
   1163       return field_.access_flags_;
   1164     } else {
   1165       DCHECK_LT(pos_, EndOfVirtualMethodsPos());
   1166       return method_.access_flags_;
   1167     }
   1168   }
   1169   uint32_t GetFieldAccessFlags() const {
   1170     return GetRawMemberAccessFlags() & kAccValidFieldFlags;
   1171   }
   1172   uint32_t GetMethodAccessFlags() const {
   1173     return GetRawMemberAccessFlags() & kAccValidMethodFlags;
   1174   }
   1175   bool MemberIsNative() const {
   1176     return GetRawMemberAccessFlags() & kAccNative;
   1177   }
   1178   bool MemberIsFinal() const {
   1179     return GetRawMemberAccessFlags() & kAccFinal;
   1180   }
   1181   InvokeType GetMethodInvokeType(const DexFile::ClassDef& class_def) const {
   1182     if (HasNextDirectMethod()) {
   1183       if ((GetRawMemberAccessFlags() & kAccStatic) != 0) {
   1184         return kStatic;
   1185       } else {
   1186         return kDirect;
   1187       }
   1188     } else {
   1189       DCHECK_EQ(GetRawMemberAccessFlags() & kAccStatic, 0U);
   1190       if ((class_def.access_flags_ & kAccInterface) != 0) {
   1191         return kInterface;
   1192       } else if ((GetRawMemberAccessFlags() & kAccConstructor) != 0) {
   1193         return kSuper;
   1194       } else {
   1195         return kVirtual;
   1196       }
   1197     }
   1198   }
   1199   const DexFile::CodeItem* GetMethodCodeItem() const {
   1200     return dex_file_.GetCodeItem(method_.code_off_);
   1201   }
   1202   uint32_t GetMethodCodeItemOffset() const {
   1203     return method_.code_off_;
   1204   }
   1205   const byte* EndDataPointer() const {
   1206     CHECK(!HasNext());
   1207     return ptr_pos_;
   1208   }
   1209 
   1210  private:
   1211   // A dex file's class_data_item is leb128 encoded, this structure holds a decoded form of the
   1212   // header for a class_data_item
   1213   struct ClassDataHeader {
   1214     uint32_t static_fields_size_;  // the number of static fields
   1215     uint32_t instance_fields_size_;  // the number of instance fields
   1216     uint32_t direct_methods_size_;  // the number of direct methods
   1217     uint32_t virtual_methods_size_;  // the number of virtual methods
   1218   } header_;
   1219 
   1220   // Read and decode header from a class_data_item stream into header
   1221   void ReadClassDataHeader();
   1222 
   1223   uint32_t EndOfStaticFieldsPos() const {
   1224     return header_.static_fields_size_;
   1225   }
   1226   uint32_t EndOfInstanceFieldsPos() const {
   1227     return EndOfStaticFieldsPos() + header_.instance_fields_size_;
   1228   }
   1229   uint32_t EndOfDirectMethodsPos() const {
   1230     return EndOfInstanceFieldsPos() + header_.direct_methods_size_;
   1231   }
   1232   uint32_t EndOfVirtualMethodsPos() const {
   1233     return EndOfDirectMethodsPos() + header_.virtual_methods_size_;
   1234   }
   1235 
   1236   // A decoded version of the field of a class_data_item
   1237   struct ClassDataField {
   1238     uint32_t field_idx_delta_;  // delta of index into the field_ids array for FieldId
   1239     uint32_t access_flags_;  // access flags for the field
   1240     ClassDataField() :  field_idx_delta_(0), access_flags_(0) {}
   1241 
   1242    private:
   1243     DISALLOW_COPY_AND_ASSIGN(ClassDataField);
   1244   };
   1245   ClassDataField field_;
   1246 
   1247   // Read and decode a field from a class_data_item stream into field
   1248   void ReadClassDataField();
   1249 
   1250   // A decoded version of the method of a class_data_item
   1251   struct ClassDataMethod {
   1252     uint32_t method_idx_delta_;  // delta of index into the method_ids array for MethodId
   1253     uint32_t access_flags_;
   1254     uint32_t code_off_;
   1255     ClassDataMethod() : method_idx_delta_(0), access_flags_(0), code_off_(0) {}
   1256 
   1257    private:
   1258     DISALLOW_COPY_AND_ASSIGN(ClassDataMethod);
   1259   };
   1260   ClassDataMethod method_;
   1261 
   1262   // Read and decode a method from a class_data_item stream into method
   1263   void ReadClassDataMethod();
   1264 
   1265   const DexFile& dex_file_;
   1266   size_t pos_;  // integral number of items passed
   1267   const byte* ptr_pos_;  // pointer into stream of class_data_item
   1268   uint32_t last_idx_;  // last read field or method index to apply delta to
   1269   DISALLOW_IMPLICIT_CONSTRUCTORS(ClassDataItemIterator);
   1270 };
   1271 
   1272 class EncodedStaticFieldValueIterator {
   1273  public:
   1274   EncodedStaticFieldValueIterator(const DexFile& dex_file, Handle<mirror::DexCache>* dex_cache,
   1275                                   Handle<mirror::ClassLoader>* class_loader,
   1276                                   ClassLinker* linker, const DexFile::ClassDef& class_def)
   1277       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
   1278 
   1279   template<bool kTransactionActive>
   1280   void ReadValueToField(mirror::ArtField* field) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
   1281 
   1282   bool HasNext() { return pos_ < array_size_; }
   1283 
   1284   void Next();
   1285 
   1286   enum ValueType {
   1287     kByte = 0x00,
   1288     kShort = 0x02,
   1289     kChar = 0x03,
   1290     kInt = 0x04,
   1291     kLong = 0x06,
   1292     kFloat = 0x10,
   1293     kDouble = 0x11,
   1294     kString = 0x17,
   1295     kType = 0x18,
   1296     kField = 0x19,
   1297     kMethod = 0x1a,
   1298     kEnum = 0x1b,
   1299     kArray = 0x1c,
   1300     kAnnotation = 0x1d,
   1301     kNull = 0x1e,
   1302     kBoolean = 0x1f
   1303   };
   1304 
   1305  private:
   1306   static const byte kEncodedValueTypeMask = 0x1f;  // 0b11111
   1307   static const byte kEncodedValueArgShift = 5;
   1308 
   1309   const DexFile& dex_file_;
   1310   Handle<mirror::DexCache>* const dex_cache_;  // Dex cache to resolve literal objects.
   1311   Handle<mirror::ClassLoader>* const class_loader_;  // ClassLoader to resolve types.
   1312   ClassLinker* linker_;  // Linker to resolve literal objects.
   1313   size_t array_size_;  // Size of array.
   1314   size_t pos_;  // Current position.
   1315   const byte* ptr_;  // Pointer into encoded data array.
   1316   ValueType type_;  // Type of current encoded value.
   1317   jvalue jval_;  // Value of current encoded value.
   1318   DISALLOW_IMPLICIT_CONSTRUCTORS(EncodedStaticFieldValueIterator);
   1319 };
   1320 std::ostream& operator<<(std::ostream& os, const EncodedStaticFieldValueIterator::ValueType& code);
   1321 
   1322 class CatchHandlerIterator {
   1323   public:
   1324     CatchHandlerIterator(const DexFile::CodeItem& code_item, uint32_t address);
   1325 
   1326     CatchHandlerIterator(const DexFile::CodeItem& code_item,
   1327                          const DexFile::TryItem& try_item);
   1328 
   1329     explicit CatchHandlerIterator(const byte* handler_data) {
   1330       Init(handler_data);
   1331     }
   1332 
   1333     uint16_t GetHandlerTypeIndex() const {
   1334       return handler_.type_idx_;
   1335     }
   1336     uint32_t GetHandlerAddress() const {
   1337       return handler_.address_;
   1338     }
   1339     void Next();
   1340     bool HasNext() const {
   1341       return remaining_count_ != -1 || catch_all_;
   1342     }
   1343     // End of this set of catch blocks, convenience method to locate next set of catch blocks
   1344     const byte* EndDataPointer() const {
   1345       CHECK(!HasNext());
   1346       return current_data_;
   1347     }
   1348 
   1349   private:
   1350     void Init(const DexFile::CodeItem& code_item, int32_t offset);
   1351     void Init(const byte* handler_data);
   1352 
   1353     struct CatchHandlerItem {
   1354       uint16_t type_idx_;  // type index of the caught exception type
   1355       uint32_t address_;  // handler address
   1356     } handler_;
   1357     const byte *current_data_;  // the current handler in dex file.
   1358     int32_t remaining_count_;   // number of handlers not read.
   1359     bool catch_all_;            // is there a handler that will catch all exceptions in case
   1360                                 // that all typed handler does not match.
   1361 };
   1362 
   1363 }  // namespace art
   1364 
   1365 #endif  // ART_RUNTIME_DEX_FILE_H_
   1366