diff options
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 151 |
1 files changed, 82 insertions, 69 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index afff7a2e7b..c7302b5a73 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -1369,7 +1369,7 @@ static mirror::Class* EnsureResolved(Thread* self, mirror::Class* klass) } mirror::Class* ClassLinker::FindClass(Thread* self, const char* descriptor, - Handle<mirror::ClassLoader> class_loader) { + const Handle<mirror::ClassLoader>& class_loader) { DCHECK_NE(*descriptor, '\0') << "descriptor is empty string"; DCHECK(self != nullptr); self->AssertNoPendingException(); @@ -1390,7 +1390,8 @@ mirror::Class* ClassLinker::FindClass(Thread* self, const char* descriptor, DexFile::ClassPathEntry pair = DexFile::FindInClassPath(descriptor, boot_class_path_); if (pair.second != NULL) { StackHandleScope<1> hs(self); - return DefineClass(descriptor, NullHandle<mirror::ClassLoader>(), *pair.first, *pair.second); + auto class_loader = hs.NewHandle<mirror::ClassLoader>(nullptr); + return DefineClass(descriptor, class_loader, *pair.first, *pair.second); } } else if (Runtime::Current()->UseCompileTimeClassPath()) { // First try the boot class path, we check the descriptor first to avoid an unnecessary @@ -1451,7 +1452,7 @@ mirror::Class* ClassLinker::FindClass(Thread* self, const char* descriptor, } mirror::Class* ClassLinker::DefineClass(const char* descriptor, - Handle<mirror::ClassLoader> class_loader, + const Handle<mirror::ClassLoader>& class_loader, const DexFile& dex_file, const DexFile::ClassDef& dex_class_def) { Thread* self = Thread::Current(); @@ -1795,9 +1796,10 @@ 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(const Handle<mirror::ArtMethod>& method, + const OatFile::OatClass* oat_class, const DexFile& dex_file, uint32_t dex_method_index, - uint32_t method_index) { + uint32_t method_index) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { // Method shouldn't have already been linked. DCHECK(method->GetEntryPointFromQuickCompiledCode() == nullptr); DCHECK(method->GetEntryPointFromPortableCompiledCode() == nullptr); @@ -1869,7 +1871,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, + const Handle<mirror::Class>& klass, mirror::ClassLoader* class_loader) { CHECK(klass.Get() != NULL); CHECK(klass->GetDexCache() != NULL); @@ -1907,7 +1909,7 @@ void ClassLinker::LoadClass(const DexFile& dex_file, void ClassLinker::LoadClassMembers(const DexFile& dex_file, const byte* class_data, - Handle<mirror::Class> klass, + const Handle<mirror::Class>& klass, mirror::ClassLoader* class_loader, const OatFile::OatClass* oat_class) { // Load fields. @@ -2005,7 +2007,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) { + const Handle<mirror::Class>& klass, + const Handle<mirror::ArtField>& dst) { uint32_t field_idx = it.GetMemberIndex(); dst->SetDexFieldIndex(field_idx); dst->SetDeclaringClass(klass.Get()); @@ -2014,7 +2017,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) { + const Handle<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_); @@ -2085,7 +2088,7 @@ void ClassLinker::AppendToBootClassPath(const DexFile& dex_file) { } void ClassLinker::AppendToBootClassPath(const DexFile& dex_file, - Handle<mirror::DexCache> dex_cache) { + const Handle<mirror::DexCache>& dex_cache) { CHECK(dex_cache.Get() != NULL) << dex_file.GetLocation(); boot_class_path_.push_back(&dex_file); RegisterDexFile(dex_file, dex_cache); @@ -2107,7 +2110,7 @@ bool ClassLinker::IsDexFileRegistered(const DexFile& dex_file) const { } void ClassLinker::RegisterDexFileLocked(const DexFile& dex_file, - Handle<mirror::DexCache> dex_cache) { + const Handle<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())) @@ -2144,7 +2147,7 @@ void ClassLinker::RegisterDexFile(const DexFile& dex_file) { } void ClassLinker::RegisterDexFile(const DexFile& dex_file, - Handle<mirror::DexCache> dex_cache) { + const Handle<mirror::DexCache>& dex_cache) { WriterMutexLock mu(Thread::Current(), dex_lock_); RegisterDexFileLocked(dex_file, dex_cache); } @@ -2221,7 +2224,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) { + const Handle<mirror::ClassLoader>& class_loader) { // Identify the underlying component type CHECK_EQ('[', descriptor[0]); StackHandleScope<2> hs(self); @@ -2413,7 +2416,7 @@ bool ClassLinker::RemoveClass(const char* descriptor, const mirror::ClassLoader* it != end && it->first == hash; ++it) { mirror::Class* klass = it->second; - if (klass->GetClassLoader() == class_loader && klass->DescriptorEquals(descriptor)) { + if (klass->GetClassLoader() == class_loader && descriptor == klass->GetDescriptor()) { class_table_.erase(it); return true; } @@ -2457,13 +2460,13 @@ mirror::Class* ClassLinker::LookupClassFromTableLocked(const char* descriptor, auto end = class_table_.end(); for (auto it = class_table_.lower_bound(hash); it != end && it->first == hash; ++it) { mirror::Class* klass = it->second; - if (klass->GetClassLoader() == class_loader && klass->DescriptorEquals(descriptor)) { + if (klass->GetClassLoader() == class_loader && descriptor == klass->GetDescriptor()) { if (kIsDebugBuild) { // Check for duplicates in the table. for (++it; it != end && it->first == hash; ++it) { mirror::Class* klass2 = it->second; - CHECK(!(klass2->GetClassLoader() == class_loader && - klass2->DescriptorEquals(descriptor))) + CHECK(!((klass2->GetClassLoader() == class_loader) && + descriptor == klass2->GetDescriptor())) << PrettyClass(klass) << " " << klass << " " << klass->GetClassLoader() << " " << PrettyClass(klass2) << " " << klass2 << " " << klass2->GetClassLoader(); } @@ -2554,13 +2557,13 @@ void ClassLinker::LookupClasses(const char* descriptor, std::vector<mirror::Clas for (auto it = class_table_.lower_bound(hash), end = class_table_.end(); it != end && it->first == hash; ++it) { mirror::Class* klass = it->second; - if (klass->DescriptorEquals(descriptor)) { + if (descriptor == klass->GetDescriptor()) { result.push_back(klass); } } } -void ClassLinker::VerifyClass(Handle<mirror::Class> klass) { +void ClassLinker::VerifyClass(const Handle<mirror::Class>& klass) { // TODO: assert that the monitor on the Class is held Thread* self = Thread::Current(); ObjectLock<mirror::Class> lock(self, klass); @@ -2773,7 +2776,7 @@ bool ClassLinker::VerifyClassUsingOatFile(const DexFile& dex_file, mirror::Class } void ClassLinker::ResolveClassExceptionHandlerTypes(const DexFile& dex_file, - Handle<mirror::Class> klass) { + const Handle<mirror::Class>& klass) { for (size_t i = 0; i < klass->NumDirectMethods(); i++) { ResolveMethodExceptionHandlerTypes(dex_file, klass->GetDirectMethod(i)); } @@ -2814,7 +2817,7 @@ void ClassLinker::ResolveMethodExceptionHandlerTypes(const DexFile& dex_file, static void CheckProxyConstructor(mirror::ArtMethod* constructor); static void CheckProxyMethod(mirror::ArtMethod* method, - Handle<mirror::ArtMethod> prototype); + Handle<mirror::ArtMethod>& prototype); mirror::Class* ClassLinker::CreateProxyClass(ScopedObjectAccessAlreadyRunnable& soa, jstring name, jobjectArray interfaces, jobject loader, @@ -2996,7 +2999,7 @@ mirror::ArtMethod* ClassLinker::FindMethodForProxy(mirror::Class* proxy_class, mirror::ArtMethod* ClassLinker::CreateProxyConstructor(Thread* self, - Handle<mirror::Class> klass, + const Handle<mirror::Class>& klass, mirror::Class* proxy_class) { // Create constructor for Proxy that must initialize h mirror::ObjectArray<mirror::ArtMethod>* proxy_direct_methods = @@ -3027,8 +3030,8 @@ static void CheckProxyConstructor(mirror::ArtMethod* constructor) } mirror::ArtMethod* ClassLinker::CreateProxyMethod(Thread* self, - Handle<mirror::Class> klass, - Handle<mirror::ArtMethod> prototype) { + const Handle<mirror::Class>& klass, + const Handle<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(), @@ -3055,7 +3058,8 @@ mirror::ArtMethod* ClassLinker::CreateProxyMethod(Thread* self, return method; } -static void CheckProxyMethod(mirror::ArtMethod* method, Handle<mirror::ArtMethod> prototype) +static void CheckProxyMethod(mirror::ArtMethod* method, + Handle<mirror::ArtMethod>& prototype) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { // Basic sanity CHECK(!prototype->IsFinal()); @@ -3115,7 +3119,7 @@ bool ClassLinker::IsInitialized() const { return init_done_; } -bool ClassLinker::InitializeClass(Handle<mirror::Class> klass, bool can_init_statics, +bool ClassLinker::InitializeClass(const Handle<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 @@ -3282,7 +3286,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(const Handle<mirror::Class>& klass, Thread* self, ObjectLock<mirror::Class>& lock) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { while (true) { @@ -3322,7 +3326,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(const Handle<mirror::Class>& klass) { if (klass->IsInterface()) { return true; } @@ -3364,12 +3368,18 @@ bool ClassLinker::ValidateSuperClassDescriptors(Handle<mirror::Class> klass) { return true; } -bool ClassLinker::EnsureInitialized(Handle<mirror::Class> c, bool can_init_fields, +bool ClassLinker::EnsureInitialized(const Handle<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); - if (!success && can_init_fields && can_init_parents) { - CHECK(Thread::Current()->IsExceptionPending()) << PrettyClass(c.Get()); + DCHECK(c.Get() != NULL); + if (c->IsInitialized()) { + return true; + } + + bool success = InitializeClass(c, can_init_fields, can_init_parents); + if (!success) { + if (can_init_fields && can_init_parents) { + CHECK(Thread::Current()->IsExceptionPending()) << PrettyClass(c.Get()); + } } return success; } @@ -3388,8 +3398,8 @@ void ClassLinker::ConstructFieldMap(const DexFile& dex_file, const DexFile::Clas } } -bool ClassLinker::LinkClass(Thread* self, Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) { +bool ClassLinker::LinkClass(Thread* self, const Handle<mirror::Class>& klass, + const Handle<mirror::ObjectArray<mirror::Class>>& interfaces) { CHECK_EQ(mirror::Class::kStatusLoaded, klass->GetStatus()); if (!LinkSuperClass(klass)) { return false; @@ -3410,7 +3420,8 @@ bool ClassLinker::LinkClass(Thread* self, Handle<mirror::Class> klass, return true; } -bool ClassLinker::LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexFile& dex_file) { +bool ClassLinker::LoadSuperAndInterfaces(const Handle<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_; @@ -3453,7 +3464,7 @@ bool ClassLinker::LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexF return true; } -bool ClassLinker::LinkSuperClass(Handle<mirror::Class> klass) { +bool ClassLinker::LinkSuperClass(const Handle<mirror::Class>& klass) { CHECK(!klass->IsPrimitive()); mirror::Class* super = klass->GetSuperClass(); if (klass.Get() == GetClassRoot(kJavaLangObject)) { @@ -3513,8 +3524,8 @@ bool ClassLinker::LinkSuperClass(Handle<mirror::Class> klass) { } // Populate the class vtable and itable. Compute return type indices. -bool ClassLinker::LinkMethods(Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) { +bool ClassLinker::LinkMethods(const Handle<mirror::Class>& klass, + const Handle<mirror::ObjectArray<mirror::Class>>& interfaces) { if (klass->IsInterface()) { // No vtable. size_t count = klass->NumVirtualMethods(); @@ -3534,7 +3545,7 @@ bool ClassLinker::LinkMethods(Handle<mirror::Class> klass, return true; } -bool ClassLinker::LinkVirtualMethods(Handle<mirror::Class> klass) { +bool ClassLinker::LinkVirtualMethods(const Handle<mirror::Class>& klass) { Thread* self = Thread::Current(); if (klass->HasSuperClass()) { uint32_t max_count = (klass->NumVirtualMethods() + @@ -3621,8 +3632,9 @@ bool ClassLinker::LinkVirtualMethods(Handle<mirror::Class> klass) { return true; } -bool ClassLinker::LinkInterfaceMethods(Handle<mirror::Class> klass, - Handle<mirror::ObjectArray<mirror::Class>> interfaces) { +bool ClassLinker::LinkInterfaceMethods( + const Handle<mirror::Class>& klass, + const Handle<mirror::ObjectArray<mirror::Class>>& interfaces) { Thread* const self = Thread::Current(); // Set the imt table to be all conflicts by default. klass->SetImTable(Runtime::Current()->GetDefaultImt()); @@ -3877,12 +3889,12 @@ bool ClassLinker::LinkInterfaceMethods(Handle<mirror::Class> klass, return true; } -bool ClassLinker::LinkInstanceFields(Handle<mirror::Class> klass) { +bool ClassLinker::LinkInstanceFields(const Handle<mirror::Class>& klass) { CHECK(klass.Get() != NULL); return LinkFields(klass, false); } -bool ClassLinker::LinkStaticFields(Handle<mirror::Class> klass) { +bool ClassLinker::LinkStaticFields(const Handle<mirror::Class>& klass) { CHECK(klass.Get() != NULL); size_t allocated_class_size = klass->GetClassSize(); bool success = LinkFields(klass, true); @@ -3921,7 +3933,7 @@ struct LinkFieldsComparator { } }; -bool ClassLinker::LinkFields(Handle<mirror::Class> klass, bool is_static) { +bool ClassLinker::LinkFields(const Handle<mirror::Class>& klass, bool is_static) { size_t num_fields = is_static ? klass->NumStaticFields() : klass->NumInstanceFields(); @@ -4017,7 +4029,7 @@ bool ClassLinker::LinkFields(Handle<mirror::Class> klass, bool is_static) { } // We lie to the GC about the java.lang.ref.Reference.referent field, so it doesn't scan it. - if (!is_static && klass->DescriptorEquals("Ljava/lang/ref/Reference;")) { + if (!is_static && "Ljava/lang/ref/Reference;" == klass->GetDescriptor()) { // We know there are no non-reference fields in the Reference classes, and we know // that 'referent' is alphabetically last, so this is easy... CHECK_EQ(num_reference_fields, num_fields) << PrettyClass(klass.Get()); @@ -4042,7 +4054,7 @@ bool ClassLinker::LinkFields(Handle<mirror::Class> klass, bool is_static) { FieldHelper fh(field); Primitive::Type type = fh.GetTypeAsPrimitiveType(); bool is_primitive = type != Primitive::kPrimNot; - if (klass->DescriptorEquals("Ljava/lang/ref/Reference;") && + if ("Ljava/lang/ref/Reference;" == klass->GetDescriptor() && strcmp("referent", fh.GetName()) == 0) { is_primitive = true; // We lied above, so we have to expect a lie here. } @@ -4081,7 +4093,7 @@ bool ClassLinker::LinkFields(Handle<mirror::Class> klass, bool is_static) { // Set the bitmap of reference offsets, refOffsets, from the ifields // list. -void ClassLinker::CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) { +void ClassLinker::CreateReferenceInstanceOffsets(const Handle<mirror::Class>& klass) { uint32_t reference_offsets = 0; mirror::Class* super_class = klass->GetSuperClass(); if (super_class != NULL) { @@ -4095,11 +4107,11 @@ void ClassLinker::CreateReferenceInstanceOffsets(Handle<mirror::Class> klass) { CreateReferenceOffsets(klass, false, reference_offsets); } -void ClassLinker::CreateReferenceStaticOffsets(Handle<mirror::Class> klass) { +void ClassLinker::CreateReferenceStaticOffsets(const Handle<mirror::Class>& klass) { CreateReferenceOffsets(klass, true, 0); } -void ClassLinker::CreateReferenceOffsets(Handle<mirror::Class> klass, bool is_static, +void ClassLinker::CreateReferenceOffsets(const Handle<mirror::Class>& klass, bool is_static, uint32_t reference_offsets) { size_t num_reference_fields = is_static ? klass->NumReferenceStaticFieldsDuringLinking() @@ -4132,7 +4144,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) { + const Handle<mirror::DexCache>& dex_cache) { DCHECK(dex_cache.Get() != nullptr); mirror::String* resolved = dex_cache->GetResolvedString(string_idx); if (resolved != NULL) { @@ -4154,8 +4166,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) { + const Handle<mirror::DexCache>& dex_cache, + const Handle<mirror::ClassLoader>& class_loader) { DCHECK(dex_cache.Get() != NULL); mirror::Class* resolved = dex_cache->GetResolvedType(type_idx); if (resolved == NULL) { @@ -4186,15 +4198,16 @@ mirror::Class* ClassLinker::ResolveType(const DexFile& dex_file, uint16_t type_i return resolved; } -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, +mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, + uint32_t method_idx, + const Handle<mirror::DexCache>& dex_cache, + const Handle<mirror::ClassLoader>& class_loader, + mirror::ArtMethod* referrer, InvokeType type) { DCHECK(dex_cache.Get() != NULL); // Check for hit in the dex cache. mirror::ArtMethod* resolved = dex_cache->GetResolvedMethod(method_idx); - if (resolved != nullptr && !resolved->IsRuntimeMethod()) { + if (resolved != NULL && !resolved->IsRuntimeMethod()) { return resolved; } // Fail, get the declaring class. @@ -4269,7 +4282,7 @@ mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, uint32_t } // If we found something, check that it can be accessed by the referrer. - if (resolved != NULL && referrer.Get() != NULL) { + if (resolved != NULL && referrer != NULL) { mirror::Class* methods_class = resolved->GetDeclaringClass(); mirror::Class* referring_class = referrer->GetDeclaringClass(); if (!referring_class->CanAccess(methods_class)) { @@ -4289,11 +4302,11 @@ mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, uint32_t case kDirect: case kStatic: if (resolved != NULL) { - ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer.Get()); + ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer); } else { resolved = klass->FindInterfaceMethod(name, signature); if (resolved != NULL) { - ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer.Get()); + ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer); } else { ThrowNoSuchMethodError(type, klass, name, signature); } @@ -4301,11 +4314,11 @@ mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, uint32_t break; case kInterface: if (resolved != NULL) { - ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer.Get()); + ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer); } else { resolved = klass->FindVirtualMethod(name, signature); if (resolved != NULL) { - ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer.Get()); + ThrowIncompatibleClassChangeError(type, kVirtual, resolved, referrer); } else { ThrowNoSuchMethodError(type, klass, name, signature); } @@ -4316,11 +4329,11 @@ mirror::ArtMethod* ClassLinker::ResolveMethod(const DexFile& dex_file, uint32_t break; case kVirtual: if (resolved != NULL) { - ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer.Get()); + ThrowIncompatibleClassChangeError(type, kDirect, resolved, referrer); } else { resolved = klass->FindInterfaceMethod(name, signature); if (resolved != NULL) { - ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer.Get()); + ThrowIncompatibleClassChangeError(type, kInterface, resolved, referrer); } else { ThrowNoSuchMethodError(type, klass, name, signature); } @@ -4333,8 +4346,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, + const Handle<mirror::DexCache>& dex_cache, + const Handle<mirror::ClassLoader>& class_loader, bool is_static) { DCHECK(dex_cache.Get() != nullptr); mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx); @@ -4376,8 +4389,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) { + const Handle<mirror::DexCache>& dex_cache, + const Handle<mirror::ClassLoader>& class_loader) { DCHECK(dex_cache.Get() != nullptr); mirror::ArtField* resolved = dex_cache->GetResolvedField(field_idx); if (resolved != NULL) { |