diff options
-rw-r--r-- | compiler/dex/dex_to_dex_decompiler_test.cc | 3 | ||||
-rw-r--r-- | compiler/driver/compiler_driver.cc | 20 | ||||
-rw-r--r-- | dexdump/dexdump.cc | 2 | ||||
-rw-r--r-- | libdexfile/dex/class_accessor-inl.h | 15 | ||||
-rw-r--r-- | libdexfile/dex/class_accessor.h | 12 | ||||
-rw-r--r-- | libdexfile/dex/class_accessor_test.cc | 3 | ||||
-rw-r--r-- | oatdump/oatdump.cc | 6 | ||||
-rw-r--r-- | profman/profman.cc | 4 | ||||
-rw-r--r-- | runtime/art_method.cc | 2 | ||||
-rw-r--r-- | runtime/class_linker.cc | 6 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.cc | 3 |
11 files changed, 41 insertions, 35 deletions
diff --git a/compiler/dex/dex_to_dex_decompiler_test.cc b/compiler/dex/dex_to_dex_decompiler_test.cc index 1fe42ad531..d4a9ba5491 100644 --- a/compiler/dex/dex_to_dex_decompiler_test.cc +++ b/compiler/dex/dex_to_dex_decompiler_test.cc @@ -82,9 +82,8 @@ class DexToDexDecompilerTest : public CommonCompilerTest { ASSERT_NE(0, cmp); // Unquicken the dex file. - for (uint32_t i = 0; i < updated_dex_file->NumClassDefs(); ++i) { + for (ClassAccessor accessor : updated_dex_file->GetClasses()) { // Unquicken each method. - ClassAccessor accessor(*updated_dex_file, updated_dex_file->GetClassDef(i)); for (const ClassAccessor::Method& method : accessor.GetMethods()) { CompiledMethod* compiled_method = compiler_driver_->GetCompiledMethod( method.GetReference()); diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 653e9edb45..6cb3936f29 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -1685,16 +1685,14 @@ static void CheckAndClearResolveException(Thread* self) bool CompilerDriver::RequiresConstructorBarrier(const DexFile& dex_file, uint16_t class_def_idx) const { - ClassAccessor accessor(dex_file, dex_file.GetClassDef(class_def_idx)); - bool has_is_final = false; + ClassAccessor accessor(dex_file, class_def_idx); // We require a constructor barrier if there are final instance fields. - accessor.VisitFields(/*static*/ VoidFunctor(), - [&](const ClassAccessor::Field& field) { + for (const ClassAccessor::Field& field : accessor.GetInstanceFields()) { if (field.IsFinal()) { - has_is_final = true; + return true; } - }); - return has_is_final; + } + return false; } class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor { @@ -1744,7 +1742,7 @@ class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor { // fields are assigned within the lock held for class initialization. bool requires_constructor_barrier = false; - ClassAccessor accessor(dex_file, class_def); + ClassAccessor accessor(dex_file, class_def_index); // Optionally resolve fields and methods and figure out if we need a constructor barrier. auto method_visitor = [&](const ClassAccessor::Method& method) REQUIRES_SHARED(Locks::mutator_lock_) { @@ -1926,13 +1924,12 @@ bool CompilerDriver::FastVerify(jobject jclass_loader, // Fetch the list of unverified classes. const std::set<dex::TypeIndex>& unverified_classes = verifier_deps->GetUnverifiedClasses(*dex_file); - uint32_t class_def_idx = 0u; for (ClassAccessor accessor : dex_file->GetClasses()) { if (unverified_classes.find(accessor.GetClassIdx()) == unverified_classes.end()) { if (compiler_only_verifies) { // Just update the compiled_classes_ map. The compiler doesn't need to resolve // the type. - ClassReference ref(dex_file, class_def_idx); + ClassReference ref(dex_file, accessor.GetClassDefIndex()); const ClassStatus existing = ClassStatus::kNotReady; ClassStateTable::InsertResult result = compiled_classes_.Insert(ref, existing, ClassStatus::kVerified); @@ -1959,7 +1956,6 @@ bool CompilerDriver::FastVerify(jobject jclass_loader, class_loader, soa.Self()); } - ++class_def_idx; } } return true; @@ -2700,7 +2696,7 @@ static void CompileDexFile(CompilerDriver* driver, jobject jclass_loader = context.GetClassLoader(); ClassReference ref(&dex_file, class_def_index); const DexFile::ClassDef& class_def = dex_file.GetClassDef(class_def_index); - ClassAccessor accessor(dex_file, class_def); + ClassAccessor accessor(dex_file, class_def_index); // Skip compiling classes with generic verifier failures since they will still fail at runtime if (context.GetCompiler()->GetVerificationResults()->IsClassRejected(ref)) { return; diff --git a/dexdump/dexdump.cc b/dexdump/dexdump.cc index 85778b6411..82610353b4 100644 --- a/dexdump/dexdump.cc +++ b/dexdump/dexdump.cc @@ -612,7 +612,7 @@ static void dumpClassDef(const DexFile* pDexFile, int idx) { pClassDef.class_data_off_, pClassDef.class_data_off_); // Fields and methods. - ClassAccessor accessor(*pDexFile, pClassDef); + ClassAccessor accessor(*pDexFile, idx); fprintf(gOutFile, "static_fields_size : %d\n", accessor.NumStaticFields()); fprintf(gOutFile, "instance_fields_size: %d\n", accessor.NumInstanceFields()); fprintf(gOutFile, "direct_methods_size : %d\n", accessor.NumDirectMethods()); diff --git a/libdexfile/dex/class_accessor-inl.h b/libdexfile/dex/class_accessor-inl.h index 3bb9e93e5a..a335f088b0 100644 --- a/libdexfile/dex/class_accessor-inl.h +++ b/libdexfile/dex/class_accessor-inl.h @@ -26,12 +26,15 @@ namespace art { inline ClassAccessor::ClassAccessor(const ClassIteratorData& data) - : ClassAccessor(data.dex_file_, data.dex_file_.GetClassDef(data.class_def_idx_)) {} + : ClassAccessor(data.dex_file_, data.class_def_idx_) {} inline ClassAccessor::ClassAccessor(const DexFile& dex_file, const DexFile::ClassDef& class_def) + : ClassAccessor(dex_file, dex_file.GetIndexForClassDef(class_def)) {} + +inline ClassAccessor::ClassAccessor(const DexFile& dex_file, uint32_t class_def_index) : dex_file_(dex_file), - descriptor_index_(class_def.class_idx_), - ptr_pos_(dex_file.GetClassData(class_def)), + class_def_index_(class_def_index), + ptr_pos_(dex_file.GetClassData(dex_file.GetClassDef(class_def_index))), num_static_fields_(ptr_pos_ != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u), num_instance_fields_(ptr_pos_ != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u), num_direct_methods_(ptr_pos_ != nullptr ? DecodeUnsignedLeb128(&ptr_pos_) : 0u), @@ -108,7 +111,7 @@ inline CodeItemInstructionAccessor ClassAccessor::Method::GetInstructions() cons } inline const char* ClassAccessor::GetDescriptor() const { - return dex_file_.StringByTypeIdx(descriptor_index_); + return dex_file_.StringByTypeIdx(GetClassIdx()); } inline const DexFile::CodeItem* ClassAccessor::Method::GetCodeItem() const { @@ -175,6 +178,10 @@ inline void ClassAccessor::Method::UnHideAccessFlags() const { DexFile::UnHideAccessFlags(const_cast<uint8_t*>(ptr_pos_), GetAccessFlags(), /*is_method*/ true); } +inline dex::TypeIndex ClassAccessor::GetClassIdx() const { + return dex_file_.GetClassDef(class_def_index_).class_idx_; +} + } // namespace art #endif // ART_LIBDEXFILE_DEX_CLASS_ACCESSOR_INL_H_ diff --git a/libdexfile/dex/class_accessor.h b/libdexfile/dex/class_accessor.h index 4f0fd32e31..34c7e0756b 100644 --- a/libdexfile/dex/class_accessor.h +++ b/libdexfile/dex/class_accessor.h @@ -248,6 +248,8 @@ class ClassAccessor { ClassAccessor(const DexFile& dex_file, const DexFile::ClassDef& class_def); + ClassAccessor(const DexFile& dex_file, uint32_t class_def_index); + // Return the code item for a method. const DexFile::CodeItem* GetCodeItem(const Method& method) const; @@ -315,9 +317,7 @@ class ClassAccessor { const char* GetDescriptor() const; - dex::TypeIndex GetClassIdx() const { - return descriptor_index_; - } + dex::TypeIndex GetClassIdx() const; const DexFile& GetDexFile() const { return dex_file_; @@ -327,6 +327,10 @@ class ClassAccessor { return ptr_pos_ != nullptr; } + uint32_t GetClassDefIndex() const { + return class_def_index_; + } + protected: // Template visitor to reduce copy paste for visiting elements. // No thread safety analysis since the visitor may require capabilities. @@ -341,7 +345,7 @@ class ClassAccessor { IterationRange<DataIterator<Method>> GetMethodsInternal(size_t count) const; const DexFile& dex_file_; - const dex::TypeIndex descriptor_index_ = {}; + const uint32_t class_def_index_; const uint8_t* ptr_pos_ = nullptr; // Pointer into stream of class_data_item. const uint32_t num_static_fields_ = 0u; const uint32_t num_instance_fields_ = 0u; diff --git a/libdexfile/dex/class_accessor_test.cc b/libdexfile/dex/class_accessor_test.cc index d0533c1811..1f30ae54d6 100644 --- a/libdexfile/dex/class_accessor_test.cc +++ b/libdexfile/dex/class_accessor_test.cc @@ -30,8 +30,9 @@ TEST_F(ClassAccessorTest, TestVisiting) { uint32_t class_def_idx = 0u; ASSERT_GT(dex_file->NumClassDefs(), 0u); for (ClassAccessor accessor : dex_file->GetClasses()) { - const DexFile::ClassDef& class_def = dex_file->GetClassDef(class_def_idx); + const DexFile::ClassDef& class_def = dex_file->GetClassDef(accessor.GetClassDefIndex()); EXPECT_EQ(accessor.GetDescriptor(), dex_file->StringByTypeIdx(class_def.class_idx_)); + EXPECT_EQ(class_def_idx, accessor.GetClassDefIndex()); ++class_def_idx; // Check iterators against visitors. auto methods = accessor.GetMethods(); diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 25676f736c..5c339b865d 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -274,7 +274,7 @@ class OatSymbolizer FINAL { void WalkOatClass(const OatFile::OatClass& oat_class, const DexFile& dex_file, uint32_t class_def_index) { - ClassAccessor accessor(dex_file, dex_file.GetClassDef(class_def_index)); + ClassAccessor accessor(dex_file, class_def_index); // Note: even if this is an interface or a native class, we still have to walk it, as there // might be a static initializer. uint32_t class_method_idx = 0; @@ -905,15 +905,13 @@ class OatDumper { continue; } offsets_.insert(reinterpret_cast<uintptr_t>(&dex_file->GetHeader())); - uint32_t class_def_index = 0u; for (ClassAccessor accessor : dex_file->GetClasses()) { - const OatFile::OatClass oat_class = oat_dex_file->GetOatClass(class_def_index); + const OatFile::OatClass oat_class = oat_dex_file->GetOatClass(accessor.GetClassDefIndex()); for (uint32_t class_method_index = 0; class_method_index < accessor.NumMethods(); ++class_method_index) { AddOffsets(oat_class.GetOatMethod(class_method_index)); } - ++class_def_index; } } diff --git a/profman/profman.cc b/profman/profman.cc index 096e5dc3bd..5fbce66412 100644 --- a/profman/profman.cc +++ b/profman/profman.cc @@ -930,7 +930,9 @@ class ProfMan FINAL { dex_resolved_classes.first->AddClass(class_ref.TypeIndex()); std::vector<ProfileMethodInfo> methods; if (method_str == kClassAllMethods) { - ClassAccessor accessor(*dex_file, *dex_file->FindClassDef(class_ref.TypeIndex())); + ClassAccessor accessor( + *dex_file, + dex_file->GetIndexForClassDef(*dex_file->FindClassDef(class_ref.TypeIndex()))); for (const ClassAccessor::Method& method : accessor.GetMethods()) { if (method.GetCodeItemOffset() != 0) { // Add all of the methods that have code to the profile. diff --git a/runtime/art_method.cc b/runtime/art_method.cc index 45bf66446a..5b4dcb73fd 100644 --- a/runtime/art_method.cc +++ b/runtime/art_method.cc @@ -425,7 +425,7 @@ bool ArtMethod::IsPolymorphicSignature() { static uint32_t GetOatMethodIndexFromMethodIndex(const DexFile& dex_file, uint16_t class_def_idx, uint32_t method_idx) { - ClassAccessor accessor(dex_file, dex_file.GetClassDef(class_def_idx)); + ClassAccessor accessor(dex_file, class_def_idx); uint32_t class_def_method_index = 0u; for (const ClassAccessor::Method& method : accessor.GetMethods()) { if (method.GetIndex() == method_idx) { diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index be636d80a8..b1fd5f4788 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -2863,9 +2863,9 @@ void ClassLinker::FixupStaticTrampolines(ObjPtr<mirror::Class> klass) { } const DexFile& dex_file = klass->GetDexFile(); - const DexFile::ClassDef* dex_class_def = klass->GetClassDef(); - CHECK(dex_class_def != nullptr); - ClassAccessor accessor(dex_file, *dex_class_def); + const uint16_t class_def_idx = klass->GetDexClassDefIndex(); + CHECK_NE(class_def_idx, DexFile::kDexNoIndex16); + ClassAccessor accessor(dex_file, class_def_idx); // There should always be class data if there were direct methods. CHECK(accessor.HasClassData()) << klass->PrettyDescriptor(); bool has_oat_class; diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 59617481eb..a62271df77 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -212,8 +212,6 @@ FailureKind MethodVerifier::VerifyClass(Thread* self, bool allow_soft_failures, HardFailLogMode log_level, std::string* error) { - SCOPED_TRACE << "VerifyClass " << PrettyDescriptor(dex_file->GetClassDescriptor(class_def)); - // A class must not be abstract and final. if ((class_def.access_flags_ & (kAccAbstract | kAccFinal)) == (kAccAbstract | kAccFinal)) { *error = "Verifier rejected class "; @@ -223,6 +221,7 @@ FailureKind MethodVerifier::VerifyClass(Thread* self, } ClassAccessor accessor(*dex_file, class_def); + SCOPED_TRACE << "VerifyClass " << PrettyDescriptor(accessor.GetDescriptor()); int64_t previous_method_idx[2] = { -1, -1 }; MethodVerifier::FailureData failure_data; |