From 7ce4b3d4c1c562959a8a3640df764ab50f1cbdf1 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Thu, 4 Jun 2015 18:02:34 +0100 Subject: [PATCH] Do a type check for knowing if we can inline. Otherwise, we might successfully inline: ((String)nonStringObject).charAt() Because the lookup of the method is based on the index of charAt, and not its name. Change-Id: I72ce802fd50cfb71343197f0a32bb1ef56549097 --- compiler/optimizing/inliner.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index ea613b2b0..07d0dd6b4 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -120,6 +120,9 @@ static ArtMethod* FindVirtualOrInterfaceTarget(HInvoke* invoke, ArtMethod* resol // Statically knowing that the receiver has an interface type cannot // help us find what is the target method. return nullptr; + } else if (!resolved_method->GetDeclaringClass()->IsAssignableFrom(info.GetTypeHandle().Get())) { + // The method that we're trying to call is not in the receiver's class or super classes. + return nullptr; } ClassLinker* cl = Runtime::Current()->GetClassLinker(); -- 2.11.0