1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.lang.reflect.Constructor
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h"
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h"
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int getConstructorModifiers(Class declaringClass, int slot)
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getConstructorModifiers(
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_INT(dvmFixMethodFlags(meth->accessFlags));
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int constructNative(Object[] args, Class declaringClass,
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     Class[] parameterTypes, int slot, boolean noAccessCheck)
42d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden *
43d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * We get here through Constructor.newInstance().  The Constructor object
44d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * would not be available if the constructor weren't public (per the
45d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * definition of Class.getConstructor), so we can skip the method access
46d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * check.  We can also safely assume the constructor isn't associated
47d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * with an interface, array, or primitive class.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_constructNative(
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* argList = (ArrayObject*) args[1];
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* params = (ArrayObject*) args[3];
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* newObj;
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    if (dvmIsAbstractClass(declaringClass)) {
62d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        dvmThrowExceptionWithClassMessage("Ljava/lang/InstantiationException;",
63d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            declaringClass->descriptor);
64d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        RETURN_VOID();
65d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    }
66d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
67d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    /* initialize the class if it hasn't been already */
68d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    if (!dvmIsClassInitialized(declaringClass)) {
69d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        if (!dvmInitClass(declaringClass)) {
70d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            LOGW("Class init failed in Constructor.constructNative (%s)\n",
71d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden                declaringClass->descriptor);
72d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            assert(dvmCheckException(dvmThreadSelf()));
73d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden            RETURN_VOID();
74d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden        }
75d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden    }
76d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    newObj = dvmAllocObject(declaringClass, ALLOC_DEFAULT);
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (newObj == NULL)
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_PTR(NULL);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    (void) dvmInvokeMethod(newObj, meth, argList, params, NULL, noAccessCheck);
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc(newObj, NULL);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(newObj);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[] getDeclaredAnnotations(Class declaringClass, int slot)
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this constructor.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getDeclaredAnnotations(
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* annos = dvmGetMethodAnnotations(meth);
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*)annos, NULL);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(annos);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[][] getParameterAnnotations(Class declaringClass, int slot)
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this constructor's parameters.
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getParameterAnnotations(
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* annos = dvmGetParameterAnnotations(meth);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*)annos, NULL);
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(annos);
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object[] getSignatureAnnotation()
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature annotation.
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getSignatureAnnotation(
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // ignore thisPtr in args[0]
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Method* meth;
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    meth = dvmSlotToMethod(declaringClass, slot);
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(meth != NULL);
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* arr = dvmGetMethodSignatureAnnotation(meth);
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) arr, NULL);
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(arr);
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_reflect_Constructor[] = {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "constructNative",    "([Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;IZ)Ljava/lang/Object;",
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Constructor_constructNative },
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getConstructorModifiers", "(Ljava/lang/Class;I)I",
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Constructor_getConstructorModifiers },
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getDeclaredAnnotations", "(Ljava/lang/Class;I)[Ljava/lang/annotation/Annotation;",
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Constructor_getDeclaredAnnotations },
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getParameterAnnotations", "(Ljava/lang/Class;I)[[Ljava/lang/annotation/Annotation;",
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Constructor_getParameterAnnotations },
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getSignatureAnnotation",  "(Ljava/lang/Class;I)[Ljava/lang/Object;",
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Constructor_getSignatureAnnotation },
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { NULL, NULL, NULL },
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166