blob: 7326fcfc695c850cc52b9f8d04477664033600c8 [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)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700158 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
159 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
160 } else {
161 return field->GetByte(obj);
162 }
163 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700164 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700165}
166
167extern "C" uint8_t artGetBooleanInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700168 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700169 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700170 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700171 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
172 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700173 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700174 return field->GetBoolean(obj);
175 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700176 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
177 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700178 if (LIKELY(field != nullptr)) {
179 if (UNLIKELY(obj == nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700180 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
181 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
182 } else {
183 return field->GetBoolean(obj);
184 }
185 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700186 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700187}
188extern "C" int16_t artGetShortInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700189 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700190 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700191 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700192 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
193 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700194 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700195 return field->GetShort(obj);
196 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700197 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
198 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700199 if (LIKELY(field != nullptr)) {
200 if (UNLIKELY(obj == nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700201 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
202 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
203 } else {
204 return field->GetShort(obj);
205 }
206 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700207 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700208}
209
210extern "C" uint16_t artGetCharInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700211 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700212 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700213 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700214 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
215 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700216 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700217 return field->GetChar(obj);
218 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700219 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
220 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700221 if (LIKELY(field != nullptr)) {
222 if (UNLIKELY(obj == nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700223 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
224 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
225 } else {
226 return field->GetChar(obj);
227 }
228 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700229 return 0; // Will throw exception by checking with Thread::Current.
Fred Shih37f05ef2014-07-16 18:38:08 -0700230}
231
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800232extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700233 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700234 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700235 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700236 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
237 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700238 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700239 return field->Get32(obj);
240 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200241 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
242 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700243 if (LIKELY(field != nullptr)) {
244 if (UNLIKELY(obj == nullptr)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800245 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
246 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700247 } else {
248 return field->Get32(obj);
249 }
250 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700251 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700252}
253
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800254extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700255 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700256 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700257 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700258 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead,
259 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700260 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700261 return field->Get64(obj);
262 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200263 field = FindFieldFromCode<InstancePrimitiveRead, true>(field_idx, referrer, self,
264 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700265 if (LIKELY(field != nullptr)) {
266 if (UNLIKELY(obj == nullptr)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800267 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
268 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700269 } else {
270 return field->Get64(obj);
271 }
272 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700273 return 0; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700274}
275
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800276extern "C" mirror::Object* artGetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800277 mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700278 Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700279 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700280 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700281 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800282 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700283 if (LIKELY(field != nullptr && obj != nullptr)) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700284 return field->GetObj(obj);
285 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200286 field = FindFieldFromCode<InstanceObjectRead, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800287 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700288 if (LIKELY(field != nullptr)) {
289 if (UNLIKELY(obj == nullptr)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800290 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
291 ThrowNullPointerExceptionForFieldAccess(throw_location, field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700292 } else {
293 return field->GetObj(obj);
294 }
295 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700296 return nullptr; // Will throw exception by checking with Thread::Current.
Ian Rogers57b86d42012-03-27 16:05:41 -0700297}
298
Fred Shih37f05ef2014-07-16 18:38:08 -0700299extern "C" int artSet8StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700300 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700301 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700302 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700303 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
304 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700305 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700306 Primitive::Type type = field->GetTypeAsPrimitiveType();
307 // Compiled code can't use transactional mode.
308 if (type == Primitive::kPrimBoolean) {
309 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
310 } else {
311 DCHECK_EQ(Primitive::kPrimByte, type);
312 field->SetByte<false>(field->GetDeclaringClass(), new_value);
313 }
314 return 0; // success
315 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700316 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700317 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700318 Primitive::Type type = field->GetTypeAsPrimitiveType();
319 // Compiled code can't use transactional mode.
320 if (type == Primitive::kPrimBoolean) {
321 field->SetBoolean<false>(field->GetDeclaringClass(), new_value);
322 } else {
323 DCHECK_EQ(Primitive::kPrimByte, type);
324 field->SetByte<false>(field->GetDeclaringClass(), new_value);
325 }
326 return 0; // success
327 }
328 return -1; // failure
329}
330
331extern "C" int artSet16StaticFromCode(uint32_t field_idx, uint16_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700332 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700333 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700334 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700335 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
336 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700337 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700338 Primitive::Type type = field->GetTypeAsPrimitiveType();
339 // Compiled code can't use transactional mode.
340 if (type == Primitive::kPrimChar) {
341 field->SetChar<false>(field->GetDeclaringClass(), new_value);
342 } else {
343 DCHECK_EQ(Primitive::kPrimShort, type);
344 field->SetShort<false>(field->GetDeclaringClass(), new_value);
345 }
346 return 0; // success
347 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700348 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700349 if (LIKELY(field != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700350 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 return -1; // failure
361}
362
Ian Rogers57b86d42012-03-27 16:05:41 -0700363extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700364 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700365 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700366 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700367 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
368 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700369 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100370 // Compiled code can't use transactional mode.
371 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700372 return 0; // success
373 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200374 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700375 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100376 // Compiled code can't use transactional mode.
377 field->Set32<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700378 return 0; // success
379 }
380 return -1; // failure
381}
382
Ian Rogersef7d42f2014-01-06 12:55:46 -0800383extern "C" int artSet64StaticFromCode(uint32_t field_idx, mirror::ArtMethod* referrer,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700384 uint64_t new_value, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700385 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700386 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700387 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite,
388 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700389 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100390 // Compiled code can't use transactional mode.
391 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700392 return 0; // success
393 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200394 field = FindFieldFromCode<StaticPrimitiveWrite, true>(field_idx, referrer, self, sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700395 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100396 // Compiled code can't use transactional mode.
397 field->Set64<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700398 return 0; // success
399 }
400 return -1; // failure
401}
402
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800403extern "C" int artSetObjStaticFromCode(uint32_t field_idx, mirror::Object* new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700404 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700405 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700406 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700407 mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800408 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700409 if (LIKELY(field != nullptr)) {
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700410 if (LIKELY(!field->IsPrimitiveType())) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100411 // Compiled code can't use transactional mode.
412 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700413 return 0; // success
414 }
415 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200416 field = FindFieldFromCode<StaticObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800417 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700418 if (LIKELY(field != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100419 // Compiled code can't use transactional mode.
420 field->SetObj<false>(field->GetDeclaringClass(), new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700421 return 0; // success
422 }
423 return -1; // failure
424}
425
Fred Shih37f05ef2014-07-16 18:38:08 -0700426extern "C" int artSet8InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint8_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700427 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700428 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700429 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700430 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
431 sizeof(int8_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700432 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700433 Primitive::Type type = field->GetTypeAsPrimitiveType();
434 // Compiled code can't use transactional mode.
435 if (type == Primitive::kPrimBoolean) {
436 field->SetBoolean<false>(obj, new_value);
437 } else {
438 DCHECK_EQ(Primitive::kPrimByte, type);
439 field->SetByte<false>(obj, new_value);
440 }
441 return 0; // success
442 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700443 {
444 StackHandleScope<1> hs(self);
445 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
446 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
447 sizeof(int8_t));
448 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700449 if (LIKELY(field != nullptr)) {
450 if (UNLIKELY(obj == nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700451 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
452 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
453 } else {
454 Primitive::Type type = field->GetTypeAsPrimitiveType();
455 // Compiled code can't use transactional mode.
456 if (type == Primitive::kPrimBoolean) {
457 field->SetBoolean<false>(obj, new_value);
458 } else {
459 field->SetByte<false>(obj, new_value);
460 }
461 return 0; // success
462 }
463 }
464 return -1; // failure
465}
466
467extern "C" int artSet16InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint16_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700468 mirror::ArtMethod* referrer, Thread* self)
Fred Shih37f05ef2014-07-16 18:38:08 -0700469 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700470 ScopedQuickEntrypointChecks sqec(self);
Fred Shih37f05ef2014-07-16 18:38:08 -0700471 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
472 sizeof(int16_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700473 if (LIKELY(field != nullptr && obj != nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700474 Primitive::Type type = field->GetTypeAsPrimitiveType();
475 // Compiled code can't use transactional mode.
476 if (type == Primitive::kPrimChar) {
477 field->SetChar<false>(obj, new_value);
478 } else {
479 DCHECK_EQ(Primitive::kPrimShort, type);
480 field->SetShort<false>(obj, new_value);
481 }
482 return 0; // success
483 }
Fred Shih37f05ef2014-07-16 18:38:08 -0700484 {
485 StackHandleScope<1> hs(self);
486 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
487 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
488 sizeof(int16_t));
489 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700490 if (LIKELY(field != nullptr)) {
491 if (UNLIKELY(obj == nullptr)) {
Fred Shih37f05ef2014-07-16 18:38:08 -0700492 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
493 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
494 } else {
495 Primitive::Type type = field->GetTypeAsPrimitiveType();
496 // Compiled code can't use transactional mode.
497 if (type == Primitive::kPrimChar) {
498 field->SetChar<false>(obj, new_value);
499 } else {
500 DCHECK_EQ(Primitive::kPrimShort, type);
501 field->SetShort<false>(obj, new_value);
502 }
503 return 0; // success
504 }
505 }
506 return -1; // failure
507}
508
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800509extern "C" int artSet32InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint32_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700510 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700511 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700512 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700513 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
514 sizeof(int32_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700515 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100516 // Compiled code can't use transactional mode.
517 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700518 return 0; // success
519 }
Mathieu Chartier61c5ebc2014-06-05 17:42:53 -0700520 {
521 StackHandleScope<1> hs(self);
522 HandleWrapper<mirror::Object> h_obj(hs.NewHandleWrapper(&obj));
523 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
524 sizeof(int32_t));
525 }
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700526 if (LIKELY(field != nullptr)) {
527 if (UNLIKELY(obj == nullptr)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800528 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
529 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700530 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100531 // Compiled code can't use transactional mode.
532 field->Set32<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700533 return 0; // success
534 }
535 }
536 return -1; // failure
537}
538
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800539extern "C" int artSet64InstanceFromCode(uint32_t field_idx, mirror::Object* obj, uint64_t new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700540 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700541 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700542 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700543 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite,
544 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700545 if (LIKELY(field != nullptr && obj != nullptr)) {
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 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200550 field = FindFieldFromCode<InstancePrimitiveWrite, true>(field_idx, referrer, self,
551 sizeof(int64_t));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700552 if (LIKELY(field != nullptr)) {
553 if (UNLIKELY(obj == nullptr)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800554 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
555 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700556 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100557 // Compiled code can't use transactional mode.
558 field->Set64<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700559 return 0; // success
560 }
561 }
562 return -1; // failure
563}
564
Ian Rogers2dd0e2c2013-01-24 12:42:14 -0800565extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, mirror::Object* obj,
566 mirror::Object* new_value,
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700567 mirror::ArtMethod* referrer, Thread* self)
Ian Rogersb726dcb2012-09-05 08:57:23 -0700568 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700569 ScopedQuickEntrypointChecks sqec(self);
Brian Carlstromea46f952013-07-30 01:26:50 -0700570 mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800571 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700572 if (LIKELY(field != nullptr && obj != nullptr)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100573 // Compiled code can't use transactional mode.
574 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700575 return 0; // success
576 }
Sebastien Hertzd4beb6b2013-10-02 17:07:20 +0200577 field = FindFieldFromCode<InstanceObjectWrite, true>(field_idx, referrer, self,
Ian Rogersef7d42f2014-01-06 12:55:46 -0800578 sizeof(mirror::HeapReference<mirror::Object>));
Ian Rogers1d8cdbc2014-09-22 22:51:09 -0700579 if (LIKELY(field != nullptr)) {
580 if (UNLIKELY(obj == nullptr)) {
Ian Rogers62d6c772013-02-27 08:32:07 -0800581 ThrowLocation throw_location = self->GetCurrentLocationForThrow();
582 ThrowNullPointerExceptionForFieldAccess(throw_location, field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700583 } else {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100584 // Compiled code can't use transactional mode.
585 field->SetObj<false>(obj, new_value);
Ian Rogers57b86d42012-03-27 16:05:41 -0700586 return 0; // success
587 }
588 }
589 return -1; // failure
590}
591
592} // namespace art