Tue, 02 Jul 2013 20:27:00 -0700
8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual
Reviewed-by: kvn
src/share/vm/prims/methodHandles.cpp | file | annotate | diff | comparison | revisions | |
src/share/vm/runtime/reflection.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/prims/methodHandles.cpp Tue Jul 02 07:51:31 2013 +0200 1.2 +++ b/src/share/vm/prims/methodHandles.cpp Tue Jul 02 20:27:00 2013 -0700 1.3 @@ -1137,7 +1137,12 @@ 1.4 if (VerifyMethodHandles && caller_jh != NULL && 1.5 java_lang_invoke_MemberName::clazz(mname()) != NULL) { 1.6 Klass* reference_klass = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(mname())); 1.7 - if (reference_klass != NULL) { 1.8 + if (reference_klass != NULL && reference_klass->oop_is_objArray()) { 1.9 + reference_klass = ObjArrayKlass::cast(reference_klass)->bottom_klass(); 1.10 + } 1.11 + 1.12 + // Reflection::verify_class_access can only handle instance classes. 1.13 + if (reference_klass != NULL && reference_klass->oop_is_instance()) { 1.14 // Emulate LinkResolver::check_klass_accessability. 1.15 Klass* caller = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(caller_jh)); 1.16 if (!Reflection::verify_class_access(caller,
2.1 --- a/src/share/vm/runtime/reflection.cpp Tue Jul 02 07:51:31 2013 +0200 2.2 +++ b/src/share/vm/runtime/reflection.cpp Tue Jul 02 20:27:00 2013 -0700 2.3 @@ -458,7 +458,7 @@ 2.4 // doesn't have a classloader. 2.5 if ((current_class == NULL) || 2.6 (current_class == new_class) || 2.7 - (InstanceKlass::cast(new_class)->is_public()) || 2.8 + (new_class->is_public()) || 2.9 is_same_class_package(current_class, new_class)) { 2.10 return true; 2.11 }