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