1f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom/* 2f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * Copyright (C) 2008 The Android Open Source Project 3f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * 4f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * you may not use this file except in compliance with the License. 6f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * You may obtain a copy of the License at 7f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * 8f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * 10f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * Unless required by applicable law or agreed to in writing, software 11f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * See the License for the specific language governing permissions and 14f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom * limitations under the License. 15f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom */ 16f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom 17277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#include "java_lang_reflect_Field.h" 18277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe 1946ee31b67d7ee1bd085fbc240502053caa3cf8faAndreas Gampe#include "android-base/stringprintf.h" 2046ee31b67d7ee1bd085fbc240502053caa3cf8faAndreas Gampe 21a1d2f957a21319d1110bebb9a52f46fd1c67ffafAndreas Gampe#include "art_field-inl.h" 22f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom#include "class_linker.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker-inl.h" 2462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#include "common_throws.h" 254f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 269323e6e44060545d6c4f925139572868f65b7fe3David Sehr#include "dex_file_annotations.h" 27eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "jni_internal.h" 284f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "mirror/class-inl.h" 29daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier#include "mirror/field.h" 3076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier#include "reflection-inl.h" 310795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier#include "scoped_fast_native_object_access-inl.h" 3280afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#include "utils.h" 33a1d2f957a21319d1110bebb9a52f46fd1c67ffafAndreas Gampe#include "well_known_classes.h" 34f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom 35f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstromnamespace art { 36f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom 3746ee31b67d7ee1bd085fbc240502053caa3cf8faAndreas Gampeusing android::base::StringPrintf; 3846ee31b67d7ee1bd085fbc240502053caa3cf8faAndreas Gampe 3976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartiertemplate<bool kIsSet> 40299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu ChartierALWAYS_INLINE inline static bool VerifyFieldAccess(Thread* self, 41299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> field, 42299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Object> obj) 43bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_) { 4476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (kIsSet && field->IsFinal()) { 450aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowIllegalAccessException( 46c0d8229898c44c0f604f08a5df1de83ff56c18fdAndreas Gampe StringPrintf("Cannot set %s field %s of class %s", 47c0d8229898c44c0f604f08a5df1de83ff56c18fdAndreas Gampe PrettyJavaAccessFlags(field->GetAccessFlags()).c_str(), 48709b070044354d9f47641f273edacaeeb0240ab7David Sehr ArtField::PrettyField(field->GetArtField()).c_str(), 49c0d8229898c44c0f604f08a5df1de83ff56c18fdAndreas Gampe field->GetDeclaringClass() == nullptr ? "null" : 50709b070044354d9f47641f273edacaeeb0240ab7David Sehr field->GetDeclaringClass()->PrettyClass().c_str()).c_str()); 5111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return false; 5211d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao } 53a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier ObjPtr<mirror::Class> calling_class; 54a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier if (!VerifyAccess(self, 55f8ac97f94aad9ce2d324c2c7c21dde3abf13315bMathieu Chartier obj, 56f8ac97f94aad9ce2d324c2c7c21dde3abf13315bMathieu Chartier field->GetDeclaringClass(), 57a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier field->GetAccessFlags(), 58a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier &calling_class, 59a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier 1)) { 600aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowIllegalAccessException( 61c0d8229898c44c0f604f08a5df1de83ff56c18fdAndreas Gampe StringPrintf("Class %s cannot access %s field %s of class %s", 62709b070044354d9f47641f273edacaeeb0240ab7David Sehr calling_class == nullptr ? "null" : calling_class->PrettyClass().c_str(), 63c0d8229898c44c0f604f08a5df1de83ff56c18fdAndreas Gampe PrettyJavaAccessFlags(field->GetAccessFlags()).c_str(), 64709b070044354d9f47641f273edacaeeb0240ab7David Sehr ArtField::PrettyField(field->GetArtField()).c_str(), 65c0d8229898c44c0f604f08a5df1de83ff56c18fdAndreas Gampe field->GetDeclaringClass() == nullptr ? "null" : 66709b070044354d9f47641f273edacaeeb0240ab7David Sehr field->GetDeclaringClass()->PrettyClass().c_str()).c_str()); 6711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return false; 6811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao } 6911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return true; 7011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao} 7111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao 7276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartiertemplate<bool kAllowReferences> 73299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu ChartierALWAYS_INLINE inline static bool GetFieldValue(ObjPtr<mirror::Object> o, 74299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> f, 75299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier Primitive::Type field_type, 76299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier JValue* value) 77bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_) { 7862f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK_EQ(value->GetJ(), INT64_C(0)); 79daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier MemberOffset offset(f->GetOffset()); 80daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier const bool is_volatile = f->IsVolatile(); 8162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers switch (field_type) { 8262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimBoolean: 83daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetZ(is_volatile ? o->GetFieldBooleanVolatile(offset) : o->GetFieldBoolean(offset)); 8433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes return true; 8562f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimByte: 86daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetB(is_volatile ? o->GetFieldByteVolatile(offset) : o->GetFieldByte(offset)); 8762f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return true; 8862f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimChar: 89daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetC(is_volatile ? o->GetFieldCharVolatile(offset) : o->GetFieldChar(offset)); 9062f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return true; 9162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimInt: 92daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier case Primitive::kPrimFloat: 93daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetI(is_volatile ? o->GetField32Volatile(offset) : o->GetField32(offset)); 9462f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return true; 9562f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimLong: 96daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier case Primitive::kPrimDouble: 97daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetJ(is_volatile ? o->GetField64Volatile(offset) : o->GetField64(offset)); 9862f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return true; 9962f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimShort: 100daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetS(is_volatile ? o->GetFieldShortVolatile(offset) : o->GetFieldShort(offset)); 10162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return true; 10262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimNot: 10376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (kAllowReferences) { 104daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier value->SetL(is_volatile ? o->GetFieldObjectVolatile<mirror::Object>(offset) : 105daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->GetFieldObject<mirror::Object>(offset)); 10662f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return true; 10762f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers } 10862f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers // Else break to report an error. 10962f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers break; 11062f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers case Primitive::kPrimVoid: 11162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers // Never okay. 11262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers break; 11333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 114daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier ThrowIllegalArgumentException( 115709b070044354d9f47641f273edacaeeb0240ab7David Sehr StringPrintf("Not a primitive field: %s", 116709b070044354d9f47641f273edacaeeb0240ab7David Sehr ArtField::PrettyField(f->GetArtField()).c_str()).c_str()); 11733203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes return false; 11833203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 11933203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 12076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu ChartierALWAYS_INLINE inline static bool CheckReceiver(const ScopedFastNativeObjectAccess& soa, 121299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier jobject j_rcvr, 122299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field>* f, 123299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Object>* class_or_rcvr) 124bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_) { 12562f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers soa.Self()->AssertThreadSuspensionIsAllowable(); 126299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Class> declaring_class = (*f)->GetDeclaringClass(); 12761c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if ((*f)->IsStatic()) { 128299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier if (UNLIKELY(!declaring_class->IsInitialized())) { 12976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier StackHandleScope<2> hs(soa.Self()); 130299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier HandleWrapperObjPtr<mirror::Field> h_f(hs.NewHandleWrapper(f)); 131299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier HandleWrapperObjPtr<mirror::Class> h_klass(hs.NewHandleWrapper(&declaring_class)); 132daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier ClassLinker* const class_linker = Runtime::Current()->GetClassLinker(); 13376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (UNLIKELY(!class_linker->EnsureInitialized(soa.Self(), h_klass, true, true))) { 13476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier DCHECK(soa.Self()->IsExceptionPending()); 13576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return false; 13676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 13762f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers } 138299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier *class_or_rcvr = declaring_class; 139ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes return true; 140ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes } 141299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier *class_or_rcvr = soa.Decode<mirror::Object>(j_rcvr); 142299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier if (!VerifyObjectIsClass(*class_or_rcvr, declaring_class)) { 14362f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 144ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes return false; 145ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes } 146ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes return true; 147ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes} 148ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes 149daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jobject Field_get(JNIEnv* env, jobject javaField, jobject javaObj) { 1501eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 151299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> f = soa.Decode<mirror::Field>(javaField); 152299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Object> o; 15361c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if (!CheckReceiver(soa, javaObj, &f, &o)) { 15462f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 15562f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return nullptr; 1566d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers } 157cb4581aa13d6f43f705535818a4d0893d551be3aJeff Hao // If field is not set to be accessible, verify it can be accessed by the caller. 158daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (!f->IsAccessible() && !VerifyFieldAccess<false>(soa.Self(), f, o)) { 15911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao DCHECK(soa.Self()->IsExceptionPending()); 16011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return nullptr; 16111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao } 16262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers // We now don't expect suspension unless an exception is thrown. 1636d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers // Get the field's value, boxing if necessary. 16461c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier Primitive::Type field_type = f->GetTypeAsPrimitiveType(); 1651d878f3e1c39162496d7c061f7f6710e414d182bElliott Hughes JValue value; 1666a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers if (!GetFieldValue<true>(o, f, field_type, &value)) { 16762f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 16862f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return nullptr; 1696d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers } 170299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier return soa.AddLocalReference<jobject>(BoxPrimitive(field_type, value)); 1716d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers} 1726d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers 17376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartiertemplate<Primitive::Type kPrimitiveType> 174299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu ChartierALWAYS_INLINE inline static JValue GetPrimitiveField(JNIEnv* env, 175299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier jobject javaField, 176daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier jobject javaObj) { 1771eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 178299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> f = soa.Decode<mirror::Field>(javaField); 179299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Object> o; 18061c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if (!CheckReceiver(soa, javaObj, &f, &o)) { 18162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 182ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes return JValue(); 18333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 18411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao 185cb4581aa13d6f43f705535818a4d0893d551be3aJeff Hao // If field is not set to be accessible, verify it can be accessed by the caller. 186daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (!f->IsAccessible() && !VerifyFieldAccess<false>(soa.Self(), f, o)) { 18711d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao DCHECK(soa.Self()->IsExceptionPending()); 18811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return JValue(); 18911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao } 19011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao 19162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers // We now don't expect suspension unless an exception is thrown. 19233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes // Read the value. 19361c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier Primitive::Type field_type = f->GetTypeAsPrimitiveType(); 1941d878f3e1c39162496d7c061f7f6710e414d182bElliott Hughes JValue field_value; 19576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier if (field_type == kPrimitiveType) { 19676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier // This if statement should get optimized out since we only pass in valid primitive types. 1976a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers if (UNLIKELY(!GetFieldValue<false>(o, f, kPrimitiveType, &field_value))) { 19876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier DCHECK(soa.Self()->IsExceptionPending()); 19976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return JValue(); 20076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 20176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier return field_value; 20276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier } 2036a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers if (!GetFieldValue<false>(o, f, field_type, &field_value)) { 20462f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 20533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes return JValue(); 20633203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 20733203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes // Widen it if necessary (and possible). 20833203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes JValue wide_value; 2090aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray if (!ConvertPrimitiveValue(false, field_type, kPrimitiveType, field_value, 21076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier &wide_value)) { 21162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 21233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes return JValue(); 21333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 21433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes return wide_value; 21533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 21633203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 217daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jboolean Field_getBoolean(JNIEnv* env, jobject javaField, jobject javaObj) { 218daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimBoolean>(env, javaField, javaObj).GetZ(); 21933203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 22033203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 221daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jbyte Field_getByte(JNIEnv* env, jobject javaField, jobject javaObj) { 222daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimByte>(env, javaField, javaObj).GetB(); 22333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 22433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 225daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jchar Field_getChar(JNIEnv* env, jobject javaField, jobject javaObj) { 226daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimChar>(env, javaField, javaObj).GetC(); 22733203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 22833203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 229daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jdouble Field_getDouble(JNIEnv* env, jobject javaField, jobject javaObj) { 230daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimDouble>(env, javaField, javaObj).GetD(); 23133203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 23233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 233daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jfloat Field_getFloat(JNIEnv* env, jobject javaField, jobject javaObj) { 234daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimFloat>(env, javaField, javaObj).GetF(); 23533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 23633203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 237daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jint Field_getInt(JNIEnv* env, jobject javaField, jobject javaObj) { 238daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimInt>(env, javaField, javaObj).GetI(); 23933203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 24033203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 241daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jlong Field_getLong(JNIEnv* env, jobject javaField, jobject javaObj) { 242daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimLong>(env, javaField, javaObj).GetJ(); 24333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 24433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 245daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic jshort Field_getShort(JNIEnv* env, jobject javaField, jobject javaObj) { 246daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier return GetPrimitiveField<Primitive::kPrimShort>(env, javaField, javaObj).GetS(); 24733203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 24833203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 249299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu ChartierALWAYS_INLINE inline static void SetFieldValue(ObjPtr<mirror::Object> o, 250299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> f, 251299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier Primitive::Type field_type, 252299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier bool allow_references, 253daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier const JValue& new_value) 254bdf7f1c3ab65ccb70f62db5ab31dba060632d458Andreas Gampe REQUIRES_SHARED(Locks::mutator_lock_) { 25562f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(f->GetDeclaringClass()->IsInitialized()); 256daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier MemberOffset offset(f->GetOffset()); 257daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier const bool is_volatile = f->IsVolatile(); 25862f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers switch (field_type) { 2596b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimBoolean: 260daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 261daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetFieldBooleanVolatile<false>(offset, new_value.GetZ()); 262daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 263daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetFieldBoolean<false>(offset, new_value.GetZ()); 264daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 265fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 2666b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimByte: 267daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 268daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetFieldBooleanVolatile<false>(offset, new_value.GetB()); 269daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 270daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetFieldBoolean<false>(offset, new_value.GetB()); 271daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 272fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 2736b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimChar: 274daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 2753152c82b0d33e5fb0a4aa964ea58451c72734444Fredrik Roubert o->SetFieldCharVolatile<false>(offset, new_value.GetC()); 276daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 2773152c82b0d33e5fb0a4aa964ea58451c72734444Fredrik Roubert o->SetFieldChar<false>(offset, new_value.GetC()); 278daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 279fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 2806b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimInt: 281daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier case Primitive::kPrimFloat: 282daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 283daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetField32Volatile<false>(offset, new_value.GetI()); 284daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 285daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetField32<false>(offset, new_value.GetI()); 286daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 287fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 2886b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimLong: 289daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier case Primitive::kPrimDouble: 290daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 291daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetField64Volatile<false>(offset, new_value.GetJ()); 292daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 293daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetField64<false>(offset, new_value.GetJ()); 294daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 295fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 2966b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimShort: 297daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 298ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier o->SetFieldShortVolatile<false>(offset, new_value.GetS()); 299daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 300ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier o->SetFieldShort<false>(offset, new_value.GetS()); 301daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 302fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 3036b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimNot: 30433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes if (allow_references) { 305daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (is_volatile) { 306daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetFieldObjectVolatile<false>(offset, new_value.GetL()); 307daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } else { 308daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier o->SetFieldObject<false>(offset, new_value.GetL()); 309daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier } 310fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes break; 31133203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 312fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes // Else fall through to report an error. 313fc787ecd91127b2c8458afd94e5148e2ae51a1f5Ian Rogers FALLTHROUGH_INTENDED; 3146b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom case Primitive::kPrimVoid: 31533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes // Never okay. 316709b070044354d9f47641f273edacaeeb0240ab7David Sehr ThrowIllegalArgumentException( 317709b070044354d9f47641f273edacaeeb0240ab7David Sehr StringPrintf("Not a primitive field: %s", 318709b070044354d9f47641f273edacaeeb0240ab7David Sehr ArtField::PrettyField(f->GetArtField()).c_str()).c_str()); 319fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes return; 320fe6207f7d3a38e021f81f7c3d25f085883e4cf43Elliott Hughes } 32133203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 32233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 323daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_set(JNIEnv* env, jobject javaField, jobject javaObj, jobject javaValue) { 3241eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 325299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> f = soa.Decode<mirror::Field>(javaField); 32662f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers // Check that the receiver is non-null and an instance of the field's declaring class. 327299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Object> o; 32861c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if (!CheckReceiver(soa, javaObj, &f, &o)) { 32962f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 33062f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers return; 33162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers } 332299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Class> field_type; 333daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier const char* field_type_desciptor = f->GetArtField()->GetTypeDescriptor(); 33461c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier Primitive::Type field_prim_type = Primitive::GetType(field_type_desciptor[0]); 33561c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if (field_prim_type == Primitive::kPrimNot) { 336daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier field_type = f->GetType(); 337daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier DCHECK(field_type != nullptr); 33861c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier } else { 33961c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier field_type = Runtime::Current()->GetClassLinker()->FindPrimitiveClass(field_type_desciptor[0]); 34062f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers } 34162f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers // We now don't expect suspension unless an exception is thrown. 3426d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers // Unbox the value, if necessary. 3430795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier ObjPtr<mirror::Object> boxed_value = soa.Decode<mirror::Object>(javaValue); 3446d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers JValue unboxed_value; 3450795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier if (!UnboxPrimitiveForField(boxed_value, 346f8ac97f94aad9ce2d324c2c7c21dde3abf13315bMathieu Chartier field_type, 347a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier f->GetArtField(), 348a59d9b228b1eda3bf71a81b6201ec64e26086c23Mathieu Chartier &unboxed_value)) { 34962f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 3506d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers return; 3516d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers } 352cb4581aa13d6f43f705535818a4d0893d551be3aJeff Hao // If field is not set to be accessible, verify it can be accessed by the caller. 353daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (!f->IsAccessible() && !VerifyFieldAccess<true>(soa.Self(), f, o)) { 35411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao DCHECK(soa.Self()->IsExceptionPending()); 35511d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return; 35611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao } 3576a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers SetFieldValue(o, f, field_prim_type, true, unboxed_value); 3586d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers} 3596d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers 36076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartiertemplate<Primitive::Type kPrimitiveType> 361299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartierstatic void SetPrimitiveField(JNIEnv* env, 362299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier jobject javaField, 363299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier jobject javaObj, 364daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier const JValue& new_value) { 3651eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 366299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Field> f = soa.Decode<mirror::Field>(javaField); 367299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Object> o; 36861c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if (!CheckReceiver(soa, javaObj, &f, &o)) { 369ed1c1e335acc9f61c7e25a78204f159ee3d13350Elliott Hughes return; 37033203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 37161c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier Primitive::Type field_type = f->GetTypeAsPrimitiveType(); 37262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers if (UNLIKELY(field_type == Primitive::kPrimNot)) { 373709b070044354d9f47641f273edacaeeb0240ab7David Sehr ThrowIllegalArgumentException( 374709b070044354d9f47641f273edacaeeb0240ab7David Sehr StringPrintf("Not a primitive field: %s", 375709b070044354d9f47641f273edacaeeb0240ab7David Sehr ArtField::PrettyField(f->GetArtField()).c_str()).c_str()); 376c129a6b44193ac3a872f852a69d336e0e7ed8640Jesse Wilson return; 377c129a6b44193ac3a872f852a69d336e0e7ed8640Jesse Wilson } 37833203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 37933203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes // Widen the value if necessary (and possible). 38033203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes JValue wide_value; 3810aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray if (!ConvertPrimitiveValue(false, kPrimitiveType, field_type, new_value, &wide_value)) { 38262f0512bf6d9bc6141358bf22e93afa70dc58b1aIan Rogers DCHECK(soa.Self()->IsExceptionPending()); 38333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes return; 38433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes } 38533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 386cb4581aa13d6f43f705535818a4d0893d551be3aJeff Hao // If field is not set to be accessible, verify it can be accessed by the caller. 387daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier if (!f->IsAccessible() && !VerifyFieldAccess<true>(soa.Self(), f, o)) { 38811d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao DCHECK(soa.Self()->IsExceptionPending()); 38911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao return; 39011d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao } 39111d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao 39233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes // Write the value. 3936a3c1fcb4ba42ad4d5d142c17a3712a6ddd3866fIan Rogers SetFieldValue(o, f, field_type, false, wide_value); 39433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 39533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 396daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setBoolean(JNIEnv* env, jobject javaField, jobject javaObj, jboolean z) { 397f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 398f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetZ(z); 399daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimBoolean>(env, javaField, javaObj, value); 4006d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers} 4016d4d9fcb4f01e287ee29e81cd1c941ee5d11d379Ian Rogers 402daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setByte(JNIEnv* env, jobject javaField, jobject javaObj, jbyte b) { 403f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 404f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetB(b); 405daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimByte>(env, javaField, javaObj, value); 40633203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 40733203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 408daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setChar(JNIEnv* env, jobject javaField, jobject javaObj, jchar c) { 409f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 410f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetC(c); 411daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimChar>(env, javaField, javaObj, value); 41233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 41333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 414daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setDouble(JNIEnv* env, jobject javaField, jobject javaObj, jdouble d) { 415f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 416f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetD(d); 417daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimDouble>(env, javaField, javaObj, value); 41833203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 41933203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 420daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setFloat(JNIEnv* env, jobject javaField, jobject javaObj, jfloat f) { 421f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 422f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetF(f); 423daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimFloat>(env, javaField, javaObj, value); 42433203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 42533203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 426daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setInt(JNIEnv* env, jobject javaField, jobject javaObj, jint i) { 427f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 428f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetI(i); 429daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimInt>(env, javaField, javaObj, value); 43033203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 43133203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 432daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setLong(JNIEnv* env, jobject javaField, jobject javaObj, jlong j) { 433f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 434f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetJ(j); 435daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimLong>(env, javaField, javaObj, value); 43633203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 43733203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 438daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartierstatic void Field_setShort(JNIEnv* env, jobject javaField, jobject javaObj, jshort s) { 439f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes JValue value; 440f24d3cedd395690f6904aaac80f84a100420f7a3Elliott Hughes value.SetS(s); 441daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier SetPrimitiveField<Primitive::kPrimShort>(env, javaField, javaObj, value); 44233203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes} 44333203b59aa5f27bac0433bdb640f1f1e911186ebElliott Hughes 44413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic jobject Field_getAnnotationNative(JNIEnv* env, jobject javaField, jclass annotationType) { 44513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao ScopedFastNativeObjectAccess soa(env); 44613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao StackHandleScope<1> hs(soa.Self()); 4470795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier ArtField* field = soa.Decode<mirror::Field>(javaField)->GetArtField(); 4483a0909248e04b22c3981cbf617bc2502ed5b6380Nicolas Geoffray if (field->GetDeclaringClass()->IsProxyClass()) { 44913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao return nullptr; 45013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao } 4510795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier Handle<mirror::Class> klass(hs.NewHandle(soa.Decode<mirror::Class>(annotationType))); 4529323e6e44060545d6c4f925139572868f65b7fe3David Sehr return soa.AddLocalReference<jobject>(annotations::GetAnnotationForField(field, klass)); 45313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao} 45413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao 4553d617ac3d87f7fa98793406818e54b057bd701a1Orion Hodsonstatic jlong Field_getArtField(JNIEnv* env, jobject javaField) { 4563d617ac3d87f7fa98793406818e54b057bd701a1Orion Hodson ScopedFastNativeObjectAccess soa(env); 4573d617ac3d87f7fa98793406818e54b057bd701a1Orion Hodson ArtField* field = soa.Decode<mirror::Field>(javaField)->GetArtField(); 4583d617ac3d87f7fa98793406818e54b057bd701a1Orion Hodson return reinterpret_cast<jlong>(field); 4593d617ac3d87f7fa98793406818e54b057bd701a1Orion Hodson} 4603d617ac3d87f7fa98793406818e54b057bd701a1Orion Hodson 4616b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamathstatic jobject Field_getNameInternal(JNIEnv* env, jobject javaField) { 4626b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath ScopedFastNativeObjectAccess soa(env); 4636b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath ArtField* field = soa.Decode<mirror::Field>(javaField)->GetArtField(); 4646b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath return soa.AddLocalReference<jobject>( 4656b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath field->GetStringName(soa.Self(), true /* resolve */)); 4666b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath} 4676b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath 46813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic jobjectArray Field_getDeclaredAnnotations(JNIEnv* env, jobject javaField) { 46913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao ScopedFastNativeObjectAccess soa(env); 4700795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier ArtField* field = soa.Decode<mirror::Field>(javaField)->GetArtField(); 4713a0909248e04b22c3981cbf617bc2502ed5b6380Nicolas Geoffray if (field->GetDeclaringClass()->IsProxyClass()) { 47213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao // Return an empty array instead of a null pointer. 473299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::Class> annotation_array_class = 474299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier soa.Decode<mirror::Class>(WellKnownClasses::java_lang_annotation_Annotation__array); 475299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> empty_array = 476299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(), annotation_array_class.Ptr(), 0); 47713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao return soa.AddLocalReference<jobjectArray>(empty_array); 47813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao } 4799323e6e44060545d6c4f925139572868f65b7fe3David Sehr return soa.AddLocalReference<jobjectArray>(annotations::GetAnnotationsForField(field)); 48013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao} 48113e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao 48213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Haostatic jobjectArray Field_getSignatureAnnotation(JNIEnv* env, jobject javaField) { 48313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao ScopedFastNativeObjectAccess soa(env); 4840795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier ArtField* field = soa.Decode<mirror::Field>(javaField)->GetArtField(); 4853a0909248e04b22c3981cbf617bc2502ed5b6380Nicolas Geoffray if (field->GetDeclaringClass()->IsProxyClass()) { 48613e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao return nullptr; 48713e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao } 4889323e6e44060545d6c4f925139572868f65b7fe3David Sehr return soa.AddLocalReference<jobjectArray>(annotations::GetSignatureAnnotationForField(field)); 48913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao} 49013e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao 491299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartierstatic jboolean Field_isAnnotationPresentNative(JNIEnv* env, 492299958fc681f591fee7ff9ae0d81bd3adfebdd2bMathieu Chartier jobject javaField, 49313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao jclass annotationType) { 49413e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao ScopedFastNativeObjectAccess soa(env); 49513e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao StackHandleScope<1> hs(soa.Self()); 4960795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier ArtField* field = soa.Decode<mirror::Field>(javaField)->GetArtField(); 4973a0909248e04b22c3981cbf617bc2502ed5b6380Nicolas Geoffray if (field->GetDeclaringClass()->IsProxyClass()) { 49813e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao return false; 49913e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao } 5000795f23920ee9aabf28e45c63cd592dcccf00216Mathieu Chartier Handle<mirror::Class> klass(hs.NewHandle(soa.Decode<mirror::Class>(annotationType))); 5019323e6e44060545d6c4f925139572868f65b7fe3David Sehr return annotations::IsFieldAnnotationPresent(field, klass); 50213e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao} 50313e748b28c5f2bd1e83674d2ca899ff61ae5c0a1Jeff Hao 504f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstromstatic JNINativeMethod gMethods[] = { 5053b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, get, "(Ljava/lang/Object;)Ljava/lang/Object;"), 5063b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getBoolean, "(Ljava/lang/Object;)Z"), 5073b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getByte, "(Ljava/lang/Object;)B"), 5083b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getChar, "(Ljava/lang/Object;)C"), 5093b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getAnnotationNative, 5103b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;"), 5113b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getArtField, "()J"), 5123b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getDeclaredAnnotations, "()[Ljava/lang/annotation/Annotation;"), 5133b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getSignatureAnnotation, "()[Ljava/lang/String;"), 5143b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getDouble, "(Ljava/lang/Object;)D"), 5153b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getFloat, "(Ljava/lang/Object;)F"), 5163b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getInt, "(Ljava/lang/Object;)I"), 5173b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getLong, "(Ljava/lang/Object;)J"), 5186b2dc3156a2140a5bfd9cbbf5d7dad332ab5f5bdNarayan Kamath FAST_NATIVE_METHOD(Field, getNameInternal, "()Ljava/lang/String;"), 5193b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, getShort, "(Ljava/lang/Object;)S"), 5203b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, isAnnotationPresentNative, "(Ljava/lang/Class;)Z"), 5213b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, set, "(Ljava/lang/Object;Ljava/lang/Object;)V"), 5223b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setBoolean, "(Ljava/lang/Object;Z)V"), 5233b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setByte, "(Ljava/lang/Object;B)V"), 5243b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setChar, "(Ljava/lang/Object;C)V"), 5253b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setDouble, "(Ljava/lang/Object;D)V"), 5263b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setFloat, "(Ljava/lang/Object;F)V"), 5273b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setInt, "(Ljava/lang/Object;I)V"), 5283b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setLong, "(Ljava/lang/Object;J)V"), 5293b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin FAST_NATIVE_METHOD(Field, setShort, "(Ljava/lang/Object;S)V"), 530f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom}; 531f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom 532f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstromvoid register_java_lang_reflect_Field(JNIEnv* env) { 533eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes REGISTER_NATIVE_METHODS("java/lang/reflect/Field"); 534f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom} 535f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom 536f867b6f706818c886087f61b89d1e8f5fc4653cfBrian Carlstrom} // namespace art 537