• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 "entrypoints/entrypoint_utils.h"
18 #include "mirror/art_field-inl.h"
19 #include "mirror/art_method-inl.h"
20 #include "mirror/object-inl.h"
21 
22 namespace art {
23 
art_portable_set32_static_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,int32_t new_value)24 extern "C" int32_t art_portable_set32_static_from_code(uint32_t field_idx,
25                                                        mirror::ArtMethod* referrer,
26                                                        int32_t new_value)
27     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
28   mirror::ArtField* field = FindFieldFast(field_idx,
29                                referrer,
30                                StaticPrimitiveWrite,
31                                sizeof(uint32_t));
32   if (LIKELY(field != NULL)) {
33     field->Set32(field->GetDeclaringClass(), new_value);
34     return 0;
35   }
36   field = FindFieldFromCode(field_idx,
37                             referrer,
38                             Thread::Current(),
39                             StaticPrimitiveWrite,
40                             sizeof(uint32_t),
41                             true);
42   if (LIKELY(field != NULL)) {
43     field->Set32(field->GetDeclaringClass(), new_value);
44     return 0;
45   }
46   return -1;
47 }
48 
art_portable_set64_static_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,int64_t new_value)49 extern "C" int32_t art_portable_set64_static_from_code(uint32_t field_idx,
50                                                        mirror::ArtMethod* referrer,
51                                                        int64_t new_value)
52     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
53   mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveWrite, sizeof(uint64_t));
54   if (LIKELY(field != NULL)) {
55     field->Set64(field->GetDeclaringClass(), new_value);
56     return 0;
57   }
58   field = FindFieldFromCode(field_idx,
59                             referrer,
60                             Thread::Current(),
61                             StaticPrimitiveWrite,
62                             sizeof(uint64_t),
63                             true);
64   if (LIKELY(field != NULL)) {
65     field->Set64(field->GetDeclaringClass(), new_value);
66     return 0;
67   }
68   return -1;
69 }
70 
art_portable_set_obj_static_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * new_value)71 extern "C" int32_t art_portable_set_obj_static_from_code(uint32_t field_idx,
72                                                          mirror::ArtMethod* referrer,
73                                                          mirror::Object* new_value)
74     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
75   mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectWrite,
76                                           sizeof(mirror::Object*));
77   if (LIKELY(field != NULL)) {
78     field->SetObj(field->GetDeclaringClass(), new_value);
79     return 0;
80   }
81   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
82                             StaticObjectWrite, sizeof(mirror::Object*), true);
83   if (LIKELY(field != NULL)) {
84     field->SetObj(field->GetDeclaringClass(), new_value);
85     return 0;
86   }
87   return -1;
88 }
89 
art_portable_get32_static_from_code(uint32_t field_idx,mirror::ArtMethod * referrer)90 extern "C" int32_t art_portable_get32_static_from_code(uint32_t field_idx,
91                                                        mirror::ArtMethod* referrer)
92     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
93   mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(uint32_t));
94   if (LIKELY(field != NULL)) {
95     return field->Get32(field->GetDeclaringClass());
96   }
97   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
98                             StaticPrimitiveRead, sizeof(uint32_t), true);
99   if (LIKELY(field != NULL)) {
100     return field->Get32(field->GetDeclaringClass());
101   }
102   return 0;
103 }
104 
art_portable_get64_static_from_code(uint32_t field_idx,mirror::ArtMethod * referrer)105 extern "C" int64_t art_portable_get64_static_from_code(uint32_t field_idx,
106                                                        mirror::ArtMethod* referrer)
107     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
108   mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticPrimitiveRead, sizeof(uint64_t));
109   if (LIKELY(field != NULL)) {
110     return field->Get64(field->GetDeclaringClass());
111   }
112   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
113                             StaticPrimitiveRead, sizeof(uint64_t), true);
114   if (LIKELY(field != NULL)) {
115     return field->Get64(field->GetDeclaringClass());
116   }
117   return 0;
118 }
119 
art_portable_get_obj_static_from_code(uint32_t field_idx,mirror::ArtMethod * referrer)120 extern "C" mirror::Object* art_portable_get_obj_static_from_code(uint32_t field_idx,
121                                                                  mirror::ArtMethod* referrer)
122     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
123   mirror::ArtField* field = FindFieldFast(field_idx, referrer, StaticObjectRead,
124                                           sizeof(mirror::Object*));
125   if (LIKELY(field != NULL)) {
126     return field->GetObj(field->GetDeclaringClass());
127   }
128   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
129                             StaticObjectRead, sizeof(mirror::Object*), true);
130   if (LIKELY(field != NULL)) {
131     return field->GetObj(field->GetDeclaringClass());
132   }
133   return 0;
134 }
135 
art_portable_set32_instance_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * obj,uint32_t new_value)136 extern "C" int32_t art_portable_set32_instance_from_code(uint32_t field_idx,
137                                                          mirror::ArtMethod* referrer,
138                                                          mirror::Object* obj, uint32_t new_value)
139     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
140   mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(uint32_t));
141   if (LIKELY(field != NULL)) {
142     field->Set32(obj, new_value);
143     return 0;
144   }
145   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
146                             InstancePrimitiveWrite, sizeof(uint32_t), true);
147   if (LIKELY(field != NULL)) {
148     field->Set32(obj, new_value);
149     return 0;
150   }
151   return -1;
152 }
153 
art_portable_set64_instance_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * obj,int64_t new_value)154 extern "C" int32_t art_portable_set64_instance_from_code(uint32_t field_idx,
155                                                          mirror::ArtMethod* referrer,
156                                                          mirror::Object* obj, int64_t new_value)
157     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
158   mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveWrite, sizeof(uint64_t));
159   if (LIKELY(field != NULL)) {
160     field->Set64(obj, new_value);
161     return 0;
162   }
163   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
164                             InstancePrimitiveWrite, sizeof(uint64_t), true);
165   if (LIKELY(field != NULL)) {
166     field->Set64(obj, new_value);
167     return 0;
168   }
169   return -1;
170 }
171 
art_portable_set_obj_instance_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * obj,mirror::Object * new_value)172 extern "C" int32_t art_portable_set_obj_instance_from_code(uint32_t field_idx,
173                                                            mirror::ArtMethod* referrer,
174                                                            mirror::Object* obj,
175                                                            mirror::Object* new_value)
176     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
177   mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectWrite,
178                                           sizeof(mirror::Object*));
179   if (LIKELY(field != NULL)) {
180     field->SetObj(obj, new_value);
181     return 0;
182   }
183   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
184                             InstanceObjectWrite, sizeof(mirror::Object*), true);
185   if (LIKELY(field != NULL)) {
186     field->SetObj(obj, new_value);
187     return 0;
188   }
189   return -1;
190 }
191 
art_portable_get32_instance_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * obj)192 extern "C" int32_t art_portable_get32_instance_from_code(uint32_t field_idx,
193                                                          mirror::ArtMethod* referrer,
194                                                          mirror::Object* obj)
195     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
196   mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(uint32_t));
197   if (LIKELY(field != NULL)) {
198     return field->Get32(obj);
199   }
200   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
201                             InstancePrimitiveRead, sizeof(uint32_t), true);
202   if (LIKELY(field != NULL)) {
203     return field->Get32(obj);
204   }
205   return 0;
206 }
207 
art_portable_get64_instance_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * obj)208 extern "C" int64_t art_portable_get64_instance_from_code(uint32_t field_idx,
209                                                          mirror::ArtMethod* referrer,
210                                                          mirror::Object* obj)
211     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
212   mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstancePrimitiveRead, sizeof(uint64_t));
213   if (LIKELY(field != NULL)) {
214     return field->Get64(obj);
215   }
216   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
217                             InstancePrimitiveRead, sizeof(uint64_t), true);
218   if (LIKELY(field != NULL)) {
219     return field->Get64(obj);
220   }
221   return 0;
222 }
223 
art_portable_get_obj_instance_from_code(uint32_t field_idx,mirror::ArtMethod * referrer,mirror::Object * obj)224 extern "C" mirror::Object* art_portable_get_obj_instance_from_code(uint32_t field_idx,
225                                                                    mirror::ArtMethod* referrer,
226                                                                    mirror::Object* obj)
227     SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
228   mirror::ArtField* field = FindFieldFast(field_idx, referrer, InstanceObjectRead,
229                                           sizeof(mirror::Object*));
230   if (LIKELY(field != NULL)) {
231     return field->GetObj(obj);
232   }
233   field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
234                             InstanceObjectRead, sizeof(mirror::Object*), true);
235   if (LIKELY(field != NULL)) {
236     return field->GetObj(obj);
237   }
238   return 0;
239 }
240 
241 }  // namespace art
242