diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-08-23 16:37:27 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-08-23 16:54:24 -0700 |
commit | bf99f77dda749e2b653e8c45259b1fb56e7bb012 (patch) | |
tree | 98addbb3533c745781bc26e4a55cbbdd6d6e97e7 | |
parent | 762f0a5bdd238458bbb463a9565388f2047a98d4 (diff) | |
download | android_art-bf99f77dda749e2b653e8c45259b1fb56e7bb012.tar.gz android_art-bf99f77dda749e2b653e8c45259b1fb56e7bb012.tar.bz2 android_art-bf99f77dda749e2b653e8c45259b1fb56e7bb012.zip |
Clean up Handle usage.
Prefer using ConstHandle instead of Handle as function arguments
since you can't assign new references to ConstHandle which helps
prevent bugs.
Changed NullHandle to be a ConstHandle so that you can never modify
it to be a non null reference.
Change-Id: I81cb979f6f8d5b49e5614966a2caf28c3701dd4f
-rw-r--r-- | compiler/common_compiler_test.cc | 8 | ||||
-rw-r--r-- | compiler/common_compiler_test.h | 4 | ||||
-rw-r--r-- | oatdump/oatdump.cc | 16 | ||||
-rw-r--r-- | runtime/class_linker.cc | 106 | ||||
-rw-r--r-- | runtime/class_linker.h | 98 | ||||
-rw-r--r-- | runtime/debugger.cc | 2 | ||||
-rw-r--r-- | runtime/handle.h | 4 | ||||
-rw-r--r-- | runtime/interpreter/interpreter_common.cc | 4 | ||||
-rw-r--r-- | runtime/mirror/class.cc | 3 | ||||
-rw-r--r-- | runtime/mirror/class.h | 5 | ||||
-rw-r--r-- | runtime/object_lock.cc | 2 | ||||
-rw-r--r-- | runtime/object_lock.h | 4 | ||||
-rw-r--r-- | runtime/quick_exception_handler.cc | 6 | ||||
-rw-r--r-- | runtime/verifier/method_verifier-inl.h | 4 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.cc | 107 | ||||
-rw-r--r-- | runtime/verifier/method_verifier.h | 29 |
16 files changed, 203 insertions, 199 deletions
diff --git a/compiler/common_compiler_test.cc b/compiler/common_compiler_test.cc index 18233665cd..db9dcd4b4b 100644 --- a/compiler/common_compiler_test.cc +++ b/compiler/common_compiler_test.cc @@ -367,7 +367,7 @@ void CommonCompilerTest::CompileMethod(mirror::ArtMethod* method) { MakeExecutable(method); } -void CommonCompilerTest::CompileDirectMethod(Handle<mirror::ClassLoader> class_loader, +void CommonCompilerTest::CompileDirectMethod(ConstHandle<mirror::ClassLoader> class_loader, const char* class_name, const char* method_name, const char* signature) { std::string class_descriptor(DotToDescriptor(class_name)); @@ -380,9 +380,9 @@ void CommonCompilerTest::CompileDirectMethod(Handle<mirror::ClassLoader> class_l CompileMethod(method); } -void CommonCompilerTest::CompileVirtualMethod(Handle<mirror::ClassLoader> class_loader, const char* class_name, - const char* method_name, const char* signature) -SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { +void CommonCompilerTest::CompileVirtualMethod(ConstHandle<mirror::ClassLoader> class_loader, + const char* class_name, const char* method_name, + const char* signature) { std::string class_descriptor(DotToDescriptor(class_name)); Thread* self = Thread::Current(); mirror::Class* klass = class_linker_->FindClass(self, class_descriptor.c_str(), class_loader); diff --git a/compiler/common_compiler_test.h b/compiler/common_compiler_test.h index df06b71c7d..4e74f0a521 100644 --- a/compiler/common_compiler_test.h +++ b/compiler/common_compiler_test.h @@ -63,11 +63,11 @@ class CommonCompilerTest : public CommonRuntimeTest { void CompileMethod(mirror::ArtMethod* method) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void CompileDirectMethod(Handle<mirror::ClassLoader> class_loader, const char* class_name, + void CompileDirectMethod(ConstHandle<mirror::ClassLoader> class_loader, const char* class_name, const char* method_name, const char* signature) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void CompileVirtualMethod(Handle<mirror::ClassLoader> class_loader, const char* class_name, + void CompileVirtualMethod(ConstHandle<mirror::ClassLoader> class_loader, const char* class_name, const char* method_name, const char* signature) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 2114ada055..447003c931 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -427,13 +427,12 @@ class OatDumper { Runtime* runtime = Runtime::Current(); if (runtime != nullptr) { ScopedObjectAccess soa(Thread::Current()); - StackHandleScope<2> hs(soa.Self()); + StackHandleScope<1> hs(soa.Self()); Handle<mirror::DexCache> dex_cache( hs.NewHandle(runtime->GetClassLinker()->FindDexCache(dex_file))); - NullHandle<mirror::ClassLoader> class_loader; - Handle<mirror::ArtMethod> method(hs.NewHandle<mirror::ArtMethod>(nullptr)); - verifier::MethodVerifier verifier(&dex_file, &dex_cache, &class_loader, &class_def, - code_item, dex_method_idx, method, method_access_flags, + verifier::MethodVerifier verifier(&dex_file, dex_cache, NullHandle<mirror::ClassLoader>(), + &class_def, code_item, dex_method_idx, + NullHandle<mirror::ArtMethod>(), method_access_flags, true, true, true); verifier.Verify(); DumpCode(*indent2_os, &verifier, oat_method, code_item); @@ -699,13 +698,12 @@ class OatDumper { uint32_t method_access_flags) { if ((method_access_flags & kAccNative) == 0) { ScopedObjectAccess soa(Thread::Current()); - StackHandleScope<3> hs(soa.Self()); + StackHandleScope<1> hs(soa.Self()); Handle<mirror::DexCache> dex_cache( hs.NewHandle(Runtime::Current()->GetClassLinker()->FindDexCache(*dex_file))); - auto class_loader(hs.NewHandle<mirror::ClassLoader>(nullptr)); - Handle<mirror::ArtMethod> method(hs.NewHandle<mirror::ArtMethod>(nullptr)); verifier::MethodVerifier::VerifyMethodAndDump(os, dex_method_idx, dex_file, dex_cache, - class_loader, &class_def, code_item, method, + NullHandle<mirror::ClassLoader>(), &class_def, + code_item, NullHandle<mirror::ArtMethod>(), method_access_flags); } } diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 74c5c159f9..f68e27443f 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -1847,7 +1847,7 @@ mirror::Class* ClassLinker::EnsureResolved(Thread* self, const char* descriptor, } mirror::Class* ClassLinker::FindClass(Thread* self, const char* descriptor, - Handle<mirror::ClassLoader> class_loader) { + ConstHandle<mirror::ClassLoader> class_loader) { DCHECK_NE(*descriptor, '\0') << "descriptor is empty string"; DCHECK(self != nullptr); self->AssertNoPendingException(); @@ -1929,7 +1929,7 @@ mirror::Class* ClassLinker::FindClass(Thread* self, const char* descriptor, } mirror::Class* ClassLinker::DefineClass(const char* descriptor, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) { Thread* self = Thread::Current(); @@ -2336,7 +2336,8 @@ void ClassLinker::FixupStaticTrampolines(mirror::Class* klass) { // Ignore virtual methods on the iterator. } -void ClassLinker::LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class, +void ClassLinker::LinkCode(ConstHandle<mirror::ArtMethod> method, + const OatFile::OatClass* oat_class, const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index) { if (Runtime::Current()->IsCompiler()) { @@ -2416,7 +2417,7 @@ void ClassLinker::LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatC void ClassLinker::LoadClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, - Handle<mirror::Class> klass, + ConstHandle<mirror::Class> klass, mirror::ClassLoader* class_loader) { CHECK(klass.Get() != NULL); CHECK(klass->GetDexCache() != NULL); @@ -2460,7 +2461,7 @@ void ClassLinker::LoadClass(const DexFile& dex_file, void ClassLinker::LoadClassMembers(const DexFile& dex_file, const byte* class_data, - Handle<mirror::Class> klass, + ConstHandle<mirror::Class> klass, mirror::ClassLoader* class_loader, const OatFile::OatClass* oat_class) { // Load fields. @@ -2554,7 +2555,8 @@ void ClassLinker::LoadClassMembers(const DexFile& dex_file, } void ClassLinker::LoadField(const DexFile& /*dex_file*/, const ClassDataItemIterator& it, - Handle<mirror::Class> klass, Handle<mirror::ArtField> dst) { + ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ArtField> dst) { uint32_t field_idx = it.GetMemberIndex(); dst->SetDexFieldIndex(field_idx); dst->SetDeclaringClass(klass.Get()); @@ -2563,7 +2565,7 @@ void ClassLinker::LoadField(const DexFile& /*dex_file*/, const ClassDataItemIter mirror::ArtMethod* ClassLinker::LoadMethod(Thread* self, const DexFile& dex_file, const ClassDataItemIterator& it, - Handle<mirror::Class> klass) { + ConstHandle<mirror::Class> klass) { uint32_t dex_method_idx = it.GetMemberIndex(); const DexFile::MethodId& method_id = dex_file.GetMethodId(dex_method_idx); const char* method_name = dex_file.StringDataByIdx(method_id.name_idx_); @@ -2635,7 +2637,7 @@ void ClassLinker::AppendToBootClassPath(const DexFile& dex_file) { } void ClassLinker::AppendToBootClassPath(const DexFile& dex_file, - Handle<mirror::DexCache> dex_cache) { + ConstHandle<mirror::DexCache> dex_cache) { CHECK(dex_cache.Get() != NULL) << dex_file.GetLocation(); boot_class_path_.push_back(&dex_file); RegisterDexFile(dex_file, dex_cache); @@ -2658,7 +2660,7 @@ bool ClassLinker::IsDexFileRegistered(const DexFile& dex_file) { } void ClassLinker::RegisterDexFileLocked(const DexFile& dex_file, - Handle<mirror::DexCache> dex_cache) { + ConstHandle<mirror::DexCache> dex_cache) { dex_lock_.AssertExclusiveHeld(Thread::Current()); CHECK(dex_cache.Get() != NULL) << dex_file.GetLocation(); CHECK(dex_cache->GetLocation()->Equals(dex_file.GetLocation())) @@ -2695,7 +2697,7 @@ void ClassLinker::RegisterDexFile(const DexFile& dex_file) { } void ClassLinker::RegisterDexFile(const DexFile& dex_file, - Handle<mirror::DexCache> dex_cache) { + ConstHandle<mirror::DexCache> dex_cache) { WriterMutexLock mu(Thread::Current(), dex_lock_); RegisterDexFileLocked(dex_file, dex_cache); } @@ -2773,7 +2775,7 @@ mirror::Class* ClassLinker::InitializePrimitiveClass(mirror::Class* primitive_cl // // Returns NULL with an exception raised on failure. mirror::Class* ClassLinker::CreateArrayClass(Thread* self, const char* descriptor, - Handle<mirror::ClassLoader> class_loader) { + ConstHandle<mirror::ClassLoader> class_loader) { // Identify the underlying component type CHECK_EQ('[', descriptor[0]); StackHandleScope<2> hs(self); @@ -3170,7 +3172,7 @@ void ClassLinker::LookupClasses(const char* descriptor, std::vector<mirror::Clas } } -void ClassLinker::VerifyClass(Handle<mirror::Class> klass) { +void ClassLinker::VerifyClass(ConstHandle<mirror::Class> klass) { // TODO: assert that the monitor on the Class is held Thread* self = Thread::Current(); ObjectLock<mirror::Class> lock(self, klass); @@ -3384,7 +3386,7 @@ bool ClassLinker::VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class } void ClassLinker::ResolveClassExceptionHandlerTypes(const DexFile& dex_file, - Handle<mirror::Class> klass) { + ConstHandle<mirror::Class> klass) { for (size_t i = 0; i < klass->NumDirectMethods(); i++) { ResolveMethodExceptionHandlerTypes(dex_file, klass->GetDirectMethod(i)); } @@ -3424,8 +3426,8 @@ void ClassLinker::ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, } static void CheckProxyConstructor(mirror::ArtMethod* constructor); -static void CheckProxyMethod(Handle<mirror::ArtMethod> method, - Handle<mirror::ArtMethod> prototype); +static void CheckProxyMethod(ConstHandle<mirror::ArtMethod> method, + ConstHandle<mirror::ArtMethod> prototype); mirror::Class* ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name, jobjectArray interfaces, jobject loader, @@ -3616,7 +3618,7 @@ mirror::ArtMethod* ClassLinker::FindMethodForProxy(mirror::Class* proxy_class, mirror::ArtMethod* ClassLinker::CreateProxyConstructor(Thread* self, - Handle<mirror::Class> klass, + ConstHandle<mirror::Class> klass, mirror::Class* proxy_class) { // Create constructor for Proxy that must initialize h mirror::ObjectArray<mirror::ArtMethod>* proxy_direct_methods = @@ -3646,8 +3648,8 @@ static void CheckProxyConstructor(mirror::ArtMethod* constructor) } mirror::ArtMethod* ClassLinker::CreateProxyMethod(Thread* self, - Handle<mirror::Class> klass, - Handle<mirror::ArtMethod> prototype) { + ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ArtMethod> prototype) { // Ensure prototype is in dex cache so that we can use the dex cache to look up the overridden // prototype method prototype->GetDeclaringClass()->GetDexCache()->SetResolvedMethod(prototype->GetDexMethodIndex(), @@ -3674,7 +3676,8 @@ mirror::ArtMethod* ClassLinker::CreateProxyMethod(Thread* self, return method; } -static void CheckProxyMethod(Handle<mirror::ArtMethod> method, Handle<mirror::ArtMethod> prototype) +static void CheckProxyMethod(ConstHandle<mirror::ArtMethod> method, + ConstHandle<mirror::ArtMethod> prototype) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { // Basic sanity CHECK(!prototype->IsFinal()); @@ -3688,8 +3691,9 @@ static void CheckProxyMethod(Handle<mirror::ArtMethod> method, Handle<mirror::Ar CHECK(prototype->HasSameDexCacheResolvedTypes(method.Get())); CHECK_EQ(prototype->GetDexMethodIndex(), method->GetDexMethodIndex()); - MethodHelper mh(method); - MethodHelper mh2(prototype); + StackHandleScope<2> hs(Thread::Current()); + MethodHelper mh(hs.NewHandle(method.Get())); + MethodHelper mh2(hs.NewHandle(prototype.Get())); CHECK_STREQ(method->GetName(), prototype->GetName()); CHECK_STREQ(method->GetShorty(), prototype->GetShorty()); // More complex sanity - via dex cache @@ -3734,7 +3738,7 @@ bool ClassLinker::IsInitialized() const { return init_done_; } -bool ClassLinker::InitializeClass(Handle<mirror::Class> klass, bool can_init_statics, +bool ClassLinker::InitializeClass(ConstHandle<mirror::Class> klass, bool can_init_statics, bool can_init_parents) { // see JLS 3rd edition, 12.4.2 "Detailed Initialization Procedure" for the locking protocol @@ -3905,7 +3909,7 @@ bool ClassLinker::InitializeClass(Handle<mirror::Class> klass, bool can_init_sta return success; } -bool ClassLinker::WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self, +bool ClassLinker::WaitForInitializeClass(ConstHandle<mirror::Class> klass, Thread* self, ObjectLock<mirror::Class>& lock) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { while (true) { @@ -3945,7 +3949,7 @@ bool ClassLinker::WaitForInitializeClass(Handle<mirror::Class> klass, Thread* se LOG(FATAL) << "Not Reached" << PrettyClass(klass.Get()); } -bool ClassLinker::ValidateSuperClassDescriptors(Handle<mirror::Class> klass) { +bool ClassLinker::ValidateSuperClassDescriptors(ConstHandle<mirror::Class> klass) { if (klass->IsInterface()) { return true; } @@ -3990,7 +3994,7 @@ bool ClassLinker::ValidateSuperClassDescriptors(Handle<mirror::Class> klass) { return true; } -bool ClassLinker::EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, +bool ClassLinker::EnsureInitialized(ConstHandle<mirror::Class> c, bool can_init_fields, bool can_init_parents) { DCHECK(c.Get() != nullptr); const bool success = c->IsInitialized() || InitializeClass(c, can_init_fields, can_init_parents); @@ -4002,7 +4006,7 @@ bool ClassLinker::EnsureInitialized(Handle<mirror::Class> c, bool can_init_field void ClassLinker::ConstructFieldArray(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, mirror::Class* c, - Handle<mirror::ObjectArray<mirror::ArtField>> field_array) { + ConstHandle<mirror::ObjectArray<mirror::ArtField>> field_array) { const byte* class_data = dex_file.GetClassData(dex_class_def); ClassDataItemIterator it(dex_file, class_data); StackHandleScope<2> hs(Thread::Current()); @@ -4055,8 +4059,8 @@ void ClassLinker::FixupTemporaryDeclaringClass(mirror::Class* temp_class, mirror } } -bool ClassLinker::LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces, +bool ClassLinker::LinkClass(Thread* self, const char* descriptor, ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces, mirror::Class** new_class) { CHECK_EQ(mirror::Class::kStatusLoaded, klass->GetStatus()); @@ -4122,7 +4126,7 @@ bool ClassLinker::LinkClass(Thread* self, const char* descriptor, Handle<mirror: return true; } -bool ClassLinker::LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) { +bool ClassLinker::LoadSuperAndInterfaces(ConstHandle<mirror::Class> klass, const DexFile& dex_file) { CHECK_EQ(mirror::Class::kStatusIdx, klass->GetStatus()); const DexFile::ClassDef& class_def = dex_file.GetClassDef(klass->GetDexClassDefIndex()); uint16_t super_class_idx = class_def.superclass_idx_; @@ -4166,7 +4170,7 @@ bool ClassLinker::LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexF return true; } -bool ClassLinker::LinkSuperClass(Handle<mirror::Class> klass) { +bool ClassLinker::LinkSuperClass(ConstHandle<mirror::Class> klass) { CHECK(!klass->IsPrimitive()); mirror::Class* super = klass->GetSuperClass(); if (klass.Get() == GetClassRoot(kJavaLangObject)) { @@ -4226,8 +4230,8 @@ bool ClassLinker::LinkSuperClass(Handle<mirror::Class> klass) { } // Populate the class vtable and itable. Compute return type indices. -bool ClassLinker::LinkMethods(Thread* self, Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) { +bool ClassLinker::LinkMethods(Thread* self, ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces) { if (klass->IsInterface()) { // No vtable. size_t count = klass->NumVirtualMethods(); @@ -4247,7 +4251,7 @@ bool ClassLinker::LinkMethods(Thread* self, Handle<mirror::Class> klass, return true; } -bool ClassLinker::LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass) { +bool ClassLinker::LinkVirtualMethods(Thread* self, ConstHandle<mirror::Class> klass) { if (klass->HasSuperClass()) { uint32_t max_count = klass->NumVirtualMethods() + klass->GetSuperClass()->GetVTableLength(); @@ -4349,8 +4353,8 @@ bool ClassLinker::LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass) return true; } -bool ClassLinker::LinkInterfaceMethods(Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) { +bool ClassLinker::LinkInterfaceMethods(ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces) { Thread* const self = Thread::Current(); Runtime* const runtime = Runtime::Current(); // Set the imt table to be all conflicts by default. @@ -4614,12 +4618,12 @@ bool ClassLinker::LinkInterfaceMethods(Handle<mirror::Class> klass, return true; } -bool ClassLinker::LinkInstanceFields(Handle<mirror::Class> klass) { +bool ClassLinker::LinkInstanceFields(ConstHandle<mirror::Class> klass) { CHECK(klass.Get() != NULL); return LinkFields(klass, false, nullptr); } -bool ClassLinker::LinkStaticFields(Handle<mirror::Class> klass, size_t* class_size) { +bool ClassLinker::LinkStaticFields(ConstHandle<mirror::Class> klass, size_t* class_size) { CHECK(klass.Get() != NULL); return LinkFields(klass, true, class_size); } @@ -4651,7 +4655,7 @@ struct LinkFieldsComparator { } }; -bool ClassLinker::LinkFields(Handle<mirror::Class> klass, bool is_static, size_t* class_size) { +bool ClassLinker::LinkFields(ConstHandle<mirror::Class> klass, bool is_static, size_t* class_size) { size_t num_fields = is_static ? klass->NumStaticFields() : klass->NumInstanceFields(); @@ -4811,7 +4815,7 @@ bool ClassLinker::LinkFields(Handle<mirror::Class> klass, bool is_static, size_t // Set the bitmap of reference offsets, refOffsets, from the ifields // list. -void ClassLinker::CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) { +void ClassLinker::CreateReferenceInstanceOffsets(ConstHandle<mirror::Class> klass) { uint32_t reference_offsets = 0; mirror::Class* super_class = klass->GetSuperClass(); if (super_class != NULL) { @@ -4825,11 +4829,11 @@ void ClassLinker::CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) { CreateReferenceOffsets(klass, false, reference_offsets); } -void ClassLinker::CreateReferenceStaticOffsets(Handle<mirror::Class> klass) { +void ClassLinker::CreateReferenceStaticOffsets(ConstHandle<mirror::Class> klass) { CreateReferenceOffsets(klass, true, 0); } -void ClassLinker::CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static, +void ClassLinker::CreateReferenceOffsets(ConstHandle<mirror::Class> klass, bool is_static, uint32_t reference_offsets) { size_t num_reference_fields = is_static ? klass->NumReferenceStaticFieldsDuringLinking() @@ -4862,7 +4866,7 @@ void ClassLinker::CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_st } mirror::String* ClassLinker::ResolveString(const DexFile& dex_file, uint32_t string_idx, - Handle<mirror::DexCache> dex_cache) { + ConstHandle<mirror::DexCache> dex_cache) { DCHECK(dex_cache.Get() != nullptr); mirror::String* resolved = dex_cache->GetResolvedString(string_idx); if (resolved != NULL) { @@ -4884,8 +4888,8 @@ mirror::Class* ClassLinker::ResolveType(const DexFile& dex_file, uint16_t type_i } mirror::Class* ClassLinker::ResolveType(const DexFile& dex_file, uint16_t type_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader) { + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader) { DCHECK(dex_cache.Get() != NULL); mirror::Class* resolved = dex_cache->GetResolvedType(type_idx); if (resolved == NULL) { @@ -4917,9 +4921,9 @@ mirror::Class* ClassLinker::ResolveType(const DexFile& dex_file, uint16_t type_i } mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, uint32_t method_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, - Handle<mirror::ArtMethod> referrer, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::ArtMethod> referrer, InvokeType type) { DCHECK(dex_cache.Get() != nullptr); // Check for hit in the dex cache. @@ -5066,8 +5070,8 @@ mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, uint32_t } mirror::ArtField* ClassLinker::ResolveField(const DexFile& dex_file, uint32_t field_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, bool is_static) { DCHECK(dex_cache.Get() != nullptr); mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx); @@ -5109,8 +5113,8 @@ mirror::ArtField* ClassLinker::ResolveField(const DexFile& dex_file, uint32_t fi mirror::ArtField* ClassLinker::ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader) { + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader) { DCHECK(dex_cache.Get() != nullptr); mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx); if (resolved != nullptr) { diff --git a/runtime/class_linker.h b/runtime/class_linker.h index edbf2b3e34..edcddcefd1 100644 --- a/runtime/class_linker.h +++ b/runtime/class_linker.h @@ -46,6 +46,7 @@ namespace mirror { class StackTraceElement; } // namespace mirror +template<class T> class ConstHandle; class InternTable; template<class T> class ObjectLock; class ScopedObjectAccessAlreadyRunnable; @@ -72,7 +73,7 @@ class ClassLinker { // Finds a class by its descriptor, loading it if necessary. // If class_loader is null, searches boot_class_path_. mirror::Class* FindClass(Thread* self, const char* descriptor, - Handle<mirror::ClassLoader> class_loader) + ConstHandle<mirror::ClassLoader> class_loader) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Finds a class by its descriptor using the "system" class loader, ie by searching the @@ -89,7 +90,7 @@ class ClassLinker { // Define a new a class based on a ClassDef from a DexFile mirror::Class* DefineClass(const char* descriptor, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -133,7 +134,7 @@ class ClassLinker { // Resolve a String with the given index from the DexFile, storing the // result in the DexCache. mirror::String* ResolveString(const DexFile& dex_file, uint32_t string_idx, - Handle<mirror::DexCache> dex_cache) + ConstHandle<mirror::DexCache> dex_cache) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Resolve a Type with the given index from the DexFile, storing the @@ -156,8 +157,8 @@ class ClassLinker { // type, since it may be referenced from but not contained within // the given DexFile. mirror::Class* ResolveType(const DexFile& dex_file, uint16_t type_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader) + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Resolve a method with a given ID from the DexFile, storing the @@ -167,9 +168,9 @@ class ClassLinker { // virtual method. mirror::ArtMethod* ResolveMethod(const DexFile& dex_file, uint32_t method_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, - Handle<mirror::ArtMethod> referrer, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::ArtMethod> referrer, InvokeType type) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -193,8 +194,8 @@ class ClassLinker { // field. mirror::ArtField* ResolveField(const DexFile& dex_file, uint32_t field_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, bool is_static) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -203,8 +204,8 @@ class ClassLinker { // in ResolveType. No is_static argument is provided so that Java // field resolution semantics are followed. mirror::ArtField* ResolveFieldJLS(const DexFile& dex_file, uint32_t field_idx, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader) + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Get shorty from method index without resolution. Used to do handlerization. @@ -214,7 +215,7 @@ class ClassLinker { // Returns true on success, false if there's an exception pending. // can_run_clinit=false allows the compiler to attempt to init a class, // given the restriction that no <clinit> execution is possible. - bool EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, bool can_init_parents) + bool EnsureInitialized(ConstHandle<mirror::Class> c, bool can_init_fields, bool can_init_parents) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Initializes classes that have instances in the image but that have @@ -224,7 +225,7 @@ class ClassLinker { void RegisterDexFile(const DexFile& dex_file) LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void RegisterDexFile(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) + void RegisterDexFile(const DexFile& dex_file, ConstHandle<mirror::DexCache> dex_cache) LOCKS_EXCLUDED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -311,12 +312,12 @@ class ClassLinker { size_t length) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void VerifyClass(Handle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void VerifyClass(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class* klass, mirror::Class::Status& oat_file_class_status) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void ResolveClassExceptionHandlerTypes(const DexFile& dex_file, - Handle<mirror::Class> klass) + ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, mirror::ArtMethod* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -429,16 +430,17 @@ class ClassLinker { mirror::Class* CreateArrayClass(Thread* self, const char* descriptor, - Handle<mirror::ClassLoader> class_loader) + ConstHandle<mirror::ClassLoader> class_loader) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void AppendToBootClassPath(const DexFile& dex_file) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void AppendToBootClassPath(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) + void AppendToBootClassPath(const DexFile& dex_file, ConstHandle<mirror::DexCache> dex_cache) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void ConstructFieldArray(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, - mirror::Class* c, Handle<mirror::ObjectArray<mirror::ArtField>> field_array) + mirror::Class* c, + ConstHandle<mirror::ObjectArray<mirror::ArtField>> field_array) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Precomputes size needed for Class, in the case of a non-temporary class this size must be @@ -448,23 +450,23 @@ class ClassLinker { void LoadClass(const DexFile& dex_file, const DexFile::ClassDef& dex_class_def, - Handle<mirror::Class> klass, + ConstHandle<mirror::Class> klass, mirror::ClassLoader* class_loader) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void LoadClassMembers(const DexFile& dex_file, const byte* class_data, - Handle<mirror::Class> klass, + ConstHandle<mirror::Class> klass, mirror::ClassLoader* class_loader, const OatFile::OatClass* oat_class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void LoadField(const DexFile& dex_file, const ClassDataItemIterator& it, - Handle<mirror::Class> klass, Handle<mirror::ArtField> dst) + ConstHandle<mirror::Class> klass, ConstHandle<mirror::ArtField> dst) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); mirror::ArtMethod* LoadMethod(Thread* self, const DexFile& dex_file, const ClassDataItemIterator& dex_method, - Handle<mirror::Class> klass) + ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); void FixupStaticTrampolines(mirror::Class* klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -474,23 +476,23 @@ class ClassLinker { OatFile::OatClass FindOatClass(const DexFile& dex_file, uint16_t class_def_idx, bool* found) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void RegisterDexFileLocked(const DexFile& dex_file, Handle<mirror::DexCache> dex_cache) + void RegisterDexFileLocked(const DexFile& dex_file, ConstHandle<mirror::DexCache> dex_cache) EXCLUSIVE_LOCKS_REQUIRED(dex_lock_) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsDexFileRegisteredLocked(const DexFile& dex_file) SHARED_LOCKS_REQUIRED(dex_lock_, Locks::mutator_lock_); - bool InitializeClass(Handle<mirror::Class> klass, bool can_run_clinit, + bool InitializeClass(ConstHandle<mirror::Class> klass, bool can_run_clinit, bool can_init_parents) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool WaitForInitializeClass(Handle<mirror::Class> klass, Thread* self, + bool WaitForInitializeClass(ConstHandle<mirror::Class> klass, Thread* self, ObjectLock<mirror::Class>& lock); - bool ValidateSuperClassDescriptors(Handle<mirror::Class> klass) + bool ValidateSuperClassDescriptors(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsSameDescriptorInDifferentClassContexts(Thread* self, const char* descriptor, - Handle<mirror::ClassLoader> class_loader1, - Handle<mirror::ClassLoader> class_loader2) + ConstHandle<mirror::ClassLoader> class_loader1, + ConstHandle<mirror::ClassLoader> class_loader2) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); bool IsSameMethodSignatureInDifferentClassContexts(Thread* self, mirror::ArtMethod* method, @@ -498,43 +500,43 @@ class ClassLinker { mirror::Class* klass2) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkClass(Thread* self, const char* descriptor, Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces, + bool LinkClass(Thread* self, const char* descriptor, ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces, mirror::Class** new_class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkSuperClass(Handle<mirror::Class> klass) + bool LinkSuperClass(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) + bool LoadSuperAndInterfaces(ConstHandle<mirror::Class> klass, const DexFile& dex_file) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkMethods(Thread* self, Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) + bool LinkMethods(Thread* self, ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkVirtualMethods(Thread* self, Handle<mirror::Class> klass) + bool LinkVirtualMethods(Thread* self, ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkInterfaceMethods(Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) + bool LinkInterfaceMethods(ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ObjectArray<mirror::Class>> interfaces) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkStaticFields(Handle<mirror::Class> klass, size_t* class_size) + bool LinkStaticFields(ConstHandle<mirror::Class> klass, size_t* class_size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkInstanceFields(Handle<mirror::Class> klass) + bool LinkInstanceFields(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - bool LinkFields(Handle<mirror::Class> klass, bool is_static, size_t* class_size) + bool LinkFields(ConstHandle<mirror::Class> klass, bool is_static, size_t* class_size) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void LinkCode(Handle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class, + void LinkCode(ConstHandle<mirror::ArtMethod> method, const OatFile::OatClass* oat_class, const DexFile& dex_file, uint32_t dex_method_index, uint32_t method_index) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) + void CreateReferenceInstanceOffsets(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void CreateReferenceStaticOffsets(Handle<mirror::Class> klass) + void CreateReferenceStaticOffsets(ConstHandle<mirror::Class> klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static, + void CreateReferenceOffsets(ConstHandle<mirror::Class> klass, bool is_static, uint32_t reference_offsets) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -617,11 +619,11 @@ class ClassLinker { bool VerifyOatWithDexFile(const OatFile* oat_file, const char* dex_location, std::string* error_msg); - mirror::ArtMethod* CreateProxyConstructor(Thread* self, Handle<mirror::Class> klass, + mirror::ArtMethod* CreateProxyConstructor(Thread* self, ConstHandle<mirror::Class> klass, mirror::Class* proxy_class) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - mirror::ArtMethod* CreateProxyMethod(Thread* self, Handle<mirror::Class> klass, - Handle<mirror::ArtMethod> prototype) + mirror::ArtMethod* CreateProxyMethod(Thread* self, ConstHandle<mirror::Class> klass, + ConstHandle<mirror::ArtMethod> prototype) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); std::vector<const DexFile*> boot_class_path_; diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 5b00a37f07..ffd15f638a 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -3036,7 +3036,7 @@ static bool IsMethodPossiblyInlined(Thread* self, mirror::ArtMethod* m) Handle<mirror::DexCache> dex_cache(hs.NewHandle(declaring_class->GetDexCache())); Handle<mirror::ClassLoader> class_loader(hs.NewHandle(declaring_class->GetClassLoader())); Handle<mirror::ArtMethod> method(hs.NewHandle(m)); - verifier::MethodVerifier verifier(dex_cache->GetDexFile(), &dex_cache, &class_loader, + verifier::MethodVerifier verifier(dex_cache->GetDexFile(), dex_cache, class_loader, &m->GetClassDef(), code_item, m->GetDexMethodIndex(), method, m->GetAccessFlags(), false, true, false); // Note: we don't need to verify the method. diff --git a/runtime/handle.h b/runtime/handle.h index f70faf40d0..06938e51c0 100644 --- a/runtime/handle.h +++ b/runtime/handle.h @@ -146,9 +146,9 @@ class Handle : public ConstHandle<T> { // A special case of Handle that only holds references to null. template<class T> -class NullHandle : public Handle<T> { +class NullHandle : public ConstHandle<T> { public: - NullHandle() : Handle<T>(&null_ref_) { + NullHandle() : ConstHandle<T>(&null_ref_) { } private: diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc index 6705695528..74fa981d56 100644 --- a/runtime/interpreter/interpreter_common.cc +++ b/runtime/interpreter/interpreter_common.cc @@ -764,8 +764,8 @@ void RecordArrayElementsInTransaction(mirror::Array* array, int32_t count) } // Helper function to deal with class loading in an unstarted runtime. -static void UnstartedRuntimeFindClass(Thread* self, Handle<mirror::String> className, - Handle<mirror::ClassLoader> class_loader, JValue* result, +static void UnstartedRuntimeFindClass(Thread* self, ConstHandle<mirror::String> className, + ConstHandle<mirror::ClassLoader> class_loader, JValue* result, const std::string& method_name, bool initialize_class, bool abort_if_not_found) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { diff --git a/runtime/mirror/class.cc b/runtime/mirror/class.cc index 5b8eb829f5..760d54cfa1 100644 --- a/runtime/mirror/class.cc +++ b/runtime/mirror/class.cc @@ -772,7 +772,8 @@ uint16_t Class::GetDirectInterfaceTypeIdx(uint32_t idx) { return GetInterfaceTypeList()->GetTypeItem(idx).type_idx_; } -mirror::Class* Class::GetDirectInterface(Thread* self, Handle<mirror::Class> klass, uint32_t idx) { +mirror::Class* Class::GetDirectInterface(Thread* self, ConstHandle<mirror::Class> klass, + uint32_t idx) { DCHECK(klass.Get() != nullptr); DCHECK(!klass->IsPrimitive()); if (klass->IsArrayClass()) { diff --git a/runtime/mirror/class.h b/runtime/mirror/class.h index 4b37beff34..81fbcab96e 100644 --- a/runtime/mirror/class.h +++ b/runtime/mirror/class.h @@ -65,6 +65,8 @@ namespace art { struct ClassOffsets; +template<class T> class ConstHandle; +template<class T> class Handle; class Signature; class StringPiece; @@ -981,7 +983,8 @@ class MANAGED Class FINAL : public Object { uint16_t GetDirectInterfaceTypeIdx(uint32_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static mirror::Class* GetDirectInterface(Thread* self, Handle<mirror::Class> klass, uint32_t idx) + static mirror::Class* GetDirectInterface(Thread* self, ConstHandle<mirror::Class> klass, + uint32_t idx) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); const char* GetSourceFile() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); diff --git a/runtime/object_lock.cc b/runtime/object_lock.cc index f7accc0f31..a2668ec8ab 100644 --- a/runtime/object_lock.cc +++ b/runtime/object_lock.cc @@ -22,7 +22,7 @@ namespace art { template <typename T> -ObjectLock<T>::ObjectLock(Thread* self, Handle<T> object) : self_(self), obj_(object) { +ObjectLock<T>::ObjectLock(Thread* self, ConstHandle<T> object) : self_(self), obj_(object) { CHECK(object.Get() != nullptr); obj_->MonitorEnter(self_); } diff --git a/runtime/object_lock.h b/runtime/object_lock.h index acddc03e29..38690bcd02 100644 --- a/runtime/object_lock.h +++ b/runtime/object_lock.h @@ -28,7 +28,7 @@ class Thread; template <typename T> class ObjectLock { public: - ObjectLock(Thread* self, Handle<T> object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + ObjectLock(Thread* self, ConstHandle<T> object) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); ~ObjectLock() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -40,7 +40,7 @@ class ObjectLock { private: Thread* const self_; - Handle<T> const obj_; + ConstHandle<T> const obj_; DISALLOW_COPY_AND_ASSIGN(ObjectLock); }; diff --git a/runtime/quick_exception_handler.cc b/runtime/quick_exception_handler.cc index 1e933a2b8c..1ec488ef51 100644 --- a/runtime/quick_exception_handler.cc +++ b/runtime/quick_exception_handler.cc @@ -211,9 +211,9 @@ class DeoptimizeStackVisitor FINAL : public StackVisitor { Handle<mirror::DexCache> h_dex_cache(hs.NewHandle(declaring_class->GetDexCache())); Handle<mirror::ClassLoader> h_class_loader(hs.NewHandle(declaring_class->GetClassLoader())); Handle<mirror::ArtMethod> h_method(hs.NewHandle(m)); - verifier::MethodVerifier verifier(h_dex_cache->GetDexFile(), &h_dex_cache, &h_class_loader, - &m->GetClassDef(), code_item, m->GetDexMethodIndex(), h_method, - m->GetAccessFlags(), false, true, true); + verifier::MethodVerifier verifier(h_dex_cache->GetDexFile(), h_dex_cache, h_class_loader, + &m->GetClassDef(), code_item, m->GetDexMethodIndex(), + h_method, m->GetAccessFlags(), false, true, true); verifier.Verify(); const std::vector<int32_t> kinds(verifier.DescribeVRegs(dex_pc)); for (uint16_t reg = 0; reg < num_regs; ++reg) { diff --git a/runtime/verifier/method_verifier-inl.h b/runtime/verifier/method_verifier-inl.h index d4fe1061e2..0f9aeb53a5 100644 --- a/runtime/verifier/method_verifier-inl.h +++ b/runtime/verifier/method_verifier-inl.h @@ -39,11 +39,11 @@ inline const InstructionFlags& MethodVerifier::GetInstructionFlags(size_t index) } inline mirror::ClassLoader* MethodVerifier::GetClassLoader() { - return class_loader_->Get(); + return class_loader_.Get(); } inline mirror::DexCache* MethodVerifier::GetDexCache() { - return dex_cache_->Get(); + return dex_cache_.Get(); } inline MethodReference MethodVerifier::GetMethodReference() const { diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc index 60194532a6..c01c6925dd 100644 --- a/runtime/verifier/method_verifier.cc +++ b/runtime/verifier/method_verifier.cc @@ -123,8 +123,8 @@ MethodVerifier::FailureKind MethodVerifier::VerifyClass(mirror::Class* klass, } MethodVerifier::FailureKind MethodVerifier::VerifyClass(const DexFile* dex_file, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, bool allow_soft_failures, std::string* error) { @@ -243,18 +243,18 @@ MethodVerifier::FailureKind MethodVerifier::VerifyClass(const DexFile* dex_file, MethodVerifier::FailureKind MethodVerifier::VerifyMethod(uint32_t method_idx, const DexFile* dex_file, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, const DexFile::CodeItem* code_item, - Handle<mirror::ArtMethod> method, + ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags, bool allow_soft_failures, bool need_precise_constants) { MethodVerifier::FailureKind result = kNoFailure; uint64_t start_ns = NanoTime(); - MethodVerifier verifier(dex_file, &dex_cache, &class_loader, class_def, code_item, + MethodVerifier verifier(dex_file, dex_cache, class_loader, class_def, code_item, method_idx, method, method_access_flags, true, allow_soft_failures, need_precise_constants); if (verifier.Verify()) { @@ -290,13 +290,13 @@ MethodVerifier::FailureKind MethodVerifier::VerifyMethod(uint32_t method_idx, void MethodVerifier::VerifyMethodAndDump(std::ostream& os, uint32_t dex_method_idx, const DexFile* dex_file, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, const DexFile::CodeItem* code_item, - Handle<mirror::ArtMethod> method, + ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags) { - MethodVerifier verifier(dex_file, &dex_cache, &class_loader, class_def, code_item, + MethodVerifier verifier(dex_file, dex_cache, class_loader, class_def, code_item, dex_method_idx, method, method_access_flags, true, true, true); verifier.Verify(); verifier.DumpFailures(os); @@ -304,11 +304,11 @@ void MethodVerifier::VerifyMethodAndDump(std::ostream& os, uint32_t dex_method_i verifier.Dump(os); } -MethodVerifier::MethodVerifier(const DexFile* dex_file, Handle<mirror::DexCache>* dex_cache, - Handle<mirror::ClassLoader>* class_loader, +MethodVerifier::MethodVerifier(const DexFile* dex_file, ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, const DexFile::CodeItem* code_item, uint32_t dex_method_idx, - Handle<mirror::ArtMethod> method, uint32_t method_access_flags, + ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags, bool can_load_classes, bool allow_soft_failures, bool need_precise_constants) : reg_types_(can_load_classes), @@ -349,7 +349,7 @@ void MethodVerifier::FindLocksAtDexPc(mirror::ArtMethod* m, uint32_t dex_pc, Handle<mirror::DexCache> dex_cache(hs.NewHandle(m->GetDexCache())); Handle<mirror::ClassLoader> class_loader(hs.NewHandle(m->GetClassLoader())); Handle<mirror::ArtMethod> method(hs.NewHandle(m)); - MethodVerifier verifier(m->GetDexFile(), &dex_cache, &class_loader, &m->GetClassDef(), + MethodVerifier verifier(m->GetDexFile(), dex_cache, class_loader, &m->GetClassDef(), m->GetCodeItem(), m->GetDexMethodIndex(), method, m->GetAccessFlags(), false, true, false); verifier.interesting_dex_pc_ = dex_pc; @@ -374,7 +374,7 @@ mirror::ArtField* MethodVerifier::FindAccessedFieldAtDexPc(mirror::ArtMethod* m, Handle<mirror::DexCache> dex_cache(hs.NewHandle(m->GetDexCache())); Handle<mirror::ClassLoader> class_loader(hs.NewHandle(m->GetClassLoader())); Handle<mirror::ArtMethod> method(hs.NewHandle(m)); - MethodVerifier verifier(m->GetDexFile(), &dex_cache, &class_loader, &m->GetClassDef(), + MethodVerifier verifier(m->GetDexFile(), dex_cache, class_loader, &m->GetClassDef(), m->GetCodeItem(), m->GetDexMethodIndex(), method, m->GetAccessFlags(), true, true, false); return verifier.FindAccessedFieldAtDexPc(dex_pc); @@ -405,7 +405,7 @@ mirror::ArtMethod* MethodVerifier::FindInvokedMethodAtDexPc(mirror::ArtMethod* m Handle<mirror::DexCache> dex_cache(hs.NewHandle(m->GetDexCache())); Handle<mirror::ClassLoader> class_loader(hs.NewHandle(m->GetClassLoader())); Handle<mirror::ArtMethod> method(hs.NewHandle(m)); - MethodVerifier verifier(m->GetDexFile(), &dex_cache, &class_loader, &m->GetClassDef(), + MethodVerifier verifier(m->GetDexFile(), dex_cache, class_loader, &m->GetClassDef(), m->GetCodeItem(), m->GetDexMethodIndex(), method, m->GetAccessFlags(), true, true, false); return verifier.FindInvokedMethodAtDexPc(dex_pc); @@ -628,7 +628,7 @@ bool MethodVerifier::ScanTryCatchBlocks() { if (iterator.GetHandlerTypeIndex() != DexFile::kDexNoIndex16) { mirror::Class* exception_type = linker->ResolveType(*dex_file_, iterator.GetHandlerTypeIndex(), - *dex_cache_, *class_loader_); + dex_cache_, class_loader_); if (exception_type == NULL) { DCHECK(Thread::Current()->IsExceptionPending()); Thread::Current()->ClearException(); @@ -1736,7 +1736,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { RegType& res_type = ResolveClassAndCheckAccess(type_idx); if (res_type.IsConflict()) { // If this is a primitive type, fail HARD. - mirror::Class* klass = (*dex_cache_)->GetResolvedType(type_idx); + mirror::Class* klass = dex_cache_->GetResolvedType(type_idx); if (klass != nullptr && klass->IsPrimitive()) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "using primitive type " << dex_file_->StringByTypeIdx(type_idx) << " in instanceof in " @@ -1881,8 +1881,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "invalid fill-array-data with array type " << array_type; } else { - RegType& component_type = reg_types_.GetComponentType(array_type, - class_loader_->Get()); + RegType& component_type = reg_types_.GetComponentType(array_type, GetClassLoader()); DCHECK(!component_type.IsConflict()); if (component_type.IsNonZeroReferenceTypes()) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "invalid fill-array-data with component type " @@ -2211,7 +2210,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { const DexFile::MethodId& method_id = dex_file_->GetMethodId(method_idx); uint32_t return_type_idx = dex_file_->GetProtoId(method_id.proto_idx_).return_type_idx_; const char* descriptor = dex_file_->StringByTypeIdx(return_type_idx); - return_type = ®_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + return_type = ®_types_.FromDescriptor(GetClassLoader(), descriptor, false); } if (!return_type->IsLowHalf()) { work_line_->SetResultRegisterType(*return_type); @@ -2293,8 +2292,8 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { work_line_->MarkRefsAsInitialized(this_type); } if (return_type == nullptr) { - return_type = ®_types_.FromDescriptor(class_loader_->Get(), - return_type_descriptor, false); + return_type = ®_types_.FromDescriptor(GetClassLoader(), return_type_descriptor, + false); } if (!return_type->IsLowHalf()) { work_line_->SetResultRegisterType(*return_type); @@ -2320,8 +2319,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { } else { descriptor = called_method->GetReturnTypeDescriptor(); } - RegType& return_type = reg_types_.FromDescriptor(class_loader_->Get(), descriptor, - false); + RegType& return_type = reg_types_.FromDescriptor(GetClassLoader(), descriptor, false); if (!return_type.IsLowHalf()) { work_line_->SetResultRegisterType(return_type); } else { @@ -2378,8 +2376,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { } else { descriptor = abs_method->GetReturnTypeDescriptor(); } - RegType& return_type = reg_types_.FromDescriptor(class_loader_->Get(), descriptor, - false); + RegType& return_type = reg_types_.FromDescriptor(GetClassLoader(), descriptor, false); if (!return_type.IsLowHalf()) { work_line_->SetResultRegisterType(return_type); } else { @@ -2644,8 +2641,7 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { mirror::ArtMethod* called_method = VerifyInvokeVirtualQuickArgs(inst, is_range); if (called_method != NULL) { const char* descriptor = called_method->GetReturnTypeDescriptor(); - RegType& return_type = reg_types_.FromDescriptor(class_loader_->Get(), descriptor, - false); + RegType& return_type = reg_types_.FromDescriptor(GetClassLoader(), descriptor, false); if (!return_type.IsLowHalf()) { work_line_->SetResultRegisterType(return_type); } else { @@ -2810,8 +2806,8 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { has_catch_all_handler = true; } else { // It is also a catch-all if it is java.lang.Throwable. - mirror::Class* klass = linker->ResolveType(*dex_file_, handler_type_idx, *dex_cache_, - *class_loader_); + mirror::Class* klass = linker->ResolveType(*dex_file_, handler_type_idx, dex_cache_, + class_loader_); if (klass != nullptr) { if (klass == mirror::Throwable::GetJavaLangThrowable()) { has_catch_all_handler = true; @@ -2931,18 +2927,17 @@ bool MethodVerifier::CodeFlowVerifyInstruction(uint32_t* start_guess) { RegType& MethodVerifier::ResolveClassAndCheckAccess(uint32_t class_idx) { const char* descriptor = dex_file_->StringByTypeIdx(class_idx); RegType& referrer = GetDeclaringClass(); - mirror::Class* klass = (*dex_cache_)->GetResolvedType(class_idx); - RegType& result = - klass != NULL ? reg_types_.FromClass(descriptor, klass, - klass->CannotBeAssignedFromOtherTypes()) - : reg_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + mirror::Class* klass = dex_cache_->GetResolvedType(class_idx); + RegType& result = klass != NULL ? + reg_types_.FromClass(descriptor, klass, klass->CannotBeAssignedFromOtherTypes()) : + reg_types_.FromDescriptor(GetClassLoader(), descriptor, false); if (result.IsConflict()) { Fail(VERIFY_ERROR_BAD_CLASS_SOFT) << "accessing broken descriptor '" << descriptor << "' in " << referrer; return result; } if (klass == NULL && !result.IsUnresolvedTypes()) { - (*dex_cache_)->SetResolvedType(class_idx, result.GetClass()); + dex_cache_->SetResolvedType(class_idx, result.GetClass()); } // Check if access is allowed. Unresolved types use xxxWithAccessCheck to // check at runtime if access is allowed and so pass here. If result is @@ -3014,7 +3009,7 @@ mirror::ArtMethod* MethodVerifier::ResolveMethodAndCheckAccess(uint32_t dex_meth } mirror::Class* klass = klass_type.GetClass(); RegType& referrer = GetDeclaringClass(); - mirror::ArtMethod* res_method = (*dex_cache_)->GetResolvedMethod(dex_method_idx); + mirror::ArtMethod* res_method = dex_cache_->GetResolvedMethod(dex_method_idx); if (res_method == NULL) { const char* name = dex_file_->GetMethodName(method_id); const Signature signature = dex_file_->GetMethodSignature(method_id); @@ -3027,7 +3022,7 @@ mirror::ArtMethod* MethodVerifier::ResolveMethodAndCheckAccess(uint32_t dex_meth res_method = klass->FindVirtualMethod(name, signature); } if (res_method != NULL) { - (*dex_cache_)->SetResolvedMethod(dex_method_idx, res_method); + dex_cache_->SetResolvedMethod(dex_method_idx, res_method); } else { // If a virtual or interface method wasn't found with the expected type, look in // the direct methods. This can happen when the wrong invoke type is used or when @@ -3150,7 +3145,7 @@ mirror::ArtMethod* MethodVerifier::VerifyInvocationArgsFromIterator(T* it, const } else { const uint32_t method_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); const uint16_t class_idx = dex_file_->GetMethodId(method_idx).class_idx_; - res_method_class = ®_types_.FromDescriptor(class_loader_->Get(), + res_method_class = ®_types_.FromDescriptor(GetClassLoader(), dex_file_->StringByTypeIdx(class_idx), false); } @@ -3183,8 +3178,7 @@ mirror::ArtMethod* MethodVerifier::VerifyInvocationArgsFromIterator(T* it, const return nullptr; } - RegType& reg_type = reg_types_.FromDescriptor(class_loader_->Get(), param_descriptor, - false); + RegType& reg_type = reg_types_.FromDescriptor(GetClassLoader(), param_descriptor, false); uint32_t get_reg = is_range ? inst->VRegC_3rc() + static_cast<uint32_t>(sig_registers) : arg[sig_registers]; if (reg_type.IsIntegralTypes()) { @@ -3398,7 +3392,7 @@ mirror::ArtMethod* MethodVerifier::VerifyInvokeVirtualQuickArgs(const Instructio << " missing signature component"; return NULL; } - RegType& reg_type = reg_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + RegType& reg_type = reg_types_.FromDescriptor(GetClassLoader(), descriptor, false); uint32_t get_reg = is_range ? inst->VRegC_3rc() + actual_args : arg[actual_args]; if (!work_line_->VerifyRegisterType(get_reg, reg_type)) { return res_method; @@ -3442,7 +3436,7 @@ void MethodVerifier::VerifyNewArray(const Instruction* inst, bool is_filled, boo } else { // Verify each register. If "arg_count" is bad, VerifyRegisterType() will run off the end of // the list and fail. It's legal, if silly, for arg_count to be zero. - RegType& expected_type = reg_types_.GetComponentType(res_type, class_loader_->Get()); + RegType& expected_type = reg_types_.GetComponentType(res_type, GetClassLoader()); uint32_t arg_count = (is_range) ? inst->VRegA_3rc() : inst->VRegA_35c(); uint32_t arg[5]; if (!is_range) { @@ -3484,7 +3478,7 @@ void MethodVerifier::VerifyAGet(const Instruction* inst, Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "not array type " << array_type << " with aget"; } else { /* verify the class */ - RegType& component_type = reg_types_.GetComponentType(array_type, class_loader_->Get()); + RegType& component_type = reg_types_.GetComponentType(array_type, GetClassLoader()); if (!component_type.IsReferenceTypes() && !is_primitive) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "primitive array type " << array_type << " source for aget-object"; @@ -3563,7 +3557,7 @@ void MethodVerifier::VerifyAPut(const Instruction* inst, } else if (!array_type.IsArrayTypes()) { Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "not array type " << array_type << " with aput"; } else { - RegType& component_type = reg_types_.GetComponentType(array_type, class_loader_->Get()); + RegType& component_type = reg_types_.GetComponentType(array_type, GetClassLoader()); const uint32_t vregA = inst->VRegA_23x(); if (is_primitive) { VerifyPrimitivePut(component_type, insn_type, vregA); @@ -3596,8 +3590,8 @@ mirror::ArtField* MethodVerifier::GetStaticField(int field_idx) { return NULL; // Can't resolve Class so no more to do here, will do checking at runtime. } ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); - mirror::ArtField* field = class_linker->ResolveFieldJLS(*dex_file_, field_idx, *dex_cache_, - *class_loader_); + mirror::ArtField* field = class_linker->ResolveFieldJLS(*dex_file_, field_idx, dex_cache_, + class_loader_); if (field == NULL) { VLOG(verifier) << "Unable to resolve static field " << field_idx << " (" << dex_file_->GetFieldName(field_id) << ") in " @@ -3631,8 +3625,8 @@ mirror::ArtField* MethodVerifier::GetInstanceField(RegType& obj_type, int field_ return NULL; // Can't resolve Class so no more to do here } ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); - mirror::ArtField* field = class_linker->ResolveFieldJLS(*dex_file_, field_idx, *dex_cache_, - *class_loader_); + mirror::ArtField* field = class_linker->ResolveFieldJLS(*dex_file_, field_idx, dex_cache_, + class_loader_); if (field == NULL) { VLOG(verifier) << "Unable to resolve instance field " << field_idx << " (" << dex_file_->GetFieldName(field_id) << ") in " @@ -3714,7 +3708,7 @@ void MethodVerifier::VerifyISGet(const Instruction* inst, RegType& insn_type, if (field_type == nullptr) { const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx); const char* descriptor = dex_file_->GetFieldTypeDescriptor(field_id); - field_type = ®_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + field_type = ®_types_.FromDescriptor(GetClassLoader(), descriptor, false); } DCHECK(field_type != nullptr); const uint32_t vregA = (is_static) ? inst->VRegA_21c() : inst->VRegA_22c(); @@ -3786,7 +3780,7 @@ void MethodVerifier::VerifyISPut(const Instruction* inst, RegType& insn_type, if (field_type == nullptr) { const DexFile::FieldId& field_id = dex_file_->GetFieldId(field_idx); const char* descriptor = dex_file_->GetFieldTypeDescriptor(field_id); - field_type = ®_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + field_type = ®_types_.FromDescriptor(GetClassLoader(), descriptor, false); } DCHECK(field_type != nullptr); const uint32_t vregA = (is_static) ? inst->VRegA_21c() : inst->VRegA_22c(); @@ -4032,8 +4026,9 @@ RegType& MethodVerifier::GetMethodReturnType() { if (return_type_ == nullptr) { if (mirror_method_.Get() != nullptr) { Thread* self = Thread::Current(); - mirror::Class* return_type_class; - return_type_class = MethodHelper(mirror_method_).GetReturnType(can_load_classes_); + StackHandleScope<1> hs(self); + mirror::Class* return_type_class = + MethodHelper(hs.NewHandle(mirror_method_.Get())).GetReturnType(can_load_classes_); if (return_type_class != nullptr) { return_type_ = ®_types_.FromClass(mirror_method_->GetReturnTypeDescriptor(), return_type_class, @@ -4048,7 +4043,7 @@ RegType& MethodVerifier::GetMethodReturnType() { const DexFile::ProtoId& proto_id = dex_file_->GetMethodPrototype(method_id); uint16_t return_type_idx = proto_id.return_type_idx_; const char* descriptor = dex_file_->GetTypeDescriptor(dex_file_->GetTypeId(return_type_idx)); - return_type_ = ®_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + return_type_ = ®_types_.FromDescriptor(GetClassLoader(), descriptor, false); } } return *return_type_; @@ -4064,7 +4059,7 @@ RegType& MethodVerifier::GetDeclaringClass() { declaring_class_ = ®_types_.FromClass(descriptor, klass, klass->CannotBeAssignedFromOtherTypes()); } else { - declaring_class_ = ®_types_.FromDescriptor(class_loader_->Get(), descriptor, false); + declaring_class_ = ®_types_.FromDescriptor(GetClassLoader(), descriptor, false); } } return *declaring_class_; diff --git a/runtime/verifier/method_verifier.h b/runtime/verifier/method_verifier.h index 78cbe0693d..af33414c86 100644 --- a/runtime/verifier/method_verifier.h +++ b/runtime/verifier/method_verifier.h @@ -142,18 +142,18 @@ class MethodVerifier { /* Verify a class. Returns "kNoFailure" on success. */ static FailureKind VerifyClass(mirror::Class* klass, bool allow_soft_failures, std::string* error) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - static FailureKind VerifyClass(const DexFile* dex_file, Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + static FailureKind VerifyClass(const DexFile* dex_file, ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, bool allow_soft_failures, std::string* error) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); static void VerifyMethodAndDump(std::ostream& os, uint32_t method_idx, const DexFile* dex_file, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, const DexFile::CodeItem* code_item, - Handle<mirror::ArtMethod> method, uint32_t method_access_flags) + ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); uint8_t EncodePcToReferenceMapData() const; @@ -202,9 +202,10 @@ class MethodVerifier { return can_load_classes_; } - MethodVerifier(const DexFile* dex_file, Handle<mirror::DexCache>* dex_cache, - Handle<mirror::ClassLoader>* class_loader, const DexFile::ClassDef* class_def, - const DexFile::CodeItem* code_item, uint32_t method_idx, Handle<mirror::ArtMethod> method, + MethodVerifier(const DexFile* dex_file, ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def, + const DexFile::CodeItem* code_item, uint32_t method_idx, + ConstHandle<mirror::ArtMethod> method, uint32_t access_flags, bool can_load_classes, bool allow_soft_failures, bool need_precise_constants) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -253,11 +254,11 @@ class MethodVerifier { * for code flow problems. */ static FailureKind VerifyMethod(uint32_t method_idx, const DexFile* dex_file, - Handle<mirror::DexCache> dex_cache, - Handle<mirror::ClassLoader> class_loader, + ConstHandle<mirror::DexCache> dex_cache, + ConstHandle<mirror::ClassLoader> class_loader, const DexFile::ClassDef* class_def_idx, const DexFile::CodeItem* code_item, - Handle<mirror::ArtMethod> method, uint32_t method_access_flags, + ConstHandle<mirror::ArtMethod> method, uint32_t method_access_flags, bool allow_soft_failures, bool need_precise_constants) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -640,14 +641,14 @@ class MethodVerifier { const uint32_t dex_method_idx_; // The method we're working on. // Its object representation if known. - Handle<mirror::ArtMethod> mirror_method_ GUARDED_BY(Locks::mutator_lock_); + ConstHandle<mirror::ArtMethod> mirror_method_ GUARDED_BY(Locks::mutator_lock_); const uint32_t method_access_flags_; // Method's access flags. RegType* return_type_; // Lazily computed return type of the method. const DexFile* const dex_file_; // The dex file containing the method. // The dex_cache for the declaring class of the method. - Handle<mirror::DexCache>* dex_cache_ GUARDED_BY(Locks::mutator_lock_); + ConstHandle<mirror::DexCache> dex_cache_ GUARDED_BY(Locks::mutator_lock_); // The class loader for the declaring class of the method. - Handle<mirror::ClassLoader>* class_loader_ GUARDED_BY(Locks::mutator_lock_); + ConstHandle<mirror::ClassLoader> class_loader_ GUARDED_BY(Locks::mutator_lock_); const DexFile::ClassDef* const class_def_; // The class def of the declaring class of the method. const DexFile::CodeItem* const code_item_; // The code item containing the code for the method. RegType* declaring_class_; // Lazily computed reg type of the method's declaring class. |