author | erikj |
Tue, 12 Sep 2017 19:03:39 +0200 | |
changeset 47216 | 71c04702a3d5 |
parent 47040 | nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptFunctionData.java@4ed4c4eba60c |
permissions | -rw-r--r-- |
16216 | 1 |
/* |
2 |
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. |
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
7 |
* published by the Free Software Foundation. Oracle designates this |
|
8 |
* particular file as subject to the "Classpath" exception as provided |
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
|
10 |
* |
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
24 |
*/ |
|
25 |
||
26 |
package jdk.nashorn.internal.runtime; |
|
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 | 29 |
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; |
30 |
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; |
|
29282 | 31 |
|
24769 | 32 |
import java.io.IOException; |
33 |
import java.io.ObjectInputStream; |
|
23767 | 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 | 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 | 41 |
import jdk.nashorn.internal.runtime.linker.LinkerCallSite; |
16216 | 42 |
|
43 |
||
44 |
/** |
|
45 |
* A container for data needed to instantiate a specific {@link ScriptFunction} at runtime. |
|
46 |
* Instances of this class are created during codegen and stored in script classes' |
|
47 |
* constants array to reduce function instantiation overhead during runtime. |
|
48 |
*/ |
|
23767 | 49 |
public abstract class ScriptFunctionData implements Serializable { |
24719 | 50 |
static final int MAX_ARITY = LinkerCallSite.ARGLIMIT; |
51 |
static { |
|
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 |
|
53 |
// "byte arity" field can be widened. |
|
54 |
assert MAX_ARITY < 256; |
|
55 |
} |
|
16216 | 56 |
|
24719 | 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 | 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 | 67 |
|
24719 | 68 |
// Parameter arity of the function, corresponding to "f.length". E.g. "function f(a, b, c) { ... }" arity is 3, and |
69 |
// some built-in ECMAScript functions have their arity declared by the specification. Note that regardless of this |
|
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 | 72 |
|
24753 | 73 |
/** |
74 |
* A pair of method handles used for generic invoker and constructor. Field is volatile as it can be initialized by |
|
75 |
* multiple threads concurrently, but we still tolerate a race condition in it as all values stored into it are |
|
76 |
* idempotent. |
|
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 | 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 | 81 |
|
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
82 |
/** Is this a strict mode function? */ |
30393
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
83 |
public static final int IS_STRICT = 1 << 0; |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
84 |
/** Is this a built-in function? */ |
30393
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
85 |
public static final int IS_BUILTIN = 1 << 1; |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
86 |
/** Is this a constructor function? */ |
30393
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
87 |
public static final int IS_CONSTRUCTOR = 1 << 2; |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
88 |
/** Does this function expect a callee argument? */ |
30393
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
89 |
public static final int NEEDS_CALLEE = 1 << 3; |
23372
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? */ |
30393
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
91 |
public static final int USES_THIS = 1 << 4; |
24727 | 92 |
/** Is this a variable arity function? */ |
30393
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
93 |
public static final int IS_VARIABLE_ARITY = 1 << 5; |
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
94 |
/** Is this a object literal property getter or setter? */ |
0e005bd1de13
8066237: Fuzzing bug: Parser error on optimistic recompilation
hannesw
parents:
29282
diff
changeset
|
95 |
public static final int IS_PROPERTY_ACCESSOR = 1 << 6; |
39077
c549268fe94c
8156614: Lazy parsing of ES6 shorthand method syntax is broken
hannesw
parents:
34844
diff
changeset
|
96 |
/** Is this an ES6 method? */ |
c549268fe94c
8156614: Lazy parsing of ES6 shorthand method syntax is broken
hannesw
parents:
34844
diff
changeset
|
97 |
public static final int IS_ES6_METHOD = 1 << 7; |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
98 |
|
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
99 |
/** Flag for strict or built-in functions */ |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
100 |
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
|
101 |
/** Flag for built-in constructors */ |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
102 |
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
|
103 |
|
23767 | 104 |
private static final long serialVersionUID = 4252901245508769114L; |
105 |
||
16216 | 106 |
/** |
107 |
* Constructor |
|
16233
95d3e01c04c3
8008199: Lazy compilation and trampoline implementation
lagergren
parents:
16228
diff
changeset
|
108 |
* |
24727 | 109 |
* @param name script function name |
110 |
* @param arity arity |
|
111 |
* @param flags the function flags |
|
16216 | 112 |
*/ |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
113 |
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
|
114 |
this.name = name; |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
115 |
this.flags = flags; |
24719 | 116 |
setArity(arity); |
16228 | 117 |
} |
16216 | 118 |
|
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
|
119 |
final int getArity() { |
16216 | 120 |
return arity; |
121 |
} |
|
122 |
||
34844
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
123 |
String getDocumentation() { |
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
124 |
return toSource(); |
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
125 |
} |
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
126 |
|
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
127 |
String getDocumentationKey() { |
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
128 |
return null; |
34735
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
129 |
} |
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
130 |
|
24719 | 131 |
final boolean isVariableArity() { |
24727 | 132 |
return (flags & IS_VARIABLE_ARITY) != 0; |
16216 | 133 |
} |
134 |
||
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 |
* 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
|
137 |
* @param arity new arity |
16216 | 138 |
*/ |
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
|
139 |
void setArity(final int arity) { |
24719 | 140 |
if(arity < 0 || arity > MAX_ARITY) { |
141 |
throw new IllegalArgumentException(String.valueOf(arity)); |
|
142 |
} |
|
16216 | 143 |
this.arity = arity; |
144 |
} |
|
145 |
||
34735
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
146 |
/** |
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
147 |
* Used from nasgen generated code. |
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
148 |
* |
39077
c549268fe94c
8156614: Lazy parsing of ES6 shorthand method syntax is broken
hannesw
parents:
34844
diff
changeset
|
149 |
* @param docKey documentation key for this function |
34735
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
150 |
*/ |
34844
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
151 |
void setDocumentationKey(final String docKey) { |
34735
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
152 |
} |
0f41d334aa24
8145486: jjs should support documentation key shortcut in interactive mode
sundar
parents:
32695
diff
changeset
|
153 |
|
34844
31c026e00569
8146251: Avoid annotation to specify documentation for JS builtin functions
sundar
parents:
34736
diff
changeset
|
154 |
|
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
|
155 |
CompiledFunction bind(final CompiledFunction originalInv, final ScriptFunction fn, final Object self, final Object[] args) { |
24719 | 156 |
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
|
157 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
158 |
if (isConstructor()) { |
26768
751b0f427090
8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents:
26503
diff
changeset
|
159 |
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
|
160 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
161 |
|
24719 | 162 |
return new CompiledFunction(boundInvoker); |
16216 | 163 |
} |
164 |
||
165 |
/** |
|
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
|
166 |
* 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
|
167 |
* @return true if strict, false otherwise |
16216 | 168 |
*/ |
32533
47d3ca23ac91
8135332: ScriptFunction constructor should use is bound and is strict check rather than checking for 'arguments' and 'caller'
sundar
parents:
32527
diff
changeset
|
169 |
public final boolean isStrict() { |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
170 |
return (flags & IS_STRICT) != 0; |
16216 | 171 |
} |
172 |
||
24738
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
173 |
/** |
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
174 |
* 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
|
175 |
* 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
|
176 |
* @return internal function name |
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
177 |
*/ |
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
178 |
protected String getFunctionName() { |
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
179 |
return getName(); |
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
180 |
} |
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
181 |
|
32533
47d3ca23ac91
8135332: ScriptFunction constructor should use is bound and is strict check rather than checking for 'arguments' and 'caller'
sundar
parents:
32527
diff
changeset
|
182 |
final boolean isBuiltin() { |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
183 |
return (flags & IS_BUILTIN) != 0; |
16216 | 184 |
} |
185 |
||
32533
47d3ca23ac91
8135332: ScriptFunction constructor should use is bound and is strict check rather than checking for 'arguments' and 'caller'
sundar
parents:
32527
diff
changeset
|
186 |
final boolean isConstructor() { |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
187 |
return (flags & IS_CONSTRUCTOR) != 0; |
16216 | 188 |
} |
189 |
||
24719 | 190 |
abstract boolean needsCallee(); |
16216 | 191 |
|
192 |
/** |
|
193 |
* Returns true if this is a non-strict, non-built-in function that requires non-primitive this argument |
|
194 |
* according to ECMA 10.4.3. |
|
195 |
* @return true if this argument must be an object |
|
196 |
*/ |
|
32533
47d3ca23ac91
8135332: ScriptFunction constructor should use is bound and is strict check rather than checking for 'arguments' and 'caller'
sundar
parents:
32527
diff
changeset
|
197 |
final boolean needsWrappedThis() { |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
198 |
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
|
199 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
200 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
201 |
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
|
202 |
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
|
203 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
204 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
205 |
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
|
206 |
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
|
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 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
/** |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* 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
|
211 |
* 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
|
212 |
* |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* @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
|
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 |
@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
|
216 |
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
|
217 |
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
|
218 |
} |
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
|
219 |
|
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
|
220 |
/** |
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
|
221 |
* 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
|
222 |
* @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
|
223 |
*/ |
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
|
224 |
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
|
225 |
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
|
226 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
227 |
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
|
228 |
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
|
229 |
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
|
230 |
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
|
231 |
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
|
232 |
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
|
233 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
234 |
return sb.toString(); |
16216 | 235 |
} |
236 |
||
237 |
/** |
|
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
|
238 |
* 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
|
239 |
* 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
|
240 |
* 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
|
241 |
* 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
|
242 |
* 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
|
243 |
* |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
244 |
* @param callSiteType callsite type |
26053
8137f95db5e8
8046026: CompiledFunction.relinkComposableInvoker assert is being hit
attila
parents:
24881
diff
changeset
|
245 |
* @return compiled function object representing the best invoker. |
16216 | 246 |
*/ |
26768
751b0f427090
8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents:
26503
diff
changeset
|
247 |
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
|
248 |
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
|
249 |
} |
751b0f427090
8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents:
26503
diff
changeset
|
250 |
|
751b0f427090
8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents:
26503
diff
changeset
|
251 |
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
|
252 |
final CompiledFunction cf = getBest(callSiteType, runtimeScope, forbidden); |
24719 | 253 |
assert cf != null; |
24738
be2026c9717c
8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents:
24733
diff
changeset
|
254 |
return cf; |
16216 | 255 |
} |
256 |
||
26768
751b0f427090
8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents:
26503
diff
changeset
|
257 |
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
|
258 |
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
|
259 |
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
|
260 |
} |
24719 | 261 |
// 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
|
262 |
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
|
263 |
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
|
264 |
} |
16228 | 265 |
|
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
|
266 |
/** |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
267 |
* 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
|
268 |
* 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
|
269 |
*/ |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
270 |
protected void ensureCompiled() { |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
271 |
//empty |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
272 |
} |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
273 |
|
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
274 |
/** |
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
|
275 |
* 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
|
276 |
* 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
|
277 |
* 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
|
278 |
* |
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
279 |
* @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
|
280 |
* 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
|
281 |
* 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
|
282 |
* @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
|
283 |
*/ |
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
284 |
final MethodHandle getGenericInvoker(final ScriptObject runtimeScope) { |
24753 | 285 |
// This method has race conditions both on genericsInvoker and genericsInvoker.invoker, but even if invoked |
286 |
// concurrently, they'll create idempotent results, so it doesn't matter. We could alternatively implement this |
|
287 |
// using java.util.concurrent.AtomicReferenceFieldUpdater, but it's hardly worth it. |
|
288 |
final GenericInvokers lgenericInvokers = ensureGenericInvokers(); |
|
289 |
MethodHandle invoker = lgenericInvokers.invoker; |
|
290 |
if(invoker == null) { |
|
291 |
lgenericInvokers.invoker = invoker = createGenericInvoker(runtimeScope); |
|
24719 | 292 |
} |
293 |
return invoker; |
|
294 |
} |
|
295 |
||
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
296 |
private MethodHandle createGenericInvoker(final ScriptObject runtimeScope) { |
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
297 |
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
|
298 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
299 |
|
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
300 |
final MethodHandle getGenericConstructor(final ScriptObject runtimeScope) { |
24753 | 301 |
// This method has race conditions both on genericsInvoker and genericsInvoker.constructor, but even if invoked |
302 |
// concurrently, they'll create idempotent results, so it doesn't matter. We could alternatively implement this |
|
303 |
// using java.util.concurrent.AtomicReferenceFieldUpdater, but it's hardly worth it. |
|
304 |
final GenericInvokers lgenericInvokers = ensureGenericInvokers(); |
|
305 |
MethodHandle constructor = lgenericInvokers.constructor; |
|
306 |
if(constructor == null) { |
|
307 |
lgenericInvokers.constructor = constructor = createGenericConstructor(runtimeScope); |
|
24719 | 308 |
} |
309 |
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
|
310 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
311 |
|
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
312 |
private MethodHandle createGenericConstructor(final ScriptObject runtimeScope) { |
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
313 |
return makeGenericMethod(getGeneric(runtimeScope).createComposableConstructor()); |
18614 | 314 |
} |
315 |
||
24753 | 316 |
private GenericInvokers ensureGenericInvokers() { |
317 |
GenericInvokers lgenericInvokers = genericInvokers; |
|
318 |
if(lgenericInvokers == null) { |
|
319 |
genericInvokers = lgenericInvokers = new GenericInvokers(); |
|
320 |
} |
|
321 |
return lgenericInvokers; |
|
18614 | 322 |
} |
323 |
||
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
324 |
private static MethodType widen(final MethodType cftype) { |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
325 |
final Class<?>[] paramTypes = new Class<?>[cftype.parameterCount()]; |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
326 |
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
|
327 |
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
|
328 |
} |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
329 |
return MH.type(cftype.returnType(), paramTypes); |
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 |
/** |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
333 |
* 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
|
334 |
* 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
|
335 |
* for (Object, Object, int, int, int) or we will destroy the semantics and get |
32534
b3ec7f3b3c2a
8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents:
32533
diff
changeset
|
336 |
* a function that, when padded with undefined values, behaves differently |
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
337 |
* @param type actual call site type |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
338 |
* @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
|
339 |
*/ |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
340 |
CompiledFunction lookupExactApplyToCall(final MethodType type) { |
47040
4ed4c4eba60c
8184720: Nashorn engine in strict mode throws a java.lang.ClassCastException when calling apply() and passing the arguments object
sdama
parents:
39077
diff
changeset
|
341 |
// Callsite type always has callee, drop it if this function doesn't need it. |
4ed4c4eba60c
8184720: Nashorn engine in strict mode throws a java.lang.ClassCastException when calling apply() and passing the arguments object
sdama
parents:
39077
diff
changeset
|
342 |
final MethodType adaptedType = needsCallee() ? type : type.dropParameterTypes(0, 1); |
4ed4c4eba60c
8184720: Nashorn engine in strict mode throws a java.lang.ClassCastException when calling apply() and passing the arguments object
sdama
parents:
39077
diff
changeset
|
343 |
|
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
344 |
for (final CompiledFunction cf : code) { |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
345 |
if (!cf.isApplyToCall()) { |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
346 |
continue; |
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 |
|
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
349 |
final MethodType cftype = cf.type(); |
47040
4ed4c4eba60c
8184720: Nashorn engine in strict mode throws a java.lang.ClassCastException when calling apply() and passing the arguments object
sdama
parents:
39077
diff
changeset
|
350 |
if (cftype.parameterCount() != adaptedType.parameterCount()) { |
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
351 |
continue; |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
352 |
} |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
353 |
|
47040
4ed4c4eba60c
8184720: Nashorn engine in strict mode throws a java.lang.ClassCastException when calling apply() and passing the arguments object
sdama
parents:
39077
diff
changeset
|
354 |
if (widen(cftype).equals(widen(adaptedType))) { |
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
355 |
return cf; |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
356 |
} |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
357 |
} |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
358 |
|
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
359 |
return null; |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
360 |
} |
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 |
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
|
363 |
for (final CompiledFunction candidate : code) { |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
364 |
if (candidate.matchesCallSite(callSiteType, canPickVarArg)) { |
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 |
} |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
368 |
return null; |
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 |
|
24719 | 371 |
/** |
372 |
* Returns the best function for the specified call site type. |
|
373 |
* @param callSiteType The call site type. Call site types are expected to have the form |
|
374 |
* {@code (callee, this[, args...])}. |
|
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
375 |
* @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
|
376 |
* 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
|
377 |
* scope is not known, but that might cause compilation of code that will need more deoptimization passes. |
34736
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
378 |
* @param linkLogicOkay is a CompiledFunction with a LinkLogic acceptable? |
24719 | 379 |
* @return the best function for the specified call site type. |
380 |
*/ |
|
34736
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
381 |
abstract CompiledFunction getBest(final MethodType callSiteType, final ScriptObject runtimeScope, final Collection<CompiledFunction> forbidden, final boolean linkLogicOkay); |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
382 |
|
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
383 |
/** |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
384 |
* Returns the best function for the specified call site type. |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
385 |
* @param callSiteType The call site type. Call site types are expected to have the form |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
386 |
* {@code (callee, this[, args...])}. |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
387 |
* @param runtimeScope the runtime scope. It can be used to evaluate types of scoped variables to guide the |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
388 |
* optimistic compilation, should the call to this method trigger code compilation. Can be null if current runtime |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
389 |
* scope is not known, but that might cause compilation of code that will need more deoptimization passes. |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
390 |
* @return the best function for the specified call site type. |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
391 |
*/ |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
392 |
final CompiledFunction getBest(final MethodType callSiteType, final ScriptObject runtimeScope, final Collection<CompiledFunction> forbidden) { |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
393 |
return getBest(callSiteType, runtimeScope, forbidden, true); |
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
394 |
} |
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
395 |
|
31827
c9984afe4a29
8131340: Varargs function is recompiled each time it is linked
hannesw
parents:
30393
diff
changeset
|
396 |
boolean isValidCallSite(final MethodType callSiteType) { |
c9984afe4a29
8131340: Varargs function is recompiled each time it is linked
hannesw
parents:
30393
diff
changeset
|
397 |
return callSiteType.parameterCount() >= 2 && // Must have at least (callee, this) |
c9984afe4a29
8131340: Varargs function is recompiled each time it is linked
hannesw
parents:
30393
diff
changeset
|
398 |
callSiteType.parameterType(0).isAssignableFrom(ScriptFunction.class); // Callee must be assignable from script function |
16216 | 399 |
} |
400 |
||
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
401 |
CompiledFunction getGeneric(final ScriptObject runtimeScope) { |
34736
52e9e61d937f
8145550: Megamorphic invoke should use CompiledFunction variants without any LinkLogic
sundar
parents:
34735
diff
changeset
|
402 |
return getBest(getGenericType(), runtimeScope, CompiledFunction.NO_FUNCTIONS, false); |
24719 | 403 |
} |
404 |
||
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
405 |
/** |
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
406 |
* 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
|
407 |
* @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
|
408 |
*/ |
24719 | 409 |
abstract MethodType getGenericType(); |
410 |
||
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
|
411 |
/** |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* Allocates an object using this function's allocator. |
23084
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
413 |
* |
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
414 |
* @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
|
415 |
* @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
|
416 |
*/ |
23084
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
417 |
ScriptObject allocate(final PropertyMap map) { |
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
418 |
return null; |
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
419 |
} |
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
420 |
|
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
421 |
/** |
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
422 |
* 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
|
423 |
* |
32695
9b708b92c695
8134609: Allow constructors with same prototoype map to share the allocator map
hannesw
parents:
32534
diff
changeset
|
424 |
* @param prototype the prototype of the allocated object |
23084
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
425 |
* @return the property map for allocated objects. |
6c5c02d1023a
8035948: Redesign property listeners for shared classes
hannesw
parents:
21458
diff
changeset
|
426 |
*/ |
32695
9b708b92c695
8134609: Allow constructors with same prototoype map to share the allocator map
hannesw
parents:
32534
diff
changeset
|
427 |
PropertyMap getAllocatorMap(final ScriptObject prototype) { |
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
|
428 |
return null; |
16216 | 429 |
} |
430 |
||
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
|
431 |
/** |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* This method is used to create the immutable portion of a bound function. |
32527
b105632002c5
8027137: Merge ScriptFunction and ScriptFunctionImpl
sundar
parents:
31827
diff
changeset
|
433 |
* See {@link ScriptFunction#createBound(Object, 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
|
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 |
* @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
|
436 |
* @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
|
437 |
* @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
|
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 |
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
|
440 |
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
|
441 |
final int length = args == null ? 0 : args.length; |
23372
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
442 |
// Clear the callee and this flags |
09707b3e5fb0
8021350: Share script classes between threads/globals within context
hannesw
parents:
23084
diff
changeset
|
443 |
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
|
444 |
|
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
445 |
final List<CompiledFunction> boundList = new LinkedList<>(); |
24729
2b13051f2122
8037534: Use scope types to determine optimistic types
attila
parents:
24727
diff
changeset
|
446 |
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
|
447 |
final CompiledFunction bindTarget = new CompiledFunction(getGenericInvoker(runtimeScope), getGenericConstructor(runtimeScope), null); |
24719 | 448 |
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
|
449 |
|
24727 | 450 |
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
|
451 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
452 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* 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
|
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 |
* @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
|
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 |
* @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
|
459 |
*/ |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
460 |
private Object convertThisObject(final Object thiz) { |
24719 | 461 |
return needsWrappedThis() ? wrapThis(thiz) : thiz; |
462 |
} |
|
463 |
||
464 |
static Object wrapThis(final Object thiz) { |
|
465 |
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
|
466 |
if (JSType.nullOrUndefined(thiz)) { |
23375
a1110f2cbe75
8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents:
23372
diff
changeset
|
467 |
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
|
468 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
if (isPrimitiveThis(thiz)) { |
23375
a1110f2cbe75
8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents:
23372
diff
changeset
|
471 |
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
|
472 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
476 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
static boolean isPrimitiveThis(final Object obj) { |
29282 | 479 |
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
|
480 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
/** |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* 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
|
484 |
* |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* @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
|
486 |
* @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
|
487 |
* 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
|
488 |
* @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
|
489 |
* @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
|
490 |
* |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* @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
|
492 |
* 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
|
493 |
* 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
|
494 |
* to the original invoker on invocation. |
16216 | 495 |
*/ |
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
|
496 |
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
|
497 |
// 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
|
498 |
// 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
|
499 |
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
|
500 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
502 |
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
|
503 |
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
|
504 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
506 |
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
|
507 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
509 |
// 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
|
510 |
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
|
511 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
512 |
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
|
513 |
// 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
|
514 |
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
|
515 |
} 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
|
516 |
// 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
|
517 |
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
|
518 |
} 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
|
519 |
// 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
|
520 |
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
|
521 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
// 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
|
523 |
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
|
524 |
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
|
525 |
} 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
|
526 |
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
|
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 |
} else { |
17744
65849f87aa28
8011718: binding already bound function with extra arguments fails
attila
parents:
16523
diff
changeset
|
529 |
// 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
|
530 |
final int argInsertPos = isTargetBound ? 1 : 0; |
24720 | 531 |
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
|
532 |
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
|
533 |
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
|
534 |
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
|
535 |
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
|
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 |
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
|
538 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
// 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
|
540 |
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
|
541 |
// 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
|
542 |
// "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
|
543 |
// 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
|
544 |
// 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
|
545 |
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
|
546 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
549 |
return boundInvoker; |
16216 | 550 |
} |
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
|
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 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
|
553 |
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
|
554 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
/** |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
* 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
|
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 |
* @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
|
560 |
* @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
|
561 |
* @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
|
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 |
* @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
|
564 |
* 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
|
565 |
* 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
|
566 |
* 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
|
567 |
*/ |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
569 |
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
|
570 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
// 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
|
572 |
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
|
573 |
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
|
574 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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 |
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
|
576 |
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
|
577 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
578 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
579 |
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
|
580 |
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
|
581 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
582 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
583 |
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
|
584 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
585 |
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
|
586 |
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
|
587 |
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
|
588 |
} 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
|
589 |
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
|
590 |
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
|
591 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
592 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
593 |
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
|
594 |
} |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
595 |
|
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
596 |
/** |
24719 | 597 |
* Takes a method handle, and returns a potentially different method handle that can be used in |
598 |
* {@code ScriptFunction#invoke(Object, Object...)} or {code ScriptFunction#construct(Object, Object...)}. |
|
599 |
* The returned method handle will be sure to return {@code Object}, and will have all its parameters turned into |
|
600 |
* {@code Object} as well, except for the following ones: |
|
601 |
* <ul> |
|
602 |
* <li>a last parameter of type {@code Object[]} which is used for vararg functions,</li> |
|
603 |
* <li>the first argument, which is forced to be {@link ScriptFunction}, in case the function receives itself |
|
604 |
* (callee) as an argument.</li> |
|
605 |
* </ul> |
|
606 |
* |
|
607 |
* @param mh the original method handle |
|
608 |
* |
|
609 |
* @return the new handle, conforming to the rules above. |
|
610 |
*/ |
|
611 |
private static MethodHandle makeGenericMethod(final MethodHandle mh) { |
|
612 |
final MethodType type = mh.type(); |
|
24720 | 613 |
final MethodType newType = makeGenericType(type); |
24719 | 614 |
return type.equals(newType) ? mh : mh.asType(newType); |
615 |
} |
|
616 |
||
617 |
private static MethodType makeGenericType(final MethodType type) { |
|
618 |
MethodType newType = type.generic(); |
|
619 |
if (isVarArg(type)) { |
|
620 |
newType = newType.changeParameterType(type.parameterCount() - 1, Object[].class); |
|
621 |
} |
|
622 |
if (needsCallee(type)) { |
|
623 |
newType = newType.changeParameterType(0, ScriptFunction.class); |
|
624 |
} |
|
625 |
return newType; |
|
626 |
} |
|
627 |
||
628 |
/** |
|
16228 | 629 |
* 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
|
630 |
* |
16228 | 631 |
* @param self Target object. |
632 |
* @param arguments Call arguments. |
|
633 |
* @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
|
634 |
* |
16228 | 635 |
* @throws Throwable if there is an exception/error with the invocation or thrown from it |
16216 | 636 |
*/ |
16228 | 637 |
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
|
638 |
final MethodHandle mh = getGenericInvoker(fn.getScope()); |
24719 | 639 |
final Object selfObj = convertThisObject(self); |
640 |
final Object[] args = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments; |
|
16228 | 641 |
|
24881 | 642 |
DebuggerSupport.notifyInvoke(mh); |
643 |
||
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
|
644 |
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
|
645 |
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
|
646 |
return mh.invokeExact(fn, selfObj, args); |
16228 | 647 |
} |
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
|
648 |
return mh.invokeExact(selfObj, args); |
16216 | 649 |
} |
16228 | 650 |
|
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
|
651 |
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
|
652 |
if (needsCallee(mh)) { |
16228 | 653 |
switch (paramCount) { |
654 |
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
|
655 |
return mh.invokeExact(fn, selfObj); |
16228 | 656 |
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
|
657 |
return mh.invokeExact(fn, selfObj, getArg(args, 0)); |
16228 | 658 |
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
|
659 |
return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1)); |
16228 | 660 |
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
|
661 |
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
|
662 |
case 6: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
663 |
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
|
664 |
case 7: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
665 |
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
|
666 |
case 8: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
667 |
return mh.invokeExact(fn, selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5)); |
16228 | 668 |
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
|
669 |
return mh.invokeWithArguments(withArguments(fn, selfObj, paramCount, args)); |
16228 | 670 |
} |
671 |
} |
|
672 |
||
673 |
switch (paramCount) { |
|
674 |
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
|
675 |
return mh.invokeExact(selfObj); |
16228 | 676 |
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
|
677 |
return mh.invokeExact(selfObj, getArg(args, 0)); |
16228 | 678 |
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
|
679 |
return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1)); |
16228 | 680 |
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
|
681 |
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
|
682 |
case 5: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
683 |
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
|
684 |
case 6: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
685 |
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
|
686 |
case 7: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
687 |
return mh.invokeExact(selfObj, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5)); |
16228 | 688 |
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
|
689 |
return mh.invokeWithArguments(withArguments(null, selfObj, paramCount, args)); |
16228 | 690 |
} |
16216 | 691 |
} |
692 |
||
18614 | 693 |
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
|
694 |
final MethodHandle mh = getGenericConstructor(fn.getScope()); |
21458
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
695 |
final Object[] args = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments; |
18614 | 696 |
|
24881 | 697 |
DebuggerSupport.notifyInvoke(mh); |
698 |
||
18614 | 699 |
if (isVarArg(mh)) { |
700 |
if (needsCallee(mh)) { |
|
701 |
return mh.invokeExact(fn, args); |
|
702 |
} |
|
703 |
return mh.invokeExact(args); |
|
704 |
} |
|
705 |
||
706 |
final int paramCount = mh.type().parameterCount(); |
|
707 |
if (needsCallee(mh)) { |
|
708 |
switch (paramCount) { |
|
709 |
case 1: |
|
710 |
return mh.invokeExact(fn); |
|
711 |
case 2: |
|
712 |
return mh.invokeExact(fn, getArg(args, 0)); |
|
713 |
case 3: |
|
714 |
return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1)); |
|
715 |
case 4: |
|
716 |
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
|
717 |
case 5: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
718 |
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
|
719 |
case 6: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
720 |
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
|
721 |
case 7: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
722 |
return mh.invokeExact(fn, getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5)); |
18614 | 723 |
default: |
724 |
return mh.invokeWithArguments(withArguments(fn, paramCount, args)); |
|
725 |
} |
|
726 |
} |
|
727 |
||
728 |
switch (paramCount) { |
|
729 |
case 0: |
|
730 |
return mh.invokeExact(); |
|
731 |
case 1: |
|
732 |
return mh.invokeExact(getArg(args, 0)); |
|
733 |
case 2: |
|
734 |
return mh.invokeExact(getArg(args, 0), getArg(args, 1)); |
|
735 |
case 3: |
|
736 |
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
|
737 |
case 4: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
738 |
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
|
739 |
case 5: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
740 |
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
|
741 |
case 6: |
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
742 |
return mh.invokeExact(getArg(args, 0), getArg(args, 1), getArg(args, 2), getArg(args, 3), getArg(args, 4), getArg(args, 5)); |
18614 | 743 |
default: |
744 |
return mh.invokeWithArguments(withArguments(null, paramCount, args)); |
|
745 |
} |
|
746 |
} |
|
747 |
||
16228 | 748 |
private static Object getArg(final Object[] args, final int i) { |
749 |
return i < args.length ? args[i] : UNDEFINED; |
|
750 |
} |
|
751 |
||
18614 | 752 |
private static Object[] withArguments(final ScriptFunction fn, final int argCount, final Object[] args) { |
753 |
final Object[] finalArgs = new Object[argCount]; |
|
754 |
||
755 |
int nextArg = 0; |
|
756 |
if (fn != null) { |
|
757 |
//needs callee |
|
758 |
finalArgs[nextArg++] = fn; |
|
759 |
} |
|
760 |
||
761 |
// Don't add more args that there is argCount in the handle (including self and callee). |
|
762 |
for (int i = 0; i < args.length && nextArg < argCount;) { |
|
763 |
finalArgs[nextArg++] = args[i++]; |
|
764 |
} |
|
765 |
||
766 |
// If we have fewer args than argCount, pad with undefined. |
|
767 |
while (nextArg < argCount) { |
|
768 |
finalArgs[nextArg++] = UNDEFINED; |
|
769 |
} |
|
770 |
||
771 |
return finalArgs; |
|
772 |
} |
|
773 |
||
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
|
774 |
private static Object[] withArguments(final ScriptFunction fn, final Object self, final int argCount, final Object[] args) { |
16228 | 775 |
final Object[] finalArgs = new Object[argCount]; |
776 |
||
777 |
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
|
778 |
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
|
779 |
//needs callee |
16228 | 780 |
finalArgs[nextArg++] = fn; |
781 |
} |
|
782 |
finalArgs[nextArg++] = self; |
|
783 |
||
784 |
// Don't add more args that there is argCount in the handle (including self and callee). |
|
785 |
for (int i = 0; i < args.length && nextArg < argCount;) { |
|
786 |
finalArgs[nextArg++] = args[i++]; |
|
787 |
} |
|
788 |
||
789 |
// If we have fewer args than argCount, pad with undefined. |
|
790 |
while (nextArg < argCount) { |
|
791 |
finalArgs[nextArg++] = UNDEFINED; |
|
792 |
} |
|
793 |
||
794 |
return finalArgs; |
|
16216 | 795 |
} |
16228 | 796 |
/** |
797 |
* Takes a variable-arity method and binds a variable number of arguments in it. The returned method will filter the |
|
798 |
* vararg array and pass a different array that prepends the bound arguments in front of the arguments passed on |
|
799 |
* 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
|
800 |
* |
16228 | 801 |
* @param mh the handle |
802 |
* @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
|
803 |
* |
16228 | 804 |
* @return the bound method handle |
805 |
*/ |
|
806 |
private static MethodHandle varArgBinder(final MethodHandle mh, final Object[] args) { |
|
807 |
assert args != null; |
|
808 |
assert args.length > 0; |
|
809 |
return MH.filterArguments(mh, mh.type().parameterCount() - 1, MH.bindTo(BIND_VAR_ARGS, args)); |
|
810 |
} |
|
811 |
||
812 |
/** |
|
21458
eec7878b0dcd
8027301: Optimizations for Function.prototype.apply
hannesw
parents:
20946
diff
changeset
|
813 |
* 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
|
814 |
* {@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
|
815 |
* 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
|
816 |
* (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
|
817 |
* 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
|
818 |
* |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
819 |
* @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
|
820 |
* |
16216 | 821 |
* @return true if the method handle expects a callee, false otherwise |
822 |
*/ |
|
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
|
823 |
protected static boolean needsCallee(final MethodHandle mh) { |
24719 | 824 |
return needsCallee(mh.type()); |
825 |
} |
|
826 |
||
827 |
static boolean needsCallee(final MethodType type) { |
|
828 |
final int length = type.parameterCount(); |
|
829 |
||
830 |
if (length == 0) { |
|
831 |
return false; |
|
832 |
} |
|
833 |
||
834 |
final Class<?> param0 = type.parameterType(0); |
|
24720 | 835 |
return param0 == ScriptFunction.class || param0 == boolean.class && length > 1 && type.parameterType(1) == ScriptFunction.class; |
16216 | 836 |
} |
837 |
||
838 |
/** |
|
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
|
839 |
* Check if a javascript function methodhandle is a vararg handle |
16216 | 840 |
* |
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
|
841 |
* @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
|
842 |
* |
af8b30edebce
8009718: Lazy execution architecture continued - ScriptFunctionData is either final or recompilable. Moved ScriptFunctionData creation logic away from runtime to compile time. Prepared for method generation/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
|
843 |
* @return true if vararg |
16216 | 844 |
*/ |
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
|
845 |
protected static boolean isVarArg(final MethodHandle mh) { |
24719 | 846 |
return isVarArg(mh.type()); |
847 |
} |
|
848 |
||
849 |
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
|
850 |
return type.parameterType(type.parameterCount() - 1).isArray(); |
16228 | 851 |
} |
852 |
||
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
|
853 |
/** |
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
|
854 |
* 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
|
855 |
* @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
|
856 |
*/ |
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
|
857 |
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
|
858 |
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
|
859 |
} |
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
|
860 |
|
16228 | 861 |
@SuppressWarnings("unused") |
862 |
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
|
863 |
if (array2 == null) { |
16228 | 864 |
// Must clone it, as we can't allow the receiving method to alter the array |
865 |
return array1.clone(); |
|
866 |
} |
|
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
|
867 |
|
16228 | 868 |
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
|
869 |
if (l2 == 0) { |
16228 | 870 |
return array1.clone(); |
871 |
} |
|
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
|
872 |
|
16228 | 873 |
final int l1 = array1.length; |
874 |
final Object[] concat = new Object[l1 + l2]; |
|
875 |
System.arraycopy(array1, 0, concat, 0, l1); |
|
876 |
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
|
877 |
|
16228 | 878 |
return concat; |
879 |
} |
|
880 |
||
881 |
private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) { |
|
882 |
return MH.findStatic(MethodHandles.lookup(), ScriptFunctionData.class, name, MH.type(rtype, types)); |
|
883 |
} |
|
24753 | 884 |
|
885 |
/** |
|
886 |
* This class is used to hold the generic invoker and generic constructor pair. It is structured in this way since |
|
887 |
* most functions will never use them, so this way ScriptFunctionData only pays storage cost for one null reference |
|
888 |
* to the GenericInvokers object, instead of two null references for the two method handles. |
|
889 |
*/ |
|
890 |
private static final class GenericInvokers { |
|
891 |
volatile MethodHandle invoker; |
|
892 |
volatile MethodHandle constructor; |
|
893 |
} |
|
24769 | 894 |
|
895 |
private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException { |
|
896 |
in.defaultReadObject(); |
|
26055
fe8be844ba50
8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents:
26053
diff
changeset
|
897 |
code = new LinkedList<>(); |
24769 | 898 |
} |
16216 | 899 |
} |