quick_field_entrypoints.cc revision d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2
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"
197655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "entrypoints/entrypoint_utils.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,
29ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                           const mirror::ArtMethod* referrer,
30ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                           Thread* self, 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,
46ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                           const mirror::ArtMethod* referrer,
47ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                           Thread* self, 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,
63ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                                   const mirror::ArtMethod* referrer,
64ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                                   Thread* self, mirror::ArtMethod** sp)
65b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
66ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
672dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       sizeof(mirror::Object*));
6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
7057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
7157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
72d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self,
73d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                    sizeof(mirror::Object*));
7457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
7857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
7957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
81ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                             const mirror::ArtMethod* referrer, Thread* self,
82ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                             mirror::ArtMethod** sp)
83b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
84ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
85ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
8657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get32(obj);
8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
8957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
90d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
91d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                         sizeof(int32_t));
9257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
9357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
9462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
9562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
9657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
9757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get32(obj);
9857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
9957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
10057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
10157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
10257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1032dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
104ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                             const mirror::ArtMethod* referrer, Thread* self,
105ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                             mirror::ArtMethod** sp)
106b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
107ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
108ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
10957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
11057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get64(obj);
11157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
11257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
113d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
114d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                         sizeof(int64_t));
11557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
11762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
11862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
11957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
12057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get64(obj);
12157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
12257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
12357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
12457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
127ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                                     const mirror::ArtMethod* referrer,
1282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                     Thread* self,
129ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                                     mirror::ArtMethod** sp)
130b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
131ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
132ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(mirror::Object*));
13357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
13457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->GetObj(obj);
13557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
13657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
137d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self,
138d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                      sizeof(mirror::Object*));
13957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
14162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
14262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
14357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
14457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->GetObj(obj);
14557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
14657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
14757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
14857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
14957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
15057b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
151ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                      const mirror::ArtMethod* referrer, Thread* self,
152ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                      mirror::ArtMethod** sp)
153b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
154ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
155ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
15657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set32(field->GetDeclaringClass(), new_value);
15857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
15957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
16057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
161d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
16257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set32(field->GetDeclaringClass(), new_value);
16457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
16557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
16657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
16757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
16857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
169ea46f950e7a51585db293cd7f047de190a482414Brian Carlstromextern "C" int artSet64StaticFromCode(uint32_t field_idx, const mirror::ArtMethod* referrer,
170ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                      uint64_t new_value, Thread* self, mirror::ArtMethod** sp)
171b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
172ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
173ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
17457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set64(field->GetDeclaringClass(), new_value);
17657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
17757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
17857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
179d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
18057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set64(field->GetDeclaringClass(), new_value);
18257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
18357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
18457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
18557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
18657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1872dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
188ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                       const mirror::ArtMethod* referrer, Thread* self,
189ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                       mirror::ArtMethod** sp)
190b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
191ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
192ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(mirror::Object*));
19357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
19457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
1952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      field->SetObj(field->GetDeclaringClass(), new_value);
19657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
19757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
19857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
19957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
200d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
201d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                     sizeof(mirror::Object*));
20257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
2032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->SetObj(field->GetDeclaringClass(), new_value);
20457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
20557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
20657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
20757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
20857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2092dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
210ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                        const mirror::ArtMethod* referrer, Thread* self,
211ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                        mirror::ArtMethod** sp)
212b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
213ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
214ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int32_t));
21557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
21657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->Set32(obj, new_value);
21757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
21857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
21957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
220d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
221d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                          sizeof(int32_t));
22257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
22357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
22462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
22562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
22657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
22757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->Set32(obj, new_value);
22857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
22957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
23057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
23157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
23257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
23357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
235ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                        Thread* self, mirror::ArtMethod** sp)
236b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
237ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtMethod* callee_save = Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly);
238ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtMethod* referrer =
239ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom      sp[callee_save->GetFrameSizeInBytes() / sizeof(mirror::ArtMethod*)];
240ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
241ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(int64_t));
24257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL  && obj != NULL)) {
24357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->Set64(obj, new_value);
24457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
24557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
24657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  *sp = callee_save;
24757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  self->SetTopOfStack(sp, 0);
248d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
249d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                          sizeof(int64_t));
25057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
25157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
25262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
25362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
25457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
25557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->Set64(obj, new_value);
25657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
25757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
25857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
25957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
26057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
26157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
2632dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                         mirror::Object* new_value,
264ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                         const mirror::ArtMethod* referrer, Thread* self,
265ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                         mirror::ArtMethod** sp)
266b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
267ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom  mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
268ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom                                          sizeof(mirror::Object*));
26957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
27057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->SetObj(obj, new_value);
27157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
27257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
274d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz  field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
275d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz                                                       sizeof(mirror::Object*));
27657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
27757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
27862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
27962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
28057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
28157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->SetObj(obj, new_value);
28257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
28357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
28457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
28557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
28757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
28857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}  // namespace art
289