test/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestInnerVarArgsThis.java

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

author
rfield
date
Tue, 14 May 2013 11:11:09 -0700
changeset 1752
c09b7234cded
parent 0
959103a6100f
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

     1 /*
     2  * Copyright (c) 2012, 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.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 /**
    27  * @test
    28  * @bug 8003639
    29  * @summary convert lambda testng tests to jtreg and add them
    30  * @run testng MethodReferenceTestInnerVarArgsThis
    31  */
    33 import org.testng.annotations.Test;
    34 import java.lang.reflect.Array;
    36 import static org.testng.Assert.assertEquals;
    38 /**
    39  * @author Robert Field
    40  */
    42 @Test
    43 public class MethodReferenceTestInnerVarArgsThis {
    45     interface NsII {
    47         String m(Integer a, Integer b);
    48     }
    50     interface Nsiii {
    52         String m(int a, int b, int c);
    53     }
    55     interface Nsi {
    57         String m(int a);
    58     }
    60     interface NsaO {
    62         String m(Object[] a);
    63     }
    65     interface Nsai {
    67         String m(int[] a);
    68     }
    70     interface Nsvi {
    72         String m(int... va);
    73     }
    75     class CIA {
    77         String xvI(Integer... vi) {
    78             StringBuilder sb = new StringBuilder("xvI:");
    79             for (Integer i : vi) {
    80                 sb.append(i);
    81                 sb.append("-");
    82             }
    83             return sb.toString();
    84         }
    86         String xIvI(Integer f, Integer... vi) {
    87             StringBuilder sb = new StringBuilder("xIvI:");
    88             sb.append(f);
    89             for (Integer i : vi) {
    90                 sb.append(i);
    91                 sb.append("-");
    92             }
    93             return sb.toString();
    94         }
    96         String xvi(int... vi) {
    97             int sum = 0;
    98             for (int i : vi) {
    99                 sum += i;
   100             }
   101             return "xvi:" + sum;
   102         }
   104         String xIvi(Integer f, int... vi) {
   105             int sum = 0;
   106             for (int i : vi) {
   107                 sum += i;
   108             }
   109             return "xIvi:(" + f + ")" + sum;
   110         }
   112         String xvO(Object... vi) {
   113             StringBuilder sb = new StringBuilder("xvO:");
   114             for (Object i : vi) {
   115                 if (i.getClass().isArray()) {
   116                     sb.append("[");
   117                     int len = Array.getLength(i);
   118                     for (int x = 0; x < len; ++x) {
   119                         sb.append(Array.get(i, x));
   120                         sb.append(",");
   121                     }
   122                     sb.append("]");
   124                 } else {
   125                     sb.append(i);
   126                 }
   127                 sb.append("*");
   128             }
   129             return sb.toString();
   130         }
   132         public class CIB {
   134             // These should be processed as var args
   135             public void testVarArgsNsSuperclass() {
   136                 NsII q;
   138                 q = CIA.this::xvO;
   139                 assertEquals(q.m(55, 66), "xvO:55*66*");
   140             }
   142             public void testVarArgsNsArray() {
   143                 Nsai q;
   145                 q = CIA.this::xvO;
   146                 assertEquals(q.m(new int[]{55, 66}), "xvO:[55,66,]*");
   147             }
   149             public void testVarArgsNsII() {
   150                 NsII q;
   152                 q = CIA.this::xvI;
   153                 assertEquals(q.m(33, 7), "xvI:33-7-");
   155                 q = CIA.this::xIvI;
   156                 assertEquals(q.m(50, 40), "xIvI:5040-");
   158                 q = CIA.this::xvi;
   159                 assertEquals(q.m(100, 23), "xvi:123");
   161                 q = CIA.this::xIvi;
   162                 assertEquals(q.m(9, 21), "xIvi:(9)21");
   163             }
   165             public void testVarArgsNsiii() {
   166                 Nsiii q;
   168                 q = CIA.this::xvI;
   169                 assertEquals(q.m(3, 2, 1), "xvI:3-2-1-");
   171                 q = CIA.this::xIvI;
   172                 assertEquals(q.m(888, 99, 2), "xIvI:88899-2-");
   174                 q = CIA.this::xvi;
   175                 assertEquals(q.m(900, 80, 7), "xvi:987");
   177                 q = CIA.this::xIvi;
   178                 assertEquals(q.m(333, 27, 72), "xIvi:(333)99");
   179             }
   181             public void testVarArgsNsi() {
   182                 Nsi q;
   184                 q = CIA.this::xvI;
   185                 assertEquals(q.m(3), "xvI:3-");
   187                 q = CIA.this::xIvI;
   188                 assertEquals(q.m(888), "xIvI:888");
   190                 q = CIA.this::xvi;
   191                 assertEquals(q.m(900), "xvi:900");
   193                 q = CIA.this::xIvi;
   194                 assertEquals(q.m(333), "xIvi:(333)0");
   195             }
   197             // These should NOT be processed as var args
   198             public void testVarArgsNsaO() {
   199                 NsaO q;
   201                 q = CIA.this::xvO;
   202                 assertEquals(q.m(new String[]{"yo", "there", "dude"}), "xvO:yo*there*dude*");
   203             }
   204         }
   206         CIB cib() {
   207             return new CIB();
   208         }
   210         class E {
   212             String xI(Integer i) {
   213                 return "ExI:" + i;
   214             }
   215         }
   216     }
   218     CIA cia() {
   219         return new CIA();
   220     }
   222     // These should be processed as var args
   223     public void testVarArgsNsSuperclass() {
   224         cia().cib().testVarArgsNsSuperclass();
   225     }
   227     public void testVarArgsNsArray() {
   228         cia().cib().testVarArgsNsArray();
   229     }
   231     public void testVarArgsNsII() {
   232         cia().cib().testVarArgsNsII();
   233     }
   235     public void testVarArgsNsiii() {
   236         cia().cib().testVarArgsNsiii();
   237     }
   239     public void testVarArgsNsi() {
   240         cia().cib().testVarArgsNsi();
   241     }
   243     // These should NOT be processed as var args
   245     public void testVarArgsNsaO() {
   246         cia().cib().testVarArgsNsaO();
   247     }
   250 }

mercurial