15b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom/*
25b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * Copyright (C) 2008 The Android Open Source Project
35b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom *
45b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License");
55b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * you may not use this file except in compliance with the License.
65b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * You may obtain a copy of the License at
75b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom *
85b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom *      http://www.apache.org/licenses/LICENSE-2.0
95b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom *
105b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * Unless required by applicable law or agreed to in writing, software
115b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS,
125b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * See the License for the specific language governing permissions and
145b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * limitations under the License.
155b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom */
165b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
17277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#include "java_lang_reflect_Array.h"
18277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe
199837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers#include "class_linker-inl.h"
2062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#include "common_throws.h"
214f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h"
22eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "jni_internal.h"
234f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "mirror/class-inl.h"
242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h"
251eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers#include "scoped_fast_native_object_access.h"
26eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier#include "handle_scope-inl.h"
275b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
285b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstromnamespace art {
295b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartierstatic jobject Array_createMultiArray(
312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    JNIEnv* env, jclass, jclass javaElementClass, jobject javaDimArray) {
321eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers  ScopedFastNativeObjectAccess soa(env);
332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(javaElementClass != nullptr);
34eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  StackHandleScope<2> hs(soa.Self());
35eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  Handle<mirror::Class> element_class(hs.NewHandle(soa.Decode<mirror::Class*>(javaElementClass)));
365b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom  DCHECK(element_class->IsClass());
372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(javaDimArray != nullptr);
382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Object* dimensions_obj = soa.Decode<mirror::Object*>(javaDimArray);
395b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom  DCHECK(dimensions_obj->IsArrayInstance());
401ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers  DCHECK_EQ(dimensions_obj->GetClass()->GetComponentType()->GetPrimitiveType(),
411ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers            Primitive::kPrimInt);
42eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier  Handle<mirror::IntArray> dimensions_array(
43eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier      hs.NewHandle(down_cast<mirror::IntArray*>(dimensions_obj)));
445bb99037bef70784ae4630c2e4b81688d2a18621Mathieu Chartier  mirror::Array* new_array = mirror::Array::CreateMultiArray(soa.Self(), element_class,
455bb99037bef70784ae4630c2e4b81688d2a18621Mathieu Chartier                                                             dimensions_array);
4600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  return soa.AddLocalReference<jobject>(new_array);
475b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom}
485b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
490512f02dd6623c0870c11fbf3274d7462f732136Elliott Hughesstatic jobject Array_createObjectArray(JNIEnv* env, jclass, jclass javaElementClass, jint length) {
501eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers  ScopedFastNativeObjectAccess soa(env);
512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  DCHECK(javaElementClass != nullptr);
5264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (UNLIKELY(length < 0)) {
5362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers    ThrowNegativeArraySizeException(length);
542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    return nullptr;
555b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom  }
56b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier  mirror::Class* element_class = soa.Decode<mirror::Class*>(javaElementClass);
576fac447555dc94a935b78198479cce645c837b89Ian Rogers  Runtime* runtime = Runtime::Current();
586fac447555dc94a935b78198479cce645c837b89Ian Rogers  ClassLinker* class_linker = runtime->GetClassLinker();
59b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier  mirror::Class* array_class = class_linker->FindArrayClass(soa.Self(), &element_class);
602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier  if (UNLIKELY(array_class == nullptr)) {
6100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers    CHECK(soa.Self()->IsExceptionPending());
622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier    return nullptr;
635b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom  }
646fac447555dc94a935b78198479cce645c837b89Ian Rogers  DCHECK(array_class->IsObjectArrayClass());
65e598e0439ab825ea1a42fe8002b54241c6163ce6Andreas Gampe  mirror::Array* new_array = mirror::ObjectArray<mirror::Object*>::Alloc(
66e598e0439ab825ea1a42fe8002b54241c6163ce6Andreas Gampe      soa.Self(), array_class, length, runtime->GetHeap()->GetCurrentAllocator());
6700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers  return soa.AddLocalReference<jobject>(new_array);
685b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom}
695b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
705b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstromstatic JNINativeMethod gMethods[] = {
711eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers  NATIVE_METHOD(Array, createMultiArray, "!(Ljava/lang/Class;[I)Ljava/lang/Object;"),
721eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers  NATIVE_METHOD(Array, createObjectArray, "!(Ljava/lang/Class;I)Ljava/lang/Object;"),
735b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom};
745b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
755b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstromvoid register_java_lang_reflect_Array(JNIEnv* env) {
76eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes  REGISTER_NATIVE_METHODS("java/lang/reflect/Array");
775b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom}
785b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom
795b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom}  // namespace art
80