ART: Add Array.createObjectArray to unstarted runtime
Necessary for compile-time initialization of android.text.Layout.
Bug: 19542228
Change-Id: I4220c65fcc3a8aaa2765b6f07f1f81c330484244
diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index dd8c57b..4fb634b 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -781,6 +781,31 @@
result->SetL(mirror::Array::CreateMultiArray(self, h_class, h_dimensions));
}
+static void UnstartedJNIArrayCreateObjectArray(Thread* self,
+ mirror::ArtMethod* method ATTRIBUTE_UNUSED,
+ mirror::Object* receiver ATTRIBUTE_UNUSED,
+ uint32_t* args,
+ JValue* result)
+ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ int32_t length = static_cast<int32_t>(args[1]);
+ if (length < 0) {
+ ThrowNegativeArraySizeException(length);
+ return;
+ }
+ mirror::Class* element_class = reinterpret_cast<mirror::Class*>(args[0])->AsClass();
+ Runtime* runtime = Runtime::Current();
+ ClassLinker* class_linker = runtime->GetClassLinker();
+ mirror::Class* array_class = class_linker->FindArrayClass(self, &element_class);
+ if (UNLIKELY(array_class == NULL)) {
+ CHECK(self->IsExceptionPending());
+ return;
+ }
+ DCHECK(array_class->IsObjectArrayClass());
+ mirror::Array* new_array = mirror::ObjectArray<mirror::Object*>::Alloc(
+ self, array_class, length, runtime->GetHeap()->GetCurrentAllocator());
+ result->SetL(new_array);
+}
+
static void UnstartedJNIThrowableNativeFillInStackTrace(Thread* self,
mirror::ArtMethod* method ATTRIBUTE_UNUSED,
mirror::Object* receiver ATTRIBUTE_UNUSED,
@@ -975,6 +1000,8 @@
&UnstartedJNIStringFastIndexOf },
{ "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])",
&UnstartedJNIArrayCreateMultiArray },
+ { "java.lang.Object java.lang.reflect.Array.createObjectArray(java.lang.Class, int)",
+ &UnstartedJNIArrayCreateObjectArray },
{ "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()",
&UnstartedJNIThrowableNativeFillInStackTrace },
{ "int java.lang.System.identityHashCode(java.lang.Object)",
diff --git a/runtime/native/java_lang_reflect_Array.cc b/runtime/native/java_lang_reflect_Array.cc
index 681b261..eddd7de 100644
--- a/runtime/native/java_lang_reflect_Array.cc
+++ b/runtime/native/java_lang_reflect_Array.cc
@@ -61,10 +61,8 @@
return NULL;
}
DCHECK(array_class->IsObjectArrayClass());
- mirror::Array* new_array = mirror::Array::Alloc<true>(
- soa.Self(), array_class, length,
- ComponentSizeShiftWidth(sizeof(mirror::HeapReference<mirror::Object>)),
- runtime->GetHeap()->GetCurrentAllocator());
+ mirror::Array* new_array = mirror::ObjectArray<mirror::Object*>::Alloc(
+ soa.Self(), array_class, length, runtime->GetHeap()->GetCurrentAllocator());
return soa.AddLocalReference<jobject>(new_array);
}