Follow up from Carl's comments on new primitive array types.

Change-Id: I0c53d5c327070034562051f3f18582a9d108075c
diff --git a/src/class_linker_test.cc b/src/class_linker_test.cc
index 5e48921..a8e1df1 100644
--- a/src/class_linker_test.cc
+++ b/src/class_linker_test.cc
@@ -358,6 +358,24 @@
   EXPECT_TRUE(dex_base_class_loader->GetInstanceField(1)->GetName()->Equals("pathList"));
 }
 
+// The first reference array element must be a multiple of 8 bytes from the
+// start of the object
+TEST_F(ClassLinkerTest, ValidateObjectArrayElementsOffset) {
+  Class* array_class = class_linker_->FindSystemClass("[Ljava/lang/String;");
+  ObjectArray<String>* array = ObjectArray<String>::Alloc(array_class, 0);
+  uint32_t array_offset = reinterpret_cast<uint32_t>(array);
+  uint32_t data_offset = reinterpret_cast<uint32_t>(array->GetData());
+  EXPECT_EQ(16U, data_offset - array_offset);
+}
+
+TEST_F(ClassLinkerTest, ValidatePrimitiveArrayElementsOffset) {
+  Class* array_class = class_linker_->FindSystemClass("[J");
+  LongArray* array = LongArray::Alloc(array_class, 0);
+  uint32_t array_offset = reinterpret_cast<uint32_t>(array);
+  uint32_t data_offset = reinterpret_cast<uint32_t>(array->GetData());
+  EXPECT_EQ(16U, data_offset - array_offset);
+}
+
 TEST_F(ClassLinkerTest, TwoClassLoadersOneClass) {
   scoped_ptr<DexFile> dex_1(OpenDexFileBase64(kMyClassDex));
   scoped_ptr<DexFile> dex_2(OpenDexFileBase64(kMyClassDex));
@@ -370,4 +388,4 @@
   EXPECT_NE(MyClass_1, MyClass_2);
 }
 
-}// namespace art
+}  // namespace art
diff --git a/src/object.h b/src/object.h
index ce956bb..5e6c175 100644
--- a/src/object.h
+++ b/src/object.h
@@ -606,6 +606,8 @@
  private:
   // The number of array elements.
   uint32_t length_;
+  // Padding to ensure the first member defined by a subclass begins on a 8-byte boundary
+  int32_t padding_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(Array);
 };
@@ -623,9 +625,11 @@
   T* const * GetData() const {
     return reinterpret_cast<T* const *>(&elements_);
   }
+
   T** GetData() {
     return reinterpret_cast<T**>(&elements_);
   }
+
   T* Get(uint32_t i) const {
     CHECK_LT(i, GetLength());
     return GetData()[i];
@@ -633,7 +637,7 @@
 
   void Set(uint32_t i, T* object) {
     CHECK_LT(i, GetLength());
-    GetData()[i] = object;
+    GetData()[i] = object;  // TODO: write barrier
   }
 
   static void Copy(ObjectArray<T>* src, int src_pos,