portable_field_entrypoints.cc revision 7655f29fabc0a12765de828914a18314382e5a35
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/abstract_method-inl.h" 19#include "mirror/field-inl.h" 20#include "mirror/object-inl.h" 21 22namespace art { 23 24extern "C" int32_t art_portable_set32_static_from_code(uint32_t field_idx, 25 mirror::AbstractMethod* referrer, 26 int32_t new_value) 27 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 28 mirror::Field* 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 49extern "C" int32_t art_portable_set64_static_from_code(uint32_t field_idx, 50 mirror::AbstractMethod* referrer, 51 int64_t new_value) 52 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 53 mirror::Field* 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 71extern "C" int32_t art_portable_set_obj_static_from_code(uint32_t field_idx, 72 mirror::AbstractMethod* referrer, 73 mirror::Object* new_value) 74 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 75 mirror::Field* 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 90extern "C" int32_t art_portable_get32_static_from_code(uint32_t field_idx, 91 mirror::AbstractMethod* referrer) 92 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 93 mirror::Field* 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 105extern "C" int64_t art_portable_get64_static_from_code(uint32_t field_idx, 106 mirror::AbstractMethod* referrer) 107 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 108 mirror::Field* 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 120extern "C" mirror::Object* art_portable_get_obj_static_from_code(uint32_t field_idx, 121 mirror::AbstractMethod* referrer) 122 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 123 mirror::Field* 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 136extern "C" int32_t art_portable_set32_instance_from_code(uint32_t field_idx, 137 mirror::AbstractMethod* referrer, 138 mirror::Object* obj, uint32_t new_value) 139 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 140 mirror::Field* 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 154extern "C" int32_t art_portable_set64_instance_from_code(uint32_t field_idx, 155 mirror::AbstractMethod* referrer, 156 mirror::Object* obj, int64_t new_value) 157 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 158 mirror::Field* 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 172extern "C" int32_t art_portable_set_obj_instance_from_code(uint32_t field_idx, 173 mirror::AbstractMethod* referrer, 174 mirror::Object* obj, 175 mirror::Object* new_value) 176 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 177 mirror::Field* 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 192extern "C" int32_t art_portable_get32_instance_from_code(uint32_t field_idx, 193 mirror::AbstractMethod* referrer, 194 mirror::Object* obj) 195 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 196 mirror::Field* 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 208extern "C" int64_t art_portable_get64_instance_from_code(uint32_t field_idx, 209 mirror::AbstractMethod* referrer, 210 mirror::Object* obj) 211 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 212 mirror::Field* 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 224extern "C" mirror::Object* art_portable_get_obj_instance_from_code(uint32_t field_idx, 225 mirror::AbstractMethod* referrer, 226 mirror::Object* obj) 227 SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 228 mirror::Field* 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