From 19a4d374738da4dc668a078f92dbe887ff9f00d9 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Thu, 8 Dec 2016 14:41:46 +0000 Subject: Clean up Class::GetDirectInterface(). Once the `klass` has been resolved, this function should not need to resolve interface types anymore. Drop the type resolution from this function and pass the Class as ObjPtr<> instead of Handle<>. Make callers that expect non-null result DCHECK() that assumption. For the callers that may actually need to resolve these interface classes, introduce a new function ResolveDirectInterface(). Also improve ObjPtr<> constructors and assignment operator to improve overload resolution. For example, if we have foo(ObjPtr) and foo(ObjPtr), calling foo(.) with a T1* would have previously been ambiguous even if T1 is not a base of T2. Test: m test-art-host Change-Id: Iff44a7285f68f0af4507fc9ba37343865422fe84 --- compiler/driver/compiler_driver.cc | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'compiler/driver/compiler_driver.cc') diff --git a/compiler/driver/compiler_driver.cc b/compiler/driver/compiler_driver.cc index a2bab80b85..e62bdb5530 100644 --- a/compiler/driver/compiler_driver.cc +++ b/compiler/driver/compiler_driver.cc @@ -1188,13 +1188,12 @@ void CompilerDriver::LoadImageClasses(TimingLogger* timings) { CHECK_NE(image_classes_->size(), 0U); } -static void MaybeAddToImageClasses(Handle c, +static void MaybeAddToImageClasses(Thread* self, + ObjPtr klass, std::unordered_set* image_classes) REQUIRES_SHARED(Locks::mutator_lock_) { - Thread* self = Thread::Current(); + DCHECK_EQ(self, Thread::Current()); StackHandleScope<1> hs(self); - // Make a copy of the handle so that we don't clobber it doing Assign. - MutableHandle klass(hs.NewHandle(c.Get())); std::string temp; const PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); while (!klass->IsObjectClass()) { @@ -1205,19 +1204,16 @@ static void MaybeAddToImageClasses(Handle c, break; } VLOG(compiler) << "Adding " << descriptor << " to image classes"; - for (size_t i = 0; i < klass->NumDirectInterfaces(); ++i) { - StackHandleScope<1> hs2(self); - // May cause thread suspension. - MaybeAddToImageClasses(hs2.NewHandle(mirror::Class::GetDirectInterface(self, klass, i)), - image_classes); + for (size_t i = 0, num_interfaces = klass->NumDirectInterfaces(); i != num_interfaces; ++i) { + ObjPtr interface = mirror::Class::GetDirectInterface(self, klass, i); + DCHECK(interface != nullptr); + MaybeAddToImageClasses(self, interface, image_classes); } - for (auto& m : c->GetVirtualMethods(pointer_size)) { - StackHandleScope<1> hs2(self); - MaybeAddToImageClasses(hs2.NewHandle(m.GetDeclaringClass()), image_classes); + for (auto& m : klass->GetVirtualMethods(pointer_size)) { + MaybeAddToImageClasses(self, m.GetDeclaringClass(), image_classes); } if (klass->IsArrayClass()) { - StackHandleScope<1> hs2(self); - MaybeAddToImageClasses(hs2.NewHandle(klass->GetComponentType()), image_classes); + MaybeAddToImageClasses(self, klass->GetComponentType(), image_classes); } klass.Assign(klass->GetSuperClass()); } @@ -1268,8 +1264,10 @@ class ClinitImageUpdate { for (Handle klass_root : image_classes_) { VisitClinitClassesObject(klass_root.Get()); } + Thread* self = Thread::Current(); + ScopedAssertNoThreadSuspension ants(__FUNCTION__); for (Handle h_klass : to_insert_) { - MaybeAddToImageClasses(h_klass, image_class_descriptors_); + MaybeAddToImageClasses(self, h_klass.Get(), image_class_descriptors_); } } -- cgit v1.2.3-59-g8ed1b