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" 1998d1cc8033251c93786e2fa8c59a2e555a9493beMingyao Yang#include "entrypoints/entrypoint_utils-inl.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, 29ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, 30cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe Thread* self, StackReference<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, 46ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, 47cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe Thread* self, StackReference<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, 63ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, 64cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe Thread* self, 65cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 66b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 67ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead, 68ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 6957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return field->GetObj(field->GetDeclaringClass()); 7157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 7257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 73d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self, 74ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 7557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return field->GetObj(field->GetDeclaringClass()); 7757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 7857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return NULL; // Will throw exception by checking with Thread::Current 7957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 8057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 812dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, 82ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, Thread* self, 83cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 84b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 85ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, 86ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom sizeof(int32_t)); 8757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL && obj != NULL)) { 8857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return field->Get32(obj); 8957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 9057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 91d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self, 92d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz sizeof(int32_t)); 9357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 9457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (UNLIKELY(obj == NULL)) { 9562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 9662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionForFieldAccess(throw_location, field, true); 9757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } else { 9857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return field->Get32(obj); 9957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 10057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 10157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // Will throw exception by checking with Thread::Current 10257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 10357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 1042dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, 105ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, Thread* self, 106cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 107b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 108ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, 109ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom sizeof(int64_t)); 11057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL && obj != NULL)) { 11157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return field->Get64(obj); 11257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 11357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 114d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self, 115d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz sizeof(int64_t)); 11657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 11757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (UNLIKELY(obj == NULL)) { 11862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 11962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionForFieldAccess(throw_location, field, true); 12057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } else { 12157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return field->Get64(obj); 12257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 12357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 12457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // Will throw exception by checking with Thread::Current 12557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 12657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 1272dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj, 128ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, 1292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers Thread* self, 130cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 131b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 132ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead, 133ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 13457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL && obj != NULL)) { 13557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return field->GetObj(obj); 13657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 13757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 138d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self, 139ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 14057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 14157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (UNLIKELY(obj == NULL)) { 14262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 14362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionForFieldAccess(throw_location, field, true); 14457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } else { 14557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return field->GetObj(obj); 14657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 14757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 14857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return NULL; // Will throw exception by checking with Thread::Current 14957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 15057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 15157b86d47b66322693a070185fadfb43cb9c12eabIan Rogersextern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value, 152ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, Thread* self, 153cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 154b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 155ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, 156ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom sizeof(int32_t)); 15757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 158d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 159d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set32<false>(field->GetDeclaringClass(), new_value); 16057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 16157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 16257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 163d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t)); 16457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 165d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 166d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set32<false>(field->GetDeclaringClass(), new_value); 16757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 16857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 16957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return -1; // failure 17057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 17157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 172ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersextern "C" int artSet64StaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer, 173cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe uint64_t new_value, Thread* self, 174cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 175b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 176ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, 177ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom sizeof(int64_t)); 17857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 179d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 180d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set64<false>(field->GetDeclaringClass(), new_value); 18157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 18257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 18357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 184d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t)); 18557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 186d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 187d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set64<false>(field->GetDeclaringClass(), new_value); 18857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 18957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 19057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return -1; // failure 19157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 19257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 1932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value, 194ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, Thread* self, 195cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 196b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 197ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite, 198ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 19957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 20061c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier if (LIKELY(!field->IsPrimitiveType())) { 201d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 202d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->SetObj<false>(field->GetDeclaringClass(), new_value); 20357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 20457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 20557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 20657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 207d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self, 208ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 20957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 210d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 211d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->SetObj<false>(field->GetDeclaringClass(), new_value); 21257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 21357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 21457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return -1; // failure 21557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 21657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2172dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value, 218ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, Thread* self, 219cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 220b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 221ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, 222ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom sizeof(int32_t)); 22357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL && obj != NULL)) { 224d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 225d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set32<false>(obj, new_value); 22657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 22757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 22857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 22961c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier { 23061c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier StackHandleScope<1> hs(self); 23161c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj)); 23261c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self, 23361c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier sizeof(int32_t)); 23461c5ebc6aee2cac1c363de6fbdac25ada1697fdbMathieu Chartier } 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 { 240d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 241d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set32<false>(obj, new_value); 24257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 24357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 24457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 24557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return -1; // failure 24657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 24757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2482dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value, 249cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe Thread* self, StackReference<mirror::ArtMethod>* sp) 250b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 25141c507a9dae44b8329a857da3d9810fab2e9ddc6Alexei Zavjalov constexpr size_t frame_size = GetCalleeSaveFrameSize(kRuntimeISA, Runtime::kRefsOnly); 252cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe mirror::ArtMethod* referrer = 253cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe reinterpret_cast<StackReference<mirror::ArtMethod>*>( 254cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe reinterpret_cast<uint8_t*>(sp) + frame_size)->AsMirrorPtr(); 255ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, 256ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom sizeof(int64_t)); 25757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL && obj != NULL)) { 258d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 259d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set64<false>(obj, new_value); 26057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 26157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 26241c507a9dae44b8329a857da3d9810fab2e9ddc6Alexei Zavjalov sp->Assign(Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly)); 26357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers self->SetTopOfStack(sp, 0); 264d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self, 265d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz sizeof(int64_t)); 26657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 26757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (UNLIKELY(obj == NULL)) { 26862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 26962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionForFieldAccess(throw_location, field, false); 27057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } else { 271d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 272d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->Set64<false>(obj, new_value); 27357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 27457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 27557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 27657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return -1; // failure 27757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 27857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 2792dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersextern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj, 2802dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* new_value, 281ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers mirror::ArtMethod* referrer, Thread* self, 282cf4035a4c41ccfcc3e89a0cee25f5218a11b0705Andreas Gampe StackReference<mirror::ArtMethod>* sp) 283b726dcb581bf72da46527378ccb6889020f0e6e9Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 284ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite, 285ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 28657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL && obj != NULL)) { 287d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 288d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->SetObj<false>(obj, new_value); 28957b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 29057b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 29157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); 292d4beb6bc2b42b176c6d04fdd91d6c758e542c7c2Sebastien Hertz field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self, 293ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers sizeof(mirror::HeapReference<mirror::Object>)); 29457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (LIKELY(field != NULL)) { 29557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers if (UNLIKELY(obj == NULL)) { 29662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowLocation throw_location = self->GetCurrentLocationForThrow(); 29762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionForFieldAccess(throw_location, field, false); 29857b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } else { 299d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz // Compiled code can't use transactional mode. 300d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz field->SetObj<false>(obj, new_value); 30157b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return 0; // success 30257b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 30357b86d47b66322693a070185fadfb43cb9c12eabIan Rogers } 30457b86d47b66322693a070185fadfb43cb9c12eabIan Rogers return -1; // failure 30557b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} 30657b86d47b66322693a070185fadfb43cb9c12eabIan Rogers 30757b86d47b66322693a070185fadfb43cb9c12eabIan Rogers} // namespace art 308