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.Field
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/*
2552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Validate access to a field.  Returns a pointer to the Field struct.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "declaringClass" is the class in which the field was declared.  For an
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance field, "obj" is the object that holds the field data; for a
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * static field its value is ignored.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "If the underlying field is static, the class that declared the
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * field is initialized if it has not already been initialized."
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On failure, throws an exception and returns NULL.
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The documentation lists exceptional conditions and the exceptions that
3752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * should be thrown, but doesn't say which exception prevails when two or
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * more exceptional conditions exist at the same time.  For example,
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * attempting to set a protected field from an unrelated class causes an
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * IllegalAccessException, while passing in a data type that doesn't match
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the field causes an IllegalArgumentException.  If code does both at the
4252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * same time, we have to choose one or the other.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The expected order is:
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (1) Check for illegal access. Throw IllegalAccessException.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (2) Make sure the object actually has the field.  Throw
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      IllegalArgumentException.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (3) Make sure the field matches the expected type, e.g. if we issued
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      a "getInteger" call make sure the field is an integer or can be
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      converted to an int with a widening conversion.  Throw
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      IllegalArgumentException.
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (4) Make sure "obj" is not null.  Throw NullPointerException.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * TODO: we're currently handling #3 after #4, because we don't check the
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * widening conversion until we're actually extracting the value from the
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * object (which won't work well if it's a null reference).
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
5852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic Field* validateFieldAccess(Object* obj, ClassObject* declaringClass,
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot, bool isSetOperation, bool noAccessCheck)
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field* field;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    field = dvmSlotToField(declaringClass, slot);
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(field != NULL);
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* verify access */
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!noAccessCheck) {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (isSetOperation && dvmIsFinalField(field)) {
69d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein            dvmThrowIllegalAccessException("field is marked 'final'");
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return NULL;
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ClassObject* callerClass =
7430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee            dvmGetCaller2Class(dvmThreadSelf()->interpSave.curFrame);
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * We need to check two things:
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  (1) Would an instance of the calling class have access to the field?
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  (2) If the field is "protected", is the object an instance of the
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *      calling class, or is the field's declaring class in the same
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *      package as the calling class?
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * #1 is basic access control.  #2 ensures that, just because
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * you're a subclass of Foo, you can't mess with protected fields
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * in arbitrary Foo objects from other packages.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmCheckFieldAccess(callerClass, field)) {
88d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein            dvmThrowIllegalAccessException("access to field not allowed");
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return NULL;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (dvmIsProtectedField(field)) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bool isInstance, samePackage;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (obj != NULL)
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                isInstance = dvmInstanceof(obj->clazz, callerClass);
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                isInstance = false;
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            samePackage = dvmInSamePackage(declaringClass, callerClass);
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!isInstance && !samePackage) {
101d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein                dvmThrowIllegalAccessException(
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "access to protected field not allowed");
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return NULL;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmIsStaticField(field)) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* init class if necessary, then return ptr to storage in "field" */
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmIsClassInitialized(declaringClass)) {
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!dvmInitClass(declaringClass)) {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assert(dvmCheckException(dvmThreadSelf()));
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return NULL;
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Verify object is of correct type (i.e. it actually has the
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * expected field in it), then grab a pointer to obj storage.
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * The call to dvmVerifyObjectInClass throws an NPE if "obj" is NULL.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmVerifyObjectInClass(obj, declaringClass)) {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assert(dvmCheckException(dvmThreadSelf()));
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return NULL;
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    return field;
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
13352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Extracts the value of a static field.  Provides appropriate barriers
13452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
13552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden *
13652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sub-32-bit values are sign- or zero-extended to fill out 32 bits.
13752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
13852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void getStaticFieldValue(const StaticField* sfield, JValue* value)
13952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
140a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro    if (!dvmIsVolatileField(sfield)) {
14152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* just copy the whole thing */
14252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        *value = sfield->value;
14352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
14452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
145a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (sfield->signature[0]) {
14652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
14752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldBooleanVolatile(sfield);
14852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
14952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
15052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldByteVolatile(sfield);
15152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
15252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
15352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldShortVolatile(sfield);
15452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
15552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
15652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldCharVolatile(sfield);
15752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
15852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
15952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldIntVolatile(sfield);
16052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
16152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
16252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->f = dvmGetStaticFieldFloatVolatile(sfield);
16352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
16452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
16552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->j = dvmGetStaticFieldLongVolatile(sfield);
16652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
16752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
16852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->d = dvmGetStaticFieldDoubleVolatile(sfield);
16952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
17052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
17152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
17252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->l = dvmGetStaticFieldObjectVolatile(sfield);
17352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
17452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
175c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block            ALOGE("Unhandled field signature '%s'", sfield->signature);
17652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
17752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
17852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
17952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
18052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
18152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
18252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Extracts the value of an instance field.  Provides appropriate barriers
18352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
18452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden *
18552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sub-32-bit values are sign- or zero-extended to fill out 32 bits.
18652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
18752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void getInstFieldValue(const InstField* ifield, Object* obj,
18852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    JValue* value)
18952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
190a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro    if (!dvmIsVolatileField(ifield)) {
19152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* use type-specific get; really just 32-bit vs. 64-bit */
192a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (ifield->signature[0]) {
19352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
19452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldBoolean(obj, ifield->byteOffset);
19552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
19652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
19752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldByte(obj, ifield->byteOffset);
19852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
19952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
20052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldShort(obj, ifield->byteOffset);
20152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
20252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
20352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldChar(obj, ifield->byteOffset);
20452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
20552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
20652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldInt(obj, ifield->byteOffset);
20752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
20852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
20952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->f = dvmGetFieldFloat(obj, ifield->byteOffset);
21052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
21152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
21252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->j = dvmGetFieldLong(obj, ifield->byteOffset);
21352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
21452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
21552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->d = dvmGetFieldDouble(obj, ifield->byteOffset);
21652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
21752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
21852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
21952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->l = dvmGetFieldObject(obj, ifield->byteOffset);
22052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
22152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
222c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block            ALOGE("Unhandled field signature '%s'", ifield->signature);
22352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
22452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
22552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
22652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
227a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (ifield->signature[0]) {
22852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
22952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldBooleanVolatile(obj, ifield->byteOffset);
23052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
23152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
23252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldByteVolatile(obj, ifield->byteOffset);
23352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
23452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
23552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldShortVolatile(obj, ifield->byteOffset);
23652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
23752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
23852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldCharVolatile(obj, ifield->byteOffset);
23952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
24152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldIntVolatile(obj, ifield->byteOffset);
24252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
24452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->f = dvmGetFieldFloatVolatile(obj, ifield->byteOffset);
24552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
24752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->j = dvmGetFieldLongVolatile(obj, ifield->byteOffset);
24852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
25052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->d = dvmGetFieldDoubleVolatile(obj, ifield->byteOffset);
25152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
25252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
25352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
25452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->l = dvmGetFieldObjectVolatile(obj, ifield->byteOffset);
25552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
25652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
257c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block            ALOGE("Unhandled field signature '%s'", ifield->signature);
25852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
25952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
26052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
26152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
26252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
26352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
26452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Copies the value of the static or instance field into "*value".
26552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
26652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void getFieldValue(const Field* field, Object* obj, JValue* value)
26752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
26852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (dvmIsStaticField(field)) {
26952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return getStaticFieldValue((const StaticField*) field, value);
27052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
27152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return getInstFieldValue((const InstField*) field, obj, value);
27252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
27352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
27452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
27552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
27652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sets the value of a static field.  Provides appropriate barriers
27752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
27852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
27952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void setStaticFieldValue(StaticField* sfield, const JValue* value)
28052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
281a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro    if (!dvmIsVolatileField(sfield)) {
282a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (sfield->signature[0]) {
28352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
28452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
285fc75f3ed87b55d625b6054e18645da5cbdba31c6Carl Shapiro            dvmSetStaticFieldObject(sfield, (Object*)value->l);
28652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
28752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
28852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            /* just copy the whole thing */
28952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            sfield->value = *value;
29052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
29152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
29252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
29352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
294a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (sfield->signature[0]) {
29552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
29652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldBooleanVolatile(sfield, value->z);
29752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
29852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
29952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldByteVolatile(sfield, value->b);
30052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
30152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
30252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldShortVolatile(sfield, value->s);
30352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
30452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
30552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldCharVolatile(sfield, value->c);
30652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
30752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
30852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldIntVolatile(sfield, value->i);
30952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
31152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldFloatVolatile(sfield, value->f);
31252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
31452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldLongVolatile(sfield, value->j);
31552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
31752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldDoubleVolatile(sfield, value->d);
31852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
32052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
321fc75f3ed87b55d625b6054e18645da5cbdba31c6Carl Shapiro            dvmSetStaticFieldObjectVolatile(sfield, (Object*)value->l);
32252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
32352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
324c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block            ALOGE("Unhandled field signature '%s'", sfield->signature);
32552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
32652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
32752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
32852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
32952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
33052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
33152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sets the value of an instance field.  Provides appropriate barriers
33252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
33352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
33452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void setInstFieldValue(InstField* ifield, Object* obj,
33552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    const JValue* value)
33652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
337a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro    if (!dvmIsVolatileField(ifield)) {
33852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* use type-specific set; really just 32-bit vs. 64-bit */
339a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (ifield->signature[0]) {
34052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
34152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldBoolean(obj, ifield->byteOffset, value->z);
34252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
34352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
34452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldByte(obj, ifield->byteOffset, value->b);
34552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
34652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
34752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldShort(obj, ifield->byteOffset, value->s);
34852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
34952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
35052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldChar(obj, ifield->byteOffset, value->c);
35152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
35252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
35352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldInt(obj, ifield->byteOffset, value->i);
35452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
35552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
35652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldFloat(obj, ifield->byteOffset, value->f);
35752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
35852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
35952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldLong(obj, ifield->byteOffset, value->j);
36052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
36152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
36252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldDouble(obj, ifield->byteOffset, value->d);
36352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
36452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
36552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
366fc75f3ed87b55d625b6054e18645da5cbdba31c6Carl Shapiro            dvmSetFieldObject(obj, ifield->byteOffset, (Object *)value->l);
36752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
36852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
369c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block            ALOGE("Unhandled field signature '%s'", ifield->signature);
37052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
37152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
37252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden#if ANDROID_SMP != 0
37352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /*
37452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden         * Special handling for final fields on SMP systems.  We need a
37552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden         * store/store barrier here (JMM requirement).
37652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden         */
377a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        if (dvmIsFinalField(ifield)) {
3781df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden            ANDROID_MEMBAR_STORE();
37952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
38052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden#endif
38152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
38252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
383a7323974309c3b81cfe342db635d0bf30f36ff62Carl Shapiro        switch (ifield->signature[0]) {
38452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
38552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldBooleanVolatile(obj, ifield->byteOffset, value->z);
38652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
38752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
38852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldByteVolatile(obj, ifield->byteOffset, value->b);
38952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
39152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldShortVolatile(obj, ifield->byteOffset, value->s);
39252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
39452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldCharVolatile(obj, ifield->byteOffset, value->c);
39552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
39752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldIntVolatile(obj, ifield->byteOffset, value->i);
39852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
40052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldFloatVolatile(obj, ifield->byteOffset, value->f);
40152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
40252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
40352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldLongVolatile(obj, ifield->byteOffset, value->j);
40452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
40552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
40652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldDoubleVolatile(obj, ifield->byteOffset, value->d);
40752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
40852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
40952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
410fc75f3ed87b55d625b6054e18645da5cbdba31c6Carl Shapiro            dvmSetFieldObjectVolatile(obj, ifield->byteOffset, (Object*)value->l);
41152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
41252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
413c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block            ALOGE("Unhandled field signature '%s'", ifield->signature);
41452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
41552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
41652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
41752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
41852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
41952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
42052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Copy "*value" into the static or instance field.
42152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
42252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void setFieldValue(Field* field, Object* obj, const JValue* value)
42352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
42452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (dvmIsStaticField(field)) {
42552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return setStaticFieldValue((StaticField*) field, value);
42652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
42752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return setInstFieldValue((InstField*) field, obj, value);
42852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
42952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
43052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
43152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
43252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
43352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int getFieldModifiers(Class declaringClass, int slot)
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
43652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void Dalvik_java_lang_reflect_Field_getFieldModifiers(const u4* args,
43752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    JValue* pResult)
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
43952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field* field;
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    field = dvmSlotToField(declaringClass, slot);
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_INT(field->accessFlags & JAVA_FLAGS_MASK);
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object getField(Object o, Class declaringClass, Class type,
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     int slot, boolean noAccessCheck)
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive types need to be boxed.
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getField(const u4* args,
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
45752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
46352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    Field* field;
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DataObject* result;
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //dvmDumpClass(obj->clazz, kDumpClassFullDetail);
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
47052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, false,noAccessCheck);
47152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field == NULL)
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    getFieldValue(field, obj, &value);
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* if it's primitive, box it up */
477c4ae06fe78cffa815225f9bcd26c19e6714db572Andy McFadden    result = dvmBoxPrimitive(value, fieldType);
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) result, NULL);
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(result);
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private void setField(Object o, Class declaringClass, Class type,
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     int slot, boolean noAccessCheck, Object value)
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When assigning into a primitive field we will automatically extract
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the value from box types.
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_setField(const u4* args,
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
49252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* valueObj = (Object*) args[6];
49952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    Field* field;
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
502c4ae06fe78cffa815225f9bcd26c19e6714db572Andy McFadden    /* unbox primitive, or verify object type */
503c4ae06fe78cffa815225f9bcd26c19e6714db572Andy McFadden    if (!dvmUnboxPrimitive(valueObj, fieldType, &value)) {
504d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein        dvmThrowIllegalArgumentException("invalid value for field");
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
50952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, true, noAccessCheck);
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field != NULL) {
51252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        setFieldValue(field, obj, &value);
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive field getters, e.g.:
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private double getIField(Object o, Class declaringClass,
520a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein *     Class type, int slot, boolean noAccessCheck, char descriptor)
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getPrimitiveField(const u4* args,
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
52552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
531a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    jchar descriptor = args[6];
532a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PrimitiveType targetType = dexGetPrimitiveTypeFromDescriptorChar(descriptor);
53352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    const Field* field;
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!dvmIsPrimitiveClass(fieldType)) {
537d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein        dvmThrowIllegalArgumentException("not a primitive field");
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
54252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, false,noAccessCheck);
54352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field == NULL)
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    getFieldValue(field, obj, &value);
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* retrieve value, performing a widening conversion if necessary */
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmConvertPrimitiveValue(fieldType->primitiveType, targetType,
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        &(value.i), &(pResult->i)) < 0)
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
552d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein        dvmThrowIllegalArgumentException("invalid primitive conversion");
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive field setters, e.g.:
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private void setIField(Object o, Class declaringClass,
560a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein *     Class type, int slot, boolean noAccessCheck, char descriptor, int value)
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_setPrimitiveField(const u4* args,
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
56552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
571a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    jchar descriptor = args[6];
57252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    const s4* valuePtr = (s4*) &args[7];    /* 64-bit vars spill into args[8] */
573a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PrimitiveType srcType = dexGetPrimitiveTypeFromDescriptorChar(descriptor);
57452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    Field* field;
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!dvmIsPrimitiveClass(fieldType)) {
578d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein        dvmThrowIllegalArgumentException("not a primitive field");
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* convert the 32/64-bit arg to a JValue matching the field type */
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmConvertPrimitiveValue(srcType, fieldType->primitiveType,
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        valuePtr, &(value.i)) < 0)
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
586d27f3cf3e7b373487f39e035fc4b55168d55c454Dan Bornstein        dvmThrowIllegalArgumentException("invalid primitive conversion");
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
59152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, true, noAccessCheck);
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field != NULL) {
59452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        setFieldValue(field, obj, &value);
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
60069c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson * private static Annotation[] getDeclaredAnnotations(
60169c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson *         Class declaringClass, int slot)
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this field.
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getDeclaredAnnotations(
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
60869c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    ClassObject* declaringClass = (ClassObject*) args[0];
60969c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    int slot = args[1];
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field* field;
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    field = dvmSlotToField(declaringClass, slot);
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(field != NULL);
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* annos = dvmGetFieldAnnotations(field);
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) annos, NULL);
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(annos);
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
62169c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson * static Annotation getAnnotation(
62269c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson *         Class declaringClass, int slot, Class annotationType);
62369c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson */
62469c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilsonstatic void Dalvik_java_lang_reflect_Field_getAnnotation(const u4* args,
62569c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    JValue* pResult)
62669c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson{
62769c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    ClassObject* clazz = (ClassObject*) args[0];
62869c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    int slot = args[1];
62969c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    ClassObject* annotationClazz = (ClassObject*) args[2];
63069c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson
63169c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    Field* field = dvmSlotToField(clazz, slot);
63269c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    RETURN_PTR(dvmGetFieldAnnotation(clazz, field, annotationClazz));
63369c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson}
63469c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson
63569c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson/*
63669c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson * static boolean isAnnotationPresent(
63769c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson *         Class declaringClass, int slot, Class annotationType);
63869c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson */
63969c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilsonstatic void Dalvik_java_lang_reflect_Field_isAnnotationPresent(const u4* args,
64069c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    JValue* pResult)
64169c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson{
64269c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    ClassObject* clazz = (ClassObject*) args[0];
64369c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    int slot = args[1];
64469c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    ClassObject* annotationClazz = (ClassObject*) args[2];
64569c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson
64669c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    Field* field = dvmSlotToField(clazz, slot);
64769c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    RETURN_BOOLEAN(dvmIsFieldAnnotationPresent(clazz, field, annotationClazz));
64869c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson}
64969c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson
65069c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson/*
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object[] getSignatureAnnotation()
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature annotation.
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getSignatureAnnotation(const u4* args,
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
65852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field* field;
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    field = dvmSlotToField(declaringClass, slot);
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(field != NULL);
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* arr = dvmGetFieldSignatureAnnotation(field);
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) arr, NULL);
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(arr);
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_reflect_Field[] = {
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getFieldModifiers",  "(Ljava/lang/Class;I)I",
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getFieldModifiers },
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getField",           "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZ)Ljava/lang/Object;",
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getField },
676a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getBField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)B",
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
678a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getCField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)C",
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
680a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getDField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)D",
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
682a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getFField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)F",
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
684a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getIField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)I",
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
686a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getJField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)J",
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
688a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getSField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)S",
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
690a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "getZField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZC)Z",
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setField",           "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZLjava/lang/Object;)V",
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setField },
694a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setBField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCB)V",
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
696a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setCField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCC)V",
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
698a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setDField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCD)V",
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
700a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setFField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCF)V",
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
702a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setIField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCI)V",
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
704a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setJField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCJ)V",
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
706a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setSField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCS)V",
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
708a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    { "setZField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZCZ)V",
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getDeclaredAnnotations", "(Ljava/lang/Class;I)[Ljava/lang/annotation/Annotation;",
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getDeclaredAnnotations },
71269c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    { "getAnnotation", "(Ljava/lang/Class;ILjava/lang/Class;)Ljava/lang/annotation/Annotation;",
71369c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson        Dalvik_java_lang_reflect_Field_getAnnotation },
71469c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson    { "isAnnotationPresent", "(Ljava/lang/Class;ILjava/lang/Class;)Z",
71569c93e98f0c2ed73461a8281f5d6eaf46d31505eJesse Wilson        Dalvik_java_lang_reflect_Field_isAnnotationPresent },
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getSignatureAnnotation",  "(Ljava/lang/Class;I)[Ljava/lang/Object;",
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getSignatureAnnotation },
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { NULL, NULL, NULL },
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
720