Assignability checks for SetFieldObject.

Adds check to SetFieldObject that is enabled with VERIFY_OBJECT_ENABLED.
The check verifies that the object being set to the field is assignable
to that field.

Fix bug that iftable was typed to be Object[][] but being assigned a
Object[].

Change-Id: I3d3744347f2dd142ca90db321ed876eaebfe7f7f
diff --git a/src/heap.h b/src/heap.h
index 1f9ac86..d3127de 100644
--- a/src/heap.h
+++ b/src/heap.h
@@ -170,13 +170,14 @@
                            MemberOffset finalizer_reference_zombie_offset);
 
   Object* GetReferenceReferent(Object* reference);
-  void ClearReferenceReferent(Object* reference);
+  void ClearReferenceReferent(Object* reference) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
 
   // Returns true if the reference object has not yet been enqueued.
   bool IsEnqueuable(const Object* ref);
-  void EnqueueReference(Object* ref, Object** list);
-  void EnqueuePendingReference(Object* ref, Object** list);
-  Object* DequeuePendingReference(Object** list);
+  void EnqueueReference(Object* ref, Object** list) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
+  void EnqueuePendingReference(Object* ref, Object** list)
+      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
+  Object* DequeuePendingReference(Object** list) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
 
   MemberOffset GetReferencePendingNextOffset() {
     DCHECK_NE(reference_pendingNext_offset_.Uint32Value(), 0U);
@@ -199,6 +200,10 @@
     verify_objects_ = false;
   }
 
+  bool IsObjectValidationEnabled() const {
+    return verify_objects_;
+  }
+
   void RecordFree(size_t freed_objects, size_t freed_bytes);
 
   // Must be called if a field of an Object in the heap changes, and before any GC safe-point.