diff options
-rw-r--r-- | runtime/art_method.cc | 17 | ||||
-rw-r--r-- | runtime/art_method.h | 10 | ||||
-rw-r--r-- | runtime/well_known_classes.cc | 6 | ||||
-rw-r--r-- | runtime/well_known_classes.h | 2 |
4 files changed, 16 insertions, 19 deletions
diff --git a/runtime/art_method.cc b/runtime/art_method.cc index 80f5c348ee..b5e0f66575 100644 --- a/runtime/art_method.cc +++ b/runtime/art_method.cc @@ -417,6 +417,17 @@ bool ArtMethod::IsOverridableByDefaultMethod() { 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 @@ bool ArtMethod::IsAnnotatedWithCriticalNative() { /* 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 fe85cb4afa..ca2e34e071 100644 --- a/runtime/art_method.h +++ b/runtime/art_method.h @@ -271,11 +271,7 @@ class ArtMethod FINAL { 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 @@ class ArtMethod FINAL { // -- 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 829dea9107..9722db9641 100644 --- a/runtime/well_known_classes.cc +++ b/runtime/well_known_classes.cc @@ -52,7 +52,7 @@ jclass WellKnownClasses::java_lang_ClassNotFoundException; 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 @@ void WellKnownClasses::Init(JNIEnv* env) { 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 @@ void WellKnownClasses::Clear() { 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 b2fd4d6e4c..3ebcc33171 100644 --- a/runtime/well_known_classes.h +++ b/runtime/well_known_classes.h @@ -64,7 +64,7 @@ struct WellKnownClasses { 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; |