author | attila |
Mon, 19 Oct 2015 08:30:03 +0200 | |
changeset 33331 | 273e6a10de22 |
parent 33330 | 35531ae624ef |
child 33332 | f180be6368d8 |
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; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
90 |
import java.util.List; |
28785
a503c972d4bd
8072595: nashorn should not use obj.getClass() for null checks
sundar
parents:
25865
diff
changeset
|
91 |
import java.util.Objects; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
92 |
import jdk.internal.dynalink.linker.GuardedInvocation; |
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; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
96 |
import jdk.internal.dynalink.support.LinkRequestImpl; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
97 |
import jdk.internal.dynalink.support.Lookup; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
98 |
import jdk.internal.dynalink.support.RuntimeContextLinkRequestImpl; |
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; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
100 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
101 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
102 |
* The linker for {@link RelinkableCallSite} objects. Users of it (scripting |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
103 |
* frameworks and language runtimes) have to create a linker using the |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
104 |
* {@link DynamicLinkerFactory} and invoke its link method from the invokedynamic |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
105 |
* bootstrap methods to set the target of all the call sites in the code they |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
106 |
* generate. Usual usage would be to create one class per language runtime to |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
107 |
* contain one linker instance as: |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
108 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
109 |
* <pre> |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
110 |
* class MyLanguageRuntime { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
111 |
* private static final GuardingDynamicLinker myLanguageLinker = new MyLanguageLinker(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
112 |
* private static final DynamicLinker dynamicLinker = createDynamicLinker(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
113 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
114 |
* private static DynamicLinker createDynamicLinker() { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
115 |
* final DynamicLinkerFactory factory = new DynamicLinkerFactory(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
116 |
* factory.setPrioritizedLinker(myLanguageLinker); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
117 |
* return factory.createLinker(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
118 |
* } |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
119 |
* |
32534
b3ec7f3b3c2a
8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents:
31097
diff
changeset
|
120 |
* public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
121 |
* return dynamicLinker.link(new MonomorphicCallSite(CallSiteDescriptorFactory.create(lookup, name, type))); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
122 |
* } |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
123 |
* } |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
124 |
* </pre> |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
125 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
126 |
* Note how there are three components you will need to provide here: |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
127 |
* <ul> |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
128 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
129 |
* <li>You're expected to provide a {@link GuardingDynamicLinker} for your own |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
130 |
* language. If your runtime doesn't have its own language and/or object model |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
131 |
* (i.e., it's a generic scripting shell), you don't need to implement a dynamic |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
132 |
* linker; you would simply not invoke the {@code setPrioritizedLinker} method |
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
|
133 |
* on the factory.</li> |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
134 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
135 |
* <li>The performance of the programs can depend on your choice of the class to |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
136 |
* represent call sites. The above example used {@link MonomorphicCallSite}, but |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
137 |
* you might want to use {@link ChainedCallSite} instead. You'll need to |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
138 |
* experiment and decide what fits your language runtime the best. You can |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
139 |
* subclass either of these or roll your own if you need to.</li> |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
140 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
141 |
* <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
|
142 |
* 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
|
143 |
* site: the class performing the lookups, the name of the method being invoked, |
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
|
144 |
* and the method signature. The library provides a {@link SimpleCallSiteDescriptor}, |
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
|
145 |
* or you can create your own descriptor classes, especially if you need to add |
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
|
146 |
* further information (values passed in additional parameters to the bootstrap method) |
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
|
147 |
* to them.</li> |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
148 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
149 |
* </ul> |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
150 |
*/ |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
151 |
public final class DynamicLinker { |
33331
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
152 |
/** |
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
153 |
* A permission to invoke the {@link #getCurrentLinkRequest()} method. It is named |
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
154 |
* {@code "dynalink.getCurrentLinkRequest"}. |
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
155 |
*/ |
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
156 |
public static final RuntimePermission GET_CURRENT_LINK_REQUEST_PERMISSION = new RuntimePermission("dynalink.getCurrentLinkRequest"); |
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
157 |
|
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
158 |
private static final String CLASS_NAME = DynamicLinker.class.getName(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
159 |
private static final String RELINK_METHOD_NAME = "relink"; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
160 |
|
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
161 |
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
|
162 |
private static final String INITIAL_LINK_METHOD_NAME = "linkCallSite"; |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
163 |
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
|
164 |
|
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
165 |
private final LinkerServices linkerServices; |
24719 | 166 |
private final GuardedInvocationFilter prelinkFilter; |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
167 |
private final int runtimeContextArgCount; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
168 |
private final boolean syncOnRelink; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
169 |
private final int unstableRelinkThreshold; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
170 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
171 |
/** |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
172 |
* Creates a new dynamic linker. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
173 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
174 |
* @param linkerServices the linkerServices used by the linker, created by the factory. |
24719 | 175 |
* @param prelinkFilter see {@link DynamicLinkerFactory#setPrelinkFilter(GuardedInvocationFilter)} |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
176 |
* @param runtimeContextArgCount see {@link DynamicLinkerFactory#setRuntimeContextArgCount(int)} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
177 |
*/ |
24778
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
178 |
DynamicLinker(final LinkerServices linkerServices, final GuardedInvocationFilter prelinkFilter, final int runtimeContextArgCount, |
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
179 |
final boolean syncOnRelink, final int unstableRelinkThreshold) { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
180 |
if(runtimeContextArgCount < 0) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
181 |
throw new IllegalArgumentException("runtimeContextArgCount < 0"); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
182 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
183 |
if(unstableRelinkThreshold < 0) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
184 |
throw new IllegalArgumentException("unstableRelinkThreshold < 0"); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
185 |
} |
24719 | 186 |
this.linkerServices = linkerServices; |
187 |
this.prelinkFilter = prelinkFilter; |
|
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
188 |
this.runtimeContextArgCount = runtimeContextArgCount; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
189 |
this.syncOnRelink = syncOnRelink; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
190 |
this.unstableRelinkThreshold = unstableRelinkThreshold; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
191 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
192 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
193 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
194 |
* 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
|
195 |
* 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
|
196 |
* 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
|
197 |
* it was invoked with. |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
198 |
* |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
199 |
* @param <T> the particular subclass of {@link RelinkableCallSite} for |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
200 |
* which to create a link. |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
201 |
* @param callSite the call site to link. |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
202 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
203 |
* @return the callSite, for easy call chaining. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
204 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
205 |
public <T extends RelinkableCallSite> T link(final T callSite) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
206 |
callSite.initialize(createRelinkAndInvokeMethod(callSite, 0)); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
207 |
return callSite; |
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 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
210 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
211 |
* Returns the object representing the lower level linker services of this |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
212 |
* class that are normally exposed to individual language-specific linkers. |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
213 |
* While as a user of this class you normally only care about the |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
214 |
* {@link #link(RelinkableCallSite)} method, in certain circumstances you |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
215 |
* might want to use the lower level services directly; either to lookup |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
216 |
* specific method handles, to access the type converters, and so on. |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
217 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
218 |
* @return the object representing the linker services of this class. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
219 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
220 |
public LinkerServices getLinkerServices() { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
221 |
return linkerServices; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
222 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
223 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
224 |
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
|
225 |
MethodHandle.class, RelinkableCallSite.class, int.class, Object[].class); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
226 |
|
24778
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
227 |
private MethodHandle createRelinkAndInvokeMethod(final RelinkableCallSite callSite, final int relinkCount) { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
228 |
// 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
|
229 |
final MethodHandle boundRelinker = MethodHandles.insertArguments(RELINK, 0, this, callSite, Integer.valueOf( |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
230 |
relinkCount)); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
231 |
// 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
|
232 |
final MethodType type = callSite.getDescriptor().getMethodType(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
233 |
final MethodHandle collectingRelinker = boundRelinker.asCollector(Object[].class, type.parameterCount()); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
234 |
return MethodHandles.foldArguments(MethodHandles.exactInvoker(type), collectingRelinker.asType( |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
235 |
type.changeReturnType(MethodHandle.class))); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
236 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
237 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
238 |
/** |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
239 |
* Relinks a call site conforming to the invocation arguments. |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
240 |
* |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
241 |
* @param callSite the call site itself |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
242 |
* @param arguments arguments to the invocation |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
243 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
244 |
* @return return the method handle for the invocation |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
245 |
* |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
246 |
* @throws Exception rethrows any exception thrown by the linkers |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
247 |
*/ |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
248 |
@SuppressWarnings("unused") |
24778
2ff5d7041566
8044638: Tidy up Nashorn codebase for code standards
attila
parents:
24720
diff
changeset
|
249 |
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
|
250 |
final CallSiteDescriptor callSiteDescriptor = callSite.getDescriptor(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
251 |
final boolean unstableDetectionEnabled = unstableRelinkThreshold > 0; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
252 |
final boolean callSiteUnstable = unstableDetectionEnabled && relinkCount >= unstableRelinkThreshold; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
253 |
final LinkRequest linkRequest = |
24719 | 254 |
runtimeContextArgCount == 0 ? |
24720 | 255 |
new LinkRequestImpl(callSiteDescriptor, callSite, relinkCount, callSiteUnstable, arguments) : |
256 |
new RuntimeContextLinkRequestImpl(callSiteDescriptor, callSite, relinkCount, callSiteUnstable, arguments, runtimeContextArgCount); |
|
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
257 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
258 |
GuardedInvocation guardedInvocation = linkerServices.getGuardedInvocation(linkRequest); |
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 |
// None found - throw an exception |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
261 |
if(guardedInvocation == null) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
262 |
throw new NoSuchDynamicMethodException(callSiteDescriptor.toString()); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
263 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
264 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
265 |
// If our call sites have a runtime context, and the linker produced a context-stripped invocation, adapt the |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
266 |
// produced invocation into contextual invocation (by dropping the context...) |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
267 |
if(runtimeContextArgCount > 0) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
268 |
final MethodType origType = callSiteDescriptor.getMethodType(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
269 |
final MethodHandle invocation = guardedInvocation.getInvocation(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
270 |
if(invocation.type().parameterCount() == origType.parameterCount() - runtimeContextArgCount) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
271 |
final List<Class<?>> prefix = origType.parameterList().subList(1, runtimeContextArgCount + 1); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
272 |
final MethodHandle guard = guardedInvocation.getGuard(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
273 |
guardedInvocation = guardedInvocation.dropArguments(1, prefix); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
274 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
275 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
276 |
|
24719 | 277 |
// Make sure we filter the invocation before linking it into the call site. This is typically used to match the |
278 |
// return type of the invocation to the call site. |
|
279 |
guardedInvocation = prelinkFilter.filter(guardedInvocation, linkRequest, linkerServices); |
|
28785
a503c972d4bd
8072595: nashorn should not use obj.getClass() for null checks
sundar
parents:
25865
diff
changeset
|
280 |
Objects.requireNonNull(guardedInvocation); |
24719 | 281 |
|
16245
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
282 |
int newRelinkCount = relinkCount; |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
283 |
// 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
|
284 |
// 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
|
285 |
// 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
|
286 |
// linkage once, when it transitions to unstable. |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
287 |
if(unstableDetectionEnabled && newRelinkCount <= unstableRelinkThreshold && newRelinkCount++ == unstableRelinkThreshold) { |
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
288 |
callSite.resetAndRelink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount)); |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
289 |
} else { |
16245
6a1c6c8bc113
8008371: Fix Dynalink compiler warnings and whitespace
attila
parents:
16234
diff
changeset
|
290 |
callSite.relink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount)); |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
291 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
292 |
if(syncOnRelink) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
293 |
MutableCallSite.syncAll(new MutableCallSite[] { (MutableCallSite)callSite }); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
294 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
295 |
return guardedInvocation.getInvocation(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
296 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
297 |
|
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
298 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
299 |
* Returns 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
|
300 |
* currently being linked on the current thread. The operation internally |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
301 |
* creates a Throwable object and inspects its stack trace, so it's |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
302 |
* potentially expensive. The recommended usage for it is in writing |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
303 |
* diagnostics code. |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
304 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
305 |
* @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
|
306 |
* 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
|
307 |
* site is being linked. |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
308 |
*/ |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
309 |
public static StackTraceElement getLinkedCallSiteLocation() { |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
310 |
final StackTraceElement[] trace = new Throwable().getStackTrace(); |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
311 |
for(int i = 0; i < trace.length - 1; ++i) { |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
312 |
final StackTraceElement frame = trace[i]; |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
313 |
// 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
|
314 |
if(isRelinkFrame(frame) || isInitialLinkFrame(frame)) { |
33003
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
315 |
// ... 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
|
316 |
for (int j = i + 1; j < trace.length; ++j) { |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
317 |
final StackTraceElement frame2 = trace[j]; |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
318 |
if (!frame2.getClassName().startsWith(INVOKE_PACKAGE_PREFIX)) { |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
319 |
return frame2; |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
320 |
} |
f1e00197031f
8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents:
32534
diff
changeset
|
321 |
} |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
322 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
323 |
} |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
324 |
return null; |
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
325 |
} |
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 |
/** |
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
|
328 |
* Returns the currently processed link request, or null if the method is invoked outside of the linking process. |
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
|
329 |
* @return the currently processed link request, or null. |
33331
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
330 |
* @throws SecurityException if the calling code doesn't have the {@code "dynalink.getCurrentLinkRequest"} |
273e6a10de22
8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents:
33330
diff
changeset
|
331 |
* runtime permission (available as {@link #GET_CURRENT_LINK_REQUEST_PERMISSION}). |
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
|
332 |
*/ |
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
|
333 |
public static LinkRequest getCurrentLinkRequest() { |
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
|
334 |
return LinkerServicesImpl.getCurrentLinkRequest(); |
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
|
335 |
} |
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
|
336 |
|
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
|
337 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
338 |
* Returns {@code true} if the frame represents {@code MethodHandleNatives.linkCallSite()}, |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
339 |
* 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
|
340 |
* being linked for the first time. |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
341 |
* |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
342 |
* @param frame the frame |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
343 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
344 |
* @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
|
345 |
*/ |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
346 |
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
|
347 |
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
|
348 |
} |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
349 |
|
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
350 |
/** |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
351 |
* Returns {@code true} if the frame represents {@code DynamicLinker.relink()}, |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
352 |
* 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
|
353 |
* being relinked (linked for second and subsequent times). |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
354 |
* |
18880
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
355 |
* @param frame the frame |
31097
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
356 |
* |
996397e0a35c
8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents:
28785
diff
changeset
|
357 |
* @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
|
358 |
*/ |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
359 |
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
|
360 |
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
|
361 |
} |
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
362 |
|
89eafd5b9ff7
8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents:
16245
diff
changeset
|
363 |
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
|
364 |
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
|
365 |
} |
16234
86cb162cec6c
8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff
changeset
|
366 |
} |