157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers/*
257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Copyright (C) 2012 The Android Open Source Project
357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * you may not use this file except in compliance with the License.
657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * You may obtain a copy of the License at
757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers *
1057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * Unless required by applicable law or agreed to in writing, software
1157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
1257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * See the License for the specific language governing permissions and
1457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers * limitations under the License.
1557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers */
1657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "callee_save_frame.h"
184f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h"
1998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang#include "entrypoints/entrypoint_utils-inl.h"
20ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "mirror/art_field-inl.h"
21ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom#include "mirror/art_method-inl.h"
222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h"
2357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include <stdint.h>
2557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2657b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art {
2757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx,
29ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                           mirror::ArtMethod* referrer,
30cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                           Thread* self, StackReference<mirror::ArtMethod>* sp)
31b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
32ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
33ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
3457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get32(field->GetDeclaringClass());
3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
3757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
38d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int32_t));
3957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get32(field->GetDeclaringClass());
4157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
4257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
4357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
4457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
46ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                           mirror::ArtMethod* referrer,
47cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                           Thread* self, StackReference<mirror::ArtMethod>* sp)
48b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
49ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
50ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get64(field->GetDeclaringClass());
5357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
5457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
55d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int64_t));
5657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get64(field->GetDeclaringClass());
5857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
5957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
6057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
6157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
63ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                   mirror::ArtMethod* referrer,
64cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                   Thread* self,
65cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                   StackReference<mirror::ArtMethod>* sp)
66b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
67ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
68ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                          sizeof(mirror::HeapReference<mirror::Object>));
6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
7157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
7257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
73d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self,
74ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                    sizeof(mirror::HeapReference<mirror::Object>));
7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
7857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
7957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
8057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                             mirror::ArtMethod* referrer, Thread* self,
83cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                             StackReference<mirror::ArtMethod>* sp)
84b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
85ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
86ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get32(obj);
8957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
9057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
91d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
92d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                         sizeof(int32_t));
9357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
9457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
9562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
9662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
9757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
9857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get32(obj);
9957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
10057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
10157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
10257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
10357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
105ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                             mirror::ArtMethod* referrer, Thread* self,
106cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                             StackReference<mirror::ArtMethod>* sp)
107b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
108ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
109ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
11057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
11157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get64(obj);
11257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
11357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
114d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
115d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                         sizeof(int64_t));
11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
11757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
11862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
11962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
12057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
12157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get64(obj);
12257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
12357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
12457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
12657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
128ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                     mirror::ArtMethod* referrer,
1292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                     Thread* self,
130cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                                     StackReference<mirror::ArtMethod>* sp)
131b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
132ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
133ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                          sizeof(mirror::HeapReference<mirror::Object>));
13457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
13557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->GetObj(obj);
13657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
13757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
138d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self,
139ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                      sizeof(mirror::HeapReference<mirror::Object>));
14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
14157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
14262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
14362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
14457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
14557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->GetObj(obj);
14657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
14757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
14857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
14957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
15057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
15157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
152ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                      mirror::ArtMethod* referrer, Thread* self,
153cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                      StackReference<mirror::ArtMethod>* sp)
154b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
155ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
156ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
15757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
158d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
159d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->Set32<false>(field->GetDeclaringClass(), new_value);
16057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
16157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
16257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
163d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
16457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
165d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
166d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->Set32<false>(field->GetDeclaringClass(), new_value);
16757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
16857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
16957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
17057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
17157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
172ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersextern "C" int artSet64StaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
173cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                      uint64_t new_value, Thread* self,
174cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                      StackReference<mirror::ArtMethod>* sp)
175b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
176ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
177ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
17857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
179d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
180d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->Set64<false>(field->GetDeclaringClass(), new_value);
18157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
18257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
18357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
184d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
18557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
186d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
187d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->Set64<false>(field->GetDeclaringClass(), new_value);
18857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
18957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
19057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
19157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
19257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
194ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                       mirror::ArtMethod* referrer, Thread* self,
195cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                       StackReference<mirror::ArtMethod>* sp)
196b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
197ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
198ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                          sizeof(mirror::HeapReference<mirror::Object>));
19957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
20061c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier    if (LIKELY(!field->IsPrimitiveType())) {
201d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      // Compiled code can't use transactional mode.
202d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      field->SetObj<false>(field->GetDeclaringClass(), new_value);
20357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
20457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
20557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
20657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
207d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
208ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                     sizeof(mirror::HeapReference<mirror::Object>));
20957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
210d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
211d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->SetObj<false>(field->GetDeclaringClass(), new_value);
21257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
21357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
21457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
21557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
21657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
218ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                        mirror::ArtMethod* referrer, Thread* self,
219cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                        StackReference<mirror::ArtMethod>* sp)
220b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
221ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
222ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
22357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
224d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
225d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->Set32<false>(obj, new_value);
22657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
22757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
22857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
22961c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier  {
23061c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier    StackHandleScope<1> hs(self);
23161c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier    HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
23261c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier    field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
23361c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier                                                            sizeof(int32_t));
23461c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier  }
23557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
23657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
23762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
23862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
23957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
240d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      // Compiled code can't use transactional mode.
241d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      field->Set32<false>(obj, new_value);
24257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
24357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
24457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
24557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
24657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
24757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
249cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                        Thread* self, StackReference<mirror::ArtMethod>* sp)
250b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
25141c507a9dae44b8329a857da3d9810fab2e9ddc6Alexei Zavjalov  constexpr size_t frame_size = GetCalleeSaveFrameSize(kRuntimeISA, Runtime::kRefsOnly);
252cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe  mirror::ArtMethod* referrer =
253cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe      reinterpret_cast<StackReference<mirror::ArtMethod>*>(
254cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe          reinterpret_cast<uint8_t*>(sp) + frame_size)->AsMirrorPtr();
255ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
256ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
25757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL  && obj != NULL)) {
258d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
259d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->Set64<false>(obj, new_value);
26057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
26157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
26241c507a9dae44b8329a857da3d9810fab2e9ddc6Alexei Zavjalov  sp->Assign(Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly));
26357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  self->SetTopOfStack(sp, 0);
264d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
265d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                          sizeof(int64_t));
26657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
26757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
26862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
26962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
27057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
271d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      // Compiled code can't use transactional mode.
272d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      field->Set64<false>(obj, new_value);
27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
27457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
27557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
27657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
27757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
27857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
2802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                         mirror::Object* new_value,
281ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                         mirror::ArtMethod* referrer, Thread* self,
282cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe                                         StackReference<mirror::ArtMethod>* sp)
283b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
284ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
285ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                          sizeof(mirror::HeapReference<mirror::Object>));
28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
287d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    // Compiled code can't use transactional mode.
288d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz    field->SetObj<false>(obj, new_value);
28957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
29057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
29157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
292d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
293ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers                                                       sizeof(mirror::HeapReference<mirror::Object>));
29457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
29557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
29662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
29762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
29857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
299d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      // Compiled code can't use transactional mode.
300d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz      field->SetObj<false>(obj, new_value);
30157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
30257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
30357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
30457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
30557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
30657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
30757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}  // namespace art
308