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