Remove pad word from arrays

This change removes the 4 byte pad from all arrays except longs and
doubles. It saves 76kb from the boot image, and will also reduce the
size of arrays in the heap (and thereby reduce garbage collection).

Change-Id: I3ff277d5bf14c57c0f7552215818e588ec6cc275
diff --git a/src/sun_misc_Unsafe.cc b/src/sun_misc_Unsafe.cc
index c639f97..68cd4f7 100644
--- a/src/sun_misc_Unsafe.cc
+++ b/src/sun_misc_Unsafe.cc
@@ -24,13 +24,17 @@
 namespace {
 
 jlong Unsafe_objectFieldOffset0(JNIEnv* env, jclass, jobject javaField) {
+  // TODO: move to Java code
   jfieldID fid = env->FromReflectedField(javaField);
   Field* field = DecodeField(fid);
   return field->GetOffset().Int32Value();
 }
 
-jint Unsafe_arrayBaseOffset0(JNIEnv*, jclass, jclass) {
-  return Array::DataOffset().Int32Value();
+jint Unsafe_arrayBaseOffset0(JNIEnv* env, jclass, jclass javaArrayClass) {
+  // TODO: move to Java code
+  ScopedThreadStateChange tsc(Thread::Current(), Thread::kRunnable);
+  Class* array_class = Decode<Class*>(env, javaArrayClass);
+  return Array::DataOffset(array_class->GetComponentSize()).Int32Value();
 }
 
 jint Unsafe_arrayIndexScale0(JNIEnv* env, jclass, jclass javaClass) {