src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ArgumentAttr.java
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 57963 ed7eb20871c5
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     1
/*
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
     2
 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     4
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    10
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    15
 * accompanied this code).
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    16
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    20
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    23
 * questions.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    24
 */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    25
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    26
package com.sun.tools.javac.comp;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    27
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    28
import com.sun.tools.javac.code.Flags;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    29
import com.sun.tools.javac.code.Symbol;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    30
import com.sun.tools.javac.code.Symtab;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    31
import com.sun.tools.javac.code.Type;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    32
import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    33
import com.sun.tools.javac.comp.Attr.ResultInfo;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    34
import com.sun.tools.javac.comp.Attr.TargetInfo;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    35
import com.sun.tools.javac.comp.Check.CheckContext;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    36
import com.sun.tools.javac.comp.DeferredAttr.AttrMode;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    37
import com.sun.tools.javac.comp.DeferredAttr.DeferredAttrContext;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    38
import com.sun.tools.javac.comp.DeferredAttr.DeferredType;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    39
import com.sun.tools.javac.comp.DeferredAttr.DeferredTypeCompleter;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    40
import com.sun.tools.javac.comp.DeferredAttr.LambdaReturnScanner;
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
    41
import com.sun.tools.javac.comp.DeferredAttr.SwitchExpressionScanner;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    42
import com.sun.tools.javac.comp.Infer.PartiallyInferredMethodType;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    43
import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase;
45504
ea7475564d07 8170326: Inconsistencies between code, compiler.properties and comments
jlahoda
parents: 45498
diff changeset
    44
import com.sun.tools.javac.resources.CompilerProperties.Fragments;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    45
import com.sun.tools.javac.tree.JCTree;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    46
import com.sun.tools.javac.tree.JCTree.JCConditional;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    47
import com.sun.tools.javac.tree.JCTree.JCExpression;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    48
import com.sun.tools.javac.tree.JCTree.JCLambda;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    49
import com.sun.tools.javac.tree.JCTree.JCLambda.ParameterKind;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    50
import com.sun.tools.javac.tree.JCTree.JCMemberReference;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    51
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    52
import com.sun.tools.javac.tree.JCTree.JCNewClass;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    53
import com.sun.tools.javac.tree.JCTree.JCParens;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    54
import com.sun.tools.javac.tree.JCTree.JCReturn;
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
    55
import com.sun.tools.javac.tree.JCTree.JCSwitchExpression;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    56
import com.sun.tools.javac.tree.TreeCopier;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    57
import com.sun.tools.javac.tree.TreeInfo;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    58
import com.sun.tools.javac.util.Assert;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    59
import com.sun.tools.javac.util.Context;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    60
import com.sun.tools.javac.util.DiagnosticSource;
47952
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
    61
import com.sun.tools.javac.util.JCDiagnostic;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    62
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    63
import com.sun.tools.javac.util.List;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    64
import com.sun.tools.javac.util.ListBuffer;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    65
import com.sun.tools.javac.util.Log;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    66
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    67
import java.util.HashMap;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    68
import java.util.LinkedHashMap;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    69
import java.util.Map;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    70
import java.util.Optional;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    71
import java.util.function.Function;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    72
import java.util.function.Supplier;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    73
35417
ec74f22cf4c6 8148128: Regression: array constructor references marked as inexact
mcimadamore
parents: 33363
diff changeset
    74
import static com.sun.tools.javac.code.TypeTag.ARRAY;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    75
import static com.sun.tools.javac.code.TypeTag.DEFERRED;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    76
import static com.sun.tools.javac.code.TypeTag.FORALL;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    77
import static com.sun.tools.javac.code.TypeTag.METHOD;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    78
import static com.sun.tools.javac.code.TypeTag.VOID;
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
    79
import com.sun.tools.javac.tree.JCTree.JCYield;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    80
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    81
/**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    82
 * This class performs attribution of method/constructor arguments when target-typing is enabled
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    83
 * (source >= 8); for each argument that is potentially a poly expression, this class builds
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    84
 * a rich representation (see {@link ArgumentType} which can then be used for performing fast overload
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    85
 * checks without requiring multiple attribution passes over the same code.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    86
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    87
 * The attribution strategy for a given method/constructor argument A is as follows:
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    88
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    89
 * - if A is potentially a poly expression (i.e. diamond instance creation expression), a speculative
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    90
 * pass over A is performed; the results of such speculative attribution are then saved in a special
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    91
 * type, so that enclosing overload resolution can be carried by simply checking compatibility against the
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    92
 * type determined during this speculative pass.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    93
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    94
 * - if A is a standalone expression, regular atributtion takes place.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    95
 *
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    96
 * To minimize the speculative work, a cache is used, so that already computed argument types
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    97
 * associated with a given unique source location are never recomputed multiple times.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    98
 */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
    99
public class ArgumentAttr extends JCTree.Visitor {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   100
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   101
    protected static final Context.Key<ArgumentAttr> methodAttrKey = new Context.Key<>();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   102
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   103
    private final DeferredAttr deferredAttr;
47952
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   104
    private final JCDiagnostic.Factory diags;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   105
    private final Attr attr;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   106
    private final Symtab syms;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   107
    private final Log log;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   108
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   109
    /** Attribution environment to be used. */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   110
    private Env<AttrContext> env;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   111
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   112
    /** Result of method attribution. */
44571
1140b8dad6bb 8177933: Stackoverflow during compilation, starting jdk-9+163
mcimadamore
parents: 44393
diff changeset
   113
    Type result;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   114
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   115
    /** Cache for argument types; behavior is influences by the currrently selected cache policy. */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   116
    Map<UniquePos, ArgumentType<?>> argumentTypeCache = new LinkedHashMap<>();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   117
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   118
    public static ArgumentAttr instance(Context context) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   119
        ArgumentAttr instance = context.get(methodAttrKey);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   120
        if (instance == null)
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   121
            instance = new ArgumentAttr(context);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   122
        return instance;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   123
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   124
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   125
    protected ArgumentAttr(Context context) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   126
        context.put(methodAttrKey, this);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   127
        deferredAttr = DeferredAttr.instance(context);
47952
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   128
        diags = JCDiagnostic.Factory.instance(context);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   129
        attr = Attr.instance(context);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   130
        syms = Symtab.instance(context);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   131
        log = Log.instance(context);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   132
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   133
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   134
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   135
     * Set the results of method attribution.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   136
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   137
    void setResult(JCExpression tree, Type type) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   138
        result = type;
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 55306
diff changeset
   139
        if (env.info.attributionMode == DeferredAttr.AttributionMode.SPECULATIVE) {
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   140
            //if we are in a speculative branch we can save the type in the tree itself
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   141
            //as there's no risk of polluting the original tree.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   142
            tree.type = result;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   143
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   144
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   145
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   146
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   147
     * Checks a type in the speculative tree against a given result; the type can be either a plain
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   148
     * type or an argument type,in which case a more complex check is required.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   149
     */
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   150
    Type checkSpeculative(JCTree expr, ResultInfo resultInfo) {
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   151
        return checkSpeculative(expr, expr.type, resultInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   152
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   153
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   154
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   155
     * Checks a type in the speculative tree against a given result; the type can be either a plain
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   156
     * type or an argument type,in which case a more complex check is required.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   157
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   158
    Type checkSpeculative(DiagnosticPosition pos, Type t, ResultInfo resultInfo) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   159
        if (t.hasTag(DEFERRED)) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   160
            return ((DeferredType)t).check(resultInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   161
        } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   162
            return resultInfo.check(pos, t);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   163
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   164
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   165
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   166
    /**
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   167
     * Returns a local caching context in which argument types can safely be cached without
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   168
     * the risk of polluting enclosing contexts. This is useful when attempting speculative
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   169
     * attribution of potentially erroneous expressions, which could end up polluting the cache.
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   170
     */
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   171
    LocalCacheContext withLocalCacheContext() {
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   172
        return new LocalCacheContext();
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   173
    }
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   174
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   175
    /**
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   176
     * Local cache context; this class keeps track of the previous cache and reverts to it
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   177
     * when the {@link LocalCacheContext#leave()} method is called.
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   178
     */
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   179
    class LocalCacheContext {
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   180
        Map<UniquePos, ArgumentType<?>> prevCache;
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   181
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   182
        public LocalCacheContext() {
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   183
            this.prevCache = argumentTypeCache;
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   184
            argumentTypeCache = new HashMap<>();
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   185
        }
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   186
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   187
        public void leave() {
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   188
            argumentTypeCache = prevCache;
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   189
        }
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   190
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   191
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   192
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   193
     * Main entry point for attributing an argument with given tree and attribution environment.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   194
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   195
    Type attribArg(JCTree tree, Env<AttrContext> env) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   196
        Env<AttrContext> prevEnv = this.env;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   197
        try {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   198
            this.env = env;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   199
            tree.accept(this);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   200
            return result;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   201
        } finally {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   202
            this.env = prevEnv;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   203
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   204
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   205
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   206
    @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   207
    public void visitTree(JCTree that) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   208
        //delegates to Attr
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   209
        that.accept(attr);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   210
        result = attr.result;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   211
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   212
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   213
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   214
     * Process a method argument; this method takes care of performing a speculative pass over the
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   215
     * argument tree and calling a well-defined entry point to build the argument type associated
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   216
     * with such tree.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   217
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   218
    @SuppressWarnings("unchecked")
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   219
    <T extends JCExpression, Z extends ArgumentType<T>> void processArg(T that, Function<T, Z> argumentTypeFactory) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   220
        UniquePos pos = new UniquePos(that);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   221
        processArg(that, () -> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   222
            T speculativeTree = (T)deferredAttr.attribSpeculative(that, env, attr.new MethodAttrInfo() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   223
                @Override
44571
1140b8dad6bb 8177933: Stackoverflow during compilation, starting jdk-9+163
mcimadamore
parents: 44393
diff changeset
   224
                protected boolean needsArgumentAttr(JCTree tree) {
1140b8dad6bb 8177933: Stackoverflow during compilation, starting jdk-9+163
mcimadamore
parents: 44393
diff changeset
   225
                    return !new UniquePos(tree).equals(pos);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   226
                }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   227
            });
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   228
            return argumentTypeFactory.apply(speculativeTree);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   229
        });
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   230
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   231
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   232
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   233
     * Process a method argument; this method allows the caller to specify a custom speculative attribution
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   234
     * logic (this is used e.g. for lambdas).
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   235
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   236
    @SuppressWarnings("unchecked")
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   237
    <T extends JCExpression, Z extends ArgumentType<T>> void processArg(T that, Supplier<Z> argumentTypeFactory) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   238
        UniquePos pos = new UniquePos(that);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   239
        Z cached = (Z)argumentTypeCache.get(pos);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   240
        if (cached != null) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   241
            //dup existing speculative type
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   242
            setResult(that, cached.dup(that, env));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   243
        } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   244
            Z res = argumentTypeFactory.get();
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 32709
diff changeset
   245
            argumentTypeCache.put(pos, res);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   246
            setResult(that, res);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   247
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   248
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   249
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   250
    @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   251
    public void visitParens(JCParens that) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   252
        processArg(that, speculativeTree -> new ParensType(that, env, speculativeTree));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   253
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   254
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   255
    @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   256
    public void visitConditional(JCConditional that) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   257
        processArg(that, speculativeTree -> new ConditionalType(that, env, speculativeTree));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   258
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   259
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   260
    @Override
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   261
    public void visitSwitchExpression(JCSwitchExpression that) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   262
        processArg(that, speculativeTree -> new SwitchExpressionType(that, env, speculativeTree));
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   263
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   264
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   265
    @Override
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   266
    public void visitReference(JCMemberReference tree) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   267
        //perform arity-based check
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   268
        Env<AttrContext> localEnv = env.dup(tree);
44393
ce94820fa9d1 8176714: javac is wrongly assuming that field JCMemberReference.overloadKind has been assigned to
vromero
parents: 38512
diff changeset
   269
        JCExpression exprTree;
ce94820fa9d1 8176714: javac is wrongly assuming that field JCMemberReference.overloadKind has been assigned to
vromero
parents: 38512
diff changeset
   270
        exprTree = (JCExpression)deferredAttr.attribSpeculative(tree.getQualifierExpression(), localEnv,
ce94820fa9d1 8176714: javac is wrongly assuming that field JCMemberReference.overloadKind has been assigned to
vromero
parents: 38512
diff changeset
   271
                attr.memberReferenceQualifierResult(tree),
ce94820fa9d1 8176714: javac is wrongly assuming that field JCMemberReference.overloadKind has been assigned to
vromero
parents: 38512
diff changeset
   272
                withLocalCacheContext());
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   273
        JCMemberReference mref2 = new TreeCopier<Void>(attr.make).copy(tree);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   274
        mref2.expr = exprTree;
33363
f03a03067799 8139836: Can't use super::x method reference when x is protected
sadayapalam
parents: 32911
diff changeset
   275
        Symbol lhsSym = TreeInfo.symbol(exprTree);
f03a03067799 8139836: Can't use super::x method reference when x is protected
sadayapalam
parents: 32911
diff changeset
   276
        localEnv.info.selectSuper = lhsSym != null && lhsSym.name == lhsSym.name.table.names._super;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   277
        Symbol res =
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   278
                attr.rs.getMemberReference(tree, localEnv, mref2,
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   279
                        exprTree.type, tree.name);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   280
        if (!res.kind.isResolutionError()) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   281
            tree.sym = res;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   282
        }
51721
96b76dca2be8 8210483: AssertionError in DeferredAttr at setOverloadKind caused by JDK-8203679
cushon
parents: 51563
diff changeset
   283
        if (res.kind.isResolutionTargetError()) {
96b76dca2be8 8210483: AssertionError in DeferredAttr at setOverloadKind caused by JDK-8203679
cushon
parents: 51563
diff changeset
   284
             tree.setOverloadKind(JCMemberReference.OverloadKind.ERROR);
96b76dca2be8 8210483: AssertionError in DeferredAttr at setOverloadKind caused by JDK-8203679
cushon
parents: 51563
diff changeset
   285
        } else if (res.type != null && res.type.hasTag(FORALL) ||
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   286
                (res.flags() & Flags.VARARGS) != 0 ||
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   287
                (TreeInfo.isStaticSelector(exprTree, tree.name.table.names) &&
35417
ec74f22cf4c6 8148128: Regression: array constructor references marked as inexact
mcimadamore
parents: 33363
diff changeset
   288
                exprTree.type.isRaw() && !exprTree.type.hasTag(ARRAY))) {
44393
ce94820fa9d1 8176714: javac is wrongly assuming that field JCMemberReference.overloadKind has been assigned to
vromero
parents: 38512
diff changeset
   289
            tree.setOverloadKind(JCMemberReference.OverloadKind.OVERLOADED);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   290
        } else {
44393
ce94820fa9d1 8176714: javac is wrongly assuming that field JCMemberReference.overloadKind has been assigned to
vromero
parents: 38512
diff changeset
   291
            tree.setOverloadKind(JCMemberReference.OverloadKind.UNOVERLOADED);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   292
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   293
        //return a plain old deferred type for this
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   294
        setResult(tree, deferredAttr.new DeferredType(tree, env));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   295
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   296
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   297
    @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   298
    public void visitLambda(JCLambda that) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   299
        if (that.paramKind == ParameterKind.EXPLICIT) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   300
            //if lambda is explicit, we can save info in the corresponding argument type
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   301
            processArg(that, () -> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   302
                JCLambda speculativeLambda =
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   303
                        deferredAttr.attribSpeculativeLambda(that, env, attr.methodAttrInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   304
                return new ExplicitLambdaType(that, env, speculativeLambda);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   305
            });
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   306
        } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   307
            //otherwise just use a deferred type
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   308
            setResult(that, deferredAttr.new DeferredType(that, env));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   309
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   310
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   311
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   312
    @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   313
    public void visitApply(JCMethodInvocation that) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   314
        if (that.getTypeArguments().isEmpty()) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   315
            processArg(that, speculativeTree -> new ResolvedMethodType(that, env, speculativeTree));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   316
        } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   317
            //not a poly expression, just call Attr
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   318
            setResult(that, attr.attribTree(that, env, attr.unknownExprInfo));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   319
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   320
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   321
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   322
    @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   323
    public void visitNewClass(JCNewClass that) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   324
        if (TreeInfo.isDiamond(that)) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   325
            processArg(that, speculativeTree -> new ResolvedConstructorType(that, env, speculativeTree));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   326
        } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   327
            //not a poly expression, just call Attr
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   328
            setResult(that, attr.attribTree(that, env, attr.unknownExprInfo));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   329
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   330
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   331
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   332
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   333
     * An argument type is similar to a plain deferred type; the most important difference is that
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   334
     * the completion logic associated with argument types allows speculative attribution to be skipped
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   335
     * during overload resolution - that is, an argument type always has enough information to
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   336
     * perform an overload check without the need of calling back to Attr. This extra information
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   337
     * is typically stored in the form of a speculative tree.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   338
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   339
    abstract class ArgumentType<T extends JCExpression> extends DeferredType implements DeferredTypeCompleter {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   340
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   341
        /** The speculative tree carrying type information. */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   342
        T speculativeTree;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   343
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   344
        /** Types associated with this argument (one type per possible target result). */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   345
        Map<ResultInfo, Type> speculativeTypes;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   346
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   347
        public ArgumentType(JCExpression tree, Env<AttrContext> env, T speculativeTree, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   348
            deferredAttr.super(tree, env);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   349
            this.speculativeTree = speculativeTree;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   350
            this.speculativeTypes = speculativeTypes;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   351
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   352
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   353
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   354
        final DeferredTypeCompleter completer() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   355
            return this;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   356
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   357
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   358
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   359
        final public Type complete(DeferredType dt, ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   360
            Assert.check(dt == this);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   361
            if (deferredAttrContext.mode == AttrMode.SPECULATIVE) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   362
                Type t = (resultInfo.pt == Type.recoveryType) ?
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   363
                        deferredAttr.basicCompleter.complete(dt, resultInfo, deferredAttrContext) :
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   364
                        overloadCheck(resultInfo, deferredAttrContext);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   365
                speculativeTypes.put(resultInfo, t);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   366
                return t;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   367
            } else {
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 55306
diff changeset
   368
                if (!env.info.attributionMode.isSpeculative) {
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   369
                    argumentTypeCache.remove(new UniquePos(dt.tree));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   370
                }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   371
                return deferredAttr.basicCompleter.complete(dt, resultInfo, deferredAttrContext);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   372
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   373
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   374
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   375
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   376
        Type speculativeType(Symbol msym, MethodResolutionPhase phase) {
48549
db044d7e9885 8195598: Reference to overloaded method is ambiguous with 3 methods but works with 2
mcimadamore
parents: 47952
diff changeset
   377
            if (notPertinentToApplicability.contains(msym)) {
db044d7e9885 8195598: Reference to overloaded method is ambiguous with 3 methods but works with 2
mcimadamore
parents: 47952
diff changeset
   378
                return super.speculativeType(msym, phase);
db044d7e9885 8195598: Reference to overloaded method is ambiguous with 3 methods but works with 2
mcimadamore
parents: 47952
diff changeset
   379
            } else {
38512
c71e1cdd6674 8154180: Regression: stuck expressions do not behave correctly
mcimadamore
parents: 35417
diff changeset
   380
                for (Map.Entry<ResultInfo, Type> _entry : speculativeTypes.entrySet()) {
c71e1cdd6674 8154180: Regression: stuck expressions do not behave correctly
mcimadamore
parents: 35417
diff changeset
   381
                    DeferredAttrContext deferredAttrContext = _entry.getKey().checkContext.deferredAttrContext();
c71e1cdd6674 8154180: Regression: stuck expressions do not behave correctly
mcimadamore
parents: 35417
diff changeset
   382
                    if (deferredAttrContext.phase == phase && deferredAttrContext.msym == msym) {
c71e1cdd6674 8154180: Regression: stuck expressions do not behave correctly
mcimadamore
parents: 35417
diff changeset
   383
                        return _entry.getValue();
c71e1cdd6674 8154180: Regression: stuck expressions do not behave correctly
mcimadamore
parents: 35417
diff changeset
   384
                    }
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   385
                }
38512
c71e1cdd6674 8154180: Regression: stuck expressions do not behave correctly
mcimadamore
parents: 35417
diff changeset
   386
                return Type.noType;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   387
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   388
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   389
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   390
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   391
        JCTree speculativeTree(DeferredAttrContext deferredAttrContext) {
48549
db044d7e9885 8195598: Reference to overloaded method is ambiguous with 3 methods but works with 2
mcimadamore
parents: 47952
diff changeset
   392
            return notPertinentToApplicability.contains(deferredAttrContext.msym) ?
db044d7e9885 8195598: Reference to overloaded method is ambiguous with 3 methods but works with 2
mcimadamore
parents: 47952
diff changeset
   393
                    super.speculativeTree(deferredAttrContext) :
db044d7e9885 8195598: Reference to overloaded method is ambiguous with 3 methods but works with 2
mcimadamore
parents: 47952
diff changeset
   394
                    speculativeTree;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   395
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   396
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   397
        /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   398
         * Performs an overload check against a given target result.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   399
         */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   400
        abstract Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   401
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   402
        /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   403
         * Creates a copy of this argument type with given tree and environment.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   404
         */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   405
        abstract ArgumentType<T> dup(T tree, Env<AttrContext> env);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   406
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   407
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   408
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   409
     * Argument type for parenthesized expression.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   410
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   411
    class ParensType extends ArgumentType<JCParens> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   412
        ParensType(JCExpression tree, Env<AttrContext> env, JCParens speculativeParens) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   413
            this(tree, env, speculativeParens, new HashMap<>());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   414
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   415
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   416
        ParensType(JCExpression tree, Env<AttrContext> env, JCParens speculativeParens, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   417
           super(tree, env, speculativeParens, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   418
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   419
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   420
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   421
        Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   422
            return checkSpeculative(speculativeTree.expr, resultInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   423
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   424
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   425
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   426
        ArgumentType<JCParens> dup(JCParens tree, Env<AttrContext> env) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   427
            return new ParensType(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   428
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   429
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   430
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   431
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   432
     * Argument type for conditionals.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   433
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   434
    class ConditionalType extends ArgumentType<JCConditional> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   435
        ConditionalType(JCExpression tree, Env<AttrContext> env, JCConditional speculativeCond) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   436
            this(tree, env, speculativeCond, new HashMap<>());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   437
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   438
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   439
        ConditionalType(JCExpression tree, Env<AttrContext> env, JCConditional speculativeCond, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   440
           super(tree, env, speculativeCond, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   441
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   442
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   443
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   444
        Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   445
            ResultInfo localInfo = resultInfo.dup(attr.conditionalContext(resultInfo.checkContext));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   446
            if (speculativeTree.isStandalone()) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   447
                return localInfo.check(speculativeTree, speculativeTree.type);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   448
            } else if (resultInfo.pt.hasTag(VOID)) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   449
                //this means we are returning a poly conditional from void-compatible lambda expression
45504
ea7475564d07 8170326: Inconsistencies between code, compiler.properties and comments
jlahoda
parents: 45498
diff changeset
   450
                resultInfo.checkContext.report(tree, attr.diags.fragment(Fragments.ConditionalTargetCantBeVoid));
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   451
                return attr.types.createErrorType(resultInfo.pt);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   452
            } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   453
                //poly
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   454
                checkSpeculative(speculativeTree.truepart, localInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   455
                checkSpeculative(speculativeTree.falsepart, localInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   456
                return localInfo.pt;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   457
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   458
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   459
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   460
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   461
        ArgumentType<JCConditional> dup(JCConditional tree, Env<AttrContext> env) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   462
            return new ConditionalType(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   463
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   464
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   465
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   466
    /**
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   467
     * Argument type for switch expressions.
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   468
     */
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   469
    class SwitchExpressionType extends ArgumentType<JCSwitchExpression> {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   470
        /** List of break expressions (lazily populated). */
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   471
        Optional<List<JCYield>> yieldExpressions = Optional.empty();
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   472
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   473
        SwitchExpressionType(JCExpression tree, Env<AttrContext> env, JCSwitchExpression speculativeCond) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   474
            this(tree, env, speculativeCond, new HashMap<>());
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   475
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   476
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   477
        SwitchExpressionType(JCExpression tree, Env<AttrContext> env, JCSwitchExpression speculativeCond, Map<ResultInfo, Type> speculativeTypes) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   478
           super(tree, env, speculativeCond, speculativeTypes);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   479
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   480
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   481
        @Override
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   482
        Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   483
            ResultInfo localInfo = resultInfo.dup(attr.conditionalContext(resultInfo.checkContext));
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   484
            if (resultInfo.pt.hasTag(VOID)) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   485
                //this means we are returning a poly switch expression from void-compatible lambda expression
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   486
                resultInfo.checkContext.report(tree, attr.diags.fragment(Fragments.SwitchExpressionTargetCantBeVoid));
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   487
                return attr.types.createErrorType(resultInfo.pt);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   488
            } else {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   489
                //poly
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   490
                for (JCYield brk : yieldExpressions()) {
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   491
                    checkSpeculative(brk.value, brk.value.type, resultInfo);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   492
                }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   493
                return localInfo.pt;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   494
            }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   495
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   496
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   497
        /** Compute return expressions (if needed). */
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   498
        List<JCYield> yieldExpressions() {
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   499
            return yieldExpressions.orElseGet(() -> {
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   500
                final List<JCYield> res;
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   501
                ListBuffer<JCYield> buf = new ListBuffer<>();
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   502
                new SwitchExpressionScanner() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   503
                    @Override
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   504
                    public void visitYield(JCYield tree) {
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   505
                        if (tree.target == speculativeTree)
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   506
                            buf.add(tree);
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   507
                        super.visitYield(tree);
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   508
                    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   509
                }.scan(speculativeTree.cases);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   510
                res = buf.toList();
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 51721
diff changeset
   511
                yieldExpressions = Optional.of(res);
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   512
                return res;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   513
            });
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   514
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   515
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   516
        @Override
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   517
        ArgumentType<JCSwitchExpression> dup(JCSwitchExpression tree, Env<AttrContext> env) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   518
            return new SwitchExpressionType(tree, env, speculativeTree, speculativeTypes);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   519
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   520
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   521
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents: 48549
diff changeset
   522
    /**
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   523
     * Argument type for explicit lambdas.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   524
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   525
    class ExplicitLambdaType extends ArgumentType<JCLambda> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   526
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   527
        /** List of argument types (lazily populated). */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   528
        Optional<List<Type>> argtypes = Optional.empty();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   529
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   530
        /** List of return expressions (lazily populated). */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   531
        Optional<List<JCReturn>> returnExpressions = Optional.empty();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   532
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   533
        ExplicitLambdaType(JCLambda originalLambda, Env<AttrContext> env, JCLambda speculativeLambda) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   534
            this(originalLambda, env, speculativeLambda, new HashMap<>());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   535
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   536
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   537
        ExplicitLambdaType(JCLambda originalLambda, Env<AttrContext> env, JCLambda speculativeLambda, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   538
            super(originalLambda, env, speculativeLambda, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   539
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   540
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   541
        /** Compute argument types (if needed). */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   542
        List<Type> argtypes() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   543
            return argtypes.orElseGet(() -> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   544
                List<Type> res = TreeInfo.types(speculativeTree.params);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   545
                argtypes = Optional.of(res);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   546
                return res;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   547
            });
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   548
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   549
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   550
        /** Compute return expressions (if needed). */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   551
        List<JCReturn> returnExpressions() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   552
            return returnExpressions.orElseGet(() -> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   553
                final List<JCReturn> res;
47952
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   554
                ListBuffer<JCReturn> buf = new ListBuffer<>();
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   555
                new LambdaReturnScanner() {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   556
                    @Override
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   557
                    public void visitReturn(JCReturn tree) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   558
                        buf.add(tree);
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   559
                    }
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   560
                }.scan(speculativeTree.body);
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   561
                res = buf.toList();
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   562
                returnExpressions = Optional.of(res);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   563
                return res;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   564
            });
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   565
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   566
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   567
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   568
        Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   569
            try {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   570
                //compute target-type; this logic could be shared with Attr
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   571
                TargetInfo targetInfo = attr.getTargetInfo(speculativeTree, resultInfo, argtypes());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   572
                Type lambdaType = targetInfo.descriptor;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   573
                Type currentTarget = targetInfo.target;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   574
                //check compatibility
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   575
                checkLambdaCompatible(lambdaType, resultInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   576
                return currentTarget;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   577
            } catch (FunctionDescriptorLookupError ex) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   578
                resultInfo.checkContext.report(null, ex.getDiagnostic());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   579
                return null; //cannot get here
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   580
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   581
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   582
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   583
        /** Check lambda against given target result */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   584
        private void checkLambdaCompatible(Type descriptor, ResultInfo resultInfo) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   585
            CheckContext checkContext = resultInfo.checkContext;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   586
            ResultInfo bodyResultInfo = attr.lambdaBodyResult(speculativeTree, descriptor, resultInfo);
47952
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   587
            switch (speculativeTree.getBodyKind()) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   588
                case EXPRESSION:
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   589
                    checkSpeculative(speculativeTree.body, speculativeTree.body.type, bodyResultInfo);
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   590
                    break;
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   591
                case STATEMENT:
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   592
                    for (JCReturn ret : returnExpressions()) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   593
                        checkReturnInStatementLambda(ret, bodyResultInfo);
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   594
                    }
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   595
                    break;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   596
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   597
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   598
            attr.checkLambdaCompatible(speculativeTree, descriptor, checkContext);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   599
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   600
47952
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   601
        /**
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   602
         * This is an inlined version of {@link Attr#visitReturn(JCReturn)}.
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   603
         */
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   604
        void checkReturnInStatementLambda(JCReturn ret, ResultInfo resultInfo) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   605
            if (resultInfo.pt.hasTag(VOID) && ret.expr != null) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   606
                //fail - if the function type's result is void, the lambda body must be a void-compatible block.
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   607
                resultInfo.checkContext.report(speculativeTree.pos(),
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   608
                        diags.fragment("unexpected.ret.val"));
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   609
            } else if (!resultInfo.pt.hasTag(VOID)) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   610
                if (ret.expr == null) {
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   611
                    //fail - if the function type's result is non-void, the lambda body must be a value-compatible block.
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   612
                    resultInfo.checkContext.report(speculativeTree.pos(),
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   613
                            diags.fragment("missing.ret.val"));
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   614
                }
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   615
                checkSpeculative(ret.expr, ret.expr.type, resultInfo);
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   616
            }
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   617
        }
469e42d314a4 8178427: NPE in Infer$CheckUpperBounds
mcimadamore
parents: 47216
diff changeset
   618
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   619
        /** Get the type associated with given return expression. */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   620
        Type getReturnType(JCReturn ret) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   621
            if (ret.expr == null) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   622
                return syms.voidType;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   623
            } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   624
                return ret.expr.type;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   625
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   626
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   627
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   628
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   629
        ArgumentType<JCLambda> dup(JCLambda tree, Env<AttrContext> env) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   630
            return new ExplicitLambdaType(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   631
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   632
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   633
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   634
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   635
     * Argument type for methods/constructors.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   636
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   637
    abstract class ResolvedMemberType<E extends JCExpression> extends ArgumentType<E> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   638
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   639
        public ResolvedMemberType(JCExpression tree, Env<AttrContext> env, E speculativeMethod, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   640
            super(tree, env, speculativeMethod, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   641
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   642
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   643
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   644
        Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   645
            Type mtype = methodType();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   646
            ResultInfo localInfo = resultInfo(resultInfo);
45498
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   647
            Type t;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   648
            if (mtype != null && mtype.hasTag(METHOD) && mtype.isPartial()) {
45498
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   649
                //poly invocation
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   650
                t = ((PartiallyInferredMethodType)mtype).check(localInfo);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   651
            } else {
45498
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   652
                //standalone invocation
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   653
                t = localInfo.check(tree.pos(), speculativeTree.type);
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   654
            }
45498
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   655
            speculativeTypes.put(localInfo, t);
0848a6cbe2a3 8175794: Type inference regression after JDK-8078093
vromero
parents: 44571
diff changeset
   656
            return t;
32709
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   657
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   658
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   659
        /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   660
         * Get the result info to be used for performing an overload check.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   661
         */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   662
        abstract ResultInfo resultInfo(ResultInfo resultInfo);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   663
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   664
        /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   665
         * Get the method type to be used for performing an overload check.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   666
         */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   667
        abstract Type methodType();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   668
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   669
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   670
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   671
     * Argument type for methods.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   672
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   673
    class ResolvedMethodType extends ResolvedMemberType<JCMethodInvocation> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   674
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   675
        public ResolvedMethodType(JCExpression tree, Env<AttrContext> env, JCMethodInvocation speculativeTree) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   676
            this(tree, env, speculativeTree, new HashMap<>());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   677
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   678
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   679
        public ResolvedMethodType(JCExpression tree, Env<AttrContext> env, JCMethodInvocation speculativeTree, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   680
            super(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   681
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   682
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   683
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   684
        ResultInfo resultInfo(ResultInfo resultInfo) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   685
            return resultInfo;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   686
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   687
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   688
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   689
        Type methodType() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   690
            return speculativeTree.meth.type;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   691
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   692
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   693
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   694
        ArgumentType<JCMethodInvocation> dup(JCMethodInvocation tree, Env<AttrContext> env) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   695
            return new ResolvedMethodType(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   696
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   697
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   698
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   699
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   700
     * Argument type for constructors.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   701
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   702
    class ResolvedConstructorType extends ResolvedMemberType<JCNewClass> {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   703
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   704
        public ResolvedConstructorType(JCExpression tree, Env<AttrContext> env, JCNewClass speculativeTree) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   705
            this(tree, env, speculativeTree, new HashMap<>());
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   706
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   707
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   708
        public ResolvedConstructorType(JCExpression tree, Env<AttrContext> env, JCNewClass speculativeTree, Map<ResultInfo, Type> speculativeTypes) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   709
            super(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   710
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   711
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   712
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   713
        ResultInfo resultInfo(ResultInfo resultInfo) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   714
            return resultInfo.dup(attr.diamondContext(speculativeTree, speculativeTree.clazz.type.tsym, resultInfo.checkContext));
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   715
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   716
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   717
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   718
        Type methodType() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   719
            return (speculativeTree.constructorType != null) ?
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   720
                    speculativeTree.constructorType.baseType() : syms.errType;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   721
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   722
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   723
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   724
        ArgumentType<JCNewClass> dup(JCNewClass tree, Env<AttrContext> env) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   725
            return new ResolvedConstructorType(tree, env, speculativeTree, speculativeTypes);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   726
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   727
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   728
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   729
    /**
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   730
     * An instance of this class represents a unique position in a compilation unit. A unique
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   731
     * position is made up of (i) a unique position in a source file (char offset) and (ii)
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   732
     * a source file info.
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   733
     */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   734
    class UniquePos {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   735
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   736
        /** Char offset. */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   737
        int pos;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   738
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   739
        /** Source info. */
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   740
        DiagnosticSource source;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   741
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   742
        UniquePos(JCTree tree) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   743
            this.pos = tree.pos;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   744
            this.source = log.currentSource();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   745
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   746
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   747
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   748
        public int hashCode() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   749
            return pos << 16 + source.hashCode();
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   750
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   751
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   752
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   753
        public boolean equals(Object obj) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   754
            if (obj instanceof UniquePos) {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   755
                UniquePos that = (UniquePos)obj;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   756
                return pos == that.pos && source == that.source;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   757
            } else {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   758
                return false;
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   759
            }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   760
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   761
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   762
        @Override
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   763
        public String toString() {
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   764
            return source.getFile().getName() + " @ " + source.getLineNumber(pos);
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   765
        }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   766
    }
55d136799f79 8078093: Severe compiler performance regression Java 7 to 8 for nested method invocations
mcimadamore
parents:
diff changeset
   767
}