author | attila |
Tue, 20 Oct 2015 23:34:16 +0200 | |
changeset 33339 | 334cd3ebfa5e |
parent 33337 | af3fea63e008 |
child 33342 | 86b4260bb17a |
permissions | -rw-r--r-- |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
1 |
/* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
2 |
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
4 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. Oracle designates this |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
10 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
15 |
* accompanied this code). |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
16 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
20 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
22 |
* or visit www.oracle.com if you need additional information or have any |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
23 |
* questions. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
24 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
25 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
26 |
/* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
27 |
* This file is available under and governed by the GNU General Public |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
28 |
* License version 2 only, as published by the Free Software Foundation. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
29 |
* However, the following notice accompanied the original version of this |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
30 |
* file, and Oracle licenses the original version of this file under the BSD |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
31 |
* license: |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
32 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
33 |
/* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
34 |
Copyright 2009-2013 Attila Szegedi |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
35 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
36 |
Licensed under both the Apache License, Version 2.0 (the "Apache License") |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
37 |
and the BSD License (the "BSD License"), with licensee being free to |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
38 |
choose either of the two at their discretion. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
39 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
40 |
You may not use this file except in compliance with either the Apache |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
41 |
License or the BSD License. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
42 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
43 |
If you choose to use this file in compliance with the Apache License, the |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
44 |
following notice applies to you: |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
45 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
46 |
You may obtain a copy of the Apache License at |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
47 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
48 |
http://www.apache.org/licenses/LICENSE-2.0 |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
49 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
50 |
Unless required by applicable law or agreed to in writing, software |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
51 |
distributed under the License is distributed on an "AS IS" BASIS, |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
52 |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
53 |
implied. See the License for the specific language governing |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
54 |
permissions and limitations under the License. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
55 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
56 |
If you choose to use this file in compliance with the BSD License, the |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
57 |
following notice applies to you: |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
58 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
59 |
Redistribution and use in source and binary forms, with or without |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
60 |
modification, are permitted provided that the following conditions are |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
61 |
met: |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
62 |
* Redistributions of source code must retain the above copyright |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
63 |
notice, this list of conditions and the following disclaimer. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
64 |
* Redistributions in binary form must reproduce the above copyright |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
65 |
notice, this list of conditions and the following disclaimer in the |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
66 |
documentation and/or other materials provided with the distribution. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
67 |
* Neither the name of the copyright holder nor the names of |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
68 |
contributors may be used to endorse or promote products derived from |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
69 |
this software without specific prior written permission. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
70 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
71 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
72 |
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
73 |
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
74 |
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
75 |
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
76 |
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
77 |
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
78 |
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
79 |
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
80 |
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
81 |
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
82 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
83 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
84 |
package jdk.internal.dynalink; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
85 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
86 |
import java.lang.invoke.MethodHandle; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
87 |
import java.lang.invoke.MethodHandles; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
88 |
import java.lang.invoke.MethodType; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
89 |
import java.lang.invoke.MutableCallSite; |
28785
a503c972d4bd
8072595: nashorn should not use obj.getClass() for null checks
sundar
parents:
25865
diff
changeset
|
90 |
import java.util.Objects; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
91 |
import jdk.internal.dynalink.linker.GuardedInvocation; |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
92 |
import jdk.internal.dynalink.linker.GuardedInvocationTransformer; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
93 |
import jdk.internal.dynalink.linker.GuardingDynamicLinker; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
94 |
import jdk.internal.dynalink.linker.LinkRequest; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
95 |
import jdk.internal.dynalink.linker.LinkerServices; |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
96 |
import jdk.internal.dynalink.linker.support.Lookup; |
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
97 |
import jdk.internal.dynalink.linker.support.SimpleLinkRequest; |
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
98 |
import jdk.internal.dynalink.support.ChainedCallSite; |
33330
35531ae624ef
8139304: Remove elaborate call site descriptor class hierarchy and factory for them. Remove AutoDiscovery, DefaultPrelinkFilter, and BottomGuardingDynamicLinker as they can be inlined into DynamicLinkerFactory. Remove CallerSensitiveDetector as it can be inlined into AbstractJavaLinker. Make ClassMap non-public.
attila
parents:
33007
diff
changeset
|
99 |
import jdk.internal.dynalink.support.SimpleCallSiteDescriptor; |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
100 |
import jdk.internal.dynalink.support.SimpleRelinkableCallSite; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
101 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
102 |
/** |
33339 | 103 |
* The linker for {@link RelinkableCallSite} objects. A dynamic linker is a main |
104 |
* objects when using Dynalink, it coordinates linking of call sites with |
|
105 |
* linkers of available language runtimes that are represented by |
|
106 |
* {@link GuardingDynamicLinker} objects (you only need to deal with these if |
|
107 |
* you are yourself implementing a language runtime with its own object model |
|
108 |
* and/or type conversions). To use Dynalink, you have to create one or more |
|
109 |
* dynamic linkers using a {@link DynamicLinkerFactory}. Subsequently, you need |
|
110 |
* to invoke its {@link #link(RelinkableCallSite)} method from |
|
111 |
* {@code invokedynamic} bootstrap methods to let it manage all the call sites |
|
112 |
* they create. Usual usage would be to create at least one class per language |
|
113 |
* runtime to contain one linker instance as: |
|
33333 | 114 |
* <pre> |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
115 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
116 |
* class MyLanguageRuntime { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
117 |
* private static final GuardingDynamicLinker myLanguageLinker = new MyLanguageLinker(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
118 |
* private static final DynamicLinker dynamicLinker = createDynamicLinker(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
119 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
120 |
* private static DynamicLinker createDynamicLinker() { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
121 |
* final DynamicLinkerFactory factory = new DynamicLinkerFactory(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
122 |
* factory.setPrioritizedLinker(myLanguageLinker); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
123 |
* return factory.createLinker(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
124 |
* } |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
125 |
* |
32534
b3ec7f3b3c2a
8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents:
31097
diff
changeset
|
126 |
* public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) { |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
127 |
* return dynamicLinker.link(new SimpleRelinkableCallSite(new SimpleCallSiteDescriptor(lookup, name, type))); |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
128 |
* } |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
129 |
* } |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
130 |
* </pre> |
33339 | 131 |
* The above setup of one static linker instance is often too simple. You will |
132 |
* often have your language runtime have a concept of some kind of |
|
133 |
* "context class loader" and you will want to create one dynamic linker per |
|
134 |
* such class loader, to ensure it incorporates linkers for all other language |
|
135 |
* runtimes visible to that class loader (see |
|
136 |
* {@link DynamicLinkerFactory#setClassLoader(ClassLoader)}). |
|
137 |
* <p> |
|
138 |
* There are three components you need to provide in the above example: |
|
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
139 |
* <ul> |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
140 |
* |
33339 | 141 |
* <li>You are expected to provide a {@link GuardingDynamicLinker} for your own |
142 |
* language. If your runtime doesn't have its own object model or type |
|
143 |
* conversions, you don't need to implement a {@code GuardingDynamicLinker}; you |
|
144 |
* would simply not invoke the {@code setPrioritizedLinker} method on the factory.</li> |
|
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
145 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
146 |
* <li>The performance of the programs can depend on your choice of the class to |
33339 | 147 |
* represent call sites. The above example used |
148 |
* {@link SimpleRelinkableCallSite}, but you might want to use |
|
149 |
* {@link ChainedCallSite} instead. You'll need to experiment and decide what |
|
150 |
* fits your runtime the best. You can further subclass either of these or |
|
151 |
* implement your own.</li> |
|
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
152 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
153 |
* <li>You also need to provide {@link CallSiteDescriptor}s to your call sites. |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
154 |
* They are immutable objects that contain all the information about the call |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
155 |
* site: the class performing the lookups, the name of the method being invoked, |
33339 | 156 |
* and the method signature. The library provides a |
157 |
* {@link SimpleCallSiteDescriptor}, or you can create your own descriptor |
|
158 |
* classes, especially if you need to add further information to them |
|
159 |
* (typically, values passed in additional parameters to the bootstrap method). |
|
160 |
* Since they are specified to be immutable, you can set up a cache for |
|
161 |
* equivalent descriptors to have the call sites share them.</li> |
|
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
162 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
163 |
* </ul> |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
164 |
*/ |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
165 |
public final class DynamicLinker { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
166 |
private static final String CLASS_NAME = DynamicLinker.class.getName(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
167 |
private static final String RELINK_METHOD_NAME = "relink"; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
168 |
|
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
169 |
private static final String INITIAL_LINK_CLASS_NAME = "java.lang.invoke.MethodHandleNatives"; |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
170 |
private static final String INITIAL_LINK_METHOD_NAME = "linkCallSite"; |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
171 |
private static final String INVOKE_PACKAGE_PREFIX = "java.lang.invoke."; |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
172 |
|
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
173 |
private final LinkerServices linkerServices; |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
174 |
private final GuardedInvocationTransformer prelinkTransformer; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
175 |
private final boolean syncOnRelink; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
176 |
private final int unstableRelinkThreshold; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
177 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
178 |
/** |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
179 |
* Creates a new dynamic linker. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
180 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
181 |
* @param linkerServices the linkerServices used by the linker, created by the factory. |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
182 |
* @param prelinkTransformer see {@link DynamicLinkerFactory#setPrelinkTransformer(GuardedInvocationTransformer)} |
33332
f180be6368d8
8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents:
33331
diff
changeset
|
183 |
* @param syncOnRelink see {@link DynamicLinkerFactory#setSyncOnRelink(boolean)} |
f180be6368d8
8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents:
33331
diff
changeset
|
184 |
* @param unstableRelinkThreshold see {@link DynamicLinkerFactory#setUnstableRelinkThreshold(int)} |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
185 |
*/ |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
186 |
DynamicLinker(final LinkerServices linkerServices, final GuardedInvocationTransformer prelinkTransformer, |
24778
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
187 |
final boolean syncOnRelink, final int unstableRelinkThreshold) { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
188 |
if(unstableRelinkThreshold < 0) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
189 |
throw new IllegalArgumentException("unstableRelinkThreshold < 0"); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
190 |
} |
24719 | 191 |
this.linkerServices = linkerServices; |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
192 |
this.prelinkTransformer = prelinkTransformer; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
193 |
this.syncOnRelink = syncOnRelink; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
194 |
this.unstableRelinkThreshold = unstableRelinkThreshold; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
195 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
196 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
197 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
198 |
* Links an invokedynamic call site. It will install a method handle into |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
199 |
* the call site that invokes the relinking mechanism of this linker. Next |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
200 |
* time the call site is invoked, it will be linked for the actual arguments |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
201 |
* it was invoked with. |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
202 |
* |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
203 |
* @param <T> the particular subclass of {@link RelinkableCallSite} for |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
204 |
* which to create a link. |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
205 |
* @param callSite the call site to link. |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
206 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
207 |
* @return the callSite, for easy call chaining. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
208 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
209 |
public <T extends RelinkableCallSite> T link(final T callSite) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
210 |
callSite.initialize(createRelinkAndInvokeMethod(callSite, 0)); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
211 |
return callSite; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
212 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
213 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
214 |
/** |
33333 | 215 |
* Returns the object representing the linker services of this class that |
33339 | 216 |
* are normally exposed to individual {@link GuardingDynamicLinker |
217 |
* language-specific linkers}. While as a user of this class you normally |
|
218 |
* only care about the {@link #link(RelinkableCallSite)} method, in certain |
|
219 |
* circumstances you might want to use the lower level services directly; |
|
220 |
* either to lookup specific method handles, to access the type converters, |
|
221 |
* and so on. |
|
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
222 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
223 |
* @return the object representing the linker services of this class. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
224 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
225 |
public LinkerServices getLinkerServices() { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
226 |
return linkerServices; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
227 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
228 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
229 |
private static final MethodHandle RELINK = Lookup.findOwnSpecial(MethodHandles.lookup(), RELINK_METHOD_NAME, |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
230 |
MethodHandle.class, RelinkableCallSite.class, int.class, Object[].class); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
231 |
|
24778
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
232 |
private MethodHandle createRelinkAndInvokeMethod(final RelinkableCallSite callSite, final int relinkCount) { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
233 |
// Make a bound MH of invoke() for this linker and call site |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
234 |
final MethodHandle boundRelinker = MethodHandles.insertArguments(RELINK, 0, this, callSite, Integer.valueOf( |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
235 |
relinkCount)); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
236 |
// Make a MH that gathers all arguments to the invocation into an Object[] |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
237 |
final MethodType type = callSite.getDescriptor().getMethodType(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
238 |
final MethodHandle collectingRelinker = boundRelinker.asCollector(Object[].class, type.parameterCount()); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
239 |
return MethodHandles.foldArguments(MethodHandles.exactInvoker(type), collectingRelinker.asType( |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
240 |
type.changeReturnType(MethodHandle.class))); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
241 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
242 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
243 |
/** |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
244 |
* Relinks a call site conforming to the invocation arguments. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
245 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
246 |
* @param callSite the call site itself |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
247 |
* @param arguments arguments to the invocation |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
248 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
249 |
* @return return the method handle for the invocation |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
250 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
251 |
* @throws Exception rethrows any exception thrown by the linkers |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
252 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
253 |
@SuppressWarnings("unused") |
24778
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
254 |
private MethodHandle relink(final RelinkableCallSite callSite, final int relinkCount, final Object... arguments) throws Exception { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
255 |
final CallSiteDescriptor callSiteDescriptor = callSite.getDescriptor(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
256 |
final boolean unstableDetectionEnabled = unstableRelinkThreshold > 0; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
257 |
final boolean callSiteUnstable = unstableDetectionEnabled && relinkCount >= unstableRelinkThreshold; |
33332
f180be6368d8
8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents:
33331
diff
changeset
|
258 |
final LinkRequest linkRequest = new SimpleLinkRequest(callSiteDescriptor, callSiteUnstable, arguments); |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
259 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
260 |
GuardedInvocation guardedInvocation = linkerServices.getGuardedInvocation(linkRequest); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
261 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
262 |
// None found - throw an exception |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
263 |
if(guardedInvocation == null) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
264 |
throw new NoSuchDynamicMethodException(callSiteDescriptor.toString()); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
265 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
266 |
|
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
267 |
// Make sure we transform the invocation before linking it into the call site. This is typically used to match the |
24719 | 268 |
// return type of the invocation to the call site. |
33337
af3fea63e008
8139761: Improve Dynalink class nomenclature and package organization
attila
parents:
33335
diff
changeset
|
269 |
guardedInvocation = prelinkTransformer.filter(guardedInvocation, linkRequest, linkerServices); |
28785
a503c972d4bd
8072595: nashorn should not use obj.getClass() for null checks
sundar
parents:
25865
diff
changeset
|
270 |
Objects.requireNonNull(guardedInvocation); |
24719 | 271 |
|
16245
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
272 |
int newRelinkCount = relinkCount; |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
273 |
// Note that the short-circuited "&&" evaluation below ensures we'll increment the relinkCount until |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
274 |
// threshold + 1 but not beyond that. Threshold + 1 is treated as a special value to signal that resetAndRelink |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
275 |
// has already executed once for the unstable call site; we only want the call site to throw away its current |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
276 |
// linkage once, when it transitions to unstable. |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
277 |
if(unstableDetectionEnabled && newRelinkCount <= unstableRelinkThreshold && newRelinkCount++ == unstableRelinkThreshold) { |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
278 |
callSite.resetAndRelink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount)); |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
279 |
} else { |
16245
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
280 |
callSite.relink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount)); |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
281 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
282 |
if(syncOnRelink) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
283 |
MutableCallSite.syncAll(new MutableCallSite[] { (MutableCallSite)callSite }); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
284 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
285 |
return guardedInvocation.getInvocation(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
286 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
287 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
288 |
/** |
33333 | 289 |
* Returns a stack trace element describing the location of the |
290 |
* {@code invokedynamic} call site currently being linked on the current |
|
33339 | 291 |
* thread. The operation is potentially expensive as it needs to generate a |
292 |
* stack trace to inspect it and is intended for use in diagnostics code. |
|
293 |
* For "free-floating" call sites (not associated with an |
|
33333 | 294 |
* {@code invokedynamic} instruction), the result is not well-defined. |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
295 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
296 |
* @return a stack trace element describing the location of the call site |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
297 |
* currently being linked, or null if it is not invoked while a call |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
298 |
* site is being linked. |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
299 |
*/ |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
300 |
public static StackTraceElement getLinkedCallSiteLocation() { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
301 |
final StackTraceElement[] trace = new Throwable().getStackTrace(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
302 |
for(int i = 0; i < trace.length - 1; ++i) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
303 |
final StackTraceElement frame = trace[i]; |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
304 |
// If we found any of our linking entry points on the stack... |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
305 |
if(isRelinkFrame(frame) || isInitialLinkFrame(frame)) { |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
306 |
// ... then look for the first thing calling it that isn't j.l.invoke |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
307 |
for (int j = i + 1; j < trace.length; ++j) { |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
308 |
final StackTraceElement frame2 = trace[j]; |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
309 |
if (!frame2.getClassName().startsWith(INVOKE_PACKAGE_PREFIX)) { |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
310 |
return frame2; |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
311 |
} |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
312 |
} |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
313 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
314 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
315 |
return null; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
316 |
} |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
317 |
|
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
318 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
319 |
* Returns {@code true} if the frame represents {@code MethodHandleNatives.linkCallSite()}, |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
320 |
* the frame immediately on top of the call site frame when the call site is |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
321 |
* being linked for the first time. |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
322 |
* |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
323 |
* @param frame the frame |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
324 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
325 |
* @return {@code true} if this frame represents {@code MethodHandleNatives.linkCallSite()}. |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
326 |
*/ |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
327 |
private static boolean isInitialLinkFrame(final StackTraceElement frame) { |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
328 |
return testFrame(frame, INITIAL_LINK_METHOD_NAME, INITIAL_LINK_CLASS_NAME); |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
329 |
} |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
330 |
|
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
331 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
332 |
* Returns {@code true} if the frame represents {@code DynamicLinker.relink()}, |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
333 |
* the frame immediately on top of the call site frame when the call site is |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
334 |
* being relinked (linked for second and subsequent times). |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
335 |
* |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
336 |
* @param frame the frame |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
337 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
338 |
* @return {@code true} if this frame represents {@code DynamicLinker.relink()}. |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
339 |
*/ |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
340 |
private static boolean isRelinkFrame(final StackTraceElement frame) { |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
341 |
return testFrame(frame, RELINK_METHOD_NAME, CLASS_NAME); |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
342 |
} |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
343 |
|
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
344 |
private static boolean testFrame(final StackTraceElement frame, final String methodName, final String className) { |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
345 |
return methodName.equals(frame.getMethodName()) && className.equals(frame.getClassName()); |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
346 |
} |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
347 |
} |