diff options
| author | Mathieu Chartier <mathieuc@google.com> | 2017-11-10 18:07:56 -0800 |
|---|---|---|
| committer | Mathieu Chartier <mathieuc@google.com> | 2017-11-10 18:07:56 -0800 |
| commit | b7c273cb44fcbdab3c17ec69124fe4bbea2696b1 (patch) | |
| tree | 11242e0bd24427183dd630780825214737ccbda1 | |
| parent | 27f5fefeb4a7e87e9537fbdd0ed392d5c1de59df (diff) | |
| download | art-b7c273cb44fcbdab3c17ec69124fe4bbea2696b1.tar.gz art-b7c273cb44fcbdab3c17ec69124fe4bbea2696b1.tar.bz2 art-b7c273cb44fcbdab3c17ec69124fe4bbea2696b1.zip | |
Add ClassDataItemIterator::HasNextMethod
Returns true if there are either static of virtual methods remaining,
changed most places to use this where possible.
Slight behavioral change for duplicate method checking, we not
persist the method index across the static method / virtual method
boundary.
Motivation: Generic cleanup to remove copy paste.
Test: test-art-host
Change-Id: I7a1b507e681b2c40452f8a9913b53a96b181e171
| -rw-r--r-- | compiler/dex/dex_to_dex_decompiler_test.cc | 14 | ||||
| -rw-r--r-- | compiler/driver/compiler_driver.cc | 76 | ||||
| -rw-r--r-- | dex2oat/dex2oat_test.cc | 6 | ||||
| -rw-r--r-- | dex2oat/linker/oat_writer.cc | 10 | ||||
| -rw-r--r-- | dexdump/dexdump.cc | 8 | ||||
| -rw-r--r-- | dexdump/dexdump_cfg.cc | 2 | ||||
| -rw-r--r-- | dexlayout/dexlayout_test.cc | 2 | ||||
| -rw-r--r-- | dexlist/dexlist.cc | 12 | ||||
| -rw-r--r-- | oatdump/oatdump.cc | 29 | ||||
| -rw-r--r-- | openjdkjvmti/ti_redefine.cc | 2 | ||||
| -rw-r--r-- | profman/boot_image_profile.cc | 2 | ||||
| -rw-r--r-- | profman/profman.cc | 2 | ||||
| -rw-r--r-- | runtime/dex_file.h | 5 | ||||
| -rw-r--r-- | runtime/dex_file_tracking_registrar.cc | 8 | ||||
| -rw-r--r-- | runtime/dex_file_verifier.cc | 4 | ||||
| -rw-r--r-- | runtime/dex_file_verifier_test.cc | 2 |
16 files changed, 42 insertions, 142 deletions
diff --git a/compiler/dex/dex_to_dex_decompiler_test.cc b/compiler/dex/dex_to_dex_decompiler_test.cc index 6637be2811..979c4c4ce2 100644 --- a/compiler/dex/dex_to_dex_decompiler_test.cc +++ b/compiler/dex/dex_to_dex_decompiler_test.cc @@ -91,19 +91,7 @@ class DexToDexDecompilerTest : public CommonCompilerTest { it.SkipAllFields(); // Unquicken each method. - while (it.HasNextDirectMethod()) { - uint32_t method_idx = it.GetMemberIndex(); - CompiledMethod* compiled_method = - compiler_driver_->GetCompiledMethod(MethodReference(updated_dex_file, method_idx)); - ArrayRef<const uint8_t> table; - if (compiled_method != nullptr) { - table = compiled_method->GetVmapTable(); - } - optimizer::ArtDecompileDEX( - *it.GetMethodCodeItem(), table, /* decompile_return_instruction */ true); - it.Next(); - } - while (it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { uint32_t method_idx = it.GetMemberIndex(); CompiledMethod* compiled_method = compiler_driver_->GetCompiledMethod(MethodReference(updated_dex_file, method_idx)); diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index 32d0bbe495..f4700d4040 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -762,31 +762,17 @@ static void ResolveConstStrings(CompilerDriver* driver, continue; } - // Direct methods. - int64_t previous_direct_method_idx = -1; - while (it.HasNextDirectMethod()) { + // Direct and virtual methods. + int64_t previous_method_idx = -1; + while (it.HasNextMethod()) { uint32_t method_idx = it.GetMemberIndex(); - if (method_idx == previous_direct_method_idx) { + if (method_idx == previous_method_idx) { // smali can create dex files with two encoded_methods sharing the same method_idx // http://code.google.com/p/smali/issues/detail?id=119 it.Next(); continue; } - previous_direct_method_idx = method_idx; - ResolveConstStrings(dex_cache, *dex_file, it.GetMethodCodeItem()); - it.Next(); - } - // Virtual methods. - int64_t previous_virtual_method_idx = -1; - while (it.HasNextVirtualMethod()) { - uint32_t method_idx = it.GetMemberIndex(); - if (method_idx == previous_virtual_method_idx) { - // smali can create dex files with two encoded_methods sharing the same method_idx - // http://code.google.com/p/smali/issues/detail?id=119 - it.Next(); - continue; - } - previous_virtual_method_idx = method_idx; + previous_method_idx = method_idx; ResolveConstStrings(dex_cache, *dex_file, it.GetMethodCodeItem()); it.Next(); } @@ -1702,16 +1688,7 @@ class ResolveClassFieldsAndMethodsVisitor : public CompilationVisitor { it.Next(); } if (resolve_fields_and_methods) { - while (it.HasNextDirectMethod()) { - ArtMethod* method = class_linker->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>( - dex_file, it.GetMemberIndex(), dex_cache, class_loader, nullptr, - it.GetMethodInvokeType(class_def)); - if (method == nullptr) { - CheckAndClearResolveException(soa.Self()); - } - it.Next(); - } - while (it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { ArtMethod* method = class_linker->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>( dex_file, it.GetMemberIndex(), dex_cache, class_loader, nullptr, it.GetMethodInvokeType(class_def)); @@ -1820,12 +1797,7 @@ static void PopulateVerifiedMethods(const DexFile& dex_file, ClassDataItemIterator it(dex_file, class_data); it.SkipAllFields(); - while (it.HasNextDirectMethod()) { - verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex())); - it.Next(); - } - - while (it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex())); it.Next(); } @@ -2752,17 +2724,17 @@ class CompileClassVisitor : public CompilationVisitor { bool compilation_enabled = driver->IsClassToCompile( dex_file.StringByTypeIdx(class_def.class_idx_)); - // Compile direct methods - int64_t previous_direct_method_idx = -1; - while (it.HasNextDirectMethod()) { + // Compile direct and virtual methods. + int64_t previous_method_idx = -1; + while (it.HasNextMethod()) { uint32_t method_idx = it.GetMemberIndex(); - if (method_idx == previous_direct_method_idx) { + if (method_idx == previous_method_idx) { // smali can create dex files with two encoded_methods sharing the same method_idx // http://code.google.com/p/smali/issues/detail?id=119 it.Next(); continue; } - previous_direct_method_idx = method_idx; + previous_method_idx = method_idx; CompileMethod(soa.Self(), driver, it.GetMethodCodeItem(), @@ -2777,30 +2749,6 @@ class CompileClassVisitor : public CompilationVisitor { dex_cache); it.Next(); } - // Compile virtual methods - int64_t previous_virtual_method_idx = -1; - while (it.HasNextVirtualMethod()) { - uint32_t method_idx = it.GetMemberIndex(); - if (method_idx == previous_virtual_method_idx) { - // smali can create dex files with two encoded_methods sharing the same method_idx - // http://code.google.com/p/smali/issues/detail?id=119 - it.Next(); - continue; - } - previous_virtual_method_idx = method_idx; - CompileMethod(soa.Self(), - driver, it.GetMethodCodeItem(), - it.GetMethodAccessFlags(), - it.GetMethodInvokeType(class_def), - class_def_index, - method_idx, - class_loader, - dex_file, - dex_to_dex_compilation_level, - compilation_enabled, - dex_cache); - it.Next(); - } DCHECK(!it.HasNext()); } diff --git a/dex2oat/dex2oat_test.cc b/dex2oat/dex2oat_test.cc index c2556aa4a6..fdada8f926 100644 --- a/dex2oat/dex2oat_test.cc +++ b/dex2oat/dex2oat_test.cc @@ -1244,7 +1244,7 @@ TEST_F(Dex2oatTest, LayoutSections) { ClassDataItemIterator it(*dex, dex->GetClassData(*class_def)); it.SkipAllFields(); std::set<size_t> code_item_offsets; - for (; it.HasNextDirectMethod() || it.HasNextVirtualMethod(); it.Next()) { + for (; it.HasNextMethod(); it.Next()) { const uint16_t method_idx = it.GetMemberIndex(); const size_t code_item_offset = it.GetMethodCodeItemOffset(); if (code_item_offsets.insert(code_item_offset).second) { @@ -1356,7 +1356,7 @@ TEST_F(Dex2oatTest, LayoutSections) { // corresponding code item offsets to verify the layout. ClassDataItemIterator it(*dex_file, dex_file->GetClassData(*class_def)); it.SkipAllFields(); - for (; it.HasNextDirectMethod() || it.HasNextVirtualMethod(); it.Next()) { + for (; it.HasNextMethod(); it.Next()) { const size_t method_idx = it.GetMemberIndex(); const size_t code_item_offset = it.GetMethodCodeItemOffset(); const bool is_hot = ContainsElement(hot_methods, method_idx); @@ -1382,7 +1382,7 @@ TEST_F(Dex2oatTest, LayoutSections) { // or this method is part of the last code item and the end is 4 byte aligned. ClassDataItemIterator it2(*dex_file, dex_file->GetClassData(*class_def)); it2.SkipAllFields(); - for (; it2.HasNextDirectMethod() || it2.HasNextVirtualMethod(); it2.Next()) { + for (; it2.HasNextMethod(); it2.Next()) { EXPECT_LE(it2.GetMethodCodeItemOffset(), code_item_offset); } uint32_t code_item_size = dex_file->FindCodeItemOffset(*class_def, method_idx); diff --git a/dex2oat/linker/oat_writer.cc b/dex2oat/linker/oat_writer.cc index d8671d2dd0..1eec59279e 100644 --- a/dex2oat/linker/oat_writer.cc +++ b/dex2oat/linker/oat_writer.cc @@ -2126,20 +2126,14 @@ bool OatWriter::VisitDexMethods(DexMethodVisitor* visitor) { ClassDataItemIterator it(*dex_file, class_data); it.SkipAllFields(); size_t class_def_method_index = 0u; - while (it.HasNextDirectMethod()) { + while (it.HasNextMethod()) { if (!visitor->VisitMethod(class_def_method_index, it)) { return false; } ++class_def_method_index; it.Next(); } - while (it.HasNextVirtualMethod()) { - if (UNLIKELY(!visitor->VisitMethod(class_def_method_index, it))) { - return false; - } - ++class_def_method_index; - it.Next(); - } + DCHECK(!it.HasNext()); } } if (UNLIKELY(!visitor->EndClass())) { diff --git a/dexdump/dexdump.cc b/dexdump/dexdump.cc index 4bfd91fdd9..84ccaa03ab 100644 --- a/dexdump/dexdump.cc +++ b/dexdump/dexdump.cc @@ -1391,18 +1391,12 @@ static void dumpCfg(const DexFile* dex_file, int idx) { } ClassDataItemIterator it(*dex_file, class_data); it.SkipAllFields(); - while (it.HasNextDirectMethod()) { + while (it.HasNextMethod()) { dumpCfg(dex_file, it.GetMemberIndex(), it.GetMethodCodeItem()); it.Next(); } - while (it.HasNextVirtualMethod()) { - dumpCfg(dex_file, - it.GetMemberIndex(), - it.GetMethodCodeItem()); - it.Next(); - } } /* diff --git a/dexdump/dexdump_cfg.cc b/dexdump/dexdump_cfg.cc index 28317071dd..62c970de8a 100644 --- a/dexdump/dexdump_cfg.cc +++ b/dexdump/dexdump_cfg.cc @@ -377,7 +377,7 @@ void DumpMethodCFG(const DexFile* dex_file, uint32_t dex_method_idx, std::ostrea it.SkipAllFields(); // Find method, and dump it. - while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { uint32_t method_idx = it.GetMemberIndex(); if (method_idx == dex_method_idx) { dumpMethodCFGImpl(dex_file, dex_method_idx, it.GetMethodCodeItem(), os); diff --git a/dexlayout/dexlayout_test.cc b/dexlayout/dexlayout_test.cc index 2448d0b1aa..c4f7accc8c 100644 --- a/dexlayout/dexlayout_test.cc +++ b/dexlayout/dexlayout_test.cc @@ -695,7 +695,7 @@ TEST_F(DexLayoutTest, CodeItemOverrun) { } ClassDataItemIterator it(*dex, data); it.SkipAllFields(); - while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { DexFile::CodeItem* item = const_cast<DexFile::CodeItem*>(it.GetMethodCodeItem()); if (item != nullptr) { IterationRange<DexInstructionIterator> instructions = item->Instructions(); diff --git a/dexlist/dexlist.cc b/dexlist/dexlist.cc index c8bc132da0..e3ca59c8bf 100644 --- a/dexlist/dexlist.cc +++ b/dexlist/dexlist.cc @@ -151,16 +151,8 @@ void dumpClass(const DexFile* pDexFile, u4 idx) { if (pEncodedData != nullptr) { ClassDataItemIterator pClassData(*pDexFile, pEncodedData); pClassData.SkipAllFields(); - // Direct methods. - for (; pClassData.HasNextDirectMethod(); pClassData.Next()) { - dumpMethod(pDexFile, fileName, - pClassData.GetMemberIndex(), - pClassData.GetRawMemberAccessFlags(), - pClassData.GetMethodCodeItem(), - pClassData.GetMethodCodeItemOffset()); - } - // Virtual methods. - for (; pClassData.HasNextVirtualMethod(); pClassData.Next()) { + // Direct and virtual methods. + for (; pClassData.HasNextMethod(); pClassData.Next()) { dumpMethod(pDexFile, fileName, pClassData.GetMemberIndex(), pClassData.GetRawMemberAccessFlags(), diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index b20fa902a2..108fa95225 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -274,7 +274,7 @@ class OatSymbolizer FINAL { ClassDataItemIterator it(dex_file, class_data); uint32_t class_method_idx = 0; it.SkipAllFields(); - for (; it.HasNextDirectMethod() || it.HasNextVirtualMethod(); it.Next()) { + for (; it.HasNextMethod(); it.Next()) { WalkOatMethod(oat_class.GetOatMethod(class_method_idx++), dex_file, class_def_index, @@ -893,11 +893,7 @@ class OatDumper { ClassDataItemIterator it(*dex_file, class_data); it.SkipAllFields(); uint32_t class_method_index = 0; - while (it.HasNextDirectMethod()) { - AddOffsets(oat_class.GetOatMethod(class_method_index++)); - it.Next(); - } - while (it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { AddOffsets(oat_class.GetOatMethod(class_method_index++)); it.Next(); } @@ -979,11 +975,7 @@ class OatDumper { } ClassDataItemIterator it(dex_file, class_data); it.SkipAllFields(); - while (it.HasNextDirectMethod()) { - WalkCodeItem(dex_file, it.GetMethodCodeItem()); - it.Next(); - } - while (it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { WalkCodeItem(dex_file, it.GetMethodCodeItem()); it.Next(); } @@ -1227,20 +1219,7 @@ class OatDumper { ClassDataItemIterator it(dex_file, class_data); it.SkipAllFields(); uint32_t class_method_index = 0; - while (it.HasNextDirectMethod()) { - if (!DumpOatMethod(vios, class_def, class_method_index, oat_class, dex_file, - it.GetMemberIndex(), it.GetMethodCodeItem(), - it.GetRawMemberAccessFlags(), &addr_found)) { - success = false; - } - if (addr_found) { - *stop_analysis = true; - return success; - } - class_method_index++; - it.Next(); - } - while (it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { if (!DumpOatMethod(vios, class_def, class_method_index, oat_class, dex_file, it.GetMemberIndex(), it.GetMethodCodeItem(), it.GetRawMemberAccessFlags(), &addr_found)) { diff --git a/openjdkjvmti/ti_redefine.cc b/openjdkjvmti/ti_redefine.cc index dcc237d6d6..5b125f6990 100644 --- a/openjdkjvmti/ti_redefine.cc +++ b/openjdkjvmti/ti_redefine.cc @@ -610,7 +610,7 @@ bool Redefiner::ClassRedefinition::CheckSameMethods() { // Check each of the methods. NB we don't need to specifically check for removals since the 2 dex // files have the same number of methods, which means there must be an equal amount of additions // and removals. - for (; new_iter.HasNextVirtualMethod() || new_iter.HasNextDirectMethod(); new_iter.Next()) { + for (; new_iter.HasNextMethod(); new_iter.Next()) { // Get the data on the method we are searching for const art::DexFile::MethodId& new_method_id = dex_file_->GetMethodId(new_iter.GetMemberIndex()); const char* new_method_name = dex_file_->GetMethodName(new_method_id); diff --git a/profman/boot_image_profile.cc b/profman/boot_image_profile.cc index e5645d370c..48b87c9a6d 100644 --- a/profman/boot_image_profile.cc +++ b/profman/boot_image_profile.cc @@ -90,7 +90,7 @@ void GenerateBootImageProfile( it.Next(); } it.SkipInstanceFields(); - while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { const uint32_t flags = it.GetMethodAccessFlags(); if ((flags & kAccNative) != 0) { // Native method will get dirtied. diff --git a/profman/profman.cc b/profman/profman.cc index 1c50645073..31d28e4be0 100644 --- a/profman/profman.cc +++ b/profman/profman.cc @@ -810,7 +810,7 @@ class ProfMan FINAL { if (class_data != nullptr) { ClassDataItemIterator it(*dex_file, class_data); it.SkipAllFields(); - while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { if (it.GetMethodCodeItemOffset() != 0) { // Add all of the methods that have code to the profile. const uint32_t method_idx = it.GetMemberIndex(); diff --git a/runtime/dex_file.h b/runtime/dex_file.h index 5c0093f323..2c6a430020 100644 --- a/runtime/dex_file.h +++ b/runtime/dex_file.h @@ -1186,6 +1186,11 @@ class ClassDataItemIterator { bool HasNextVirtualMethod() const { return pos_ >= EndOfDirectMethodsPos() && pos_ < EndOfVirtualMethodsPos(); } + bool HasNextMethod() const { + const bool result = pos_ >= EndOfInstanceFieldsPos() && pos_ < EndOfVirtualMethodsPos(); + DCHECK_EQ(result, HasNextDirectMethod() || HasNextVirtualMethod()); + return result; + } void SkipStaticFields() { while (HasNextStaticField()) { Next(); diff --git a/runtime/dex_file_tracking_registrar.cc b/runtime/dex_file_tracking_registrar.cc index 341158671b..874d8ea905 100644 --- a/runtime/dex_file_tracking_registrar.cc +++ b/runtime/dex_file_tracking_registrar.cc @@ -158,7 +158,7 @@ void DexFileTrackingRegistrar::SetAllCodeItemRegistration(bool should_poison) { if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); cdit.SkipAllFields(); - while (cdit.HasNextDirectMethod()) { + while (cdit.HasNextMethod()) { const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); if (code_item != nullptr) { const void* code_item_begin = reinterpret_cast<const void*>(code_item); @@ -178,7 +178,7 @@ void DexFileTrackingRegistrar::SetAllCodeItemStartRegistration(bool should_poiso if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); cdit.SkipAllFields(); - while (cdit.HasNextDirectMethod()) { + while (cdit.HasNextMethod()) { const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); if (code_item != nullptr) { const void* code_item_begin = reinterpret_cast<const void*>(code_item); @@ -200,7 +200,7 @@ void DexFileTrackingRegistrar::SetAllInsnsRegistration(bool should_poison) { if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); cdit.SkipAllFields(); - while (cdit.HasNextDirectMethod()) { + while (cdit.HasNextMethod()) { const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); if (code_item != nullptr) { const void* insns_begin = reinterpret_cast<const void*>(&code_item->insns_); @@ -221,7 +221,7 @@ void DexFileTrackingRegistrar::SetCodeItemRegistration(const char* class_name, b if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); cdit.SkipAllFields(); - while (cdit.HasNextDirectMethod()) { + while (cdit.HasNextMethod()) { const DexFile::MethodId& methodid_item = dex_file_->GetMethodId(cdit.GetMemberIndex()); const char * methodid_name = dex_file_->GetMethodName(methodid_item); const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); diff --git a/runtime/dex_file_verifier.cc b/runtime/dex_file_verifier.cc index 50f56c799a..025952f7a9 100644 --- a/runtime/dex_file_verifier.cc +++ b/runtime/dex_file_verifier.cc @@ -1970,7 +1970,7 @@ dex::TypeIndex DexFileVerifier::FindFirstClassDataDefiner(const uint8_t* ptr, bo return field->class_idx_; } - if (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { + if (it.HasNextMethod()) { LOAD_METHOD(method, it.GetMemberIndex(), "first_class_data_definer method_id", *success = false; return dex::TypeIndex(DexFile::kDexNoIndex16)) return method->class_idx_; @@ -2566,7 +2566,7 @@ bool DexFileVerifier::CheckInterClassDataItem() { return false; } } - for (; it.HasNextDirectMethod() || it.HasNextVirtualMethod(); it.Next()) { + for (; it.HasNextMethod(); it.Next()) { uint32_t code_off = it.GetMethodCodeItemOffset(); if (code_off != 0 && !CheckOffsetToTypeMap(code_off, DexFile::kDexTypeCodeItem)) { return false; diff --git a/runtime/dex_file_verifier_test.cc b/runtime/dex_file_verifier_test.cc index ee577e7d9a..d4d912cbfb 100644 --- a/runtime/dex_file_verifier_test.cc +++ b/runtime/dex_file_verifier_test.cc @@ -249,7 +249,7 @@ static const uint8_t* FindMethodData(const DexFile* dex_file, it.Next(); } - while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { + while (it.HasNextMethod()) { uint32_t method_index = it.GetMemberIndex(); dex::StringIndex name_index = dex_file->GetMethodId(method_index).name_idx_; const DexFile::StringId& string_id = dex_file->GetStringId(name_index); |
