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