nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java
author attila
Mon, 19 Oct 2015 08:45:29 +0200
changeset 33333 0bad500ce4e0
parent 33332 f180be6368d8
child 33335 a46c85103868
permissions -rw-r--r--
8139590: Improve Dynalink JavaDoc Reviewed-by: hannesw, lagergren
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    92
import jdk.internal.dynalink.linker.GuardingDynamicLinker;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    93
import jdk.internal.dynalink.linker.LinkRequest;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    94
import jdk.internal.dynalink.linker.LinkerServices;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    95
import jdk.internal.dynalink.support.Lookup;
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
    96
import jdk.internal.dynalink.support.SimpleCallSiteDescriptor;
33332
f180be6368d8 8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents: 33331
diff changeset
    97
import jdk.internal.dynalink.support.SimpleLinkRequest;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    98
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    99
/**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   100
 * The linker for {@link RelinkableCallSite} objects. Users of Dynalink have to
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   101
 * create a linker using the {@link DynamicLinkerFactory} and invoke its
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   102
 * {@link #link(RelinkableCallSite)} method from the invokedynamic bootstrap
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   103
 * methods to let it manage all the call sites they create. Usual usage would be
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   104
 * to create one class per language runtime to contain one linker instance as:
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   105
 * <pre>
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   106
 *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   107
 * class MyLanguageRuntime {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   108
 *     private static final GuardingDynamicLinker myLanguageLinker = new MyLanguageLinker();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   109
 *     private static final DynamicLinker dynamicLinker = createDynamicLinker();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   110
 *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   111
 *     private static DynamicLinker createDynamicLinker() {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   112
 *         final DynamicLinkerFactory factory = new DynamicLinkerFactory();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   113
 *         factory.setPrioritizedLinker(myLanguageLinker);
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   114
 *         return factory.createLinker();
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
 *
32534
b3ec7f3b3c2a 8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents: 31097
diff changeset
   117
 *     public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   118
 *         return dynamicLinker.link(new MonomorphicCallSite(new SimpleCallSiteDescriptor(lookup, name, type)));
16234
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
 * }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   121
 * </pre>
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
 * 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
   124
 * <ul>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   125
 *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   126
 * <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
   127
 * 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
   128
 * (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
   129
 * 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
   130
 * on the factory.</li>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   131
 *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   132
 * <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
   133
 * represent call sites. The above example used {@link MonomorphicCallSite}, but
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   134
 * 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
   135
 * 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
   136
 * 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
   137
 *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   138
 * <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
   139
 * 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
   140
 * 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
   141
 * 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
   142
 * 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
   143
 * 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
   144
 * to them.</li>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   145
 *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   146
 * </ul>
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   147
 */
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   148
public final class DynamicLinker {
33331
273e6a10de22 8139435: Make sure CallSiteDescriptor.getLookup is subject to a security check
attila
parents: 33330
diff changeset
   149
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   150
     * A permission to invoke the {@link #getCurrentLinkRequest()} method. It is
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   151
     * named {@code "dynalink.getCurrentLinkRequest"}.
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
    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
   154
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   155
    private static final String CLASS_NAME = DynamicLinker.class.getName();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   156
    private static final String RELINK_METHOD_NAME = "relink";
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   157
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   158
    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
   159
    private static final String INITIAL_LINK_METHOD_NAME = "linkCallSite";
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   160
    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
   161
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   162
    private final LinkerServices linkerServices;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   163
    private final GuardedInvocationFilter prelinkFilter;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   164
    private final boolean syncOnRelink;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   165
    private final int unstableRelinkThreshold;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   166
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   167
    /**
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   168
     * Creates a new dynamic linker.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   169
     *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   170
     * @param linkerServices the linkerServices used by the linker, created by the factory.
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   171
     * @param prelinkFilter see {@link DynamicLinkerFactory#setPrelinkFilter(GuardedInvocationFilter)}
33332
f180be6368d8 8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents: 33331
diff changeset
   172
     * @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
   173
     * @param unstableRelinkThreshold see {@link DynamicLinkerFactory#setUnstableRelinkThreshold(int)}
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   174
     */
33332
f180be6368d8 8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents: 33331
diff changeset
   175
    DynamicLinker(final LinkerServices linkerServices, final GuardedInvocationFilter prelinkFilter,
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   176
            final boolean syncOnRelink, final int unstableRelinkThreshold) {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   177
        if(unstableRelinkThreshold < 0) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   178
            throw new IllegalArgumentException("unstableRelinkThreshold < 0");
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   179
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   180
        this.linkerServices = linkerServices;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   181
        this.prelinkFilter = prelinkFilter;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   182
        this.syncOnRelink = syncOnRelink;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   183
        this.unstableRelinkThreshold = unstableRelinkThreshold;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   184
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   185
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   186
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   187
     * 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
   188
     * 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
   189
     * 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
   190
     * it was invoked with.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   191
     *
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   192
     * @param <T> the particular subclass of {@link RelinkableCallSite} for
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   193
     *        which to create a link.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   194
     * @param callSite the call site to link.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   195
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   196
     * @return the callSite, for easy call chaining.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   197
     */
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   198
    public <T extends RelinkableCallSite> T link(final T callSite) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   199
        callSite.initialize(createRelinkAndInvokeMethod(callSite, 0));
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   200
        return callSite;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   201
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   202
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   203
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   204
     * Returns the object representing the linker services of this class that
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   205
     * are normally exposed to individual language-specific linkers.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   206
     * 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
   207
     * {@link #link(RelinkableCallSite)} method, in certain circumstances you
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   208
     * 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
   209
     * 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
   210
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   211
     * @return the object representing the linker services of this class.
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
    public LinkerServices getLinkerServices() {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   214
        return linkerServices;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   215
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   216
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   217
    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
   218
            MethodHandle.class, RelinkableCallSite.class, int.class, Object[].class);
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   219
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   220
    private MethodHandle createRelinkAndInvokeMethod(final RelinkableCallSite callSite, final int relinkCount) {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   221
        // 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
   222
        final MethodHandle boundRelinker = MethodHandles.insertArguments(RELINK, 0, this, callSite, Integer.valueOf(
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   223
                relinkCount));
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   224
        // 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
   225
        final MethodType type = callSite.getDescriptor().getMethodType();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   226
        final MethodHandle collectingRelinker = boundRelinker.asCollector(Object[].class, type.parameterCount());
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   227
        return MethodHandles.foldArguments(MethodHandles.exactInvoker(type), collectingRelinker.asType(
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   228
                type.changeReturnType(MethodHandle.class)));
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   229
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   230
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   231
    /**
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   232
     * Relinks a call site conforming to the invocation arguments.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   233
     *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   234
     * @param callSite the call site itself
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   235
     * @param arguments arguments to the invocation
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   236
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   237
     * @return return the method handle for the invocation
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   238
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   239
     * @throws Exception rethrows any exception thrown by the linkers
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
    @SuppressWarnings("unused")
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   242
    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
   243
        final CallSiteDescriptor callSiteDescriptor = callSite.getDescriptor();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   244
        final boolean unstableDetectionEnabled = unstableRelinkThreshold > 0;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   245
        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
   246
        final LinkRequest linkRequest = new SimpleLinkRequest(callSiteDescriptor, callSiteUnstable, arguments);
16234
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
        GuardedInvocation guardedInvocation = linkerServices.getGuardedInvocation(linkRequest);
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   249
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   250
        // None found - throw an exception
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   251
        if(guardedInvocation == null) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   252
            throw new NoSuchDynamicMethodException(callSiteDescriptor.toString());
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   253
        }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   254
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   255
        // Make sure we filter the invocation before linking it into the call site. This is typically used to match the
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   256
        // return type of the invocation to the call site.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   257
        guardedInvocation = prelinkFilter.filter(guardedInvocation, linkRequest, linkerServices);
28785
a503c972d4bd 8072595: nashorn should not use obj.getClass() for null checks
sundar
parents: 25865
diff changeset
   258
        Objects.requireNonNull(guardedInvocation);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   259
16245
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   260
        int newRelinkCount = relinkCount;
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   261
        // 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
   262
        // 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
   263
        // 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
   264
        // linkage once, when it transitions to unstable.
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   265
        if(unstableDetectionEnabled && newRelinkCount <= unstableRelinkThreshold && newRelinkCount++ == unstableRelinkThreshold) {
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   266
            callSite.resetAndRelink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount));
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   267
        } else {
16245
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   268
            callSite.relink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount));
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   269
        }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   270
        if(syncOnRelink) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   271
            MutableCallSite.syncAll(new MutableCallSite[] { (MutableCallSite)callSite });
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   272
        }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   273
        return guardedInvocation.getInvocation();
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
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   277
     * Returns a stack trace element describing the location of the
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   278
     * {@code invokedynamic} call site currently being linked on the current
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   279
     * thread. The operation is potentially expensive and is intended for use in
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   280
     * diagnostics code. For "free-floating" call sites (not associated with an
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   281
     * {@code invokedynamic} instruction), the result is not well-defined.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   282
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   283
     * @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
   284
     *         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
   285
     *         site is being linked.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   286
     */
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   287
    public static StackTraceElement getLinkedCallSiteLocation() {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   288
        final StackTraceElement[] trace = new Throwable().getStackTrace();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   289
        for(int i = 0; i < trace.length - 1; ++i) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   290
            final StackTraceElement frame = trace[i];
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   291
            // 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
   292
            if(isRelinkFrame(frame) || isInitialLinkFrame(frame)) {
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   293
                // ... 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
   294
                for (int j = i + 1; j < trace.length; ++j) {
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   295
                    final StackTraceElement frame2 = trace[j];
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   296
                    if (!frame2.getClassName().startsWith(INVOKE_PACKAGE_PREFIX)) {
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   297
                        return frame2;
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   298
                    }
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   299
                }
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   300
            }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   301
        }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   302
        return null;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   303
    }
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   304
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   305
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   306
     * Returns the currently processed link request, or null if the method is
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   307
     * invoked outside of the linking process.
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
   308
     * @return the currently processed link request, or null.
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   309
     * @throws SecurityException if the calling code doesn't have the
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   310
     * {@code "dynalink.getCurrentLinkRequest"} runtime permission (available as
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   311
     * {@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
   312
     */
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
   313
    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
   314
        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
   315
    }
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
   316
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
   317
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   318
     * Returns {@code true} if the frame represents {@code MethodHandleNatives.linkCallSite()},
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   319
     * 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
   320
     * being linked for the first time.
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   321
     *
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   322
     * @param frame the frame
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   323
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   324
     * @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
   325
     */
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   326
    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
   327
        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
   328
    }
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
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   331
     * Returns {@code true} if the frame represents {@code DynamicLinker.relink()},
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   332
     * 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
   333
     * being relinked (linked for second and subsequent times).
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   334
     *
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   335
     * @param frame the frame
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   336
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   337
     * @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
   338
     */
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   339
    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
   340
        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
   341
    }
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
    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
   344
        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
   345
    }
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   346
}