1 /*
2  * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 package jdk.vm.ci.meta;
24 
25 import java.lang.invoke.MethodHandle;
26 
27 /**
28  * Interface to access the internals of the {@link MethodHandle} implementation of the VM. An
29  * implementation of this interface is usually required to access non-public classes, methods, and
30  * fields of {@link MethodHandle}, i.e., data that is not standardized by the Java specification.
31  */
32 public interface MethodHandleAccessProvider {
33 
34     /**
35      * Identification for methods defined on the class {@link MethodHandle} that are processed by
36      * the {@link MethodHandleAccessProvider}.
37      */
38     enum IntrinsicMethod {
39         /** The method {@code MethodHandle.invokeBasic}. */
40         INVOKE_BASIC,
41         /** The method {@code MethodHandle.linkToStatic}. */
42         LINK_TO_STATIC,
43         /** The method {@code MethodHandle.linkToSpecial}. */
44         LINK_TO_SPECIAL,
45         /** The method {@code MethodHandle.linkToVirtual}. */
46         LINK_TO_VIRTUAL,
47         /** The method {@code MethodHandle.linkToInterface}. */
48         LINK_TO_INTERFACE
49     }
50 
51     /**
52      * Returns the method handle method intrinsic identifier for the provided method, or
53      * {@code null} if the method is not an intrinsic processed by this interface.
54      *
55      * @throws NullPointerException if {@code method} is null
56      */
lookupMethodHandleIntrinsic(ResolvedJavaMethod method)57     IntrinsicMethod lookupMethodHandleIntrinsic(ResolvedJavaMethod method);
58 
59     /**
60      * Resolves the invocation target for an invocation of {@link IntrinsicMethod#INVOKE_BASIC
61      * MethodHandle.invokeBasic} with the given constant receiver {@link MethodHandle}. Returns
62      * {@code null} if the invocation target is not available at this time.
63      *
64      * The first invocations of a method handle can use an interpreter to lookup the actual invoked
65      * method; frequently executed method handles can use Java bytecode generation to avoid the
66      * interpreter overhead. If the parameter forceBytecodeGeneration is set to true, the VM should
67      * try to generate bytecodes before this method returns.
68      *
69      * @returns {@code null} if {@code methodHandle} is not a {@link MethodHandle} or the invocation
70      *          target is not available at this time
71      * @throws NullPointerException if {@code methodHandle} is null
72      */
resolveInvokeBasicTarget(JavaConstant methodHandle, boolean forceBytecodeGeneration)73     ResolvedJavaMethod resolveInvokeBasicTarget(JavaConstant methodHandle, boolean forceBytecodeGeneration);
74 
75     /**
76      * Resolves the invocation target for an invocation of a {@code MethodHandle.linkTo*} method
77      * with the given constant member name. The member name is the last parameter of the
78      * {@code linkTo*} method.
79      *
80      * @returns {@code null} if the invocation target is not available at this time
81      * @throws NullPointerException if {@code memberName} is null
82      * @throws IllegalArgumentException if {@code memberName} is not a
83      *             {@code java.lang.invoke.MemberName}
84      */
resolveLinkToTarget(JavaConstant memberName)85     ResolvedJavaMethod resolveLinkToTarget(JavaConstant memberName);
86 }
87