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();