| /* |
| * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| package jdk.vm.ci.meta; |
| |
| import java.lang.invoke.MethodHandle; |
| |
| /** |
| * Interface to access the internals of the {@link MethodHandle} implementation of the VM. An |
| * implementation of this interface is usually required to access non-public classes, methods, and |
| * fields of {@link MethodHandle}, i.e., data that is not standardized by the Java specification. |
| */ |
| public interface MethodHandleAccessProvider { |
| |
| /** |
| * Identification for methods defined on the class {@link MethodHandle} that are processed by |
| * the {@link MethodHandleAccessProvider}. |
| */ |
| enum IntrinsicMethod { |
| /** The method {@code MethodHandle.invokeBasic}. */ |
| INVOKE_BASIC, |
| /** The method {@code MethodHandle.linkToStatic}. */ |
| LINK_TO_STATIC, |
| /** The method {@code MethodHandle.linkToSpecial}. */ |
| LINK_TO_SPECIAL, |
| /** The method {@code MethodHandle.linkToVirtual}. */ |
| LINK_TO_VIRTUAL, |
| /** The method {@code MethodHandle.linkToInterface}. */ |
| LINK_TO_INTERFACE |
| } |
| |
| /** |
| * Returns the method handle method intrinsic identifier for the provided method, or |
| * {@code null} if the method is not an intrinsic processed by this interface. |
| * |
| * @throws NullPointerException if {@code method} is null |
| */ |
| IntrinsicMethod lookupMethodHandleIntrinsic(ResolvedJavaMethod method); |
| |
| /** |
| * Resolves the invocation target for an invocation of {@link IntrinsicMethod#INVOKE_BASIC |
| * MethodHandle.invokeBasic} with the given constant receiver {@link MethodHandle}. Returns |
| * {@code null} if the invocation target is not available at this time. |
| * |
| * The first invocations of a method handle can use an interpreter to lookup the actual invoked |
| * method; frequently executed method handles can use Java bytecode generation to avoid the |
| * interpreter overhead. If the parameter forceBytecodeGeneration is set to true, the VM should |
| * try to generate bytecodes before this method returns. |
| * |
| * @returns {@code null} if {@code methodHandle} is not a {@link MethodHandle} or the invocation |
| * target is not available at this time |
| * @throws NullPointerException if {@code methodHandle} is null |
| */ |
| ResolvedJavaMethod resolveInvokeBasicTarget(JavaConstant methodHandle, boolean forceBytecodeGeneration); |
| |
| /** |
| * Resolves the invocation target for an invocation of a {@code MethodHandle.linkTo*} method |
| * with the given constant member name. The member name is the last parameter of the |
| * {@code linkTo*} method. |
| * |
| * @returns {@code null} if the invocation target is not available at this time |
| * @throws NullPointerException if {@code memberName} is null |
| * @throws IllegalArgumentException if {@code memberName} is not a |
| * {@code java.lang.invoke.MemberName} |
| */ |
| ResolvedJavaMethod resolveLinkToTarget(JavaConstant memberName); |
| } |