quick_field_entrypoints.cc revision 7655f29fabc0a12765de828914a18314382e5a35
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"
202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method-inl.h"
212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h"
222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/field-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,
292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                           const mirror::AbstractMethod* referrer,
302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                           Thread* self, mirror::AbstractMethod** sp)
31b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int32_t));
3357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get32(field->GetDeclaringClass());
3557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
37233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int32_t), true);
3857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get32(field->GetDeclaringClass());
4057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
4157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
4257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
4357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                           const mirror::AbstractMethod* referrer,
462dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                           Thread* self, mirror::AbstractMethod** sp)
47b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int64_t));
4957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get64(field->GetDeclaringClass());
5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
5257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
53233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int64_t), true);
5457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get64(field->GetDeclaringClass());
5657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
5757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
5857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
5957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
612dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                   const mirror::AbstractMethod* referrer,
622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                   Thread* self, mirror::AbstractMethod** sp)
63b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
642dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
652dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       sizeof(mirror::Object*));
6657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
70233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, StaticObjectRead, sizeof(mirror::Object*), true);
7157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
7357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
7457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                             const mirror::AbstractMethod* referrer, Thread* self,
792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                             mirror::AbstractMethod** sp)
80b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int32_t));
8257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
8357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get32(obj);
8457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
8557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
86233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveRead, sizeof(int32_t), true);
8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
8962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
9062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
9157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
9257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get32(obj);
9357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
9457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
9557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
9657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
9757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                             const mirror::AbstractMethod* referrer, Thread* self,
1002dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                             mirror::AbstractMethod** sp)
101b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1022dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int64_t));
10357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
10457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get64(obj);
10557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
10657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
107233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveRead, sizeof(int64_t), true);
10857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
10957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
11062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
11162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
11257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
11357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get64(obj);
11457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
11557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
11757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
11857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1192dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                     const mirror::AbstractMethod* referrer,
1212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                     Thread* self,
1222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                                     mirror::AbstractMethod** sp)
123b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, InstanceObjectRead, sizeof(mirror::Object*));
12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
12657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->GetObj(obj);
12757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
12857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
129233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, InstanceObjectRead, sizeof(mirror::Object*), true);
13057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
13157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
13262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
13362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
13457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
13557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->GetObj(obj);
13657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
13757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
13857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
13957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
14157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
1422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                      const mirror::AbstractMethod* referrer, Thread* self,
1432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                      mirror::AbstractMethod** sp)
144b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1452dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int32_t));
14657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set32(field->GetDeclaringClass(), new_value);
14857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
14957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
15057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
151233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int32_t), true);
15257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set32(field->GetDeclaringClass(), new_value);
15457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
15557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
15657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
15757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
15857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet64StaticFromCode(uint32_t field_idx, const mirror::AbstractMethod* referrer,
1602dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                      uint64_t new_value, Thread* self, mirror::AbstractMethod** sp)
161b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1622dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int64_t));
16357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set64(field->GetDeclaringClass(), new_value);
16557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
16657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
16757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
168233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int64_t), true);
16957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set64(field->GetDeclaringClass(), new_value);
17157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
17257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
17357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
17457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
17557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1762dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
1772dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       const mirror::AbstractMethod* referrer, Thread* self,
1782dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       mirror::AbstractMethod** sp)
179b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
1812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       sizeof(mirror::Object*));
18257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
18357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
1842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      field->SetObj(field->GetDeclaringClass(), new_value);
18557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
18657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
18757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
18857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
189233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, StaticObjectWrite, sizeof(mirror::Object*), true);
19057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->SetObj(field->GetDeclaringClass(), new_value);
19257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
19357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
19457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
19557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
19657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
1972dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
1982dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                        const mirror::AbstractMethod* referrer, Thread* self,
1992dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                        mirror::AbstractMethod** sp)
200b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2012dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int32_t));
20257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
20357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->Set32(obj, new_value);
20457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
20557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
20657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
207233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveWrite, sizeof(int32_t), true);
20857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
20957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
21062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
21162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
21257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
21357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->Set32(obj, new_value);
21457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
21557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
21657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
21757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
21857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
21957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
2212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                        Thread* self, mirror::AbstractMethod** sp)
222b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::AbstractMethod* callee_save = Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly);
2242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::AbstractMethod* referrer =
2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      sp[callee_save->GetFrameSizeInBytes() / sizeof(mirror::AbstractMethod*)];
2262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
2272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       sizeof(int64_t));
22857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL  && obj != NULL)) {
22957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->Set64(obj, new_value);
23057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
23157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
23257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  *sp = callee_save;
23357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  self->SetTopOfStack(sp, 0);
234233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveWrite, sizeof(int64_t), true);
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 {
24057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->Set64(obj, new_value);
24157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
24257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
24357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
24457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
24557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
24657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2472dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                         mirror::Object* new_value,
2492dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                         const mirror::AbstractMethod* referrer, Thread* self,
2502dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                         mirror::AbstractMethod** sp)
251b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2522dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Field* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
2532dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers                                       sizeof(mirror::Object*));
25457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
25557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->SetObj(obj, new_value);
25657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
25757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
25857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
2592dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstanceObjectWrite,
260233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz                            sizeof(mirror::Object*), true);
26157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
26257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
26362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowLocation throw_location = self->GetCurrentLocationForThrow();
26462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
26557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
26657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->SetObj(obj, new_value);
26757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
26857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
26957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
27057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
27157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
27257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}  // namespace art
274