8017571: JSR292: JVM crashing on assert "cast to instanceKlass" while producing MethodHandle for array methods with MethodHandle.findVirtual

Tue, 02 Jul 2013 20:27:00 -0700

author
twisti
date
Tue, 02 Jul 2013 20:27:00 -0700
changeset 5354
c1bd7b5bdc70
parent 5352
738e04fb1232
child 5355
bed0eddd82cd

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    }

mercurial