ART: Remove ArtMethod::IsAnnotatedWithPolymorphicSignature

Avoids relying on PolymorphicSignature annotation in determining
whether a method is signature polymorphic.

Bug: 65872996
Test: art/test.py --host -j32
Change-Id: If064b92575bf4e4d7eba5dc5332f780e96054fe2
diff --git a/runtime/art_method.cc b/runtime/art_method.cc
index 80f5c34..b5e0f66 100644
--- a/runtime/art_method.cc
+++ b/runtime/art_method.cc
@@ -417,6 +417,17 @@
   return GetDeclaringClass()->IsInterface();
 }
 
+bool ArtMethod::IsPolymorphicSignature() {
+  // Methods with a polymorphic signature have constraints that they
+  // are native and varargs and belong to either MethodHandle or VarHandle.
+  if (!IsNative() || !IsVarargs()) {
+    return false;
+  }
+  mirror::Class* cls = GetDeclaringClass();
+  return (cls == WellKnownClasses::ToClass(WellKnownClasses::java_lang_invoke_MethodHandle) ||
+          cls == WellKnownClasses::ToClass(WellKnownClasses::java_lang_invoke_VarHandle));
+}
+
 bool ArtMethod::IsAnnotatedWithFastNative() {
   return IsAnnotatedWith(WellKnownClasses::dalvik_annotation_optimization_FastNative,
                          DexFile::kDexVisibilityBuild,
@@ -429,12 +440,6 @@
                          /* lookup_in_resolved_boot_classes */ true);
 }
 
-bool ArtMethod::IsAnnotatedWithPolymorphicSignature() {
-  return IsAnnotatedWith(WellKnownClasses::java_lang_invoke_MethodHandle_PolymorphicSignature,
-                         DexFile::kDexVisibilityRuntime,
-                         /* lookup_in_resolved_boot_classes */ true);
-}
-
 bool ArtMethod::IsAnnotatedWith(jclass klass,
                                 uint32_t visibility,
                                 bool lookup_in_resolved_boot_classes) {
diff --git a/runtime/art_method.h b/runtime/art_method.h
index fe85cb4..ca2e34e 100644
--- a/runtime/art_method.h
+++ b/runtime/art_method.h
@@ -271,11 +271,7 @@
 
   bool IsProxyMethod() REQUIRES_SHARED(Locks::mutator_lock_);
 
-  bool IsPolymorphicSignature() REQUIRES_SHARED(Locks::mutator_lock_) {
-    // Methods with a polymorphic signature have constraints that they
-    // are native and varargs. Check these first before possibly expensive call.
-    return IsNative() && IsVarargs() && IsAnnotatedWithPolymorphicSignature();
-  }
+  bool IsPolymorphicSignature() REQUIRES_SHARED(Locks::mutator_lock_);
 
   bool SkipAccessChecks() {
     return (GetAccessFlags() & kAccSkipAccessChecks) != 0;
@@ -322,10 +318,6 @@
   // -- Unrelated to the GC notion of "critical".
   bool IsAnnotatedWithCriticalNative();
 
-  // Checks to see if the method was annotated with
-  // @java.lang.invoke.MethodHandle.PolymorphicSignature.
-  bool IsAnnotatedWithPolymorphicSignature();
-
   // Returns true if this method could be overridden by a default method.
   bool IsOverridableByDefaultMethod() REQUIRES_SHARED(Locks::mutator_lock_);
 
diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc
index 829dea9..9722db9 100644
--- a/runtime/well_known_classes.cc
+++ b/runtime/well_known_classes.cc
@@ -52,7 +52,7 @@
 jclass WellKnownClasses::java_lang_Daemons;
 jclass WellKnownClasses::java_lang_Error;
 jclass WellKnownClasses::java_lang_invoke_MethodHandle;
-jclass WellKnownClasses::java_lang_invoke_MethodHandle_PolymorphicSignature;
+jclass WellKnownClasses::java_lang_invoke_VarHandle;
 jclass WellKnownClasses::java_lang_IllegalAccessError;
 jclass WellKnownClasses::java_lang_NoClassDefFoundError;
 jclass WellKnownClasses::java_lang_Object;
@@ -299,7 +299,7 @@
   java_lang_Error = CacheClass(env, "java/lang/Error");
   java_lang_IllegalAccessError = CacheClass(env, "java/lang/IllegalAccessError");
   java_lang_invoke_MethodHandle = CacheClass(env, "java/lang/invoke/MethodHandle");
-  java_lang_invoke_MethodHandle_PolymorphicSignature = CacheClass(env, "java/lang/invoke/MethodHandle$PolymorphicSignature");
+  java_lang_invoke_VarHandle = CacheClass(env, "java/lang/invoke/VarHandle");
   java_lang_NoClassDefFoundError = CacheClass(env, "java/lang/NoClassDefFoundError");
   java_lang_reflect_Constructor = CacheClass(env, "java/lang/reflect/Constructor");
   java_lang_reflect_Executable = CacheClass(env, "java/lang/reflect/Executable");
@@ -437,7 +437,7 @@
   java_lang_Error = nullptr;
   java_lang_IllegalAccessError = nullptr;
   java_lang_invoke_MethodHandle = nullptr;
-  java_lang_invoke_MethodHandle_PolymorphicSignature = nullptr;
+  java_lang_invoke_VarHandle = nullptr;
   java_lang_NoClassDefFoundError = nullptr;
   java_lang_Object = nullptr;
   java_lang_OutOfMemoryError = nullptr;
diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h
index b2fd4d6..3ebcc33 100644
--- a/runtime/well_known_classes.h
+++ b/runtime/well_known_classes.h
@@ -64,7 +64,7 @@
   static jclass java_lang_Error;
   static jclass java_lang_IllegalAccessError;
   static jclass java_lang_invoke_MethodHandle;
-  static jclass java_lang_invoke_MethodHandle_PolymorphicSignature;
+  static jclass java_lang_invoke_VarHandle;
   static jclass java_lang_NoClassDefFoundError;
   static jclass java_lang_Object;
   static jclass java_lang_OutOfMemoryError;