1 /* 2 * Copyright (C) 2015 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 "unstarted_runtime.h" 18 19 #include <ctype.h> 20 #include <errno.h> 21 #include <stdlib.h> 22 23 #include <cmath> 24 #include <initializer_list> 25 #include <limits> 26 #include <locale> 27 #include <unordered_map> 28 29 #include <android-base/logging.h> 30 #include <android-base/stringprintf.h> 31 32 #include "art_method-inl.h" 33 #include "base/casts.h" 34 #include "base/enums.h" 35 #include "base/macros.h" 36 #include "base/quasi_atomic.h" 37 #include "base/zip_archive.h" 38 #include "class_linker.h" 39 #include "common_throws.h" 40 #include "dex/descriptors_names.h" 41 #include "entrypoints/entrypoint_utils-inl.h" 42 #include "gc/reference_processor.h" 43 #include "handle_scope-inl.h" 44 #include "hidden_api.h" 45 #include "interpreter/interpreter_common.h" 46 #include "jvalue-inl.h" 47 #include "mirror/array-alloc-inl.h" 48 #include "mirror/array-inl.h" 49 #include "mirror/class-alloc-inl.h" 50 #include "mirror/executable-inl.h" 51 #include "mirror/field-inl.h" 52 #include "mirror/method.h" 53 #include "mirror/object-inl.h" 54 #include "mirror/object_array-alloc-inl.h" 55 #include "mirror/object_array-inl.h" 56 #include "mirror/string-alloc-inl.h" 57 #include "mirror/string-inl.h" 58 #include "nativehelper/scoped_local_ref.h" 59 #include "nth_caller_visitor.h" 60 #include "reflection.h" 61 #include "thread-inl.h" 62 #include "transaction.h" 63 #include "well_known_classes.h" 64 65 namespace art { 66 namespace interpreter { 67 68 using android::base::StringAppendV; 69 using android::base::StringPrintf; 70 71 static void AbortTransactionOrFail(Thread* self, const char* fmt, ...) 72 __attribute__((__format__(__printf__, 2, 3))) 73 REQUIRES_SHARED(Locks::mutator_lock_); 74 75 static void AbortTransactionOrFail(Thread* self, const char* fmt, ...) { 76 va_list args; 77 if (Runtime::Current()->IsActiveTransaction()) { 78 va_start(args, fmt); 79 AbortTransactionV(self, fmt, args); 80 va_end(args); 81 } else { 82 va_start(args, fmt); 83 std::string msg; 84 StringAppendV(&msg, fmt, args); 85 va_end(args); 86 LOG(FATAL) << "Trying to abort, but not in transaction mode: " << msg; 87 UNREACHABLE(); 88 } 89 } 90 91 // Restricted support for character upper case / lower case. Only support ASCII, where 92 // it's easy. Abort the transaction otherwise. 93 static void CharacterLowerUpper(Thread* self, 94 ShadowFrame* shadow_frame, 95 JValue* result, 96 size_t arg_offset, 97 bool to_lower_case) REQUIRES_SHARED(Locks::mutator_lock_) { 98 uint32_t int_value = static_cast<uint32_t>(shadow_frame->GetVReg(arg_offset)); 99 100 // Only ASCII (7-bit). 101 if (!isascii(int_value)) { 102 AbortTransactionOrFail(self, 103 "Only support ASCII characters for toLowerCase/toUpperCase: %u", 104 int_value); 105 return; 106 } 107 108 std::locale c_locale("C"); 109 char char_value = static_cast<char>(int_value); 110 111 if (to_lower_case) { 112 result->SetI(std::tolower(char_value, c_locale)); 113 } else { 114 result->SetI(std::toupper(char_value, c_locale)); 115 } 116 } 117 118 void UnstartedRuntime::UnstartedCharacterToLowerCase( 119 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 120 CharacterLowerUpper(self, shadow_frame, result, arg_offset, true); 121 } 122 123 void UnstartedRuntime::UnstartedCharacterToUpperCase( 124 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 125 CharacterLowerUpper(self, shadow_frame, result, arg_offset, false); 126 } 127 128 // Helper function to deal with class loading in an unstarted runtime. 129 static void UnstartedRuntimeFindClass(Thread* self, Handle<mirror::String> className, 130 Handle<mirror::ClassLoader> class_loader, JValue* result, 131 const std::string& method_name, bool initialize_class, 132 bool abort_if_not_found) 133 REQUIRES_SHARED(Locks::mutator_lock_) { 134 CHECK(className != nullptr); 135 std::string descriptor(DotToDescriptor(className->ToModifiedUtf8().c_str())); 136 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 137 138 ObjPtr<mirror::Class> found = class_linker->FindClass(self, descriptor.c_str(), class_loader); 139 if (found == nullptr && abort_if_not_found) { 140 if (!self->IsExceptionPending()) { 141 AbortTransactionOrFail(self, "%s failed in un-started runtime for class: %s", 142 method_name.c_str(), 143 PrettyDescriptor(descriptor.c_str()).c_str()); 144 } 145 return; 146 } 147 if (found != nullptr && initialize_class) { 148 StackHandleScope<1> hs(self); 149 HandleWrapperObjPtr<mirror::Class> h_class = hs.NewHandleWrapper(&found); 150 if (!class_linker->EnsureInitialized(self, h_class, true, true)) { 151 CHECK(self->IsExceptionPending()); 152 return; 153 } 154 } 155 result->SetL(found); 156 } 157 158 // Common helper for class-loading cutouts in an unstarted runtime. We call Runtime methods that 159 // rely on Java code to wrap errors in the correct exception class (i.e., NoClassDefFoundError into 160 // ClassNotFoundException), so need to do the same. The only exception is if the exception is 161 // actually the transaction abort exception. This must not be wrapped, as it signals an 162 // initialization abort. 163 static void CheckExceptionGenerateClassNotFound(Thread* self) 164 REQUIRES_SHARED(Locks::mutator_lock_) { 165 if (self->IsExceptionPending()) { 166 // If it is not the transaction abort exception, wrap it. 167 std::string type(mirror::Object::PrettyTypeOf(self->GetException())); 168 if (type != Transaction::kAbortExceptionDescriptor) { 169 self->ThrowNewWrappedException("Ljava/lang/ClassNotFoundException;", 170 "ClassNotFoundException"); 171 } 172 } 173 } 174 175 static ObjPtr<mirror::String> GetClassName(Thread* self, 176 ShadowFrame* shadow_frame, 177 size_t arg_offset) 178 REQUIRES_SHARED(Locks::mutator_lock_) { 179 mirror::Object* param = shadow_frame->GetVRegReference(arg_offset); 180 if (param == nullptr) { 181 AbortTransactionOrFail(self, "Null-pointer in Class.forName."); 182 return nullptr; 183 } 184 return param->AsString(); 185 } 186 187 static std::function<hiddenapi::AccessContext()> GetHiddenapiAccessContextFunction( 188 ShadowFrame* frame) { 189 return [=]() REQUIRES_SHARED(Locks::mutator_lock_) { 190 return hiddenapi::AccessContext(frame->GetMethod()->GetDeclaringClass()); 191 }; 192 } 193 194 template<typename T> 195 static ALWAYS_INLINE bool ShouldDenyAccessToMember(T* member, ShadowFrame* frame) 196 REQUIRES_SHARED(Locks::mutator_lock_) { 197 // All uses in this file are from reflection 198 constexpr hiddenapi::AccessMethod kAccessMethod = hiddenapi::AccessMethod::kReflection; 199 return hiddenapi::ShouldDenyAccessToMember(member, 200 GetHiddenapiAccessContextFunction(frame), 201 kAccessMethod); 202 } 203 204 void UnstartedRuntime::UnstartedClassForNameCommon(Thread* self, 205 ShadowFrame* shadow_frame, 206 JValue* result, 207 size_t arg_offset, 208 bool long_form, 209 const char* caller) { 210 ObjPtr<mirror::String> class_name = GetClassName(self, shadow_frame, arg_offset); 211 if (class_name == nullptr) { 212 return; 213 } 214 bool initialize_class; 215 ObjPtr<mirror::ClassLoader> class_loader; 216 if (long_form) { 217 initialize_class = shadow_frame->GetVReg(arg_offset + 1) != 0; 218 class_loader = 219 ObjPtr<mirror::ClassLoader>::DownCast(shadow_frame->GetVRegReference(arg_offset + 2)); 220 } else { 221 initialize_class = true; 222 // TODO: This is really only correct for the boot classpath, and for robustness we should 223 // check the caller. 224 class_loader = nullptr; 225 } 226 227 ScopedObjectAccessUnchecked soa(self); 228 if (class_loader != nullptr && !ClassLinker::IsBootClassLoader(soa, class_loader)) { 229 AbortTransactionOrFail(self, 230 "Only the boot classloader is supported: %s", 231 mirror::Object::PrettyTypeOf(class_loader).c_str()); 232 return; 233 } 234 235 StackHandleScope<1> hs(self); 236 Handle<mirror::String> h_class_name(hs.NewHandle(class_name)); 237 UnstartedRuntimeFindClass(self, 238 h_class_name, 239 ScopedNullHandle<mirror::ClassLoader>(), 240 result, 241 caller, 242 initialize_class, 243 false); 244 CheckExceptionGenerateClassNotFound(self); 245 } 246 247 void UnstartedRuntime::UnstartedClassForName( 248 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 249 UnstartedClassForNameCommon(self, shadow_frame, result, arg_offset, false, "Class.forName"); 250 } 251 252 void UnstartedRuntime::UnstartedClassForNameLong( 253 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 254 UnstartedClassForNameCommon(self, shadow_frame, result, arg_offset, true, "Class.forName"); 255 } 256 257 void UnstartedRuntime::UnstartedClassGetPrimitiveClass( 258 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 259 ObjPtr<mirror::String> class_name = GetClassName(self, shadow_frame, arg_offset); 260 ObjPtr<mirror::Class> klass = mirror::Class::GetPrimitiveClass(class_name); 261 if (UNLIKELY(klass == nullptr)) { 262 DCHECK(self->IsExceptionPending()); 263 AbortTransactionOrFail(self, 264 "Class.getPrimitiveClass() failed: %s", 265 self->GetException()->GetDetailMessage()->ToModifiedUtf8().c_str()); 266 return; 267 } 268 result->SetL(klass); 269 } 270 271 void UnstartedRuntime::UnstartedClassClassForName( 272 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 273 UnstartedClassForNameCommon(self, shadow_frame, result, arg_offset, true, "Class.classForName"); 274 } 275 276 void UnstartedRuntime::UnstartedClassNewInstance( 277 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 278 StackHandleScope<2> hs(self); // Class, constructor, object. 279 mirror::Object* param = shadow_frame->GetVRegReference(arg_offset); 280 if (param == nullptr) { 281 AbortTransactionOrFail(self, "Null-pointer in Class.newInstance."); 282 return; 283 } 284 Handle<mirror::Class> h_klass(hs.NewHandle(param->AsClass())); 285 286 // Check that it's not null. 287 if (h_klass == nullptr) { 288 AbortTransactionOrFail(self, "Class reference is null for newInstance"); 289 return; 290 } 291 292 // If we're in a transaction, class must not be finalizable (it or a superclass has a finalizer). 293 if (Runtime::Current()->IsActiveTransaction()) { 294 if (h_klass->IsFinalizable()) { 295 AbortTransactionF(self, "Class for newInstance is finalizable: '%s'", 296 h_klass->PrettyClass().c_str()); 297 return; 298 } 299 } 300 301 // There are two situations in which we'll abort this run. 302 // 1) If the class isn't yet initialized and initialization fails. 303 // 2) If we can't find the default constructor. We'll postpone the exception to runtime. 304 // Note that 2) could likely be handled here, but for safety abort the transaction. 305 bool ok = false; 306 auto* cl = Runtime::Current()->GetClassLinker(); 307 if (cl->EnsureInitialized(self, h_klass, true, true)) { 308 ArtMethod* cons = h_klass->FindConstructor("()V", cl->GetImagePointerSize()); 309 if (cons != nullptr && ShouldDenyAccessToMember(cons, shadow_frame)) { 310 cons = nullptr; 311 } 312 if (cons != nullptr) { 313 Handle<mirror::Object> h_obj(hs.NewHandle(h_klass->AllocObject(self))); 314 CHECK(h_obj != nullptr); // We don't expect OOM at compile-time. 315 EnterInterpreterFromInvoke(self, cons, h_obj.Get(), nullptr, nullptr); 316 if (!self->IsExceptionPending()) { 317 result->SetL(h_obj.Get()); 318 ok = true; 319 } 320 } else { 321 self->ThrowNewExceptionF("Ljava/lang/InternalError;", 322 "Could not find default constructor for '%s'", 323 h_klass->PrettyClass().c_str()); 324 } 325 } 326 if (!ok) { 327 AbortTransactionOrFail(self, "Failed in Class.newInstance for '%s' with %s", 328 h_klass->PrettyClass().c_str(), 329 mirror::Object::PrettyTypeOf(self->GetException()).c_str()); 330 } 331 } 332 333 void UnstartedRuntime::UnstartedClassGetDeclaredField( 334 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 335 // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 336 // going the reflective Dex way. 337 ObjPtr<mirror::Class> klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 338 ObjPtr<mirror::String> name2 = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 339 ArtField* found = nullptr; 340 for (ArtField& field : klass->GetIFields()) { 341 if (name2->Equals(field.GetName())) { 342 found = &field; 343 break; 344 } 345 } 346 if (found == nullptr) { 347 for (ArtField& field : klass->GetSFields()) { 348 if (name2->Equals(field.GetName())) { 349 found = &field; 350 break; 351 } 352 } 353 } 354 if (found != nullptr && ShouldDenyAccessToMember(found, shadow_frame)) { 355 found = nullptr; 356 } 357 if (found == nullptr) { 358 AbortTransactionOrFail(self, "Failed to find field in Class.getDeclaredField in un-started " 359 " runtime. name=%s class=%s", name2->ToModifiedUtf8().c_str(), 360 klass->PrettyDescriptor().c_str()); 361 return; 362 } 363 Runtime* runtime = Runtime::Current(); 364 PointerSize pointer_size = runtime->GetClassLinker()->GetImagePointerSize(); 365 ObjPtr<mirror::Field> field; 366 if (runtime->IsActiveTransaction()) { 367 if (pointer_size == PointerSize::k64) { 368 field = mirror::Field::CreateFromArtField<PointerSize::k64, true>( 369 self, found, true); 370 } else { 371 field = mirror::Field::CreateFromArtField<PointerSize::k32, true>( 372 self, found, true); 373 } 374 } else { 375 if (pointer_size == PointerSize::k64) { 376 field = mirror::Field::CreateFromArtField<PointerSize::k64, false>( 377 self, found, true); 378 } else { 379 field = mirror::Field::CreateFromArtField<PointerSize::k32, false>( 380 self, found, true); 381 } 382 } 383 result->SetL(field); 384 } 385 386 // This is required for Enum(Set) code, as that uses reflection to inspect enum classes. 387 void UnstartedRuntime::UnstartedClassGetDeclaredMethod( 388 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 389 // Special managed code cut-out to allow method lookup in a un-started runtime. 390 ObjPtr<mirror::Class> klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 391 if (klass == nullptr) { 392 ThrowNullPointerExceptionForMethodAccess(shadow_frame->GetMethod(), InvokeType::kVirtual); 393 return; 394 } 395 ObjPtr<mirror::String> name = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 396 ObjPtr<mirror::ObjectArray<mirror::Class>> args = 397 shadow_frame->GetVRegReference(arg_offset + 2)->AsObjectArray<mirror::Class>(); 398 Runtime* runtime = Runtime::Current(); 399 bool transaction = runtime->IsActiveTransaction(); 400 PointerSize pointer_size = runtime->GetClassLinker()->GetImagePointerSize(); 401 auto fn_hiddenapi_access_context = GetHiddenapiAccessContextFunction(shadow_frame); 402 ObjPtr<mirror::Method> method; 403 if (transaction) { 404 if (pointer_size == PointerSize::k64) { 405 method = mirror::Class::GetDeclaredMethodInternal<PointerSize::k64, true>( 406 self, klass, name, args, fn_hiddenapi_access_context); 407 } else { 408 method = mirror::Class::GetDeclaredMethodInternal<PointerSize::k32, true>( 409 self, klass, name, args, fn_hiddenapi_access_context); 410 } 411 } else { 412 if (pointer_size == PointerSize::k64) { 413 method = mirror::Class::GetDeclaredMethodInternal<PointerSize::k64, false>( 414 self, klass, name, args, fn_hiddenapi_access_context); 415 } else { 416 method = mirror::Class::GetDeclaredMethodInternal<PointerSize::k32, false>( 417 self, klass, name, args, fn_hiddenapi_access_context); 418 } 419 } 420 if (method != nullptr && ShouldDenyAccessToMember(method->GetArtMethod(), shadow_frame)) { 421 method = nullptr; 422 } 423 result->SetL(method); 424 } 425 426 // Special managed code cut-out to allow constructor lookup in a un-started runtime. 427 void UnstartedRuntime::UnstartedClassGetDeclaredConstructor( 428 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 429 ObjPtr<mirror::Class> klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 430 if (klass == nullptr) { 431 ThrowNullPointerExceptionForMethodAccess(shadow_frame->GetMethod(), InvokeType::kVirtual); 432 return; 433 } 434 ObjPtr<mirror::ObjectArray<mirror::Class>> args = 435 shadow_frame->GetVRegReference(arg_offset + 1)->AsObjectArray<mirror::Class>(); 436 Runtime* runtime = Runtime::Current(); 437 bool transaction = runtime->IsActiveTransaction(); 438 PointerSize pointer_size = runtime->GetClassLinker()->GetImagePointerSize(); 439 ObjPtr<mirror::Constructor> constructor; 440 if (transaction) { 441 if (pointer_size == PointerSize::k64) { 442 constructor = mirror::Class::GetDeclaredConstructorInternal<PointerSize::k64, 443 true>(self, klass, args); 444 } else { 445 constructor = mirror::Class::GetDeclaredConstructorInternal<PointerSize::k32, 446 true>(self, klass, args); 447 } 448 } else { 449 if (pointer_size == PointerSize::k64) { 450 constructor = mirror::Class::GetDeclaredConstructorInternal<PointerSize::k64, 451 false>(self, klass, args); 452 } else { 453 constructor = mirror::Class::GetDeclaredConstructorInternal<PointerSize::k32, 454 false>(self, klass, args); 455 } 456 } 457 if (constructor != nullptr && 458 ShouldDenyAccessToMember(constructor->GetArtMethod(), shadow_frame)) { 459 constructor = nullptr; 460 } 461 result->SetL(constructor); 462 } 463 464 void UnstartedRuntime::UnstartedClassGetDeclaringClass( 465 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 466 StackHandleScope<1> hs(self); 467 Handle<mirror::Class> klass(hs.NewHandle( 468 reinterpret_cast<mirror::Class*>(shadow_frame->GetVRegReference(arg_offset)))); 469 if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { 470 result->SetL(nullptr); 471 return; 472 } 473 // Return null for anonymous classes. 474 JValue is_anon_result; 475 UnstartedClassIsAnonymousClass(self, shadow_frame, &is_anon_result, arg_offset); 476 if (is_anon_result.GetZ() != 0) { 477 result->SetL(nullptr); 478 return; 479 } 480 result->SetL(annotations::GetDeclaringClass(klass)); 481 } 482 483 void UnstartedRuntime::UnstartedClassGetEnclosingClass( 484 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 485 StackHandleScope<1> hs(self); 486 Handle<mirror::Class> klass(hs.NewHandle(shadow_frame->GetVRegReference(arg_offset)->AsClass())); 487 if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { 488 result->SetL(nullptr); 489 } 490 result->SetL(annotations::GetEnclosingClass(klass)); 491 } 492 493 void UnstartedRuntime::UnstartedClassGetInnerClassFlags( 494 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 495 StackHandleScope<1> hs(self); 496 Handle<mirror::Class> klass(hs.NewHandle( 497 reinterpret_cast<mirror::Class*>(shadow_frame->GetVRegReference(arg_offset)))); 498 const int32_t default_value = shadow_frame->GetVReg(arg_offset + 1); 499 result->SetI(mirror::Class::GetInnerClassFlags(klass, default_value)); 500 } 501 502 void UnstartedRuntime::UnstartedClassGetSignatureAnnotation( 503 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 504 StackHandleScope<1> hs(self); 505 Handle<mirror::Class> klass(hs.NewHandle( 506 reinterpret_cast<mirror::Class*>(shadow_frame->GetVRegReference(arg_offset)))); 507 508 if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { 509 result->SetL(nullptr); 510 return; 511 } 512 513 result->SetL(annotations::GetSignatureAnnotationForClass(klass)); 514 } 515 516 void UnstartedRuntime::UnstartedClassIsAnonymousClass( 517 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 518 StackHandleScope<1> hs(self); 519 Handle<mirror::Class> klass(hs.NewHandle( 520 reinterpret_cast<mirror::Class*>(shadow_frame->GetVRegReference(arg_offset)))); 521 if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) { 522 result->SetZ(false); 523 return; 524 } 525 ObjPtr<mirror::String> class_name = nullptr; 526 if (!annotations::GetInnerClass(klass, &class_name)) { 527 result->SetZ(false); 528 return; 529 } 530 result->SetZ(class_name == nullptr); 531 } 532 533 static MemMap FindAndExtractEntry(const std::string& jar_file, 534 const char* entry_name, 535 size_t* size, 536 std::string* error_msg) { 537 CHECK(size != nullptr); 538 539 std::unique_ptr<ZipArchive> zip_archive(ZipArchive::Open(jar_file.c_str(), error_msg)); 540 if (zip_archive == nullptr) { 541 return MemMap::Invalid(); 542 } 543 std::unique_ptr<ZipEntry> zip_entry(zip_archive->Find(entry_name, error_msg)); 544 if (zip_entry == nullptr) { 545 return MemMap::Invalid(); 546 } 547 MemMap tmp_map = zip_entry->ExtractToMemMap(jar_file.c_str(), entry_name, error_msg); 548 if (!tmp_map.IsValid()) { 549 return MemMap::Invalid(); 550 } 551 552 // OK, from here everything seems fine. 553 *size = zip_entry->GetUncompressedLength(); 554 return tmp_map; 555 } 556 557 static void GetResourceAsStream(Thread* self, 558 ShadowFrame* shadow_frame, 559 JValue* result, 560 size_t arg_offset) REQUIRES_SHARED(Locks::mutator_lock_) { 561 mirror::Object* resource_obj = shadow_frame->GetVRegReference(arg_offset + 1); 562 if (resource_obj == nullptr) { 563 AbortTransactionOrFail(self, "null name for getResourceAsStream"); 564 return; 565 } 566 CHECK(resource_obj->IsString()); 567 ObjPtr<mirror::String> resource_name = resource_obj->AsString(); 568 569 std::string resource_name_str = resource_name->ToModifiedUtf8(); 570 if (resource_name_str.empty() || resource_name_str == "/") { 571 AbortTransactionOrFail(self, 572 "Unsupported name %s for getResourceAsStream", 573 resource_name_str.c_str()); 574 return; 575 } 576 const char* resource_cstr = resource_name_str.c_str(); 577 if (resource_cstr[0] == '/') { 578 resource_cstr++; 579 } 580 581 Runtime* runtime = Runtime::Current(); 582 583 const std::vector<std::string>& boot_class_path = Runtime::Current()->GetBootClassPath(); 584 if (boot_class_path.empty()) { 585 AbortTransactionOrFail(self, "Boot classpath not set"); 586 return; 587 } 588 589 MemMap mem_map; 590 size_t map_size; 591 std::string last_error_msg; // Only store the last message (we could concatenate). 592 593 for (const std::string& jar_file : boot_class_path) { 594 mem_map = FindAndExtractEntry(jar_file, resource_cstr, &map_size, &last_error_msg); 595 if (mem_map.IsValid()) { 596 break; 597 } 598 } 599 600 if (!mem_map.IsValid()) { 601 // Didn't find it. There's a good chance this will be the same at runtime, but still 602 // conservatively abort the transaction here. 603 AbortTransactionOrFail(self, 604 "Could not find resource %s. Last error was %s.", 605 resource_name_str.c_str(), 606 last_error_msg.c_str()); 607 return; 608 } 609 610 StackHandleScope<3> hs(self); 611 612 // Create byte array for content. 613 Handle<mirror::ByteArray> h_array(hs.NewHandle(mirror::ByteArray::Alloc(self, map_size))); 614 if (h_array == nullptr) { 615 AbortTransactionOrFail(self, "Could not find/create byte array class"); 616 return; 617 } 618 // Copy in content. 619 memcpy(h_array->GetData(), mem_map.Begin(), map_size); 620 // Be proactive releasing memory. 621 mem_map.Reset(); 622 623 // Create a ByteArrayInputStream. 624 Handle<mirror::Class> h_class(hs.NewHandle( 625 runtime->GetClassLinker()->FindClass(self, 626 "Ljava/io/ByteArrayInputStream;", 627 ScopedNullHandle<mirror::ClassLoader>()))); 628 if (h_class == nullptr) { 629 AbortTransactionOrFail(self, "Could not find ByteArrayInputStream class"); 630 return; 631 } 632 if (!runtime->GetClassLinker()->EnsureInitialized(self, h_class, true, true)) { 633 AbortTransactionOrFail(self, "Could not initialize ByteArrayInputStream class"); 634 return; 635 } 636 637 Handle<mirror::Object> h_obj(hs.NewHandle(h_class->AllocObject(self))); 638 if (h_obj == nullptr) { 639 AbortTransactionOrFail(self, "Could not allocate ByteArrayInputStream object"); 640 return; 641 } 642 643 auto* cl = Runtime::Current()->GetClassLinker(); 644 ArtMethod* constructor = h_class->FindConstructor("([B)V", cl->GetImagePointerSize()); 645 if (constructor == nullptr) { 646 AbortTransactionOrFail(self, "Could not find ByteArrayInputStream constructor"); 647 return; 648 } 649 650 uint32_t args[1]; 651 args[0] = reinterpret_cast32<uint32_t>(h_array.Get()); 652 EnterInterpreterFromInvoke(self, constructor, h_obj.Get(), args, nullptr); 653 654 if (self->IsExceptionPending()) { 655 AbortTransactionOrFail(self, "Could not run ByteArrayInputStream constructor"); 656 return; 657 } 658 659 result->SetL(h_obj.Get()); 660 } 661 662 void UnstartedRuntime::UnstartedClassLoaderGetResourceAsStream( 663 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 664 { 665 mirror::Object* this_obj = shadow_frame->GetVRegReference(arg_offset); 666 CHECK(this_obj != nullptr); 667 CHECK(this_obj->IsClassLoader()); 668 669 StackHandleScope<1> hs(self); 670 Handle<mirror::Class> this_classloader_class(hs.NewHandle(this_obj->GetClass())); 671 672 if (self->DecodeJObject(WellKnownClasses::java_lang_BootClassLoader) != 673 this_classloader_class.Get()) { 674 AbortTransactionOrFail(self, 675 "Unsupported classloader type %s for getResourceAsStream", 676 mirror::Class::PrettyClass(this_classloader_class.Get()).c_str()); 677 return; 678 } 679 } 680 681 GetResourceAsStream(self, shadow_frame, result, arg_offset); 682 } 683 684 void UnstartedRuntime::UnstartedConstructorNewInstance0( 685 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 686 // This is a cutdown version of java_lang_reflect_Constructor.cc's implementation. 687 StackHandleScope<4> hs(self); 688 Handle<mirror::Constructor> m = hs.NewHandle( 689 reinterpret_cast<mirror::Constructor*>(shadow_frame->GetVRegReference(arg_offset))); 690 Handle<mirror::ObjectArray<mirror::Object>> args = hs.NewHandle( 691 reinterpret_cast<mirror::ObjectArray<mirror::Object>*>( 692 shadow_frame->GetVRegReference(arg_offset + 1))); 693 Handle<mirror::Class> c(hs.NewHandle(m->GetDeclaringClass())); 694 if (UNLIKELY(c->IsAbstract())) { 695 AbortTransactionOrFail(self, "Cannot handle abstract classes"); 696 return; 697 } 698 // Verify that we can access the class. 699 if (!m->IsAccessible() && !c->IsPublic()) { 700 // Go 2 frames back, this method is always called from newInstance0, which is called from 701 // Constructor.newInstance(Object... args). 702 ObjPtr<mirror::Class> caller = GetCallingClass(self, 2); 703 // If caller is null, then we called from JNI, just avoid the check since JNI avoids most 704 // access checks anyways. TODO: Investigate if this the correct behavior. 705 if (caller != nullptr && !caller->CanAccess(c.Get())) { 706 AbortTransactionOrFail(self, "Cannot access class"); 707 return; 708 } 709 } 710 if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(self, c, true, true)) { 711 DCHECK(self->IsExceptionPending()); 712 return; 713 } 714 if (c->IsClassClass()) { 715 AbortTransactionOrFail(self, "new Class() is not supported"); 716 return; 717 } 718 719 // String constructor is replaced by a StringFactory method in InvokeMethod. 720 if (c->IsStringClass()) { 721 // We don't support strings. 722 AbortTransactionOrFail(self, "String construction is not supported"); 723 return; 724 } 725 726 Handle<mirror::Object> receiver = hs.NewHandle(c->AllocObject(self)); 727 if (receiver == nullptr) { 728 AbortTransactionOrFail(self, "Could not allocate"); 729 return; 730 } 731 732 // It's easier to use reflection to make the call, than create the uint32_t array. 733 { 734 ScopedObjectAccessUnchecked soa(self); 735 ScopedLocalRef<jobject> method_ref(self->GetJniEnv(), 736 soa.AddLocalReference<jobject>(m.Get())); 737 ScopedLocalRef<jobject> object_ref(self->GetJniEnv(), 738 soa.AddLocalReference<jobject>(receiver.Get())); 739 ScopedLocalRef<jobject> args_ref(self->GetJniEnv(), 740 soa.AddLocalReference<jobject>(args.Get())); 741 InvokeMethod(soa, method_ref.get(), object_ref.get(), args_ref.get(), 2); 742 } 743 if (self->IsExceptionPending()) { 744 AbortTransactionOrFail(self, "Failed running constructor"); 745 } else { 746 result->SetL(receiver.Get()); 747 } 748 } 749 750 void UnstartedRuntime::UnstartedVmClassLoaderFindLoadedClass( 751 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 752 ObjPtr<mirror::String> class_name = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 753 ObjPtr<mirror::ClassLoader> class_loader = 754 ObjPtr<mirror::ClassLoader>::DownCast(shadow_frame->GetVRegReference(arg_offset)); 755 StackHandleScope<2> hs(self); 756 Handle<mirror::String> h_class_name(hs.NewHandle(class_name)); 757 Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(class_loader)); 758 UnstartedRuntimeFindClass(self, h_class_name, h_class_loader, result, 759 "VMClassLoader.findLoadedClass", false, false); 760 // This might have an error pending. But semantics are to just return null. 761 if (self->IsExceptionPending()) { 762 // If it is an InternalError, keep it. See CheckExceptionGenerateClassNotFound. 763 std::string type(mirror::Object::PrettyTypeOf(self->GetException())); 764 if (type != "java.lang.InternalError") { 765 self->ClearException(); 766 } 767 } 768 } 769 770 // Arraycopy emulation. 771 // Note: we can't use any fast copy functions, as they are not available under transaction. 772 773 template <typename T> 774 static void PrimitiveArrayCopy(Thread* self, 775 ObjPtr<mirror::Array> src_array, 776 int32_t src_pos, 777 ObjPtr<mirror::Array> dst_array, 778 int32_t dst_pos, 779 int32_t length) 780 REQUIRES_SHARED(Locks::mutator_lock_) { 781 if (src_array->GetClass()->GetComponentType() != dst_array->GetClass()->GetComponentType()) { 782 AbortTransactionOrFail(self, 783 "Types mismatched in arraycopy: %s vs %s.", 784 mirror::Class::PrettyDescriptor( 785 src_array->GetClass()->GetComponentType()).c_str(), 786 mirror::Class::PrettyDescriptor( 787 dst_array->GetClass()->GetComponentType()).c_str()); 788 return; 789 } 790 ObjPtr<mirror::PrimitiveArray<T>> src = ObjPtr<mirror::PrimitiveArray<T>>::DownCast(src_array); 791 ObjPtr<mirror::PrimitiveArray<T>> dst = ObjPtr<mirror::PrimitiveArray<T>>::DownCast(dst_array); 792 const bool copy_forward = (dst_pos < src_pos) || (dst_pos - src_pos >= length); 793 if (copy_forward) { 794 for (int32_t i = 0; i < length; ++i) { 795 dst->Set(dst_pos + i, src->Get(src_pos + i)); 796 } 797 } else { 798 for (int32_t i = 1; i <= length; ++i) { 799 dst->Set(dst_pos + length - i, src->Get(src_pos + length - i)); 800 } 801 } 802 } 803 804 void UnstartedRuntime::UnstartedSystemArraycopy( 805 Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset) { 806 // Special case array copying without initializing System. 807 jint src_pos = shadow_frame->GetVReg(arg_offset + 1); 808 jint dst_pos = shadow_frame->GetVReg(arg_offset + 3); 809 jint length = shadow_frame->GetVReg(arg_offset + 4); 810 811 mirror::Object* src_obj = shadow_frame->GetVRegReference(arg_offset); 812 mirror::Object* dst_obj = shadow_frame->GetVRegReference(arg_offset + 2); 813 // Null checking. For simplicity, abort transaction. 814 if (src_obj == nullptr) { 815 AbortTransactionOrFail(self, "src is null in arraycopy."); 816 return; 817 } 818 if (dst_obj == nullptr) { 819 AbortTransactionOrFail(self, "dst is null in arraycopy."); 820 return; 821 } 822 // Test for arrayness. Throw ArrayStoreException. 823 if (!src_obj->IsArrayInstance() || !dst_obj->IsArrayInstance()) { 824 self->ThrowNewException("Ljava/lang/ArrayStoreException;", "src or trg is not an array"); 825 return; 826 } 827 828 ObjPtr<mirror::Array> src_array = src_obj->AsArray(); 829 ObjPtr<mirror::Array> dst_array = dst_obj->AsArray(); 830 831 // Bounds checking. Throw IndexOutOfBoundsException. 832 if (UNLIKELY(src_pos < 0) || UNLIKELY(dst_pos < 0) || UNLIKELY(length < 0) || 833 UNLIKELY(src_pos > src_array->GetLength() - length) || 834 UNLIKELY(dst_pos > dst_array->GetLength() - length)) { 835 self->ThrowNewExceptionF("Ljava/lang/IndexOutOfBoundsException;", 836 "src.length=%d srcPos=%d dst.length=%d dstPos=%d length=%d", 837 src_array->GetLength(), src_pos, dst_array->GetLength(), dst_pos, 838 length); 839 return; 840 } 841 842 // Type checking. 843 ObjPtr<mirror::Class> src_type = shadow_frame->GetVRegReference(arg_offset)->GetClass()-> 844 GetComponentType(); 845 846 if (!src_type->IsPrimitive()) { 847 // Check that the second type is not primitive. 848 ObjPtr<mirror::Class> trg_type = shadow_frame->GetVRegReference(arg_offset + 2)->GetClass()-> 849 GetComponentType(); 850 if (trg_type->IsPrimitiveInt()) { 851 AbortTransactionOrFail(self, "Type mismatch in arraycopy: %s vs %s", 852 mirror::Class::PrettyDescriptor( 853 src_array->GetClass()->GetComponentType()).c_str(), 854 mirror::Class::PrettyDescriptor( 855 dst_array->GetClass()->GetComponentType()).c_str()); 856 return; 857 } 858 859 ObjPtr<mirror::ObjectArray<mirror::Object>> src = src_array->AsObjectArray<mirror::Object>(); 860 ObjPtr<mirror::ObjectArray<mirror::Object>> dst = dst_array->AsObjectArray<mirror::Object>(); 861 if (src == dst) { 862 // Can overlap, but not have type mismatches. 863 // We cannot use ObjectArray::MemMove here, as it doesn't support transactions. 864 const bool copy_forward = (dst_pos < src_pos) || (dst_pos - src_pos >= length); 865 if (copy_forward) { 866 for (int32_t i = 0; i < length; ++i) { 867 dst->Set(dst_pos + i, src->Get(src_pos + i)); 868 } 869 } else { 870 for (int32_t i = 1; i <= length; ++i) { 871 dst->Set(dst_pos + length - i, src->Get(src_pos + length - i)); 872 } 873 } 874 } else { 875 // We're being lazy here. Optimally this could be a memcpy (if component types are 876 // assignable), but the ObjectArray implementation doesn't support transactions. The 877 // checking version, however, does. 878 if (Runtime::Current()->IsActiveTransaction()) { 879 dst->AssignableCheckingMemcpy<true>( 880 dst_pos, src, src_pos, length, /* throw_exception= */ true); 881 } else { 882 dst->AssignableCheckingMemcpy<false>( 883 dst_pos, src, src_pos, length, /* throw_exception= */ true); 884 } 885 } 886 } else if (src_type->IsPrimitiveByte()) { 887 PrimitiveArrayCopy<uint8_t>(self, src_array, src_pos, dst_array, dst_pos, length); 888 } else if (src_type->IsPrimitiveChar()) { 889 PrimitiveArrayCopy<uint16_t>(self, src_array, src_pos, dst_array, dst_pos, length); 890 } else if (src_type->IsPrimitiveInt()) { 891 PrimitiveArrayCopy<int32_t>(self, src_array, src_pos, dst_array, dst_pos, length); 892 } else { 893 AbortTransactionOrFail(self, "Unimplemented System.arraycopy for type '%s'", 894 src_type->PrettyDescriptor().c_str()); 895 } 896 } 897 898 void UnstartedRuntime::UnstartedSystemArraycopyByte( 899 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 900 // Just forward. 901 UnstartedRuntime::UnstartedSystemArraycopy(self, shadow_frame, result, arg_offset); 902 } 903 904 void UnstartedRuntime::UnstartedSystemArraycopyChar( 905 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 906 // Just forward. 907 UnstartedRuntime::UnstartedSystemArraycopy(self, shadow_frame, result, arg_offset); 908 } 909 910 void UnstartedRuntime::UnstartedSystemArraycopyInt( 911 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 912 // Just forward. 913 UnstartedRuntime::UnstartedSystemArraycopy(self, shadow_frame, result, arg_offset); 914 } 915 916 void UnstartedRuntime::UnstartedSystemGetSecurityManager( 917 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame ATTRIBUTE_UNUSED, 918 JValue* result, size_t arg_offset ATTRIBUTE_UNUSED) { 919 result->SetL(nullptr); 920 } 921 922 static constexpr const char* kAndroidHardcodedSystemPropertiesFieldName = "STATIC_PROPERTIES"; 923 924 static void GetSystemProperty(Thread* self, 925 ShadowFrame* shadow_frame, 926 JValue* result, 927 size_t arg_offset, 928 bool is_default_version) 929 REQUIRES_SHARED(Locks::mutator_lock_) { 930 StackHandleScope<4> hs(self); 931 Handle<mirror::String> h_key( 932 hs.NewHandle(reinterpret_cast<mirror::String*>(shadow_frame->GetVRegReference(arg_offset)))); 933 if (h_key == nullptr) { 934 AbortTransactionOrFail(self, "getProperty key was null"); 935 return; 936 } 937 938 // This is overall inefficient, but reflecting the values here is not great, either. So 939 // for simplicity, and with the assumption that the number of getProperty calls is not 940 // too great, just iterate each time. 941 942 // Get the storage class. 943 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 944 Handle<mirror::Class> h_props_class(hs.NewHandle( 945 class_linker->FindClass(self, 946 "Ljava/lang/AndroidHardcodedSystemProperties;", 947 ScopedNullHandle<mirror::ClassLoader>()))); 948 if (h_props_class == nullptr) { 949 AbortTransactionOrFail(self, "Could not find AndroidHardcodedSystemProperties"); 950 return; 951 } 952 if (!class_linker->EnsureInitialized(self, h_props_class, true, true)) { 953 AbortTransactionOrFail(self, "Could not initialize AndroidHardcodedSystemProperties"); 954 return; 955 } 956 957 // Get the storage array. 958 ArtField* static_properties = 959 h_props_class->FindDeclaredStaticField(kAndroidHardcodedSystemPropertiesFieldName, 960 "[[Ljava/lang/String;"); 961 if (static_properties == nullptr) { 962 AbortTransactionOrFail(self, 963 "Could not find %s field", 964 kAndroidHardcodedSystemPropertiesFieldName); 965 return; 966 } 967 ObjPtr<mirror::Object> props = static_properties->GetObject(h_props_class.Get()); 968 Handle<mirror::ObjectArray<mirror::ObjectArray<mirror::String>>> h_2string_array(hs.NewHandle( 969 props->AsObjectArray<mirror::ObjectArray<mirror::String>>())); 970 if (h_2string_array == nullptr) { 971 AbortTransactionOrFail(self, "Field %s is null", kAndroidHardcodedSystemPropertiesFieldName); 972 return; 973 } 974 975 // Iterate over it. 976 const int32_t prop_count = h_2string_array->GetLength(); 977 // Use the third handle as mutable. 978 MutableHandle<mirror::ObjectArray<mirror::String>> h_string_array( 979 hs.NewHandle<mirror::ObjectArray<mirror::String>>(nullptr)); 980 for (int32_t i = 0; i < prop_count; ++i) { 981 h_string_array.Assign(h_2string_array->Get(i)); 982 if (h_string_array == nullptr || 983 h_string_array->GetLength() != 2 || 984 h_string_array->Get(0) == nullptr) { 985 AbortTransactionOrFail(self, 986 "Unexpected content of %s", 987 kAndroidHardcodedSystemPropertiesFieldName); 988 return; 989 } 990 if (h_key->Equals(h_string_array->Get(0))) { 991 // Found a value. 992 if (h_string_array->Get(1) == nullptr && is_default_version) { 993 // Null is being delegated to the default map, and then resolved to the given default value. 994 // As there's no default map, return the given value. 995 result->SetL(shadow_frame->GetVRegReference(arg_offset + 1)); 996 } else { 997 result->SetL(h_string_array->Get(1)); 998 } 999 return; 1000 } 1001 } 1002 1003 // Key is not supported. 1004 AbortTransactionOrFail(self, "getProperty key %s not supported", h_key->ToModifiedUtf8().c_str()); 1005 } 1006 1007 void UnstartedRuntime::UnstartedSystemGetProperty( 1008 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1009 GetSystemProperty(self, shadow_frame, result, arg_offset, false); 1010 } 1011 1012 void UnstartedRuntime::UnstartedSystemGetPropertyWithDefault( 1013 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1014 GetSystemProperty(self, shadow_frame, result, arg_offset, true); 1015 } 1016 1017 static std::string GetImmediateCaller(ShadowFrame* shadow_frame) 1018 REQUIRES_SHARED(Locks::mutator_lock_) { 1019 if (shadow_frame->GetLink() == nullptr) { 1020 return "<no caller>"; 1021 } 1022 return ArtMethod::PrettyMethod(shadow_frame->GetLink()->GetMethod()); 1023 } 1024 1025 static bool CheckCallers(ShadowFrame* shadow_frame, 1026 std::initializer_list<std::string> allowed_call_stack) 1027 REQUIRES_SHARED(Locks::mutator_lock_) { 1028 for (const std::string& allowed_caller : allowed_call_stack) { 1029 if (shadow_frame->GetLink() == nullptr) { 1030 return false; 1031 } 1032 1033 std::string found_caller = ArtMethod::PrettyMethod(shadow_frame->GetLink()->GetMethod()); 1034 if (allowed_caller != found_caller) { 1035 return false; 1036 } 1037 1038 shadow_frame = shadow_frame->GetLink(); 1039 } 1040 return true; 1041 } 1042 1043 static ObjPtr<mirror::Object> CreateInstanceOf(Thread* self, const char* class_descriptor) 1044 REQUIRES_SHARED(Locks::mutator_lock_) { 1045 // Find the requested class. 1046 ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 1047 ObjPtr<mirror::Class> klass = 1048 class_linker->FindClass(self, class_descriptor, ScopedNullHandle<mirror::ClassLoader>()); 1049 if (klass == nullptr) { 1050 AbortTransactionOrFail(self, "Could not load class %s", class_descriptor); 1051 return nullptr; 1052 } 1053 1054 StackHandleScope<2> hs(self); 1055 Handle<mirror::Class> h_class(hs.NewHandle(klass)); 1056 Handle<mirror::Object> h_obj(hs.NewHandle(h_class->AllocObject(self))); 1057 if (h_obj != nullptr) { 1058 ArtMethod* init_method = h_class->FindConstructor("()V", class_linker->GetImagePointerSize()); 1059 if (init_method == nullptr) { 1060 AbortTransactionOrFail(self, "Could not find <init> for %s", class_descriptor); 1061 return nullptr; 1062 } else { 1063 JValue invoke_result; 1064 EnterInterpreterFromInvoke(self, init_method, h_obj.Get(), nullptr, nullptr); 1065 if (!self->IsExceptionPending()) { 1066 return h_obj.Get(); 1067 } 1068 AbortTransactionOrFail(self, "Could not run <init> for %s", class_descriptor); 1069 } 1070 } 1071 AbortTransactionOrFail(self, "Could not allocate instance of %s", class_descriptor); 1072 return nullptr; 1073 } 1074 1075 void UnstartedRuntime::UnstartedThreadLocalGet( 1076 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset ATTRIBUTE_UNUSED) { 1077 if (CheckCallers(shadow_frame, { "sun.misc.FloatingDecimal$BinaryToASCIIBuffer " 1078 "sun.misc.FloatingDecimal.getBinaryToASCIIBuffer()" })) { 1079 result->SetL(CreateInstanceOf(self, "Lsun/misc/FloatingDecimal$BinaryToASCIIBuffer;")); 1080 } else { 1081 AbortTransactionOrFail(self, 1082 "ThreadLocal.get() does not support %s", 1083 GetImmediateCaller(shadow_frame).c_str()); 1084 } 1085 } 1086 1087 void UnstartedRuntime::UnstartedThreadCurrentThread( 1088 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset ATTRIBUTE_UNUSED) { 1089 if (CheckCallers(shadow_frame, 1090 { "void java.lang.Thread.init(java.lang.ThreadGroup, java.lang.Runnable, " 1091 "java.lang.String, long, java.security.AccessControlContext)", 1092 "void java.lang.Thread.init(java.lang.ThreadGroup, java.lang.Runnable, " 1093 "java.lang.String, long)", 1094 "void java.lang.Thread.<init>()", 1095 "void java.util.logging.LogManager$Cleaner.<init>(" 1096 "java.util.logging.LogManager)" })) { 1097 // Whitelist LogManager$Cleaner, which is an unstarted Thread (for a shutdown hook). The 1098 // Thread constructor only asks for the current thread to set up defaults and add the 1099 // thread as unstarted to the ThreadGroup. A faked-up main thread peer is good enough for 1100 // these purposes. 1101 Runtime::Current()->InitThreadGroups(self); 1102 jobject main_peer = 1103 self->CreateCompileTimePeer(self->GetJniEnv(), 1104 "main", 1105 false, 1106 Runtime::Current()->GetMainThreadGroup()); 1107 if (main_peer == nullptr) { 1108 AbortTransactionOrFail(self, "Failed allocating peer"); 1109 return; 1110 } 1111 1112 result->SetL(self->DecodeJObject(main_peer)); 1113 self->GetJniEnv()->DeleteLocalRef(main_peer); 1114 } else { 1115 AbortTransactionOrFail(self, 1116 "Thread.currentThread() does not support %s", 1117 GetImmediateCaller(shadow_frame).c_str()); 1118 } 1119 } 1120 1121 void UnstartedRuntime::UnstartedThreadGetNativeState( 1122 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset ATTRIBUTE_UNUSED) { 1123 if (CheckCallers(shadow_frame, 1124 { "java.lang.Thread$State java.lang.Thread.getState()", 1125 "java.lang.ThreadGroup java.lang.Thread.getThreadGroup()", 1126 "void java.lang.Thread.init(java.lang.ThreadGroup, java.lang.Runnable, " 1127 "java.lang.String, long, java.security.AccessControlContext)", 1128 "void java.lang.Thread.init(java.lang.ThreadGroup, java.lang.Runnable, " 1129 "java.lang.String, long)", 1130 "void java.lang.Thread.<init>()", 1131 "void java.util.logging.LogManager$Cleaner.<init>(" 1132 "java.util.logging.LogManager)" })) { 1133 // Whitelist reading the state of the "main" thread when creating another (unstarted) thread 1134 // for LogManager. Report the thread as "new" (it really only counts that it isn't terminated). 1135 constexpr int32_t kJavaRunnable = 1; 1136 result->SetI(kJavaRunnable); 1137 } else { 1138 AbortTransactionOrFail(self, 1139 "Thread.getNativeState() does not support %s", 1140 GetImmediateCaller(shadow_frame).c_str()); 1141 } 1142 } 1143 1144 void UnstartedRuntime::UnstartedMathCeil( 1145 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1146 result->SetD(ceil(shadow_frame->GetVRegDouble(arg_offset))); 1147 } 1148 1149 void UnstartedRuntime::UnstartedMathFloor( 1150 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1151 result->SetD(floor(shadow_frame->GetVRegDouble(arg_offset))); 1152 } 1153 1154 void UnstartedRuntime::UnstartedMathSin( 1155 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1156 result->SetD(sin(shadow_frame->GetVRegDouble(arg_offset))); 1157 } 1158 1159 void UnstartedRuntime::UnstartedMathCos( 1160 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1161 result->SetD(cos(shadow_frame->GetVRegDouble(arg_offset))); 1162 } 1163 1164 void UnstartedRuntime::UnstartedMathPow( 1165 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1166 result->SetD(pow(shadow_frame->GetVRegDouble(arg_offset), 1167 shadow_frame->GetVRegDouble(arg_offset + 2))); 1168 } 1169 1170 void UnstartedRuntime::UnstartedObjectHashCode( 1171 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1172 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset); 1173 result->SetI(obj->IdentityHashCode()); 1174 } 1175 1176 void UnstartedRuntime::UnstartedDoubleDoubleToRawLongBits( 1177 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1178 double in = shadow_frame->GetVRegDouble(arg_offset); 1179 result->SetJ(bit_cast<int64_t, double>(in)); 1180 } 1181 1182 static void UnstartedMemoryPeek( 1183 Primitive::Type type, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1184 int64_t address = shadow_frame->GetVRegLong(arg_offset); 1185 // TODO: Check that this is in the heap somewhere. Otherwise we will segfault instead of 1186 // aborting the transaction. 1187 1188 switch (type) { 1189 case Primitive::kPrimByte: { 1190 result->SetB(*reinterpret_cast<int8_t*>(static_cast<intptr_t>(address))); 1191 return; 1192 } 1193 1194 case Primitive::kPrimShort: { 1195 using unaligned_short __attribute__((__aligned__(1))) = int16_t; 1196 result->SetS(*reinterpret_cast<unaligned_short*>(static_cast<intptr_t>(address))); 1197 return; 1198 } 1199 1200 case Primitive::kPrimInt: { 1201 using unaligned_int __attribute__((__aligned__(1))) = int32_t; 1202 result->SetI(*reinterpret_cast<unaligned_int*>(static_cast<intptr_t>(address))); 1203 return; 1204 } 1205 1206 case Primitive::kPrimLong: { 1207 using unaligned_long __attribute__((__aligned__(1))) = int64_t; 1208 result->SetJ(*reinterpret_cast<unaligned_long*>(static_cast<intptr_t>(address))); 1209 return; 1210 } 1211 1212 case Primitive::kPrimBoolean: 1213 case Primitive::kPrimChar: 1214 case Primitive::kPrimFloat: 1215 case Primitive::kPrimDouble: 1216 case Primitive::kPrimVoid: 1217 case Primitive::kPrimNot: 1218 LOG(FATAL) << "Not in the Memory API: " << type; 1219 UNREACHABLE(); 1220 } 1221 LOG(FATAL) << "Should not reach here"; 1222 UNREACHABLE(); 1223 } 1224 1225 void UnstartedRuntime::UnstartedMemoryPeekByte( 1226 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1227 UnstartedMemoryPeek(Primitive::kPrimByte, shadow_frame, result, arg_offset); 1228 } 1229 1230 void UnstartedRuntime::UnstartedMemoryPeekShort( 1231 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1232 UnstartedMemoryPeek(Primitive::kPrimShort, shadow_frame, result, arg_offset); 1233 } 1234 1235 void UnstartedRuntime::UnstartedMemoryPeekInt( 1236 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1237 UnstartedMemoryPeek(Primitive::kPrimInt, shadow_frame, result, arg_offset); 1238 } 1239 1240 void UnstartedRuntime::UnstartedMemoryPeekLong( 1241 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1242 UnstartedMemoryPeek(Primitive::kPrimLong, shadow_frame, result, arg_offset); 1243 } 1244 1245 static void UnstartedMemoryPeekArray( 1246 Primitive::Type type, Thread* self, ShadowFrame* shadow_frame, size_t arg_offset) 1247 REQUIRES_SHARED(Locks::mutator_lock_) { 1248 int64_t address_long = shadow_frame->GetVRegLong(arg_offset); 1249 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 2); 1250 if (obj == nullptr) { 1251 Runtime::Current()->AbortTransactionAndThrowAbortError(self, "Null pointer in peekArray"); 1252 return; 1253 } 1254 ObjPtr<mirror::Array> array = obj->AsArray(); 1255 1256 int offset = shadow_frame->GetVReg(arg_offset + 3); 1257 int count = shadow_frame->GetVReg(arg_offset + 4); 1258 if (offset < 0 || offset + count > array->GetLength()) { 1259 std::string error_msg(StringPrintf("Array out of bounds in peekArray: %d/%d vs %d", 1260 offset, count, array->GetLength())); 1261 Runtime::Current()->AbortTransactionAndThrowAbortError(self, error_msg.c_str()); 1262 return; 1263 } 1264 1265 switch (type) { 1266 case Primitive::kPrimByte: { 1267 int8_t* address = reinterpret_cast<int8_t*>(static_cast<intptr_t>(address_long)); 1268 ObjPtr<mirror::ByteArray> byte_array = array->AsByteArray(); 1269 for (int32_t i = 0; i < count; ++i, ++address) { 1270 byte_array->SetWithoutChecks<true>(i + offset, *address); 1271 } 1272 return; 1273 } 1274 1275 case Primitive::kPrimShort: 1276 case Primitive::kPrimInt: 1277 case Primitive::kPrimLong: 1278 LOG(FATAL) << "Type unimplemented for Memory Array API, should not reach here: " << type; 1279 UNREACHABLE(); 1280 1281 case Primitive::kPrimBoolean: 1282 case Primitive::kPrimChar: 1283 case Primitive::kPrimFloat: 1284 case Primitive::kPrimDouble: 1285 case Primitive::kPrimVoid: 1286 case Primitive::kPrimNot: 1287 LOG(FATAL) << "Not in the Memory API: " << type; 1288 UNREACHABLE(); 1289 } 1290 LOG(FATAL) << "Should not reach here"; 1291 UNREACHABLE(); 1292 } 1293 1294 void UnstartedRuntime::UnstartedMemoryPeekByteArray( 1295 Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset) { 1296 UnstartedMemoryPeekArray(Primitive::kPrimByte, self, shadow_frame, arg_offset); 1297 } 1298 1299 // This allows reading the new style of String objects during compilation. 1300 void UnstartedRuntime::UnstartedStringGetCharsNoCheck( 1301 Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset) { 1302 jint start = shadow_frame->GetVReg(arg_offset + 1); 1303 jint end = shadow_frame->GetVReg(arg_offset + 2); 1304 jint index = shadow_frame->GetVReg(arg_offset + 4); 1305 ObjPtr<mirror::String> string = shadow_frame->GetVRegReference(arg_offset)->AsString(); 1306 if (string == nullptr) { 1307 AbortTransactionOrFail(self, "String.getCharsNoCheck with null object"); 1308 return; 1309 } 1310 DCHECK_GE(start, 0); 1311 DCHECK_LE(start, end); 1312 DCHECK_LE(end, string->GetLength()); 1313 StackHandleScope<1> hs(self); 1314 Handle<mirror::CharArray> h_char_array( 1315 hs.NewHandle(shadow_frame->GetVRegReference(arg_offset + 3)->AsCharArray())); 1316 DCHECK_GE(index, 0); 1317 DCHECK_LE(index, h_char_array->GetLength()); 1318 DCHECK_LE(end - start, h_char_array->GetLength() - index); 1319 string->GetChars(start, end, h_char_array, index); 1320 } 1321 1322 // This allows reading chars from the new style of String objects during compilation. 1323 void UnstartedRuntime::UnstartedStringCharAt( 1324 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1325 jint index = shadow_frame->GetVReg(arg_offset + 1); 1326 ObjPtr<mirror::String> string = shadow_frame->GetVRegReference(arg_offset)->AsString(); 1327 if (string == nullptr) { 1328 AbortTransactionOrFail(self, "String.charAt with null object"); 1329 return; 1330 } 1331 result->SetC(string->CharAt(index)); 1332 } 1333 1334 // This allows creating String objects with replaced characters during compilation. 1335 // String.doReplace(char, char) is called from String.replace(char, char) when there is a match. 1336 void UnstartedRuntime::UnstartedStringDoReplace( 1337 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1338 jchar old_c = shadow_frame->GetVReg(arg_offset + 1); 1339 jchar new_c = shadow_frame->GetVReg(arg_offset + 2); 1340 StackHandleScope<1> hs(self); 1341 Handle<mirror::String> string = 1342 hs.NewHandle(shadow_frame->GetVRegReference(arg_offset)->AsString()); 1343 if (string == nullptr) { 1344 AbortTransactionOrFail(self, "String.replaceWithMatch with null object"); 1345 return; 1346 } 1347 result->SetL(mirror::String::DoReplace(self, string, old_c, new_c)); 1348 } 1349 1350 // This allows creating the new style of String objects during compilation. 1351 void UnstartedRuntime::UnstartedStringFactoryNewStringFromChars( 1352 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1353 jint offset = shadow_frame->GetVReg(arg_offset); 1354 jint char_count = shadow_frame->GetVReg(arg_offset + 1); 1355 DCHECK_GE(char_count, 0); 1356 StackHandleScope<1> hs(self); 1357 Handle<mirror::CharArray> h_char_array( 1358 hs.NewHandle(shadow_frame->GetVRegReference(arg_offset + 2)->AsCharArray())); 1359 Runtime* runtime = Runtime::Current(); 1360 gc::AllocatorType allocator = runtime->GetHeap()->GetCurrentAllocator(); 1361 result->SetL(mirror::String::AllocFromCharArray<true>(self, char_count, h_char_array, offset, allocator)); 1362 } 1363 1364 // This allows creating the new style of String objects during compilation. 1365 void UnstartedRuntime::UnstartedStringFactoryNewStringFromString( 1366 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1367 ObjPtr<mirror::String> to_copy = shadow_frame->GetVRegReference(arg_offset)->AsString(); 1368 if (to_copy == nullptr) { 1369 AbortTransactionOrFail(self, "StringFactory.newStringFromString with null object"); 1370 return; 1371 } 1372 StackHandleScope<1> hs(self); 1373 Handle<mirror::String> h_string(hs.NewHandle(to_copy)); 1374 Runtime* runtime = Runtime::Current(); 1375 gc::AllocatorType allocator = runtime->GetHeap()->GetCurrentAllocator(); 1376 result->SetL(mirror::String::AllocFromString<true>(self, h_string->GetLength(), h_string, 0, 1377 allocator)); 1378 } 1379 1380 void UnstartedRuntime::UnstartedStringFastSubstring( 1381 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1382 jint start = shadow_frame->GetVReg(arg_offset + 1); 1383 jint length = shadow_frame->GetVReg(arg_offset + 2); 1384 DCHECK_GE(start, 0); 1385 DCHECK_GE(length, 0); 1386 StackHandleScope<1> hs(self); 1387 Handle<mirror::String> h_string( 1388 hs.NewHandle(shadow_frame->GetVRegReference(arg_offset)->AsString())); 1389 DCHECK_LE(start, h_string->GetLength()); 1390 DCHECK_LE(start + length, h_string->GetLength()); 1391 Runtime* runtime = Runtime::Current(); 1392 gc::AllocatorType allocator = runtime->GetHeap()->GetCurrentAllocator(); 1393 result->SetL(mirror::String::AllocFromString<true>(self, length, h_string, start, allocator)); 1394 } 1395 1396 // This allows getting the char array for new style of String objects during compilation. 1397 void UnstartedRuntime::UnstartedStringToCharArray( 1398 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) 1399 REQUIRES_SHARED(Locks::mutator_lock_) { 1400 ObjPtr<mirror::String> string = shadow_frame->GetVRegReference(arg_offset)->AsString(); 1401 if (string == nullptr) { 1402 AbortTransactionOrFail(self, "String.charAt with null object"); 1403 return; 1404 } 1405 result->SetL(string->ToCharArray(self)); 1406 } 1407 1408 // This allows statically initializing ConcurrentHashMap and SynchronousQueue. 1409 void UnstartedRuntime::UnstartedReferenceGetReferent( 1410 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1411 const ObjPtr<mirror::Reference> ref = down_cast<mirror::Reference*>( 1412 shadow_frame->GetVRegReference(arg_offset)); 1413 if (ref == nullptr) { 1414 AbortTransactionOrFail(self, "Reference.getReferent() with null object"); 1415 return; 1416 } 1417 const ObjPtr<mirror::Object> referent = 1418 Runtime::Current()->GetHeap()->GetReferenceProcessor()->GetReferent(self, ref); 1419 result->SetL(referent); 1420 } 1421 1422 // This allows statically initializing ConcurrentHashMap and SynchronousQueue. We use a somewhat 1423 // conservative upper bound. We restrict the callers to SynchronousQueue and ConcurrentHashMap, 1424 // where we can predict the behavior (somewhat). 1425 // Note: this is required (instead of lazy initialization) as these classes are used in the static 1426 // initialization of other classes, so will *use* the value. 1427 void UnstartedRuntime::UnstartedRuntimeAvailableProcessors( 1428 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset ATTRIBUTE_UNUSED) { 1429 if (CheckCallers(shadow_frame, { "void java.util.concurrent.SynchronousQueue.<clinit>()" })) { 1430 // SynchronousQueue really only separates between single- and multiprocessor case. Return 1431 // 8 as a conservative upper approximation. 1432 result->SetI(8); 1433 } else if (CheckCallers(shadow_frame, 1434 { "void java.util.concurrent.ConcurrentHashMap.<clinit>()" })) { 1435 // ConcurrentHashMap uses it for striding. 8 still seems an OK general value, as it's likely 1436 // a good upper bound. 1437 // TODO: Consider resetting in the zygote? 1438 result->SetI(8); 1439 } else { 1440 // Not supported. 1441 AbortTransactionOrFail(self, "Accessing availableProcessors not allowed"); 1442 } 1443 } 1444 1445 // This allows accessing ConcurrentHashMap/SynchronousQueue. 1446 1447 void UnstartedRuntime::UnstartedUnsafeCompareAndSwapLong( 1448 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1449 // Argument 0 is the Unsafe instance, skip. 1450 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 1); 1451 if (obj == nullptr) { 1452 AbortTransactionOrFail(self, "Cannot access null object, retry at runtime."); 1453 return; 1454 } 1455 int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2); 1456 int64_t expectedValue = shadow_frame->GetVRegLong(arg_offset + 4); 1457 int64_t newValue = shadow_frame->GetVRegLong(arg_offset + 6); 1458 bool success; 1459 // Check whether we're in a transaction, call accordingly. 1460 if (Runtime::Current()->IsActiveTransaction()) { 1461 success = obj->CasFieldStrongSequentiallyConsistent64<true>(MemberOffset(offset), 1462 expectedValue, 1463 newValue); 1464 } else { 1465 success = obj->CasFieldStrongSequentiallyConsistent64<false>(MemberOffset(offset), 1466 expectedValue, 1467 newValue); 1468 } 1469 result->SetZ(success ? 1 : 0); 1470 } 1471 1472 void UnstartedRuntime::UnstartedUnsafeCompareAndSwapObject( 1473 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 1474 // Argument 0 is the Unsafe instance, skip. 1475 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 1); 1476 if (obj == nullptr) { 1477 AbortTransactionOrFail(self, "Cannot access null object, retry at runtime."); 1478 return; 1479 } 1480 int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2); 1481 mirror::Object* expected_value = shadow_frame->GetVRegReference(arg_offset + 4); 1482 mirror::Object* newValue = shadow_frame->GetVRegReference(arg_offset + 5); 1483 1484 // Must use non transactional mode. 1485 if (kUseReadBarrier) { 1486 // Need to make sure the reference stored in the field is a to-space one before attempting the 1487 // CAS or the CAS could fail incorrectly. 1488 mirror::HeapReference<mirror::Object>* field_addr = 1489 reinterpret_cast<mirror::HeapReference<mirror::Object>*>( 1490 reinterpret_cast<uint8_t*>(obj) + static_cast<size_t>(offset)); 1491 ReadBarrier::Barrier< 1492 mirror::Object, 1493 /* kIsVolatile= */ false, 1494 kWithReadBarrier, 1495 /* kAlwaysUpdateField= */ true>( 1496 obj, 1497 MemberOffset(offset), 1498 field_addr); 1499 } 1500 bool success; 1501 // Check whether we're in a transaction, call accordingly. 1502 if (Runtime::Current()->IsActiveTransaction()) { 1503 success = obj->CasFieldObject<true>(MemberOffset(offset), 1504 expected_value, 1505 newValue, 1506 CASMode::kStrong, 1507 std::memory_order_seq_cst); 1508 } else { 1509 success = obj->CasFieldObject<false>(MemberOffset(offset), 1510 expected_value, 1511 newValue, 1512 CASMode::kStrong, 1513 std::memory_order_seq_cst); 1514 } 1515 result->SetZ(success ? 1 : 0); 1516 } 1517 1518 void UnstartedRuntime::UnstartedUnsafeGetObjectVolatile( 1519 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) 1520 REQUIRES_SHARED(Locks::mutator_lock_) { 1521 // Argument 0 is the Unsafe instance, skip. 1522 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 1); 1523 if (obj == nullptr) { 1524 AbortTransactionOrFail(self, "Cannot access null object, retry at runtime."); 1525 return; 1526 } 1527 int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2); 1528 ObjPtr<mirror::Object> value = obj->GetFieldObjectVolatile<mirror::Object>(MemberOffset(offset)); 1529 result->SetL(value); 1530 } 1531 1532 void UnstartedRuntime::UnstartedUnsafePutObjectVolatile( 1533 Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset) 1534 REQUIRES_SHARED(Locks::mutator_lock_) { 1535 // Argument 0 is the Unsafe instance, skip. 1536 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 1); 1537 if (obj == nullptr) { 1538 AbortTransactionOrFail(self, "Cannot access null object, retry at runtime."); 1539 return; 1540 } 1541 int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2); 1542 mirror::Object* value = shadow_frame->GetVRegReference(arg_offset + 4); 1543 if (Runtime::Current()->IsActiveTransaction()) { 1544 obj->SetFieldObjectVolatile<true>(MemberOffset(offset), value); 1545 } else { 1546 obj->SetFieldObjectVolatile<false>(MemberOffset(offset), value); 1547 } 1548 } 1549 1550 void UnstartedRuntime::UnstartedUnsafePutOrderedObject( 1551 Thread* self, ShadowFrame* shadow_frame, JValue* result ATTRIBUTE_UNUSED, size_t arg_offset) 1552 REQUIRES_SHARED(Locks::mutator_lock_) { 1553 // Argument 0 is the Unsafe instance, skip. 1554 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset + 1); 1555 if (obj == nullptr) { 1556 AbortTransactionOrFail(self, "Cannot access null object, retry at runtime."); 1557 return; 1558 } 1559 int64_t offset = shadow_frame->GetVRegLong(arg_offset + 2); 1560 mirror::Object* newValue = shadow_frame->GetVRegReference(arg_offset + 4); 1561 std::atomic_thread_fence(std::memory_order_release); 1562 if (Runtime::Current()->IsActiveTransaction()) { 1563 obj->SetFieldObject<true>(MemberOffset(offset), newValue); 1564 } else { 1565 obj->SetFieldObject<false>(MemberOffset(offset), newValue); 1566 } 1567 } 1568 1569 // A cutout for Integer.parseInt(String). Note: this code is conservative and will bail instead 1570 // of correctly handling the corner cases. 1571 void UnstartedRuntime::UnstartedIntegerParseInt( 1572 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) 1573 REQUIRES_SHARED(Locks::mutator_lock_) { 1574 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset); 1575 if (obj == nullptr) { 1576 AbortTransactionOrFail(self, "Cannot parse null string, retry at runtime."); 1577 return; 1578 } 1579 1580 std::string string_value = obj->AsString()->ToModifiedUtf8(); 1581 if (string_value.empty()) { 1582 AbortTransactionOrFail(self, "Cannot parse empty string, retry at runtime."); 1583 return; 1584 } 1585 1586 const char* c_str = string_value.c_str(); 1587 char *end; 1588 // Can we set errno to 0? Is this always a variable, and not a macro? 1589 // Worst case, we'll incorrectly fail a transaction. Seems OK. 1590 int64_t l = strtol(c_str, &end, 10); 1591 1592 if ((errno == ERANGE && l == LONG_MAX) || l > std::numeric_limits<int32_t>::max() || 1593 (errno == ERANGE && l == LONG_MIN) || l < std::numeric_limits<int32_t>::min()) { 1594 AbortTransactionOrFail(self, "Cannot parse string %s, retry at runtime.", c_str); 1595 return; 1596 } 1597 if (l == 0) { 1598 // Check whether the string wasn't exactly zero. 1599 if (string_value != "0") { 1600 AbortTransactionOrFail(self, "Cannot parse string %s, retry at runtime.", c_str); 1601 return; 1602 } 1603 } else if (*end != '\0') { 1604 AbortTransactionOrFail(self, "Cannot parse string %s, retry at runtime.", c_str); 1605 return; 1606 } 1607 1608 result->SetI(static_cast<int32_t>(l)); 1609 } 1610 1611 // A cutout for Long.parseLong. 1612 // 1613 // Note: for now use code equivalent to Integer.parseInt, as the full range may not be supported 1614 // well. 1615 void UnstartedRuntime::UnstartedLongParseLong( 1616 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) 1617 REQUIRES_SHARED(Locks::mutator_lock_) { 1618 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset); 1619 if (obj == nullptr) { 1620 AbortTransactionOrFail(self, "Cannot parse null string, retry at runtime."); 1621 return; 1622 } 1623 1624 std::string string_value = obj->AsString()->ToModifiedUtf8(); 1625 if (string_value.empty()) { 1626 AbortTransactionOrFail(self, "Cannot parse empty string, retry at runtime."); 1627 return; 1628 } 1629 1630 const char* c_str = string_value.c_str(); 1631 char *end; 1632 // Can we set errno to 0? Is this always a variable, and not a macro? 1633 // Worst case, we'll incorrectly fail a transaction. Seems OK. 1634 int64_t l = strtol(c_str, &end, 10); 1635 1636 // Note: comparing against int32_t min/max is intentional here. 1637 if ((errno == ERANGE && l == LONG_MAX) || l > std::numeric_limits<int32_t>::max() || 1638 (errno == ERANGE && l == LONG_MIN) || l < std::numeric_limits<int32_t>::min()) { 1639 AbortTransactionOrFail(self, "Cannot parse string %s, retry at runtime.", c_str); 1640 return; 1641 } 1642 if (l == 0) { 1643 // Check whether the string wasn't exactly zero. 1644 if (string_value != "0") { 1645 AbortTransactionOrFail(self, "Cannot parse string %s, retry at runtime.", c_str); 1646 return; 1647 } 1648 } else if (*end != '\0') { 1649 AbortTransactionOrFail(self, "Cannot parse string %s, retry at runtime.", c_str); 1650 return; 1651 } 1652 1653 result->SetJ(l); 1654 } 1655 1656 void UnstartedRuntime::UnstartedMethodInvoke( 1657 Thread* self, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) 1658 REQUIRES_SHARED(Locks::mutator_lock_) { 1659 JNIEnvExt* env = self->GetJniEnv(); 1660 ScopedObjectAccessUnchecked soa(self); 1661 1662 ObjPtr<mirror::Object> java_method_obj = shadow_frame->GetVRegReference(arg_offset); 1663 ScopedLocalRef<jobject> java_method(env, 1664 java_method_obj == nullptr ? nullptr : env->AddLocalReference<jobject>(java_method_obj)); 1665 1666 ObjPtr<mirror::Object> java_receiver_obj = shadow_frame->GetVRegReference(arg_offset + 1); 1667 ScopedLocalRef<jobject> java_receiver(env, 1668 java_receiver_obj == nullptr ? nullptr : env->AddLocalReference<jobject>(java_receiver_obj)); 1669 1670 ObjPtr<mirror::Object> java_args_obj = shadow_frame->GetVRegReference(arg_offset + 2); 1671 ScopedLocalRef<jobject> java_args(env, 1672 java_args_obj == nullptr ? nullptr : env->AddLocalReference<jobject>(java_args_obj)); 1673 1674 ScopedLocalRef<jobject> result_jobj(env, 1675 InvokeMethod(soa, java_method.get(), java_receiver.get(), java_args.get())); 1676 1677 result->SetL(self->DecodeJObject(result_jobj.get())); 1678 1679 // Conservatively flag all exceptions as transaction aborts. This way we don't need to unwrap 1680 // InvocationTargetExceptions. 1681 if (self->IsExceptionPending()) { 1682 AbortTransactionOrFail(self, "Failed Method.invoke"); 1683 } 1684 } 1685 1686 void UnstartedRuntime::UnstartedSystemIdentityHashCode( 1687 Thread* self ATTRIBUTE_UNUSED, ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) 1688 REQUIRES_SHARED(Locks::mutator_lock_) { 1689 mirror::Object* obj = shadow_frame->GetVRegReference(arg_offset); 1690 result->SetI((obj != nullptr) ? obj->IdentityHashCode() : 0); 1691 } 1692 1693 // Checks whether the runtime is s64-bit. This is needed for the clinit of 1694 // java.lang.invoke.VarHandle clinit. The clinit determines sets of 1695 // available VarHandle accessors and these differ based on machine 1696 // word size. 1697 void UnstartedRuntime::UnstartedJNIVMRuntimeIs64Bit( 1698 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1699 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1700 PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); 1701 jboolean is64bit = (pointer_size == PointerSize::k64) ? JNI_TRUE : JNI_FALSE; 1702 result->SetZ(is64bit); 1703 } 1704 1705 void UnstartedRuntime::UnstartedJNIVMRuntimeNewUnpaddedArray( 1706 Thread* self, 1707 ArtMethod* method ATTRIBUTE_UNUSED, 1708 mirror::Object* receiver ATTRIBUTE_UNUSED, 1709 uint32_t* args, 1710 JValue* result) { 1711 int32_t length = args[1]; 1712 DCHECK_GE(length, 0); 1713 ObjPtr<mirror::Object> element_class = reinterpret_cast32<mirror::Object*>(args[0])->AsClass(); 1714 if (element_class == nullptr) { 1715 AbortTransactionOrFail(self, "VMRuntime.newUnpaddedArray with null element_class."); 1716 return; 1717 } 1718 Runtime* runtime = Runtime::Current(); 1719 ObjPtr<mirror::Class> array_class = 1720 runtime->GetClassLinker()->FindArrayClass(self, element_class->AsClass()); 1721 DCHECK(array_class != nullptr); 1722 gc::AllocatorType allocator = runtime->GetHeap()->GetCurrentAllocator(); 1723 result->SetL(mirror::Array::Alloc<true, true>(self, 1724 array_class, 1725 length, 1726 array_class->GetComponentSizeShift(), 1727 allocator)); 1728 } 1729 1730 void UnstartedRuntime::UnstartedJNIVMStackGetCallingClassLoader( 1731 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1732 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1733 result->SetL(nullptr); 1734 } 1735 1736 void UnstartedRuntime::UnstartedJNIVMStackGetStackClass2( 1737 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver ATTRIBUTE_UNUSED, 1738 uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1739 NthCallerVisitor visitor(self, 3); 1740 visitor.WalkStack(); 1741 if (visitor.caller != nullptr) { 1742 result->SetL(visitor.caller->GetDeclaringClass()); 1743 } 1744 } 1745 1746 void UnstartedRuntime::UnstartedJNIMathLog( 1747 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1748 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args, JValue* result) { 1749 JValue value; 1750 value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1751 result->SetD(log(value.GetD())); 1752 } 1753 1754 void UnstartedRuntime::UnstartedJNIMathExp( 1755 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1756 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args, JValue* result) { 1757 JValue value; 1758 value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1759 result->SetD(exp(value.GetD())); 1760 } 1761 1762 void UnstartedRuntime::UnstartedJNIAtomicLongVMSupportsCS8( 1763 Thread* self ATTRIBUTE_UNUSED, 1764 ArtMethod* method ATTRIBUTE_UNUSED, 1765 mirror::Object* receiver ATTRIBUTE_UNUSED, 1766 uint32_t* args ATTRIBUTE_UNUSED, 1767 JValue* result) { 1768 result->SetZ(QuasiAtomic::LongAtomicsUseMutexes(Runtime::Current()->GetInstructionSet()) 1769 ? 0 1770 : 1); 1771 } 1772 1773 void UnstartedRuntime::UnstartedJNIClassGetNameNative( 1774 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver, 1775 uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1776 StackHandleScope<1> hs(self); 1777 result->SetL(mirror::Class::ComputeName(hs.NewHandle(receiver->AsClass()))); 1778 } 1779 1780 void UnstartedRuntime::UnstartedJNIDoubleLongBitsToDouble( 1781 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1782 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args, JValue* result) { 1783 uint64_t long_input = args[0] | (static_cast<uint64_t>(args[1]) << 32); 1784 result->SetD(bit_cast<double>(long_input)); 1785 } 1786 1787 void UnstartedRuntime::UnstartedJNIFloatFloatToRawIntBits( 1788 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1789 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args, JValue* result) { 1790 result->SetI(args[0]); 1791 } 1792 1793 void UnstartedRuntime::UnstartedJNIFloatIntBitsToFloat( 1794 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1795 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args, JValue* result) { 1796 result->SetI(args[0]); 1797 } 1798 1799 void UnstartedRuntime::UnstartedJNIObjectInternalClone( 1800 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver, 1801 uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1802 result->SetL(receiver->Clone(self)); 1803 } 1804 1805 void UnstartedRuntime::UnstartedJNIObjectNotifyAll( 1806 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver, 1807 uint32_t* args ATTRIBUTE_UNUSED, JValue* result ATTRIBUTE_UNUSED) { 1808 receiver->NotifyAll(self); 1809 } 1810 1811 void UnstartedRuntime::UnstartedJNIStringCompareTo(Thread* self, 1812 ArtMethod* method ATTRIBUTE_UNUSED, 1813 mirror::Object* receiver, 1814 uint32_t* args, 1815 JValue* result) { 1816 ObjPtr<mirror::Object> rhs = reinterpret_cast32<mirror::Object*>(args[0]); 1817 if (rhs == nullptr) { 1818 AbortTransactionOrFail(self, "String.compareTo with null object."); 1819 return; 1820 } 1821 result->SetI(receiver->AsString()->CompareTo(rhs->AsString())); 1822 } 1823 1824 void UnstartedRuntime::UnstartedJNIStringIntern( 1825 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver, 1826 uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1827 result->SetL(receiver->AsString()->Intern()); 1828 } 1829 1830 void UnstartedRuntime::UnstartedJNIArrayCreateMultiArray( 1831 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver ATTRIBUTE_UNUSED, 1832 uint32_t* args, JValue* result) { 1833 StackHandleScope<2> hs(self); 1834 auto h_class(hs.NewHandle(reinterpret_cast<mirror::Class*>(args[0])->AsClass())); 1835 auto h_dimensions(hs.NewHandle(reinterpret_cast<mirror::IntArray*>(args[1])->AsIntArray())); 1836 result->SetL(mirror::Array::CreateMultiArray(self, h_class, h_dimensions)); 1837 } 1838 1839 void UnstartedRuntime::UnstartedJNIArrayCreateObjectArray( 1840 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver ATTRIBUTE_UNUSED, 1841 uint32_t* args, JValue* result) { 1842 int32_t length = static_cast<int32_t>(args[1]); 1843 if (length < 0) { 1844 ThrowNegativeArraySizeException(length); 1845 return; 1846 } 1847 ObjPtr<mirror::Class> element_class = reinterpret_cast<mirror::Class*>(args[0])->AsClass(); 1848 Runtime* runtime = Runtime::Current(); 1849 ClassLinker* class_linker = runtime->GetClassLinker(); 1850 ObjPtr<mirror::Class> array_class = class_linker->FindArrayClass(self, element_class); 1851 if (UNLIKELY(array_class == nullptr)) { 1852 CHECK(self->IsExceptionPending()); 1853 return; 1854 } 1855 DCHECK(array_class->IsObjectArrayClass()); 1856 ObjPtr<mirror::Array> new_array = mirror::ObjectArray<mirror::Object>::Alloc( 1857 self, array_class, length, runtime->GetHeap()->GetCurrentAllocator()); 1858 result->SetL(new_array); 1859 } 1860 1861 void UnstartedRuntime::UnstartedJNIThrowableNativeFillInStackTrace( 1862 Thread* self, ArtMethod* method ATTRIBUTE_UNUSED, mirror::Object* receiver ATTRIBUTE_UNUSED, 1863 uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1864 ScopedObjectAccessUnchecked soa(self); 1865 if (Runtime::Current()->IsActiveTransaction()) { 1866 result->SetL(soa.Decode<mirror::Object>(self->CreateInternalStackTrace<true>(soa))); 1867 } else { 1868 result->SetL(soa.Decode<mirror::Object>(self->CreateInternalStackTrace<false>(soa))); 1869 } 1870 } 1871 1872 void UnstartedRuntime::UnstartedJNIByteOrderIsLittleEndian( 1873 Thread* self ATTRIBUTE_UNUSED, ArtMethod* method ATTRIBUTE_UNUSED, 1874 mirror::Object* receiver ATTRIBUTE_UNUSED, uint32_t* args ATTRIBUTE_UNUSED, JValue* result) { 1875 result->SetZ(JNI_TRUE); 1876 } 1877 1878 void UnstartedRuntime::UnstartedJNIUnsafeCompareAndSwapInt( 1879 Thread* self, 1880 ArtMethod* method ATTRIBUTE_UNUSED, 1881 mirror::Object* receiver ATTRIBUTE_UNUSED, 1882 uint32_t* args, 1883 JValue* result) { 1884 ObjPtr<mirror::Object> obj = reinterpret_cast32<mirror::Object*>(args[0]); 1885 if (obj == nullptr) { 1886 AbortTransactionOrFail(self, "Unsafe.compareAndSwapInt with null object."); 1887 return; 1888 } 1889 jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 1890 jint expectedValue = args[3]; 1891 jint newValue = args[4]; 1892 bool success; 1893 if (Runtime::Current()->IsActiveTransaction()) { 1894 success = obj->CasField32<true>(MemberOffset(offset), 1895 expectedValue, 1896 newValue, 1897 CASMode::kStrong, 1898 std::memory_order_seq_cst); 1899 } else { 1900 success = obj->CasField32<false>(MemberOffset(offset), 1901 expectedValue, 1902 newValue, 1903 CASMode::kStrong, 1904 std::memory_order_seq_cst); 1905 } 1906 result->SetZ(success ? JNI_TRUE : JNI_FALSE); 1907 } 1908 1909 void UnstartedRuntime::UnstartedJNIUnsafeGetIntVolatile(Thread* self, 1910 ArtMethod* method ATTRIBUTE_UNUSED, 1911 mirror::Object* receiver ATTRIBUTE_UNUSED, 1912 uint32_t* args, 1913 JValue* result) { 1914 ObjPtr<mirror::Object> obj = reinterpret_cast32<mirror::Object*>(args[0]); 1915 if (obj == nullptr) { 1916 AbortTransactionOrFail(self, "Unsafe.compareAndSwapIntVolatile with null object."); 1917 return; 1918 } 1919 1920 jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 1921 result->SetI(obj->GetField32Volatile(MemberOffset(offset))); 1922 } 1923 1924 void UnstartedRuntime::UnstartedJNIUnsafePutObject(Thread* self, 1925 ArtMethod* method ATTRIBUTE_UNUSED, 1926 mirror::Object* receiver ATTRIBUTE_UNUSED, 1927 uint32_t* args, 1928 JValue* result ATTRIBUTE_UNUSED) { 1929 ObjPtr<mirror::Object> obj = reinterpret_cast32<mirror::Object*>(args[0]); 1930 if (obj == nullptr) { 1931 AbortTransactionOrFail(self, "Unsafe.putObject with null object."); 1932 return; 1933 } 1934 jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 1935 ObjPtr<mirror::Object> newValue = reinterpret_cast32<mirror::Object*>(args[3]); 1936 if (Runtime::Current()->IsActiveTransaction()) { 1937 obj->SetFieldObject<true>(MemberOffset(offset), newValue); 1938 } else { 1939 obj->SetFieldObject<false>(MemberOffset(offset), newValue); 1940 } 1941 } 1942 1943 void UnstartedRuntime::UnstartedJNIUnsafeGetArrayBaseOffsetForComponentType( 1944 Thread* self, 1945 ArtMethod* method ATTRIBUTE_UNUSED, 1946 mirror::Object* receiver ATTRIBUTE_UNUSED, 1947 uint32_t* args, 1948 JValue* result) { 1949 ObjPtr<mirror::Object> component = reinterpret_cast32<mirror::Object*>(args[0]); 1950 if (component == nullptr) { 1951 AbortTransactionOrFail(self, "Unsafe.getArrayBaseOffsetForComponentType with null component."); 1952 return; 1953 } 1954 Primitive::Type primitive_type = component->AsClass()->GetPrimitiveType(); 1955 result->SetI(mirror::Array::DataOffset(Primitive::ComponentSize(primitive_type)).Int32Value()); 1956 } 1957 1958 void UnstartedRuntime::UnstartedJNIUnsafeGetArrayIndexScaleForComponentType( 1959 Thread* self, 1960 ArtMethod* method ATTRIBUTE_UNUSED, 1961 mirror::Object* receiver ATTRIBUTE_UNUSED, 1962 uint32_t* args, 1963 JValue* result) { 1964 ObjPtr<mirror::Object> component = reinterpret_cast32<mirror::Object*>(args[0]); 1965 if (component == nullptr) { 1966 AbortTransactionOrFail(self, "Unsafe.getArrayIndexScaleForComponentType with null component."); 1967 return; 1968 } 1969 Primitive::Type primitive_type = component->AsClass()->GetPrimitiveType(); 1970 result->SetI(Primitive::ComponentSize(primitive_type)); 1971 } 1972 1973 using InvokeHandler = void(*)(Thread* self, 1974 ShadowFrame* shadow_frame, 1975 JValue* result, 1976 size_t arg_size); 1977 1978 using JNIHandler = void(*)(Thread* self, 1979 ArtMethod* method, 1980 mirror::Object* receiver, 1981 uint32_t* args, 1982 JValue* result); 1983 1984 static bool tables_initialized_ = false; 1985 static std::unordered_map<std::string, InvokeHandler> invoke_handlers_; 1986 static std::unordered_map<std::string, JNIHandler> jni_handlers_; 1987 1988 void UnstartedRuntime::InitializeInvokeHandlers() { 1989 #define UNSTARTED_DIRECT(ShortName, Sig) \ 1990 invoke_handlers_.insert(std::make_pair(Sig, & UnstartedRuntime::Unstarted ## ShortName)); 1991 #include "unstarted_runtime_list.h" 1992 UNSTARTED_RUNTIME_DIRECT_LIST(UNSTARTED_DIRECT) 1993 #undef UNSTARTED_RUNTIME_DIRECT_LIST 1994 #undef UNSTARTED_RUNTIME_JNI_LIST 1995 #undef UNSTARTED_DIRECT 1996 } 1997 1998 void UnstartedRuntime::InitializeJNIHandlers() { 1999 #define UNSTARTED_JNI(ShortName, Sig) \ 2000 jni_handlers_.insert(std::make_pair(Sig, & UnstartedRuntime::UnstartedJNI ## ShortName)); 2001 #include "unstarted_runtime_list.h" 2002 UNSTARTED_RUNTIME_JNI_LIST(UNSTARTED_JNI) 2003 #undef UNSTARTED_RUNTIME_DIRECT_LIST 2004 #undef UNSTARTED_RUNTIME_JNI_LIST 2005 #undef UNSTARTED_JNI 2006 } 2007 2008 void UnstartedRuntime::Initialize() { 2009 CHECK(!tables_initialized_); 2010 2011 InitializeInvokeHandlers(); 2012 InitializeJNIHandlers(); 2013 2014 tables_initialized_ = true; 2015 } 2016 2017 void UnstartedRuntime::Invoke(Thread* self, const CodeItemDataAccessor& accessor, 2018 ShadowFrame* shadow_frame, JValue* result, size_t arg_offset) { 2019 // In a runtime that's not started we intercept certain methods to avoid complicated dependency 2020 // problems in core libraries. 2021 CHECK(tables_initialized_); 2022 2023 std::string name(ArtMethod::PrettyMethod(shadow_frame->GetMethod())); 2024 const auto& iter = invoke_handlers_.find(name); 2025 if (iter != invoke_handlers_.end()) { 2026 // Clear out the result in case it's not zeroed out. 2027 result->SetL(nullptr); 2028 2029 // Push the shadow frame. This is so the failing method can be seen in abort dumps. 2030 self->PushShadowFrame(shadow_frame); 2031 2032 (*iter->second)(self, shadow_frame, result, arg_offset); 2033 2034 self->PopShadowFrame(); 2035 } else { 2036 // Not special, continue with regular interpreter execution. 2037 ArtInterpreterToInterpreterBridge(self, accessor, shadow_frame, result); 2038 } 2039 } 2040 2041 // Hand select a number of methods to be run in a not yet started runtime without using JNI. 2042 void UnstartedRuntime::Jni(Thread* self, ArtMethod* method, mirror::Object* receiver, 2043 uint32_t* args, JValue* result) { 2044 std::string name(ArtMethod::PrettyMethod(method)); 2045 const auto& iter = jni_handlers_.find(name); 2046 if (iter != jni_handlers_.end()) { 2047 // Clear out the result in case it's not zeroed out. 2048 result->SetL(nullptr); 2049 (*iter->second)(self, method, receiver, args, result); 2050 } else if (Runtime::Current()->IsActiveTransaction()) { 2051 AbortTransactionF(self, "Attempt to invoke native method in non-started runtime: %s", 2052 name.c_str()); 2053 } else { 2054 LOG(FATAL) << "Calling native method " << ArtMethod::PrettyMethod(method) << " in an unstarted " 2055 "non-transactional runtime"; 2056 } 2057 } 2058 2059 } // namespace interpreter 2060 } // namespace art 2061