java_lang_reflect_Field.cpp revision 1df319e3674d993a07bc0ff1f56a5915410b5903
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)) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dvmThrowException("Ljava/lang/IllegalAccessException;",
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "field is marked 'final'");
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return NULL;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ClassObject* callerClass =
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dvmGetCaller2Class(dvmThreadSelf()->curFrame);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * We need to check two things:
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  (1) Would an instance of the calling class have access to the field?
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  (2) If the field is "protected", is the object an instance of the
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *      calling class, or is the field's declaring class in the same
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *      package as the calling class?
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * #1 is basic access control.  #2 ensures that, just because
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * you're a subclass of Foo, you can't mess with protected fields
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * in arbitrary Foo objects from other packages.
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmCheckFieldAccess(callerClass, field)) {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dvmThrowException("Ljava/lang/IllegalAccessException;",
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "access to field not allowed");
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return NULL;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (dvmIsProtectedField(field)) {
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bool isInstance, samePackage;
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (obj != NULL)
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                isInstance = dvmInstanceof(obj->clazz, callerClass);
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                isInstance = false;
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            samePackage = dvmInSamePackage(declaringClass, callerClass);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!isInstance && !samePackage) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                dvmThrowException("Ljava/lang/IllegalAccessException;",
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "access to protected field not allowed");
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return NULL;
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmIsStaticField(field)) {
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* init class if necessary, then return ptr to storage in "field" */
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmIsClassInitialized(declaringClass)) {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!dvmInitClass(declaringClass)) {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assert(dvmCheckException(dvmThreadSelf()));
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return NULL;
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Verify object is of correct type (i.e. it actually has the
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * expected field in it), then grab a pointer to obj storage.
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * The call to dvmVerifyObjectInClass throws an NPE if "obj" is NULL.
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmVerifyObjectInClass(obj, declaringClass)) {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assert(dvmCheckException(dvmThreadSelf()));
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (obj != NULL) {
12852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden                LOGD("Wrong object type for field access: %s is not a %s\n",
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    obj->clazz->descriptor, declaringClass->descriptor);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return NULL;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
13552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    return field;
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
13952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Extracts the value of a static field.  Provides appropriate barriers
14052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
14152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden *
14252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sub-32-bit values are sign- or zero-extended to fill out 32 bits.
14352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
14452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void getStaticFieldValue(const StaticField* sfield, JValue* value)
14552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
14652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (!dvmIsVolatileField(&sfield->field)) {
14752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* just copy the whole thing */
14852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        *value = sfield->value;
14952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
15052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
15152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (sfield->field.signature[0]) {
15252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
15352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldBooleanVolatile(sfield);
15452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
15552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
15652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldByteVolatile(sfield);
15752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
15852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
15952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldShortVolatile(sfield);
16052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
16152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
16252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldCharVolatile(sfield);
16352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
16452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
16552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetStaticFieldIntVolatile(sfield);
16652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
16752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
16852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->f = dvmGetStaticFieldFloatVolatile(sfield);
16952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
17052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
17152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->j = dvmGetStaticFieldLongVolatile(sfield);
17252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
17352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
17452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->d = dvmGetStaticFieldDoubleVolatile(sfield);
17552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
17652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
17752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
17852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->l = dvmGetStaticFieldObjectVolatile(sfield);
17952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
18052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
18152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            LOGE("Unhandled field signature '%s'\n", sfield->field.signature);
18252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
18352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
18452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
18552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
18652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
18752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
18852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Extracts the value of an instance field.  Provides appropriate barriers
18952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
19052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden *
19152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sub-32-bit values are sign- or zero-extended to fill out 32 bits.
19252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
19352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void getInstFieldValue(const InstField* ifield, Object* obj,
19452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    JValue* value)
19552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
19652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (!dvmIsVolatileField(&ifield->field)) {
19752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* use type-specific get; really just 32-bit vs. 64-bit */
19852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (ifield->field.signature[0]) {
19952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
20052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldBoolean(obj, ifield->byteOffset);
20152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
20252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
20352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldByte(obj, ifield->byteOffset);
20452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
20552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
20652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldShort(obj, ifield->byteOffset);
20752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
20852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
20952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldChar(obj, ifield->byteOffset);
21052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
21152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
21252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldInt(obj, ifield->byteOffset);
21352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
21452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
21552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->f = dvmGetFieldFloat(obj, ifield->byteOffset);
21652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
21752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
21852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->j = dvmGetFieldLong(obj, ifield->byteOffset);
21952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
22052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
22152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->d = dvmGetFieldDouble(obj, ifield->byteOffset);
22252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
22352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
22452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
22552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->l = dvmGetFieldObject(obj, ifield->byteOffset);
22652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
22752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
22852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            LOGE("Unhandled field signature '%s'\n", ifield->field.signature);
22952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
23052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
23152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
23252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
23352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (ifield->field.signature[0]) {
23452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
23552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldBooleanVolatile(obj, ifield->byteOffset);
23652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
23752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
23852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldByteVolatile(obj, ifield->byteOffset);
23952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
24152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldShortVolatile(obj, ifield->byteOffset);
24252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
24452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldCharVolatile(obj, ifield->byteOffset);
24552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
24752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->i = dvmGetFieldIntVolatile(obj, ifield->byteOffset);
24852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
24952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
25052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->f = dvmGetFieldFloatVolatile(obj, ifield->byteOffset);
25152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
25252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
25352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->j = dvmGetFieldLongVolatile(obj, ifield->byteOffset);
25452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
25552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
25652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->d = dvmGetFieldDoubleVolatile(obj, ifield->byteOffset);
25752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
25852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
25952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
26052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            value->l = dvmGetFieldObjectVolatile(obj, ifield->byteOffset);
26152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
26252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
26352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            LOGE("Unhandled field signature '%s'\n", ifield->field.signature);
26452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
26552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
26652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
26752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
26852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
26952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
27052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Copies the value of the static or instance field into "*value".
27152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
27252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void getFieldValue(const Field* field, Object* obj, JValue* value)
27352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
27452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (dvmIsStaticField(field)) {
27552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return getStaticFieldValue((const StaticField*) field, value);
27652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
27752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return getInstFieldValue((const InstField*) field, obj, value);
27852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
27952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
28052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
28152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
28252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sets the value of a static field.  Provides appropriate barriers
28352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
28452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
28552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void setStaticFieldValue(StaticField* sfield, const JValue* value)
28652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
28752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (!dvmIsVolatileField(&sfield->field)) {
28852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (sfield->field.signature[0]) {
28952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
29052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
29152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldObject(sfield, value->l);
29252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
29352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
29452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            /* just copy the whole thing */
29552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            sfield->value = *value;
29652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
29752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
29852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
29952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
30052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (sfield->field.signature[0]) {
30152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
30252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldBooleanVolatile(sfield, value->z);
30352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
30452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
30552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldByteVolatile(sfield, value->b);
30652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
30752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
30852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldShortVolatile(sfield, value->s);
30952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
31152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldCharVolatile(sfield, value->c);
31252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
31452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldIntVolatile(sfield, value->i);
31552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
31752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldFloatVolatile(sfield, value->f);
31852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
31952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
32052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldLongVolatile(sfield, value->j);
32152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
32252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
32352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldDoubleVolatile(sfield, value->d);
32452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
32552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
32652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
32752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetStaticFieldObjectVolatile(sfield, value->l);
32852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
32952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
33052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            LOGE("Unhandled field signature '%s'\n", sfield->field.signature);
33152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
33252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
33352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
33452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
33552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
33652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
33752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Sets the value of an instance field.  Provides appropriate barriers
33852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * for volatile fields.
33952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
34052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void setInstFieldValue(InstField* ifield, Object* obj,
34152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    const JValue* value)
34252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
34352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (!dvmIsVolatileField(&ifield->field)) {
34452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* use type-specific set; really just 32-bit vs. 64-bit */
34552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (ifield->field.signature[0]) {
34652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
34752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldBoolean(obj, ifield->byteOffset, value->z);
34852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
34952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
35052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldByte(obj, ifield->byteOffset, value->b);
35152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
35252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
35352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldShort(obj, ifield->byteOffset, value->s);
35452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
35552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
35652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldChar(obj, ifield->byteOffset, value->c);
35752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
35852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
35952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldInt(obj, ifield->byteOffset, value->i);
36052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
36152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
36252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldFloat(obj, ifield->byteOffset, value->f);
36352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
36452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
36552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldLong(obj, ifield->byteOffset, value->j);
36652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
36752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
36852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldDouble(obj, ifield->byteOffset, value->d);
36952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
37052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
37152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
37252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldObject(obj, ifield->byteOffset, value->l);
37352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
37452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
37552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            LOGE("Unhandled field signature '%s'\n", ifield->field.signature);
37652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
37752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
37852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden#if ANDROID_SMP != 0
37952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /*
38052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden         * Special handling for final fields on SMP systems.  We need a
38152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden         * store/store barrier here (JMM requirement).
38252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden         */
38352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        if (dvmIsFinalField(&ifield->field)) {
3841df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden            ANDROID_MEMBAR_STORE();
38552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
38652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden#endif
38752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
38852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        /* need memory barriers and/or 64-bit atomic ops */
38952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        switch (ifield->field.signature[0]) {
39052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'Z':
39152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldBooleanVolatile(obj, ifield->byteOffset, value->z);
39252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'B':
39452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldByteVolatile(obj, ifield->byteOffset, value->b);
39552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'S':
39752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldShortVolatile(obj, ifield->byteOffset, value->s);
39852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
39952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'C':
40052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldCharVolatile(obj, ifield->byteOffset, value->c);
40152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
40252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'I':
40352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldIntVolatile(obj, ifield->byteOffset, value->i);
40452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
40552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'F':
40652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldFloatVolatile(obj, ifield->byteOffset, value->f);
40752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
40852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'J':
40952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldLongVolatile(obj, ifield->byteOffset, value->j);
41052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
41152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'D':
41252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldDoubleVolatile(obj, ifield->byteOffset, value->d);
41352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
41452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case 'L':
41552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        case '[':
41652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmSetFieldObjectVolatile(obj, ifield->byteOffset, value->l);
41752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            break;
41852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        default:
41952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            LOGE("Unhandled field signature '%s'\n", ifield->field.signature);
42052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden            dvmAbort();
42152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        }
42252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
42352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
42452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
42552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
42652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden * Copy "*value" into the static or instance field.
42752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden */
42852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void setFieldValue(Field* field, Object* obj, const JValue* value)
42952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden{
43052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (dvmIsStaticField(field)) {
43152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return setStaticFieldValue((StaticField*) field, value);
43252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    } else {
43352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        return setInstFieldValue((InstField*) field, obj, value);
43452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    }
43552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden}
43652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
43752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
43852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden
43952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden/*
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int getFieldModifiers(Class declaringClass, int slot)
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
44252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFaddenstatic void Dalvik_java_lang_reflect_Field_getFieldModifiers(const u4* args,
44352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    JValue* pResult)
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
44552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field* field;
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    field = dvmSlotToField(declaringClass, slot);
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_INT(field->accessFlags & JAVA_FLAGS_MASK);
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object getField(Object o, Class declaringClass, Class type,
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     int slot, boolean noAccessCheck)
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive types need to be boxed.
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getField(const u4* args,
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
46352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
46952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    Field* field;
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DataObject* result;
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //dvmDumpClass(obj->clazz, kDumpClassFullDetail);
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
47652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, false,noAccessCheck);
47752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field == NULL)
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    getFieldValue(field, obj, &value);
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* if it's primitive, box it up */
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    result = dvmWrapPrimitive(value, fieldType);
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) result, NULL);
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(result);
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private void setField(Object o, Class declaringClass, Class type,
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     int slot, boolean noAccessCheck, Object value)
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When assigning into a primitive field we will automatically extract
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the value from box types.
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_setField(const u4* args,
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
49852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* valueObj = (Object*) args[6];
50552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    Field* field;
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unwrap primitive, or verify object type */
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!dvmUnwrapPrimitive(valueObj, fieldType, &value)) {
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmThrowException("Ljava/lang/IllegalArgumentException;",
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "invalid value for field");
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51552b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
51652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, true, noAccessCheck);
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field != NULL) {
51952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        setFieldValue(field, obj, &value);
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert a reflection primitive type ordinal (inherited from the previous
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * VM's reflection classes) to our value.
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic PrimitiveType convPrimType(int typeNum)
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static const PrimitiveType conv[PRIM_MAX] = {
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PRIM_NOT, PRIM_BOOLEAN, PRIM_BYTE, PRIM_CHAR, PRIM_SHORT,
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PRIM_INT, PRIM_FLOAT, PRIM_LONG, PRIM_DOUBLE
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    };
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (typeNum <= 0 || typeNum > 8)
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return PRIM_NOT;
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return conv[typeNum];
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive field getters, e.g.:
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private double getIField(Object o, Class declaringClass,
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     Class type, int slot, boolean noAccessCheck, int type_no)
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "type_no" is defined by the java.lang.reflect.Field class.
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getPrimitiveField(const u4* args,
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
54952b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int typeNum = args[6];
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    PrimitiveType targetType = convPrimType(typeNum);
55752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    const Field* field;
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!dvmIsPrimitiveClass(fieldType)) {
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmThrowException("Ljava/lang/IllegalArgumentException;",
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "not a primitive field");
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56652b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
56752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, false,noAccessCheck);
56852b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field == NULL)
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    getFieldValue(field, obj, &value);
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* retrieve value, performing a widening conversion if necessary */
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmConvertPrimitiveValue(fieldType->primitiveType, targetType,
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        &(value.i), &(pResult->i)) < 0)
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmThrowException("Ljava/lang/IllegalArgumentException;",
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "invalid primitive conversion");
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Primitive field setters, e.g.:
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private void setIField(Object o, Class declaringClass,
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     Class type, int slot, boolean noAccessCheck, int type_no, int value)
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "type_no" is defined by the java.lang.reflect.Field class.
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_setPrimitiveField(const u4* args,
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue* pResult)
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
59352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object* obj = (Object*) args[1];
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[2];
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* fieldType = (ClassObject*) args[3];
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[4];
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bool noAccessCheck = (args[5] != 0);
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int typeNum = args[6];
60052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    const s4* valuePtr = (s4*) &args[7];    /* 64-bit vars spill into args[8] */
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    PrimitiveType srcType = convPrimType(typeNum);
60252b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    Field* field;
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JValue value;
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (!dvmIsPrimitiveClass(fieldType)) {
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmThrowException("Ljava/lang/IllegalArgumentException;",
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "not a primitive field");
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* convert the 32/64-bit arg to a JValue matching the field type */
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (dvmConvertPrimitiveValue(srcType, fieldType->primitiveType,
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        valuePtr, &(value.i)) < 0)
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        dvmThrowException("Ljava/lang/IllegalArgumentException;",
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "invalid primitive conversion");
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RETURN_VOID();
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62052b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* get a pointer to the Field after validating access */
62152b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    field = validateFieldAccess(obj, declaringClass, slot, true, noAccessCheck);
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62352b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    if (field != NULL) {
62452b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden        setFieldValue(field, obj, &value);
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_VOID();
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[] getDeclaredAnnotations(Class declaringClass, int slot)
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this field.
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Field_getDeclaredAnnotations(
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u4* args, JValue* pResult)
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
63752b31dfea16f5a7b7bffddf65b493336ef0befeeAndy McFadden    /* ignore thisPtr in args[0] */
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ClassObject* declaringClass = (ClassObject*) args[1];
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int slot = args[2];
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field* field;
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    field = dvmSlotToField(declaringClass, slot);
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(field != NULL);
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ArrayObject* annos = dvmGetFieldAnnotations(field);
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    dvmReleaseTrackedAlloc((Object*) annos, NULL);
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    RETURN_PTR(annos);
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
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 },
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getBField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)B",
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getCField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)C",
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getDField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)D",
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getFField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)F",
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getIField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)I",
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getJField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)J",
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getSField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)S",
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getPrimitiveField },
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getZField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZI)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 },
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setBField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIB)V",
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setCField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIC)V",
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setDField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZID)V",
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setFField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIF)V",
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setIField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZII)V",
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setJField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIJ)V",
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setSField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIS)V",
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_setPrimitiveField },
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "setZField",          "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/Class;IZIZ)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 },
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { "getSignatureAnnotation",  "(Ljava/lang/Class;I)[Ljava/lang/Object;",
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Dalvik_java_lang_reflect_Field_getSignatureAnnotation },
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    { NULL, NULL, NULL },
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
716