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 * Basic reflection calls and utility functions.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
19375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_REFLECT_REFLECT_H_
20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_REFLECT_REFLECT_H_
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * During startup, validate the "box" classes, e.g. java/lang/Integer.
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmValidateBoxClasses();
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get all fields declared by a class.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Includes both class and instance fields.
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetDeclaredFields(ClassObject* clazz, bool publicOnly);
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
35b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson * Get the named field.
36b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson */
37b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse WilsonObject* dvmGetDeclaredField(ClassObject* clazz, StringObject* nameObj);
38b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson
39b8b838ff463efcf8cac28df159ed06fe4bdb089fJesse Wilson/*
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get all constructors declared by a class.
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetDeclaredConstructors(ClassObject* clazz, bool publicOnly);
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get all methods declared by a class.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This includes both static and virtual methods, and can include private
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * members if "publicOnly" is false.  It does not include Miranda methods,
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * since those weren't declared in the class, or constructors.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetDeclaredMethods(ClassObject* clazz, bool publicOnly);
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
543c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson * Get the named method.
553c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson */
563c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse WilsonObject* dvmGetDeclaredConstructorOrMethod(ClassObject* clazz,
573c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson    StringObject* nameObj, ArrayObject* args);
583c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson
593c6f4c012e0a314dc9f9f540b9374dbf530d03b0Jesse Wilson/*
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get all interfaces a class implements. If this is unable to allocate
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the result array, this raises an OutOfMemoryError and returns NULL.
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetInterfaces(ClassObject* clazz);
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert slot numbers back to objects.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectField* dvmSlotToField(ClassObject* clazz, int slot);
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMethod* dvmSlotToMethod(ClassObject* clazz, int slot);
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert a primitive value, performing a widening conversion if necessary.
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmConvertPrimitiveValue(PrimitiveType srcType,
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    PrimitiveType dstType, const s4* srcPtr, s4* dstPtr);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the argument to the specified type.
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the width of the argument (1 for most types, 2 for J/D, -1 on
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * error).
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectint dvmConvertArgument(DataObject* arg, ClassObject* type, s4* ins);
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
86c4ae06fe78cffa815225f9bcd26c19e6714db572Andy McFadden * Box a primitive value into an object.  If "returnType" is
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * not primitive, this just returns "value" cast to an object.
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
89c4ae06fe78cffa815225f9bcd26c19e6714db572Andy McFaddenDataObject* dvmBoxPrimitive(JValue value, ClassObject* returnType);
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unwrap a boxed primitive.  If "returnType" is not primitive, this just
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * returns "value" cast into a JValue.
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
95c4ae06fe78cffa815225f9bcd26c19e6714db572Andy McFaddenbool dvmUnboxPrimitive(Object* value, ClassObject* returnType,
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult);
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the class object that matches the method's signature.  For
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * primitive types, returns the box class.
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGetBoxedReturnType(const Method* meth);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * JNI reflection support.
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectField* dvmGetFieldFromReflectObj(Object* obj);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMethod* dvmGetMethodFromReflectObj(Object* obj);
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmCreateReflectObjForField(const ClassObject* clazz, Field* field);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmCreateReflectObjForMethod(const ClassObject* clazz, Method* method);
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Quick test to determine if the method in question is a reflection call.
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Used for some stack parsing.  Currently defined as "the method's declaring
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class is java.lang.reflect.Method".
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectINLINE bool dvmIsReflectionMethod(const Method* method)
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (method->clazz == gDvm.classJavaLangReflectMethod);
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Proxy class generation.
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGenerateProxyClass(StringObject* str, ArrayObject* interfaces,
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* loader);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create a new java.lang.reflect.Method object based on "meth".
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmCreateReflectMethodObject(const Method* meth);
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return an array of Annotation objects for the specified piece.  For method
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * parameters this is an array of arrays of Annotation objects.
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Method also applies to Constructor.
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetClassAnnotations(const ClassObject* clazz);
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetMethodAnnotations(const Method* method);
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetFieldAnnotations(const Field* field);
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetParameterAnnotations(const Method* method);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
145c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson * Return the annotation if it exists.
146c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson */
147c99fe6df38af0e55821d8d98ccf67664ce35231aJesse WilsonObject* dvmGetClassAnnotation(const ClassObject* clazz, const ClassObject* annotationClazz);
14869c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse WilsonObject* dvmGetMethodAnnotation(const ClassObject* clazz, const Method* method,
14969c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson        const ClassObject* annotationClazz);
15069c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse WilsonObject* dvmGetFieldAnnotation(const ClassObject* clazz, const Field* method,
15169c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson        const ClassObject* annotationClazz);
152c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson
153c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson/*
154c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson * Return true if the annotation exists.
155c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson */
156c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilsonbool dvmIsClassAnnotationPresent(const ClassObject* clazz, const ClassObject* annotationClazz);
15769c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilsonbool dvmIsMethodAnnotationPresent(const ClassObject* clazz, const Method* method,
15869c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson        const ClassObject* annotationClazz);
15969c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilsonbool dvmIsFieldAnnotationPresent(const ClassObject* clazz, const Field* method,
16069c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson        const ClassObject* annotationClazz);
161c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson
162c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson/*
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Find the default value for an annotation member.
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetAnnotationDefaultValue(const Method* method);
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the list of thrown exceptions for a method.  Returns NULL if there
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are no exceptions listed.
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetMethodThrows(const Method* method);
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the Signature annotation.
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetClassSignatureAnnotation(const ClassObject* clazz);
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetMethodSignatureAnnotation(const Method* method);
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetFieldSignatureAnnotation(const Field* field);
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the EnclosingMethod attribute from an annotation.  Returns a Method
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object, or NULL.
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectObject* dvmGetEnclosingMethod(const ClassObject* clazz);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return clazz's declaring class, or NULL if there isn't one.
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGetDeclaringClass(const ClassObject* clazz);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return clazz's enclosing class, or NULL if there isn't one.
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectClassObject* dvmGetEnclosingClass(const ClassObject* clazz);
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the EnclosingClass attribute from an annotation.  If found, returns
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "true".  A String with the original name of the class and the original
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * access flags are returned through the arguments.  (The name will be NULL
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * for an anonymous inner class.)
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmGetInnerClass(const ClassObject* clazz, StringObject** pName,
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int* pAccessFlags);
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get an array of class objects from the MemberClasses annotation.  Returns
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NULL if none found.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectArrayObject* dvmGetDeclaredClasses(const ClassObject* clazz);
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Used to pass values out of annotation (and encoded array) processing
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * functions.
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
215d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct AnnotationValue {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue  value;
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1      type;
218d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Iterator structure for iterating over DexEncodedArray instances. The
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * structure should be treated as opaque.
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
225d862faa2ceae186da5518607505eb942d634ced9Carl Shapirostruct EncodedArrayIterator {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u1* cursor;                    /* current cursor */
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 elementsLeft;                     /* number of elements left to read */
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexEncodedArray* encodedArray; /* instance being iterated over */
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 size;                             /* number of elements in instance */
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const ClassObject* clazz;            /* class to resolve with respect to */
231d862faa2ceae186da5518607505eb942d634ced9Carl Shapiro};
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initializes an encoded array iterator.
235de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro *
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param iterator iterator to initialize
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param encodedArray encoded array to iterate over
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param clazz class to use when resolving strings and types
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dvmEncodedArrayIteratorInitialize(EncodedArrayIterator* iterator,
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        const DexEncodedArray* encodedArray, const ClassObject* clazz);
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns whether there are more elements to be read.
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmEncodedArrayIteratorHasNext(const EncodedArrayIterator* iterator);
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the next decoded value from the iterator, advancing its
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * cursor. This returns primitive values in their corresponding union
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * slots, and returns everything else (including nulls) as object
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * references in the "l" union slot.
253de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro *
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The caller must call dvmReleaseTrackedAlloc() on any returned reference.
255de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro *
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param value pointer to store decoded value into
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @returns true if a value was decoded and the cursor advanced; false if
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the last value had already been decoded or if there was a problem decoding
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectbool dvmEncodedArrayIteratorGetNext(EncodedArrayIterator* iterator,
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AnnotationValue* value);
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
263375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_REFLECT_REFLECT_H_
264