quick_field_entrypoints.cc revision 2fa6b2e2fc3d2a2fc27808ce518dc76b80ce369a
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"
1857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include "runtime_support.h"
1957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers#include <stdint.h>
2157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2257b86d47b66322693a070185fadfb43cb9c12eabIan Rogersnamespace art {
2357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
2466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartierextern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx, const AbstractMethod* referrer,
2566f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                           Thread* self, AbstractMethod** sp)
26b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
2708f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int32_t));
2857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get32(field->GetDeclaringClass());
3057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
3157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
3208f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int32_t));
3357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get32(field->GetDeclaringClass());
3557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
3657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
3757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
3857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
3966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartierextern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx, const AbstractMethod* referrer,
4066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                           Thread* self, AbstractMethod** sp)
41b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
4208f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int64_t));
4357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get64(field->GetDeclaringClass());
4557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
4657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
4708f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int64_t));
4857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->Get64(field->GetDeclaringClass());
5057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
5157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
5257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
5357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
5466f19258f9728d4ffe026074d8fd429d639802faMathieu Chartierextern "C" Object* artGetObjStaticFromCode(uint32_t field_idx, const AbstractMethod* referrer,
5566f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                           Thread* self, AbstractMethod** sp)
56b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
5708f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, StaticObjectRead, sizeof(Object*));
5857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
6057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
6157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
6208f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, StaticObjectRead, sizeof(Object*));
6357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return field->GetObj(field->GetDeclaringClass());
6557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
6657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
6757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
6857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, Object* obj,
7066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                             const AbstractMethod* referrer, Thread* self,
7166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                             AbstractMethod** sp)
72b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
7308f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int32_t));
7457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get32(obj);
7657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
7808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveRead, sizeof(int32_t));
7957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
8057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
8187e552db94588455c081efd87dbde0cd96d02942Ian Rogers      ThrowNullPointerExceptionForFieldAccess(field, true);
8257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
8357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get32(obj);
8457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
8557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
8657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
8957b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, Object* obj,
9066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                             const AbstractMethod* referrer, Thread* self,
9166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                             AbstractMethod** sp)
92b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
9308f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int64_t));
9457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
9557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->Get64(obj);
9657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
9757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
9808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveRead, sizeof(int64_t));
9957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
10057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
10187e552db94588455c081efd87dbde0cd96d02942Ian Rogers      ThrowNullPointerExceptionForFieldAccess(field, true);
10257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
10357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->Get64(obj);
10457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
10557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
10657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return 0;  // Will throw exception by checking with Thread::Current
10757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
10857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
10957b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" Object* artGetObjInstanceFromCode(uint32_t field_idx, Object* obj,
11066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                              const AbstractMethod* referrer, Thread* self,
11166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                              AbstractMethod** sp)
112b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
11308f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, InstanceObjectRead, sizeof(Object*));
11457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
11557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return field->GetObj(obj);
11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
11757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
11808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstanceObjectRead, sizeof(Object*));
11957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
12057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
12187e552db94588455c081efd87dbde0cd96d02942Ian Rogers      ThrowNullPointerExceptionForFieldAccess(field, true);
12257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
12357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return field->GetObj(obj);
12457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
12657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return NULL;  // Will throw exception by checking with Thread::Current
12757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
12857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
12957b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
13066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                      const AbstractMethod* referrer, Thread* self,
13166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                      AbstractMethod** sp)
132b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
13308f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int32_t));
13457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set32(field->GetDeclaringClass(), new_value);
13657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
13757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
13857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
13908f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int32_t));
14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set32(field->GetDeclaringClass(), new_value);
14257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
14357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
14457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
14557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
14657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
14766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartierextern "C" int artSet64StaticFromCode(uint32_t field_idx, const AbstractMethod* referrer,
14866f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                      uint64_t new_value, Thread* self, AbstractMethod** sp)
149b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
15008f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int64_t));
15157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set64(field->GetDeclaringClass(), new_value);
15357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
15457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
15557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
15608f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int64_t));
15757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->Set64(field->GetDeclaringClass(), new_value);
15957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
16057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
16157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
16257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
16357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
16457b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSetObjStaticFromCode(uint32_t field_idx, Object* new_value,
16566f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                       const AbstractMethod* referrer, Thread* self,
16666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                       AbstractMethod** sp)
167b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
16808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, StaticObjectWrite, sizeof(Object*));
16957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
17057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
1712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      field->SetObj(field->GetDeclaringClass(), new_value);
17257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
17357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
17457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
17557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
17608f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, StaticObjectWrite, sizeof(Object*));
17757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
1782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    field->SetObj(field->GetDeclaringClass(), new_value);
17957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
18057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
18157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
18257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
18357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
18457b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet32InstanceFromCode(uint32_t field_idx, Object* obj, uint32_t new_value,
18566f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                        const AbstractMethod* referrer, Thread* self,
18666f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                        AbstractMethod** sp)
187b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
18808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int32_t));
18957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
19057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->Set32(obj, new_value);
19157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
19257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
19357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
19408f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveWrite, sizeof(int32_t));
19557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
19657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
19787e552db94588455c081efd87dbde0cd96d02942Ian Rogers      ThrowNullPointerExceptionForFieldAccess(field, false);
19857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
19957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->Set32(obj, new_value);
20057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
20157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
20257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
20357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
20457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
20557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
20657b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet64InstanceFromCode(uint32_t field_idx, Object* obj, uint64_t new_value,
20766f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                        Thread* self, AbstractMethod** sp)
208b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
20966f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  AbstractMethod* callee_save = Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly);
21066f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier  AbstractMethod* referrer = sp[callee_save->GetFrameSizeInBytes() / sizeof(AbstractMethod*)];
21108f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int64_t));
21257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL  && obj != NULL)) {
21357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->Set64(obj, new_value);
21457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
21557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
21657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  *sp = callee_save;
21757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  self->SetTopOfStack(sp, 0);
21808f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveWrite, sizeof(int64_t));
21957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
22057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
22187e552db94588455c081efd87dbde0cd96d02942Ian Rogers      ThrowNullPointerExceptionForFieldAccess(field, false);
22257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
22357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->Set64(obj, new_value);
22457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
22557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
22657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
22757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
22857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
22957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
23057b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSetObjInstanceFromCode(uint32_t field_idx, Object* obj, Object* new_value,
23166f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                         const AbstractMethod* referrer, Thread* self,
23266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier                                         AbstractMethod** sp)
233b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
23408f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  Field* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite, sizeof(Object*));
23557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL && obj != NULL)) {
23657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    field->SetObj(obj, new_value);
23757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    return 0;  // success
23857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
23957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
24008f753d5859936f8d3524e9e4faa6cee353873eaIan Rogers  field = FindFieldFromCode(field_idx, referrer, self, InstanceObjectWrite, sizeof(Object*));
24157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  if (LIKELY(field != NULL)) {
24257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    if (UNLIKELY(obj == NULL)) {
24387e552db94588455c081efd87dbde0cd96d02942Ian Rogers      ThrowNullPointerExceptionForFieldAccess(field, false);
24457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    } else {
24557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      field->SetObj(obj, new_value);
24657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers      return 0;  // success
24757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers    }
24857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  }
24957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers  return -1;  // failure
25057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}
25157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers
25257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers}  // namespace art
253