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