diff options
Diffstat (limited to 'libdexfile/dex/class_accessor.h')
-rw-r--r-- | libdexfile/dex/class_accessor.h | 78 |
1 files changed, 16 insertions, 62 deletions
diff --git a/libdexfile/dex/class_accessor.h b/libdexfile/dex/class_accessor.h index 4f0fd32e31..dda6e1c1a6 100644 --- a/libdexfile/dex/class_accessor.h +++ b/libdexfile/dex/class_accessor.h @@ -20,7 +20,6 @@ #include "base/utils.h" #include "code_item_accessors.h" #include "dex_file.h" -#include "hidden_api_access_flags.h" #include "invoke_type.h" #include "method_reference.h" #include "modifiers.h" @@ -34,18 +33,12 @@ class ClassAccessor { private: class BaseItem { public: - explicit BaseItem(const uint8_t* ptr_pos) : ptr_pos_(ptr_pos) {} - uint32_t GetIndex() const { return index_; } uint32_t GetAccessFlags() const { - return HiddenApiAccessFlags::RemoveFromDex(access_flags_); - } - - HiddenApiAccessFlags::ApiList DecodeHiddenAccessFlags() const { - return HiddenApiAccessFlags::DecodeFromDex(access_flags_); + return access_flags_; } bool IsFinal() const { @@ -53,8 +46,6 @@ class ClassAccessor { } protected: - // Internal data pointer for reading. - const uint8_t* ptr_pos_ = nullptr; uint32_t index_ = 0u; uint32_t access_flags_ = 0u; }; @@ -85,18 +76,13 @@ class ClassAccessor { return is_static_or_direct_; } - // Unhide the hidden API access flags at the iterator position. TODO: Deprecate. - void UnHideAccessFlags() const; - private: explicit Method(const DexFile& dex_file, - const uint8_t* ptr_pos, bool is_static_or_direct = true) - : BaseItem(ptr_pos), - dex_file_(dex_file), + : dex_file_(dex_file), is_static_or_direct_(is_static_or_direct) {} - void Read(); + const uint8_t* Read(const uint8_t* ptr); InvokeType GetDirectMethodInvokeType() const { return (GetAccessFlags() & kAccStatic) != 0 ? kStatic : kDirect; @@ -113,7 +99,6 @@ class ClassAccessor { } } - // Move to virtual method section. void NextSection() { DCHECK(is_static_or_direct_) << "Already in the virtual methods section"; is_static_or_direct_ = false; @@ -130,31 +115,20 @@ class ClassAccessor { // A decoded version of the field of a class_data_item. class Field : public BaseItem { public: - explicit Field(const DexFile& dex_file, - const uint8_t* ptr_pos) : BaseItem(ptr_pos), dex_file_(dex_file) {} + explicit Field(const DexFile& dex_file) : dex_file_(dex_file) {} const DexFile& GetDexFile() const { return dex_file_; } - bool IsStatic() const { - return is_static_; - } - - // Unhide the hidden API access flags at the iterator position. TODO: Deprecate. - void UnHideAccessFlags() const; - private: - void Read(); + const uint8_t* Read(const uint8_t* ptr); - // Move to instance fields section. void NextSection() { index_ = 0u; - is_static_ = false; } const DexFile& dex_file_; - bool is_static_ = true; friend class ClassAccessor; }; @@ -170,10 +144,11 @@ class ClassAccessor { uint32_t partition_pos, uint32_t iterator_end, const uint8_t* ptr_pos) - : data_(dex_file, ptr_pos), + : data_(dex_file), position_(position), partition_pos_(partition_pos), - iterator_end_(iterator_end) { + iterator_end_(iterator_end), + ptr_pos_(ptr_pos) { ReadData(); } @@ -230,7 +205,8 @@ class ClassAccessor { if (position_ == partition_pos_) { data_.NextSection(); } - data_.Read(); + DCHECK(ptr_pos_ != nullptr); + ptr_pos_ = data_.Read(ptr_pos_); } } @@ -241,6 +217,8 @@ class ClassAccessor { const uint32_t partition_pos_; // At iterator_end_, the iterator is no longer valid. const uint32_t iterator_end_; + // Internal data pointer. + const uint8_t* ptr_pos_; }; // Not explicit specifically for range-based loops. @@ -274,21 +252,9 @@ class ClassAccessor { // Return the iteration range for all the fields. IterationRange<DataIterator<Field>> GetFields() const; - // Return the iteration range for all the static fields. - IterationRange<DataIterator<Field>> GetStaticFields() const; - - // Return the iteration range for all the instance fields. - IterationRange<DataIterator<Field>> GetInstanceFields() const; - // Return the iteration range for all the methods. IterationRange<DataIterator<Method>> GetMethods() const; - // Return the iteration range for the direct methods. - IterationRange<DataIterator<Method>> GetDirectMethods() const; - - // Return the iteration range for the virtual methods. - IterationRange<DataIterator<Method>> GetVirtualMethods() const; - uint32_t NumStaticFields() const { return num_static_fields_; } @@ -297,10 +263,6 @@ class ClassAccessor { return num_instance_fields_; } - uint32_t NumFields() const { - return NumStaticFields() + NumInstanceFields(); - } - uint32_t NumDirectMethods() const { return num_direct_methods_; } @@ -323,22 +285,14 @@ class ClassAccessor { return dex_file_; } - bool HasClassData() const { - return ptr_pos_ != nullptr; - } - protected: // Template visitor to reduce copy paste for visiting elements. // No thread safety analysis since the visitor may require capabilities. template <typename DataType, typename Visitor> - void VisitMembers(size_t count, const Visitor& visitor, DataType* data) const - NO_THREAD_SAFETY_ANALYSIS; - - // Return an iteration range for the first <count> fields. - IterationRange<DataIterator<Field>> GetFieldsInternal(size_t count) const; - - // Return an iteration range for the first <count> methods. - IterationRange<DataIterator<Method>> GetMethodsInternal(size_t count) const; + const uint8_t* VisitMembers(size_t count, + const Visitor& visitor, + const uint8_t* ptr, + DataType* data) const NO_THREAD_SAFETY_ANALYSIS; const DexFile& dex_file_; const dex::TypeIndex descriptor_index_ = {}; |