1 /* 2 * Copyright (c) 2016, 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 * @summary Test of method selection and resolution cases that 27 * generate InvokeSpecialSuccessTest 28 * @modules java.base/jdk.internal.org.objectweb.asm 29 * @library /runtime/SelectionResolution/classes 30 * @build selectionresolution.* 31 * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies InvokeSpecialSuccessTest 32 */ 33 34 import java.util.Arrays; 35 import java.util.Collection; 36 import java.util.EnumSet; 37 import selectionresolution.ClassData; 38 import selectionresolution.MethodData; 39 import selectionresolution.SelectionResolutionTest; 40 import selectionresolution.SelectionResolutionTestCase; 41 import selectionresolution.Template; 42 43 public class InvokeSpecialSuccessTest extends SelectionResolutionTest { 44 45 private static final SelectionResolutionTestCase.Builder initBuilder = 46 new SelectionResolutionTestCase.Builder(); 47 48 static { 49 initBuilder.invoke = SelectionResolutionTestCase.InvokeInstruction.INVOKESPECIAL; 50 } 51 52 private static final Collection<TestGroup> testgroups = 53 Arrays.asList( 54 /* Group 46: callsite = methodref = expected */ 55 new TestGroup.Simple(initBuilder, 56 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 57 EnumSet.of(MethodData.Access.PUBLIC, 58 MethodData.Access.PACKAGE, 59 MethodData.Access.PROTECTED, 60 MethodData.Access.PRIVATE), 61 EnumSet.of(MethodData.Context.INSTANCE), 62 EnumSet.of(ClassData.Package.SAME)), 63 Template.OverrideAbstractExpectedClass, 64 Template.MethodrefEqualsExpected, 65 Template.IgnoredAbstract, 66 Template.CallsiteEqualsMethodref, 67 Template.ObjectrefAssignableToCallsite), 68 /* Group 47: callsite = methodref, methodref != expected, 69 * expected is class, expected and callsite in the same package 70 */ 71 new TestGroup.Simple(initBuilder, 72 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 73 EnumSet.of(MethodData.Access.PUBLIC, 74 MethodData.Access.PACKAGE, 75 MethodData.Access.PROTECTED), 76 EnumSet.of(MethodData.Context.INSTANCE), 77 EnumSet.of(ClassData.Package.SAME)), 78 Template.OverrideAbstractExpectedClass, 79 Template.MethodrefNotEqualsExpectedClass, 80 Template.IgnoredAbstract, 81 Template.CallsiteEqualsMethodref, 82 Template.ObjectrefAssignableToCallsite), 83 /* Group 48: callsite = methodref, methodref != expected, 84 * expected is interface, expected and callsite in the same package 85 */ 86 new TestGroup.Simple(initBuilder, 87 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 88 EnumSet.of(MethodData.Access.PUBLIC), 89 EnumSet.of(MethodData.Context.INSTANCE), 90 EnumSet.of(ClassData.Package.SAME)), 91 Template.OverrideAbstractExpectedIface, 92 Template.MethodrefNotEqualsExpectedIface, 93 Template.IgnoredAbstract, 94 Template.CallsiteEqualsMethodref, 95 Template.ObjectrefAssignableToCallsite), 96 /* Group 49: callsite :> methodref, methodref = expected, 97 * expected is class, expected and callsite in the same package 98 */ 99 new TestGroup.Simple(initBuilder, 100 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 101 EnumSet.of(MethodData.Access.PUBLIC, 102 MethodData.Access.PACKAGE, 103 MethodData.Access.PROTECTED), 104 EnumSet.of(MethodData.Context.INSTANCE), 105 EnumSet.of(ClassData.Package.SAME)), 106 Template.OverrideAbstractExpectedClass, 107 Template.MethodrefEqualsExpected, 108 Template.IgnoredAbstract, 109 Template.CallsiteSubclassMethodref, 110 Template.ObjectrefAssignableToCallsite), 111 /* Group 50: callsite :> methodref, methodref != expected, 112 * expected is class, expected and callsite in the same package 113 */ 114 new TestGroup.Simple(initBuilder, 115 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 116 EnumSet.of(MethodData.Access.PUBLIC, 117 MethodData.Access.PACKAGE, 118 MethodData.Access.PROTECTED), 119 EnumSet.of(MethodData.Context.INSTANCE), 120 EnumSet.of(ClassData.Package.SAME)), 121 Template.OverrideAbstractExpectedClass, 122 Template.MethodrefNotEqualsExpectedClass, 123 Template.IgnoredAbstract, 124 Template.CallsiteSubclassMethodref, 125 Template.ObjectrefAssignableToCallsite), 126 /* Group 51: callsite :> methodref, methodref != expected, 127 * expected is interface, expected and callsite in the same package 128 */ 129 new TestGroup.Simple(initBuilder, 130 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 131 EnumSet.of(MethodData.Access.PUBLIC), 132 EnumSet.of(MethodData.Context.INSTANCE), 133 EnumSet.of(ClassData.Package.SAME)), 134 Template.OverrideAbstractExpectedIface, 135 Template.MethodrefNotEqualsExpectedIface, 136 Template.IgnoredAbstract, 137 Template.CallsiteSubclassMethodref, 138 Template.ObjectrefAssignableToCallsite), 139 /* Group 52: callsite = methodref, methodref != expected, 140 * expected is class, expected and callsite not in the same package 141 */ 142 new TestGroup.Simple(initBuilder, 143 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 144 EnumSet.of(MethodData.Access.PUBLIC, 145 MethodData.Access.PROTECTED), 146 EnumSet.of(MethodData.Context.INSTANCE), 147 EnumSet.of(ClassData.Package.DIFFERENT)), 148 Template.OverrideAbstractExpectedClass, 149 Template.MethodrefNotEqualsExpectedClass, 150 Template.IgnoredAbstract, 151 Template.CallsiteEqualsMethodref, 152 Template.ObjectrefAssignableToCallsite), 153 /* Group 53: callsite = methodref, methodref != expected, 154 * expected is interface, expected and callsite not in the same package 155 */ 156 new TestGroup.Simple(initBuilder, 157 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 158 EnumSet.of(MethodData.Access.PUBLIC), 159 EnumSet.of(MethodData.Context.INSTANCE), 160 EnumSet.of(ClassData.Package.DIFFERENT)), 161 Template.OverrideAbstractExpectedIface, 162 Template.MethodrefNotEqualsExpectedIface, 163 Template.IgnoredAbstract, 164 Template.CallsiteEqualsMethodref, 165 Template.ObjectrefAssignableToCallsite), 166 /* Group 54: callsite :> methodref, methodref = expected, 167 * expected is class, expected and callsite not in the same package 168 */ 169 new TestGroup.Simple(initBuilder, 170 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 171 EnumSet.of(MethodData.Access.PUBLIC, 172 MethodData.Access.PROTECTED), 173 EnumSet.of(MethodData.Context.INSTANCE), 174 EnumSet.of(ClassData.Package.DIFFERENT)), 175 Template.OverrideAbstractExpectedClass, 176 Template.MethodrefEqualsExpected, 177 Template.IgnoredAbstract, 178 Template.CallsiteSubclassMethodref, 179 Template.ObjectrefAssignableToCallsite), 180 181 /* Group 55: callsite :> methodref, methodref != expected, 182 * expected is class, expected and callsite not in the same package 183 */ 184 new TestGroup.Simple(initBuilder, 185 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 186 EnumSet.of(MethodData.Access.PUBLIC, 187 MethodData.Access.PROTECTED), 188 EnumSet.of(MethodData.Context.INSTANCE), 189 EnumSet.of(ClassData.Package.DIFFERENT)), 190 Template.OverrideAbstractExpectedClass, 191 Template.MethodrefNotEqualsExpectedClass, 192 Template.IgnoredAbstract, 193 Template.CallsiteSubclassMethodref, 194 Template.ObjectrefAssignableToCallsite), 195 /* Group 56: callsite :> methodref, methodref != expected, 196 * expected is interface, expected and callsite not in the same package 197 */ 198 new TestGroup.Simple(initBuilder, 199 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 200 EnumSet.of(MethodData.Access.PUBLIC), 201 EnumSet.of(MethodData.Context.INSTANCE), 202 EnumSet.of(ClassData.Package.DIFFERENT)), 203 Template.OverrideAbstractExpectedIface, 204 Template.MethodrefNotEqualsExpectedIface, 205 Template.IgnoredAbstract, 206 Template.CallsiteSubclassMethodref, 207 Template.ObjectrefAssignableToCallsite), 208 209 /* Funny cases */ 210 /* Group 57: callsite = methodref, methodref = 211 * expected expected is interface, expected and 212 * callsite in a different package 213 */ 214 new TestGroup.Simple(initBuilder, 215 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 216 EnumSet.of(MethodData.Access.PROTECTED), 217 EnumSet.of(MethodData.Context.INSTANCE), 218 EnumSet.of(ClassData.Package.DIFFERENT)), 219 Template.OverrideAbstractExpectedClass, 220 Template.MethodrefEqualsExpected, 221 Template.IgnoredAbstract, 222 Template.CallsiteEqualsMethodref, 223 Template.ObjectrefEqualsOrExactSubclassOfCallsite), 224 /* Group 58: callsite = methodref, methodref \!= 225 * expected expected is interface, expected and 226 * callsite in a different package */ 227 new TestGroup.Simple(initBuilder, 228 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 229 EnumSet.of(MethodData.Access.PROTECTED), 230 EnumSet.of(MethodData.Context.INSTANCE), 231 EnumSet.of(ClassData.Package.DIFFERENT)), 232 Template.MethodrefNotEqualsExpectedClass, 233 Template.IgnoredAbstract, 234 Template.CallsiteEqualsMethodref, 235 Template.ObjectrefEqualsOrExactSubclassOfCallsite), 236 /* Group 59: callsite subclass methodref, methodref = 237 * expected expected is interface, expected and 238 * callsite in a different package */ 239 new TestGroup.Simple(initBuilder, 240 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 241 EnumSet.of(MethodData.Access.PROTECTED), 242 EnumSet.of(MethodData.Context.INSTANCE), 243 EnumSet.of(ClassData.Package.DIFFERENT)), 244 Template.OverrideAbstractExpectedClass, 245 Template.MethodrefEqualsExpected, 246 Template.IgnoredAbstract, 247 Template.CallsiteSubclassMethodref, 248 Template.ObjectrefEqualsOrExactSubclassOfCallsite), 249 /* Group 60: callsite subclass methodref, methodref 250 * \!= expected expected is interface, expected and 251 * callsite in a different package */ 252 new TestGroup.Simple(initBuilder, 253 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 254 EnumSet.of(MethodData.Access.PROTECTED), 255 EnumSet.of(MethodData.Context.INSTANCE), 256 EnumSet.of(ClassData.Package.DIFFERENT)), 257 Template.OverrideAbstractExpectedClass, 258 Template.MethodrefNotEqualsExpectedClass, 259 Template.IgnoredAbstract, 260 Template.CallsiteSubclassMethodref, 261 Template.ObjectrefEqualsOrExactSubclassOfCallsite), 262 263 /* Methodref is an interface */ 264 /* Group 61: callsite :> methodref, methodref = expected, 265 * expected is interface, expected and callsite in the same package 266 */ 267 new TestGroup.Simple(initBuilder, 268 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 269 EnumSet.of(MethodData.Access.PUBLIC), 270 EnumSet.of(MethodData.Context.INSTANCE), 271 EnumSet.of(ClassData.Package.SAME, 272 ClassData.Package.DIFFERENT)), 273 Template.OverrideAbstractExpectedIface, 274 Template.MethodrefEqualsExpected, 275 Template.IgnoredAbstract, 276 Template.CallsiteSubclassMethodref, 277 Template.ObjectrefAssignableToCallsite), 278 /* Group 62: callsite :> methodref, methodref != expected, 279 * expected is interface, expected and callsite in the same package 280 */ 281 new TestGroup.Simple(initBuilder, 282 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 283 EnumSet.of(MethodData.Access.PUBLIC), 284 EnumSet.of(MethodData.Context.INSTANCE), 285 EnumSet.of(ClassData.Package.SAME, 286 ClassData.Package.DIFFERENT)), 287 Template.OverrideAbstractExpectedIface, 288 Template.IfaceMethodrefNotEqualsExpected, 289 Template.IgnoredAbstract, 290 Template.CallsiteSubclassMethodref, 291 Template.ObjectrefAssignableToCallsite) 292 ); 293 294 private InvokeSpecialSuccessTest() { 295 super(testgroups); 296 } 297 298 public static void main(final String... args) { 299 new InvokeSpecialSuccessTest().run(); 300 } 301 }