Add HeapTest and make GC work enough to pass it

Change-Id: If06eaef2921b64b3226bfd347acaec60ec993e67
diff --git a/src/heap.h b/src/heap.h
index bbd05db..d4d43e7 100644
--- a/src/heap.h
+++ b/src/heap.h
@@ -67,6 +67,48 @@
     return mark_bitmap_;
   }
 
+  static void SetReferenceOffsets(size_t reference_referent_offset,
+                                  size_t reference_queue_offset,
+                                  size_t reference_queueNext_offset,
+                                  size_t reference_pendingNext_offset,
+                                  size_t finalizer_reference_zombie_offset) {
+    CHECK_NE(reference_referent_offset, 0U);
+    CHECK_NE(reference_queue_offset, 0U);
+    CHECK_NE(reference_queueNext_offset, 0U);
+    CHECK_NE(reference_pendingNext_offset, 0U);
+    CHECK_NE(finalizer_reference_zombie_offset, 0U);
+    reference_referent_offset_ = reference_referent_offset;
+    reference_queue_offset_ = reference_queue_offset;
+    reference_queueNext_offset_ = reference_queueNext_offset;
+    reference_pendingNext_offset_ = reference_pendingNext_offset;
+    finalizer_reference_zombie_offset_ = finalizer_reference_zombie_offset;
+  }
+
+  static size_t GetReferenceReferentOffset() {
+    DCHECK_NE(reference_referent_offset_, 0U);
+    return reference_referent_offset_;
+  }
+
+  static size_t GetReferenceQueueOffset() {
+    DCHECK_NE(reference_queue_offset_, 0U);
+    return reference_queue_offset_;
+  }
+
+  static size_t GetReferenceQueueNextOffset() {
+    DCHECK_NE(reference_queueNext_offset_, 0U);
+    return reference_queueNext_offset_;
+  }
+
+  static size_t GetReferencePendingNextOffset() {
+    DCHECK_NE(reference_pendingNext_offset_, 0U);
+    return reference_pendingNext_offset_;
+  }
+
+  static size_t GetFinalizerReferenceZombieOffset() {
+    DCHECK_NE(finalizer_reference_zombie_offset_, 0U);
+    return finalizer_reference_zombie_offset_;
+  }
+
  private:
   // Allocates uninitialized storage.
   static Object* Allocate(size_t num_bytes);
@@ -108,6 +150,21 @@
   // free.
   static size_t num_objects_allocated_;
 
+  // offset of java.lang.ref.Reference.referent
+  static size_t reference_referent_offset_;
+
+  // offset of java.lang.ref.Reference.queue
+  static size_t reference_queue_offset_;
+
+  // offset of java.lang.ref.Reference.queueNext
+  static size_t reference_queueNext_offset_;
+
+  // offset of java.lang.ref.Reference.pendingNext
+  static size_t reference_pendingNext_offset_;
+
+  // offset of java.lang.ref.FinalizerReference.zombie
+  static size_t finalizer_reference_zombie_offset_;
+
   DISALLOW_IMPLICIT_CONSTRUCTORS(Heap);
 };