nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java
author attila
Mon, 19 Oct 2015 18:24:47 +0200
changeset 33335 a46c85103868
parent 33333 0bad500ce4e0
child 33337 af3fea63e008
permissions -rw-r--r--
8139756: Eliminate GuardedTypeConversion, DynamicLinker.getCurrentLinkRequest and its associated permission Reviewed-by: hannesw, sundar
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 {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   149
    private static final String CLASS_NAME = DynamicLinker.class.getName();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   150
    private static final String RELINK_METHOD_NAME = "relink";
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   151
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   152
    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
   153
    private static final String INITIAL_LINK_METHOD_NAME = "linkCallSite";
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   154
    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
   155
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   156
    private final LinkerServices linkerServices;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   157
    private final GuardedInvocationFilter prelinkFilter;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   158
    private final boolean syncOnRelink;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   159
    private final int unstableRelinkThreshold;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   160
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   161
    /**
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   162
     * Creates a new dynamic linker.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   163
     *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   164
     * @param linkerServices the linkerServices used by the linker, created by the factory.
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   165
     * @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
   166
     * @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
   167
     * @param unstableRelinkThreshold see {@link DynamicLinkerFactory#setUnstableRelinkThreshold(int)}
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   168
     */
33332
f180be6368d8 8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents: 33331
diff changeset
   169
    DynamicLinker(final LinkerServices linkerServices, final GuardedInvocationFilter prelinkFilter,
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   170
            final boolean syncOnRelink, final int unstableRelinkThreshold) {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   171
        if(unstableRelinkThreshold < 0) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   172
            throw new IllegalArgumentException("unstableRelinkThreshold < 0");
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   173
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   174
        this.linkerServices = linkerServices;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   175
        this.prelinkFilter = prelinkFilter;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   176
        this.syncOnRelink = syncOnRelink;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   177
        this.unstableRelinkThreshold = unstableRelinkThreshold;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   178
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   179
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   180
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   181
     * 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
   182
     * 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
   183
     * 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
   184
     * it was invoked with.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   185
     *
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   186
     * @param <T> the particular subclass of {@link RelinkableCallSite} for
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   187
     *        which to create a link.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   188
     * @param callSite the call site to link.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   189
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   190
     * @return the callSite, for easy call chaining.
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
    public <T extends RelinkableCallSite> T link(final T callSite) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   193
        callSite.initialize(createRelinkAndInvokeMethod(callSite, 0));
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   194
        return callSite;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   195
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   196
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   197
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   198
     * Returns the object representing the linker services of this class that
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   199
     * are normally exposed to individual language-specific linkers.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   200
     * 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
   201
     * {@link #link(RelinkableCallSite)} method, in certain circumstances you
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   202
     * 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
   203
     * 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
   204
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   205
     * @return the object representing the linker services of this class.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   206
     */
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   207
    public LinkerServices getLinkerServices() {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   208
        return linkerServices;
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
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   211
    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
   212
            MethodHandle.class, RelinkableCallSite.class, int.class, Object[].class);
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   213
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   214
    private MethodHandle createRelinkAndInvokeMethod(final RelinkableCallSite callSite, final int relinkCount) {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   215
        // 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
   216
        final MethodHandle boundRelinker = MethodHandles.insertArguments(RELINK, 0, this, callSite, Integer.valueOf(
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   217
                relinkCount));
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   218
        // 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
   219
        final MethodType type = callSite.getDescriptor().getMethodType();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   220
        final MethodHandle collectingRelinker = boundRelinker.asCollector(Object[].class, type.parameterCount());
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   221
        return MethodHandles.foldArguments(MethodHandles.exactInvoker(type), collectingRelinker.asType(
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   222
                type.changeReturnType(MethodHandle.class)));
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
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   225
    /**
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   226
     * Relinks a call site conforming to the invocation arguments.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   227
     *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   228
     * @param callSite the call site itself
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   229
     * @param arguments arguments to the invocation
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   230
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   231
     * @return return the method handle for the invocation
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   232
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   233
     * @throws Exception rethrows any exception thrown by the linkers
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   234
     */
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   235
    @SuppressWarnings("unused")
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   236
    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
   237
        final CallSiteDescriptor callSiteDescriptor = callSite.getDescriptor();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   238
        final boolean unstableDetectionEnabled = unstableRelinkThreshold > 0;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   239
        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
   240
        final LinkRequest linkRequest = new SimpleLinkRequest(callSiteDescriptor, callSiteUnstable, arguments);
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   241
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   242
        GuardedInvocation guardedInvocation = linkerServices.getGuardedInvocation(linkRequest);
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   243
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   244
        // None found - throw an exception
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   245
        if(guardedInvocation == null) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   246
            throw new NoSuchDynamicMethodException(callSiteDescriptor.toString());
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
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   249
        // 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
   250
        // return type of the invocation to the call site.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   251
        guardedInvocation = prelinkFilter.filter(guardedInvocation, linkRequest, linkerServices);
28785
a503c972d4bd 8072595: nashorn should not use obj.getClass() for null checks
sundar
parents: 25865
diff changeset
   252
        Objects.requireNonNull(guardedInvocation);
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   253
16245
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   254
        int newRelinkCount = relinkCount;
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   255
        // 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
   256
        // 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
   257
        // 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
   258
        // linkage once, when it transitions to unstable.
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   259
        if(unstableDetectionEnabled && newRelinkCount <= unstableRelinkThreshold && newRelinkCount++ == unstableRelinkThreshold) {
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   260
            callSite.resetAndRelink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount));
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   261
        } else {
16245
6a1c6c8bc113 8008371: Fix Dynalink compiler warnings and whitespace
attila
parents: 16234
diff changeset
   262
            callSite.relink(guardedInvocation, createRelinkAndInvokeMethod(callSite, newRelinkCount));
16234
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
        if(syncOnRelink) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   265
            MutableCallSite.syncAll(new MutableCallSite[] { (MutableCallSite)callSite });
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   266
        }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   267
        return guardedInvocation.getInvocation();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   268
    }
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
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   271
     * Returns a stack trace element describing the location of the
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   272
     * {@code invokedynamic} call site currently being linked on the current
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   273
     * thread. The operation is potentially expensive and is intended for use in
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   274
     * diagnostics code. For "free-floating" call sites (not associated with an
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   275
     * {@code invokedynamic} instruction), the result is not well-defined.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   276
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   277
     * @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
   278
     *         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
   279
     *         site is being linked.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   280
     */
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   281
    public static StackTraceElement getLinkedCallSiteLocation() {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   282
        final StackTraceElement[] trace = new Throwable().getStackTrace();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   283
        for(int i = 0; i < trace.length - 1; ++i) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   284
            final StackTraceElement frame = trace[i];
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   285
            // 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
   286
            if(isRelinkFrame(frame) || isInitialLinkFrame(frame)) {
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   287
                // ... 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
   288
                for (int j = i + 1; j < trace.length; ++j) {
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   289
                    final StackTraceElement frame2 = trace[j];
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   290
                    if (!frame2.getClassName().startsWith(INVOKE_PACKAGE_PREFIX)) {
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   291
                        return frame2;
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   292
                    }
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   293
                }
16234
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
        }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   296
        return null;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   297
    }
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   298
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   299
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   300
     * Returns {@code true} if the frame represents {@code MethodHandleNatives.linkCallSite()},
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   301
     * 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
   302
     * being linked for the first time.
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   303
     *
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   304
     * @param frame the frame
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   305
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   306
     * @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
   307
     */
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   308
    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
   309
        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
   310
    }
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   311
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   312
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   313
     * Returns {@code true} if the frame represents {@code DynamicLinker.relink()},
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   314
     * 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
   315
     * being relinked (linked for second and subsequent times).
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   316
     *
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   317
     * @param frame the frame
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   318
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   319
     * @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
   320
     */
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   321
    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
   322
        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
   323
    }
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   324
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   325
    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
   326
        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
   327
    }
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   328
}