diff options
author | 2018-06-04 17:19:02 -0700 | |
---|---|---|
committer | 2018-06-07 22:13:48 -0700 | |
commit | 18e2687c4126d66870d61d6548abc2c7661a66cc (patch) | |
tree | 06eff605df9259dde8170c8efb48b11df4108eb3 /compiler | |
parent | 2607d6c47114a18ccf4a532b20e1099d1dd8fcca (diff) |
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
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/dex/dex_to_dex_decompiler_test.cc | 3 | ||||
-rw-r--r-- | compiler/driver/compiler_driver.cc | 20 |
2 files changed, 9 insertions, 14 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; |