test/tools/javac/lambda/TargetType51.java

Tue, 14 May 2013 11:11:09 -0700

author
rfield
date
Tue, 14 May 2013 11:11:09 -0700
changeset 1752
c09b7234cded
parent 1562
2154ed9ff6c8
child 2227
998b10c43157
permissions
-rw-r--r--

8012556: Implement lambda methods on interfaces as static
8006140: Javac NPE compiling Lambda expression on initialization expression of static field in interface
Summary: Lambdas occurring in static contexts or those not needing instance information should be generated into static methods. This has long been the case for classes. However, as a work-around to the lack of support for statics on interfaces, interface lambda methods have been generated into default methods. For lambdas in interface static contexts (fields and static methods) this causes an NPE in javac because there is no 'this'. MethodHandles now support static methods on interfaces. This changeset allows lambda methods to be generated as static interface methods. An existing bug in Hotspot (8013875) is exposed in a test when the "-esa" flag is used. This test and another test that already exposed this bug have been marked with @ignore.
Reviewed-by: mcimadamore

mcimadamore@1510 1 /*
mcimadamore@1510 2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
mcimadamore@1510 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
mcimadamore@1510 4 *
mcimadamore@1510 5 * This code is free software; you can redistribute it and/or modify it
mcimadamore@1510 6 * under the terms of the GNU General Public License version 2 only, as
mcimadamore@1510 7 * published by the Free Software Foundation.
mcimadamore@1510 8 *
mcimadamore@1510 9 * This code is distributed in the hope that it will be useful, but WITHOUT
mcimadamore@1510 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
mcimadamore@1510 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
mcimadamore@1510 12 * version 2 for more details (a copy is included in the LICENSE file that
mcimadamore@1510 13 * accompanied this code).
mcimadamore@1510 14 *
mcimadamore@1510 15 * You should have received a copy of the GNU General Public License version
mcimadamore@1510 16 * 2 along with this work; if not, write to the Free Software Foundation,
mcimadamore@1510 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
mcimadamore@1510 18 *
mcimadamore@1510 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
mcimadamore@1510 20 * or visit www.oracle.com if you need additional information or have any
mcimadamore@1510 21 * questions.
mcimadamore@1510 22 */
mcimadamore@1510 23
mcimadamore@1510 24 /*
mcimadamore@1510 25 * @test
mcimadamore@1562 26 * @bug 8005244
mcimadamore@1562 27 * @summary Implement overload resolution as per latest spec EDR
mcimadamore@1562 28 * smoke test for combinator-like stuck analysis
mcimadamore@1510 29 * @author Maurizio Cimadamore
mcimadamore@1510 30 * @compile TargetType51.java
mcimadamore@1510 31 */
mcimadamore@1510 32
mcimadamore@1510 33 import java.util.Comparator;
mcimadamore@1510 34
mcimadamore@1510 35 class TargetType51 {
mcimadamore@1510 36
mcimadamore@1510 37 interface SimpleMapper<T, U> {
mcimadamore@1510 38 T map(U t);
mcimadamore@1510 39 }
mcimadamore@1510 40
mcimadamore@1510 41 interface SimpleList<X> {
mcimadamore@1510 42 SimpleList<X> sort(Comparator<? super X> c);
mcimadamore@1510 43 }
mcimadamore@1510 44
mcimadamore@1510 45 static class Person {
mcimadamore@1510 46 String getName() { return ""; }
mcimadamore@1510 47 }
mcimadamore@1510 48
mcimadamore@1510 49 <T, U extends Comparable<? super U>> Comparator<T> comparing(SimpleMapper<U, T> mapper) { return null; }
mcimadamore@1510 50
mcimadamore@1510 51 static class F<U extends Comparable<? super U>, T> {
mcimadamore@1510 52 F(SimpleMapper<U, T> f) { }
mcimadamore@1510 53 }
mcimadamore@1510 54
mcimadamore@1510 55 void testAssignmentContext(SimpleList<Person> list, boolean cond) {
mcimadamore@1510 56 SimpleList<Person> p1 = list.sort(comparing(Person::getName));
mcimadamore@1510 57 SimpleList<Person> p2 = list.sort(comparing(x->x.getName()));
mcimadamore@1510 58 SimpleList<Person> p3 = list.sort(cond ? comparing(Person::getName) : comparing(x->x.getName()));
mcimadamore@1510 59 SimpleList<Person> p4 = list.sort((cond ? comparing(Person::getName) : comparing(x->x.getName())));
mcimadamore@1510 60 }
mcimadamore@1510 61
mcimadamore@1510 62 void testMethodContext(SimpleList<Person> list, boolean cond) {
mcimadamore@1510 63 testMethodContext(list.sort(comparing(Person::getName)), true);
mcimadamore@1510 64 testMethodContext(list.sort(comparing(x->x.getName())), true);
mcimadamore@1510 65 testMethodContext(list.sort(cond ? comparing(Person::getName) : comparing(x->x.getName())), true);
mcimadamore@1510 66 testMethodContext(list.sort((cond ? comparing(Person::getName) : comparing(x->x.getName()))), true);
mcimadamore@1510 67 }
mcimadamore@1510 68 }

mercurial