diff options
author | Alex Light <allight@google.com> | 2018-06-02 05:37:39 +0000 |
---|---|---|
committer | Alex Light <allight@google.com> | 2018-06-02 15:45:36 +0000 |
commit | cc7e20f9ec7b4a7a57f7196e5e8be67a727f21d3 (patch) | |
tree | 3aebc9078ad94f132f7a5df0813a97bbdd4c4ed9 /libdexfile/dex/class_accessor-inl.h | |
parent | 2649ecf6c59a29262556aa356fbf894d49df8fe7 (diff) | |
download | art-cc7e20f9ec7b4a7a57f7196e5e8be67a727f21d3.tar.gz art-cc7e20f9ec7b4a7a57f7196e5e8be67a727f21d3.tar.bz2 art-cc7e20f9ec7b4a7a57f7196e5e8be67a727f21d3.zip |
Revert "Move runtime/ to ClassAccessor"
Seems to cause 'atest CtsInlineMockingTestCases' and other tests
to fail due to sending agents dex files with hiddenapi flags still
present.
This reverts commit 2649ecf6c59a29262556aa356fbf894d49df8fe7.
Reason for revert: Seems to be causing sysui test failures, maybe
Bug: 77709234
Bug: 79758018
Bug: 91962648
Test: Tree-Hugger
Change-Id: I2cab5d0d58808dd8beb38400d2811307f26e1021
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 |