src/jdk.dynalink/share/classes/jdk/dynalink/DynamicLinker.java
author jlaskey
Thu, 21 Jun 2018 08:58:59 -0300
changeset 50695 36ca515343e0
parent 47216 71c04702a3d5
permissions -rw-r--r--
8203637: Fix Sources 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
/*
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
16234
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
50695
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    36
   Redistribution and use in source and binary forms, with or without
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    37
   modification, are permitted provided that the following conditions are
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    38
   met:
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    39
   * Redistributions of source code must retain the above copyright
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    40
     notice, this list of conditions and the following disclaimer.
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    41
   * Redistributions in binary form must reproduce the above copyright
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    42
     notice, this list of conditions and the following disclaimer in the
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    43
     documentation and/or other materials provided with the distribution.
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    44
   * Neither the name of the copyright holder nor the names of
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    45
     contributors may be used to endorse or promote products derived from
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    46
     this software without specific prior written permission.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    47
50695
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    48
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    49
   IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    50
   TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    51
   PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    52
   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    53
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    54
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    55
   BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    56
   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    57
   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36ca515343e0 8203637: Fix Sources
jlaskey
parents: 47216
diff changeset
    58
   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    59
*/
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    60
34447
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    61
package jdk.dynalink;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    62
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
    63
import java.lang.StackWalker.StackFrame;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    64
import java.lang.invoke.MethodHandle;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    65
import java.lang.invoke.MethodHandles;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    66
import java.lang.invoke.MethodType;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    67
import java.lang.invoke.MutableCallSite;
28785
a503c972d4bd 8072595: nashorn should not use obj.getClass() for null checks
sundar
parents: 25865
diff changeset
    68
import java.util.Objects;
34447
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    69
import jdk.dynalink.linker.GuardedInvocation;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    70
import jdk.dynalink.linker.GuardedInvocationTransformer;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    71
import jdk.dynalink.linker.GuardingDynamicLinker;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    72
import jdk.dynalink.linker.LinkRequest;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    73
import jdk.dynalink.linker.LinkerServices;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    74
import jdk.dynalink.linker.support.Lookup;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    75
import jdk.dynalink.linker.support.SimpleLinkRequest;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    76
import jdk.dynalink.support.ChainedCallSite;
ec4c069f9436 8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents: 33345
diff changeset
    77
import jdk.dynalink.support.SimpleRelinkableCallSite;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    78
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    79
/**
33339
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    80
 * The linker for {@link RelinkableCallSite} objects. A dynamic linker is a main
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    81
 * objects when using Dynalink, it coordinates linking of call sites with
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    82
 * linkers of available language runtimes that are represented by
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    83
 * {@link GuardingDynamicLinker} objects (you only need to deal with these if
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    84
 * you are yourself implementing a language runtime with its own object model
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    85
 * and/or type conversions). To use Dynalink, you have to create one or more
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    86
 * dynamic linkers using a {@link DynamicLinkerFactory}. Subsequently, you need
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    87
 * to invoke its {@link #link(RelinkableCallSite)} method from
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    88
 * {@code invokedynamic} bootstrap methods to let it manage all the call sites
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    89
 * they create. Usual usage would be to create at least one class per language
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
    90
 * runtime to contain one linker instance as:
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
    91
 * <pre>
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    92
 *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    93
 * class MyLanguageRuntime {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    94
 *     private static final GuardingDynamicLinker myLanguageLinker = new MyLanguageLinker();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    95
 *     private static final DynamicLinker dynamicLinker = createDynamicLinker();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    96
 *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    97
 *     private static DynamicLinker createDynamicLinker() {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    98
 *         final DynamicLinkerFactory factory = new DynamicLinkerFactory();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
    99
 *         factory.setPrioritizedLinker(myLanguageLinker);
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   100
 *         return factory.createLinker();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   101
 *     }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   102
 *
32534
b3ec7f3b3c2a 8136349: Typos patch for nashorn sources submitted on Sep 10, 2015
sundar
parents: 31097
diff changeset
   103
 *     public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) {
33345
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   104
 *         return dynamicLinker.link(
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   105
 *             new SimpleRelinkableCallSite(
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   106
 *                 new CallSiteDescriptor(lookup, parseOperation(name), type)));
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   107
 *     }
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   108
 *
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   109
 *     private static Operation parseOperation(String name) {
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   110
 *         ...
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   111
 *     }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   112
 * }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   113
 * </pre>
33339
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   114
 * The above setup of one static linker instance is often too simple. You will
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   115
 * often have your language runtime have a concept of some kind of
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   116
 * "context class loader" and you will want to create one dynamic linker per
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   117
 * such class loader, to ensure it incorporates linkers for all other language
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   118
 * runtimes visible to that class loader (see
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   119
 * {@link DynamicLinkerFactory#setClassLoader(ClassLoader)}).
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   120
 * <p>
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   121
 * There are three components you need to provide in the above example:
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   122
 * <ul>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   123
 *
33339
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   124
 * <li>You are expected to provide a {@link GuardingDynamicLinker} for your own
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   125
 * language. If your runtime doesn't have its own object model or type
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   126
 * conversions, you don't need to implement a {@code GuardingDynamicLinker}; you
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   127
 * would simply not invoke the {@code setPrioritizedLinker} method on the factory.</li>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   128
 *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   129
 * <li>The performance of the programs can depend on your choice of the class to
33339
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   130
 * represent call sites. The above example used
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   131
 * {@link SimpleRelinkableCallSite}, but you might want to use
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   132
 * {@link ChainedCallSite} instead. You'll need to experiment and decide what
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   133
 * fits your runtime the best. You can further subclass either of these or
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   134
 * implement your own.</li>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   135
 *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   136
 * <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
   137
 * They are immutable objects that contain all the information about the call
33345
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   138
 * site: the class performing the lookups, the operation being invoked, and the
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   139
 * method signature. You will have to supply your own scheme to encode and
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   140
 * decode operations in the call site name or static parameters, that is why
ef8c859f7992 8140273: restore use of CompositeOperation.contains where it is needed
attila
parents: 33342
diff changeset
   141
 * in the above example the {@code parseOperation} method is left unimplemented.</li>
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   142
 *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   143
 * </ul>
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   144
 */
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   145
public final class DynamicLinker {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   146
    private static final String CLASS_NAME = DynamicLinker.class.getName();
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   147
    private static final String RELINK_METHOD_NAME = "relink";
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   148
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   149
    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
   150
    private static final String INITIAL_LINK_METHOD_NAME = "linkCallSite";
33003
f1e00197031f 8139273: Small improvements to DynamicLinker and DynamicLinkerFactory
attila
parents: 32534
diff changeset
   151
    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
   152
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   153
    private static final StackWalker stackWalker = StackWalker.getInstance(StackWalker.Option.SHOW_HIDDEN_FRAMES);
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   154
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   155
    private final LinkerServices linkerServices;
33337
af3fea63e008 8139761: Improve Dynalink class nomenclature and package organization
attila
parents: 33335
diff changeset
   156
    private final GuardedInvocationTransformer prelinkTransformer;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   157
    private final boolean syncOnRelink;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   158
    private final int unstableRelinkThreshold;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   159
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
     * Creates a new dynamic linker.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   162
     *
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   163
     * @param linkerServices the linkerServices used by the linker, created by the factory.
33337
af3fea63e008 8139761: Improve Dynalink class nomenclature and package organization
attila
parents: 33335
diff changeset
   164
     * @param prelinkTransformer see {@link DynamicLinkerFactory#setPrelinkTransformer(GuardedInvocationTransformer)}
33332
f180be6368d8 8139588: Remove concept of runtime context arguments, call site tokens, and link counts
attila
parents: 33331
diff changeset
   165
     * @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
   166
     * @param unstableRelinkThreshold see {@link DynamicLinkerFactory#setUnstableRelinkThreshold(int)}
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   167
     */
33337
af3fea63e008 8139761: Improve Dynalink class nomenclature and package organization
attila
parents: 33335
diff changeset
   168
    DynamicLinker(final LinkerServices linkerServices, final GuardedInvocationTransformer prelinkTransformer,
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24720
diff changeset
   169
            final boolean syncOnRelink, final int unstableRelinkThreshold) {
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   170
        if(unstableRelinkThreshold < 0) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   171
            throw new IllegalArgumentException("unstableRelinkThreshold < 0");
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   172
        }
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   173
        this.linkerServices = linkerServices;
33337
af3fea63e008 8139761: Improve Dynalink class nomenclature and package organization
attila
parents: 33335
diff changeset
   174
        this.prelinkTransformer = prelinkTransformer;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   175
        this.syncOnRelink = syncOnRelink;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   176
        this.unstableRelinkThreshold = unstableRelinkThreshold;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   177
    }
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   178
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   179
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   180
     * 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
   181
     * 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
   182
     * 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
   183
     * it was invoked with.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   184
     *
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   185
     * @param <T> the particular subclass of {@link RelinkableCallSite} for
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   186
     *        which to create a link.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   187
     * @param callSite the call site to link.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   188
     *
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   189
     * @return the callSite, for easy call chaining.
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   190
     */
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   191
    public <T extends RelinkableCallSite> T link(final T callSite) {
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   192
        callSite.initialize(createRelinkAndInvokeMethod(callSite, 0));
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   193
        return callSite;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   194
    }
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
    /**
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   197
     * Returns the object representing the linker services of this class that
33339
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   198
     * are normally exposed to individual {@link GuardingDynamicLinker
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   199
     * language-specific linkers}. While as a user of this class you normally
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   200
     * only care about the {@link #link(RelinkableCallSite)} method, in certain
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   201
     * circumstances you might want to use the lower level services directly;
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   202
     * either to lookup specific method handles, to access the type converters,
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   203
     * and so on.
31097
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
33337
af3fea63e008 8139761: Improve Dynalink class nomenclature and package organization
attila
parents: 33335
diff changeset
   249
        // Make sure we transform the invocation before linking it into the call site. This is typically used to match the
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 18880
diff changeset
   250
        // return type of the invocation to the call site.
33337
af3fea63e008 8139761: Improve Dynalink class nomenclature and package organization
attila
parents: 33335
diff changeset
   251
        guardedInvocation = prelinkTransformer.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
33339
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   273
     * thread. The operation is potentially expensive as it needs to generate a
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   274
     * stack trace to inspect it and is intended for use in diagnostics code.
334cd3ebfa5e 8139888: Improve Dynalink JavaDoc some more
attila
parents: 33337
diff changeset
   275
     * For "free-floating" call sites (not associated with an
33333
0bad500ce4e0 8139590: Improve Dynalink JavaDoc
attila
parents: 33332
diff changeset
   276
     * {@code invokedynamic} instruction), the result is not well-defined.
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   277
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   278
     * @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
   279
     *         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
   280
     *         site is being linked.
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   281
     */
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   282
    public static StackTraceElement getLinkedCallSiteLocation() {
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   283
        return stackWalker.walk(s -> s
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   284
                // Find one of our linking entry points on the stack...
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   285
                .dropWhile(f -> !(isRelinkFrame(f) || isInitialLinkFrame(f)))
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   286
                .skip(1)
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
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   288
                .dropWhile(f -> f.getClassName().startsWith(INVOKE_PACKAGE_PREFIX))
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   289
                .findFirst()
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   290
                .map(StackFrame::toStackTraceElement)
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   291
                .orElse(null)
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   292
        );
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   293
    }
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   294
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   295
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   296
     * Returns {@code true} if the frame represents {@code MethodHandleNatives.linkCallSite()},
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   297
     * 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
   298
     * being linked for the first time.
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   299
     *
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   300
     * @param frame the frame
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   301
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   302
     * @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
   303
     */
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   304
    private static boolean isInitialLinkFrame(final StackFrame frame) {
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   305
        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
   306
    }
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
    /**
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   309
     * Returns {@code true} if the frame represents {@code DynamicLinker.relink()},
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   310
     * 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
   311
     * being relinked (linked for second and subsequent times).
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   312
     *
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   313
     * @param frame the frame
31097
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   314
     *
996397e0a35c 8085885: address Javadoc warnings in Nashorn source code
mhaupt
parents: 28785
diff changeset
   315
     * @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
   316
     */
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   317
    private static boolean isRelinkFrame(final StackFrame frame) {
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   318
        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
   319
    }
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   320
37920
0251d4f16648 8156738: Use StackWalker for DynamicLinker.getLinkedCallSiteLocation
attila
parents: 34447
diff changeset
   321
    private static boolean testFrame(final StackFrame frame, final String methodName, final String className) {
18880
89eafd5b9ff7 8011210: fix reporting of call site locations; print them on -tcs=miss
attila
parents: 16245
diff changeset
   322
        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
   323
    }
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents:
diff changeset
   324
}