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
diff --git a/compiler/dex/dex_to_dex_decompiler_test.cc b/compiler/dex/dex_to_dex_decompiler_test.cc
index 7eaba96..88426a3 100644
--- a/compiler/dex/dex_to_dex_decompiler_test.cc
+++ b/compiler/dex/dex_to_dex_decompiler_test.cc
@@ -82,13 +82,7 @@
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 ea53ef0..622448f 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -808,13 +808,7 @@
}
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 @@
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 @@
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 @@
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 1df9c48..f7465c0 100644
--- a/compiler/oat_writer.cc
+++ b/compiler/oat_writer.cc
@@ -1676,12 +1676,7 @@
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 dd09fed..7e616a7 100644
--- a/compiler/verifier_deps_test.cc
+++ b/compiler/verifier_deps_test.cc
@@ -151,9 +151,7 @@
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 1541d7b..df0169f 100644
--- a/dexdump/dexdump.cc
+++ b/dexdump/dexdump.cc
@@ -1376,12 +1376,7 @@
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 9e58128..9c0429f 100644
--- a/dexdump/dexdump_cfg.cc
+++ b/dexdump/dexdump_cfg.cc
@@ -373,10 +373,7 @@
}
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 efe1aad..29707af 100644
--- a/dexlist/dexlist.cc
+++ b/dexlist/dexlist.cc
@@ -149,9 +149,7 @@
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 9b95de2..b3b67e0 100644
--- a/oatdump/oatdump.cc
+++ b/oatdump/oatdump.cc
@@ -246,8 +246,7 @@
// 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 @@
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 @@
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 @@
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 @@
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 b46378e..d8b5daf 100644
--- a/profman/profman.cc
+++ b/profman/profman.cc
@@ -772,9 +772,7 @@
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 d591e09..32946ef 100644
--- a/runtime/art_method.cc
+++ b/runtime/art_method.cc
@@ -433,13 +433,7 @@
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 0fa25d1..71558e1 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -3019,13 +3019,7 @@
// 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 @@
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 b267e5f..6d11582 100644
--- a/runtime/dex_file.cc
+++ b/runtime/dex_file.cc
@@ -656,13 +656,7 @@
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 3249edb..81a39af 100644
--- a/runtime/dex_file.h
+++ b/runtime/dex_file.h
@@ -1343,6 +1343,30 @@
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 f41a50b..14548ce 100644
--- a/runtime/dex_file_tracking_registrar.cc
+++ b/runtime/dex_file_tracking_registrar.cc
@@ -134,10 +134,7 @@
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 @@
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 @@
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 7fae277..8a4bed3 100644
--- a/runtime/dex_method_iterator.h
+++ b/runtime/dex_method_iterator.h
@@ -66,13 +66,7 @@
}
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 341de0d..5422f48 100644
--- a/runtime/openjdkjvmti/ti_redefine.cc
+++ b/runtime/openjdkjvmti/ti_redefine.cc
@@ -601,9 +601,7 @@
}
// 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 5e9a2fa..464af04 100644
--- a/runtime/vdex_file.cc
+++ b/runtime/vdex_file.cc
@@ -185,13 +185,7 @@
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 12f791c..9b65255 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -300,9 +300,7 @@
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 @@
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();