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