summaryrefslogtreecommitdiffstats
path: root/libdexfile/dex/class_accessor-inl.h
diff options
context:
space:
mode:
authorAlex Light <allight@google.com>2018-06-02 05:37:39 +0000
committerAlex Light <allight@google.com>2018-06-02 15:45:36 +0000
commitcc7e20f9ec7b4a7a57f7196e5e8be67a727f21d3 (patch)
tree3aebc9078ad94f132f7a5df0813a97bbdd4c4ed9 /libdexfile/dex/class_accessor-inl.h
parent2649ecf6c59a29262556aa356fbf894d49df8fe7 (diff)
downloadart-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.h101
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