Revert "Fully support static encoded fields."

bug: 62337922

This reverts commit e71d6878449907b07add9f7a634a0e836911b0d1.

Change-Id: If1916cbbab4da69d69990f8cae3889a8d182b331
diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc
index d008060..69f853a 100644
--- a/compiler/driver/compiler_driver.cc
+++ b/compiler/driver/compiler_driver.cc
@@ -2240,7 +2240,7 @@
  public:
   explicit InitializeClassVisitor(const ParallelCompilationManager* manager) : manager_(manager) {}
 
-  void Visit(size_t class_def_index) OVERRIDE {
+  void Visit(size_t class_def_index) REQUIRES(!Locks::mutator_lock_) OVERRIDE {
     ATRACE_CALL();
     jobject jclass_loader = manager_->GetClassLoader();
     const DexFile& dex_file = *manager_->GetDexFile();
@@ -2255,123 +2255,89 @@
     Handle<mirror::Class> klass(
         hs.NewHandle(manager_->GetClassLinker()->FindClass(soa.Self(), descriptor, class_loader)));
 
-    if (klass != nullptr && !SkipClass(manager_->GetClassLoader(), dex_file, klass.Get())) {
-      TryInitializeClass(klass, class_loader);
-    }
-    // Clear any class not found or verification exceptions.
-    soa.Self()->ClearException();
-  }
-
-  // A helper function for initializing klass.
-  void TryInitializeClass(Handle<mirror::Class> klass, Handle<mirror::ClassLoader>& class_loader)
-      REQUIRES_SHARED(Locks::mutator_lock_) {
-    const DexFile& dex_file = klass->GetDexFile();
-    const DexFile::ClassDef* class_def = klass->GetClassDef();
-    const DexFile::TypeId& class_type_id = dex_file.GetTypeId(class_def->class_idx_);
-    const char* descriptor = dex_file.StringDataByIdx(class_type_id.descriptor_idx_);
-    ScopedObjectAccessUnchecked soa(Thread::Current());
-    StackHandleScope<3> hs(soa.Self());
-
-    mirror::Class::Status old_status = klass->GetStatus();;
-    // Only try to initialize classes that were successfully verified.
-    if (klass->IsVerified()) {
-      // Attempt to initialize the class but bail if we either need to initialize the super-class
-      // or static fields.
-      manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, false);
-      old_status = klass->GetStatus();
-      if (!klass->IsInitialized()) {
-        // We don't want non-trivial class initialization occurring on multiple threads due to
-        // deadlock problems. For example, a parent class is initialized (holding its lock) that
-        // refers to a sub-class in its static/class initializer causing it to try to acquire the
-        // sub-class' lock. While on a second thread the sub-class is initialized (holding its lock)
-        // after first initializing its parents, whose locks are acquired. This leads to a
-        // parent-to-child and a child-to-parent lock ordering and consequent potential deadlock.
-        // We need to use an ObjectLock due to potential suspension in the interpreting code. Rather
-        // than use a special Object for the purpose we use the Class of java.lang.Class.
-        Handle<mirror::Class> h_klass(hs.NewHandle(klass->GetClass()));
-        ObjectLock<mirror::Class> lock(soa.Self(), h_klass);
-        // Attempt to initialize allowing initialization of parent classes but still not static
-        // fields.
-        bool is_superclass_initialized = InitializeDependencies(klass, class_loader, soa.Self());
-        if (is_superclass_initialized) {
+    if (klass != nullptr && !SkipClass(jclass_loader, dex_file, klass.Get())) {
+      // Only try to initialize classes that were successfully verified.
+      if (klass->IsVerified()) {
+        // Attempt to initialize the class but bail if we either need to initialize the super-class
+        // or static fields.
+        manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, false);
+        if (!klass->IsInitialized()) {
+          // We don't want non-trivial class initialization occurring on multiple threads due to
+          // deadlock problems. For example, a parent class is initialized (holding its lock) that
+          // refers to a sub-class in its static/class initializer causing it to try to acquire the
+          // sub-class' lock. While on a second thread the sub-class is initialized (holding its lock)
+          // after first initializing its parents, whose locks are acquired. This leads to a
+          // parent-to-child and a child-to-parent lock ordering and consequent potential deadlock.
+          // We need to use an ObjectLock due to potential suspension in the interpreting code. Rather
+          // than use a special Object for the purpose we use the Class of java.lang.Class.
+          Handle<mirror::Class> h_klass(hs.NewHandle(klass->GetClass()));
+          ObjectLock<mirror::Class> lock(soa.Self(), h_klass);
+          // Attempt to initialize allowing initialization of parent classes but still not static
+          // fields.
           manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, false, true);
-        }
-        old_status = klass->GetStatus();
-        // If superclass cannot be initialized, no need to proceed.
-        if (!klass->IsInitialized() &&
-            is_superclass_initialized &&
-            manager_->GetCompiler()->IsImageClass(descriptor)) {
-          bool can_init_static_fields = false;
-          if (manager_->GetCompiler()->GetCompilerOptions().IsBootImage()) {
+          if (!klass->IsInitialized()) {
             // We need to initialize static fields, we only do this for image classes that aren't
             // marked with the $NoPreloadHolder (which implies this should not be initialized early).
-            can_init_static_fields = !StringPiece(descriptor).ends_with("$NoPreloadHolder;");
-          } else {
-            can_init_static_fields = manager_->GetCompiler()->GetCompilerOptions().IsAppImage() &&
-                !soa.Self()->IsExceptionPending() &&
-                NoClinitInDependency(klass, soa.Self(), &class_loader);
-            // TODO The checking for clinit can be removed since it's already
-            // checked when init superclass. Currently keep it because it contains
-            // processing of intern strings. Will be removed later when intern strings
-            // and clinit are both initialized.
-          }
+            bool can_init_static_fields =
+                manager_->GetCompiler()->GetCompilerOptions().IsBootImage() &&
+                manager_->GetCompiler()->IsImageClass(descriptor) &&
+                !StringPiece(descriptor).ends_with("$NoPreloadHolder;");
+            if (can_init_static_fields) {
+              VLOG(compiler) << "Initializing: " << descriptor;
+              // TODO multithreading support. We should ensure the current compilation thread has
+              // exclusive access to the runtime and the transaction. To achieve this, we could use
+              // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity
+              // checks in Thread::AssertThreadSuspensionIsAllowable.
+              Runtime* const runtime = Runtime::Current();
+              Transaction transaction;
 
-          if (can_init_static_fields) {
-            VLOG(compiler) << "Initializing: " << descriptor;
-            // TODO multithreading support. We should ensure the current compilation thread has
-            // exclusive access to the runtime and the transaction. To achieve this, we could use
-            // a ReaderWriterMutex but we're holding the mutator lock so we fail mutex sanity
-            // checks in Thread::AssertThreadSuspensionIsAllowable.
-            Runtime* const runtime = Runtime::Current();
-            Transaction transaction;
+              // Run the class initializer in transaction mode.
+              runtime->EnterTransactionMode(&transaction);
+              const mirror::Class::Status old_status = klass->GetStatus();
+              bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true,
+                                                                           true);
+              // TODO we detach transaction from runtime to indicate we quit the transactional
+              // mode which prevents the GC from visiting objects modified during the transaction.
+              // Ensure GC is not run so don't access freed objects when aborting transaction.
 
-            // Run the class initializer in transaction mode.
-            runtime->EnterTransactionMode(&transaction);
-            bool success = manager_->GetClassLinker()->EnsureInitialized(soa.Self(), klass, true,
-                                                                         true);
-            // TODO we detach transaction from runtime to indicate we quit the transactional
-            // mode which prevents the GC from visiting objects modified during the transaction.
-            // Ensure GC is not run so don't access freed objects when aborting transaction.
+              {
+                ScopedAssertNoThreadSuspension ants("Transaction end");
+                runtime->ExitTransactionMode();
 
-            {
-              ScopedAssertNoThreadSuspension ants("Transaction end");
-              runtime->ExitTransactionMode();
+                if (!success) {
+                  CHECK(soa.Self()->IsExceptionPending());
+                  mirror::Throwable* exception = soa.Self()->GetException();
+                  VLOG(compiler) << "Initialization of " << descriptor << " aborted because of "
+                      << exception->Dump();
+                  std::ostream* file_log = manager_->GetCompiler()->
+                      GetCompilerOptions().GetInitFailureOutput();
+                  if (file_log != nullptr) {
+                    *file_log << descriptor << "\n";
+                    *file_log << exception->Dump() << "\n";
+                  }
+                  soa.Self()->ClearException();
+                  transaction.Rollback();
+                  CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored";
+                }
+              }
 
               if (!success) {
-                CHECK(soa.Self()->IsExceptionPending());
-                mirror::Throwable* exception = soa.Self()->GetException();
-                VLOG(compiler) << "Initialization of " << descriptor << " aborted because of "
-                               << exception->Dump();
-                std::ostream* file_log = manager_->GetCompiler()->
-                    GetCompilerOptions().GetInitFailureOutput();
-                if (file_log != nullptr) {
-                  *file_log << descriptor << "\n";
-                  *file_log << exception->Dump() << "\n";
-                }
-                soa.Self()->ClearException();
-                transaction.Rollback();
-                CHECK_EQ(old_status, klass->GetStatus()) << "Previous class status not restored";
-              }
-            }
-
-            if (!success) {
-              // On failure, still intern strings of static fields and seen in <clinit>, as these
-              // will be created in the zygote. This is separated from the transaction code just
-              // above as we will allocate strings, so must be allowed to suspend.
-              if (&klass->GetDexFile() == manager_->GetDexFile()) {
+                // On failure, still intern strings of static fields and seen in <clinit>, as these
+                // will be created in the zygote. This is separated from the transaction code just
+                // above as we will allocate strings, so must be allowed to suspend.
                 InternStrings(klass, class_loader);
               }
             }
           }
+          soa.Self()->AssertNoPendingException();
         }
-        soa.Self()->AssertNoPendingException();
       }
+      // Record the final class status if necessary.
+      ClassReference ref(manager_->GetDexFile(), class_def_index);
+      manager_->GetCompiler()->RecordClassStatus(ref, klass->GetStatus());
     }
-    // Record the final class status if necessary.
-    ClassReference ref(&dex_file, klass->GetDexClassDefIndex());
-    // Back up the status before doing initialization for static encoded fields,
-    // because the static encoded branch wants to keep the status to uninitialized.
-    manager_->GetCompiler()->RecordClassStatus(ref, old_status);
+    // Clear any class not found or verification exceptions.
+    soa.Self()->ClearException();
   }
 
  private:
@@ -2426,160 +2392,6 @@
     }
   }
 
-  bool NoPotentialInternStrings(Handle<mirror::Class> klass,
-                                Handle<mirror::ClassLoader>* class_loader)
-      REQUIRES_SHARED(Locks::mutator_lock_) {
-    StackHandleScope<1> hs(Thread::Current());
-    Handle<mirror::DexCache> h_dex_cache = hs.NewHandle(klass->GetDexCache());
-    const DexFile* dex_file = h_dex_cache->GetDexFile();
-    const DexFile::ClassDef* class_def = klass->GetClassDef();
-    annotations::RuntimeEncodedStaticFieldValueIterator value_it(*dex_file,
-                                                                 &h_dex_cache,
-                                                                 class_loader,
-                                                                 manager_->GetClassLinker(),
-                                                                 *class_def);
-
-    const auto jString = annotations::RuntimeEncodedStaticFieldValueIterator::kString;
-    for ( ; value_it.HasNext(); value_it.Next()) {
-      if (value_it.GetValueType() == jString) {
-        // We don't want cache the static encoded strings which is a potential intern.
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-  bool ResolveTypesOfMethods(Thread* self, ArtMethod* m)
-      REQUIRES_SHARED(Locks::mutator_lock_) {
-      auto rtn_type = m->GetReturnType(true);  // return value is discarded because resolve will be done internally.
-      if (rtn_type == nullptr) {
-        self->ClearException();
-        return false;
-      }
-      const DexFile::TypeList* types = m->GetParameterTypeList();
-      if (types != nullptr) {
-        for (uint32_t i = 0; i < types->Size(); ++i) {
-          dex::TypeIndex param_type_idx = types->GetTypeItem(i).type_idx_;
-          auto param_type = m->GetClassFromTypeIndex(param_type_idx, true);
-          if (param_type == nullptr) {
-            self->ClearException();
-            return false;
-          }
-        }
-      }
-      return true;
-  }
-
-  // Pre resolve types mentioned in all method signatures before start a transaction
-  // since ResolveType doesn't work in transaction mode.
-  bool PreResolveTypes(Thread* self, const Handle<mirror::Class>& klass)
-      REQUIRES_SHARED(Locks::mutator_lock_) {
-      PointerSize pointer_size = manager_->GetClassLinker()->GetImagePointerSize();
-      for (ArtMethod& m : klass->GetMethods(pointer_size)) {
-        if (!ResolveTypesOfMethods(self, &m)) {
-          return false;
-        }
-      }
-      if (klass->IsInterface()) {
-        return true;
-      } else if (klass->HasSuperClass()) {
-        StackHandleScope<1> hs(self);
-        MutableHandle<mirror::Class> super_klass(hs.NewHandle<mirror::Class>(klass->GetSuperClass()));
-        for (int i = super_klass->GetVTableLength() - 1; i >= 0; --i) {
-          ArtMethod* m = klass->GetVTableEntry(i, pointer_size);
-          ArtMethod* super_m = super_klass->GetVTableEntry(i, pointer_size);
-          if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
-            return false;
-          }
-        }
-        for (int32_t i = 0; i < klass->GetIfTableCount(); ++i) {
-          super_klass.Assign(klass->GetIfTable()->GetInterface(i));
-          if (klass->GetClassLoader() != super_klass->GetClassLoader()) {
-            uint32_t num_methods = super_klass->NumVirtualMethods();
-            for (uint32_t j = 0; j < num_methods; ++j) {
-              ArtMethod* m = klass->GetIfTable()->GetMethodArray(i)->GetElementPtrSize<ArtMethod*>(
-                  j, pointer_size);
-              ArtMethod* super_m = super_klass->GetVirtualMethod(j, pointer_size);
-              if (!ResolveTypesOfMethods(self, m) || !ResolveTypesOfMethods(self, super_m)) {
-                return false;
-              }
-            }
-          }
-        }
-      }
-      return true;
-  }
-
-  // Initialize the klass's dependencies recursively before initializing itself.
-  // Checking for interfaces is also necessary since interfaces can contain
-  // both default methods and static encoded fields.
-  bool InitializeDependencies(const Handle<mirror::Class>& klass,
-                              Handle<mirror::ClassLoader> class_loader,
-                              Thread* self)
-      REQUIRES_SHARED(Locks::mutator_lock_) {
-    if (klass->HasSuperClass()) {
-      ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
-      StackHandleScope<1> hs(self);
-      Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
-      if (!handle_scope_super->IsInitialized()) {
-        this->TryInitializeClass(handle_scope_super, class_loader);
-        if (!handle_scope_super->IsInitialized()) {
-          return false;
-        }
-      }
-    }
-
-    uint32_t num_if = klass->NumDirectInterfaces();
-    for (size_t i = 0; i < num_if; i++) {
-      ObjPtr<mirror::Class>
-          interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
-      StackHandleScope<1> hs(self);
-      Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
-
-      TryInitializeClass(handle_interface, class_loader);
-
-      if (!handle_interface->IsInitialized()) {
-        return false;
-      }
-    }
-
-    return PreResolveTypes(self, klass);
-  }
-
-  // In this phase the classes containing class initializers are ignored. Make sure no
-  // clinit appears in kalss's super class chain and interfaces.
-  bool NoClinitInDependency(const Handle<mirror::Class>& klass,
-                            Thread* self,
-                            Handle<mirror::ClassLoader>* class_loader)
-      REQUIRES_SHARED(Locks::mutator_lock_) {
-    ArtMethod* clinit =
-        klass->FindClassInitializer(manager_->GetClassLinker()->GetImagePointerSize());
-    if (clinit != nullptr) {
-      VLOG(compiler) << klass->PrettyClass() << ' ' << clinit->PrettyMethod(true);
-      return false;
-    }
-    if (klass->HasSuperClass()) {
-      ObjPtr<mirror::Class> super_class = klass->GetSuperClass();
-      StackHandleScope<1> hs(self);
-      Handle<mirror::Class> handle_scope_super(hs.NewHandle(super_class));
-      if (!NoClinitInDependency(handle_scope_super, self, class_loader))
-        return false;
-    }
-
-    uint32_t num_if = klass->NumDirectInterfaces();
-    for (size_t i = 0; i < num_if; i++) {
-      ObjPtr<mirror::Class>
-          interface = mirror::Class::GetDirectInterface(self, klass.Get(), i);
-      StackHandleScope<1> hs(self);
-      Handle<mirror::Class> handle_interface(hs.NewHandle(interface));
-      if (!NoClinitInDependency(handle_interface, self, class_loader))
-        return false;
-    }
-
-    return NoPotentialInternStrings(klass, class_loader);
-  }
-
   const ParallelCompilationManager* const manager_;
 };
 
@@ -2599,10 +2411,7 @@
   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
   ParallelCompilationManager context(class_linker, jni_class_loader, this, &dex_file, dex_files,
                                      init_thread_pool);
-
-  if (GetCompilerOptions().IsBootImage() || GetCompilerOptions().IsAppImage()) {
-    // Set the concurrency thread to 1 to support initialization for App Images since transaction
-    // doesn't support multithreading now.
+  if (GetCompilerOptions().IsBootImage()) {
     // TODO: remove this when transactional mode supports multithreading.
     init_thread_count = 1U;
   }
diff --git a/test/596-app-images/app_images.cc b/test/596-app-images/app_images.cc
index fa9c902..42211f7 100644
--- a/test/596-app-images/app_images.cc
+++ b/test/596-app-images/app_images.cc
@@ -63,12 +63,6 @@
   return JNI_FALSE;
 }
 
-extern "C" JNIEXPORT jboolean JNICALL Java_Main_checkInitialized(JNIEnv*, jclass, jclass c) {
-  ScopedObjectAccess soa(Thread::Current());
-  ObjPtr<mirror::Class> klass_ptr = soa.Decode<mirror::Class>(c);
-  return klass_ptr->IsInitialized();
-}
-
 }  // namespace
 
 }  // namespace art
diff --git a/test/596-app-images/src/Main.java b/test/596-app-images/src/Main.java
index 8ee3c88..75b31b8 100644
--- a/test/596-app-images/src/Main.java
+++ b/test/596-app-images/src/Main.java
@@ -16,11 +16,7 @@
 
 class Main {
   static class Inner {
-    final public static int abc = 10;
-  }
-
-  static class Nested {
-
+    public static int abc = 0;
   }
 
   public static void main(String[] args) {
@@ -30,44 +26,8 @@
     } else if (!checkAppImageContains(Inner.class)) {
       System.out.println("App image does not contain Inner!");
     }
-
-    if (!checkInitialized(Inner.class))
-      System.out.println("Inner class is not initialized!");
-
-    if (!checkInitialized(Nested.class))
-      System.out.println("Nested class is not initialized!");
-
-    if (!checkInitialized(StaticFields.class))
-      System.out.println("StaticFields class is not initialized!");
-
-    if (!checkInitialized(StaticFieldsInitSub.class))
-      System.out.println("StaticFieldsInitSub class is not initialized!");
-
-    if (!checkInitialized(StaticFieldsInit.class))
-      System.out.println("StaticFieldsInit class is not initialized!");
-
-    if (checkInitialized(StaticInternString.class))
-      System.out.println("StaticInternString class is initialized!");
   }
 
   public static native boolean checkAppImageLoaded();
   public static native boolean checkAppImageContains(Class<?> klass);
-  public static native boolean checkInitialized(Class<?> klass);
 }
-
-class StaticFields{
-  public static int abc;
-}
-
-class StaticFieldsInitSub extends StaticFieldsInit {
-  final public static int def = 10;
-}
-
-class StaticFieldsInit{
-  final public static int abc = 10;
-}
-
-class StaticInternString {
-  final public static String intern = "java.abc.Action";
-}
-
diff --git a/test/906-iterate-heap/expected.txt b/test/906-iterate-heap/expected.txt
index 73b7129..b6af843 100644
--- a/test/906-iterate-heap/expected.txt
+++ b/test/906-iterate-heap/expected.txt
@@ -18,14 +18,14 @@
 2
 1@0 (32, 2xD '0000000000000000000000000000f03f')
 2
-doTestPrimitiveFieldsClasses
 10000@0 (static, int, index=3) 0000000000000000
 10001
 10000@0 (static, int, index=11) 0000000000000000
 10001
+10000@0 (static, int, index=0) 0000000000000000
 10001
+10000@0 (static, int, index=1) 0000000000000000
 10001
-doTestPrimitiveFieldsIntegral
 10000@0 (instance, int, index=2) 0000000000000000
 10001@0 (instance, byte, index=4) 0000000000000001
 10002@0 (instance, char, index=5) 0000000000000061
@@ -33,7 +33,6 @@
 10004@0 (instance, long, index=7) 0000000000000004
 10005@0 (instance, short, index=9) 0000000000000002
 10006
-doTestPrimitiveFieldsFloat
 10000@0 (instance, int, index=3) 0000000000000000
 10001@0 (instance, byte, index=5) 0000000000000001
 10002@0 (instance, char, index=6) 0000000000000061
diff --git a/test/906-iterate-heap/iterate_heap.cc b/test/906-iterate-heap/iterate_heap.cc
index 02ac699..6534b4c 100644
--- a/test/906-iterate-heap/iterate_heap.cc
+++ b/test/906-iterate-heap/iterate_heap.cc
@@ -408,15 +408,5 @@
   return env->NewStringUTF(ffc.data.c_str());
 }
 
-extern "C" JNIEXPORT jboolean JNICALL Java_art_Test906_checkInitialized(
-    JNIEnv* env, jclass, jclass c) {
-  jint status;
-  jvmtiError error = jvmti_env->GetClassStatus(c, &status);
-  if (JvmtiErrorToException(env, jvmti_env, error)) {
-    return false;
-  }
-  return (status & JVMTI_CLASS_STATUS_INITIALIZED) != 0;
-}
-
 }  // namespace Test906IterateHeap
 }  // namespace art
diff --git a/test/906-iterate-heap/src/art/Test906.java b/test/906-iterate-heap/src/art/Test906.java
index 65c2c8c..fe18e38 100644
--- a/test/906-iterate-heap/src/art/Test906.java
+++ b/test/906-iterate-heap/src/art/Test906.java
@@ -142,7 +142,6 @@
   }
 
   private static void doTestPrimitiveFieldsClasses() {
-    System.out.println("doTestPrimitiveFieldsClasses");
     setTag(IntObject.class, 10000);
     System.out.println(iterateThroughHeapPrimitiveFields(10000));
     System.out.println(getTag(IntObject.class));
@@ -153,40 +152,18 @@
     System.out.println(getTag(FloatObject.class));
     setTag(FloatObject.class, 0);
 
-    boolean correctHeapValue = false;
     setTag(Inf1.class, 10000);
-    String heapTrace = iterateThroughHeapPrimitiveFields(10000);
-
-    if (!checkInitialized(Inf1.class)) {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000000");
-    } else {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000001");
-    }
-
-    if (!correctHeapValue)
-      System.out.println("Heap Trace for Inf1 is not as expected:\n" + heapTrace);
-
+    System.out.println(iterateThroughHeapPrimitiveFields(10000));
     System.out.println(getTag(Inf1.class));
     setTag(Inf1.class, 0);
 
     setTag(Inf2.class, 10000);
-    heapTrace = iterateThroughHeapPrimitiveFields(10000);
-
-    if (!checkInitialized(Inf2.class)) {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000000");
-    } else {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000001");
-    }
-
-    if (!correctHeapValue)
-      System.out.println("Heap Trace for Inf2 is not as expected:\n" + heapTrace);
+    System.out.println(iterateThroughHeapPrimitiveFields(10000));
     System.out.println(getTag(Inf2.class));
-
     setTag(Inf2.class, 0);
   }
 
   private static void doTestPrimitiveFieldsIntegral() {
-    System.out.println("doTestPrimitiveFieldsIntegral");
     IntObject intObject = new IntObject();
     setTag(intObject, 10000);
     System.out.println(iterateThroughHeapPrimitiveFields(10000));
@@ -194,7 +171,6 @@
   }
 
   private static void doTestPrimitiveFieldsFloat() {
-    System.out.println("doTestPrimitiveFieldsFloat");
     FloatObject floatObject = new FloatObject();
     setTag(floatObject, 10000);
     System.out.println(iterateThroughHeapPrimitiveFields(10000));
@@ -289,7 +265,6 @@
     return Main.getTag(o);
   }
 
-  private static native boolean checkInitialized(Class<?> klass);
   private static native int iterateThroughHeapCount(int heapFilter,
       Class<?> klassFilter, int stopAfter);
   private static native int iterateThroughHeapData(int heapFilter,
diff --git a/test/913-heaps/expected.txt b/test/913-heaps/expected.txt
index 80f8b9e..b128d1c 100644
--- a/test/913-heaps/expected.txt
+++ b/test/913-heaps/expected.txt
@@ -140,7 +140,9 @@
 10001
 10000@0 (static, int, index=11) 0000000000000000
 10001
+10000@0 (static, int, index=0) 0000000000000000
 10001
+10000@0 (static, int, index=1) 0000000000000000
 10001
 10000@0 (instance, int, index=2) 0000000000000000
 10001@0 (instance, byte, index=4) 0000000000000001
diff --git a/test/913-heaps/heaps.cc b/test/913-heaps/heaps.cc
index bf3f7b6..ec36ceb 100644
--- a/test/913-heaps/heaps.cc
+++ b/test/913-heaps/heaps.cc
@@ -1078,14 +1078,5 @@
   CHECK(gFoundExt);
 }
 
-extern "C" JNIEXPORT jboolean JNICALL Java_art_Test913_checkInitialized(JNIEnv* env, jclass, jclass c) {
-  jint status;
-  jvmtiError error = jvmti_env->GetClassStatus(c, &status);
-  if (JvmtiErrorToException(env, jvmti_env, error)) {
-    return false;
-  }
-  return (status & JVMTI_CLASS_STATUS_INITIALIZED) != 0;
-}
-
 }  // namespace Test913Heaps
 }  // namespace art
diff --git a/test/913-heaps/src/art/Test913.java b/test/913-heaps/src/art/Test913.java
index b999001..97f48ee 100644
--- a/test/913-heaps/src/art/Test913.java
+++ b/test/913-heaps/src/art/Test913.java
@@ -195,33 +195,13 @@
     System.out.println(getTag(FloatObject.class));
     setTag(FloatObject.class, 0);
 
-    boolean correctHeapValue = false;
     setTag(Inf1.class, 10000);
-    String heapTrace = followReferencesPrimitiveFields(Inf1.class);
-
-    if (!checkInitialized(Inf1.class)) {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000000");
-    } else {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=0) 0000000000000001");
-    }
-
-    if (!correctHeapValue)
-      System.out.println("Heap Trace for Inf1 is not as expected:\n" + heapTrace);
-
+    System.out.println(followReferencesPrimitiveFields(Inf1.class));
     System.out.println(getTag(Inf1.class));
     setTag(Inf1.class, 0);
 
     setTag(Inf2.class, 10000);
-    heapTrace = followReferencesPrimitiveFields(Inf2.class);
-
-    if (!checkInitialized(Inf2.class)) {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000000");
-    } else {
-      correctHeapValue = heapTrace.equals("10000@0 (static, int, index=1) 0000000000000001");
-    }
-
-    if (!correctHeapValue)
-      System.out.println("Heap Trace for Inf2 is not as expected:\n" + heapTrace);
+    System.out.println(followReferencesPrimitiveFields(Inf2.class));
     System.out.println(getTag(Inf2.class));
     setTag(Inf2.class, 0);
   }
@@ -732,7 +712,6 @@
     return Main.getTag(o);
   }
 
-  private static native boolean checkInitialized(Class<?> klass);
   private static native void setupGcCallback();
   private static native void enableGcTracking(boolean enable);
   private static native int getGcStarts();