1 /*
2 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /**
25 * @test
26 * @bug 8025260 8016839
27 * @summary Ensure that AbstractMethodError and IllegalAccessError are thrown appropriately, not NullPointerException
28 * @modules java.base/jdk.internal.org.objectweb.asm
29 * @library / .
30 *
31 * @build p.*
32 * @run main/othervm compiler.jsr292.methodHandleExceptions.TestAMEnotNPE
33 * @run main/othervm -Xint compiler.jsr292.methodHandleExceptions.TestAMEnotNPE
34 * @run main/othervm -Xcomp compiler.jsr292.methodHandleExceptions.TestAMEnotNPE
35 */
36
37 package compiler.jsr292.methodHandleExceptions;
38
39 import p.Dok;
40 import jdk.internal.org.objectweb.asm.ClassWriter;
41 import jdk.internal.org.objectweb.asm.Handle;
42 import jdk.internal.org.objectweb.asm.MethodVisitor;
43 import jdk.internal.org.objectweb.asm.Opcodes;
44
45 import java.lang.reflect.InvocationTargetException;
46 import java.lang.reflect.Method;
47 import java.util.ArrayList;
48 import java.util.List;
49
50 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PRIVATE;
51 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC;
52 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_STATIC;
53 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_SUPER;
54 import static jdk.internal.org.objectweb.asm.Opcodes.ALOAD;
55 import static jdk.internal.org.objectweb.asm.Opcodes.ILOAD;
56 import static jdk.internal.org.objectweb.asm.Opcodes.INVOKESPECIAL;
74 * found in the corresponding jar files.
75 *
76 * Jarfilenames look something like pD_ext_pF (p.D extends p.F)
77 * and qD_m_pp_imp_pI (q.D with package-private m implements p.I)
78 *
79 */
80 public static void main(String args[]) throws Throwable {
81 ArrayList<Throwable> lt = new ArrayList<Throwable>();
82
83 if (args.length > 0) {
84 String a0 = args[0].toLowerCase();
85 if (a0.length() > 0) {
86 writeJarFiles = ("writejarfiles").startsWith(a0);
87 readJarFiles = ("readjarfiles").startsWith(a0);
88 }
89 if (!(writeJarFiles || readJarFiles)) {
90 throw new Error("Command line parameter (if any) should be prefix of writeJarFiles or readJarFiles");
91 }
92 }
93
94 try {
95 System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m, p.D extends p.F, p.F.m FINAL");
96 tryAndCheckThrown(lt, bytesForDprivateSubWhat("p/F"),
97 "p.D extends p.F (p.F implements p.I, FINAL public m), private m",
98 IllegalAccessError.class, "pD_ext_pF");
99 // We'll take either a VerifyError (pre 2013-11-30)
100 // or an IllegalAccessError (post 2013-11-22)
101 } catch (VerifyError ve) {
102 System.out.println("Saw expected VerifyError " + ve);
103 }
104 System.out.println();
105
106 System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m, p.D extends p.E");
107 tryAndCheckThrown(lt, bytesForDprivateSubWhat("p/E"),
108 "p.D extends p.E (p.E implements p.I, public m), private m",
109 IllegalAccessError.class, "pD_ext_pE");
110
111 System.out.println("TRYING p.D.m ABSTRACT interface-invoked as p.I.m");
112 tryAndCheckThrown(lt, bytesForD(),
113 "D extends abstract C, no m",
114 AbstractMethodError.class, "pD_ext_pC");
115
116 System.out.println("TRYING q.D.m PACKAGE interface-invoked as p.I.m");
117 tryAndCheckThrown(lt, "q.D", bytesForDsomeAccess("q/D", 0),
118 "q.D implements p.I, protected m", IllegalAccessError.class,
119 "qD_m_pp_imp_pI");
120
121 // Note jar file name is used in the plural-arg case.
122 System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m");
123 tryAndCheckThrown(lt, bytesForDsomeAccess("p/D", ACC_PRIVATE),
124 "p.D implements p.I, private m",
125 IllegalAccessError.class, "pD_m_pri_imp_pI");
126
127 // Plural-arg test.
128 System.out.println("TRYING p.D.m PRIVATE MANY ARG interface-invoked as p.I.m");
129 tryAndCheckThrownMany(lt, bytesForDsomeAccess("p/D", ACC_PRIVATE),
130 "p.D implements p.I, private m", IllegalAccessError.class);
131
132 if (lt.size() > 0) {
133 System.out.flush();
134 Thread.sleep(250); // This de-interleaves output and error in Netbeans, sigh.
135 for (Throwable th : lt)
136 System.err.println(th);
137 throw new Error("Test failed, there were " + lt.size() + " failures listed above");
138 } else {
139 System.out.println("ALL PASS, HOORAY!");
140 }
141 }
142
143 /**
144 * The bytes for D, a NOT abstract class extending abstract class C without
145 * supplying an implementation for abstract method m. There is a default
146 * method in the interface I, but it should lose to the abstract class.
147 *
148 * @return
149 * @throws Exception
150 */
|
1 /*
2 * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /**
25 * @test
26 * @bug 8025260 8016839 8046171
27 * @summary Ensure that correct exceptions are thrown, not NullPointerException
28 * @modules java.base/jdk.internal.org.objectweb.asm
29 * @library / .
30 *
31 * @build p.*
32 * @run main/othervm compiler.jsr292.methodHandleExceptions.TestAMEnotNPE
33 * @run main/othervm -Xint compiler.jsr292.methodHandleExceptions.TestAMEnotNPE
34 * @run main/othervm -Xcomp compiler.jsr292.methodHandleExceptions.TestAMEnotNPE
35 */
36
37 // Since this test was written the specification for interface method selection has been
38 // revised (JEP 181 - Nestmates) so that private methods are never selected, as they never
39 // override any inherited method. So where a private method was previously selected
40 // and then resulted in IllegalAccessError, the private method is skipped and the invocation
41 // will either succeed or fail based on what other implementations are found in the inheritance
42 // hierarchy. This is explained for each test below.
43
44 package compiler.jsr292.methodHandleExceptions;
45
46 import p.Dok;
47 import jdk.internal.org.objectweb.asm.ClassWriter;
48 import jdk.internal.org.objectweb.asm.Handle;
49 import jdk.internal.org.objectweb.asm.MethodVisitor;
50 import jdk.internal.org.objectweb.asm.Opcodes;
51
52 import java.lang.reflect.InvocationTargetException;
53 import java.lang.reflect.Method;
54 import java.util.ArrayList;
55 import java.util.List;
56
57 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PRIVATE;
58 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC;
59 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_STATIC;
60 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_SUPER;
61 import static jdk.internal.org.objectweb.asm.Opcodes.ALOAD;
62 import static jdk.internal.org.objectweb.asm.Opcodes.ILOAD;
63 import static jdk.internal.org.objectweb.asm.Opcodes.INVOKESPECIAL;
81 * found in the corresponding jar files.
82 *
83 * Jarfilenames look something like pD_ext_pF (p.D extends p.F)
84 * and qD_m_pp_imp_pI (q.D with package-private m implements p.I)
85 *
86 */
87 public static void main(String args[]) throws Throwable {
88 ArrayList<Throwable> lt = new ArrayList<Throwable>();
89
90 if (args.length > 0) {
91 String a0 = args[0].toLowerCase();
92 if (a0.length() > 0) {
93 writeJarFiles = ("writejarfiles").startsWith(a0);
94 readJarFiles = ("readjarfiles").startsWith(a0);
95 }
96 if (!(writeJarFiles || readJarFiles)) {
97 throw new Error("Command line parameter (if any) should be prefix of writeJarFiles or readJarFiles");
98 }
99 }
100
101 System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m, p.D extends p.F, p.F.m FINAL");
102 System.out.println(" - should invoke p.F.m as private p.D.m is skipped for selection");
103 tryAndCheckThrown(lt, bytesForDprivateSubWhat("p/F"),
104 "p.D extends p.F (p.F implements p.I, FINAL public m), private m",
105 null /* should succeed */, "pD_ext_pF");
106 System.out.println();
107
108 System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m, p.D extends p.E");
109 System.out.println(" - should invoke p.E.m as private p.D.m is skipped for selection");
110 tryAndCheckThrown(lt, bytesForDprivateSubWhat("p/E"),
111 "p.D extends p.E (p.E implements p.I, public m), private m",
112 null /* should succeed */, "pD_ext_pE");
113
114 System.out.println("TRYING p.D.m ABSTRACT interface-invoked as p.I.m");
115 tryAndCheckThrown(lt, bytesForD(),
116 "D extends abstract C, no m",
117 AbstractMethodError.class, "pD_ext_pC");
118
119 System.out.println("TRYING q.D.m PACKAGE interface-invoked as p.I.m");
120 tryAndCheckThrown(lt, "q.D", bytesForDsomeAccess("q/D", 0),
121 "q.D implements p.I, protected m",
122 IllegalAccessError.class, "qD_m_pp_imp_pI");
123
124 // Note jar file name is used in the plural-arg case.
125 System.out.println("TRYING p.D.m PRIVATE interface-invoked as p.I.m");
126 System.out.println(" - should invoke p.I.m as private p.D.m is skipped for selection");
127 tryAndCheckThrown(lt, bytesForDsomeAccess("p/D", ACC_PRIVATE),
128 "p.D implements p.I, private m",
129 null /* should succeed */, "pD_m_pri_imp_pI");
130
131 // Plural-arg test.
132 System.out.println("TRYING p.D.m PRIVATE MANY ARG interface-invoked as p.I.m");
133 System.out.println(" - should invoke p.I.m as private p.D.m is skipped for selection");
134 tryAndCheckThrownMany(lt, bytesForDsomeAccess("p/D", ACC_PRIVATE),
135 "p.D implements p.I, private m", null /* should succeed */);
136
137 if (lt.size() > 0) {
138 System.out.flush();
139 Thread.sleep(250); // This de-interleaves output and error in Netbeans, sigh.
140 for (Throwable th : lt)
141 System.err.println(th);
142 throw new Error("Test failed, there were " + lt.size() + " failures listed above");
143 } else {
144 System.out.println("ALL PASS, HOORAY!");
145 }
146 }
147
148 /**
149 * The bytes for D, a NOT abstract class extending abstract class C without
150 * supplying an implementation for abstract method m. There is a default
151 * method in the interface I, but it should lose to the abstract class.
152 *
153 * @return
154 * @throws Exception
155 */
|