nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java
author attila
Mon, 02 Mar 2015 14:33:55 +0100
changeset 29282 a8523237b66c
parent 26768 751b0f427090
child 30393 0e005bd1de13
permissions -rw-r--r--
8074031: Canonicalize is-a-JS-string tests Reviewed-by: hannesw, lagergren
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     1
/*
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     4
 *
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    10
 *
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    15
 * accompanied this code).
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    16
 *
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    20
 *
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    23
 * questions.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    24
 */
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    25
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime;
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    27
17744
65849f87aa28 8011718: binding already bound function with extra arguments fails
attila
parents: 16523
diff changeset
    28
import static jdk.nashorn.internal.lookup.Lookup.MH;
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
    29
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
    30
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 26768
diff changeset
    31
24769
attila
parents: 24753 23767
diff changeset
    32
import java.io.IOException;
attila
parents: 24753 23767
diff changeset
    33
import java.io.ObjectInputStream;
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23375
diff changeset
    34
import java.io.Serializable;
16225
81d58c2b9fcf 8006943: Fix order of function method arguments to be (callee, thisObject)
attila
parents: 16216
diff changeset
    35
import java.lang.invoke.MethodHandle;
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
    36
import java.lang.invoke.MethodHandles;
16225
81d58c2b9fcf 8006943: Fix order of function method arguments to be (callee, thisObject)
attila
parents: 16216
diff changeset
    37
import java.lang.invoke.MethodType;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
    38
import java.util.Collection;
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    39
import java.util.LinkedList;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    40
import java.util.List;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    41
import jdk.nashorn.internal.runtime.linker.LinkerCallSite;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    42
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    43
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    44
/**
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    45
 * A container for data needed to instantiate a specific {@link ScriptFunction} at runtime.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    46
 * Instances of this class are created during codegen and stored in script classes'
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    47
 * constants array to reduce function instantiation overhead during runtime.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    48
 */
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23375
diff changeset
    49
public abstract class ScriptFunctionData implements Serializable {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    50
    static final int MAX_ARITY = LinkerCallSite.ARGLIMIT;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    51
    static {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    52
        // Assert it fits in a byte, as that's what we store it in. It's just a size optimization though, so if needed
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    53
        // "byte arity" field can be widened.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    54
        assert MAX_ARITY < 256;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    55
    }
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    56
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    57
    /** Name of the function or "" for anonymous functions */
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: 16277
diff changeset
    58
    protected final String name;
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: 16277
diff changeset
    59
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    60
    /**
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    61
     * A list of code versions of a function sorted in ascending order of generic descriptors.
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    62
     */
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    63
    protected transient LinkedList<CompiledFunction> code = new LinkedList<>();
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    64
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    65
    /** Function flags */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    66
    protected int flags;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    67
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    68
    // Parameter arity of the function, corresponding to "f.length". E.g. "function f(a, b, c) { ... }" arity is 3, and
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    69
    // some built-in ECMAScript functions have their arity declared by the specification. Note that regardless of this
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
    70
    // value, the function might still be capable of receiving variable number of arguments, see isVariableArity.
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    71
    private int arity;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    72
24753
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
    73
    /**
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
    74
     * A pair of method handles used for generic invoker and constructor. Field is volatile as it can be initialized by
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
    75
     * multiple threads concurrently, but we still tolerate a race condition in it as all values stored into it are
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
    76
     * idempotent.
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
    77
     */
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
    78
    private volatile transient GenericInvokers genericInvokers;
24753
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
    79
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: 16277
diff changeset
    80
    private static final MethodHandle BIND_VAR_ARGS = findOwnMH("bindVarArgs", Object[].class, Object[].class, Object[].class);
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
    81
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    82
    /** Is this a strict mode function? */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    83
    public static final int IS_STRICT      = 1 << 0;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    84
    /** Is this a built-in function? */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    85
    public static final int IS_BUILTIN     = 1 << 1;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    86
    /** Is this a constructor function? */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    87
    public static final int IS_CONSTRUCTOR = 1 << 2;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    88
    /** Does this function expect a callee argument? */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    89
    public static final int NEEDS_CALLEE   = 1 << 3;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    90
    /** Does this function make use of the this-object argument? */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    91
    public static final int USES_THIS      = 1 << 4;
24727
attila
parents: 24720 23375
diff changeset
    92
    /** Is this a variable arity function? */
attila
parents: 24720 23375
diff changeset
    93
    public static final int IS_VARIABLE_ARITY = 1 << 5;
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    94
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    95
    /** Flag for strict or built-in functions */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    96
    public static final int IS_STRICT_OR_BUILTIN = IS_STRICT | IS_BUILTIN;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    97
    /** Flag for built-in constructors */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    98
    public static final int IS_BUILTIN_CONSTRUCTOR = IS_BUILTIN | IS_CONSTRUCTOR;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
    99
    /** Flag for strict constructors */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   100
    public static final int IS_STRICT_CONSTRUCTOR = IS_STRICT | IS_CONSTRUCTOR;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   101
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23375
diff changeset
   102
    private static final long serialVersionUID = 4252901245508769114L;
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 23375
diff changeset
   103
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   104
    /**
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   105
     * Constructor
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16228
diff changeset
   106
     *
24727
attila
parents: 24720 23375
diff changeset
   107
     * @param name  script function name
attila
parents: 24720 23375
diff changeset
   108
     * @param arity arity
attila
parents: 24720 23375
diff changeset
   109
     * @param flags the function flags
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   110
     */
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   111
    ScriptFunctionData(final String name, final int arity, final int flags) {
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   112
        this.name  = name;
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   113
        this.flags = flags;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   114
        setArity(arity);
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   115
    }
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   116
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: 16277
diff changeset
   117
    final int getArity() {
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   118
        return arity;
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   119
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   120
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   121
    final boolean isVariableArity() {
24727
attila
parents: 24720 23375
diff changeset
   122
        return (flags & IS_VARIABLE_ARITY) != 0;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   123
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   124
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   125
    /**
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: 16277
diff changeset
   126
     * Used from e.g. Native*$Constructors as an explicit call. TODO - make arity immutable and final
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: 16277
diff changeset
   127
     * @param arity new arity
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   128
     */
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: 16277
diff changeset
   129
    void setArity(final int arity) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   130
        if(arity < 0 || arity > MAX_ARITY) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   131
            throw new IllegalArgumentException(String.valueOf(arity));
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   132
        }
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   133
        this.arity = arity;
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   134
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   135
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: 16277
diff changeset
   136
    CompiledFunction bind(final CompiledFunction originalInv, final ScriptFunction fn, final Object self, final Object[] args) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   137
        final MethodHandle boundInvoker = bindInvokeHandle(originalInv.createComposableInvoker(), fn, self, args);
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: 16277
diff changeset
   138
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: 16277
diff changeset
   139
        if (isConstructor()) {
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   140
            return new CompiledFunction(boundInvoker, bindConstructHandle(originalInv.createComposableConstructor(), fn, args), null);
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: 16277
diff changeset
   141
        }
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: 16277
diff changeset
   142
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   143
        return new CompiledFunction(boundInvoker);
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   144
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   145
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   146
    /**
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: 16277
diff changeset
   147
     * Is this a ScriptFunction generated with strict semantics?
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: 16277
diff changeset
   148
     * @return true if strict, false otherwise
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
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: 16277
diff changeset
   150
    public boolean isStrict() {
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   151
        return (flags & IS_STRICT) != 0;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   152
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   153
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   154
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   155
     * Return the complete internal function name for this
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   156
     * data, not anonymous or similar. May be identical
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   157
     * @return internal function name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   158
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   159
    protected String getFunctionName() {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   160
        return getName();
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   161
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   162
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: 16277
diff changeset
   163
    boolean isBuiltin() {
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   164
        return (flags & IS_BUILTIN) != 0;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   165
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   166
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: 16277
diff changeset
   167
    boolean isConstructor() {
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   168
        return (flags & IS_CONSTRUCTOR) != 0;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   169
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   170
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   171
    abstract boolean needsCallee();
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   172
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   173
    /**
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   174
     * Returns true if this is a non-strict, non-built-in function that requires non-primitive this argument
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   175
     * according to ECMA 10.4.3.
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   176
     * @return true if this argument must be an object
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   177
     */
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   178
    boolean needsWrappedThis() {
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   179
        return (flags & USES_THIS) != 0 && (flags & IS_STRICT_OR_BUILTIN) == 0;
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: 16277
diff changeset
   180
    }
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: 16277
diff changeset
   181
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: 16277
diff changeset
   182
    String toSource() {
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: 16277
diff changeset
   183
        return "function " + (name == null ? "" : name) + "() { [native 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: 16277
diff changeset
   184
    }
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: 16277
diff changeset
   185
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: 16277
diff changeset
   186
    String getName() {
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: 16277
diff changeset
   187
        return name;
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: 16277
diff changeset
   188
    }
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: 16277
diff changeset
   189
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: 16277
diff changeset
   190
    /**
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: 16277
diff changeset
   191
     * Get this function as a String containing its source code. If no source 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: 16277
diff changeset
   192
     * exists in this ScriptFunction, its contents will be displayed as {@code [native 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: 16277
diff changeset
   193
     *
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: 16277
diff changeset
   194
     * @return string representation of this function
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: 16277
diff changeset
   195
     */
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: 16277
diff changeset
   196
    @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: 16277
diff changeset
   197
    public String toString() {
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   198
        return name.isEmpty() ? "<anonymous>" : name;
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   199
    }
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   200
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   201
    /**
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   202
     * Verbose description of data
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   203
     * @return verbose description
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   204
     */
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
   205
    public String toStringVerbose() {
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: 16277
diff changeset
   206
        final StringBuilder sb = new StringBuilder();
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: 16277
diff changeset
   207
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: 16277
diff changeset
   208
        sb.append("name='").
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: 16277
diff changeset
   209
                append(name.isEmpty() ? "<anonymous>" : name).
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: 16277
diff changeset
   210
                append("' ").
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: 16277
diff changeset
   211
                append(code.size()).
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: 16277
diff changeset
   212
                append(" invokers=").
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: 16277
diff changeset
   213
                append(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: 16277
diff changeset
   214
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: 16277
diff changeset
   215
        return sb.toString();
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   216
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   217
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   218
    /**
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: 16277
diff changeset
   219
     * Pick the best invoker, i.e. the one version of this method with as narrow and specific
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: 16277
diff changeset
   220
     * types as possible. If the call site arguments are objects, but boxed primitives we can
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: 16277
diff changeset
   221
     * also try to get a primitive version of the method and do an unboxing filter, but then
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: 16277
diff changeset
   222
     * we need to insert a guard that checks the argument is really always a boxed primitive
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: 16277
diff changeset
   223
     * and not suddenly a "real" object
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: 16277
diff changeset
   224
     *
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: 16277
diff changeset
   225
     * @param callSiteType callsite type
26053
8137f95db5e8 8046026: CompiledFunction.relinkComposableInvoker assert is being hit
attila
parents: 24881
diff changeset
   226
     * @return compiled function object representing the best invoker.
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   227
     */
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   228
    final CompiledFunction getBestInvoker(final MethodType callSiteType, final ScriptObject runtimeScope) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   229
        return getBestInvoker(callSiteType, runtimeScope, CompiledFunction.NO_FUNCTIONS);
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   230
    }
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   231
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   232
    final CompiledFunction getBestInvoker(final MethodType callSiteType, final ScriptObject runtimeScope, final Collection<CompiledFunction> forbidden) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   233
        final CompiledFunction cf = getBest(callSiteType, runtimeScope, forbidden);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   234
        assert cf != null;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   235
        return cf;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   236
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   237
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   238
    final CompiledFunction getBestConstructor(final MethodType callSiteType, final ScriptObject runtimeScope, final Collection<CompiledFunction> forbidden) {
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: 16277
diff changeset
   239
        if (!isConstructor()) {
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: 16277
diff changeset
   240
            throw typeError("not.a.constructor", toSource());
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: 16277
diff changeset
   241
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   242
        // Constructor call sites don't have a "this", but getBest is meant to operate on "callee, this, ..." style
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   243
        final CompiledFunction cf = getBest(callSiteType.insertParameterTypes(1, Object.class), runtimeScope, forbidden);
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   244
        return cf;
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: 16277
diff changeset
   245
    }
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   246
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: 16277
diff changeset
   247
    /**
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   248
     * If we can have lazy code generation, this is a hook to ensure that the code has been compiled.
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
   249
     * This does not guarantee the code been installed in this {@code ScriptFunctionData} instance
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   250
     */
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   251
    protected void ensureCompiled() {
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   252
        //empty
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   253
    }
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   254
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   255
    /**
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: 16277
diff changeset
   256
     * Return a generic Object/Object invoker for this method. It will ensure 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: 16277
diff changeset
   257
     * is generated, get the most generic of all versions of this function and adapt 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: 16277
diff changeset
   258
     * to Objects.
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: 16277
diff changeset
   259
     *
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   260
     * @param runtimeScope the runtime scope. It can be used to evaluate types of scoped variables to guide the
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   261
     * optimistic compilation, should the call to this method trigger code compilation. Can be null if current runtime
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   262
     * scope is not known, but that might cause compilation of code that will need more deoptimization passes.
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: 16277
diff changeset
   263
     * @return generic invoker of this script function
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: 16277
diff changeset
   264
     */
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   265
    final MethodHandle getGenericInvoker(final ScriptObject runtimeScope) {
24753
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   266
        // This method has race conditions both on genericsInvoker and genericsInvoker.invoker, but even if invoked
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   267
        // concurrently, they'll create idempotent results, so it doesn't matter. We could alternatively implement this
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   268
        // using java.util.concurrent.AtomicReferenceFieldUpdater, but it's hardly worth it.
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   269
        final GenericInvokers lgenericInvokers = ensureGenericInvokers();
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   270
        MethodHandle invoker = lgenericInvokers.invoker;
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   271
        if(invoker == null) {
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   272
            lgenericInvokers.invoker = invoker = createGenericInvoker(runtimeScope);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   273
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   274
        return invoker;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   275
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   276
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   277
    private MethodHandle createGenericInvoker(final ScriptObject runtimeScope) {
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   278
        return makeGenericMethod(getGeneric(runtimeScope).createComposableInvoker());
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: 16277
diff changeset
   279
    }
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: 16277
diff changeset
   280
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   281
    final MethodHandle getGenericConstructor(final ScriptObject runtimeScope) {
24753
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   282
        // This method has race conditions both on genericsInvoker and genericsInvoker.constructor, but even if invoked
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   283
        // concurrently, they'll create idempotent results, so it doesn't matter. We could alternatively implement this
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   284
        // using java.util.concurrent.AtomicReferenceFieldUpdater, but it's hardly worth it.
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   285
        final GenericInvokers lgenericInvokers = ensureGenericInvokers();
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   286
        MethodHandle constructor = lgenericInvokers.constructor;
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   287
        if(constructor == null) {
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   288
            lgenericInvokers.constructor = constructor = createGenericConstructor(runtimeScope);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   289
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   290
        return 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: 16277
diff changeset
   291
    }
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: 16277
diff changeset
   292
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   293
    private MethodHandle createGenericConstructor(final ScriptObject runtimeScope) {
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   294
        return makeGenericMethod(getGeneric(runtimeScope).createComposableConstructor());
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   295
    }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   296
24753
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   297
    private GenericInvokers ensureGenericInvokers() {
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   298
        GenericInvokers lgenericInvokers = genericInvokers;
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   299
        if(lgenericInvokers == null) {
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   300
            genericInvokers = lgenericInvokers = new GenericInvokers();
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   301
        }
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   302
        return lgenericInvokers;
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   303
    }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   304
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   305
    private static MethodType widen(final MethodType cftype) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   306
        final Class<?>[] paramTypes = new Class<?>[cftype.parameterCount()];
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   307
        for (int i = 0; i < cftype.parameterCount(); i++) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   308
            paramTypes[i] = cftype.parameterType(i).isPrimitive() ? cftype.parameterType(i) : Object.class;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   309
        }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   310
        return MH.type(cftype.returnType(), paramTypes);
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   311
    }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   312
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   313
    /**
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   314
     * Used to find an apply to call version that fits this callsite.
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   315
     * We cannot just, as in the normal matcher case, return e.g. (Object, Object, int)
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   316
     * for (Object, Object, int, int, int) or we will destroy the semantics and get
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   317
     * a function that, when padded with undefineds, behaves differently
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   318
     * @param type actual call site type
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   319
     * @return apply to call that perfectly fits this callsite or null if none found
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   320
     */
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   321
    CompiledFunction lookupExactApplyToCall(final MethodType type) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   322
        for (final CompiledFunction cf : code) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   323
            if (!cf.isApplyToCall()) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   324
                continue;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   325
            }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   326
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   327
            final MethodType cftype = cf.type();
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   328
            if (cftype.parameterCount() != type.parameterCount()) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   329
                continue;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   330
            }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   331
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   332
            if (widen(cftype).equals(widen(type))) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   333
                return cf;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   334
            }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   335
        }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   336
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   337
        return null;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   338
    }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   339
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   340
    CompiledFunction pickFunction(final MethodType callSiteType, final boolean canPickVarArg) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   341
        for (final CompiledFunction candidate : code) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   342
            if (candidate.matchesCallSite(callSiteType, canPickVarArg)) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   343
                return candidate;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   344
            }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   345
        }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   346
        return null;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   347
    }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   348
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   349
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   350
     * Returns the best function for the specified call site type.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   351
     * @param callSiteType The call site type. Call site types are expected to have the form
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   352
     * {@code (callee, this[, args...])}.
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   353
     * @param runtimeScope the runtime scope. It can be used to evaluate types of scoped variables to guide the
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   354
     * optimistic compilation, should the call to this method trigger code compilation. Can be null if current runtime
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   355
     * scope is not known, but that might cause compilation of code that will need more deoptimization passes.
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   356
     * @return the best function for the specified call site type.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   357
     */
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   358
    CompiledFunction getBest(final MethodType callSiteType, final ScriptObject runtimeScope, final Collection<CompiledFunction> forbidden) {
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   359
        assert callSiteType.parameterCount() >= 2 : callSiteType; // Must have at least (callee, this)
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   360
        assert callSiteType.parameterType(0).isAssignableFrom(ScriptFunction.class) : callSiteType; // Callee must be assignable from script function
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   361
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   362
        if (isRecompilable()) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   363
            final CompiledFunction candidate = pickFunction(callSiteType, false);
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   364
            if (candidate != null) {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   365
                return candidate;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   366
            }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   367
            return pickFunction(callSiteType, true); //try vararg last
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   368
        }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   369
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   370
        CompiledFunction best = null;
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   371
        for (final CompiledFunction candidate: code) {
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   372
            if (!forbidden.contains(candidate) && candidate.betterThanFinal(best, callSiteType)) {
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   373
                best = candidate;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   374
            }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   375
        }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   376
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   377
        return best;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   378
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   379
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   380
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   381
    abstract boolean isRecompilable();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   382
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   383
    CompiledFunction getGeneric(final ScriptObject runtimeScope) {
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   384
        return getBest(getGenericType(), runtimeScope, CompiledFunction.NO_FUNCTIONS);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   385
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   386
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   387
    /**
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   388
     * Get a method type for a generic invoker.
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   389
     * @return the method type for the generic invoker
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   390
     */
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   391
    abstract MethodType getGenericType();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   392
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: 16277
diff changeset
   393
    /**
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: 16277
diff changeset
   394
     * Allocates an object using this function's allocator.
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   395
     *
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   396
     * @param map the property map for the allocated 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: 16277
diff changeset
   397
     * @return the object allocated using this function's allocator, or null if the function doesn't have an allocator.
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: 16277
diff changeset
   398
     */
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   399
    ScriptObject allocate(final PropertyMap map) {
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   400
        return null;
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   401
    }
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   402
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   403
    /**
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   404
     * Get the property map to use for objects allocated by this function.
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   405
     *
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   406
     * @return the property map for allocated objects.
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   407
     */
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 21458
diff changeset
   408
    PropertyMap getAllocatorMap() {
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: 16277
diff changeset
   409
        return null;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   410
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   411
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: 16277
diff changeset
   412
    /**
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: 16277
diff changeset
   413
     * This method is used to create the immutable portion of a bound function.
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: 16277
diff changeset
   414
     * See {@link ScriptFunction#makeBoundFunction(Object, Object[])}
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: 16277
diff changeset
   415
     *
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: 16277
diff changeset
   416
     * @param fn the original function being bound
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: 16277
diff changeset
   417
     * @param self this reference to bind. Can be 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: 16277
diff changeset
   418
     * @param args additional arguments to bind. Can be 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: 16277
diff changeset
   419
     */
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: 16277
diff changeset
   420
    ScriptFunctionData makeBoundFunctionData(final ScriptFunction fn, final Object self, final Object[] args) {
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: 16277
diff changeset
   421
        final Object[] allArgs = args == null ? ScriptRuntime.EMPTY_ARRAY : args;
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: 16277
diff changeset
   422
        final int length = args == null ? 0 : args.length;
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   423
        // Clear the callee and this flags
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
   424
        final int boundFlags = flags & ~NEEDS_CALLEE & ~USES_THIS;
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: 16277
diff changeset
   425
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   426
        final List<CompiledFunction> boundList = new LinkedList<>();
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   427
        final ScriptObject runtimeScope = fn.getScope();
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 26503
diff changeset
   428
        final CompiledFunction bindTarget = new CompiledFunction(getGenericInvoker(runtimeScope), getGenericConstructor(runtimeScope), null);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   429
        boundList.add(bind(bindTarget, fn, self, allArgs));
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: 16277
diff changeset
   430
24727
attila
parents: 24720 23375
diff changeset
   431
        return new FinalScriptFunctionData(name, Math.max(0, getArity() - length), boundList, boundFlags);
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: 16277
diff changeset
   432
    }
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: 16277
diff changeset
   433
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: 16277
diff changeset
   434
    /**
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: 16277
diff changeset
   435
     * Convert this argument for non-strict functions according to ES 10.4.3
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: 16277
diff changeset
   436
     *
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: 16277
diff changeset
   437
     * @param thiz the this argument
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: 16277
diff changeset
   438
     *
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: 16277
diff changeset
   439
     * @return the converted this object
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: 16277
diff changeset
   440
     */
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: 16277
diff changeset
   441
    private Object convertThisObject(final Object thiz) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   442
        return needsWrappedThis() ? wrapThis(thiz) : thiz;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   443
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   444
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   445
    static Object wrapThis(final Object thiz) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   446
        if (!(thiz instanceof ScriptObject)) {
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: 16277
diff changeset
   447
            if (JSType.nullOrUndefined(thiz)) {
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23372
diff changeset
   448
                return Context.getGlobal();
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: 16277
diff changeset
   449
            }
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: 16277
diff changeset
   450
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: 16277
diff changeset
   451
            if (isPrimitiveThis(thiz)) {
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23372
diff changeset
   452
                return Context.getGlobal().wrapAsObject(thiz);
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: 16277
diff changeset
   453
            }
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: 16277
diff changeset
   454
        }
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: 16277
diff changeset
   455
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: 16277
diff changeset
   456
        return thiz;
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: 16277
diff changeset
   457
    }
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: 16277
diff changeset
   458
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: 16277
diff changeset
   459
    static boolean isPrimitiveThis(final Object obj) {
29282
a8523237b66c 8074031: Canonicalize is-a-JS-string tests
attila
parents: 26768
diff changeset
   460
        return JSType.isString(obj) || obj instanceof Number || obj instanceof Boolean;
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: 16277
diff changeset
   461
    }
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: 16277
diff changeset
   462
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: 16277
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: 16277
diff changeset
   464
     * Creates an invoker method handle for a bound function.
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: 16277
diff changeset
   465
     *
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: 16277
diff changeset
   466
     * @param targetFn the function being bound
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: 16277
diff changeset
   467
     * @param originalInvoker an original invoker method handle for the function. This can be its generic invoker 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: 16277
diff changeset
   468
     * any of its specializations.
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: 16277
diff changeset
   469
     * @param self the "this" value being bound
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: 16277
diff changeset
   470
     * @param args additional arguments being bound
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: 16277
diff changeset
   471
     *
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: 16277
diff changeset
   472
     * @return a bound invoker method handle that will bind the self value and the specified arguments. The resulting
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: 16277
diff changeset
   473
     * invoker never needs a callee; if the original invoker needed it, it will be bound to {@code fn}. The resulting
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: 16277
diff changeset
   474
     * invoker still takes an initial {@code this} parameter, but it is always dropped and the bound {@code self} passed
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: 16277
diff changeset
   475
     * to the original invoker on invocation.
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   476
     */
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: 16277
diff changeset
   477
    private MethodHandle bindInvokeHandle(final MethodHandle originalInvoker, final ScriptFunction targetFn, final Object self, final Object[] args) {
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: 16277
diff changeset
   478
        // Is the target already bound? If it is, we won't bother binding either callee or self as they're already bound
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: 16277
diff changeset
   479
        // in the target and will be ignored anyway.
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: 16277
diff changeset
   480
        final boolean isTargetBound = targetFn.isBoundFunction();
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: 16277
diff changeset
   481
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: 16277
diff changeset
   482
        final boolean needsCallee = needsCallee(originalInvoker);
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: 16277
diff changeset
   483
        assert needsCallee == needsCallee() : "callee contract violation 2";
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: 16277
diff changeset
   484
        assert !(isTargetBound && needsCallee); // already bound functions don't need a callee
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: 16277
diff changeset
   485
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: 16277
diff changeset
   486
        final Object boundSelf = isTargetBound ? null : convertThisObject(self);
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: 16277
diff changeset
   487
        final MethodHandle boundInvoker;
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: 16277
diff changeset
   488
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: 16277
diff changeset
   489
        if (isVarArg(originalInvoker)) {
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: 16277
diff changeset
   490
            // First, bind callee and this without arguments
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: 16277
diff changeset
   491
            final MethodHandle noArgBoundInvoker;
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: 16277
diff changeset
   492
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: 16277
diff changeset
   493
            if (isTargetBound) {
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: 16277
diff changeset
   494
                // Don't bind either callee or 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: 16277
diff changeset
   495
                noArgBoundInvoker = originalInvoker;
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: 16277
diff changeset
   496
            } else if (needsCallee) {
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: 16277
diff changeset
   497
                // Bind callee and 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: 16277
diff changeset
   498
                noArgBoundInvoker = MH.insertArguments(originalInvoker, 0, targetFn, boundSelf);
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: 16277
diff changeset
   499
            } else {
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: 16277
diff changeset
   500
                // Only bind 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: 16277
diff changeset
   501
                noArgBoundInvoker = MH.bindTo(originalInvoker, boundSelf);
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: 16277
diff changeset
   502
            }
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: 16277
diff changeset
   503
            // Now bind arguments
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: 16277
diff changeset
   504
            if (args.length > 0) {
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: 16277
diff changeset
   505
                boundInvoker = varArgBinder(noArgBoundInvoker, args);
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: 16277
diff changeset
   506
            } else {
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: 16277
diff changeset
   507
                boundInvoker = noArgBoundInvoker;
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: 16277
diff changeset
   508
            }
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: 16277
diff changeset
   509
        } else {
17744
65849f87aa28 8011718: binding already bound function with extra arguments fails
attila
parents: 16523
diff changeset
   510
            // If target is already bound, insert additional bound arguments after "this" argument, at position 1.
65849f87aa28 8011718: binding already bound function with extra arguments fails
attila
parents: 16523
diff changeset
   511
            final int argInsertPos = isTargetBound ? 1 : 0;
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   512
            final Object[] boundArgs = new Object[Math.min(originalInvoker.type().parameterCount() - argInsertPos, args.length + (isTargetBound ? 0 : needsCallee  ? 2 : 1))];
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: 16277
diff changeset
   513
            int next = 0;
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: 16277
diff changeset
   514
            if (!isTargetBound) {
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: 16277
diff changeset
   515
                if (needsCallee) {
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: 16277
diff changeset
   516
                    boundArgs[next++] = targetFn;
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: 16277
diff changeset
   517
                }
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: 16277
diff changeset
   518
                boundArgs[next++] = boundSelf;
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: 16277
diff changeset
   519
            }
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: 16277
diff changeset
   520
            // If more bound args were specified than the function can take, we'll just drop those.
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: 16277
diff changeset
   521
            System.arraycopy(args, 0, boundArgs, next, boundArgs.length - next);
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: 16277
diff changeset
   522
            // If target is already bound, insert additional bound arguments after "this" argument, at position 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: 16277
diff changeset
   523
            // "this" will get dropped anyway by the target invoker. We previously asserted that already bound functions
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: 16277
diff changeset
   524
            // don't take a callee parameter, so we can know that the signature is (this[, args...]) therefore args
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: 16277
diff changeset
   525
            // start at position 1. If the function is not bound, we start inserting arguments at position 0.
17744
65849f87aa28 8011718: binding already bound function with extra arguments fails
attila
parents: 16523
diff changeset
   526
            boundInvoker = MH.insertArguments(originalInvoker, argInsertPos, boundArgs);
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: 16277
diff changeset
   527
        }
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: 16277
diff changeset
   528
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: 16277
diff changeset
   529
        if (isTargetBound) {
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: 16277
diff changeset
   530
            return boundInvoker;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   531
        }
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: 16277
diff changeset
   532
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: 16277
diff changeset
   533
        // If the target is not already bound, add a dropArguments that'll throw away the passed 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: 16277
diff changeset
   534
        return MH.dropArguments(boundInvoker, 0, 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: 16277
diff changeset
   535
    }
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: 16277
diff changeset
   536
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: 16277
diff changeset
   537
    /**
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: 16277
diff changeset
   538
     * Creates a constructor method handle for a bound function using the passed constructor handle.
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: 16277
diff changeset
   539
     *
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: 16277
diff changeset
   540
     * @param originalConstructor the constructor handle to bind. It must be a composed 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: 16277
diff changeset
   541
     * @param fn the function being bound
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: 16277
diff changeset
   542
     * @param args arguments being bound
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: 16277
diff changeset
   543
     *
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: 16277
diff changeset
   544
     * @return a bound constructor method handle that will bind the specified arguments. The resulting constructor never
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: 16277
diff changeset
   545
     * needs a callee; if the original constructor needed it, it will be bound to {@code fn}. The resulting 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: 16277
diff changeset
   546
     * still takes an initial {@code this} parameter and passes it to the underlying original constructor. Finally, if
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: 16277
diff changeset
   547
     * this script function data object has no constructor handle, null is returned.
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: 16277
diff changeset
   548
     */
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: 16277
diff changeset
   549
    private static MethodHandle bindConstructHandle(final MethodHandle originalConstructor, final ScriptFunction fn, final Object[] args) {
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: 16277
diff changeset
   550
        assert originalConstructor != 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: 16277
diff changeset
   551
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: 16277
diff changeset
   552
        // If target function is already bound, don't bother binding the callee.
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: 16277
diff changeset
   553
        final MethodHandle calleeBoundConstructor = fn.isBoundFunction() ? originalConstructor :
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: 16277
diff changeset
   554
            MH.dropArguments(MH.bindTo(originalConstructor, fn), 0, ScriptFunction.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: 16277
diff changeset
   555
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: 16277
diff changeset
   556
        if (args.length == 0) {
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: 16277
diff changeset
   557
            return calleeBoundConstructor;
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: 16277
diff changeset
   558
        }
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: 16277
diff changeset
   559
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: 16277
diff changeset
   560
        if (isVarArg(calleeBoundConstructor)) {
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: 16277
diff changeset
   561
            return varArgBinder(calleeBoundConstructor, args);
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: 16277
diff changeset
   562
        }
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: 16277
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: 16277
diff changeset
   564
        final Object[] boundArgs;
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: 16277
diff changeset
   565
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: 16277
diff changeset
   566
        final int maxArgCount = calleeBoundConstructor.type().parameterCount() - 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: 16277
diff changeset
   567
        if (args.length <= maxArgCount) {
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: 16277
diff changeset
   568
            boundArgs = args;
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: 16277
diff changeset
   569
        } else {
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: 16277
diff changeset
   570
            boundArgs = new Object[maxArgCount];
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: 16277
diff changeset
   571
            System.arraycopy(args, 0, boundArgs, 0, maxArgCount);
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: 16277
diff changeset
   572
        }
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: 16277
diff changeset
   573
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: 16277
diff changeset
   574
        return MH.insertArguments(calleeBoundConstructor, 1, boundArgs);
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: 16277
diff changeset
   575
    }
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: 16277
diff changeset
   576
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: 16277
diff changeset
   577
    /**
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   578
     * Takes a method handle, and returns a potentially different method handle that can be used in
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   579
     * {@code ScriptFunction#invoke(Object, Object...)} or {code ScriptFunction#construct(Object, Object...)}.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   580
     * The returned method handle will be sure to return {@code Object}, and will have all its parameters turned into
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   581
     * {@code Object} as well, except for the following ones:
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   582
     * <ul>
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   583
     *   <li>a last parameter of type {@code Object[]} which is used for vararg functions,</li>
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   584
     *   <li>the first argument, which is forced to be {@link ScriptFunction}, in case the function receives itself
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   585
     *   (callee) as an argument.</li>
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   586
     * </ul>
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   587
     *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   588
     * @param mh the original method handle
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   589
     *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   590
     * @return the new handle, conforming to the rules above.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   591
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   592
    private static MethodHandle makeGenericMethod(final MethodHandle mh) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   593
        final MethodType type = mh.type();
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   594
        final MethodType newType = makeGenericType(type);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   595
        return type.equals(newType) ? mh : mh.asType(newType);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   596
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   597
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   598
    private static MethodType makeGenericType(final MethodType type) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   599
        MethodType newType = type.generic();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   600
        if (isVarArg(type)) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   601
            newType = newType.changeParameterType(type.parameterCount() - 1, Object[].class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   602
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   603
        if (needsCallee(type)) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   604
            newType = newType.changeParameterType(0, ScriptFunction.class);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   605
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   606
        return newType;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   607
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   608
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   609
    /**
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   610
     * Execute this script function.
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: 16277
diff changeset
   611
     *
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   612
     * @param self  Target object.
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   613
     * @param arguments  Call arguments.
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   614
     * @return ScriptFunction result.
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: 16277
diff changeset
   615
     *
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   616
     * @throws Throwable if there is an exception/error with the invocation or thrown from it
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   617
     */
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   618
    Object invoke(final ScriptFunction fn, final Object self, final Object... arguments) throws Throwable {
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   619
        final MethodHandle mh      = getGenericInvoker(fn.getScope());
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   620
        final Object       selfObj = convertThisObject(self);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   621
        final Object[]     args    = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments;
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   622
24881
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24769
diff changeset
   623
        DebuggerSupport.notifyInvoke(mh);
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24769
diff changeset
   624
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: 16277
diff changeset
   625
        if (isVarArg(mh)) {
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: 16277
diff changeset
   626
            if (needsCallee(mh)) {
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: 16277
diff changeset
   627
                return mh.invokeExact(fn, selfObj, args);
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   628
            }
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: 16277
diff changeset
   629
            return mh.invokeExact(selfObj, args);
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   630
        }
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   631
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: 16277
diff changeset
   632
        final int paramCount = mh.type().parameterCount();
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: 16277
diff changeset
   633
        if (needsCallee(mh)) {
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   634
            switch (paramCount) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   635
            case 2:
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: 16277
diff changeset
   636
                return mh.invokeExact(fn, selfObj);
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   637
            case 3:
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: 16277
diff changeset
   638
                return mh.invokeExact(fn, selfObj, getArg(args, 0));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   639
            case 4:
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: 16277
diff changeset
   640
                return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   641
            case 5:
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: 16277
diff changeset
   642
                return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2));
21458
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   643
            case 6:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   644
                return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   645
            case 7:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   646
                return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   647
            case 8:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   648
                return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   649
            default:
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: 16277
diff changeset
   650
                return mh.invokeWithArguments(withArguments(fn, selfObj, paramCount, args));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   651
            }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   652
        }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   653
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   654
        switch (paramCount) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   655
        case 1:
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: 16277
diff changeset
   656
            return mh.invokeExact(selfObj);
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   657
        case 2:
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: 16277
diff changeset
   658
            return mh.invokeExact(selfObj, getArg(args, 0));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   659
        case 3:
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: 16277
diff changeset
   660
            return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   661
        case 4:
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: 16277
diff changeset
   662
            return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2));
21458
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   663
        case 5:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   664
            return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   665
        case 6:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   666
            return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   667
        case 7:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   668
            return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   669
        default:
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: 16277
diff changeset
   670
            return mh.invokeWithArguments(withArguments(null, selfObj, paramCount, args));
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   671
        }
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   672
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   673
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   674
    Object construct(final ScriptFunction fn, final Object... arguments) throws Throwable {
24729
2b13051f2122 8037534: Use scope types to determine optimistic types
attila
parents: 24727
diff changeset
   675
        final MethodHandle mh   = getGenericConstructor(fn.getScope());
21458
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   676
        final Object[]     args = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments;
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   677
24881
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24769
diff changeset
   678
        DebuggerSupport.notifyInvoke(mh);
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24769
diff changeset
   679
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   680
        if (isVarArg(mh)) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   681
            if (needsCallee(mh)) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   682
                return mh.invokeExact(fn, args);
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   683
            }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   684
            return mh.invokeExact(args);
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   685
        }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   686
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   687
        final int paramCount = mh.type().parameterCount();
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   688
        if (needsCallee(mh)) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   689
            switch (paramCount) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   690
            case 1:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   691
                return mh.invokeExact(fn);
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   692
            case 2:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   693
                return mh.invokeExact(fn, getArg(args, 0));
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   694
            case 3:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   695
                return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1));
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   696
            case 4:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   697
                return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1), getArg(args, 2));
21458
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   698
            case 5:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   699
                return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   700
            case 6:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   701
                return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   702
            case 7:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   703
                return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5));
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   704
            default:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   705
                return mh.invokeWithArguments(withArguments(fn, paramCount, args));
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   706
            }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   707
        }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   708
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   709
        switch (paramCount) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   710
        case 0:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   711
            return mh.invokeExact();
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   712
        case 1:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   713
            return mh.invokeExact(getArg(args, 0));
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   714
        case 2:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   715
            return mh.invokeExact(getArg(args, 0), getArg(args, 1));
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   716
        case 3:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   717
            return mh.invokeExact(getArg(args, 0), getArg(args, 1), getArg(args, 2));
21458
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   718
        case 4:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   719
            return mh.invokeExact(getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   720
        case 5:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   721
            return mh.invokeExact(getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4));
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   722
        case 6:
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   723
            return mh.invokeExact(getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5));
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   724
        default:
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   725
            return mh.invokeWithArguments(withArguments(null, paramCount, args));
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   726
        }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   727
    }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   728
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   729
    private static Object getArg(final Object[] args, final int i) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   730
        return i < args.length ? args[i] : UNDEFINED;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   731
    }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   732
18614
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   733
    private static Object[] withArguments(final ScriptFunction fn, final int argCount, final Object[] args) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   734
        final Object[] finalArgs = new Object[argCount];
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   735
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   736
        int nextArg = 0;
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   737
        if (fn != null) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   738
            //needs callee
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   739
            finalArgs[nextArg++] = fn;
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   740
        }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   741
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   742
        // Don't add more args that there is argCount in the handle (including self and callee).
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   743
        for (int i = 0; i < args.length && nextArg < argCount;) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   744
            finalArgs[nextArg++] = args[i++];
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   745
        }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   746
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   747
        // If we have fewer args than argCount, pad with undefined.
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   748
        while (nextArg < argCount) {
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   749
            finalArgs[nextArg++] = UNDEFINED;
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   750
        }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   751
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   752
        return finalArgs;
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   753
    }
addca7a10167 8015959: Can't call foreign constructor
sundar
parents: 17756
diff changeset
   754
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: 16277
diff changeset
   755
    private static Object[] withArguments(final ScriptFunction fn, final Object self, final int argCount, final Object[] args) {
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   756
        final Object[] finalArgs = new Object[argCount];
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   757
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   758
        int nextArg = 0;
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: 16277
diff changeset
   759
        if (fn != 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: 16277
diff changeset
   760
            //needs callee
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   761
            finalArgs[nextArg++] = fn;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   762
        }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   763
        finalArgs[nextArg++] = self;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   764
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   765
        // Don't add more args that there is argCount in the handle (including self and callee).
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   766
        for (int i = 0; i < args.length && nextArg < argCount;) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   767
            finalArgs[nextArg++] = args[i++];
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   768
        }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   769
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   770
        // If we have fewer args than argCount, pad with undefined.
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   771
        while (nextArg < argCount) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   772
            finalArgs[nextArg++] = UNDEFINED;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   773
        }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   774
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   775
        return finalArgs;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   776
    }
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   777
    /**
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   778
     * Takes a variable-arity method and binds a variable number of arguments in it. The returned method will filter the
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   779
     * vararg array and pass a different array that prepends the bound arguments in front of the arguments passed on
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   780
     * invocation
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: 16277
diff changeset
   781
     *
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   782
     * @param mh the handle
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   783
     * @param args the bound arguments
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: 16277
diff changeset
   784
     *
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   785
     * @return the bound method handle
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   786
     */
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   787
    private static MethodHandle varArgBinder(final MethodHandle mh, final Object[] args) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   788
        assert args != null;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   789
        assert args.length > 0;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   790
        return MH.filterArguments(mh, mh.type().parameterCount() - 1, MH.bindTo(BIND_VAR_ARGS, args));
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   791
    }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   792
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   793
    /**
21458
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   794
     * Heuristic to figure out if the method handle has a callee argument. If it's type is
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   795
     * {@code (ScriptFunction, ...)}, then we'll assume it has a callee argument. We need this as
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   796
     * the constructor above is not passed this information, and can't just blindly assume it's false
eec7878b0dcd 8027301: Optimizations for Function.prototype.apply
hannesw
parents: 20946
diff changeset
   797
     * (notably, it's being invoked for creation of new scripts, and scripts have scopes, therefore
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: 16277
diff changeset
   798
     * they also always receive a callee).
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: 16277
diff changeset
   799
     *
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: 16277
diff changeset
   800
     * @param mh the examined method handle
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: 16277
diff changeset
   801
     *
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   802
     * @return true if the method handle expects a callee, false otherwise
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   803
     */
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: 16277
diff changeset
   804
    protected static boolean needsCallee(final MethodHandle mh) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   805
        return needsCallee(mh.type());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   806
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   807
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   808
    static boolean needsCallee(final MethodType type) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   809
        final int length = type.parameterCount();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   810
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   811
        if (length == 0) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   812
            return false;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   813
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   814
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   815
        final Class<?> param0 = type.parameterType(0);
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   816
        return param0 == ScriptFunction.class || param0 == boolean.class && length > 1 && type.parameterType(1) == ScriptFunction.class;
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   817
    }
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   818
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   819
    /**
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: 16277
diff changeset
   820
     * Check if a javascript function methodhandle is a vararg handle
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   821
     *
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: 16277
diff changeset
   822
     * @param mh method handle to check
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: 16277
diff changeset
   823
     *
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: 16277
diff changeset
   824
     * @return true if vararg
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   825
     */
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: 16277
diff changeset
   826
    protected static boolean isVarArg(final MethodHandle mh) {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   827
        return isVarArg(mh.type());
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   828
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   829
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 21458
diff changeset
   830
    static boolean isVarArg(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: 16277
diff changeset
   831
        return type.parameterType(type.parameterCount() - 1).isArray();
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   832
    }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   833
24749
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   834
    /**
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   835
     * Is this ScriptFunction declared in a dynamic context
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   836
     * @return true if in dynamic context, false if not or irrelevant
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   837
     */
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   838
    public boolean inDynamicContext() {
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   839
        return false;
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   840
    }
1549c85f8200 8041625: AccessorProperty currentType must only by Object.class when non-primitive, and scoping followup problem for lazily generated with bodies
lagergren
parents: 24738
diff changeset
   841
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   842
    @SuppressWarnings("unused")
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   843
    private static Object[] bindVarArgs(final Object[] array1, final Object[] array2) {
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: 16277
diff changeset
   844
        if (array2 == null) {
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   845
            // Must clone it, as we can't allow the receiving method to alter the array
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   846
            return array1.clone();
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   847
        }
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: 16277
diff changeset
   848
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   849
        final int l2 = array2.length;
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: 16277
diff changeset
   850
        if (l2 == 0) {
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   851
            return array1.clone();
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   852
        }
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: 16277
diff changeset
   853
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   854
        final int l1 = array1.length;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   855
        final Object[] concat = new Object[l1 + l2];
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   856
        System.arraycopy(array1, 0, concat, 0, l1);
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   857
        System.arraycopy(array2, 0, concat, l1, l2);
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: 16277
diff changeset
   858
16228
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   859
        return concat;
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   860
    }
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   861
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   862
    private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   863
        return MH.findStatic(MethodHandles.lookup(), ScriptFunctionData.class, name, MH.type(rtype, types));
df28320aa080 8007900: Function binding is inefficient
attila
parents: 16226
diff changeset
   864
    }
24753
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   865
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   866
    /**
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   867
     * This class is used to hold the generic invoker and generic constructor pair. It is structured in this way since
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   868
     * most functions will never use them, so this way ScriptFunctionData only pays storage cost for one null reference
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   869
     * to the GenericInvokers object, instead of two null references for the two method handles.
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   870
     */
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   871
    private static final class GenericInvokers {
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   872
        volatile MethodHandle invoker;
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   873
        volatile MethodHandle constructor;
675feda2f82d 8043003: Use strongly referenced generic invokers
attila
parents: 24749
diff changeset
   874
    }
24769
attila
parents: 24753 23767
diff changeset
   875
attila
parents: 24753 23767
diff changeset
   876
    private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
attila
parents: 24753 23767
diff changeset
   877
        in.defaultReadObject();
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 26053
diff changeset
   878
        code = new LinkedList<>();
24769
attila
parents: 24753 23767
diff changeset
   879
    }
16216
46ed48fd84d3 8007273: Creation of ScriptFunctions can be refactored
hannesw
parents:
diff changeset
   880
}