langtools/test/tools/javac/lambda/TestInvokeDynamic.java
author vromero
Sat, 15 Dec 2012 13:54:51 +0000
changeset 14949 45f43822bbde
parent 14547 86d8d242b0c4
child 15040 99fd9483d3f0
permissions -rw-r--r--
8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java Reviewed-by: jjg, mcimadamore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     1
/*
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    27
 *
14547
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14053
diff changeset
    28
 * @bug 8003280
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14053
diff changeset
    29
 * @summary Add lambda tests
86d8d242b0c4 8003280: Add lambda tests
mcimadamore
parents: 14053
diff changeset
    30
 *  Add back-end support for invokedynamic
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    31
 *
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    32
 */
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    33
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    34
import com.sun.source.tree.MethodInvocationTree;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    35
import com.sun.source.tree.MethodTree;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    36
import com.sun.source.util.TaskEvent;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    37
import com.sun.source.util.TaskListener;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    38
import com.sun.source.util.TreeScanner;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    39
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    40
import com.sun.tools.classfile.Attribute;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    41
import com.sun.tools.classfile.BootstrapMethods_attribute;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    42
import com.sun.tools.classfile.ClassFile;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    43
import com.sun.tools.classfile.Code_attribute;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    44
import com.sun.tools.classfile.ConstantPool.*;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    45
import com.sun.tools.classfile.Instruction;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    46
import com.sun.tools.classfile.Method;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    47
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    48
import com.sun.tools.javac.api.JavacTaskImpl;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    49
import com.sun.tools.javac.api.JavacTool;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    50
import com.sun.tools.javac.code.Symbol;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    51
import com.sun.tools.javac.code.Symbol.MethodSymbol;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    52
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
    53
import com.sun.tools.javac.code.Types;
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    54
import com.sun.tools.javac.jvm.Pool;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    55
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    56
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    57
import com.sun.tools.javac.tree.JCTree.JCIdent;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    58
import com.sun.tools.javac.util.Context;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    59
import com.sun.tools.javac.util.Names;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    60
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    61
import java.io.File;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    62
import java.net.URI;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    63
import java.util.ArrayList;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    64
import java.util.Arrays;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    65
import java.util.Locale;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    66
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    67
import javax.tools.Diagnostic;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    68
import javax.tools.JavaCompiler;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    69
import javax.tools.JavaFileManager;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    70
import javax.tools.JavaFileObject;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    71
import javax.tools.SimpleJavaFileObject;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    72
import javax.tools.StandardJavaFileManager;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    73
import javax.tools.ToolProvider;
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    77
public class TestInvokeDynamic {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    78
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    79
    static int checkCount = 0;
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) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    86
                        ((CONSTANT_String_info)cpInfo).getString().equals(value);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    87
            }
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
        CLASS(null, "Class<?>", "Ljava/lang/Class;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    90
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    91
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    92
                return (cpInfo instanceof CONSTANT_Class_info) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    93
                        ((CONSTANT_Class_info)cpInfo).getName().equals("java/lang/String");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    94
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    95
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    96
        INTEGER(1, "int", "I") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    97
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    98
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
    99
                return (cpInfo instanceof CONSTANT_Integer_info) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   100
                        ((CONSTANT_Integer_info)cpInfo).value == ((Integer)value).intValue();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   101
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   102
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   103
        LONG(1L, "long", "J") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   104
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   105
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   106
                return (cpInfo instanceof CONSTANT_Long_info) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   107
                        ((CONSTANT_Long_info)cpInfo).value == ((Long)value).longValue();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   108
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   109
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   110
        FLOAT(1.0f, "float", "F") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   111
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   112
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   113
                return (cpInfo instanceof CONSTANT_Float_info) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   114
                        ((CONSTANT_Float_info)cpInfo).value == ((Float)value).floatValue();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   115
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   116
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   117
        DOUBLE(1.0, "double","D") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   118
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   119
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   120
                return (cpInfo instanceof CONSTANT_Double_info) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   121
                        ((CONSTANT_Double_info)cpInfo).value == ((Double)value).doubleValue();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   122
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   123
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   124
        METHOD_HANDLE(null, "MethodHandle", "Ljava/lang/invoke/MethodHandle;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   125
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   126
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   127
                if (!(cpInfo instanceof CONSTANT_MethodHandle_info)) return false;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   128
                CONSTANT_MethodHandle_info handleInfo = (CONSTANT_MethodHandle_info)cpInfo;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   129
                return handleInfo.getCPRefInfo().getClassName().equals("Array") &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   130
                        handleInfo.reference_kind == RefKind.REF_invokeVirtual &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   131
                        handleInfo.getCPRefInfo().getNameAndTypeInfo().getName().equals("clone") &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   132
                        handleInfo.getCPRefInfo().getNameAndTypeInfo().getType().equals("()Ljava/lang/Object;");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   133
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   134
        },
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   135
        METHOD_TYPE(null, "MethodType", "Ljava/lang/invoke/MethodType;") {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   136
            @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   137
            boolean check(CPInfo cpInfo) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   138
                return (cpInfo instanceof CONSTANT_MethodType_info) &&
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   139
                        ((CONSTANT_MethodType_info)cpInfo).getType().equals("()Ljava/lang/Object;");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   140
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   141
        };
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   142
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   143
        Object value;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   144
        String sourceTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   145
        String bytecodeTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   146
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   147
        StaticArgumentKind(Object value, String sourceTypeStr, String bytecodeTypeStr) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   148
            this.value = value;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   149
            this.sourceTypeStr = sourceTypeStr;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   150
            this.bytecodeTypeStr = bytecodeTypeStr;
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
        abstract boolean check(CPInfo cpInfo) throws Exception;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   154
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   155
        Object getValue(Symtab syms, Names names, Types types) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   156
            switch (this) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   157
                case STRING:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   158
                case INTEGER:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   159
                case LONG:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   160
                case FLOAT:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   161
                case DOUBLE:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   162
                    return value;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   163
                case CLASS:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   164
                    return syms.stringType.tsym;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   165
                case METHOD_HANDLE:
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   166
                    return new Pool.MethodHandle(REF_invokeVirtual, syms.arrayCloneMethod, types);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   167
                case METHOD_TYPE:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   168
                    return syms.arrayCloneMethod.type;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   169
                default:
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   170
                    throw new AssertionError();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   171
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   172
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   173
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   174
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   175
    enum StaticArgumentsArity {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   176
        ZERO(0),
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   177
        ONE(1),
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   178
        TWO(2),
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   179
        THREE(3);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   180
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   181
        int arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   182
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   183
        StaticArgumentsArity(int arity) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   184
            this.arity = arity;
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
    public static void main(String... args) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   189
        // Create a single file manager and compiler and reuse it for each compile to save time.
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   190
        StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   191
        final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   192
        for (StaticArgumentsArity arity : StaticArgumentsArity.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   193
            if (arity.arity == 0) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   194
                new TestInvokeDynamic(arity).compileAndCheck(fm, tool);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   195
            } else {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   196
                for (StaticArgumentKind sak1 : StaticArgumentKind.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   197
                    if (arity.arity == 1) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   198
                        new TestInvokeDynamic(arity, sak1).compileAndCheck(fm, tool);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   199
                    } else {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   200
                        for (StaticArgumentKind sak2 : StaticArgumentKind.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   201
                            if (arity.arity == 2) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   202
                                new TestInvokeDynamic(arity, sak1, sak2).compileAndCheck(fm, tool);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   203
                            } else {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   204
                                for (StaticArgumentKind sak3 : StaticArgumentKind.values()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   205
                                    new TestInvokeDynamic(arity, sak1, sak2, sak3).compileAndCheck(fm, tool);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   206
                                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   207
                            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   208
                        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   209
                    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   210
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   211
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   212
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   213
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   214
        System.out.println("Total checks made: " + checkCount);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   215
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   216
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   217
    StaticArgumentsArity arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   218
    StaticArgumentKind[] saks;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   219
    JavaSource source;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   220
    DiagChecker dc;
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
    TestInvokeDynamic(StaticArgumentsArity arity, StaticArgumentKind... saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   223
        this.arity = arity;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   224
        this.saks = saks;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   225
        source = new JavaSource();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   226
        dc = new DiagChecker();
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   229
    void compileAndCheck(JavaFileManager fm, JavaCompiler tool) throws Exception {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   230
        JavacTaskImpl ct = (JavacTaskImpl)tool.getTask(null, fm, dc,
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   231
                null, null, Arrays.asList(source));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   232
        Context context = ct.getContext();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   233
        Symtab syms = Symtab.instance(context);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   234
        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
   235
        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
   236
        ct.addTaskListener(new Indifier(syms, names, types));
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   237
        try {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   238
            ct.generate();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   239
        } catch (Throwable t) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   240
            t.printStackTrace();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   241
            throw new AssertionError(String.format("Error thrown when compiling following code\n%s", source.source));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   242
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   243
        if (dc.diagFound) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   244
            throw new AssertionError(String.format("Diags found when compiling following code\n%s\n\n%s", source.source, dc.printDiags()));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   245
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   246
        verifyBytecode();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   247
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   248
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   249
    void verifyBytecode() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   250
        File compiledTest = new File("Test.class");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   251
        try {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   252
            ClassFile cf = ClassFile.read(compiledTest);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   253
            Method testMethod = null;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   254
            for (Method m : cf.methods) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   255
                if (m.getName(cf.constant_pool).equals("test")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   256
                    testMethod = m;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   257
                    break;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   258
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   259
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   260
            if (testMethod == null) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   261
                throw new Error("Test method not found");
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
            Code_attribute ea = (Code_attribute)testMethod.attributes.get(Attribute.Code);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   264
            if (testMethod == null) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   265
                throw new Error("Code attribute for test() method not found");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   266
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   267
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   268
            int bsmIdx = -1;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   269
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   270
            for (Instruction i : ea.getInstructions()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   271
                if (i.getMnemonic().equals("invokedynamic")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   272
                    CONSTANT_InvokeDynamic_info indyInfo =
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   273
                            (CONSTANT_InvokeDynamic_info)cf.constant_pool.get(i.getShort(1));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   274
                    bsmIdx = indyInfo.bootstrap_method_attr_index;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   275
                    if (!indyInfo.getNameAndTypeInfo().getType().equals("()V")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   276
                        throw new AssertionError("type mismatch for CONSTANT_InvokeDynamic_info");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   277
                    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   278
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   279
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   280
            if (bsmIdx == -1) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   281
                throw new Error("Missing invokedynamic in generated code");
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
            BootstrapMethods_attribute bsm_attr = (BootstrapMethods_attribute)cf.getAttribute(Attribute.BootstrapMethods);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   285
            if (bsm_attr.bootstrap_method_specifiers.length != 1) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   286
                throw new Error("Bad number of method specifiers in BootstrapMethods attribute");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   287
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   288
            BootstrapMethods_attribute.BootstrapMethodSpecifier bsm_spec =
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   289
                    bsm_attr.bootstrap_method_specifiers[0];
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   290
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   291
            if (bsm_spec.bootstrap_arguments.length != arity.arity) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   292
                throw new Error("Bad number of static invokedynamic args in BootstrapMethod attribute");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   293
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   294
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   295
            int count = 0;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   296
            for (StaticArgumentKind sak : saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   297
                if (!sak.check(cf.constant_pool.get(bsm_spec.bootstrap_arguments[count]))) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   298
                    throw new Error("Bad static argument value " + sak);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   299
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   300
                count++;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   301
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   302
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   303
            CONSTANT_MethodHandle_info bsm_handle =
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   304
                    (CONSTANT_MethodHandle_info)cf.constant_pool.get(bsm_spec.bootstrap_method_ref);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   305
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   306
            if (bsm_handle.reference_kind != RefKind.REF_invokeStatic) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   307
                throw new Error("Bad kind on boostrap method handle");
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   310
            CONSTANT_Methodref_info bsm_ref =
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   311
                    (CONSTANT_Methodref_info)cf.constant_pool.get(bsm_handle.reference_index);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   312
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   313
            if (!bsm_ref.getClassInfo().getName().equals("Bootstrap")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   314
                throw new Error("Bad owner of boostrap method");
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
            if (!bsm_ref.getNameAndTypeInfo().getName().equals("bsm")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   318
                throw new Error("Bad boostrap method name");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   319
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   320
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   321
            if (!bsm_ref.getNameAndTypeInfo().getType().equals(asBSMSignatureString())) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   322
                throw new Error("Bad boostrap method type" + bsm_ref.getNameAndTypeInfo().getType() + " " + asBSMSignatureString());
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   323
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   324
        } catch (Exception e) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   325
            e.printStackTrace();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   326
            throw new Error("error reading " + compiledTest +": " + e);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   327
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   328
    }
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
    String asBSMSignatureString() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   331
        StringBuilder buf = new StringBuilder();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   332
        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
   333
        for (StaticArgumentKind sak : saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   334
            buf.append(sak.bytecodeTypeStr);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   335
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   336
        buf.append(")Ljava/lang/invoke/CallSite;");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   337
        return buf.toString();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   338
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   339
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   340
    class JavaSource extends SimpleJavaFileObject {
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
        static final String source_template = "import java.lang.invoke.*;\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   343
                "class Bootstrap {\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   344
                "   public static CallSite bsm(MethodHandles.Lookup lookup, String name, MethodType methodType #SARGS) {\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   345
                "       return null;\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   346
                "   }\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   347
                "}\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   348
                "class Test {\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   349
                "   void m() { }\n" +
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   350
                "   void test() { m(); }\n" +
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   353
        String source;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   354
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   355
        JavaSource() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   356
            super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   357
            source = source_template.replace("#SARGS", asSignatureString());
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   358
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   359
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   360
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   361
        public CharSequence getCharContent(boolean ignoreEncodingErrors) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   362
            return source;
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   365
        String asSignatureString() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   366
            int count = 0;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   367
            StringBuilder buf = new StringBuilder();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   368
            for (StaticArgumentKind sak : saks) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   369
                buf.append(",");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   370
                buf.append(sak.sourceTypeStr);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   371
                buf.append(' ');
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   372
                buf.append(String.format("x%d", count++));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   373
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   374
            return buf.toString();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   375
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   376
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   377
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   378
    class Indifier extends TreeScanner<Void, Void> implements TaskListener {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   379
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   380
        MethodSymbol bsm;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   381
        Symtab syms;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   382
        Names names;
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   383
        Types types;
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   384
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   385
        Indifier(Symtab syms, Names names, Types types) {
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   386
            this.syms = syms;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   387
            this.names = names;
14949
45f43822bbde 8000518: Javac generates duplicate name_and_type constant pool entry for class BinaryOpValueExp.java
vromero
parents: 14547
diff changeset
   388
            this.types = types;
14046
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   391
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   392
        public void started(TaskEvent e) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   393
            //do nothing
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
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   396
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   397
        public void finished(TaskEvent e) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   398
            if (e.getKind() == TaskEvent.Kind.ANALYZE) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   399
                scan(e.getCompilationUnit(), null);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   400
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   401
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   402
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   403
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   404
        public Void visitMethodInvocation(MethodInvocationTree node, Void p) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   405
            super.visitMethodInvocation(node, p);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   406
            JCMethodInvocation apply = (JCMethodInvocation)node;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   407
            JCIdent ident = (JCIdent)apply.meth;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   408
            Symbol oldSym = ident.sym;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   409
            if (!oldSym.isConstructor()) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   410
                Object[] staticArgs = new Object[arity.arity];
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   411
                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
   412
                    staticArgs[i] = saks[i].getValue(syms, names, types);
14046
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   413
                }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   414
                ident.sym = new Symbol.DynamicMethodSymbol(oldSym.name, oldSym.owner, REF_invokeStatic, bsm, oldSym.type, staticArgs);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   415
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   416
            return null;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   417
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   418
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   419
        @Override
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   420
        public Void visitMethod(MethodTree node, Void p) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   421
            super.visitMethod(node, p);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   422
            if (node.getName().toString().equals("bsm")) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   423
                bsm = ((JCMethodDecl)node).sym;
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
            return null;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   426
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   427
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   428
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   429
    static class DiagChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
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
        boolean diagFound;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   432
        ArrayList<String> diags = new ArrayList<>();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   433
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   434
        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   435
            diags.add(diagnostic.getMessage(Locale.getDefault()));
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   436
            diagFound = true;
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   437
        }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   438
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   439
        String printDiags() {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   440
            StringBuilder buf = new StringBuilder();
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   441
            for (String s : diags) {
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   442
                buf.append(s);
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   443
                buf.append("\n");
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   444
            }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   445
            return buf.toString();
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
    }
8ef5d5b19998 7194586: Add back-end support for invokedynamic
mcimadamore
parents:
diff changeset
   448
}