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.
GetJavaAccessFlagsClassDef208     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:
Size()239     uint32_t Size() const {
240       return size_;
241     }
242 
GetTypeItem(uint32_t idx)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.
GetHeaderSize()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.
GetListSize(size_t count)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
Open(const uint8_t * base,size_t size,const std::string & location,uint32_t location_checksum,const OatFile * oat_file,std::string * error_msg)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 
GetLocation()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.
GetBaseLocation(const char * location)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 
GetBaseLocation()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.
GetLocationChecksum()433   uint32_t GetLocationChecksum() const {
434     return location_checksum_;
435   }
436 
GetHeader()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.
NumStringIds()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.
GetStringId(uint32_t idx)458   const StringId& GetStringId(uint32_t idx) const {
459     DCHECK_LT(idx, NumStringIds()) << GetLocation();
460     return string_ids_[idx];
461   }
462 
GetIndexForStringId(const StringId & string_id)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 
GetStringData(const StringId & string_id)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.
StringDataAndUtf16LengthByIdx(uint32_t idx,uint32_t * utf16_length)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 
StringDataByIdx(uint32_t idx)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.
NumTypeIds()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.
GetTypeId(uint32_t idx)509   const TypeId& GetTypeId(uint32_t idx) const {
510     DCHECK_LT(idx, NumTypeIds()) << GetLocation();
511     return type_ids_[idx];
512   }
513 
GetIndexForTypeId(const TypeId & type_id)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.
StringByTypeIdx(uint32_t idx,uint32_t * unicode_length)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 
StringByTypeIdx(uint32_t idx)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.
GetTypeDescriptor(const TypeId & 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.
NumFieldIds()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.
GetFieldId(uint32_t idx)548   const FieldId& GetFieldId(uint32_t idx) const {
549     DCHECK_LT(idx, NumFieldIds()) << GetLocation();
550     return field_ids_[idx];
551   }
552 
GetIndexForFieldId(const FieldId & field_id)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.
GetFieldDeclaringClassDescriptor(const FieldId & 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.
GetFieldTypeDescriptor(const FieldId & 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.
GetFieldName(const FieldId & 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.
NumMethodIds()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.
GetMethodId(uint32_t idx)588   const MethodId& GetMethodId(uint32_t idx) const {
589     DCHECK_LT(idx, NumMethodIds()) << GetLocation();
590     return method_ids_[idx];
591   }
592 
GetIndexForMethodId(const MethodId & method_id)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.
GetMethodDeclaringClassDescriptor(const MethodId & 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.
GetMethodPrototype(const MethodId & 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.
GetMethodName(const MethodId & 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.
GetMethodShorty(const MethodId & method_id)624   const char* GetMethodShorty(const MethodId& method_id) const {
625     return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_);
626   }
GetMethodShorty(const MethodId & method_id,uint32_t * length)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.
NumClassDefs()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.
GetClassDef(uint16_t idx)638   const ClassDef& GetClassDef(uint16_t idx) const {
639     DCHECK_LT(idx, NumClassDefs()) << GetLocation();
640     return class_defs_[idx];
641   }
642 
GetIndexForClassDef(const ClassDef & class_def)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.
GetClassDescriptor(const ClassDef & class_def)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 
GetInterfacesList(const ClassDef & class_def)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
GetClassData(const ClassDef & class_def)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   //
GetCodeItem(const uint32_t code_off)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 
GetReturnTypeDescriptor(const ProtoId & proto_id)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.
NumProtoIds()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.
GetProtoId(uint32_t idx)700   const ProtoId& GetProtoId(uint32_t idx) const {
701     DCHECK_LT(idx, NumProtoIds()) << GetLocation();
702     return proto_ids_[idx];
703   }
704 
GetIndexForProtoId(const ProtoId & proto_id)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;
FindProtoId(uint16_t return_type_idx,const std::vector<uint16_t> & signature_type_idxs)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.
GetShorty(uint32_t proto_idx)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 
GetProtoParameters(const ProtoId & proto_id)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 
GetEncodedStaticFieldValuesArray(const ClassDef & class_def)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.
GetCatchHandlerData(const CodeItem & code_item,uint32_t offset)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
GetDebugInfoStream(const CodeItem * code_item)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 {
LocalInfoLocalInfo807     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 {
LineNumFromPcContextLineNumFromPcContext821     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 
InvokeLocalCbIfLive(void * context,int reg,uint32_t end_address,LocalInfo * local_in_reg,DexDebugNewLocalCb local_cb)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 
GetSourceFile(const ClassDef & class_def)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 
Begin()869   const byte* Begin() const {
870     return begin_;
871   }
872 
Size()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 
GetOatFile()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 {
MakeEmptyUTF16EmptyFn999     void MakeEmpty(std::pair<const char*, const ClassDef*>& pair) const {
1000       pair.first = nullptr;
1001       pair.second = nullptr;
1002     }
IsEmptyUTF16EmptyFn1003     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.
operatorUTF16HashCmp1013     size_t operator()(const char* key) const {
1014       return ComputeModifiedUtf8Hash(key);
1015     }
1016     // std::equal function.
operatorUTF16HashCmp1017     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:
DexFileParameterIterator(const DexFile & dex_file,const DexFile::ProtoId & proto_id)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   }
HasNext()1041   bool HasNext() const { return pos_ < size_; }
Next()1042   void Next() { ++pos_; }
GetTypeIdx()1043   uint16_t GetTypeIdx() {
1044     return type_list_->GetTypeItem(pos_).type_idx_;
1045   }
GetDescriptor()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 
NoSignature()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:
Signature(const DexFile * dex,const DexFile::ProtoId & proto)1074   Signature(const DexFile* dex, const DexFile::ProtoId& proto) : dex_file_(dex), proto_id_(&proto) {
1075   }
1076 
Signature()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:
ClassDataItemIterator(const DexFile & dex_file,const byte * raw_class_data_item)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   }
NumStaticFields()1099   uint32_t NumStaticFields() const {
1100     return header_.static_fields_size_;
1101   }
NumInstanceFields()1102   uint32_t NumInstanceFields() const {
1103     return header_.instance_fields_size_;
1104   }
NumDirectMethods()1105   uint32_t NumDirectMethods() const {
1106     return header_.direct_methods_size_;
1107   }
NumVirtualMethods()1108   uint32_t NumVirtualMethods() const {
1109     return header_.virtual_methods_size_;
1110   }
HasNextStaticField()1111   bool HasNextStaticField() const {
1112     return pos_ < EndOfStaticFieldsPos();
1113   }
HasNextInstanceField()1114   bool HasNextInstanceField() const {
1115     return pos_ >= EndOfStaticFieldsPos() && pos_ < EndOfInstanceFieldsPos();
1116   }
HasNextDirectMethod()1117   bool HasNextDirectMethod() const {
1118     return pos_ >= EndOfInstanceFieldsPos() && pos_ < EndOfDirectMethodsPos();
1119   }
HasNextVirtualMethod()1120   bool HasNextVirtualMethod() const {
1121     return pos_ >= EndOfDirectMethodsPos() && pos_ < EndOfVirtualMethodsPos();
1122   }
HasNext()1123   bool HasNext() const {
1124     return pos_ < EndOfVirtualMethodsPos();
1125   }
Next()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   }
GetMemberIndex()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   }
GetRawMemberAccessFlags()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   }
GetFieldAccessFlags()1169   uint32_t GetFieldAccessFlags() const {
1170     return GetRawMemberAccessFlags() & kAccValidFieldFlags;
1171   }
GetMethodAccessFlags()1172   uint32_t GetMethodAccessFlags() const {
1173     return GetRawMemberAccessFlags() & kAccValidMethodFlags;
1174   }
MemberIsNative()1175   bool MemberIsNative() const {
1176     return GetRawMemberAccessFlags() & kAccNative;
1177   }
MemberIsFinal()1178   bool MemberIsFinal() const {
1179     return GetRawMemberAccessFlags() & kAccFinal;
1180   }
GetMethodInvokeType(const DexFile::ClassDef & class_def)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   }
GetMethodCodeItem()1199   const DexFile::CodeItem* GetMethodCodeItem() const {
1200     return dex_file_.GetCodeItem(method_.code_off_);
1201   }
GetMethodCodeItemOffset()1202   uint32_t GetMethodCodeItemOffset() const {
1203     return method_.code_off_;
1204   }
EndDataPointer()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 
EndOfStaticFieldsPos()1223   uint32_t EndOfStaticFieldsPos() const {
1224     return header_.static_fields_size_;
1225   }
EndOfInstanceFieldsPos()1226   uint32_t EndOfInstanceFieldsPos() const {
1227     return EndOfStaticFieldsPos() + header_.instance_fields_size_;
1228   }
EndOfDirectMethodsPos()1229   uint32_t EndOfDirectMethodsPos() const {
1230     return EndOfInstanceFieldsPos() + header_.direct_methods_size_;
1231   }
EndOfVirtualMethodsPos()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
ClassDataFieldClassDataField1240     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_;
ClassDataMethodClassDataMethod1255     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 
HasNext()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 
CatchHandlerIterator(const byte * handler_data)1329     explicit CatchHandlerIterator(const byte* handler_data) {
1330       Init(handler_data);
1331     }
1332 
GetHandlerTypeIndex()1333     uint16_t GetHandlerTypeIndex() const {
1334       return handler_.type_idx_;
1335     }
GetHandlerAddress()1336     uint32_t GetHandlerAddress() const {
1337       return handler_.address_;
1338     }
1339     void Next();
HasNext()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
EndDataPointer()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