nashorn/src/jdk/nashorn/internal/runtime/CompiledFunction.java
author lagergren
Wed, 23 Apr 2014 16:13:47 +0200
changeset 24744 5290da85fc3d
parent 24742 a9afb384e654
child 24745 3a6e1477362b
permissions -rw-r--r--
8038426: Move all loggers from process wide scope into Global scope Reviewed-by: attila, hannesw
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     1
/*
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     4
 *
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    10
 *
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    15
 * accompanied this code).
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    16
 *
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    20
 *
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    23
 * questions.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    24
 */
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    25
package jdk.nashorn.internal.runtime;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    26
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    27
import static jdk.nashorn.internal.lookup.Lookup.MH;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    28
import static jdk.nashorn.internal.runtime.UnwarrantedOptimismException.INVALID_PROGRAM_POINT;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    29
import static jdk.nashorn.internal.runtime.UnwarrantedOptimismException.isValid;
24740
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
    30
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    31
import java.lang.invoke.CallSite;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    32
import java.lang.invoke.MethodHandle;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    33
import java.lang.invoke.MethodHandles;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    34
import java.lang.invoke.MethodType;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    35
import java.lang.invoke.MutableCallSite;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    36
import java.lang.invoke.SwitchPoint;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    37
import java.util.Map;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    38
import java.util.TreeMap;
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24729
diff changeset
    39
import java.util.logging.Level;
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24729
diff changeset
    40
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    41
import jdk.nashorn.internal.codegen.types.ArrayType;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    42
import jdk.nashorn.internal.codegen.types.Type;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    43
import jdk.nashorn.internal.ir.FunctionNode;
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
    44
import jdk.nashorn.internal.objects.Global;
24742
a9afb384e654 8040655: When processing a RewriteException debug object, the return value has already been reset to null. We need to catch this value before that.
lagergren
parents: 24741
diff changeset
    45
import jdk.nashorn.internal.runtime.events.RecompilationEvent;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    46
import jdk.nashorn.internal.runtime.linker.Bootstrap;
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
    47
import jdk.nashorn.internal.runtime.logging.DebugLogger;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    48
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    49
/**
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    50
 * An version of a JavaScript function, native or JavaScript.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    51
 * Supports lazily generating a constructor version of the invocation.
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    52
 */
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    53
final class CompiledFunction {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    54
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    55
    private static final MethodHandle NEWFILTER = findOwnMH("newFilter", Object.class, Object.class, Object.class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    56
    private static final MethodHandle RELINK_COMPOSABLE_INVOKER = findOwnMH("relinkComposableInvoker", void.class, CallSite.class, CompiledFunction.class, boolean.class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    57
    private static final MethodHandle HANDLE_REWRITE_EXCEPTION = findOwnMH("handleRewriteException", MethodHandle.class, CompiledFunction.class, OptimismInfo.class, RewriteException.class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    58
    private static final MethodHandle RESTOF_INVOKER = MethodHandles.exactInvoker(MethodType.methodType(Object.class, RewriteException.class));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    59
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
    60
    private final DebugLogger log;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    61
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    62
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    63
     * The method type may be more specific than the invoker, if. e.g.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    64
     * the invoker is guarded, and a guard with a generic object only
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    65
     * fallback, while the target is more specific, we still need the
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    66
     * more specific type for sorting
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    67
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    68
    private MethodHandle invoker;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    69
    private MethodHandle constructor;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    70
    private OptimismInfo optimismInfo;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
    71
    private int flags; // from FunctionNode
24740
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
    72
    private boolean applyToCall;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    73
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    74
    CompiledFunction(final MethodHandle invoker) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    75
        this.invoker = invoker;
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
    76
        this.log = Global.instance().getLogger(RecompilableScriptFunctionData.class);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    77
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    78
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    79
    static CompiledFunction createBuiltInConstructor(final MethodHandle invoker) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    80
        return new CompiledFunction(MH.insertArguments(invoker, 0, false),
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    81
                createConstructorFromInvoker(MH.insertArguments(invoker, 0, true)));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    82
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    83
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    84
    CompiledFunction(final MethodHandle invoker, final MethodHandle constructor) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    85
        this(invoker);
17756
daaa1e643f71 8006069: Range analysis first iteration, runtime specializations
lagergren
parents: 17518
diff changeset
    86
        this.constructor = constructor;
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    87
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
    88
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
    89
    CompiledFunction(final MethodHandle invoker, final RecompilableScriptFunctionData functionData, final int flags) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    90
        this(invoker);
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
    91
        this.flags = flags;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
    92
        if ((flags & FunctionNode.IS_OPTIMISTIC) != 0) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    93
            optimismInfo = new OptimismInfo(functionData);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    94
        } else {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    95
            optimismInfo = null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    96
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    97
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
    98
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
    99
    int getFlags() {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   100
        return flags;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   101
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   102
24740
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   103
    void setIsApplyToCall() {
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   104
        applyToCall = true;
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   105
    }
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   106
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   107
    boolean isApplyToCall() {
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   108
        return applyToCall;
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   109
    }
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   110
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   111
    boolean isVarArg() {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   112
        return isVarArgsType(invoker.type());
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   113
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   114
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   115
    @Override
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   116
    public String toString() {
24740
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   117
        return "[invokerType=" + invoker.type() + " ctor=" + constructor + " weight=" + weight() + " isApplyToCall=" + isApplyToCall() + "]";
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   118
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   119
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   120
    boolean needsCallee() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   121
        return ScriptFunctionData.needsCallee(invoker);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   122
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   123
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   124
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   125
     * Returns an invoker method handle for this function. Note that the handle is safely composable in
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   126
     * the sense that you can compose it with other handles using any combinators even if you can't affect call site
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   127
     * invalidation. If this compiled function is non-optimistic, then it returns the same value as
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   128
     * {@link #getInvoker()}. However, if the function is optimistic, then this handle will incur an overhead as it will
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   129
     * add an intermediate internal call site that can relink itself when the function needs to regenerate its code to
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   130
     * always point at the latest generated code version.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   131
     * @return a guaranteed composable invoker method handle for this function.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   132
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   133
    MethodHandle createComposableInvoker() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   134
        return createComposableInvoker(false);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   135
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   136
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   137
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   138
     * Returns an invoker method handle for this function when invoked as a constructor. Note that the handle should be
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   139
     * considered non-composable in the sense that you can only compose it with other handles using any combinators if
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   140
     * you can ensure that the composition is guarded by {@link #getOptimisticAssumptionsSwitchPoint()} if it's
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   141
     * non-null, and that you can relink the call site it is set into as a target if the switch point is invalidated. In
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   142
     * all other cases, use {@link #createComposableConstructor()}.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   143
     * @return a direct constructor method handle for this function.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   144
     */
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   145
    MethodHandle getConstructor() {
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   146
        if (constructor == null) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   147
            constructor = createConstructorFromInvoker(createInvokerForPessimisticCaller());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   148
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   149
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   150
        return constructor;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   151
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   152
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   153
    MethodHandle getInvoker() {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   154
        return invoker;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   155
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   156
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   157
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   158
     * Creates a version of the invoker intended for a pessimistic caller (return type is Object, no caller optimistic
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   159
     * program point available).
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   160
     * @return a version of the invoker intended for a pessimistic caller.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   161
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   162
    private MethodHandle createInvokerForPessimisticCaller() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   163
        return createInvoker(Object.class, INVALID_PROGRAM_POINT);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   164
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   165
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   166
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   167
     * Compose a constructor from an invoker.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   168
     *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   169
     * @param invoker         invoker
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   170
     * @param needsCallee  do we need to pass a callee
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   171
     *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   172
     * @return the composed constructor
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   173
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   174
    private static MethodHandle createConstructorFromInvoker(final MethodHandle invoker) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   175
        final boolean needsCallee = ScriptFunctionData.needsCallee(invoker);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   176
        // If it was (callee, this, args...), permute it to (this, callee, args...). We're doing this because having
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   177
        // "this" in the first argument position is what allows the elegant folded composition of
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   178
        // (newFilter x constructor x allocator) further down below in the code. Also, ensure the composite constructor
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   179
        // always returns Object.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   180
        final MethodHandle swapped = needsCallee ? swapCalleeAndThis(invoker) : invoker;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   181
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   182
        final MethodHandle returnsObject = MH.asType(swapped, swapped.type().changeReturnType(Object.class));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   183
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   184
        final MethodType ctorType = returnsObject.type();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   185
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   186
        // Construct a dropping type list for NEWFILTER, but don't include constructor "this" into it, so it's actually
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   187
        // captured as "allocation" parameter of NEWFILTER after we fold the constructor into it.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   188
        // (this, [callee, ]args...) => ([callee, ]args...)
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   189
        final Class<?>[] ctorArgs = ctorType.dropParameterTypes(0, 1).parameterArray();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   190
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   191
        // Fold constructor into newFilter that replaces the return value from the constructor with the originally
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   192
        // allocated value when the originally allocated value is a JS primitive (String, Boolean, Number).
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   193
        // (result, this, [callee, ]args...) x (this, [callee, ]args...) => (this, [callee, ]args...)
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   194
        final MethodHandle filtered = MH.foldArguments(MH.dropArguments(NEWFILTER, 2, ctorArgs), returnsObject);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   195
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   196
        // allocate() takes a ScriptFunction and returns a newly allocated ScriptObject...
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   197
        if (needsCallee) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   198
            // ...we either fold it into the previous composition, if we need both the ScriptFunction callee object and
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   199
            // the newly allocated object in the arguments, so (this, callee, args...) x (callee) => (callee, args...),
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   200
            // or...
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   201
            return MH.foldArguments(filtered, ScriptFunction.ALLOCATE);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   202
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   203
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   204
        // ...replace the ScriptFunction argument with the newly allocated object, if it doesn't need the callee
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   205
        // (this, args...) filter (callee) => (callee, args...)
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   206
        return MH.filterArguments(filtered, 0, ScriptFunction.ALLOCATE);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   207
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   208
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   209
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   210
     * Permutes the parameters in the method handle from {@code (callee, this, ...)} to {@code (this, callee, ...)}.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   211
     * Used when creating a constructor handle.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   212
     * @param mh a method handle with order of arguments {@code (callee, this, ...)}
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   213
     * @return a method handle with order of arguments {@code (this, callee, ...)}
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   214
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   215
    private static MethodHandle swapCalleeAndThis(final MethodHandle mh) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   216
        final MethodType type = mh.type();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   217
        assert type.parameterType(0) == ScriptFunction.class : type;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   218
        assert type.parameterType(1) == Object.class : type;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   219
        final MethodType newType = type.changeParameterType(0, Object.class).changeParameterType(1, ScriptFunction.class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   220
        final int[] reorder = new int[type.parameterCount()];
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   221
        reorder[0] = 1;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   222
        assert reorder[1] == 0;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   223
        for (int i = 2; i < reorder.length; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   224
            reorder[i] = i;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   225
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   226
        return MethodHandles.permuteArguments(mh, newType, reorder);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   227
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   228
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   229
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   230
     * Returns an invoker method handle for this function when invoked as a constructor. Note that the handle is safely
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   231
     * composable in the sense that you can compose it with other handles using any combinators even if you can't affect
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   232
     * call site invalidation. If this compiled function is non-optimistic, then it returns the same value as
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   233
     * {@link #getConstructor()}. However, if the function is optimistic, then this handle will incur an overhead as it
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   234
     * will add an intermediate internal call site that can relink itself when the function needs to regenerate its code
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   235
     * to always point at the latest generated code version.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   236
     * @return a guaranteed composable constructor method handle for this function.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   237
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   238
    MethodHandle createComposableConstructor() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   239
        return createComposableInvoker(true);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   240
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   241
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   242
    boolean hasConstructor() {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   243
        return constructor != null;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   244
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   245
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   246
    MethodType type() {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   247
        return invoker.type();
20570
b1c8d1e8013a 8025965: Specialized functions with same weight replace each other in TreeSet
hannesw
parents: 17756
diff changeset
   248
    }
b1c8d1e8013a 8025965: Specialized functions with same weight replace each other in TreeSet
hannesw
parents: 17756
diff changeset
   249
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   250
    int weight() {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   251
        return weight(type());
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   252
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   253
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   254
    private static int weight(final MethodType type) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   255
        if (isVarArgsType(type)) {
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   256
            return Integer.MAX_VALUE; //if there is a varargs it should be the heavist and last fallback
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   257
        }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   258
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   259
        int weight = Type.typeFor(type.returnType()).getWeight();
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   260
        for (int i = 0 ; i < type.parameterCount() ; i++) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   261
            final Class<?> paramType = type.parameterType(i);
17518
2225a4f929c0 8013477: Node.setSymbol needs to be copy on write - enable IR snapshots for recompilation based on callsite type specialization. [not enabled by default, hidden by a flag for now]
lagergren
parents: 16523
diff changeset
   262
            final int pweight = Type.typeFor(paramType).getWeight() * 2; //params are more important than call types as return values are always specialized
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   263
            weight += pweight;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   264
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   265
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   266
        weight += type.parameterCount(); //more params outweigh few parameters
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   267
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   268
        return weight;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   269
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   270
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   271
    static boolean isVarArgsType(final MethodType type) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   272
        assert type.parameterCount() >= 1 : type;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   273
        return type.parameterType(type.parameterCount() - 1) == Object[].class;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   274
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   275
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   276
    static boolean moreGenericThan(final MethodType mt0, final MethodType mt1) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   277
        return weight(mt0) > weight(mt1);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   278
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   279
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   280
    boolean betterThanFinal(final CompiledFunction other, final MethodType callSiteMethodType) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   281
        // Prefer anything over nothing, as we can't compile new versions.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   282
        if (other == null) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   283
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   284
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   285
        return betterThanFinal(type(), other.type(), callSiteMethodType);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   286
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   287
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   288
    static boolean betterThanFinal(final MethodType thisMethodType, final MethodType otherMethodType, final MethodType callSiteMethodType) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   289
        final int thisParamCount = getParamCount(thisMethodType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   290
        final int otherParamCount = getParamCount(otherMethodType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   291
        final int callSiteRawParamCount = getParamCount(callSiteMethodType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   292
        final boolean csVarArg = callSiteRawParamCount == Integer.MAX_VALUE;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   293
        // Subtract 1 for callee for non-vararg call sites
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   294
        final int callSiteParamCount = csVarArg ? callSiteRawParamCount : callSiteRawParamCount - 1;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   295
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   296
        // Prefer the function that discards less parameters
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   297
        final int thisDiscardsParams = Math.max(callSiteParamCount - thisParamCount, 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   298
        final int otherDiscardsParams = Math.max(callSiteParamCount - otherParamCount, 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   299
        if(thisDiscardsParams < otherDiscardsParams) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   300
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   301
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   302
        if(thisDiscardsParams > otherDiscardsParams) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   303
            return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   304
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   305
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   306
        final boolean thisVarArg = thisParamCount == Integer.MAX_VALUE;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   307
        final boolean otherVarArg = otherParamCount == Integer.MAX_VALUE;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   308
        if(!(thisVarArg && otherVarArg && csVarArg)) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   309
            // At least one of them isn't vararg
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   310
            final Type[] thisType = toTypeWithoutCallee(thisMethodType, 0); // Never has callee
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   311
            final Type[] otherType = toTypeWithoutCallee(otherMethodType, 0); // Never has callee
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   312
            final Type[] callSiteType = toTypeWithoutCallee(callSiteMethodType, 1); // Always has callee
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   313
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   314
            int narrowWeightDelta = 0;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   315
            int widenWeightDelta = 0;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   316
            final int minParamsCount = Math.min(Math.min(thisParamCount, otherParamCount), callSiteParamCount);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   317
            for(int i = 0; i < minParamsCount; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   318
                final int callSiteParamWeight = getParamType(i, callSiteType, csVarArg).getWeight();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   319
                // Delta is negative for narrowing, positive for widening
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   320
                final int thisParamWeightDelta = getParamType(i, thisType, thisVarArg).getWeight() - callSiteParamWeight;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   321
                final int otherParamWeightDelta = getParamType(i, otherType, otherVarArg).getWeight() - callSiteParamWeight;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   322
                // Only count absolute values of narrowings
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   323
                narrowWeightDelta += Math.max(-thisParamWeightDelta, 0) - Math.max(-otherParamWeightDelta, 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   324
                // Only count absolute values of widenings
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   325
                widenWeightDelta += Math.max(thisParamWeightDelta, 0) - Math.max(otherParamWeightDelta, 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   326
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   327
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   328
            // If both functions accept more arguments than what is passed at the call site, account for ability
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   329
            // to receive Undefined un-narrowed in the remaining arguments.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   330
            if(!thisVarArg) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   331
                for(int i = callSiteParamCount; i < thisParamCount; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   332
                    narrowWeightDelta += Math.max(Type.OBJECT.getWeight() - thisType[i].getWeight(), 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   333
                }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   334
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   335
            if(!otherVarArg) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   336
                for(int i = callSiteParamCount; i < otherParamCount; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   337
                    narrowWeightDelta -= Math.max(Type.OBJECT.getWeight() - otherType[i].getWeight(), 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   338
                }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   339
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   340
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   341
            // Prefer function that narrows less
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   342
            if(narrowWeightDelta < 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   343
                return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   344
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   345
            if(narrowWeightDelta > 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   346
                return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   347
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   348
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   349
            // Prefer function that widens less
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   350
            if(widenWeightDelta < 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   351
                return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   352
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   353
            if(widenWeightDelta > 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   354
                return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   355
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   356
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   357
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   358
        // Prefer the function that exactly matches the arity of the call site.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   359
        if(thisParamCount == callSiteParamCount && otherParamCount != callSiteParamCount) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   360
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   361
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   362
        if(thisParamCount != callSiteParamCount && otherParamCount == callSiteParamCount) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   363
            return false;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   364
        }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   365
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   366
        // Otherwise, neither function matches arity exactly. We also know that at this point, they both can receive
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   367
        // more arguments than call site, otherwise we would've already chosen the one that discards less parameters.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   368
        // Note that variable arity methods are preferred, as they actually match the call site arity better, since they
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   369
        // really have arbitrary arity.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   370
        if(thisVarArg) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   371
            if(!otherVarArg) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   372
                return true; //
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   373
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   374
        } else if(otherVarArg) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   375
            return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   376
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   377
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   378
        // Neither is variable arity; chose the one that has less extra parameters.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   379
        final int fnParamDelta = thisParamCount - otherParamCount;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   380
        if(fnParamDelta < 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   381
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   382
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   383
        if(fnParamDelta > 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   384
            return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   385
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   386
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   387
        final int callSiteRetWeight = Type.typeFor(callSiteMethodType.returnType()).getWeight();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   388
        // Delta is negative for narrower return type, positive for wider return type
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   389
        final int thisRetWeightDelta = Type.typeFor(thisMethodType.returnType()).getWeight() - callSiteRetWeight;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   390
        final int otherRetWeightDelta = Type.typeFor(otherMethodType.returnType()).getWeight() - callSiteRetWeight;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   391
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   392
        // Prefer function that returns a less wide return type
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   393
        final int widenRetDelta = Math.max(thisRetWeightDelta, 0) - Math.max(otherRetWeightDelta, 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   394
        if(widenRetDelta < 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   395
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   396
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   397
        if(widenRetDelta > 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   398
            return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   399
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   400
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   401
        // Prefer function that returns a less narrow return type
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   402
        final int narrowRetDelta = Math.max(-thisRetWeightDelta, 0) - Math.max(-otherRetWeightDelta, 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   403
        if(narrowRetDelta < 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   404
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   405
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   406
        if(narrowRetDelta > 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   407
            return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   408
        }
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   409
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   410
        throw new AssertionError(thisMethodType + " identically applicable to " + otherMethodType + " for " + callSiteMethodType); // Signatures are identical
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   411
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   412
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   413
    private static Type[] toTypeWithoutCallee(final MethodType type, final int thisIndex) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   414
        final int paramCount = type.parameterCount();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   415
        final Type[] t = new Type[paramCount - thisIndex];
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   416
        for(int i = thisIndex; i < paramCount; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   417
            t[i - thisIndex] = Type.typeFor(type.parameterType(i));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   418
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   419
        return t;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   420
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   421
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   422
    private static Type getParamType(final int i, final Type[] paramTypes, final boolean isVarArg) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   423
        final int fixParamCount = paramTypes.length - (isVarArg ? 1 : 0);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   424
        if(i < fixParamCount) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   425
            return paramTypes[i];
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   426
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   427
        assert isVarArg;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   428
        return ((ArrayType)paramTypes[paramTypes.length - 1]).getElementType();
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   429
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   430
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   431
    boolean matchesCallSite(final MethodType callSiteType, final boolean pickVarArg) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   432
        if (!ScriptEnvironment.globalOptimistic()) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   433
            // Without optimistic recompilation, always choose the first eagerly compiled version.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   434
            return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   435
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   436
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   437
        final MethodType type  = type();
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   438
        final int fnParamCount = getParamCount(type);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   439
        final boolean isVarArg = fnParamCount == Integer.MAX_VALUE;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   440
        if (isVarArg) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   441
            return pickVarArg;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   442
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   443
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   444
        final int csParamCount = getParamCount(callSiteType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   445
        final boolean csIsVarArg = csParamCount == Integer.MAX_VALUE;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   446
        final int thisThisIndex = needsCallee() ? 1 : 0; // Index of "this" parameter in this function's type
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   447
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   448
        final int fnParamCountNoCallee = fnParamCount - thisThisIndex;
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   449
        final int minParams = Math.min(csParamCount - 1, fnParamCountNoCallee); // callSiteType always has callee, so subtract 1
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   450
        // We must match all incoming parameters, except "this". Starting from 1 to skip "this".
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   451
        for(int i = 1; i < minParams; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   452
            final Type fnType = Type.typeFor(type.parameterType(i + thisThisIndex));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   453
            final Type csType = csIsVarArg ? Type.OBJECT : Type.typeFor(callSiteType.parameterType(i + 1));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   454
            if(!fnType.isEquivalentTo(csType)) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   455
                return false;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   456
            }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   457
        }
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   458
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   459
        // Must match any undefined parameters to Object type.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   460
        for(int i = minParams; i < fnParamCountNoCallee; ++i) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   461
            if(!Type.typeFor(type.parameterType(i + thisThisIndex)).isEquivalentTo(Type.OBJECT)) {
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   462
                return false;
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   463
            }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   464
        }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   465
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   466
        return true;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   467
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   468
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   469
    private static int getParamCount(final MethodType type) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   470
        final int paramCount = type.parameterCount();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   471
        return type.parameterType(paramCount - 1).isArray() ? Integer.MAX_VALUE : paramCount;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   472
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   473
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   474
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   475
     * Returns the switch point embodying the optimistic assumptions in this compiled function. It should be used to
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   476
     * guard any linking to the function's invoker or constructor.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   477
     * @return the switch point embodying the optimistic assumptions in this compiled function. Null is returned if the
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   478
     * function has no optimistic assumptions.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   479
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   480
    SwitchPoint getOptimisticAssumptionsSwitchPoint() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   481
        return isOptimistic() ? optimismInfo.optimisticAssumptions : null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   482
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   483
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   484
    boolean isOptimistic() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   485
        return optimismInfo != null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   486
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   487
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   488
    private MethodHandle createComposableInvoker(final boolean isConstructor) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   489
        final MethodHandle handle = getInvokerOrConstructor(isConstructor);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   490
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   491
        // If compiled function is not optimistic, it can't ever change its invoker/constructor, so just return them
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   492
        // directly.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   493
        if(!isOptimistic()) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   494
            return handle;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   495
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   496
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   497
        // Otherwise, we need a new level of indirection; need to introduce a mutable call site that can relink itslef
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   498
        // to the compiled function's changed target whenever the optimistic assumptions are invalidated.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   499
        final CallSite cs = new MutableCallSite(handle.type());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   500
        relinkComposableInvoker(cs, this, isConstructor);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   501
        return cs.dynamicInvoker();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   502
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   503
    private static void relinkComposableInvoker(final CallSite cs, final CompiledFunction inv, final boolean constructor) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   504
        final MethodHandle handle = inv.getInvokerOrConstructor(constructor);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   505
        final SwitchPoint assumptions = inv.getOptimisticAssumptionsSwitchPoint();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   506
        final MethodHandle target;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   507
        if(assumptions == null) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   508
            target = handle;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   509
        } else {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   510
            // This assertion can obviously fail in a multithreaded environment, as we can be in a situation where
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   511
            // one thread is in the middle of a deoptimizing compilation when we hit this and thus, it has invalidated
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   512
            // the old switch point, but hasn't created the new one yet. Note that the behavior of invalidating the old
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   513
            // switch point before recompilation, and only creating the new one after recompilation is by design.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   514
            // TODO: We need to think about thread safety of CompiledFunction objects.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   515
            assert !assumptions.hasBeenInvalidated();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   516
            final MethodHandle relink = MethodHandles.insertArguments(RELINK_COMPOSABLE_INVOKER, 0, cs, inv, constructor);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   517
            target = assumptions.guardWithTest(handle, MethodHandles.foldArguments(cs.dynamicInvoker(), relink));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   518
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   519
        cs.setTarget(target);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   520
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   521
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   522
    private MethodHandle getInvokerOrConstructor(final boolean selectCtor) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   523
        return selectCtor ? getConstructor() : createInvokerForPessimisticCaller();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   524
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   525
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   526
    MethodHandle createInvoker(final Class<?> callSiteReturnType, final int callerProgramPoint) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   527
        final boolean isOptimistic = isOptimistic();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   528
        MethodHandle handleRewriteException = isOptimistic ? createRewriteExceptionHandler() : null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   529
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   530
        MethodHandle inv = invoker;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   531
        if(isValid(callerProgramPoint)) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   532
            inv = OptimisticReturnFilters.filterOptimisticReturnValue(inv, callSiteReturnType, callerProgramPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   533
            if(callSiteReturnType.isPrimitive() && handleRewriteException != null) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   534
                // because handleRewriteException always returns Object
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   535
                handleRewriteException = OptimisticReturnFilters.filterOptimisticReturnValue(handleRewriteException,
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   536
                        callSiteReturnType, callerProgramPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   537
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   538
        } else if(isOptimistic) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   539
            // Required so that rewrite exception has the same return type. It'd be okay to do it even if we weren't
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   540
            // optimistic, but it isn't necessary as the linker upstream will eventually convert the return type.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   541
            inv = changeReturnType(inv, callSiteReturnType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   542
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   543
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   544
        if(isOptimistic) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   545
            assert handleRewriteException != null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   546
            final MethodHandle typedHandleRewriteException = changeReturnType(handleRewriteException, inv.type().returnType());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   547
            return MH.catchException(inv, RewriteException.class, typedHandleRewriteException);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   548
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   549
        return inv;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   550
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   551
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   552
    private MethodHandle createRewriteExceptionHandler() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   553
        return MH.foldArguments(RESTOF_INVOKER, MH.insertArguments(HANDLE_REWRITE_EXCEPTION, 0, this, optimismInfo));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   554
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   555
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   556
    private static MethodHandle changeReturnType(final MethodHandle mh, final Class<?> newReturnType) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   557
        return Bootstrap.getLinkerServices().asType(mh, mh.type().changeReturnType(newReturnType));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   558
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   559
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   560
    @SuppressWarnings("unused")
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   561
    private static MethodHandle handleRewriteException(final CompiledFunction function, final OptimismInfo oldOptimismInfo, final RewriteException re) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   562
        return function.handleRewriteException(oldOptimismInfo, re);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   563
    }
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   564
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   565
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   566
     * Handles a {@link RewriteException} raised during the execution of this function by recompiling (if needed) the
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   567
     * function with an optimistic assumption invalidated at the program point indicated by the exception, and then
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   568
     * executing a rest-of method to complete the execution with the deoptimized version.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   569
     * @param oldOptimismInfo the optimism info of this function. We must store it explicitly as a bound argument in the
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   570
     * method handle, otherwise it would be null for handling a rewrite exception in an outer invocation of a recursive
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   571
     * function when inner invocations of the function have completely deoptimized it.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   572
     * @param re the rewrite exception that was raised
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   573
     * @return the method handle for the rest-of method, for folding composition.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   574
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   575
    private MethodHandle handleRewriteException(final OptimismInfo oldOptimismInfo, final RewriteException re) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   576
        final MethodType type = type();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   577
        // Compiler needs a call site type as its input, which always has a callee parameter, so we must add it if
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   578
        // this function doesn't have a callee parameter.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   579
        final MethodType callSiteType = type.parameterType(0) == ScriptFunction.class ? type : type.insertParameterTypes(0, ScriptFunction.class);
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   580
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   581
        final FunctionNode fn = oldOptimismInfo.recompile(callSiteType, re);
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
   582
        if (log.isEnabled()) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
   583
            log.info(new RecompilationEvent(Level.INFO, re, re.getReturnValueNonDestructive()), "\tRewriteException ", re.getMessageShort());
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24729
diff changeset
   584
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   585
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   586
        // It didn't necessarily recompile, e.g. for an outer invocation of a recursive function if we already
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   587
        // recompiled a deoptimized version for an inner invocation.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   588
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   589
        final boolean isOptimistic;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   590
        if (fn != null) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   591
            //is recompiled
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   592
            assert optimismInfo == oldOptimismInfo;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   593
            isOptimistic = fn.isOptimistic();
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
   594
            if (log.isEnabled()) {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
   595
                log.info("Recompiled '", fn.getName(), "' (", Debug.id(this), ")", isOptimistic ? " remains optimistic." : " is no longer optimistic.");
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   596
            }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   597
            final MethodHandle newInvoker = oldOptimismInfo.data.lookup(fn);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   598
            invoker = newInvoker.asType(type.changeReturnType(newInvoker.type().returnType()));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   599
            constructor = null; // Will be regenerated when needed
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   600
            // Note that we only adjust the switch point after we set the invoker/constructor. This is important.
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24729
diff changeset
   601
            if (isOptimistic) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   602
                // Otherwise, set a new switch point.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   603
                oldOptimismInfo.newOptimisticAssumptions();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   604
            } else {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   605
                // If we got to a point where we no longer have optimistic assumptions, let the optimism info go.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   606
                optimismInfo = null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   607
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   608
        } else {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   609
            isOptimistic = isOptimistic();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   610
            assert !isOptimistic || optimismInfo == oldOptimismInfo;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   611
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   612
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   613
        final MethodHandle restOf = changeReturnType(oldOptimismInfo.compileRestOfMethod(callSiteType, re), Object.class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   614
        // If rest-of is itself optimistic, we must make sure that we can repeat a deoptimization if it, too hits an exception.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   615
        return isOptimistic ? MH.catchException(restOf, RewriteException.class, createRewriteExceptionHandler()) : restOf;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   616
    }
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   617
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   618
    private static class OptimismInfo {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   619
        // TODO: this is pointing to its owning ScriptFunctionData. Re-evaluate if that's okay.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   620
        private final RecompilableScriptFunctionData data;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   621
        private final Map<Integer, Type> invalidatedProgramPoints = new TreeMap<>();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   622
        private SwitchPoint optimisticAssumptions;
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
   623
        private final DebugLogger log = Global.instance().getLogger(RecompilableScriptFunctionData.class);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   624
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   625
        OptimismInfo(final RecompilableScriptFunctionData data) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   626
            this.data = data;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   627
            newOptimisticAssumptions();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   628
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   629
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   630
        private void newOptimisticAssumptions() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   631
            optimisticAssumptions = new SwitchPoint();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   632
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   633
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   634
        FunctionNode recompile(final MethodType callSiteType, final RewriteException e) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   635
            final Type retType = e.getReturnType();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   636
            final Type previousFailedType = invalidatedProgramPoints.put(e.getProgramPoint(), retType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   637
            if (previousFailedType != null && !previousFailedType.narrowerThan(retType)) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   638
                final StackTraceElement[] stack = e.getStackTrace();
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24731
diff changeset
   639
                final String functionId = stack.length == 0 ? data.getName() : stack[0].getClassName() + "." + stack[0].getMethodName();
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24742
diff changeset
   640
                log.info("RewriteException for an already invalidated program point ", e.getProgramPoint(), " in ", functionId, ". This is okay for a recursive function invocation, but a bug otherwise.");
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   641
                return null;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   642
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   643
            SwitchPoint.invalidateAll(new SwitchPoint[] { optimisticAssumptions });
24740
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   644
            return data.compile(callSiteType, invalidatedProgramPoints, e.getRuntimeScope(), "Deoptimizing recompilation", data.getDefaultTransform(callSiteType));
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   645
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   646
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   647
        MethodHandle compileRestOfMethod(final MethodType callSiteType, final RewriteException e) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   648
            final int[] prevEntryPoints = e.getPreviousContinuationEntryPoints();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   649
            final int[] entryPoints;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   650
            if(prevEntryPoints == null) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   651
                entryPoints = new int[1];
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   652
            } else {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   653
                final int l = prevEntryPoints.length;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   654
                entryPoints = new int[l + 1];
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   655
                System.arraycopy(prevEntryPoints, 0, entryPoints, 1, l);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   656
            }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   657
            entryPoints[0] = e.getProgramPoint();
24740
26791be09688 8040089: Apply to call transform was incomplete. Now passes all tests and performance is back
lagergren
parents: 24738
diff changeset
   658
            return data.compileRestOfMethod(callSiteType, invalidatedProgramPoints, entryPoints, e.getRuntimeScope(), data.getDefaultTransform(callSiteType));
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   659
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   660
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   661
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   662
    @SuppressWarnings("unused")
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   663
    private static Object newFilter(final Object result, final Object allocation) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   664
        return (result instanceof ScriptObject || !JSType.isPrimitive(result))? result : allocation;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   665
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   666
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   667
    private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   668
        return MH.findStatic(MethodHandles.lookup(), CompiledFunction.class, name, MH.type(rtype, types));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 20570
diff changeset
   669
    }
16523
af8b30edebce 8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/specialization. Got rid of ScriptFunctionImplTrampoline whose semantics could be done as part of the relinking anyway. Merge with the lookup package change.
lagergren
parents:
diff changeset
   670
}