nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SharedScopeCall.java
author sundar
Tue, 04 Aug 2015 18:18:54 +0530
changeset 32048 8023426b93ab
parent 27976 ef54dfb4fc7d
permissions -rw-r--r--
8073733: TypeError messages with "call" and "new" could be improved Reviewed-by: attila, mhaupt
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.codegen;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
    28
import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_OPTIMISTIC;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
    29
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import java.util.Arrays;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import java.util.EnumSet;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import jdk.nashorn.internal.codegen.types.Type;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import jdk.nashorn.internal.ir.Symbol;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
 * A scope call or get operation that can be shared by several callsites. This generates a static
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
 * method that wraps the invokedynamic instructions to get or call scope variables.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
 * The rationale for this is that initial linking of invokedynamic callsites is expensive,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
 * so by sharing them we can reduce startup overhead and allow very large scripts to run that otherwise wouldn't.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
 * <p>Static methods generated by this class expect two parameters in addition to the parameters of the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
 * function call: The current scope object and the depth of the target scope relative to the scope argument
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
 * for when this is known at compile-time (fast-scope access).</p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
 * <p>The second argument may be -1 for non-fast-scope symbols, in which case the scope chain is checked
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
 * for each call. This may cause callsite invalidation when the shared method is used from different
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
 * scopes, but such sharing of non-fast scope calls may still be necessary for very large scripts.</p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
 * <p>Scope calls must not be shared between normal callsites and callsites contained in a <tt>with</tt>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
 * statement as this condition is not handled by current guards and will cause a runtime error.</p>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
 */
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
    53
class SharedScopeCall {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
    /** Threshold for using shared scope calls with fast scope access. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
    public static final int FAST_SCOPE_CALL_THRESHOLD = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    /** Threshold for using shared scope calls with slow scope access. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
    public static final int SLOW_SCOPE_CALL_THRESHOLD = 500;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    /** Threshold for using shared scope gets with fast scope access. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    public static final int FAST_SCOPE_GET_THRESHOLD  = 200;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    final Type valueType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    final Symbol symbol;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
    final Type returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
    final Type[] paramTypes;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
    final int flags;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    final boolean isCall;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    private CompileUnit compileUnit;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    private String methodName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
    private String staticSignature;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
     * Constructor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
     * @param symbol the symbol
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
     * @param valueType the type of the value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
     * @param returnType the return type
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
     * @param paramTypes the function parameter types
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
     * @param flags the callsite flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    SharedScopeCall(final Symbol symbol, final Type valueType, final Type returnType, final Type[] paramTypes, final int flags) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
        this.symbol = symbol;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
        this.valueType = valueType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
        this.returnType = returnType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
        this.paramTypes = paramTypes;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
    86
        assert (flags & CALLSITE_OPTIMISTIC) == 0;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
        this.flags = flags;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
        // If paramTypes is not null this is a call, otherwise it's just a get.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
        this.isCall = paramTypes != null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
    public int hashCode() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
        return symbol.hashCode() ^ returnType.hashCode() ^ Arrays.hashCode(paramTypes) ^ flags;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
    public boolean equals(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
        if (obj instanceof SharedScopeCall) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
            final SharedScopeCall c = (SharedScopeCall) obj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
            return symbol.equals(c.symbol)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
                    && flags == c.flags
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
                    && returnType.equals(c.returnType)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
                    && Arrays.equals(paramTypes, c.paramTypes);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
     * Set the compile unit and method name.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
     * @param compileUnit the compile unit
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16210
diff changeset
   112
     * @param methodName the method name
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
     */
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16210
diff changeset
   114
    protected void setClassAndName(final CompileUnit compileUnit, final String methodName) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
        this.compileUnit = compileUnit;
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16210
diff changeset
   116
        this.methodName  = methodName;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
     * Generate the invoke instruction for this shared scope call.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
     * @param method the method emitter
17769
14ea7feaf658 8012522: Clean up lexical contexts - split out stack based functionality in CodeGenerator and generify NodeVisitors based on their LexicalContext type to avoid casts
lagergren
parents: 16240
diff changeset
   122
     * @return the method emitter
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
     */
17769
14ea7feaf658 8012522: Clean up lexical contexts - split out stack based functionality in CodeGenerator and generify NodeVisitors based on their LexicalContext type to avoid casts
lagergren
parents: 16240
diff changeset
   124
    public MethodEmitter generateInvoke(final MethodEmitter method) {
14ea7feaf658 8012522: Clean up lexical contexts - split out stack based functionality in CodeGenerator and generify NodeVisitors based on their LexicalContext type to avoid casts
lagergren
parents: 16240
diff changeset
   125
        return method.invokestatic(compileUnit.getUnitClassName(), methodName, getStaticSignature());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
     * Generate the method that implements the scope get or call.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
    protected void generateScopeCall() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
        final ClassEmitter classEmitter = compileUnit.getClassEmitter();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
        final EnumSet<ClassEmitter.Flag> methodFlags = EnumSet.of(ClassEmitter.Flag.STATIC);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
        // This method expects two fixed parameters in addition to any parameters that may be
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
        // passed on to the function: A ScriptObject representing the caller's current scope object,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
        // and an int specifying the distance to the target scope containing the symbol we want to
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
        // access, or -1 if this is not known at compile time (e.g. because of a "with" or "eval").
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
        final MethodEmitter method = classEmitter.method(methodFlags, methodName, getStaticSignature());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
        method.begin();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
        // Load correct scope by calling getProto() on the scope argument as often as specified
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
        // by the second argument.
16240
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   145
        final Label parentLoopStart = new Label("parent_loop_start");
e1468b33e201 8008239: Unpublicized parts of the code generator package that were only package internal.
lagergren
parents: 16233
diff changeset
   146
        final Label parentLoopDone  = new Label("parent_loop_done");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
        method.load(Type.OBJECT, 0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
        method.label(parentLoopStart);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
        method.load(Type.INT, 1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
        method.iinc(1, -1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        method.ifle(parentLoopDone);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
        method.invoke(ScriptObject.GET_PROTO);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
        method._goto(parentLoopStart);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
        method.label(parentLoopDone);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   156
        assert !isCall || valueType.isObject(); // Callables are always objects
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   157
        // If flags are optimistic, but we're doing a call, remove optimistic flags from the getter, as they obviously
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   158
        // only apply to the call.
27976
ef54dfb4fc7d 8066669: dust.js performance regression caused by primitive field conversion
hannesw
parents: 25865
diff changeset
   159
        method.dynamicGet(valueType, symbol.getName(), isCall ? CodeGenerator.nonOptimisticFlags(flags) : flags, isCall, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
        // If this is a get we're done, otherwise call the value as function.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
        if (isCall) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
            method.convert(Type.OBJECT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
            // ScriptFunction will see CALLSITE_SCOPE and will bind scope accordingly.
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 17769
diff changeset
   165
            method.loadUndefined(Type.OBJECT);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
            int slot = 2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
            for (final Type type : paramTypes) {
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   168
                method.load(type, slot);
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   169
                slot += type.getSlots();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
            }
24725
7bb1f687a852 8033334: Make sure that scope depth information is maintained in the RecompilableScriptFunctionDatas, to avoid unnecessary slow proto linkage when doing on demand compilation
lagergren
parents: 24719
diff changeset
   171
            // Shared scope calls disabled in optimistic world. TODO is this right?
32048
8023426b93ab 8073733: TypeError messages with "call" and "new" could be improved
sundar
parents: 27976
diff changeset
   172
            method.dynamicCall(returnType, 2 + paramTypes.length, flags, symbol.getName());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
        method._return(returnType);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
        method.end();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
    private String getStaticSignature() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
        if (staticSignature == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
            if (paramTypes == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
                staticSignature = Type.getMethodDescriptor(returnType, Type.typeFor(ScriptObject.class), Type.INT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
                final Type[] params = new Type[paramTypes.length + 2];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
                params[0] = Type.typeFor(ScriptObject.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
                params[1] = Type.INT;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   187
                System.arraycopy(paramTypes, 0, params, 2, paramTypes.length);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
                staticSignature = Type.getMethodDescriptor(returnType, params);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
        return staticSignature;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   194
    @Override
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   195
    public String toString() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   196
        return methodName + " " + staticSignature;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   197
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 17769
diff changeset
   198
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
}