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