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