diff options
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 106 |
1 files changed, 55 insertions, 51 deletions
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) { |