langtools/test/tools/javac/lambda/TestInvokeDynamic.java
author vromero
Wed, 23 Jan 2013 20:57:40 +0000
changeset 15384 5a8d00abf076
parent 15040 99fd9483d3f0
child 16807 b442b47d3ae9
permissions -rw-r--r--
8006694: temporarily workaround combo tests are causing time out in several platforms Reviewed-by: jjg Contributed-by: maurizio.cimadamore@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     1
/*
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
     2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     4
 *
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     8
 *
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    13
 * accompanied this code).
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    14
 *
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    18
 *
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    21
 * questions.
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    22
 */
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    23
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    24
/*
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    25
 * @test
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    26
 * @bug 7194586
15384
5a8d00abf076 8006694: temporarily workaround combo tests are causing time out in several platforms
vromero
parents: 15040
diff changeset
    27
 * @bug 8003280 8006694
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14053
diff changeset
    28
 * @summary Add lambda tests
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14053
diff changeset
    29
 *  Add back-end support for invokedynamic
15384
5a8d00abf076 8006694: temporarily workaround combo tests are causing time out in several platforms
vromero
parents: 15040
diff changeset
    30
 *  temporarily workaround combo tests are causing time out in several platforms
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    31
 * @library ../lib
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    32
 * @build JavacTestingAbstractThreadedTest
15384
5a8d00abf076 8006694: temporarily workaround combo tests are causing time out in several platforms
vromero
parents: 15040
diff changeset
    33
 * @run main/othervm TestInvokeDynamic
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    34
 */
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    35
15384
5a8d00abf076 8006694: temporarily workaround combo tests are causing time out in several platforms
vromero
parents: 15040
diff changeset
    36
// use /othervm to avoid jtreg timeout issues (CODETOOLS-7900047)
5a8d00abf076 8006694: temporarily workaround combo tests are causing time out in several platforms
vromero
parents: 15040
diff changeset
    37
// see JDK-8006746
5a8d00abf076 8006694: temporarily workaround combo tests are causing time out in several platforms
vromero
parents: 15040
diff changeset
    38
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    39
import com.sun.source.tree.MethodInvocationTree;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    40
import com.sun.source.tree.MethodTree;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    41
import com.sun.source.util.TaskEvent;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    42
import com.sun.source.util.TaskListener;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    43
import com.sun.source.util.TreeScanner;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    44
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    45
import com.sun.tools.classfile.Attribute;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    46
import com.sun.tools.classfile.BootstrapMethods_attribute;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    47
import com.sun.tools.classfile.ClassFile;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    48
import com.sun.tools.classfile.Code_attribute;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    49
import com.sun.tools.classfile.ConstantPool.*;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    50
import com.sun.tools.classfile.Instruction;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    51
import com.sun.tools.classfile.Method;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    52
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    53
import com.sun.tools.javac.api.JavacTaskImpl;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    54
import com.sun.tools.javac.code.Symbol;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    55
import com.sun.tools.javac.code.Symbol.MethodSymbol;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    56
import com.sun.tools.javac.code.Symtab;
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
    57
import com.sun.tools.javac.code.Types;
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    58
import com.sun.tools.javac.jvm.Pool;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    59
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    60
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    61
import com.sun.tools.javac.tree.JCTree.JCIdent;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    62
import com.sun.tools.javac.util.Context;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    63
import com.sun.tools.javac.util.Names;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    64
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    65
import java.io.File;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    66
import java.net.URI;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    67
import java.util.ArrayList;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    68
import java.util.Arrays;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    69
import java.util.Locale;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    70
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    71
import javax.tools.Diagnostic;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    72
import javax.tools.JavaFileObject;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    73
import javax.tools.SimpleJavaFileObject;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    74
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    75
import static com.sun.tools.javac.jvm.ClassFile.*;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    76
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    77
public class TestInvokeDynamic
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    78
    extends JavacTestingAbstractThreadedTest
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    79
    implements Runnable {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    80
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    81
    enum StaticArgumentKind {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    82
        STRING("Hello!", "String", "Ljava/lang/String;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    83
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    84
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    85
                return (cpInfo instanceof CONSTANT_String_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    86
                        ((CONSTANT_String_info)cpInfo).getString()
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    87
                        .equals(value);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    88
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    89
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    90
        CLASS(null, "Class<?>", "Ljava/lang/Class;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    91
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    92
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    93
                return (cpInfo instanceof CONSTANT_Class_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    94
                        ((CONSTANT_Class_info)cpInfo).getName()
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
    95
                        .equals("java/lang/String");
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    96
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    97
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    98
        INTEGER(1, "int", "I") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    99
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   100
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   101
                return (cpInfo instanceof CONSTANT_Integer_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   102
                        ((CONSTANT_Integer_info)cpInfo).value ==
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   103
                        ((Integer)value).intValue();
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   104
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   105
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   106
        LONG(1L, "long", "J") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   107
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   108
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   109
                return (cpInfo instanceof CONSTANT_Long_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   110
                        ((CONSTANT_Long_info)cpInfo).value ==
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   111
                        ((Long)value).longValue();
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   112
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   113
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   114
        FLOAT(1.0f, "float", "F") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   115
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   116
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   117
                return (cpInfo instanceof CONSTANT_Float_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   118
                        ((CONSTANT_Float_info)cpInfo).value ==
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   119
                        ((Float)value).floatValue();
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   120
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   121
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   122
        DOUBLE(1.0, "double","D") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   123
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   124
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   125
                return (cpInfo instanceof CONSTANT_Double_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   126
                        ((CONSTANT_Double_info)cpInfo).value ==
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   127
                        ((Double)value).doubleValue();
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   128
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   129
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   130
        METHOD_HANDLE(null, "MethodHandle", "Ljava/lang/invoke/MethodHandle;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   131
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   132
            boolean check(CPInfo cpInfo) throws Exception {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   133
                if (!(cpInfo instanceof CONSTANT_MethodHandle_info))
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   134
                    return false;
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   135
                CONSTANT_MethodHandle_info handleInfo =
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   136
                        (CONSTANT_MethodHandle_info)cpInfo;
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   137
                return handleInfo.getCPRefInfo().getClassName().equals("Array") &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   138
                        handleInfo.reference_kind == RefKind.REF_invokeVirtual &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   139
                        handleInfo.getCPRefInfo()
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   140
                        .getNameAndTypeInfo().getName().equals("clone") &&
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   141
                        handleInfo.getCPRefInfo()
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   142
                        .getNameAndTypeInfo().getType().equals("()Ljava/lang/Object;");
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   143
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   144
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   145
        METHOD_TYPE(null, "MethodType", "Ljava/lang/invoke/MethodType;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   146
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   147
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   148
                return (cpInfo instanceof CONSTANT_MethodType_info) &&
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   149
                        ((CONSTANT_MethodType_info)cpInfo).getType()
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   150
                        .equals("()Ljava/lang/Object;");
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   151
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   152
        };
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   153
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   154
        Object value;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   155
        String sourceTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   156
        String bytecodeTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   157
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   158
        StaticArgumentKind(Object value, String sourceTypeStr,
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   159
                String bytecodeTypeStr) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   160
            this.value = value;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   161
            this.sourceTypeStr = sourceTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   162
            this.bytecodeTypeStr = bytecodeTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   163
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   164
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   165
        abstract boolean check(CPInfo cpInfo) throws Exception;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   166
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   167
        Object getValue(Symtab syms, Names names, Types types) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   168
            switch (this) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   169
                case STRING:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   170
                case INTEGER:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   171
                case LONG:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   172
                case FLOAT:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   173
                case DOUBLE:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   174
                    return value;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   175
                case CLASS:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   176
                    return syms.stringType.tsym;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   177
                case METHOD_HANDLE:
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   178
                    return new Pool.MethodHandle(REF_invokeVirtual,
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   179
                            syms.arrayCloneMethod, types);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   180
                case METHOD_TYPE:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   181
                    return syms.arrayCloneMethod.type;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   182
                default:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   183
                    throw new AssertionError();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   184
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   185
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   186
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   187
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   188
    enum StaticArgumentsArity {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   189
        ZERO(0),
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   190
        ONE(1),
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   191
        TWO(2),
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   192
        THREE(3);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   193
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   194
        int arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   195
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   196
        StaticArgumentsArity(int arity) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   197
            this.arity = arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   198
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   199
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   200
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   201
    public static void main(String... args) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   202
        for (StaticArgumentsArity arity : StaticArgumentsArity.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   203
            if (arity.arity == 0) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   204
                pool.execute(new TestInvokeDynamic(arity));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   205
            } else {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   206
                for (StaticArgumentKind sak1 : StaticArgumentKind.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   207
                    if (arity.arity == 1) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   208
                        pool.execute(new TestInvokeDynamic(arity, sak1));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   209
                    } else {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   210
                        for (StaticArgumentKind sak2 : StaticArgumentKind.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   211
                            if (arity.arity == 2) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   212
                                pool.execute(new TestInvokeDynamic(arity, sak1, sak2));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   213
                            } else {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   214
                                for (StaticArgumentKind sak3 : StaticArgumentKind.values()) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   215
                                    pool.execute(
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   216
                                        new TestInvokeDynamic(arity, sak1, sak2, sak3));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   217
                                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   218
                            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   219
                        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   220
                    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   221
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   222
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   223
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   224
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   225
        checkAfterExec();
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   226
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   227
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   228
    StaticArgumentsArity arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   229
    StaticArgumentKind[] saks;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   230
    DiagChecker dc;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   231
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   232
    TestInvokeDynamic(StaticArgumentsArity arity, StaticArgumentKind... saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   233
        this.arity = arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   234
        this.saks = saks;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   235
        dc = new DiagChecker();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   236
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   237
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   238
    public void run() {
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   239
        int id = checkCount.incrementAndGet();
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   240
        JavaSource source = new JavaSource(id);
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   241
        JavacTaskImpl ct = (JavacTaskImpl)comp.getTask(null, fm.get(), dc,
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   242
                null, null, Arrays.asList(source));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   243
        Context context = ct.getContext();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   244
        Symtab syms = Symtab.instance(context);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   245
        Names names = Names.instance(context);
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   246
        Types types = Types.instance(context);
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   247
        ct.addTaskListener(new Indifier(syms, names, types));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   248
        try {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   249
            ct.generate();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   250
        } catch (Throwable t) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   251
            t.printStackTrace();
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   252
            throw new AssertionError(
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   253
                    String.format("Error thrown when compiling following code\n%s",
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   254
                    source.source));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   255
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   256
        if (dc.diagFound) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   257
            throw new AssertionError(
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   258
                    String.format("Diags found when compiling following code\n%s\n\n%s",
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   259
                    source.source, dc.printDiags()));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   260
        }
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   261
        verifyBytecode(id);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   262
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   263
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   264
    void verifyBytecode(int id) {
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   265
        File compiledTest = new File(String.format("Test%d.class", id));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   266
        try {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   267
            ClassFile cf = ClassFile.read(compiledTest);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   268
            Method testMethod = null;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   269
            for (Method m : cf.methods) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   270
                if (m.getName(cf.constant_pool).equals("test")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   271
                    testMethod = m;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   272
                    break;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   273
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   274
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   275
            if (testMethod == null) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   276
                throw new Error("Test method not found");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   277
            }
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   278
            Code_attribute ea =
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   279
                    (Code_attribute)testMethod.attributes.get(Attribute.Code);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   280
            if (testMethod == null) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   281
                throw new Error("Code attribute for test() method not found");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   282
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   283
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   284
            int bsmIdx = -1;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   285
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   286
            for (Instruction i : ea.getInstructions()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   287
                if (i.getMnemonic().equals("invokedynamic")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   288
                    CONSTANT_InvokeDynamic_info indyInfo =
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   289
                         (CONSTANT_InvokeDynamic_info)cf
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   290
                            .constant_pool.get(i.getShort(1));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   291
                    bsmIdx = indyInfo.bootstrap_method_attr_index;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   292
                    if (!indyInfo.getNameAndTypeInfo().getType().equals("()V")) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   293
                        throw new
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   294
                            AssertionError("type mismatch for CONSTANT_InvokeDynamic_info");
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   295
                    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   296
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   297
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   298
            if (bsmIdx == -1) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   299
                throw new Error("Missing invokedynamic in generated code");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   300
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   301
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   302
            BootstrapMethods_attribute bsm_attr =
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   303
                    (BootstrapMethods_attribute)cf
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   304
                    .getAttribute(Attribute.BootstrapMethods);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   305
            if (bsm_attr.bootstrap_method_specifiers.length != 1) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   306
                throw new Error("Bad number of method specifiers " +
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   307
                        "in BootstrapMethods attribute");
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   308
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   309
            BootstrapMethods_attribute.BootstrapMethodSpecifier bsm_spec =
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   310
                    bsm_attr.bootstrap_method_specifiers[0];
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   311
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   312
            if (bsm_spec.bootstrap_arguments.length != arity.arity) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   313
                throw new Error("Bad number of static invokedynamic args " +
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   314
                        "in BootstrapMethod attribute");
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   315
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   316
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   317
            int count = 0;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   318
            for (StaticArgumentKind sak : saks) {
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   319
                if (!sak.check(cf.constant_pool
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   320
                        .get(bsm_spec.bootstrap_arguments[count]))) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   321
                    throw new Error("Bad static argument value " + sak);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   322
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   323
                count++;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   324
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   325
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   326
            CONSTANT_MethodHandle_info bsm_handle =
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   327
                    (CONSTANT_MethodHandle_info)cf.constant_pool
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   328
                    .get(bsm_spec.bootstrap_method_ref);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   329
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   330
            if (bsm_handle.reference_kind != RefKind.REF_invokeStatic) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   331
                throw new Error("Bad kind on boostrap method handle");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   332
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   333
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   334
            CONSTANT_Methodref_info bsm_ref =
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   335
                    (CONSTANT_Methodref_info)cf.constant_pool
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   336
                    .get(bsm_handle.reference_index);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   337
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   338
            if (!bsm_ref.getClassInfo().getName().equals("Bootstrap")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   339
                throw new Error("Bad owner of boostrap method");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   340
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   341
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   342
            if (!bsm_ref.getNameAndTypeInfo().getName().equals("bsm")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   343
                throw new Error("Bad boostrap method name");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   344
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   345
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   346
            if (!bsm_ref.getNameAndTypeInfo()
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   347
                    .getType().equals(asBSMSignatureString())) {
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   348
                throw new Error("Bad boostrap method type" +
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   349
                        bsm_ref.getNameAndTypeInfo().getType() + " " +
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   350
                        asBSMSignatureString());
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   351
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   352
        } catch (Exception e) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   353
            e.printStackTrace();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   354
            throw new Error("error reading " + compiledTest +": " + e);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   355
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   356
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   357
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   358
    String asBSMSignatureString() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   359
        StringBuilder buf = new StringBuilder();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   360
        buf.append("(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   361
        for (StaticArgumentKind sak : saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   362
            buf.append(sak.bytecodeTypeStr);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   363
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   364
        buf.append(")Ljava/lang/invoke/CallSite;");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   365
        return buf.toString();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   366
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   367
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   368
    class JavaSource extends SimpleJavaFileObject {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   369
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   370
        static final String source_template = "import java.lang.invoke.*;\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   371
                "class Bootstrap {\n" +
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   372
                "   public static CallSite bsm(MethodHandles.Lookup lookup, " +
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   373
                "String name, MethodType methodType #SARGS) {\n" +
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   374
                "       return null;\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   375
                "   }\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   376
                "}\n" +
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   377
                "class Test#ID {\n" +
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   378
                "   void m() { }\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   379
                "   void test() { m(); }\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   380
                "}";
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   381
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   382
        String source;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   383
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   384
        JavaSource(int id) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   385
            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   386
            source = source_template.replace("#SARGS", asSignatureString())
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   387
                    .replace("#ID", String.valueOf(id));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   388
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   389
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   390
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   391
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   392
            return source;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   393
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   394
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   395
        String asSignatureString() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   396
            int count = 0;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   397
            StringBuilder buf = new StringBuilder();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   398
            for (StaticArgumentKind sak : saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   399
                buf.append(",");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   400
                buf.append(sak.sourceTypeStr);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   401
                buf.append(' ');
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   402
                buf.append(String.format("x%d", count++));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   403
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   404
            return buf.toString();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   405
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   406
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   407
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   408
    class Indifier extends TreeScanner<Void, Void> implements TaskListener {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   409
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   410
        MethodSymbol bsm;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   411
        Symtab syms;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   412
        Names names;
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   413
        Types types;
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   414
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   415
        Indifier(Symtab syms, Names names, Types types) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   416
            this.syms = syms;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   417
            this.names = names;
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   418
            this.types = types;
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   419
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   420
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   421
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   422
        public void started(TaskEvent e) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   423
            //do nothing
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   424
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   425
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   426
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   427
        public void finished(TaskEvent e) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   428
            if (e.getKind() == TaskEvent.Kind.ANALYZE) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   429
                scan(e.getCompilationUnit(), null);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   430
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   431
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   432
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   433
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   434
        public Void visitMethodInvocation(MethodInvocationTree node, Void p) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   435
            super.visitMethodInvocation(node, p);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   436
            JCMethodInvocation apply = (JCMethodInvocation)node;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   437
            JCIdent ident = (JCIdent)apply.meth;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   438
            Symbol oldSym = ident.sym;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   439
            if (!oldSym.isConstructor()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   440
                Object[] staticArgs = new Object[arity.arity];
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   441
                for (int i = 0; i < arity.arity ; i++) {
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   442
                    staticArgs[i] = saks[i].getValue(syms, names, types);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   443
                }
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   444
                ident.sym = new Symbol.DynamicMethodSymbol(oldSym.name,
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   445
                        oldSym.owner, REF_invokeStatic, bsm, oldSym.type, staticArgs);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   446
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   447
            return null;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   448
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   449
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   450
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   451
        public Void visitMethod(MethodTree node, Void p) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   452
            super.visitMethod(node, p);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   453
            if (node.getName().toString().equals("bsm")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   454
                bsm = ((JCMethodDecl)node).sym;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   455
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   456
            return null;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   457
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   458
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   459
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   460
    static class DiagChecker
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   461
        implements javax.tools.DiagnosticListener<JavaFileObject> {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   462
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   463
        boolean diagFound;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   464
        ArrayList<String> diags = new ArrayList<>();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   465
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   466
        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   467
            diags.add(diagnostic.getMessage(Locale.getDefault()));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   468
            diagFound = true;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   469
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   470
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   471
        String printDiags() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   472
            StringBuilder buf = new StringBuilder();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   473
            for (String s : diags) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   474
                buf.append(s);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   475
                buf.append("\n");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   476
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   477
            return buf.toString();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   478
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   479
    }
15040
99fd9483d3f0 8005167: execution time of combo tests in javac should be improved
vromero
parents: 14949
diff changeset
   480
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   481
}