1 /*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /*
18 * java.lang.reflect.Constructor
19 */
20 #include "Dalvik.h"
21 #include "native/InternalNativePriv.h"
22
23
24 /*
25 * public int constructNative(Object[] args, Class declaringClass,
26 * Class[] parameterTypes, int slot, boolean noAccessCheck)
27 *
28 * We get here through Constructor.newInstance(). The Constructor object
29 * would not be available if the constructor weren't public (per the
30 * definition of Class.getConstructor), so we can skip the method access
31 * check. We can also safely assume the constructor isn't associated
32 * with an interface, array, or primitive class.
33 */
Dalvik_java_lang_reflect_Constructor_constructNative(const u4 * args,JValue * pResult)34 static void Dalvik_java_lang_reflect_Constructor_constructNative(
35 const u4* args, JValue* pResult)
36 {
37 // ignore thisPtr in args[0]
38 ArrayObject* argList = (ArrayObject*) args[1];
39 ClassObject* declaringClass = (ClassObject*) args[2];
40 ArrayObject* params = (ArrayObject*) args[3];
41 int slot = args[4];
42 bool noAccessCheck = (args[5] != 0);
43 Object* newObj;
44 Method* meth;
45
46 if (dvmIsAbstractClass(declaringClass)) {
47 dvmThrowInstantiationException(declaringClass, NULL);
48 RETURN_VOID();
49 }
50
51 /* initialize the class if it hasn't been already */
52 if (!dvmIsClassInitialized(declaringClass)) {
53 if (!dvmInitClass(declaringClass)) {
54 ALOGW("Class init failed in Constructor.constructNative (%s)",
55 declaringClass->descriptor);
56 assert(dvmCheckException(dvmThreadSelf()));
57 RETURN_VOID();
58 }
59 }
60
61 newObj = dvmAllocObject(declaringClass, ALLOC_DEFAULT);
62 if (newObj == NULL)
63 RETURN_PTR(NULL);
64
65 meth = dvmSlotToMethod(declaringClass, slot);
66 assert(meth != NULL);
67
68 (void) dvmInvokeMethod(newObj, meth, argList, params, NULL, noAccessCheck);
69 dvmReleaseTrackedAlloc(newObj, NULL);
70 RETURN_PTR(newObj);
71 }
72
73 const DalvikNativeMethod dvm_java_lang_reflect_Constructor[] = {
74 { "constructNative", "([Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;IZ)Ljava/lang/Object;",
75 Dalvik_java_lang_reflect_Constructor_constructNative },
76 { NULL, NULL, NULL },
77 };
78