hotspot/test/runtime/jni/PrivateInterfaceMethods/PrivateInterfaceMethods.java
author dholmes
Mon, 03 Oct 2016 21:48:21 -0400
changeset 41669 2091069b6851
child 41742 9ecf02bc1662
permissions -rw-r--r--
8081800: AbstractMethodError when evaluating a private method in an interface via debugger Reviewed-by: acorn, dcubed, coleenp
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41669
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     1
/*
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     4
 *
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     7
 * published by the Free Software Foundation.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     8
 *
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    13
 * accompanied this code).
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    14
 *
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    18
 *
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    21
 * questions.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    22
 */
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    23
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    24
/* @test
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    25
 * @bug 8081800
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    26
 * @summary Add JNI invocation tests for private interface methods
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    27
 * @run main/native PrivateInterfaceMethods
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    28
 */
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    29
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    30
public class PrivateInterfaceMethods {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    31
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    32
    static {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    33
        System.loadLibrary("PrivateInterfaceMethods");
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    34
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    35
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    36
    static native int callIntVoid(Object target, String definingClassName, String methodName, boolean virtual);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    37
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    38
    static interface A {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    39
        static final int AmResult = 1;
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    40
        private int m() { return AmResult; }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    41
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    42
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    43
    static interface B extends A {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    44
        // No m() here
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    45
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    46
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    47
    static interface C extends B {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    48
        static final int CmResult = 2;
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    49
        private int m() { return CmResult; }  // unrelated to A.m
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    50
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    51
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    52
    public static class Impl implements C {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    53
        static final int ImplmResult = 3;
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    54
        private int m() { return ImplmResult; } // unrelated to A.m or C.m
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    55
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    56
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    57
    // We found that itable/vtable construction was affected by whether or not the
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    58
    // implementation class declared a method with the same signature as the
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    59
    // private interface method, so we test both variants.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    60
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    61
    public static class Impl2 implements C {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    62
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    63
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    64
    public static void main(String[] args) {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    65
        Impl impl = new Impl();
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    66
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    67
        // Note: JNI doesn't enforce access control so we can make
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    68
        //       private calls not possible in Java code.
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    69
        //       Also it doesn't check that the receiver is a type that
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    70
        //       defines the method!
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    71
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    72
        // test: ((A)impl).m() - should succeed
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    73
        test(impl, A.class.getName(), "m", A.AmResult, true, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    74
        test(impl, A.class.getName(), "m", A.AmResult, false, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    75
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    76
        // test: ((B)impl).m() - should fail: NoSuchMethodError
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    77
        test(impl, B.class.getName(), "m", -1, true, NoSuchMethodError.class);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    78
        test(impl, B.class.getName(), "m", -1, false, NoSuchMethodError.class);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    79
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    80
        // test: ((C)impl).m() - should succeed
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    81
        test(impl, C.class.getName(), "m", C.CmResult, true, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    82
        test(impl, C.class.getName(), "m", C.CmResult, false, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    83
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    84
        // test: impl.m() - should succeed
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    85
        test(impl, Impl.class.getName(), "m", Impl.ImplmResult, true, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    86
        test(impl, Impl.class.getName(), "m", Impl.ImplmResult, false, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    87
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    88
        // ---
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    89
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    90
        Impl2 impl2 = new Impl2();
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    91
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    92
        // test: ((A)impl2).m() - should succeed
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    93
        test(impl2, A.class.getName(), "m", A.AmResult, true, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    94
        test(impl2, A.class.getName(), "m", A.AmResult, false, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    95
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    96
        // test: ((B)impl2).m() - should fail: NoSuchMethodError
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    97
        test(impl2, B.class.getName(), "m", -1, true, NoSuchMethodError.class);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    98
        test(impl2, B.class.getName(), "m", -1, false, NoSuchMethodError.class);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
    99
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   100
        // test: ((C)impl2).m() - should succeed
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   101
        test(impl2, C.class.getName(), "m", C.CmResult, true, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   102
        test(impl2, C.class.getName(), "m", C.CmResult, false, null);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   103
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   104
        // test: impl2.m() - should fail: NoSuchMethodError
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   105
        test(impl2, Impl2.class.getName(), "m", -1, true, NoSuchMethodError.class);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   106
        test(impl2, Impl2.class.getName(), "m", -1, false, NoSuchMethodError.class);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   107
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   108
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   109
    static void test(Object target, String definingClass, String method,
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   110
                     int expected, boolean virtual, Class<?> expectedException) {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   111
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   112
        String desc = (virtual ? "Virtual" : "Nonvirtual") + " Invocation of " +
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   113
                       definingClass + "." + method + " on instance of class " +
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   114
                       target.getClass().getName();
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   115
        try {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   116
            int res = callIntVoid(target, definingClass, method, virtual);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   117
            if (expectedException != null)
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   118
                throw new Error(desc + " succeeded - but expected exception " + expectedException.getSimpleName());
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   119
            if (res != expected)
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   120
                throw new Error(desc + " got wrong result: " + res + " instead of " + expected);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   121
            System.out.println(desc + " - passed");
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   122
        }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   123
        catch (Throwable t) {
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   124
           if (t.getClass() != expectedException)
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   125
               throw new Error(desc + " failed", t);
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   126
           else
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   127
              System.out.println(desc + " threw " + expectedException.getSimpleName() + " as expected");
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   128
        }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   129
    }
2091069b6851 8081800: AbstractMethodError when evaluating a private method in an interface via debugger
dholmes
parents:
diff changeset
   130
}