Hi, Joel

  This bug is a SQE testing bug, see
https://bugs.openjdk.java.net/browse/JDK-8027734 <https://bugs.openjdk.java.net/browse/JDK-8027734>

  I have commented with the exception stacktrace.

It only fails when defmeth set call through reflection and passed with other two modes: -mode invoke and -mode direct

The problem I got is from this part: Reflection.java:118 (verifyMemberAccess)

if (!Modifier.isPublic(getClassAccessFlags(memberClass))) { // here memberClass is p1.I which is not a public isSameClassPackage = isSameClassPackage(currentClass, memberClass); // Not in same class
            gotIsSameClassPackage = true;
            if (!isSameClassPackage) {
                return false; // so we return false.
            }
        }

        // At this point we know that currentClass can access memberClass.

        if (Modifier.isPublic(modifiers)) {
            return true;
        }

memberClass is p1.I is a private interface, but its sub p1.J is a public interface. The default method is in I:

    /* In package1:
     * package p1;
     * interface I {
     *     default int m() { return 10; };
     * }
     * public interface J extends I {};
     *
     * In package2:
     * class A implements p1.J {}
     * A myA = new A;
     * myA.m();  // should return 10, not throw IllegalAccessError
     * B myB = new B;  // not related
     */

Now defmeth caller is TestContext, which is not in same package with interface I, this leads verify failed. 'modifiers' is public, but we check if the caller class and calee class in same package first and returned false, since they do not exist in same package. If we check the following statement first, we will return true. I am not familiar with this code, can you or some other people on the list give comments?

Thanks
Yumin




On 10/10/2013 6:02 AM, Joel Borggren-Franck wrote:
Hi Karen,

I agree with the others, the code looks good though I like Paul's
suggestion.

Silly question perhaps, do you know if we have good test coverage on
actually reflectively invoking a Method more than 15 times?

cheers
/Joel

On 2013-10-09, Karen Kinnear wrote:
Please review:

webrev: http://cr.openjdk.java.net/~acorn/8026213/webrev/
bug: https://bugs.openjdk.java.net/browse/JDK-8026213

Summary:
Reflection generates code dynamically to speed up reflection processing after 
startup. The first
15 runs of a reflection call  use the vm code path, after that we use the 
generated code path, which
needs to use invokespecial on private methods in interfaces.

Tested:
Test attached to the bug

Also - all the 8011311 private method testing was run with this in the build:
Robert Field's TypeTest
8025475 test
defmeth privatemethodstest with reflection
John Rose's intfbug
jtreg: java.util, java.lang
jck vm, lang

thanks,
Karen



Reply via email to