diff options
Diffstat (limited to 'runtime/dex_file.h')
| -rw-r--r-- | runtime/dex_file.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/runtime/dex_file.h b/runtime/dex_file.h index a1ddbc7d61..89283213a8 100644 --- a/runtime/dex_file.h +++ b/runtime/dex_file.h @@ -28,6 +28,8 @@ #include "globals.h" #include "invoke_type.h" #include "jni.h" +#include "jvalue.h" +#include "mirror/object_array.h" #include "modifiers.h" #include "utf.h" @@ -384,6 +386,17 @@ class DexFile { DISALLOW_COPY_AND_ASSIGN(AnnotationItem); }; + struct AnnotationValue { + JValue value_; + uint8_t type_; + }; + + enum AnnotationResultStyle { // private + kAllObjects, + kPrimitivesOrObjects, + kAllRaw + }; + // Returns the checksum of a file for comparison with GetLocationChecksum(). // For .dex files, this is the header checksum. // For zip files, this is the classes.dex zip entry CRC32 checksum. @@ -643,6 +656,11 @@ class DexFile { return StringDataByIdx(method_id.name_idx_); } + // Returns the shorty of a method by its index. + const char* GetMethodShorty(uint32_t idx) const { + return StringDataByIdx(GetProtoId(GetMethodId(idx).proto_idx_).shorty_idx_); + } + // Returns the shorty of a method id. const char* GetMethodShorty(const MethodId& method_id) const { return StringDataByIdx(GetProtoId(method_id.proto_idx_).shorty_idx_); @@ -812,6 +830,187 @@ class DexFile { static bool LineNumForPcCb(void* context, uint32_t address, uint32_t line_num); + const AnnotationsDirectoryItem* GetAnnotationsDirectory(const ClassDef& class_def) const { + if (class_def.annotations_off_ == 0) { + return nullptr; + } else { + return reinterpret_cast<const AnnotationsDirectoryItem*>(begin_ + class_def.annotations_off_); + } + } + + const AnnotationSetItem* GetClassAnnotationSet(const AnnotationsDirectoryItem* anno_dir) const { + if (anno_dir->class_annotations_off_ == 0) { + return nullptr; + } else { + return reinterpret_cast<const AnnotationSetItem*>(begin_ + anno_dir->class_annotations_off_); + } + } + + const FieldAnnotationsItem* GetFieldAnnotations(const AnnotationsDirectoryItem* anno_dir) const { + if (anno_dir->fields_size_ == 0) { + return nullptr; + } else { + return reinterpret_cast<const FieldAnnotationsItem*>(&anno_dir[1]); + } + } + + const MethodAnnotationsItem* GetMethodAnnotations(const AnnotationsDirectoryItem* anno_dir) + const { + if (anno_dir->methods_size_ == 0) { + return nullptr; + } else { + // Skip past the header and field annotations. + const uint8_t* addr = reinterpret_cast<const uint8_t*>(&anno_dir[1]); + addr += anno_dir->fields_size_ * sizeof(FieldAnnotationsItem); + return reinterpret_cast<const MethodAnnotationsItem*>(addr); + } + } + + const ParameterAnnotationsItem* GetParameterAnnotations(const AnnotationsDirectoryItem* anno_dir) + const { + if (anno_dir->parameters_size_ == 0) { + return nullptr; + } else { + // Skip past the header, field annotations, and method annotations. + const uint8_t* addr = reinterpret_cast<const uint8_t*>(&anno_dir[1]); + addr += anno_dir->fields_size_ * sizeof(FieldAnnotationsItem); + addr += anno_dir->methods_size_ * sizeof(MethodAnnotationsItem); + return reinterpret_cast<const ParameterAnnotationsItem*>(addr); + } + } + + const AnnotationSetItem* GetFieldAnnotationSetItem(const FieldAnnotationsItem& anno_item) const { + uint32_t offset = anno_item.annotations_off_; + if (offset == 0) { + return nullptr; + } else { + return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset); + } + } + + const AnnotationSetItem* GetMethodAnnotationSetItem(const MethodAnnotationsItem& anno_item) + const { + uint32_t offset = anno_item.annotations_off_; + if (offset == 0) { + return nullptr; + } else { + return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset); + } + } + + const AnnotationSetRefList* GetParameterAnnotationSetRefList( + const ParameterAnnotationsItem* anno_item) const { + uint32_t offset = anno_item->annotations_off_; + if (offset == 0) { + return nullptr; + } + return reinterpret_cast<const AnnotationSetRefList*>(begin_ + offset); + } + + const AnnotationItem* GetAnnotationItem(const AnnotationSetItem* set_item, uint32_t index) const { + DCHECK_LE(index, set_item->size_); + uint32_t offset = set_item->entries_[index]; + if (offset == 0) { + return nullptr; + } else { + return reinterpret_cast<const AnnotationItem*>(begin_ + offset); + } + } + + const AnnotationSetItem* GetSetRefItemItem(const AnnotationSetRefItem* anno_item) const { + uint32_t offset = anno_item->annotations_off_; + if (offset == 0) { + return nullptr; + } + return reinterpret_cast<const AnnotationSetItem*>(begin_ + offset); + } + + const AnnotationSetItem* FindAnnotationSetForField(ArtField* field) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* GetAnnotationForField(ArtField* field, Handle<mirror::Class> annotation_class) + const SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetAnnotationsForField(ArtField* field) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetSignatureAnnotationForField(ArtField* field) const + SHARED_REQUIRES(Locks::mutator_lock_); + bool IsFieldAnnotationPresent(ArtField* field, Handle<mirror::Class> annotation_class) const + SHARED_REQUIRES(Locks::mutator_lock_); + + const AnnotationSetItem* FindAnnotationSetForMethod(ArtMethod* method) const + SHARED_REQUIRES(Locks::mutator_lock_); + const ParameterAnnotationsItem* FindAnnotationsItemForMethod(ArtMethod* method) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* GetAnnotationDefaultValue(ArtMethod* method) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* GetAnnotationForMethod(ArtMethod* method, Handle<mirror::Class> annotation_class) + const SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetAnnotationsForMethod(ArtMethod* method) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetExceptionTypesForMethod(ArtMethod* method) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetParameterAnnotations(ArtMethod* method) const + SHARED_REQUIRES(Locks::mutator_lock_); + bool IsMethodAnnotationPresent(ArtMethod* method, Handle<mirror::Class> annotation_class) const + SHARED_REQUIRES(Locks::mutator_lock_); + + const AnnotationSetItem* FindAnnotationSetForClass(Handle<mirror::Class> klass) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* GetAnnotationForClass(Handle<mirror::Class> klass, + Handle<mirror::Class> annotation_class) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetAnnotationsForClass(Handle<mirror::Class> klass) const + SHARED_REQUIRES(Locks::mutator_lock_); + bool IsClassAnnotationPresent(Handle<mirror::Class> klass, Handle<mirror::Class> annotation_class) + const SHARED_REQUIRES(Locks::mutator_lock_); + + mirror::Object* CreateAnnotationMember(Handle<mirror::Class> klass, + Handle<mirror::Class> annotation_class, + const uint8_t** annotation) const + SHARED_REQUIRES(Locks::mutator_lock_); + const AnnotationItem* GetAnnotationItemFromAnnotationSet(Handle<mirror::Class> klass, + const AnnotationSetItem* annotation_set, + uint32_t visibility, + Handle<mirror::Class> annotation_class) + const SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* GetAnnotationObjectFromAnnotationSet(Handle<mirror::Class> klass, + const AnnotationSetItem* annotation_set, + uint32_t visibility, + Handle<mirror::Class> annotation_class) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* GetAnnotationValue(Handle<mirror::Class> klass, + const AnnotationItem* annotation_item, + const char* annotation_name, + Handle<mirror::Class> array_class, + uint32_t expected_type) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetSignatureValue(Handle<mirror::Class> klass, + const AnnotationSetItem* annotation_set) + const SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* GetThrowsValue(Handle<mirror::Class> klass, + const AnnotationSetItem* annotation_set) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* ProcessAnnotationSet(Handle<mirror::Class> klass, + const AnnotationSetItem* annotation_set, + uint32_t visibility) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::ObjectArray<mirror::Object>* ProcessAnnotationSetRefList(Handle<mirror::Class> klass, + const AnnotationSetRefList* set_ref_list, uint32_t size) const + SHARED_REQUIRES(Locks::mutator_lock_); + bool ProcessAnnotationValue(Handle<mirror::Class> klass, const uint8_t** annotation_ptr, + AnnotationValue* annotation_value, Handle<mirror::Class> return_class, + DexFile::AnnotationResultStyle result_style) const + SHARED_REQUIRES(Locks::mutator_lock_); + mirror::Object* ProcessEncodedAnnotation(Handle<mirror::Class> klass, + const uint8_t** annotation) const + SHARED_REQUIRES(Locks::mutator_lock_); + const AnnotationItem* SearchAnnotationSet(const AnnotationSetItem* annotation_set, + const char* descriptor, uint32_t visibility) const + SHARED_REQUIRES(Locks::mutator_lock_); + const uint8_t* SearchEncodedAnnotation(const uint8_t* annotation, const char* name) const + SHARED_REQUIRES(Locks::mutator_lock_); + bool SkipAnnotationValue(const uint8_t** annotation_ptr) const + SHARED_REQUIRES(Locks::mutator_lock_); + // Debug info opcodes and constants enum { DBG_END_SEQUENCE = 0x00, |