blob: 3178cdea03d4c0a8fc43e03569801418d6aea5f9 [file] [log] [blame]
Ian Rogers57b86d42012-03-27 16:05:41 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "callee_save_frame.h"
Ian Rogers4f6ad8a2013-03-18 15:27:28 -070018#include "dex_file-inl.h"
Ian Rogers7655f292013-07-29 11:07:13 -070019#include "entrypoints/entrypoint_utils.h"
Brian Carlstromea46f952013-07-30 01:26:50 -070020#include "mirror/art_field-inl.h"
21#include "mirror/art_method-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080022#include "mirror/class-inl.h"
Ian Rogers57b86d42012-03-27 16:05:41 -070023
24#include <stdint.h>
25
26namespace art {
27
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080028extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -080029 mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -070030 Thread* self, StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -070031 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -070032 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
33 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070034 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070035 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070036 }
37 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +020038 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070039 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070040 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070041 }
42 return 0; // Will throw exception by checking with Thread::Current
43}
44
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080045extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -080046 mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -070047 Thread* self, StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -070048 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -070049 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
50 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070051 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070052 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070053 }
54 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +020055 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070056 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070057 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070058 }
59 return 0; // Will throw exception by checking with Thread::Current
60}
61
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080062extern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -080063 mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -070064 Thread* self,
65 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -070066 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -070067 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -080068 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -070069 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070070 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070071 }
72 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +020073 field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -080074 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -070075 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -070076 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -070077 }
78 return NULL; // Will throw exception by checking with Thread::Current
79}
80
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080081extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -080082 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -070083 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -070084 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -070085 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
86 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070087 if (LIKELY(field != NULL && obj != NULL)) {
88 return field->Get32(obj);
89 }
90 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +020091 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
92 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070093 if (LIKELY(field != NULL)) {
94 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -080095 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
96 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -070097 } else {
98 return field->Get32(obj);
99 }
100 }
101 return 0; // Will throw exception by checking with Thread::Current
102}
103
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800104extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800105 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700106 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700107 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700108 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
109 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700110 if (LIKELY(field != NULL && obj != NULL)) {
111 return field->Get64(obj);
112 }
113 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200114 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
115 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700116 if (LIKELY(field != NULL)) {
117 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800118 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
119 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700120 } else {
121 return field->Get64(obj);
122 }
123 }
124 return 0; // Will throw exception by checking with Thread::Current
125}
126
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800127extern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800128 mirror::ArtMethod* referrer,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800129 Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700130 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700131 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700132 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800133 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700134 if (LIKELY(field != NULL && obj != NULL)) {
135 return field->GetObj(obj);
136 }
137 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200138 field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800139 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700140 if (LIKELY(field != NULL)) {
141 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800142 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
143 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700144 } else {
145 return field->GetObj(obj);
146 }
147 }
148 return NULL; // Will throw exception by checking with Thread::Current
149}
150
151extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800152 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700153 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700154 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700155 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
156 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700157 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100158 // Compiled code can't use transactional mode.
159 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700160 return 0; // success
161 }
162 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200163 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700164 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100165 // Compiled code can't use transactional mode.
166 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700167 return 0; // success
168 }
169 return -1; // failure
170}
171
Ian Rogersef7d42f2014-01-06 12:55:46 -0800172extern "C" int artSet64StaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700173 uint64_t new_value, Thread* self,
174 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700175 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700176 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
177 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700178 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100179 // Compiled code can't use transactional mode.
180 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700181 return 0; // success
182 }
183 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200184 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700185 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100186 // Compiled code can't use transactional mode.
187 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700188 return 0; // success
189 }
190 return -1; // failure
191}
192
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800193extern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800194 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700195 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700196 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700197 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800198 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700199 if (LIKELY(field != NULL)) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700200 if (LIKELY(!field->IsPrimitiveType())) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100201 // Compiled code can't use transactional mode.
202 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700203 return 0; // success
204 }
205 }
206 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200207 field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800208 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700209 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100210 // Compiled code can't use transactional mode.
211 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700212 return 0; // success
213 }
214 return -1; // failure
215}
216
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800217extern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800218 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700219 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700220 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700221 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
222 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700223 if (LIKELY(field != NULL && obj != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100224 // Compiled code can't use transactional mode.
225 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700226 return 0; // success
227 }
228 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700229 {
230 StackHandleScope<1> hs(self);
231 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
232 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
233 sizeof(int32_t));
234 }
Ian Rogers57b86d42012-03-27 16:05:41 -0700235 if (LIKELY(field != NULL)) {
236 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800237 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
238 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700239 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100240 // Compiled code can't use transactional mode.
241 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700242 return 0; // success
243 }
244 }
245 return -1; // failure
246}
247
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800248extern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700249 Thread* self, StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700250 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Vladimir Marko4c1c5102014-05-14 16:51:16 +0100251 Runtime* runtime = Runtime::Current();
252 mirror::ArtMethod* callee_save = runtime->GetCalleeSaveMethod(Runtime::kRefsOnly);
253 uint32_t frame_size =
254 runtime->GetCalleeSaveMethodFrameInfo(Runtime::kRefsOnly).FrameSizeInBytes();
Andreas Gampecf4035a2014-05-28 22:43:01 -0700255 mirror::ArtMethod* referrer =
256 reinterpret_cast<StackReference<mirror::ArtMethod>*>(
257 reinterpret_cast<uint8_t*>(sp) + frame_size)->AsMirrorPtr();
Brian Carlstromea46f952013-07-30 01:26:50 -0700258 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
259 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700260 if (LIKELY(field != NULL && obj != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100261 // Compiled code can't use transactional mode.
262 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700263 return 0; // success
264 }
Andreas Gampecf4035a2014-05-28 22:43:01 -0700265 sp->Assign(callee_save);
Ian Rogers57b86d42012-03-27 16:05:41 -0700266 self->SetTopOfStack(sp, 0);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200267 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
268 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700269 if (LIKELY(field != NULL)) {
270 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800271 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
272 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700273 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100274 // Compiled code can't use transactional mode.
275 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700276 return 0; // success
277 }
278 }
279 return -1; // failure
280}
281
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800282extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
283 mirror::Object* new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800284 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700285 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700286 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700287 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800288 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700289 if (LIKELY(field != NULL && obj != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100290 // Compiled code can't use transactional mode.
291 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700292 return 0; // success
293 }
294 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200295 field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800296 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700297 if (LIKELY(field != NULL)) {
298 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800299 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
300 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700301 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100302 // Compiled code can't use transactional mode.
303 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700304 return 0; // success
305 }
306 }
307 return -1; // failure
308}
309
310} // namespace art