test/tools/javac/lambdaShapes/org/openjdk/tests/vm/DefaultMethodsTest.java

Mon, 21 Jan 2013 20:15:16 +0000

author
mcimadamore
date
Mon, 21 Jan 2013 20:15:16 +0000
changeset 1512
b12ffdfa1341
parent 1448
7d34e91f66bb
child 1675
b54122b9372d
permissions
-rw-r--r--

8005851: Remove support for synchronized interface methods
Summary: Synchronized default methods are no longer supported
Reviewed-by: jjg

rfield@1422 1 /*
katleman@1448 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
rfield@1422 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
rfield@1422 4 *
rfield@1422 5 * This code is free software; you can redistribute it and/or modify it
rfield@1422 6 * under the terms of the GNU General Public License version 2 only, as
rfield@1422 7 * published by the Free Software Foundation. Oracle designates this
rfield@1422 8 * particular file as subject to the "Classpath" exception as provided
rfield@1422 9 * by Oracle in the LICENSE file that accompanied this code.
rfield@1422 10 *
rfield@1422 11 * This code is distributed in the hope that it will be useful, but WITHOUT
rfield@1422 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
rfield@1422 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
rfield@1422 14 * version 2 for more details (a copy is included in the LICENSE file that
rfield@1422 15 * accompanied this code).
rfield@1422 16 *
rfield@1422 17 * You should have received a copy of the GNU General Public License version
rfield@1422 18 * 2 along with this work; if not, write to the Free Software Foundation,
rfield@1422 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
rfield@1422 20 *
rfield@1422 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
rfield@1422 22 * or visit www.oracle.com if you need additional information or have any
rfield@1422 23 * questions.
rfield@1422 24 */
rfield@1422 25
rfield@1422 26 package org.openjdk.tests.vm;
rfield@1422 27
rfield@1422 28 import java.lang.reflect.*;
rfield@1422 29 import java.util.*;
rfield@1422 30 import java.io.File;
rfield@1422 31 import java.io.IOException;
rfield@1422 32
rfield@1422 33 import org.testng.annotations.Test;
rfield@1422 34 import org.openjdk.tests.separate.*;
rfield@1422 35 import org.openjdk.tests.separate.Compiler;
rfield@1422 36
rfield@1422 37 import static org.testng.Assert.*;
rfield@1422 38 import static org.openjdk.tests.separate.SourceModel.*;
rfield@1422 39 import static org.openjdk.tests.separate.SourceModel.Class;
rfield@1422 40
rfield@1422 41 @Test(groups = "vm")
rfield@1422 42 public class DefaultMethodsTest extends TestHarness {
rfield@1422 43 public DefaultMethodsTest() {
rfield@1422 44 super(false, false);
rfield@1422 45 }
rfield@1422 46
rfield@1422 47 /**
rfield@1422 48 * class C { public int m() { return 22; } }
rfield@1422 49 *
rfield@1422 50 * TEST: C c = new C(); c.m() == 22
rfield@1422 51 */
rfield@1422 52 public void testHarnessInvokeVirtual() {
rfield@1422 53 Class C = new Class("C", ConcreteMethod.std("22"));
rfield@1422 54 assertInvokeVirtualEquals(22, C);
rfield@1422 55 }
rfield@1422 56
rfield@1422 57 /**
rfield@1422 58 * interface I { int m(); }
rfield@1422 59 * class C implements I { public int m() { return 33; } }
rfield@1422 60 *
rfield@1422 61 * TEST: I i = new C(); i.m() == 33;
rfield@1422 62 */
rfield@1422 63 public void testHarnessInvokeInterface() {
rfield@1422 64 Interface I = new Interface("I", AbstractMethod.std());
rfield@1422 65 Class C = new Class("C", I, ConcreteMethod.std("33"));
rfield@1422 66 assertInvokeInterfaceEquals(33, C, I);
rfield@1422 67 }
rfield@1422 68
rfield@1422 69 /**
rfield@1422 70 * class C {}
rfield@1422 71 *
rfield@1422 72 * TEST: C c = new C(); c.m() throws NoSuchMethod
rfield@1422 73 */
rfield@1422 74 public void testHarnessThrows() {
rfield@1422 75 Class C = new Class("C");
rfield@1422 76 assertThrows(NoSuchMethodError.class, C);
rfield@1422 77 }
rfield@1422 78
rfield@1422 79 /**
rfield@1422 80 * interface I { int m() default { return 44; } }
rfield@1422 81 * class C implements I {}
rfield@1422 82 *
rfield@1422 83 * TEST: C c = new C(); c.m() == 44;
rfield@1422 84 * TEST: I i = new C(); i.m() == 44;
rfield@1422 85 */
rfield@1422 86 public void testBasicDefault() {
rfield@1422 87 Interface I = new Interface("I", DefaultMethod.std("44"));
rfield@1422 88 Class C = new Class("C", I);
rfield@1422 89
rfield@1422 90 assertInvokeVirtualEquals(44, C);
rfield@1422 91 assertInvokeInterfaceEquals(44, C, I);
rfield@1422 92 }
rfield@1422 93
rfield@1422 94 /**
rfield@1422 95 * interface I { default int m() { return 44; } }
rfield@1422 96 * interface J extends I {}
rfield@1422 97 * interface K extends J {}
rfield@1422 98 * class C implements K {}
rfield@1422 99 *
rfield@1422 100 * TEST: C c = new C(); c.m() == 44;
rfield@1422 101 * TEST: I i = new C(); i.m() == 44;
rfield@1422 102 */
rfield@1422 103 public void testFarDefault() {
rfield@1422 104 Interface I = new Interface("I", DefaultMethod.std("44"));
rfield@1422 105 Interface J = new Interface("J", I);
rfield@1422 106 Interface K = new Interface("K", J);
rfield@1422 107 Class C = new Class("C", K);
rfield@1422 108
rfield@1422 109 assertInvokeVirtualEquals(44, C);
rfield@1422 110 assertInvokeInterfaceEquals(44, C, K);
rfield@1422 111 }
rfield@1422 112
rfield@1422 113 /**
rfield@1422 114 * interface I { int m(); }
rfield@1422 115 * interface J extends I { default int m() { return 44; } }
rfield@1422 116 * interface K extends J {}
rfield@1422 117 * class C implements K {}
rfield@1422 118 *
rfield@1422 119 * TEST: C c = new C(); c.m() == 44;
rfield@1422 120 * TEST: K k = new C(); k.m() == 44;
rfield@1422 121 */
rfield@1422 122 public void testOverrideAbstract() {
rfield@1422 123 Interface I = new Interface("I", AbstractMethod.std());
rfield@1422 124 Interface J = new Interface("J", I, DefaultMethod.std("44"));
rfield@1422 125 Interface K = new Interface("K", J);
rfield@1422 126 Class C = new Class("C", K);
rfield@1422 127
rfield@1422 128 assertInvokeVirtualEquals(44, C);
rfield@1422 129 assertInvokeInterfaceEquals(44, C, K);
rfield@1422 130 }
rfield@1422 131
rfield@1422 132 /**
rfield@1422 133 * interface I { int m() default { return 44; } }
rfield@1422 134 * class C implements I { public int m() { return 55; } }
rfield@1422 135 *
rfield@1422 136 * TEST: C c = new C(); c.m() == 55;
rfield@1422 137 * TEST: I i = new C(); i.m() == 55;
rfield@1422 138 */
rfield@1422 139 public void testExisting() {
rfield@1422 140 Interface I = new Interface("I", DefaultMethod.std("44"));
rfield@1422 141 Class C = new Class("C", I, ConcreteMethod.std("55"));
rfield@1422 142
rfield@1422 143 assertInvokeVirtualEquals(55, C);
rfield@1422 144 assertInvokeInterfaceEquals(55, C, I);
rfield@1422 145 }
rfield@1422 146
rfield@1422 147 /**
rfield@1422 148 * interface I { default int m() { return 99; } }
rfield@1422 149 * class B implements I {}
rfield@1422 150 * class C extends B {}
rfield@1422 151 *
rfield@1422 152 * TEST: C c = new C(); c.m() == 99;
rfield@1422 153 * TEST: I i = new C(); i.m() == 99;
rfield@1422 154 */
rfield@1422 155 public void testInherited() {
rfield@1422 156 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 157 Class B = new Class("B", I);
rfield@1422 158 Class C = new Class("C", B);
rfield@1422 159
rfield@1422 160 assertInvokeVirtualEquals(99, C);
rfield@1422 161 assertInvokeInterfaceEquals(99, C, I);
rfield@1422 162 }
rfield@1422 163
rfield@1422 164 /**
rfield@1422 165 * interface I { default int m() { return 99; } }
rfield@1422 166 * class C { public int m() { return 11; } }
rfield@1422 167 * class D extends C implements I {}
rfield@1422 168 *
rfield@1422 169 * TEST: D d = new D(); d.m() == 11;
rfield@1422 170 * TEST: I i = new D(); i.m() == 11;
rfield@1422 171 */
rfield@1422 172 public void testExistingInherited() {
rfield@1422 173 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 174 Class C = new Class("C", ConcreteMethod.std("11"));
rfield@1422 175 Class D = new Class("D", C, I);
rfield@1422 176
rfield@1422 177 assertInvokeVirtualEquals(11, D);
rfield@1422 178 assertInvokeInterfaceEquals(11, D, I);
rfield@1422 179 }
rfield@1422 180
rfield@1422 181 /**
rfield@1422 182 * interface I { default int m() { return 44; } }
rfield@1422 183 * class C implements I { public int m() { return 11; } }
rfield@1422 184 * class D extends C { public int m() { return 22; } }
rfield@1422 185 *
rfield@1422 186 * TEST: D d = new D(); d.m() == 22;
rfield@1422 187 * TEST: I i = new D(); i.m() == 22;
rfield@1422 188 */
rfield@1422 189 void testExistingInheritedOverride() {
rfield@1422 190 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 191 Class C = new Class("C", I, ConcreteMethod.std("11"));
rfield@1422 192 Class D = new Class("D", C, ConcreteMethod.std("22"));
rfield@1422 193
rfield@1422 194 assertInvokeVirtualEquals(22, D);
rfield@1422 195 assertInvokeInterfaceEquals(22, D, I);
rfield@1422 196 }
rfield@1422 197
rfield@1422 198 /**
rfield@1422 199 * interface I { default int m() { return 99; } }
rfield@1422 200 * interface J { defaultint m() { return 88; } }
rfield@1422 201 * class C implements I { public int m() { return 11; } }
rfield@1422 202 * class D extends C { public int m() { return 22; } }
rfield@1422 203 * class E extends D implements J {}
rfield@1422 204 *
rfield@1422 205 * TEST: E e = new E(); e.m() == 22;
rfield@1422 206 * TEST: J j = new E(); j.m() == 22;
rfield@1422 207 */
rfield@1422 208 public void testExistingInheritedPlusDefault() {
rfield@1422 209 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 210 Interface J = new Interface("J", DefaultMethod.std("88"));
rfield@1422 211 Class C = new Class("C", I, ConcreteMethod.std("11"));
rfield@1422 212 Class D = new Class("D", C, ConcreteMethod.std("22"));
rfield@1422 213 Class E = new Class("E", D, J);
rfield@1422 214
rfield@1422 215 assertInvokeVirtualEquals(22, E);
rfield@1422 216 assertInvokeInterfaceEquals(22, E, J);
rfield@1422 217 }
rfield@1422 218
rfield@1422 219 /**
rfield@1422 220 * interface I { default int m() { return 99; } }
rfield@1422 221 * class B implements I {}
rfield@1422 222 * class C extends B { public int m() { return 77; } }
rfield@1422 223 *
rfield@1422 224 * TEST: C c = new C(); c.m() == 77;
rfield@1422 225 * TEST: I i = new C(); i.m() == 77;
rfield@1422 226 */
rfield@1422 227 public void testInheritedWithConcrete() {
rfield@1422 228 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 229 Class B = new Class("B", I);
rfield@1422 230 Class C = new Class("C", B, ConcreteMethod.std("77"));
rfield@1422 231
rfield@1422 232 assertInvokeVirtualEquals(77, C);
rfield@1422 233 assertInvokeInterfaceEquals(77, C, I);
rfield@1422 234 }
rfield@1422 235
rfield@1422 236 /**
rfield@1422 237 * interface I { default int m() { return 99; } }
rfield@1422 238 * class B implements I {}
rfield@1422 239 * class C extends B implements I { public int m() { return 66; } }
rfield@1422 240 *
rfield@1422 241 * TEST: C c = new C(); c.m() == 66;
rfield@1422 242 * TEST: I i = new C(); i.m() == 66;
rfield@1422 243 */
rfield@1422 244 public void testInheritedWithConcreteAndImpl() {
rfield@1422 245 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 246 Class B = new Class("B", I);
rfield@1422 247 Class C = new Class("C", B, I, ConcreteMethod.std("66"));
rfield@1422 248
rfield@1422 249 assertInvokeVirtualEquals(66, C);
rfield@1422 250 assertInvokeInterfaceEquals(66, C, I);
rfield@1422 251 }
rfield@1422 252
rfield@1422 253 /**
rfield@1422 254 * interface I { default int m() { return 99; } }
rfield@1422 255 * interface J { default int m() { return 88; } }
rfield@1422 256 * class C implements I, J {}
rfield@1422 257 *
rfield@1422 258 * TEST: C c = new C(); c.m() throws AME
rfield@1422 259 */
rfield@1422 260 public void testConflict() {
rfield@1422 261 // debugTest();
rfield@1422 262 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 263 Interface J = new Interface("J", DefaultMethod.std("88"));
rfield@1422 264 Class C = new Class("C", I, J);
rfield@1422 265
rfield@1422 266 assertThrows(AbstractMethodError.class, C);
rfield@1422 267 }
rfield@1422 268
rfield@1422 269 /**
rfield@1422 270 * interface I { int m(); }
rfield@1422 271 * interface J { default int m() { return 88; } }
rfield@1422 272 * class C implements I, J {}
rfield@1422 273 *
rfield@1422 274 * TEST: C c = new C(); c.m() throws AME
rfield@1422 275 */
rfield@1422 276 public void testAmbiguousReabstract() {
rfield@1422 277 Interface I = new Interface("I", AbstractMethod.std());
rfield@1422 278 Interface J = new Interface("J", DefaultMethod.std("88"));
rfield@1422 279 Class C = new Class("C", I, J);
rfield@1422 280
rfield@1422 281 assertThrows(AbstractMethodError.class, C);
rfield@1422 282 }
rfield@1422 283
rfield@1422 284 /**
rfield@1422 285 * interface I { default int m() { return 99; } }
rfield@1422 286 * interface J extends I { }
rfield@1422 287 * interface K extends I { }
rfield@1422 288 * class C implements J, K {}
rfield@1422 289 *
rfield@1422 290 * TEST: C c = new C(); c.m() == 99
rfield@1422 291 * TEST: J j = new C(); j.m() == 99
rfield@1422 292 * TEST: K k = new C(); k.m() == 99
rfield@1422 293 * TEST: I i = new C(); i.m() == 99
rfield@1422 294 */
rfield@1422 295 public void testDiamond() {
rfield@1422 296 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 297 Interface J = new Interface("J", I);
rfield@1422 298 Interface K = new Interface("K", I);
rfield@1422 299 Class C = new Class("C", J, K);
rfield@1422 300
rfield@1422 301 assertInvokeVirtualEquals(99, C);
rfield@1422 302 assertInvokeInterfaceEquals(99, C, J);
rfield@1422 303 assertInvokeInterfaceEquals(99, C, K);
rfield@1422 304 assertInvokeInterfaceEquals(99, C, I);
rfield@1422 305 }
rfield@1422 306
rfield@1422 307 /**
rfield@1422 308 * interface I { default int m() { return 99; } }
rfield@1422 309 * interface J extends I { }
rfield@1422 310 * interface K extends I { }
rfield@1422 311 * interface L extends I { }
rfield@1422 312 * interface M extends I { }
rfield@1422 313 * class C implements I, J, K, L, M {}
rfield@1422 314 *
rfield@1422 315 * TEST: C c = new C(); c.m() == 99
rfield@1422 316 * TEST: J j = new C(); j.m() == 99
rfield@1422 317 * TEST: K k = new C(); k.m() == 99
rfield@1422 318 * TEST: I i = new C(); i.m() == 99
rfield@1422 319 * TEST: L l = new C(); l.m() == 99
rfield@1422 320 * TEST: M m = new C(); m.m() == 99
rfield@1422 321 */
rfield@1422 322 public void testExpandedDiamond() {
rfield@1422 323 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 324 Interface J = new Interface("J", I);
rfield@1422 325 Interface K = new Interface("K", I);
rfield@1422 326 Interface L = new Interface("L", I);
rfield@1422 327 Interface M = new Interface("M", L);
rfield@1422 328 Class C = new Class("C", I, J, K, L, M);
rfield@1422 329
rfield@1422 330 assertInvokeVirtualEquals(99, C);
rfield@1422 331 assertInvokeInterfaceEquals(99, C, J);
rfield@1422 332 assertInvokeInterfaceEquals(99, C, K);
rfield@1422 333 assertInvokeInterfaceEquals(99, C, I);
rfield@1422 334 assertInvokeInterfaceEquals(99, C, L);
rfield@1422 335 assertInvokeInterfaceEquals(99, C, M);
rfield@1422 336 }
rfield@1422 337
rfield@1422 338 /**
rfield@1422 339 * interface I { int m() default { return 99; } }
rfield@1422 340 * interface J extends I { int m(); }
rfield@1422 341 * class C implements J {}
rfield@1422 342 *
rfield@1422 343 * TEST: C c = new C(); c.m() throws AME
rfield@1422 344 */
rfield@1422 345 public void testReabstract() {
rfield@1422 346 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 347 Interface J = new Interface("J", I, AbstractMethod.std());
rfield@1422 348 Class C = new Class("C", J);
rfield@1422 349
rfield@1422 350 assertThrows(AbstractMethodError.class, C);
rfield@1422 351 }
rfield@1422 352
rfield@1422 353 /**
rfield@1422 354 * interface I { default int m() { return 88; } }
rfield@1422 355 * interface J extends I { default int m() { return 99; } }
rfield@1422 356 * class C implements J {}
rfield@1422 357 *
rfield@1422 358 * TEST: C c = new C(); c.m() == 99;
rfield@1422 359 * TEST: J j = new C(); j.m() == 99;
rfield@1422 360 * TEST: I i = new C(); i.m() == 99;
rfield@1422 361 */
rfield@1422 362 public void testShadow() {
rfield@1422 363 Interface I = new Interface("I", DefaultMethod.std("88"));
rfield@1422 364 Interface J = new Interface("J", I, DefaultMethod.std("99"));
rfield@1422 365 Class C = new Class("C", J);
rfield@1422 366
rfield@1422 367 assertInvokeVirtualEquals(99, C);
rfield@1422 368 assertInvokeInterfaceEquals(99, C, J);
rfield@1422 369 assertInvokeInterfaceEquals(99, C, I);
rfield@1422 370 }
rfield@1422 371
rfield@1422 372 /**
rfield@1422 373 * interface I { default int m() { return 88; } }
rfield@1422 374 * interface J extends I { default int m() { return 99; } }
rfield@1422 375 * class C implements I, J {}
rfield@1422 376 *
rfield@1422 377 * TEST: C c = new C(); c.m() == 99;
rfield@1422 378 * TEST: J j = new C(); j.m() == 99;
rfield@1422 379 * TEST: I i = new C(); i.m() == 99;
rfield@1422 380 */
rfield@1422 381 public void testDisqualified() {
rfield@1422 382 Interface I = new Interface("I", DefaultMethod.std("88"));
rfield@1422 383 Interface J = new Interface("J", I, DefaultMethod.std("99"));
rfield@1422 384 Class C = new Class("C", I, J);
rfield@1422 385
rfield@1422 386 assertInvokeVirtualEquals(99, C);
rfield@1422 387 assertInvokeInterfaceEquals(99, C, J);
rfield@1422 388 assertInvokeInterfaceEquals(99, C, I);
rfield@1422 389 }
rfield@1422 390
rfield@1422 391 /**
rfield@1422 392 * interface I<T> { default int m(T t) { return 99; } }
rfield@1422 393 * Class C implements I<String> { public int m() { return 88; } }
rfield@1422 394 *
rfield@1422 395 * TEST: C c = new C(); c.m() == 88;
rfield@1422 396 * TEST: I i = new C(); i.m() == 88;
rfield@1422 397 */
rfield@1422 398 public void testSelfFill() {
rfield@1422 399 // This test ensures that a concrete method overrides a default method
rfield@1422 400 // that matches at the language-level, but has a different method
rfield@1422 401 // signature due to erasure.
rfield@1422 402
rfield@1422 403 // debugTest();
rfield@1422 404
rfield@1422 405 DefaultMethod dm = new DefaultMethod(
rfield@1422 406 "int", "m", "return 99;", new MethodParameter("T", "t"));
rfield@1422 407 ConcreteMethod cm = new ConcreteMethod(
rfield@1422 408 "int", "m", "return 88;", AccessFlag.PUBLIC,
rfield@1422 409 new MethodParameter("String", "s"));
rfield@1422 410
rfield@1422 411 Interface I = new Interface("I", new TypeParameter("T"), dm);
rfield@1422 412 Class C = new Class("C", I.with("String"), cm);
rfield@1422 413
rfield@1422 414 AbstractMethod pm = new AbstractMethod(
rfield@1422 415 "int", "m", new MethodParameter("T", "t"));
rfield@1422 416
rfield@1422 417 assertInvokeVirtualEquals(new Integer(88), C, cm, "-1", "\"string\"");
rfield@1422 418 assertInvokeInterfaceEquals(
rfield@1422 419 new Integer(88), C, I.with("String"), pm, "\"string\"");
rfield@1422 420 }
rfield@1422 421
rfield@1422 422 /**
rfield@1422 423 * interface I { default int m() { return 99; } }
rfield@1422 424 * class C implements I {}
rfield@1422 425 *
rfield@1422 426 * TEST: C.class.getMethod("m").invoke(new C()) == 99
rfield@1422 427 */
rfield@1422 428 public void testReflectCall() {
rfield@1422 429 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 430 Class C = new Class("C", I);
rfield@1422 431
rfield@1422 432 Compiler.Flags[] flags = this.verbose ?
rfield@1422 433 new Compiler.Flags[] { Compiler.Flags.VERBOSE } :
rfield@1422 434 new Compiler.Flags[] {};
rfield@1422 435 Compiler compiler = new Compiler(flags);
rfield@1422 436 java.lang.Class<?> cls = null;
rfield@1422 437 try {
rfield@1422 438 cls = compiler.compileAndLoad(C);
rfield@1422 439 } catch (ClassNotFoundException e) {
rfield@1422 440 fail("Could not load class");
rfield@1422 441 }
rfield@1422 442
rfield@1422 443 java.lang.reflect.Method method = null;
rfield@1422 444 try {
rfield@1422 445 method = cls.getMethod(stdMethodName);
rfield@1422 446 } catch (NoSuchMethodException e) {
rfield@1422 447 fail("Could not find method in class");
rfield@1422 448 }
rfield@1422 449 assertNotNull(method);
rfield@1422 450
rfield@1422 451 Object c = null;
rfield@1422 452 try {
rfield@1422 453 c = cls.newInstance();
rfield@1422 454 } catch (InstantiationException | IllegalAccessException e) {
rfield@1422 455 fail("Could not create instance of class");
rfield@1422 456 }
rfield@1422 457 assertNotNull(c);
rfield@1422 458
rfield@1422 459 Integer res = null;
rfield@1422 460 try {
rfield@1422 461 res = (Integer)method.invoke(c);
rfield@1422 462 } catch (IllegalAccessException |
rfield@1422 463 java.lang.reflect.InvocationTargetException e) {
rfield@1422 464 fail("Could not invoke default instance method");
rfield@1422 465 }
rfield@1422 466 assertNotNull(res);
rfield@1422 467
rfield@1422 468 assertEquals(res.intValue(), 99);
rfield@1422 469
rfield@1422 470 compiler.cleanup();
rfield@1422 471 }
rfield@1422 472
rfield@1422 473 /**
rfield@1422 474 * interface I<T,V,W> { default int m(T t, V v, W w) { return 99; } }
rfield@1422 475 * interface J<T,V> extends I<String,T,V> { int m(T t, V v, String w); } }
rfield@1422 476 * interface K<T> extends J<String,T> { int m(T t, String v, String w); } }
rfield@1422 477 * class C implements K<String> {
rfield@1422 478 * public int m(String t, String v, String w) { return 88; }
rfield@1422 479 * }
rfield@1422 480 *
rfield@1422 481 * TEST: I<String,String,String> i = new C(); i.m("A","B","C") == 88;
rfield@1422 482 * TEST: J<String,String> j = new C(); j.m("A","B","C") == 88;
rfield@1422 483 * TEST: K<String> k = new C(); k.m("A","B","C") == 88;
rfield@1422 484 */
rfield@1422 485 public void testBridges() {
rfield@1422 486 DefaultMethod dm = new DefaultMethod("int", stdMethodName, "return 99;",
rfield@1422 487 new MethodParameter("T", "t"), new MethodParameter("V", "v"),
rfield@1422 488 new MethodParameter("W", "w"));
rfield@1422 489
rfield@1422 490 AbstractMethod pm0 = new AbstractMethod("int", stdMethodName,
rfield@1422 491 new MethodParameter("T", "t"), new MethodParameter("V", "v"),
rfield@1422 492 new MethodParameter("W", "w"));
rfield@1422 493
rfield@1422 494 AbstractMethod pm1 = new AbstractMethod("int", stdMethodName,
rfield@1422 495 new MethodParameter("T", "t"), new MethodParameter("V", "v"),
rfield@1422 496 new MethodParameter("String", "w"));
rfield@1422 497
rfield@1422 498 AbstractMethod pm2 = new AbstractMethod("int", stdMethodName,
rfield@1422 499 new MethodParameter("T", "t"), new MethodParameter("String", "v"),
rfield@1422 500 new MethodParameter("String", "w"));
rfield@1422 501
rfield@1422 502 ConcreteMethod cm = new ConcreteMethod("int",stdMethodName,"return 88;",
rfield@1422 503 AccessFlag.PUBLIC,
rfield@1422 504 new MethodParameter("String", "t"),
rfield@1422 505 new MethodParameter("String", "v"),
rfield@1422 506 new MethodParameter("String", "w"));
rfield@1422 507
rfield@1422 508 Interface I = new Interface("I", new TypeParameter("T"),
rfield@1422 509 new TypeParameter("V"), new TypeParameter("W"), dm);
rfield@1422 510 Interface J = new Interface("J",
rfield@1422 511 new TypeParameter("T"), new TypeParameter("V"),
rfield@1422 512 I.with("String", "T", "V"), pm1);
rfield@1422 513 Interface K = new Interface("K", new TypeParameter("T"),
rfield@1422 514 J.with("String", "T"), pm2);
rfield@1422 515 Class C = new Class("C", K.with("String"), cm);
rfield@1422 516
rfield@1422 517 String[] args = new String[] { "\"A\"", "\"B\"", "\"C\"" };
rfield@1422 518 assertInvokeInterfaceEquals(new Integer(88), C,
rfield@1422 519 I.with("String", "String", "String"), pm0, args);
rfield@1422 520 assertInvokeInterfaceEquals(new Integer(88), C,
rfield@1422 521 J.with("String", "String"), pm1, args);
rfield@1422 522 assertInvokeInterfaceEquals(new Integer(88), C,
rfield@1422 523 K.with("String"), pm2, args);
rfield@1422 524 }
rfield@1422 525
rfield@1422 526 /**
rfield@1422 527 * interface J { default int m() { return 88; } }
rfield@1422 528 * interface I extends J { default int m() { return J.super.m(); } }
rfield@1422 529 * class C implements I {}
rfield@1422 530 *
rfield@1422 531 * TEST: C c = new C(); c.m() == 88;
rfield@1422 532 * TEST: I i = new C(); i.m() == 88;
rfield@1422 533 */
rfield@1422 534 public void testSuperBasic() {
rfield@1422 535 // debugTest();
rfield@1422 536
rfield@1422 537 Interface J = new Interface("J", DefaultMethod.std("88"));
rfield@1422 538 Interface I = new Interface("I", J, new DefaultMethod(
rfield@1422 539 "int", stdMethodName, "return J.super.m();"));
rfield@1422 540 I.addCompilationDependency(J.findMethod(stdMethodName));
rfield@1422 541 Class C = new Class("C", I);
rfield@1422 542
rfield@1422 543 assertInvokeVirtualEquals(88, C);
rfield@1422 544 assertInvokeInterfaceEquals(88, C, I);
rfield@1422 545 }
rfield@1422 546
rfield@1422 547 /**
rfield@1422 548 * interface K { int m() default { return 99; } }
rfield@1422 549 * interface L { int m() default { return 101; } }
rfield@1422 550 * interface J extends K, L {}
rfield@1422 551 * interface I extends J, K { int m() default { J.super.m(); } }
rfield@1422 552 * class C implements I {}
rfield@1422 553 *
rfield@1422 554 * TEST: C c = new C(); c.m() throws AME
rfield@1422 555 * TODO: add case for K k = new C(); k.m() throws AME
rfield@1422 556 */
rfield@1422 557 public void testSuperConflict() {
rfield@1422 558 // debugTest();
rfield@1422 559
rfield@1422 560 Interface K = new Interface("K", DefaultMethod.std("99"));
rfield@1422 561 Interface L = new Interface("L", DefaultMethod.std("101"));
rfield@1422 562 Interface J = new Interface("J", K, L);
rfield@1422 563 Interface I = new Interface("I", J, K, new DefaultMethod(
rfield@1422 564 "int", stdMethodName, "return J.super.m();"));
rfield@1422 565 Interface Jstub = new Interface("J", DefaultMethod.std("-1"));
rfield@1422 566 I.addCompilationDependency(Jstub);
rfield@1422 567 I.addCompilationDependency(Jstub.findMethod(stdMethodName));
rfield@1422 568 Class C = new Class("C", I);
rfield@1422 569
rfield@1422 570 assertThrows(AbstractMethodError.class, C);
rfield@1422 571 }
rfield@1422 572
rfield@1422 573 /**
rfield@1422 574 * interface I { default int m() { return 99; } }
rfield@1422 575 * interface J extends I { default int m() { return 55; } }
rfield@1422 576 * class C implements I, J { public int m() { return I.super.m(); } }
rfield@1422 577 *
rfield@1422 578 * TEST: C c = new C(); c.m() throws AME
rfield@1422 579 * TODO: add case for J j = new C(); j.m() throws AME
rfield@1422 580 */
rfield@1422 581 public void testSuperDisqual() {
rfield@1422 582 Interface I = new Interface("I", DefaultMethod.std("99"));
rfield@1422 583 Interface J = new Interface("J", I, DefaultMethod.std("55"));
rfield@1422 584 Class C = new Class("C", I, J,
rfield@1422 585 new ConcreteMethod("int", stdMethodName, "return I.super.m();",
rfield@1422 586 AccessFlag.PUBLIC));
rfield@1422 587 C.addCompilationDependency(I.findMethod(stdMethodName));
rfield@1422 588
rfield@1422 589 assertThrows(AbstractMethodError.class, C);
rfield@1422 590 }
rfield@1422 591
rfield@1422 592 /**
rfield@1422 593 * interface J { int m(); }
rfield@1422 594 * interface I extends J { default int m() { return J.super.m(); } }
rfield@1422 595 * class C implements I {}
rfield@1422 596 *
rfield@1422 597 * TEST: C c = new C(); c.m() throws AME
rfield@1422 598 * TODO: add case for I i = new C(); i.m() throws AME
rfield@1422 599 */
rfield@1422 600 public void testSuperNull() {
rfield@1422 601 Interface J = new Interface("J", AbstractMethod.std());
rfield@1422 602 Interface I = new Interface("I", J, new DefaultMethod(
rfield@1422 603 "int", stdMethodName, "return J.super.m();"));
rfield@1422 604 Interface Jstub = new Interface("J", DefaultMethod.std("99"));
rfield@1422 605 I.addCompilationDependency(Jstub);
rfield@1422 606 I.addCompilationDependency(Jstub.findMethod(stdMethodName));
rfield@1422 607 Class C = new Class("C", I);
rfield@1422 608
rfield@1422 609 assertThrows(AbstractMethodError.class, C);
rfield@1422 610 }
rfield@1422 611
rfield@1422 612 /**
rfield@1422 613 * interface J<T> { default int m(T t) { return 88; } }
rfield@1422 614 * interface I extends J<String> {
rfield@1422 615 * int m(String s) default { return J.super.m(); }
rfield@1422 616 * }
rfield@1422 617 * class C implements I {}
rfield@1422 618 *
rfield@1422 619 * TEST: I i = new C(); i.m("") == 88;
rfield@1422 620 */
rfield@1422 621 public void testSuperGeneric() {
rfield@1422 622 Interface J = new Interface("J", new TypeParameter("T"),
rfield@1422 623 new DefaultMethod("int", stdMethodName, "return 88;",
rfield@1422 624 new MethodParameter("T", "t")));
rfield@1422 625 Interface I = new Interface("I", J.with("String"),
rfield@1422 626 new DefaultMethod("int", stdMethodName, "return J.super.m(s);",
rfield@1422 627 new MethodParameter("String", "s")));
rfield@1422 628 I.addCompilationDependency(J.findMethod(stdMethodName));
rfield@1422 629 Class C = new Class("C", I);
rfield@1422 630
rfield@1422 631 AbstractMethod pm = new AbstractMethod("int", stdMethodName,
rfield@1422 632 new MethodParameter("String", "s"));
rfield@1422 633
rfield@1422 634 assertInvokeInterfaceEquals(
rfield@1422 635 new Integer(88), C, new Extends(I), pm, "\"\"");
rfield@1422 636 }
rfield@1422 637
rfield@1422 638 /**
rfield@1422 639 * interface I<T> { int m(T t) default { return 44; } }
rfield@1422 640 * interface J extends I<String> { int m(String s) default { return 55; } }
rfield@1422 641 * class C implements I<String>, J {
rfield@1422 642 * public int m(String s) { return I.super.m(s); }
rfield@1422 643 * }
rfield@1422 644 *
rfield@1422 645 * TEST: C c = new C(); c.m("string") throws AME
rfield@1422 646 */
rfield@1422 647 public void testSuperGenericDisqual() {
rfield@1422 648 MethodParameter t = new MethodParameter("T", "t");
rfield@1422 649 MethodParameter s = new MethodParameter("String", "s");
rfield@1422 650
rfield@1422 651 Interface I = new Interface("I", new TypeParameter("T"),
rfield@1422 652 new DefaultMethod("int", stdMethodName, "return 44;", t));
rfield@1422 653 Interface J = new Interface("J", I.with("String"),
rfield@1422 654 new DefaultMethod("int", stdMethodName, "return 55;", s));
rfield@1422 655 Class C = new Class("C", I.with("String"), J,
rfield@1422 656 new ConcreteMethod("int", stdMethodName,
rfield@1422 657 "return I.super.m(s);", AccessFlag.PUBLIC, s));
rfield@1422 658 C.addCompilationDependency(I.findMethod(stdMethodName));
rfield@1422 659
rfield@1422 660 assertThrows(AbstractMethodError.class, C,
rfield@1422 661 new ConcreteMethod(
rfield@1422 662 "int", stdMethodName, "return -1;", AccessFlag.PUBLIC, s),
rfield@1422 663 "-1", "\"string\"");
rfield@1422 664 }
rfield@1422 665
rfield@1422 666 /**
rfield@1422 667 * interface I { default Integer m() { return new Integer(88); } }
rfield@1422 668 * class C { Number m() { return new Integer(99); } }
rfield@1422 669 * class D extends C implements I {}
rfield@1422 670 * class S { Object foo() { return (new D()).m(); } // link sig: ()LInteger;
rfield@1422 671 * TEST: S s = new S(); s.foo() == new Integer(99)
rfield@1422 672 */
rfield@1422 673 public void testCovarBridge() {
rfield@1422 674 Interface I = new Interface("I", new DefaultMethod(
rfield@1422 675 "Integer", "m", "return new Integer(88);"));
rfield@1422 676 Class C = new Class("C", new ConcreteMethod(
rfield@1422 677 "Number", "m", "return new Integer(99);", AccessFlag.PUBLIC));
rfield@1422 678 Class D = new Class("D", I, C);
rfield@1422 679
rfield@1422 680 ConcreteMethod DstubMethod = new ConcreteMethod(
rfield@1422 681 "Integer", "m", "return null;", AccessFlag.PUBLIC);
rfield@1422 682 Class Dstub = new Class("D", DstubMethod);
rfield@1422 683
rfield@1422 684 ConcreteMethod toCall = new ConcreteMethod(
rfield@1422 685 "Object", "foo", "return (new D()).m();", AccessFlag.PUBLIC);
rfield@1422 686 Class S = new Class("S", D, toCall);
rfield@1422 687 S.addCompilationDependency(Dstub);
rfield@1422 688 S.addCompilationDependency(DstubMethod);
rfield@1422 689
rfield@1422 690 assertInvokeVirtualEquals(new Integer(99), S, toCall, "null");
rfield@1422 691 }
rfield@1422 692
rfield@1422 693 /**
rfield@1422 694 * interface I { default Integer m() { return new Integer(88); } }
rfield@1422 695 * class C { int m() { return 99; } }
rfield@1422 696 * class D extends C implements I {}
rfield@1422 697 * class S { Object foo() { return (new D()).m(); } // link sig: ()LInteger;
rfield@1422 698 * TEST: S s = new S(); s.foo() == new Integer(88)
rfield@1422 699 */
rfield@1422 700 public void testNoCovarNoBridge() {
rfield@1422 701 Interface I = new Interface("I", new DefaultMethod(
rfield@1422 702 "Integer", "m", "return new Integer(88);"));
rfield@1422 703 Class C = new Class("C", new ConcreteMethod(
rfield@1422 704 "int", "m", "return 99;", AccessFlag.PUBLIC));
rfield@1422 705 Class D = new Class("D", I, C);
rfield@1422 706
rfield@1422 707 ConcreteMethod DstubMethod = new ConcreteMethod(
rfield@1422 708 "Integer", "m", "return null;", AccessFlag.PUBLIC);
rfield@1422 709 Class Dstub = new Class("D", DstubMethod);
rfield@1422 710
rfield@1422 711 ConcreteMethod toCall = new ConcreteMethod(
rfield@1422 712 "Object", "foo", "return (new D()).m();", AccessFlag.PUBLIC);
rfield@1422 713 Class S = new Class("S", D, toCall);
rfield@1422 714 S.addCompilationDependency(Dstub);
rfield@1422 715 S.addCompilationDependency(DstubMethod);
rfield@1422 716
rfield@1422 717 assertInvokeVirtualEquals(new Integer(88), S, toCall, "null");
rfield@1422 718 }
rfield@1422 719
rfield@1422 720 /**
rfield@1422 721 * interface J { int m(); }
rfield@1422 722 * interface I extends J { default int m() { return 99; } }
rfield@1422 723 * class B implements J {}
rfield@1422 724 * class C extends B implements I {}
rfield@1422 725 * TEST: C c = new C(); c.m() == 99
rfield@1422 726 *
rfield@1422 727 * The point of this test is that B does not get default method analysis,
rfield@1422 728 * and C does not generate any new miranda methods in the vtable.
rfield@1422 729 * It verifies that default method analysis occurs when mirandas have been
rfield@1422 730 * inherited and the supertypes don't have any overpass methods.
rfield@1422 731 */
rfield@1422 732 public void testNoNewMiranda() {
rfield@1422 733 Interface J = new Interface("J", AbstractMethod.std());
rfield@1422 734 Interface I = new Interface("I", J, DefaultMethod.std("99"));
rfield@1422 735 Class B = new Class("B", J);
rfield@1422 736 Class C = new Class("C", B, I);
rfield@1422 737 assertInvokeVirtualEquals(99, C);
rfield@1422 738 }
rfield@1422 739
rfield@1422 740 /**
rfield@1422 741 * interface I<T,V,W> { int m(T t, V v, W w); }
rfield@1422 742 * interface J<T,V> implements I<T,V,String> { int m(T t, V v, String w); }
rfield@1422 743 * interface K<T> implements J<T,String> {
rfield@1422 744 * int m(T t, String v, String w); { return 99; } }
rfield@1422 745 * class C implements K<String> {
rfield@1422 746 * public int m(Object t, Object v, String w) { return 77; }
rfield@1422 747 * }
rfield@1422 748 * TEST C = new C(); ((I)c).m(Object,Object,Object) == 99
rfield@1422 749 * TEST C = new C(); ((J)c).m(Object,Object,String) == 77
rfield@1422 750 * TEST C = new C(); ((K)c).m(Object,String,String) == 99
rfield@1422 751 *
rfield@1422 752 * Test that a erased-signature-matching method does not implement
rfield@1422 753 * non-language-level matching methods
rfield@1422 754 */
rfield@1422 755 public void testNonConcreteFill() {
rfield@1422 756 AbstractMethod ipm = new AbstractMethod("int", "m",
rfield@1422 757 new MethodParameter("T", "t"),
rfield@1422 758 new MethodParameter("V", "s"),
rfield@1422 759 new MethodParameter("W", "w"));
rfield@1422 760 Interface I = new Interface("I",
rfield@1422 761 new TypeParameter("T"),
rfield@1422 762 new TypeParameter("V"),
rfield@1422 763 new TypeParameter("W"), ipm);
rfield@1422 764
rfield@1422 765 AbstractMethod jpm = new AbstractMethod("int", "m",
rfield@1422 766 new MethodParameter("T", "t"),
rfield@1422 767 new MethodParameter("V", "s"),
rfield@1422 768 new MethodParameter("String", "w"));
rfield@1422 769 Interface J = new Interface("J",
rfield@1422 770 new TypeParameter("T"),
rfield@1422 771 new TypeParameter("V"),
rfield@1422 772 I.with("T", "V", "String"), jpm);
rfield@1422 773
rfield@1422 774 AbstractMethod kpm = new AbstractMethod("int", "m",
rfield@1422 775 new MethodParameter("T", "t"),
rfield@1422 776 new MethodParameter("String", "s"),
rfield@1422 777 new MethodParameter("String", "w"));
rfield@1422 778 Interface K = new Interface("K",
rfield@1422 779 new TypeParameter("T"),
rfield@1422 780 J.with("T", "String"),
rfield@1422 781 new DefaultMethod("int", "m", "return 99;",
rfield@1422 782 new MethodParameter("T", "t"),
rfield@1422 783 new MethodParameter("String", "v"),
rfield@1422 784 new MethodParameter("String", "w")));
rfield@1422 785
rfield@1422 786 Class C = new Class("C",
rfield@1422 787 K.with("String"),
rfield@1422 788 new ConcreteMethod("int", "m", "return 77;",
rfield@1422 789 AccessFlag.PUBLIC,
rfield@1422 790 new MethodParameter("Object", "t"),
rfield@1422 791 new MethodParameter("Object", "v"),
rfield@1422 792 new MethodParameter("String", "w")));
rfield@1422 793
rfield@1422 794 String a = "\"\"";
rfield@1422 795 assertInvokeInterfaceEquals(99, C,
rfield@1422 796 K.with("String"), kpm, a, a, a);
rfield@1422 797 assertInvokeInterfaceEquals(77, C,
rfield@1422 798 J.with("String", "String"), jpm, a, a, a);
rfield@1422 799 assertInvokeInterfaceEquals(99, C,
rfield@1422 800 I.with("String", "String", "String"), ipm, a, a, a);
rfield@1422 801 }
rfield@1422 802
rfield@1422 803 public void testStrictfpDefault() {
rfield@1422 804 try {
rfield@1422 805 java.lang.Class.forName("org.openjdk.tests.vm.StrictfpDefault");
rfield@1422 806 } catch (Exception e) {
rfield@1422 807 fail("Could not load class", e);
rfield@1422 808 }
rfield@1422 809 }
rfield@1422 810 }
rfield@1422 811
rfield@1422 812 interface StrictfpDefault {
rfield@1422 813 default strictfp void m() {}
rfield@1422 814 }

mercurial