From 18e2687c4126d66870d61d6548abc2c7661a66cc Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Mon, 4 Jun 2018 17:19:02 -0700 Subject: Refactor ClassAccessor to use an index instead of ClassDef pointer Removes a separate class_def_idx being required for getting the index of a ClassAccessor foreach loop. Bug: 79758018 Test: test-art-host-gtest Change-Id: Ie3010a17669f24cf492c678b55bdddba7ec62ea8 --- compiler/driver/compiler_driver.cc | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'compiler/driver/compiler_driver.cc') 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& 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; -- cgit v1.2.3-59-g8ed1b