ObjPtr<>-ify ClassTable.

Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 31113334
Change-Id: Ieced7a452d381e5cacbafc91fd5d7672d9d92c30
diff --git a/runtime/class_table-inl.h b/runtime/class_table-inl.h
index d07ad33..d043af3 100644
--- a/runtime/class_table-inl.h
+++ b/runtime/class_table-inl.h
@@ -23,6 +23,7 @@
 #include "gc_root-inl.h"
 #include "mirror/class.h"
 #include "oat_file.h"
+#include "obj_ptr-inl.h"
 
 namespace art {
 
@@ -93,7 +94,7 @@
 }
 
 template<ReadBarrierOption kReadBarrierOption>
-inline mirror::Class* ClassTable::TableSlot::Read() const {
+inline ObjPtr<mirror::Class> ClassTable::TableSlot::Read() const {
   const uint32_t before = data_.load(std::memory_order_relaxed);
   const ObjPtr<mirror::Class> before_ptr(ExtractPtr(before));
   const ObjPtr<mirror::Class> after_ptr(
@@ -103,7 +104,7 @@
     // one.
     data_.CompareAndSetStrongRelease(before, Encode(after_ptr, MaskHash(before)));
   }
-  return after_ptr.Ptr();
+  return after_ptr;
 }
 
 template<typename Visitor>
diff --git a/runtime/class_table.cc b/runtime/class_table.cc
index 58f3674..b7d37e2 100644
--- a/runtime/class_table.cc
+++ b/runtime/class_table.cc
@@ -37,7 +37,7 @@
   return LookupByDescriptor(klass) == klass;
 }
 
-mirror::Class* ClassTable::LookupByDescriptor(ObjPtr<mirror::Class> klass) {
+ObjPtr<mirror::Class> ClassTable::LookupByDescriptor(ObjPtr<mirror::Class> klass) {
   ReaderMutexLock mu(Thread::Current(), lock_);
   TableSlot slot(klass);
   for (ClassSet& class_set : classes_) {
@@ -49,7 +49,9 @@
   return nullptr;
 }
 
-mirror::Class* ClassTable::UpdateClass(const char* descriptor, mirror::Class* klass, size_t hash) {
+ObjPtr<mirror::Class> ClassTable::UpdateClass(const char* descriptor,
+                                              ObjPtr<mirror::Class> klass,
+                                              size_t hash) {
   WriterMutexLock mu(Thread::Current(), lock_);
   // Should only be updating latest table.
   DescriptorHashPair pair(descriptor, hash);
@@ -62,7 +64,7 @@
     }
     LOG(FATAL) << "Updating class not found " << descriptor;
   }
-  mirror::Class* const existing = existing_it->Read();
+  const ObjPtr<mirror::Class> existing = existing_it->Read();
   CHECK_NE(existing, klass) << descriptor;
   CHECK(!existing->IsResolved()) << descriptor;
   CHECK_EQ(klass->GetStatus(), ClassStatus::kResolving) << descriptor;
@@ -113,7 +115,7 @@
   return classes_.back().size();
 }
 
-mirror::Class* ClassTable::Lookup(const char* descriptor, size_t hash) {
+ObjPtr<mirror::Class> ClassTable::Lookup(const char* descriptor, size_t hash) {
   DescriptorHashPair pair(descriptor, hash);
   ReaderMutexLock mu(Thread::Current(), lock_);
   for (ClassSet& class_set : classes_) {
diff --git a/runtime/class_table.h b/runtime/class_table.h
index 26cd3ec..810c09c 100644
--- a/runtime/class_table.h
+++ b/runtime/class_table.h
@@ -82,7 +82,7 @@
         REQUIRES_SHARED(Locks::mutator_lock_);
 
     template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
-    mirror::Class* Read() const REQUIRES_SHARED(Locks::mutator_lock_);
+    ObjPtr<mirror::Class> Read() const REQUIRES_SHARED(Locks::mutator_lock_);
 
     // NO_THREAD_SAFETY_ANALYSIS since the visitor may require heap bitmap lock.
     template<typename Visitor>
@@ -170,7 +170,9 @@
       REQUIRES_SHARED(Locks::mutator_lock_);
 
   // Update a class in the table with the new class. Returns the existing class which was replaced.
-  mirror::Class* UpdateClass(const char* descriptor, mirror::Class* new_klass, size_t hash)
+  ObjPtr<mirror::Class> UpdateClass(const char* descriptor,
+                                    ObjPtr<mirror::Class> new_klass,
+                                    size_t hash)
       REQUIRES(!lock_)
       REQUIRES_SHARED(Locks::mutator_lock_);
 
@@ -198,12 +200,12 @@
       REQUIRES_SHARED(Locks::mutator_lock_);
 
   // Return the first class that matches the descriptor. Returns null if there are none.
-  mirror::Class* Lookup(const char* descriptor, size_t hash)
+  ObjPtr<mirror::Class> Lookup(const char* descriptor, size_t hash)
       REQUIRES(!lock_)
       REQUIRES_SHARED(Locks::mutator_lock_);
 
   // Return the first class that matches the descriptor of klass. Returns null if there are none.
-  mirror::Class* LookupByDescriptor(ObjPtr<mirror::Class> klass)
+  ObjPtr<mirror::Class> LookupByDescriptor(ObjPtr<mirror::Class> klass)
       REQUIRES(!lock_)
       REQUIRES_SHARED(Locks::mutator_lock_);
 
diff --git a/runtime/class_table_test.cc b/runtime/class_table_test.cc
index 2270662..5275c7e 100644
--- a/runtime/class_table_test.cc
+++ b/runtime/class_table_test.cc
@@ -87,9 +87,9 @@
 
   // Add h_X to the class table.
   table.Insert(h_X.Get());
-  EXPECT_EQ(table.LookupByDescriptor(h_X.Get()), h_X.Get());
-  EXPECT_EQ(table.Lookup(descriptor_x, ComputeModifiedUtf8Hash(descriptor_x)), h_X.Get());
-  EXPECT_EQ(table.Lookup("NOT_THERE", ComputeModifiedUtf8Hash("NOT_THERE")), nullptr);
+  EXPECT_OBJ_PTR_EQ(table.LookupByDescriptor(h_X.Get()), h_X.Get());
+  EXPECT_OBJ_PTR_EQ(table.Lookup(descriptor_x, ComputeModifiedUtf8Hash(descriptor_x)), h_X.Get());
+  EXPECT_TRUE(table.Lookup("NOT_THERE", ComputeModifiedUtf8Hash("NOT_THERE")) == nullptr);
   EXPECT_EQ(table.NumZygoteClasses(class_loader.Get()), 0u);
   EXPECT_EQ(table.NumNonZygoteClasses(class_loader.Get()), 1u);
 
@@ -99,11 +99,11 @@
   EXPECT_EQ(table.NumNonZygoteClasses(class_loader.Get()), 0u);
 
   // Test inserting and related lookup functions.
-  EXPECT_EQ(table.LookupByDescriptor(h_Y.Get()), nullptr);
+  EXPECT_TRUE(table.LookupByDescriptor(h_Y.Get()) == nullptr);
   EXPECT_FALSE(table.Contains(h_Y.Get()));
   table.Insert(h_Y.Get());
-  EXPECT_EQ(table.LookupByDescriptor(h_X.Get()), h_X.Get());
-  EXPECT_EQ(table.LookupByDescriptor(h_Y.Get()), h_Y.Get());
+  EXPECT_OBJ_PTR_EQ(table.LookupByDescriptor(h_X.Get()), h_X.Get());
+  EXPECT_OBJ_PTR_EQ(table.LookupByDescriptor(h_Y.Get()), h_Y.Get());
   EXPECT_TRUE(table.Contains(h_X.Get()));
   EXPECT_TRUE(table.Contains(h_Y.Get()));
 
diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc
index 985fad4..346b811 100644
--- a/runtime/gc/space/image_space.cc
+++ b/runtime/gc/space/image_space.cc
@@ -1213,13 +1213,13 @@
           ClassTable::ClassSet temp_set(data, /*make_copy_of_data=*/ false, &read_count);
           for (ClassTable::TableSlot& slot : temp_set) {
             slot.VisitRoot(class_table_visitor);
-            mirror::Class* klass = slot.Read<kWithoutReadBarrier>();
-            if (!app_image_objects.InDest(klass)) {
+            ObjPtr<mirror::Class> klass = slot.Read<kWithoutReadBarrier>();
+            if (!app_image_objects.InDest(klass.Ptr())) {
               continue;
             }
-            const bool already_marked = visited_bitmap->Set(klass);
+            const bool already_marked = visited_bitmap->Set(klass.Ptr());
             CHECK(!already_marked) << "App image class already visited";
-            patch_object_visitor.VisitClass(klass);
+            patch_object_visitor.VisitClass(klass.Ptr());
             // Then patch the non-embedded vtable and iftable.
             ObjPtr<mirror::PointerArray> vtable =
                 klass->GetVTable<kVerifyNone, kWithoutReadBarrier>();
@@ -1609,10 +1609,10 @@
         ClassTableVisitor class_table_visitor(relocate_visitor);
         for (ClassTable::TableSlot& slot : temp_set) {
           slot.VisitRoot(class_table_visitor);
-          mirror::Class* klass = slot.Read<kWithoutReadBarrier>();
+          ObjPtr<mirror::Class> klass = slot.Read<kWithoutReadBarrier>();
           DCHECK(klass != nullptr);
-          patched_objects->Set(klass);
-          patch_object_visitor.VisitClass(klass);
+          patched_objects->Set(klass.Ptr());
+          patch_object_visitor.VisitClass(klass.Ptr());
           if (kIsDebugBuild) {
             mirror::Class* class_class = klass->GetClass<kVerifyNone, kWithoutReadBarrier>();
             if (dcheck_class_class == nullptr) {