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