blob: 22bf939f6b056edce30e25e87afbbdce61bd3a24 [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
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070028extern "C" int8_t artGetByteStaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
29 Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -070030 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070031 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -070032 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
33 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070034 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070035 return field->GetByte(field->GetDeclaringClass());
36 }
Fred Shih37f05ef2014-07-16 18:38:08 -070037 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070038 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070039 return field->GetByte(field->GetDeclaringClass());
40 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070041 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070042}
43
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070044extern "C" uint8_t artGetBooleanStaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
45 Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -070046 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070047 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -070048 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
49 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070050 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070051 return field->GetBoolean(field->GetDeclaringClass());
52 }
Fred Shih37f05ef2014-07-16 18:38:08 -070053 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070054 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070055 return field->GetBoolean(field->GetDeclaringClass());
56 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070057 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070058}
59
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070060extern "C" int16_t artGetShortStaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
61 Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -070062 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070063 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -070064 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
65 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070066 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070067 return field->GetShort(field->GetDeclaringClass());
68 }
Fred Shih37f05ef2014-07-16 18:38:08 -070069 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070070 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070071 return field->GetShort(field->GetDeclaringClass());
72 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070073 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070074}
75
76extern "C" uint16_t artGetCharStaticFromCode(uint32_t field_idx,
77 mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070078 Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -070079 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070080 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -070081 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
82 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070083 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070084 return field->GetChar(field->GetDeclaringClass());
85 }
Fred Shih37f05ef2014-07-16 18:38:08 -070086 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070087 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -070088 return field->GetChar(field->GetDeclaringClass());
89 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070090 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -070091}
92
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080093extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -080094 mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070095 Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -070096 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -070097 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -070098 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
99 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700100 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700101 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700102 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200103 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700104 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700105 return field->Get32(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700106 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700107 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700108}
109
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800110extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800111 mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700112 Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700113 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700114 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700115 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead,
116 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700117 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700118 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700119 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200120 field = FindFieldFromCode<StaticPrimitiveRead, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700121 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700122 return field->Get64(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700123 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700124 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700125}
126
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800127extern "C" mirror::Object* artGetObjStaticFromCode(uint32_t field_idx,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800128 mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700129 Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700130 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700131 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700132 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800133 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700134 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700135 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700136 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200137 field = FindFieldFromCode<StaticObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800138 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700139 if (LIKELY(field != nullptr)) {
Ian Rogers2fa6b2e2012-10-17 00:10:17 -0700140 return field->GetObj(field->GetDeclaringClass());
Ian Rogers57b86d42012-03-27 16:05:41 -0700141 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700142 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700143}
144
Fred Shih37f05ef2014-07-16 18:38:08 -0700145extern "C" int8_t artGetByteInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700146 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700147 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700148 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700149 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
150 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700151 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700152 return field->GetByte(obj);
153 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700154 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
155 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700156 if (LIKELY(field != nullptr)) {
157 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000158 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700159 } else {
160 return field->GetByte(obj);
161 }
162 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700163 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700164}
165
166extern "C" uint8_t artGetBooleanInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700167 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700168 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700169 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700170 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
171 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700172 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700173 return field->GetBoolean(obj);
174 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700175 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
176 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700177 if (LIKELY(field != nullptr)) {
178 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000179 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700180 } else {
181 return field->GetBoolean(obj);
182 }
183 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700184 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700185}
186extern "C" int16_t artGetShortInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700187 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700188 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700189 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700190 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
191 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700192 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700193 return field->GetShort(obj);
194 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700195 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
196 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700197 if (LIKELY(field != nullptr)) {
198 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000199 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700200 } else {
201 return field->GetShort(obj);
202 }
203 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700204 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700205}
206
207extern "C" uint16_t artGetCharInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700208 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700209 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700210 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700211 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
212 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700213 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700214 return field->GetChar(obj);
215 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700216 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
217 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700218 if (LIKELY(field != nullptr)) {
219 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000220 ThrowNullPointerExceptionForFieldAccess(field, true);
Fred Shih37f05ef2014-07-16 18:38:08 -0700221 } else {
222 return field->GetChar(obj);
223 }
224 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700225 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700226}
227
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800228extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700229 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700230 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700231 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700232 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
233 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700234 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700235 return field->Get32(obj);
236 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200237 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
238 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700239 if (LIKELY(field != nullptr)) {
240 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000241 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700242 } else {
243 return field->Get32(obj);
244 }
245 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700246 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700247}
248
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800249extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700250 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700251 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700252 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700253 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
254 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700255 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700256 return field->Get64(obj);
257 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200258 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
259 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700260 if (LIKELY(field != nullptr)) {
261 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000262 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700263 } else {
264 return field->Get64(obj);
265 }
266 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700267 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700268}
269
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800270extern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800271 mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700272 Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700273 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700274 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700275 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800276 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700277 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700278 return field->GetObj(obj);
279 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200280 field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800281 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700282 if (LIKELY(field != nullptr)) {
283 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000284 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700285 } else {
286 return field->GetObj(obj);
287 }
288 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700289 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700290}
291
Fred Shih37f05ef2014-07-16 18:38:08 -0700292extern "C" int artSet8StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700293 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700294 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700295 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700296 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
297 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700298 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700299 Primitive::Type type = field->GetTypeAsPrimitiveType();
300 // Compiled code can't use transactional mode.
301 if (type == Primitive::kPrimBoolean) {
302 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
303 } else {
304 DCHECK_EQ(Primitive::kPrimByte, type);
305 field->SetByte<false>(field->GetDeclaringClass(), new_value);
306 }
307 return 0; // success
308 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700309 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700310 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700311 Primitive::Type type = field->GetTypeAsPrimitiveType();
312 // Compiled code can't use transactional mode.
313 if (type == Primitive::kPrimBoolean) {
314 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
315 } else {
316 DCHECK_EQ(Primitive::kPrimByte, type);
317 field->SetByte<false>(field->GetDeclaringClass(), new_value);
318 }
319 return 0; // success
320 }
321 return -1; // failure
322}
323
324extern "C" int artSet16StaticFromCode(uint32_t field_idx, uint16_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700325 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700326 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700327 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700328 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
329 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700330 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700331 Primitive::Type type = field->GetTypeAsPrimitiveType();
332 // Compiled code can't use transactional mode.
333 if (type == Primitive::kPrimChar) {
334 field->SetChar<false>(field->GetDeclaringClass(), new_value);
335 } else {
336 DCHECK_EQ(Primitive::kPrimShort, type);
337 field->SetShort<false>(field->GetDeclaringClass(), new_value);
338 }
339 return 0; // success
340 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700341 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700342 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700343 Primitive::Type type = field->GetTypeAsPrimitiveType();
344 // Compiled code can't use transactional mode.
345 if (type == Primitive::kPrimChar) {
346 field->SetChar<false>(field->GetDeclaringClass(), new_value);
347 } else {
348 DCHECK_EQ(Primitive::kPrimShort, type);
349 field->SetShort<false>(field->GetDeclaringClass(), new_value);
350 }
351 return 0; // success
352 }
353 return -1; // failure
354}
355
Ian Rogers57b86d42012-03-27 16:05:41 -0700356extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700357 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700358 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700359 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700360 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
361 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700362 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100363 // Compiled code can't use transactional mode.
364 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700365 return 0; // success
366 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200367 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700368 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100369 // Compiled code can't use transactional mode.
370 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700371 return 0; // success
372 }
373 return -1; // failure
374}
375
Ian Rogersef7d42f2014-01-06 12:55:46 -0800376extern "C" int artSet64StaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700377 uint64_t new_value, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700378 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700379 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700380 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
381 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700382 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100383 // Compiled code can't use transactional mode.
384 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700385 return 0; // success
386 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200387 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700388 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100389 // Compiled code can't use transactional mode.
390 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700391 return 0; // success
392 }
393 return -1; // failure
394}
395
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800396extern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700397 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700398 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700399 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700400 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800401 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700402 if (LIKELY(field != nullptr)) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700403 if (LIKELY(!field->IsPrimitiveType())) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100404 // Compiled code can't use transactional mode.
405 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700406 return 0; // success
407 }
408 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200409 field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800410 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700411 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100412 // Compiled code can't use transactional mode.
413 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700414 return 0; // success
415 }
416 return -1; // failure
417}
418
Fred Shih37f05ef2014-07-16 18:38:08 -0700419extern "C" int artSet8InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint8_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700420 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700421 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700422 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700423 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
424 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700425 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700426 Primitive::Type type = field->GetTypeAsPrimitiveType();
427 // Compiled code can't use transactional mode.
428 if (type == Primitive::kPrimBoolean) {
429 field->SetBoolean<false>(obj, new_value);
430 } else {
431 DCHECK_EQ(Primitive::kPrimByte, type);
432 field->SetByte<false>(obj, new_value);
433 }
434 return 0; // success
435 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700436 {
437 StackHandleScope<1> hs(self);
438 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
439 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
440 sizeof(int8_t));
441 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700442 if (LIKELY(field != nullptr)) {
443 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000444 ThrowNullPointerExceptionForFieldAccess(field, false);
Fred Shih37f05ef2014-07-16 18:38:08 -0700445 } else {
446 Primitive::Type type = field->GetTypeAsPrimitiveType();
447 // Compiled code can't use transactional mode.
448 if (type == Primitive::kPrimBoolean) {
449 field->SetBoolean<false>(obj, new_value);
450 } else {
451 field->SetByte<false>(obj, new_value);
452 }
453 return 0; // success
454 }
455 }
456 return -1; // failure
457}
458
459extern "C" int artSet16InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint16_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700460 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700461 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700462 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700463 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
464 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700465 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700466 Primitive::Type type = field->GetTypeAsPrimitiveType();
467 // Compiled code can't use transactional mode.
468 if (type == Primitive::kPrimChar) {
469 field->SetChar<false>(obj, new_value);
470 } else {
471 DCHECK_EQ(Primitive::kPrimShort, type);
472 field->SetShort<false>(obj, new_value);
473 }
474 return 0; // success
475 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700476 {
477 StackHandleScope<1> hs(self);
478 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
479 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
480 sizeof(int16_t));
481 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700482 if (LIKELY(field != nullptr)) {
483 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000484 ThrowNullPointerExceptionForFieldAccess(field, false);
Fred Shih37f05ef2014-07-16 18:38:08 -0700485 } else {
486 Primitive::Type type = field->GetTypeAsPrimitiveType();
487 // Compiled code can't use transactional mode.
488 if (type == Primitive::kPrimChar) {
489 field->SetChar<false>(obj, new_value);
490 } else {
491 DCHECK_EQ(Primitive::kPrimShort, type);
492 field->SetShort<false>(obj, new_value);
493 }
494 return 0; // success
495 }
496 }
497 return -1; // failure
498}
499
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800500extern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700501 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700502 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700503 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700504 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
505 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700506 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100507 // Compiled code can't use transactional mode.
508 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700509 return 0; // success
510 }
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700511 {
512 StackHandleScope<1> hs(self);
513 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
514 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
515 sizeof(int32_t));
516 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700517 if (LIKELY(field != nullptr)) {
518 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000519 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700520 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100521 // Compiled code can't use transactional mode.
522 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700523 return 0; // success
524 }
525 }
526 return -1; // failure
527}
528
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800529extern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700530 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700531 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700532 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700533 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
534 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700535 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100536 // Compiled code can't use transactional mode.
537 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700538 return 0; // success
539 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200540 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
541 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700542 if (LIKELY(field != nullptr)) {
543 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000544 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700545 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100546 // Compiled code can't use transactional mode.
547 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700548 return 0; // success
549 }
550 }
551 return -1; // failure
552}
553
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800554extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
555 mirror::Object* new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700556 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700557 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700558 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700559 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800560 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700561 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100562 // Compiled code can't use transactional mode.
563 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700564 return 0; // success
565 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200566 field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800567 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700568 if (LIKELY(field != nullptr)) {
569 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000570 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700571 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100572 // Compiled code can't use transactional mode.
573 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700574 return 0; // success
575 }
576 }
577 return -1; // failure
578}
579
580} // namespace art