Clean up decoding well-known classes.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: I27b4e8f5513511ce1c320e3224dd9c2a40880b69
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index bc0ac6b..f76fe2a 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -1403,10 +1403,9 @@
}
}
-bool ClassLinker::IsBootClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
- ObjPtr<mirror::ClassLoader> class_loader) {
+bool ClassLinker::IsBootClassLoader(ObjPtr<mirror::ClassLoader> class_loader) {
return class_loader == nullptr ||
- soa.Decode<mirror::Class>(WellKnownClasses::java_lang_BootClassLoader) ==
+ WellKnownClasses::ToClass(WellKnownClasses::java_lang_BootClassLoader) ==
class_loader->GetClass();
}
@@ -2020,9 +2019,8 @@
}
if (app_image) {
- ScopedObjectAccessUnchecked soa(Thread::Current());
- ScopedAssertNoThreadSuspension sants("Checking app image", soa.Self());
- if (IsBootClassLoader(soa, image_class_loader.Get())) {
+ ScopedAssertNoThreadSuspension sants("Checking app image");
+ if (IsBootClassLoader(image_class_loader.Get())) {
*error_msg = "Unexpected BootClassLoader in app image";
return false;
}
@@ -2731,18 +2729,16 @@
} \
} while (0)
-bool ClassLinker::FindClassInSharedLibraries(ScopedObjectAccessAlreadyRunnable& soa,
- Thread* self,
+bool ClassLinker::FindClassInSharedLibraries(Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
/*out*/ ObjPtr<mirror::Class>* result) {
ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
- return FindClassInSharedLibrariesHelper(soa, self, descriptor, hash, class_loader, field, result);
+ return FindClassInSharedLibrariesHelper(self, descriptor, hash, class_loader, field, result);
}
-bool ClassLinker::FindClassInSharedLibrariesHelper(ScopedObjectAccessAlreadyRunnable& soa,
- Thread* self,
+bool ClassLinker::FindClassInSharedLibrariesHelper(Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
@@ -2760,37 +2756,35 @@
for (auto loader : shared_libraries.Iterate<mirror::ClassLoader>()) {
temp_loader.Assign(loader);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInBaseDexClassLoader(soa, self, descriptor, hash, temp_loader, result),
+ FindClassInBaseDexClassLoader(self, descriptor, hash, temp_loader, result),
*result,
self);
}
return true;
}
-bool ClassLinker::FindClassInSharedLibrariesAfter(ScopedObjectAccessAlreadyRunnable& soa,
- Thread* self,
+bool ClassLinker::FindClassInSharedLibrariesAfter(Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
/*out*/ ObjPtr<mirror::Class>* result) {
ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoadersAfter;
- return FindClassInSharedLibrariesHelper(soa, self, descriptor, hash, class_loader, field, result);
+ return FindClassInSharedLibrariesHelper(self, descriptor, hash, class_loader, field, result);
}
-bool ClassLinker::FindClassInBaseDexClassLoader(ScopedObjectAccessAlreadyRunnable& soa,
- Thread* self,
+bool ClassLinker::FindClassInBaseDexClassLoader(Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
/*out*/ ObjPtr<mirror::Class>* result) {
// Termination case: boot class loader.
- if (IsBootClassLoader(soa, class_loader.Get())) {
+ if (IsBootClassLoader(class_loader.Get())) {
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
FindClassInBootClassLoaderClassPath(self, descriptor, hash, result), *result, self);
return true;
}
- if (IsPathOrDexClassLoader(soa, class_loader) || IsInMemoryDexClassLoader(soa, class_loader)) {
+ if (IsPathOrDexClassLoader(class_loader) || IsInMemoryDexClassLoader(class_loader)) {
// For regular path or dex class loader the search order is:
// - parent
// - shared libraries
@@ -2800,19 +2794,19 @@
StackHandleScope<1> hs(self);
Handle<mirror::ClassLoader> h_parent(hs.NewHandle(class_loader->GetParent()));
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInBaseDexClassLoader(soa, self, descriptor, hash, h_parent, result),
+ FindClassInBaseDexClassLoader(self, descriptor, hash, h_parent, result),
*result,
self);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInSharedLibraries(soa, self, descriptor, hash, class_loader, result),
+ FindClassInSharedLibraries(self, descriptor, hash, class_loader, result),
*result,
self);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInBaseDexClassLoaderClassPath(soa, descriptor, hash, class_loader, result),
+ FindClassInBaseDexClassLoaderClassPath(self, descriptor, hash, class_loader, result),
*result,
self);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInSharedLibrariesAfter(soa, self, descriptor, hash, class_loader, result),
+ FindClassInSharedLibrariesAfter(self, descriptor, hash, class_loader, result),
*result,
self);
// We did not find a class, but the class loader chain was recognized, so we
@@ -2820,7 +2814,7 @@
return true;
}
- if (IsDelegateLastClassLoader(soa, class_loader)) {
+ if (IsDelegateLastClassLoader(class_loader)) {
// For delegate last, the search order is:
// - boot class path
// - shared libraries
@@ -2829,15 +2823,15 @@
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
FindClassInBootClassLoaderClassPath(self, descriptor, hash, result), *result, self);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInSharedLibraries(soa, self, descriptor, hash, class_loader, result),
+ FindClassInSharedLibraries(self, descriptor, hash, class_loader, result),
*result,
self);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInBaseDexClassLoaderClassPath(soa, descriptor, hash, class_loader, result),
+ FindClassInBaseDexClassLoaderClassPath(self, descriptor, hash, class_loader, result),
*result,
self);
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInSharedLibrariesAfter(soa, self, descriptor, hash, class_loader, result),
+ FindClassInSharedLibrariesAfter(self, descriptor, hash, class_loader, result),
*result,
self);
@@ -2845,7 +2839,7 @@
StackHandleScope<1> hs(self);
Handle<mirror::ClassLoader> h_parent(hs.NewHandle(class_loader->GetParent()));
RETURN_IF_UNRECOGNIZED_OR_FOUND_OR_EXCEPTION(
- FindClassInBaseDexClassLoader(soa, self, descriptor, hash, h_parent, result),
+ FindClassInBaseDexClassLoader(self, descriptor, hash, h_parent, result),
*result,
self);
// We did not find a class, but the class loader chain was recognized, so we
@@ -2914,14 +2908,14 @@
}
bool ClassLinker::FindClassInBaseDexClassLoaderClassPath(
- ScopedObjectAccessAlreadyRunnable& soa,
+ Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
/*out*/ ObjPtr<mirror::Class>* result) {
- DCHECK(IsPathOrDexClassLoader(soa, class_loader) ||
- IsInMemoryDexClassLoader(soa, class_loader) ||
- IsDelegateLastClassLoader(soa, class_loader))
+ DCHECK(IsPathOrDexClassLoader(class_loader) ||
+ IsInMemoryDexClassLoader(class_loader) ||
+ IsDelegateLastClassLoader(class_loader))
<< "Unexpected class loader for descriptor " << descriptor;
const DexFile* dex_file = nullptr;
@@ -2936,15 +2930,15 @@
}
return true; // Continue with the next DexFile.
};
- VisitClassLoaderDexFiles(soa, class_loader, find_class_def);
+ VisitClassLoaderDexFiles(self, class_loader, find_class_def);
if (class_def != nullptr) {
- *result = DefineClass(soa.Self(), descriptor, hash, class_loader, *dex_file, *class_def);
+ *result = DefineClass(self, descriptor, hash, class_loader, *dex_file, *class_def);
if (UNLIKELY(*result == nullptr)) {
- CHECK(soa.Self()->IsExceptionPending()) << descriptor;
- FilterDexFileCaughtExceptions(soa.Self(), this);
+ CHECK(self->IsExceptionPending()) << descriptor;
+ FilterDexFileCaughtExceptions(self, this);
} else {
- DCHECK(!soa.Self()->IsExceptionPending());
+ DCHECK(!self->IsExceptionPending());
}
}
// A BaseDexClassLoader is always a known lookup.
@@ -3000,7 +2994,7 @@
} else {
ScopedObjectAccessUnchecked soa(self);
bool known_hierarchy =
- FindClassInBaseDexClassLoader(soa, self, descriptor, hash, class_loader, &result_ptr);
+ FindClassInBaseDexClassLoader(self, descriptor, hash, class_loader, &result_ptr);
if (result_ptr != nullptr) {
// The chain was understood and we found the class. We still need to add the class to
// the class table to protect from racy programs that can try and redefine the path list
@@ -10192,7 +10186,7 @@
DCHECK(parent_field != nullptr);
if (parent_loader.Get() == nullptr) {
ScopedObjectAccessUnchecked soa(self);
- ObjPtr<mirror::Object> boot_loader(soa.Decode<mirror::Class>(
+ ObjPtr<mirror::Object> boot_loader(WellKnownClasses::ToClass(
WellKnownClasses::java_lang_BootClassLoader)->AllocObject(self));
parent_field->SetObject<false>(h_class_loader.Get(), boot_loader);
} else {