8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
Reviewed-by: kvn
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Tue Jul 02 07:51:31 2013 +0200
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Tue Jul 02 20:27:00 2013 -0700
@@ -1137,7 +1137,12 @@
if (VerifyMethodHandles && caller_jh != NULL &&
java_lang_invoke_MemberName::clazz(mname()) != NULL) {
Klass* reference_klass = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname()));
- if (reference_klass != NULL) {
+ if (reference_klass != NULL && reference_klass->oop_is_objArray()) {
+ reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass();
+ }
+
+ // Reflection::verify_class_access can only handle instance classes.
+ if (reference_klass != NULL && reference_klass->oop_is_instance()) {
// Emulate LinkResolver::check_klass_accessability.
Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh));
if (!Reflection::verify_class_access(caller,
--- a/hotspot/src/share/vm/runtime/reflection.cpp Tue Jul 02 07:51:31 2013 +0200
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Tue Jul 02 20:27:00 2013 -0700
@@ -458,7 +458,7 @@
// doesn't have a classloader.
if ((current_class == NULL) ||
(current_class == new_class) ||
- (InstanceKlass::cast(new_class)->is_public()) ||
+ (new_class->is_public()) ||
is_same_class_package(current_class, new_class)) {
return true;
}