diff options
author | 2017-06-19 11:05:51 -0700 | |
---|---|---|
committer | 2017-06-19 11:11:12 -0700 | |
commit | e17cf243978ca7f5356e746ee460f0fcf04e04a6 (patch) | |
tree | e8ad423bf1dee5756fec451ba22db749ed4f5472 | |
parent | 2bc159ebd1115f71d80639e47fc38663aa84ba4a (diff) |
Add field/method skipping helper functions to DexFile
Specifically added SkipStaticFields, SkipInstanceFields,
SkipAllFields, SkipStaticMethods, and SkipVirtualMethods.
Also applied the helpers to the code base.
Test: test-art-host
Change-Id: Idda77f9a6e2564c2e588d2bbe11cc320063fdb32
-rw-r--r-- | compiler/dex/dex_to_dex_decompiler_test.cc | 8 | ||||
-rw-r--r-- | compiler/driver/compiler_driver.cc | 28 | ||||
-rw-r--r-- | compiler/oat_writer.cc | 7 | ||||
-rw-r--r-- | compiler/verifier_deps_test.cc | 4 | ||||
-rw-r--r-- | dexdump/dexdump.cc | 7 | ||||
-rw-r--r-- | dexdump/dexdump_cfg.cc | 5 | ||||
-rw-r--r-- | dexlist/dexlist.cc | 4 | ||||
-rw-r--r-- | oatdump/oatdump.cc | 18 | ||||
-rw-r--r-- | profman/profman.cc | 4 | ||||
-rw-r--r-- | runtime/art_method.cc | 8 | ||||
-rw-r--r-- | runtime/class_linker.cc | 31 | ||||
-rw-r--r-- | runtime/dex_file.cc | 8 | ||||
-rw-r--r-- | runtime/dex_file.h | 24 | ||||
-rw-r--r-- | runtime/dex_file_tracking_registrar.cc | 15 | ||||
-rw-r--r-- | runtime/dex_method_iterator.h | 8 | ||||
-rw-r--r-- | runtime/openjdkjvmti/ti_redefine.cc | 4 | ||||
-rw-r--r-- | runtime/vdex_file.cc | 8 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.cc | 9 |
18 files changed, 54 insertions, 146 deletions
diff --git a/compiler/dex/dex_to_dex_decompiler_test.cc b/compiler/dex/dex_to_dex_decompiler_test.cc index 7eaba960af..88426a3b5f 100644 --- a/compiler/dex/dex_to_dex_decompiler_test.cc +++ b/compiler/dex/dex_to_dex_decompiler_test.cc @@ -82,13 +82,7 @@ class DexToDexDecompilerTest : public CommonCompilerTest { continue; } ClassDataItemIterator it(*updated_dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); // Unquicken each method. while (it.HasNextDirectMethod()) { diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index ea53ef0670..622448fc59 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -808,13 +808,7 @@ static void ResolveConstStrings(CompilerDriver* driver, } ClassDataItemIterator it(*dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); bool compilation_enabled = driver->IsClassToCompile( dex_file->StringByTypeIdx(class_def.class_idx_)); @@ -1661,9 +1655,7 @@ bool CompilerDriver::RequiresConstructorBarrier(const DexFile& dex_file, return false; } ClassDataItemIterator it(dex_file, class_data); - while (it.HasNextStaticField()) { - it.Next(); - } + it.SkipStaticFields(); // We require a constructor barrier if there are final instance fields. while (it.HasNextInstanceField()) { if (it.MemberIsFinal()) { @@ -1873,13 +1865,7 @@ static void PopulateVerifiedMethods(const DexFile& dex_file, return; } ClassDataItemIterator it(dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); while (it.HasNextDirectMethod()) { verification_results->CreateVerifiedMethodFor(MethodReference(&dex_file, it.GetMemberIndex())); @@ -2778,13 +2764,7 @@ class CompileClassVisitor : public CompilationVisitor { GetDexToDexCompilationLevel(soa.Self(), *driver, jclass_loader, dex_file, class_def); ClassDataItemIterator it(dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); bool compilation_enabled = driver->IsClassToCompile( dex_file.StringByTypeIdx(class_def.class_idx_)); diff --git a/compiler/oat_writer.cc b/compiler/oat_writer.cc index 1df9c4887c..f7465c0d5f 100644 --- a/compiler/oat_writer.cc +++ b/compiler/oat_writer.cc @@ -1676,12 +1676,7 @@ bool OatWriter::VisitDexMethods(DexMethodVisitor* visitor) { const uint8_t* class_data = dex_file->GetClassData(class_def); if (class_data != nullptr) { // ie not an empty class, such as a marker interface ClassDataItemIterator it(*dex_file, class_data); - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); size_t class_def_method_index = 0u; while (it.HasNextDirectMethod()) { if (!visitor->VisitMethod(class_def_method_index, it)) { diff --git a/compiler/verifier_deps_test.cc b/compiler/verifier_deps_test.cc index dd09fed06e..7e616a7af0 100644 --- a/compiler/verifier_deps_test.cc +++ b/compiler/verifier_deps_test.cc @@ -151,9 +151,7 @@ class VerifierDepsTest : public CommonCompilerTest { CHECK(class_data != nullptr); ClassDataItemIterator it(*primary_dex_file_, class_data); - while (it.HasNextStaticField() || it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); ArtMethod* method = nullptr; while (it.HasNextDirectMethod()) { diff --git a/dexdump/dexdump.cc b/dexdump/dexdump.cc index 1541d7b39e..df0169f7d0 100644 --- a/dexdump/dexdump.cc +++ b/dexdump/dexdump.cc @@ -1376,12 +1376,7 @@ static void dumpCfg(const DexFile* dex_file, int idx) { return; } ClassDataItemIterator it(*dex_file, class_data); - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); while (it.HasNextDirectMethod()) { dumpCfg(dex_file, it.GetMemberIndex(), diff --git a/dexdump/dexdump_cfg.cc b/dexdump/dexdump_cfg.cc index 9e581280da..9c0429ff2b 100644 --- a/dexdump/dexdump_cfg.cc +++ b/dexdump/dexdump_cfg.cc @@ -373,10 +373,7 @@ void DumpMethodCFG(const DexFile* dex_file, uint32_t dex_method_idx, std::ostrea } ClassDataItemIterator it(*dex_file, class_data); - // Skip fields - while (it.HasNextStaticField() || it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); // Find method, and dump it. while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { diff --git a/dexlist/dexlist.cc b/dexlist/dexlist.cc index efe1aad7c6..29707af704 100644 --- a/dexlist/dexlist.cc +++ b/dexlist/dexlist.cc @@ -149,9 +149,7 @@ void dumpClass(const DexFile* pDexFile, u4 idx) { const u1* pEncodedData = pDexFile->GetClassData(pClassDef); if (pEncodedData != nullptr) { ClassDataItemIterator pClassData(*pDexFile, pEncodedData); - // Skip the fields. - for (; pClassData.HasNextStaticField(); pClassData.Next()) {} - for (; pClassData.HasNextInstanceField(); pClassData.Next()) {} + pClassData.SkipAllFields(); // Direct methods. for (; pClassData.HasNextDirectMethod(); pClassData.Next()) { dumpMethod(pDexFile, fileName, diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 9b95de2fb0..b3b67e0d2e 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -246,8 +246,7 @@ class OatSymbolizer FINAL { // might be a static initializer. ClassDataItemIterator it(dex_file, class_data); uint32_t class_method_idx = 0; - for (; it.HasNextStaticField(); it.Next()) { /* skip */ } - for (; it.HasNextInstanceField(); it.Next()) { /* skip */ } + it.SkipAllFields(); for (; it.HasNextDirectMethod() || it.HasNextVirtualMethod(); it.Next()) { WalkOatMethod(oat_class.GetOatMethod(class_method_idx++), dex_file, @@ -769,7 +768,7 @@ class OatDumper { const uint8_t* class_data = dex_file->GetClassData(class_def); if (class_data != nullptr) { ClassDataItemIterator it(*dex_file, class_data); - SkipAllFields(it); + it.SkipAllFields(); uint32_t class_method_index = 0; while (it.HasNextDirectMethod()) { AddOffsets(oat_class.GetOatMethod(class_method_index++)); @@ -856,7 +855,7 @@ class OatDumper { return; } ClassDataItemIterator it(dex_file, class_data); - SkipAllFields(it); + it.SkipAllFields(); while (it.HasNextDirectMethod()) { WalkCodeItem(dex_file, it.GetMethodCodeItem()); it.Next(); @@ -1076,15 +1075,6 @@ class OatDumper { return true; } - static void SkipAllFields(ClassDataItemIterator& it) { - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } - } - bool DumpOatClass(VariableIndentationOutputStream* vios, const OatFile::OatClass& oat_class, const DexFile& dex_file, const DexFile::ClassDef& class_def, bool* stop_analysis) { @@ -1096,7 +1086,7 @@ class OatDumper { return success; } ClassDataItemIterator it(dex_file, class_data); - SkipAllFields(it); + it.SkipAllFields(); uint32_t class_method_index = 0; while (it.HasNextDirectMethod()) { if (!DumpOatMethod(vios, class_def, class_method_index, oat_class, dex_file, diff --git a/profman/profman.cc b/profman/profman.cc index b46378e354..d8b5dafffe 100644 --- a/profman/profman.cc +++ b/profman/profman.cc @@ -772,9 +772,7 @@ class ProfMan FINAL { const uint8_t* class_data = dex_file->GetClassData(*class_def); if (class_data != nullptr) { ClassDataItemIterator it(*dex_file, class_data); - while (it.HasNextStaticField() || it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); while (it.HasNextDirectMethod() || it.HasNextVirtualMethod()) { if (it.GetMethodCodeItemOffset() != 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 d591e0992c..32946ef0b4 100644 --- a/runtime/art_method.cc +++ b/runtime/art_method.cc @@ -433,13 +433,7 @@ static uint32_t GetOatMethodIndexFromMethodIndex(const DexFile& dex_file, const uint8_t* class_data = dex_file.GetClassData(class_def); CHECK(class_data != nullptr); ClassDataItemIterator it(dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); // Process methods size_t class_def_method_index = 0; while (it.HasNextDirectMethod()) { diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 0fa25d15d2..71558e1820 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -3019,13 +3019,7 @@ void ClassLinker::FixupStaticTrampolines(ObjPtr<mirror::Class> klass) { // There should always be class data if there were direct methods. CHECK(class_data != nullptr) << klass->PrettyDescriptor(); ClassDataItemIterator it(dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); bool has_oat_class; OatFile::OatClass oat_class = OatFile::FindOatClass(dex_file, klass->GetDexClassDefIndex(), @@ -5451,25 +5445,10 @@ static void CountMethodsAndFields(ClassDataItemIterator& dex_data, size_t* direct_methods, size_t* static_fields, size_t* instance_fields) { - *virtual_methods = *direct_methods = *static_fields = *instance_fields = 0; - - while (dex_data.HasNextStaticField()) { - dex_data.Next(); - (*static_fields)++; - } - while (dex_data.HasNextInstanceField()) { - dex_data.Next(); - (*instance_fields)++; - } - while (dex_data.HasNextDirectMethod()) { - (*direct_methods)++; - dex_data.Next(); - } - while (dex_data.HasNextVirtualMethod()) { - (*virtual_methods)++; - dex_data.Next(); - } - DCHECK(!dex_data.HasNext()); + *static_fields = dex_data.NumStaticFields(); + *instance_fields = dex_data.NumInstanceFields(); + *direct_methods = dex_data.NumDirectMethods(); + *virtual_methods = dex_data.NumVirtualMethods(); } static void DumpClass(std::ostream& os, diff --git a/runtime/dex_file.cc b/runtime/dex_file.cc index b267e5f22a..6d1158260a 100644 --- a/runtime/dex_file.cc +++ b/runtime/dex_file.cc @@ -656,13 +656,7 @@ uint32_t DexFile::FindCodeItemOffset(const DexFile::ClassDef& class_def, const uint8_t* class_data = GetClassData(class_def); CHECK(class_data != nullptr); ClassDataItemIterator it(*this, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); while (it.HasNextDirectMethod()) { if (it.GetMemberIndex() == method_idx) { return it.GetMethodCodeItemOffset(); diff --git a/runtime/dex_file.h b/runtime/dex_file.h index 3249edbe83..81a39afbee 100644 --- a/runtime/dex_file.h +++ b/runtime/dex_file.h @@ -1343,6 +1343,30 @@ class ClassDataItemIterator { bool HasNextVirtualMethod() const { return pos_ >= EndOfDirectMethodsPos() && pos_ < EndOfVirtualMethodsPos(); } + void SkipStaticFields() { + while (HasNextStaticField()) { + Next(); + } + } + void SkipInstanceFields() { + while (HasNextInstanceField()) { + Next(); + } + } + void SkipAllFields() { + SkipStaticFields(); + SkipInstanceFields(); + } + void SkipDirectMethods() { + while (HasNextDirectMethod()) { + Next(); + } + } + void SkipVirtualMethods() { + while (HasNextVirtualMethod()) { + Next(); + } + } bool HasNext() const { return pos_ < EndOfVirtualMethodsPos(); } diff --git a/runtime/dex_file_tracking_registrar.cc b/runtime/dex_file_tracking_registrar.cc index f41a50bb80..14548cea90 100644 --- a/runtime/dex_file_tracking_registrar.cc +++ b/runtime/dex_file_tracking_registrar.cc @@ -134,10 +134,7 @@ void DexFileTrackingRegistrar::SetAllCodeItemRegistration(bool should_poison) { const uint8_t* class_data = dex_file_->GetClassData(cd); if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); - // Skipping Fields - while (cdit.HasNextStaticField() || cdit.HasNextInstanceField()) { - cdit.Next(); - } + cdit.SkipAllFields(); while (cdit.HasNextDirectMethod()) { const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); if (code_item != nullptr) { @@ -157,10 +154,7 @@ void DexFileTrackingRegistrar::SetAllInsnsRegistration(bool should_poison) { const uint8_t* class_data = dex_file_->GetClassData(cd); if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); - // Skipping Fields - while (cdit.HasNextStaticField() || cdit.HasNextInstanceField()) { - cdit.Next(); - } + cdit.SkipAllFields(); while (cdit.HasNextDirectMethod()) { const DexFile::CodeItem* code_item = cdit.GetMethodCodeItem(); if (code_item != nullptr) { @@ -181,10 +175,7 @@ void DexFileTrackingRegistrar::SetCodeItemRegistration(const char* class_name, b const uint8_t* class_data = dex_file_->GetClassData(cd); if (class_data != nullptr) { ClassDataItemIterator cdit(*dex_file_, class_data); - // Skipping Fields - while (cdit.HasNextStaticField() || cdit.HasNextInstanceField()) { - cdit.Next(); - } + cdit.SkipAllFields(); while (cdit.HasNextDirectMethod()) { const DexFile::MethodId& methodid_item = dex_file_->GetMethodId(cdit.GetMemberIndex()); const char * methodid_name = dex_file_->GetMethodName(methodid_item); diff --git a/runtime/dex_method_iterator.h b/runtime/dex_method_iterator.h index 7fae277c14..8a4bed31b1 100644 --- a/runtime/dex_method_iterator.h +++ b/runtime/dex_method_iterator.h @@ -66,13 +66,7 @@ class DexMethodIterator { } if (it_.get() == nullptr) { it_.reset(new ClassDataItemIterator(GetDexFileInternal(), class_data_)); - // Skip fields - while (GetIterator().HasNextStaticField()) { - GetIterator().Next(); - } - while (GetIterator().HasNextInstanceField()) { - GetIterator().Next(); - } + GetIterator().SkipAllFields(); direct_method_ = true; } if (direct_method_ && GetIterator().HasNextDirectMethod()) { diff --git a/runtime/openjdkjvmti/ti_redefine.cc b/runtime/openjdkjvmti/ti_redefine.cc index 341de0df72..5422f48664 100644 --- a/runtime/openjdkjvmti/ti_redefine.cc +++ b/runtime/openjdkjvmti/ti_redefine.cc @@ -601,9 +601,7 @@ bool Redefiner::ClassRedefinition::CheckSameMethods() { } // Skip all of the fields. We should have already checked this. - while (new_iter.HasNextStaticField() || new_iter.HasNextInstanceField()) { - new_iter.Next(); - } + new_iter.SkipAllFields(); // 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. diff --git a/runtime/vdex_file.cc b/runtime/vdex_file.cc index 5e9a2faab0..464af04cd5 100644 --- a/runtime/vdex_file.cc +++ b/runtime/vdex_file.cc @@ -185,13 +185,7 @@ void VdexFile::Unquicken(const std::vector<const DexFile*>& dex_files, continue; } ClassDataItemIterator it(*dex_file, class_data); - // Skip fields - while (it.HasNextStaticField()) { - it.Next(); - } - while (it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); while (it.HasNextDirectMethod()) { const DexFile::CodeItem* code_item = it.GetMethodCodeItem(); diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 12f791c1f1..9b652553df 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -300,9 +300,7 @@ FailureKind MethodVerifier::VerifyClass(Thread* self, return FailureKind::kNoFailure; } ClassDataItemIterator it(*dex_file, class_data); - while (it.HasNextStaticField() || it.HasNextInstanceField()) { - it.Next(); - } + it.SkipAllFields(); ClassLinker* linker = Runtime::Current()->GetClassLinker(); // Direct methods. MethodVerifier::FailureData data1 = VerifyMethods<true>(self, @@ -1986,10 +1984,7 @@ static uint32_t GetFirstFinalInstanceFieldIndex(const DexFile& dex_file, dex::Ty const uint8_t* class_data = dex_file.GetClassData(*class_def); DCHECK(class_data != nullptr); ClassDataItemIterator it(dex_file, class_data); - // Skip static fields. - while (it.HasNextStaticField()) { - it.Next(); - } + it.SkipStaticFields(); while (it.HasNextInstanceField()) { if ((it.GetFieldAccessFlags() & kAccFinal) != 0) { return it.GetMemberIndex(); |