blob: b89c015cd6591d870893a0acca5bfefc26f20a39 [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"
Mingyao Yang98d1cc82014-05-15 17:02:16 -070019#include "entrypoints/entrypoint_utils-inl.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
Fred Shih37f05ef2014-07-16 18:38:08 -070028extern "C" int8_t artGetByteStaticFromCode(uint32_t field_idx,
29 mirror::ArtMethod* referrer,
30 Thread* self, StackReference<mirror::ArtMethod>* sp)
31 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
32 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
33 sizeof(int8_t));
34 if (LIKELY(field != NULL)) {
35 return field->GetByte(field->GetDeclaringClass());
36 }
37 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
38 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
39 if (LIKELY(field != NULL)) {
40 return field->GetByte(field->GetDeclaringClass());
41 }
42 return 0; // Will throw exception by checking with Thread::Current
43}
44
45extern "C" uint8_t artGetBooleanStaticFromCode(uint32_t field_idx,
46 mirror::ArtMethod* referrer,
47 Thread* self, StackReference<mirror::ArtMethod>* sp)
48 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
49 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
50 sizeof(int8_t));
51 if (LIKELY(field != NULL)) {
52 return field->GetBoolean(field->GetDeclaringClass());
53 }
54 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
55 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
56 if (LIKELY(field != NULL)) {
57 return field->GetBoolean(field->GetDeclaringClass());
58 }
59 return 0; // Will throw exception by checking with Thread::Current
60}
61
62extern "C" int16_t artGetShortStaticFromCode(uint32_t field_idx,
63 mirror::ArtMethod* referrer,
64 Thread* self, StackReference<mirror::ArtMethod>* sp)
65 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
66 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
67 sizeof(int16_t));
68 if (LIKELY(field != NULL)) {
69 return field->GetShort(field->GetDeclaringClass());
70 }
71 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
72 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
73 if (LIKELY(field != NULL)) {
74 return field->GetShort(field->GetDeclaringClass());
75 }
76 return 0; // Will throw exception by checking with Thread::Current
77}
78
79extern "C" uint16_t artGetCharStaticFromCode(uint32_t field_idx,
80 mirror::ArtMethod* referrer,
81 Thread* self, StackReference<mirror::ArtMethod>* sp)
82 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
83 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
84 sizeof(int16_t));
85 if (LIKELY(field != NULL)) {
86 return field->GetChar(field->GetDeclaringClass());
87 }
88 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
89 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
90 if (LIKELY(field != NULL)) {
91 return field->GetChar(field->GetDeclaringClass());
92 }
93 return 0; // Will throw exception by checking with Thread::Current
94}
95
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080096extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -080097 mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -070098 Thread* self, StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -070099 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700100 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
101 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700102 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700103 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700104 }
105 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200106 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700107 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700108 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700109 }
110 return 0; // Will throw exception by checking with Thread::Current
111}
112
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800113extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800114 mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700115 Thread* self, StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700116 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700117 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
118 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700119 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700120 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700121 }
122 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200123 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700124 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700125 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700126 }
127 return 0; // Will throw exception by checking with Thread::Current
128}
129
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800130extern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800131 mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700132 Thread* self,
133 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700134 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700135 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800136 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700137 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700138 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700139 }
140 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200141 field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800142 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700143 if (LIKELY(field != NULL)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700144 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700145 }
146 return NULL; // Will throw exception by checking with Thread::Current
147}
148
Fred Shih37f05ef2014-07-16 18:38:08 -0700149extern "C" int8_t artGetByteInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
150 mirror::ArtMethod* referrer, Thread* self,
151 StackReference<mirror::ArtMethod>* sp)
152 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
153 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
154 sizeof(int8_t));
155 if (LIKELY(field != NULL && obj != NULL)) {
156 return field->GetByte(obj);
157 }
158 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
159 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
160 sizeof(int8_t));
161 if (LIKELY(field != NULL)) {
162 if (UNLIKELY(obj == NULL)) {
163 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
164 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
165 } else {
166 return field->GetByte(obj);
167 }
168 }
169 return 0; // Will throw exception by checking with Thread::Current
170}
171
172extern "C" uint8_t artGetBooleanInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
173 mirror::ArtMethod* referrer, Thread* self,
174 StackReference<mirror::ArtMethod>* sp)
175 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
176 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
177 sizeof(int8_t));
178 if (LIKELY(field != NULL && obj != NULL)) {
179 return field->GetBoolean(obj);
180 }
181 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
182 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
183 sizeof(int8_t));
184 if (LIKELY(field != NULL)) {
185 if (UNLIKELY(obj == NULL)) {
186 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
187 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
188 } else {
189 return field->GetBoolean(obj);
190 }
191 }
192 return 0; // Will throw exception by checking with Thread::Current
193}
194extern "C" int16_t artGetShortInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
195 mirror::ArtMethod* referrer, Thread* self,
196 StackReference<mirror::ArtMethod>* sp)
197 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
198 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
199 sizeof(int16_t));
200 if (LIKELY(field != NULL && obj != NULL)) {
201 return field->GetShort(obj);
202 }
203 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
204 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
205 sizeof(int16_t));
206 if (LIKELY(field != NULL)) {
207 if (UNLIKELY(obj == NULL)) {
208 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
209 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
210 } else {
211 return field->GetShort(obj);
212 }
213 }
214 return 0; // Will throw exception by checking with Thread::Current
215}
216
217extern "C" uint16_t artGetCharInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
218 mirror::ArtMethod* referrer, Thread* self,
219 StackReference<mirror::ArtMethod>* sp)
220 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
221 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
222 sizeof(int16_t));
223 if (LIKELY(field != NULL && obj != NULL)) {
224 return field->GetChar(obj);
225 }
226 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
227 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
228 sizeof(int16_t));
229 if (LIKELY(field != NULL)) {
230 if (UNLIKELY(obj == NULL)) {
231 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
232 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
233 } else {
234 return field->GetChar(obj);
235 }
236 }
237 return 0; // Will throw exception by checking with Thread::Current
238}
239
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800240extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800241 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700242 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700243 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700244 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
245 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700246 if (LIKELY(field != NULL && obj != NULL)) {
247 return field->Get32(obj);
248 }
249 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200250 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
251 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700252 if (LIKELY(field != NULL)) {
253 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800254 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
255 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700256 } else {
257 return field->Get32(obj);
258 }
259 }
260 return 0; // Will throw exception by checking with Thread::Current
261}
262
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800263extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800264 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700265 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700266 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700267 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
268 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700269 if (LIKELY(field != NULL && obj != NULL)) {
270 return field->Get64(obj);
271 }
272 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200273 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
274 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700275 if (LIKELY(field != NULL)) {
276 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800277 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
278 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700279 } else {
280 return field->Get64(obj);
281 }
282 }
283 return 0; // Will throw exception by checking with Thread::Current
284}
285
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800286extern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800287 mirror::ArtMethod* referrer,
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800288 Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700289 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700290 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700291 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800292 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700293 if (LIKELY(field != NULL && obj != NULL)) {
294 return field->GetObj(obj);
295 }
296 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200297 field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800298 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700299 if (LIKELY(field != NULL)) {
300 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800301 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
302 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700303 } else {
304 return field->GetObj(obj);
305 }
306 }
307 return NULL; // Will throw exception by checking with Thread::Current
308}
309
Fred Shih37f05ef2014-07-16 18:38:08 -0700310extern "C" int artSet8StaticFromCode(uint32_t field_idx, uint32_t new_value,
311 mirror::ArtMethod* referrer, Thread* self,
312 StackReference<mirror::ArtMethod>* sp)
313 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
314 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
315 sizeof(int8_t));
316 if (LIKELY(field != NULL)) {
317 Primitive::Type type = field->GetTypeAsPrimitiveType();
318 // Compiled code can't use transactional mode.
319 if (type == Primitive::kPrimBoolean) {
320 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
321 } else {
322 DCHECK_EQ(Primitive::kPrimByte, type);
323 field->SetByte<false>(field->GetDeclaringClass(), new_value);
324 }
325 return 0; // success
326 }
327 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
328 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int8_t));
329 if (LIKELY(field != NULL)) {
330 Primitive::Type type = field->GetTypeAsPrimitiveType();
331 // Compiled code can't use transactional mode.
332 if (type == Primitive::kPrimBoolean) {
333 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
334 } else {
335 DCHECK_EQ(Primitive::kPrimByte, type);
336 field->SetByte<false>(field->GetDeclaringClass(), new_value);
337 }
338 return 0; // success
339 }
340 return -1; // failure
341}
342
343extern "C" int artSet16StaticFromCode(uint32_t field_idx, uint16_t new_value,
344 mirror::ArtMethod* referrer, Thread* self,
345 StackReference<mirror::ArtMethod>* sp)
346 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
347 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
348 sizeof(int16_t));
349 if (LIKELY(field != NULL)) {
350 Primitive::Type type = field->GetTypeAsPrimitiveType();
351 // Compiled code can't use transactional mode.
352 if (type == Primitive::kPrimChar) {
353 field->SetChar<false>(field->GetDeclaringClass(), new_value);
354 } else {
355 DCHECK_EQ(Primitive::kPrimShort, type);
356 field->SetShort<false>(field->GetDeclaringClass(), new_value);
357 }
358 return 0; // success
359 }
360 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
361 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int16_t));
362 if (LIKELY(field != NULL)) {
363 Primitive::Type type = field->GetTypeAsPrimitiveType();
364 // Compiled code can't use transactional mode.
365 if (type == Primitive::kPrimChar) {
366 field->SetChar<false>(field->GetDeclaringClass(), new_value);
367 } else {
368 DCHECK_EQ(Primitive::kPrimShort, type);
369 field->SetShort<false>(field->GetDeclaringClass(), new_value);
370 }
371 return 0; // success
372 }
373 return -1; // failure
374}
375
Ian Rogers57b86d42012-03-27 16:05:41 -0700376extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800377 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700378 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700379 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700380 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
381 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700382 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100383 // Compiled code can't use transactional mode.
384 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700385 return 0; // success
386 }
387 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200388 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700389 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100390 // Compiled code can't use transactional mode.
391 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700392 return 0; // success
393 }
394 return -1; // failure
395}
396
Ian Rogersef7d42f2014-01-06 12:55:46 -0800397extern "C" int artSet64StaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700398 uint64_t new_value, Thread* self,
399 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700400 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700401 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
402 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700403 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100404 // Compiled code can't use transactional mode.
405 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700406 return 0; // success
407 }
408 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200409 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700410 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100411 // Compiled code can't use transactional mode.
412 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700413 return 0; // success
414 }
415 return -1; // failure
416}
417
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800418extern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800419 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700420 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700421 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700422 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800423 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700424 if (LIKELY(field != NULL)) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700425 if (LIKELY(!field->IsPrimitiveType())) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100426 // Compiled code can't use transactional mode.
427 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700428 return 0; // success
429 }
430 }
431 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200432 field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800433 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700434 if (LIKELY(field != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100435 // Compiled code can't use transactional mode.
436 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700437 return 0; // success
438 }
439 return -1; // failure
440}
441
Fred Shih37f05ef2014-07-16 18:38:08 -0700442extern "C" int artSet8InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint8_t new_value,
443 mirror::ArtMethod* referrer, Thread* self,
444 StackReference<mirror::ArtMethod>* sp)
445 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
446 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
447 sizeof(int8_t));
448 if (LIKELY(field != NULL && obj != NULL)) {
449 Primitive::Type type = field->GetTypeAsPrimitiveType();
450 // Compiled code can't use transactional mode.
451 if (type == Primitive::kPrimBoolean) {
452 field->SetBoolean<false>(obj, new_value);
453 } else {
454 DCHECK_EQ(Primitive::kPrimByte, type);
455 field->SetByte<false>(obj, new_value);
456 }
457 return 0; // success
458 }
459 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
460 {
461 StackHandleScope<1> hs(self);
462 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
463 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
464 sizeof(int8_t));
465 }
466 if (LIKELY(field != NULL)) {
467 if (UNLIKELY(obj == NULL)) {
468 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
469 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
470 } else {
471 Primitive::Type type = field->GetTypeAsPrimitiveType();
472 // Compiled code can't use transactional mode.
473 if (type == Primitive::kPrimBoolean) {
474 field->SetBoolean<false>(obj, new_value);
475 } else {
476 field->SetByte<false>(obj, new_value);
477 }
478 return 0; // success
479 }
480 }
481 return -1; // failure
482}
483
484extern "C" int artSet16InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint16_t new_value,
485 mirror::ArtMethod* referrer, Thread* self,
486 StackReference<mirror::ArtMethod>* sp)
487 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
488 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
489 sizeof(int16_t));
490 if (LIKELY(field != NULL && obj != NULL)) {
491 Primitive::Type type = field->GetTypeAsPrimitiveType();
492 // Compiled code can't use transactional mode.
493 if (type == Primitive::kPrimChar) {
494 field->SetChar<false>(obj, new_value);
495 } else {
496 DCHECK_EQ(Primitive::kPrimShort, type);
497 field->SetShort<false>(obj, new_value);
498 }
499 return 0; // success
500 }
501 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
502 {
503 StackHandleScope<1> hs(self);
504 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
505 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
506 sizeof(int16_t));
507 }
508 if (LIKELY(field != NULL)) {
509 if (UNLIKELY(obj == NULL)) {
510 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
511 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
512 } else {
513 Primitive::Type type = field->GetTypeAsPrimitiveType();
514 // Compiled code can't use transactional mode.
515 if (type == Primitive::kPrimChar) {
516 field->SetChar<false>(obj, new_value);
517 } else {
518 DCHECK_EQ(Primitive::kPrimShort, type);
519 field->SetShort<false>(obj, new_value);
520 }
521 return 0; // success
522 }
523 }
524 return -1; // failure
525}
526
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800527extern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800528 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700529 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700530 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700531 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
532 sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700533 if (LIKELY(field != NULL && obj != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100534 // Compiled code can't use transactional mode.
535 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700536 return 0; // success
537 }
538 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700539 {
540 StackHandleScope<1> hs(self);
541 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
542 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
543 sizeof(int32_t));
544 }
Ian Rogers57b86d42012-03-27 16:05:41 -0700545 if (LIKELY(field != NULL)) {
546 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800547 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
548 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700549 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100550 // Compiled code can't use transactional mode.
551 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700552 return 0; // success
553 }
554 }
555 return -1; // failure
556}
557
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800558extern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700559 Thread* self, StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700560 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Alexei Zavjalov41c507a2014-05-15 16:02:46 +0700561 constexpr size_t frame_size = GetCalleeSaveFrameSize(kRuntimeISA, Runtime::kRefsOnly);
Andreas Gampecf4035a2014-05-28 22:43:01 -0700562 mirror::ArtMethod* referrer =
563 reinterpret_cast<StackReference<mirror::ArtMethod>*>(
564 reinterpret_cast<uint8_t*>(sp) + frame_size)->AsMirrorPtr();
Brian Carlstromea46f952013-07-30 01:26:50 -0700565 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
566 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700567 if (LIKELY(field != NULL && obj != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100568 // Compiled code can't use transactional mode.
569 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700570 return 0; // success
571 }
Alexei Zavjalov41c507a2014-05-15 16:02:46 +0700572 sp->Assign(Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly));
Ian Rogers57b86d42012-03-27 16:05:41 -0700573 self->SetTopOfStack(sp, 0);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200574 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
575 sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700576 if (LIKELY(field != NULL)) {
577 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800578 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
579 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700580 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100581 // Compiled code can't use transactional mode.
582 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700583 return 0; // success
584 }
585 }
586 return -1; // failure
587}
588
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800589extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
590 mirror::Object* new_value,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800591 mirror::ArtMethod* referrer, Thread* self,
Andreas Gampecf4035a2014-05-28 22:43:01 -0700592 StackReference<mirror::ArtMethod>* sp)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700593 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Brian Carlstromea46f952013-07-30 01:26:50 -0700594 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800595 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700596 if (LIKELY(field != NULL && obj != NULL)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100597 // Compiled code can't use transactional mode.
598 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700599 return 0; // success
600 }
601 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200602 field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800603 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers57b86d42012-03-27 16:05:41 -0700604 if (LIKELY(field != NULL)) {
605 if (UNLIKELY(obj == NULL)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800606 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
607 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700608 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100609 // Compiled code can't use transactional mode.
610 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700611 return 0; // success
612 }
613 }
614 return -1; // failure
615}
616
617} // namespace art