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