summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2017-06-19 11:05:51 -0700
committer Mathieu Chartier <mathieuc@google.com> 2017-06-19 11:11:12 -0700
commite17cf243978ca7f5356e746ee460f0fcf04e04a6 (patch)
treee8ad423bf1dee5756fec451ba22db749ed4f5472
parent2bc159ebd1115f71d80639e47fc38663aa84ba4a (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.cc8
-rw-r--r--compiler/driver/compiler_driver.cc28
-rw-r--r--compiler/oat_writer.cc7
-rw-r--r--compiler/verifier_deps_test.cc4
-rw-r--r--dexdump/dexdump.cc7
-rw-r--r--dexdump/dexdump_cfg.cc5
-rw-r--r--dexlist/dexlist.cc4
-rw-r--r--oatdump/oatdump.cc18
-rw-r--r--profman/profman.cc4
-rw-r--r--runtime/art_method.cc8
-rw-r--r--runtime/class_linker.cc31
-rw-r--r--runtime/dex_file.cc8
-rw-r--r--runtime/dex_file.h24
-rw-r--r--runtime/dex_file_tracking_registrar.cc15
-rw-r--r--runtime/dex_method_iterator.h8
-rw-r--r--runtime/openjdkjvmti/ti_redefine.cc4
-rw-r--r--runtime/vdex_file.cc8
-rw-r--r--runtime/verifier/method_verifier.cc9
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();