langtools/test/tools/javac/lambda/bytecode/TestLambdaBytecode.java
author mchung
Wed, 27 May 2015 13:25:18 -0700
changeset 30846 2b3f379840f0
parent 30730 d3ce7619db2c
child 32454 b0ac04e0fefe
permissions -rw-r--r--
8074432: Move jdeps and javap to jdk.jdeps module Reviewed-by: jjg, alanb, erikj
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16564
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     1
/*
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 17575
diff changeset
     2
 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
16564
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     4
 *
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     8
 *
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    13
 * accompanied this code).
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    14
 *
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    18
 *
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    21
 * questions.
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    22
 */
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    23
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    24
/*
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    25
 * @test
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    26
 * @bug 8009649
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    27
 * @summary Lambda back-end should generate invokespecial for method handles referring to private instance methods
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    28
 * @library ../../lib
30846
2b3f379840f0 8074432: Move jdeps and javap to jdk.jdeps module
mchung
parents: 30730
diff changeset
    29
 * @modules jdk.jdeps/com.sun.tools.classfile
30730
d3ce7619db2c 8076543: Add @modules as needed to the langtools tests
akulyakh
parents: 17575
diff changeset
    30
 *          jdk.compiler/com.sun.tools.javac.api
16564
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    31
 * @build JavacTestingAbstractThreadedTest
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    32
 * @run main/othervm TestLambdaBytecode
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    33
 */
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    34
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    35
// use /othervm to avoid jtreg timeout issues (CODETOOLS-7900047)
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    36
// see JDK-8006746
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    37
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    38
import com.sun.tools.classfile.Attribute;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    39
import com.sun.tools.classfile.BootstrapMethods_attribute;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    40
import com.sun.tools.classfile.ClassFile;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    41
import com.sun.tools.classfile.Code_attribute;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    42
import com.sun.tools.classfile.ConstantPool.*;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    43
import com.sun.tools.classfile.Instruction;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    44
import com.sun.tools.classfile.Method;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    45
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    46
import com.sun.tools.javac.api.JavacTaskImpl;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    47
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    48
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    49
import java.io.File;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    50
import java.net.URI;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    51
import java.util.ArrayList;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    52
import java.util.Arrays;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    53
import java.util.Locale;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    54
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    55
import javax.tools.Diagnostic;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    56
import javax.tools.JavaFileObject;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    57
import javax.tools.SimpleJavaFileObject;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    58
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    59
import static com.sun.tools.javac.jvm.ClassFile.*;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    60
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    61
public class TestLambdaBytecode
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    62
    extends JavacTestingAbstractThreadedTest
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    63
    implements Runnable {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    64
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    65
    enum ClassKind {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    66
        CLASS("class"),
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    67
        INTERFACE("interface");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    68
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    69
        String classStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    70
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    71
        ClassKind(String classStr) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    72
            this.classStr = classStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    73
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    74
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    75
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    76
    enum AccessKind {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    77
        PUBLIC("public"),
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    78
        PRIVATE("private");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    79
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    80
        String accessStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    81
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    82
        AccessKind(String accessStr) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    83
            this.accessStr = accessStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    84
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    85
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    86
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    87
    enum StaticKind {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    88
        STATIC("static"),
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    89
        INSTANCE("");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    90
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    91
        String staticStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    92
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    93
        StaticKind(String staticStr) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    94
            this.staticStr = staticStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    95
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    96
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    97
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    98
    enum DefaultKind {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
    99
        DEFAULT("default"),
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   100
        NO_DEFAULT("");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   101
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   102
        String defaultStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   103
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   104
        DefaultKind(String defaultStr) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   105
            this.defaultStr = defaultStr;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   106
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   107
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   108
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   109
    enum ExprKind {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   110
        LAMBDA("Runnable r = ()->{ target(); };");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   111
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   112
        String exprString;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   113
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   114
        ExprKind(String exprString) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   115
            this.exprString = exprString;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   116
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   117
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   118
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   119
    static class MethodKind {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   120
        ClassKind ck;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   121
        AccessKind ak;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   122
        StaticKind sk;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   123
        DefaultKind dk;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   124
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   125
        MethodKind(ClassKind ck, AccessKind ak, StaticKind sk, DefaultKind dk) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   126
            this.ck = ck;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   127
            this.ak = ak;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   128
            this.sk = sk;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   129
            this.dk = dk;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   130
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   131
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   132
        boolean inInterface() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   133
            return ck == ClassKind.INTERFACE;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   134
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   135
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   136
        boolean isPrivate() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   137
            return ak == AccessKind.PRIVATE;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   138
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   139
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   140
        boolean isStatic() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   141
            return sk == StaticKind.STATIC;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   142
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   143
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   144
        boolean isDefault() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   145
            return dk == DefaultKind.DEFAULT;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   146
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   147
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   148
        boolean isOK() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   149
            if (isDefault() && (!inInterface() || isStatic())) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   150
                return false;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   151
            } else if (inInterface() &&
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   152
                    ((!isStatic() && !isDefault()) || isPrivate())) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   153
                return false;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   154
            } else {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   155
                return true;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   156
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   157
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   158
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   159
        String mods() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   160
            StringBuilder buf = new StringBuilder();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   161
            buf.append(ak.accessStr);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   162
            buf.append(' ');
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   163
            buf.append(sk.staticStr);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   164
            buf.append(' ');
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   165
            buf.append(dk.defaultStr);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   166
            return buf.toString();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   167
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   168
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   169
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   170
    public static void main(String... args) throws Exception {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   171
        for (ClassKind ck : ClassKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   172
            for (AccessKind ak1 : AccessKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   173
                for (StaticKind sk1 : StaticKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   174
                    for (DefaultKind dk1 : DefaultKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   175
                        for (AccessKind ak2 : AccessKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   176
                            for (StaticKind sk2 : StaticKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   177
                                for (DefaultKind dk2 : DefaultKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   178
                                    for (ExprKind ek : ExprKind.values()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   179
                                        pool.execute(new TestLambdaBytecode(ck, ak1, ak2, sk1, sk2, dk1, dk2, ek));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   180
                                    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   181
                                }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   182
                            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   183
                        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   184
                    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   185
                }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   186
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   187
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   188
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   189
        checkAfterExec();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   190
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   191
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   192
    MethodKind mk1, mk2;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   193
    ExprKind ek;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   194
    DiagChecker dc;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   195
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   196
    TestLambdaBytecode(ClassKind ck, AccessKind ak1, AccessKind ak2, StaticKind sk1,
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   197
            StaticKind sk2, DefaultKind dk1, DefaultKind dk2, ExprKind ek) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   198
        mk1 = new MethodKind(ck, ak1, sk1, dk1);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   199
        mk2 = new MethodKind(ck, ak2, sk2, dk2);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   200
        this.ek = ek;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   201
        dc = new DiagChecker();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   202
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   203
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   204
    public void run() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   205
        int id = checkCount.incrementAndGet();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   206
        JavaSource source = new JavaSource(id);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   207
        JavacTaskImpl ct = (JavacTaskImpl)comp.getTask(null, fm.get(), dc,
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   208
                null, null, Arrays.asList(source));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   209
        try {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   210
            ct.generate();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   211
        } catch (Throwable t) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   212
            t.printStackTrace();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   213
            throw new AssertionError(
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   214
                    String.format("Error thrown when compiling following code\n%s",
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   215
                    source.source));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   216
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   217
        if (dc.diagFound) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   218
            boolean errorExpected = !mk1.isOK() || !mk2.isOK();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   219
            errorExpected |= mk1.isStatic() && !mk2.isStatic();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   220
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   221
            if (!errorExpected) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   222
                throw new AssertionError(
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   223
                        String.format("Diags found when compiling following code\n%s\n\n%s",
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   224
                        source.source, dc.printDiags()));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   225
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   226
            return;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   227
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   228
        verifyBytecode(id, source);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   229
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   230
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   231
    void verifyBytecode(int id, JavaSource source) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   232
        File compiledTest = new File(String.format("Test%d.class", id));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   233
        try {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   234
            ClassFile cf = ClassFile.read(compiledTest);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   235
            Method testMethod = null;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   236
            for (Method m : cf.methods) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   237
                if (m.getName(cf.constant_pool).equals("test")) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   238
                    testMethod = m;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   239
                    break;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   240
                }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   241
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   242
            if (testMethod == null) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   243
                throw new Error("Test method not found");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   244
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   245
            Code_attribute ea =
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   246
                    (Code_attribute)testMethod.attributes.get(Attribute.Code);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   247
            if (testMethod == null) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   248
                throw new Error("Code attribute for test() method not found");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   249
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   250
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   251
            int bsmIdx = -1;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   252
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   253
            for (Instruction i : ea.getInstructions()) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   254
                if (i.getMnemonic().equals("invokedynamic")) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   255
                    CONSTANT_InvokeDynamic_info indyInfo =
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   256
                         (CONSTANT_InvokeDynamic_info)cf
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   257
                            .constant_pool.get(i.getShort(1));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   258
                    bsmIdx = indyInfo.bootstrap_method_attr_index;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   259
                    if (!indyInfo.getNameAndTypeInfo().getType().equals(makeIndyType(id))) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   260
                        throw new
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   261
                            AssertionError("type mismatch for CONSTANT_InvokeDynamic_info " + source.source + "\n" + indyInfo.getNameAndTypeInfo().getType() + "\n" + makeIndyType(id));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   262
                    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   263
                }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   264
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   265
            if (bsmIdx == -1) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   266
                throw new Error("Missing invokedynamic in generated code");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   267
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   268
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   269
            BootstrapMethods_attribute bsm_attr =
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   270
                    (BootstrapMethods_attribute)cf
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   271
                    .getAttribute(Attribute.BootstrapMethods);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   272
            if (bsm_attr.bootstrap_method_specifiers.length != 1) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   273
                throw new Error("Bad number of method specifiers " +
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   274
                        "in BootstrapMethods attribute");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   275
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   276
            BootstrapMethods_attribute.BootstrapMethodSpecifier bsm_spec =
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   277
                    bsm_attr.bootstrap_method_specifiers[0];
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   278
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   279
            if (bsm_spec.bootstrap_arguments.length != MF_ARITY) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   280
                throw new Error("Bad number of static invokedynamic args " +
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   281
                        "in BootstrapMethod attribute");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   282
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   283
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   284
            CONSTANT_MethodHandle_info mh =
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   285
                    (CONSTANT_MethodHandle_info)cf.constant_pool.get(bsm_spec.bootstrap_arguments[1]);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   286
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   287
            boolean kindOK;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   288
            switch (mh.reference_kind) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   289
                case REF_invokeStatic: kindOK = mk2.isStatic(); break;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   290
                case REF_invokeSpecial: kindOK = !mk2.isStatic(); break;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   291
                case REF_invokeInterface: kindOK = mk2.inInterface(); break;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   292
                default:
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   293
                    kindOK = false;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   294
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   295
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   296
            if (!kindOK) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   297
                throw new Error("Bad invoke kind in implementation method handle");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   298
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   299
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   300
            if (!mh.getCPRefInfo().getNameAndTypeInfo().getType().toString().equals(MH_SIG)) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   301
                throw new Error("Type mismatch in implementation method handle");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   302
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   303
        } catch (Exception e) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   304
            e.printStackTrace();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   305
            throw new Error("error reading " + compiledTest +": " + e);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   306
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   307
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   308
    String makeIndyType(int id) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   309
        StringBuilder buf = new StringBuilder();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   310
        buf.append("(");
17575
7693e6ff0d7d 8012556: Implement lambda methods on interfaces as static
rfield
parents: 16564
diff changeset
   311
        if (!mk2.isStatic()) {
16564
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   312
            buf.append(String.format("LTest%d;", id));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   313
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   314
        buf.append(")Ljava/lang/Runnable;");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   315
        return buf.toString();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   316
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   317
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   318
    static final int MF_ARITY = 3;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   319
    static final String MH_SIG = "()V";
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   320
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   321
    class JavaSource extends SimpleJavaFileObject {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   322
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   323
        static final String source_template =
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   324
                "#CK Test#ID {\n" +
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   325
                "   #MOD1 void test() { #EK }\n" +
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   326
                "   #MOD2 void target() { }\n" +
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   327
                "}\n";
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   328
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   329
        String source;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   330
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   331
        JavaSource(int id) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   332
            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   333
            source = source_template.replace("#CK", mk1.ck.classStr)
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   334
                    .replace("#MOD1", mk1.mods())
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   335
                    .replace("#MOD2", mk2.mods())
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   336
                    .replace("#EK", ek.exprString)
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   337
                    .replace("#ID", String.valueOf(id));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   338
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   339
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   340
        @Override
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   341
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   342
            return source;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   343
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   344
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   345
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   346
    static class DiagChecker
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   347
        implements javax.tools.DiagnosticListener<JavaFileObject> {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   348
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   349
        boolean diagFound;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   350
        ArrayList<String> diags = new ArrayList<>();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   351
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   352
        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   353
            diags.add(diagnostic.getMessage(Locale.getDefault()));
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   354
            diagFound = true;
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   355
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   356
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   357
        String printDiags() {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   358
            StringBuilder buf = new StringBuilder();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   359
            for (String s : diags) {
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   360
                buf.append(s);
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   361
                buf.append("\n");
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   362
            }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   363
            return buf.toString();
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   364
        }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   365
    }
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   366
061aa10703e8 8009649: Lambda back-end should generate invokespecial for method handles referring to private instance methods
mcimadamore
parents:
diff changeset
   367
}