diff options
Diffstat (limited to 'libdexfile/dex/class_accessor-inl.h')
-rw-r--r-- | libdexfile/dex/class_accessor-inl.h | 101 |
1 files changed, 32 insertions, 69 deletions
diff --git a/libdexfile/dex/class_accessor-inl.h b/libdexfile/dex/class_accessor-inl.h index 3bb9e93e5a..49ca98d47f 100644 --- a/libdexfile/dex/class_accessor-inl.h +++ b/libdexfile/dex/class_accessor-inl.h @@ -37,26 +37,30 @@ inline ClassAccessor::ClassAccessor(const DexFile& dex_file, const DexFile::Clas num_direct_methods_(ptr_pos_ != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u), num_virtual_methods_(ptr_pos_ != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u) {} -inline void ClassAccessor::Method::Read() { - index_ += DecodeUnsignedLeb128(&ptr_pos_); - access_flags_ = DecodeUnsignedLeb128(&ptr_pos_); - code_off_ = DecodeUnsignedLeb128(&ptr_pos_); +inline const uint8_t* ClassAccessor::Method::Read(const uint8_t* ptr) { + index_ += DecodeUnsignedLeb128(&ptr); + access_flags_ = DecodeUnsignedLeb128(&ptr); + code_off_ = DecodeUnsignedLeb128(&ptr); + return ptr; } -inline void ClassAccessor::Field::Read() { - index_ += DecodeUnsignedLeb128(&ptr_pos_); - access_flags_ = DecodeUnsignedLeb128(&ptr_pos_); +inline const uint8_t* ClassAccessor::Field::Read(const uint8_t* ptr) { + index_ += DecodeUnsignedLeb128(&ptr); + access_flags_ = DecodeUnsignedLeb128(&ptr); + return ptr; } template <typename DataType, typename Visitor> -inline void ClassAccessor::VisitMembers(size_t count, - const Visitor& visitor, - DataType* data) const { +inline const uint8_t* ClassAccessor::VisitMembers(size_t count, + const Visitor& visitor, + const uint8_t* ptr, + DataType* data) const { DCHECK(data != nullptr); for ( ; count != 0; --count) { - data->Read(); + ptr = data->Read(ptr); visitor(*data); } + return ptr; } template <typename StaticFieldVisitor, @@ -68,15 +72,15 @@ inline void ClassAccessor::VisitFieldsAndMethods( const InstanceFieldVisitor& instance_field_visitor, const DirectMethodVisitor& direct_method_visitor, const VirtualMethodVisitor& virtual_method_visitor) const { - Field field(dex_file_, ptr_pos_); - VisitMembers(num_static_fields_, static_field_visitor, &field); + Field field(dex_file_); + const uint8_t* ptr = VisitMembers(num_static_fields_, static_field_visitor, ptr_pos_, &field); field.NextSection(); - VisitMembers(num_instance_fields_, instance_field_visitor, &field); + ptr = VisitMembers(num_instance_fields_, instance_field_visitor, ptr, &field); - Method method(dex_file_, field.ptr_pos_, /*is_static_or_direct*/ true); - VisitMembers(num_direct_methods_, direct_method_visitor, &method); + Method method(dex_file_, /*is_static_or_direct*/ true); + ptr = VisitMembers(num_direct_methods_, direct_method_visitor, ptr, &method); method.NextSection(); - VisitMembers(num_virtual_methods_, virtual_method_visitor, &method); + ptr = VisitMembers(num_virtual_methods_, virtual_method_visitor, ptr, &method); } template <typename DirectMethodVisitor, @@ -115,64 +119,23 @@ inline const DexFile::CodeItem* ClassAccessor::Method::GetCodeItem() const { return dex_file_.GetCodeItem(code_off_); } -inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Field>> - ClassAccessor::GetFieldsInternal(size_t count) const { - return { DataIterator<Field>(dex_file_, 0u, num_static_fields_, count, ptr_pos_), - DataIterator<Field>(dex_file_, count, num_static_fields_, count, ptr_pos_) }; -} - -// Return an iteration range for the first <count> methods. -inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Method>> - ClassAccessor::GetMethodsInternal(size_t count) const { - // Skip over the fields. - Field field(dex_file_, ptr_pos_); - VisitMembers(NumFields(), VoidFunctor(), &field); - // Return the iterator pair. - return { DataIterator<Method>(dex_file_, 0u, num_direct_methods_, count, field.ptr_pos_), - DataIterator<Method>(dex_file_, count, num_direct_methods_, count, field.ptr_pos_) }; -} - inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Field>> ClassAccessor::GetFields() const { - return GetFieldsInternal(num_static_fields_ + num_instance_fields_); -} - -inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Field>> - ClassAccessor::GetStaticFields() const { - return GetFieldsInternal(num_static_fields_); -} - - -inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Field>> - ClassAccessor::GetInstanceFields() const { - IterationRange<ClassAccessor::DataIterator<ClassAccessor::Field>> fields = GetFields(); - // Skip the static fields. - return { std::next(fields.begin(), NumStaticFields()), fields.end() }; + const uint32_t limit = num_static_fields_ + num_instance_fields_; + return { DataIterator<Field>(dex_file_, 0u, num_static_fields_, limit, ptr_pos_), + DataIterator<Field>(dex_file_, limit, num_static_fields_, limit, ptr_pos_) }; } inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Method>> ClassAccessor::GetMethods() const { - return GetMethodsInternal(NumMethods()); -} - -inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Method>> - ClassAccessor::GetDirectMethods() const { - return GetMethodsInternal(NumDirectMethods()); -} - -inline IterationRange<ClassAccessor::DataIterator<ClassAccessor::Method>> - ClassAccessor::GetVirtualMethods() const { - IterationRange<DataIterator<Method>> methods = GetMethods(); - // Skip the direct fields. - return { std::next(methods.begin(), NumDirectMethods()), methods.end() }; -} - -inline void ClassAccessor::Field::UnHideAccessFlags() const { - DexFile::UnHideAccessFlags(const_cast<uint8_t*>(ptr_pos_), GetAccessFlags(), /*is_method*/ false); -} - -inline void ClassAccessor::Method::UnHideAccessFlags() const { - DexFile::UnHideAccessFlags(const_cast<uint8_t*>(ptr_pos_), GetAccessFlags(), /*is_method*/ true); + // Skip over the fields. + Field field(dex_file_); + const size_t skip_count = num_static_fields_ + num_instance_fields_; + const uint8_t* ptr_pos = VisitMembers(skip_count, VoidFunctor(), ptr_pos_, &field); + // Return the iterator pair for all the methods. + const uint32_t limit = num_direct_methods_ + num_virtual_methods_; + return { DataIterator<Method>(dex_file_, 0u, num_direct_methods_, limit, ptr_pos), + DataIterator<Method>(dex_file_, limit, num_direct_methods_, limit, ptr_pos) }; } } // namespace art |