blob: fe8974bff0d04aeea1dbd4ee009035522066b21e [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"
18#include "runtime_support.h"
19
20#include <stdint.h>
21
22namespace art {
23
24extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx, const Method* referrer,
Ian Rogers00f7d0e2012-07-19 15:28:27 -070025 Thread* self, Method** sp)
26 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -070027 Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070028 if (LIKELY(field != NULL)) {
29 return field->Get32(NULL);
30 }
31 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -070032 field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070033 if (LIKELY(field != NULL)) {
34 return field->Get32(NULL);
35 }
36 return 0; // Will throw exception by checking with Thread::Current
37}
38
39extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx, const Method* referrer,
Ian Rogers00f7d0e2012-07-19 15:28:27 -070040 Thread* self, Method** sp)
41 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -070042 Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070043 if (LIKELY(field != NULL)) {
44 return field->Get64(NULL);
45 }
46 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -070047 field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveRead, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070048 if (LIKELY(field != NULL)) {
49 return field->Get64(NULL);
50 }
51 return 0; // Will throw exception by checking with Thread::Current
52}
53
54extern "C" Object* artGetObjStaticFromCode(uint32_t field_idx, const Method* referrer,
Ian Rogers00f7d0e2012-07-19 15:28:27 -070055 Thread* self, Method** sp)
56 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -070057 Field* field = FindFieldFast(field_idx, referrer, StaticObjectRead, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -070058 if (LIKELY(field != NULL)) {
59 return field->GetObj(NULL);
60 }
61 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -070062 field = FindFieldFromCode(field_idx, referrer, self, StaticObjectRead, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -070063 if (LIKELY(field != NULL)) {
64 return field->GetObj(NULL);
65 }
66 return NULL; // Will throw exception by checking with Thread::Current
67}
68
69extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, Object* obj,
Ian Rogers00f7d0e2012-07-19 15:28:27 -070070 const Method* referrer, Thread* self, Method** sp)
71 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -070072 Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070073 if (LIKELY(field != NULL && obj != NULL)) {
74 return field->Get32(obj);
75 }
76 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -070077 field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveRead, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070078 if (LIKELY(field != NULL)) {
79 if (UNLIKELY(obj == NULL)) {
Ian Rogers87e552d2012-08-31 15:54:48 -070080 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -070081 } else {
82 return field->Get32(obj);
83 }
84 }
85 return 0; // Will throw exception by checking with Thread::Current
86}
87
88extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, Object* obj,
Ian Rogers00f7d0e2012-07-19 15:28:27 -070089 const Method* referrer, Thread* self, Method** sp)
90 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -070091 Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070092 if (LIKELY(field != NULL && obj != NULL)) {
93 return field->Get64(obj);
94 }
95 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -070096 field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveRead, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -070097 if (LIKELY(field != NULL)) {
98 if (UNLIKELY(obj == NULL)) {
Ian Rogers87e552d2012-08-31 15:54:48 -070099 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700100 } else {
101 return field->Get64(obj);
102 }
103 }
104 return 0; // Will throw exception by checking with Thread::Current
105}
106
107extern "C" Object* artGetObjInstanceFromCode(uint32_t field_idx, Object* obj,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700108 const Method* referrer, Thread* self, Method** sp)
109 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -0700110 Field* field = FindFieldFast(field_idx, referrer, InstanceObjectRead, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -0700111 if (LIKELY(field != NULL && obj != NULL)) {
112 return field->GetObj(obj);
113 }
114 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -0700115 field = FindFieldFromCode(field_idx, referrer, self, InstanceObjectRead, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -0700116 if (LIKELY(field != NULL)) {
117 if (UNLIKELY(obj == NULL)) {
Ian Rogers87e552d2012-08-31 15:54:48 -0700118 ThrowNullPointerExceptionForFieldAccess(field, true);
Ian Rogers57b86d42012-03-27 16:05:41 -0700119 } else {
120 return field->GetObj(obj);
121 }
122 }
123 return NULL; // Will throw exception by checking with Thread::Current
124}
125
126extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700127 const Method* referrer, Thread* self, Method** sp)
128 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -0700129 Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700130 if (LIKELY(field != NULL)) {
131 field->Set32(NULL, new_value);
132 return 0; // success
133 }
134 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -0700135 field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700136 if (LIKELY(field != NULL)) {
137 field->Set32(NULL, new_value);
138 return 0; // success
139 }
140 return -1; // failure
141}
142
143extern "C" int artSet64StaticFromCode(uint32_t field_idx, const Method* referrer,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700144 uint64_t new_value, Thread* self, Method** sp)
145 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -0700146 Field* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700147 if (LIKELY(field != NULL)) {
148 field->Set64(NULL, new_value);
149 return 0; // success
150 }
151 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -0700152 field = FindFieldFromCode(field_idx, referrer, self, StaticPrimitiveWrite, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700153 if (LIKELY(field != NULL)) {
154 field->Set64(NULL, new_value);
155 return 0; // success
156 }
157 return -1; // failure
158}
159
160extern "C" int artSetObjStaticFromCode(uint32_t field_idx, Object* new_value,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700161 const Method* referrer, Thread* self, Method** sp)
162 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -0700163 Field* field = FindFieldFast(field_idx, referrer, StaticObjectWrite, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -0700164 if (LIKELY(field != NULL)) {
165 if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
166 field->SetObj(NULL, new_value);
167 return 0; // success
168 }
169 }
170 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -0700171 field = FindFieldFromCode(field_idx, referrer, self, StaticObjectWrite, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -0700172 if (LIKELY(field != NULL)) {
173 field->SetObj(NULL, new_value);
174 return 0; // success
175 }
176 return -1; // failure
177}
178
179extern "C" int artSet32InstanceFromCode(uint32_t field_idx, Object* obj, uint32_t new_value,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700180 const Method* referrer, Thread* self, Method** sp)
181 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -0700182 Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700183 if (LIKELY(field != NULL && obj != NULL)) {
184 field->Set32(obj, new_value);
185 return 0; // success
186 }
187 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -0700188 field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveWrite, sizeof(int32_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700189 if (LIKELY(field != NULL)) {
190 if (UNLIKELY(obj == NULL)) {
Ian Rogers87e552d2012-08-31 15:54:48 -0700191 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700192 } else {
193 field->Set32(obj, new_value);
194 return 0; // success
195 }
196 }
197 return -1; // failure
198}
199
200extern "C" int artSet64InstanceFromCode(uint32_t field_idx, Object* obj, uint64_t new_value,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700201 Thread* self, Method** sp)
202 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers57b86d42012-03-27 16:05:41 -0700203 Method* callee_save = Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly);
204 Method* referrer = sp[callee_save->GetFrameSizeInBytes() / sizeof(Method*)];
Ian Rogers08f753d2012-08-24 14:35:25 -0700205 Field* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700206 if (LIKELY(field != NULL && obj != NULL)) {
207 field->Set64(obj, new_value);
208 return 0; // success
209 }
210 *sp = callee_save;
211 self->SetTopOfStack(sp, 0);
Ian Rogers08f753d2012-08-24 14:35:25 -0700212 field = FindFieldFromCode(field_idx, referrer, self, InstancePrimitiveWrite, sizeof(int64_t));
Ian Rogers57b86d42012-03-27 16:05:41 -0700213 if (LIKELY(field != NULL)) {
214 if (UNLIKELY(obj == NULL)) {
Ian Rogers87e552d2012-08-31 15:54:48 -0700215 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700216 } else {
217 field->Set64(obj, new_value);
218 return 0; // success
219 }
220 }
221 return -1; // failure
222}
223
224extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, Object* obj, Object* new_value,
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700225 const Method* referrer, Thread* self, Method** sp)
226 SHARED_LOCKS_REQUIRED(GlobalSynchronization::mutator_lock_) {
Ian Rogers08f753d2012-08-24 14:35:25 -0700227 Field* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -0700228 if (LIKELY(field != NULL && obj != NULL)) {
229 field->SetObj(obj, new_value);
230 return 0; // success
231 }
232 FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
Ian Rogers08f753d2012-08-24 14:35:25 -0700233 field = FindFieldFromCode(field_idx, referrer, self, InstanceObjectWrite, sizeof(Object*));
Ian Rogers57b86d42012-03-27 16:05:41 -0700234 if (LIKELY(field != NULL)) {
235 if (UNLIKELY(obj == NULL)) {
Ian Rogers87e552d2012-08-31 15:54:48 -0700236 ThrowNullPointerExceptionForFieldAccess(field, false);
Ian Rogers57b86d42012-03-27 16:05:41 -0700237 } else {
238 field->SetObj(obj, new_value);
239 return 0; // success
240 }
241 }
242 return -1; // failure
243}
244
245} // namespace art