--- /dev/null 2015-10-08 07:25:57.000000000 -1000 +++ new/src/jdk.vm.ci/share/classes/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaMethod.java 2015-10-08 07:25:57.000000000 -1000 @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2009, 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.annotation.*; +import java.lang.invoke.*; +import java.lang.reflect.*; +import java.util.*; + +/** + * Represents a resolved Java method. Methods, like fields and types, are resolved through + * {@link ConstantPool constant pools}. + */ +public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersProvider { + + /** + * Returns the bytecode of this method, if the method has code. The returned byte array does not + * contain breakpoints or non-Java bytecodes. This may return null if the + * {@link #getDeclaringClass() holder} is not {@link ResolvedJavaType#isLinked() linked}. + * + * The contained constant pool indices may not be the ones found in the original class file but + * they can be used with the JVMCI API (e.g. methods in {@link ConstantPool}). + * + * @return the bytecode of the method, or {@code null} if {@code getCodeSize() == 0} or if the + * code is not ready. + */ + byte[] getCode(); + + /** + * Returns the size of the bytecode of this method, if the method has code. This is equivalent + * to {@link #getCode()}. {@code length} if the method has code. + * + * @return the size of the bytecode in bytes, or 0 if no bytecode is available + */ + int getCodeSize(); + + /** + * Returns the {@link ResolvedJavaType} object representing the class or interface that declares + * this method. + */ + ResolvedJavaType getDeclaringClass(); + + /** + * Returns the maximum number of locals used in this method's bytecodes. + */ + int getMaxLocals(); + + /** + * Returns the maximum number of stack slots used in this method's bytecodes. + */ + int getMaxStackSize(); + + /** + * {@inheritDoc} + *
+ * Only the {@linkplain Modifier#methodModifiers() method flags} specified in the JVM
+ * specification will be included in the returned mask.
+ */
+ int getModifiers();
+
+ default boolean isFinal() {
+ return ModifiersProvider.super.isFinalFlagSet();
+ }
+
+ /**
+ * Determines if this method is a synthetic method as defined by the Java Language
+ * Specification.
+ */
+ default boolean isSynthetic() {
+ return (SYNTHETIC & getModifiers()) == SYNTHETIC;
+ }
+
+ /**
+ * Checks that the method is a varargs
+ * method.
+ *
+ * @return whether the method is a varargs method
+ */
+ default boolean isVarArgs() {
+ return (VARARGS & getModifiers()) == VARARGS;
+ }
+
+ /**
+ * Checks that the method is a bridge
+ * method.
+ *
+ * @return whether the method is a bridge method
+ */
+ default boolean isBridge() {
+ return (BRIDGE & getModifiers()) == BRIDGE;
+ }
+
+ /**
+ * Returns {@code true} if this method is a default method; returns {@code false} otherwise.
+ *
+ * A default method is a public non-abstract instance method, that is, a non-static method with
+ * a body, declared in an interface type.
+ *
+ * @return true if and only if this method is a default method as defined by the Java Language
+ * Specification.
+ */
+ boolean isDefault();
+
+ /**
+ * Checks whether this method is a class initializer.
+ *
+ * @return {@code true} if the method is a class initializer
+ */
+ boolean isClassInitializer();
+
+ /**
+ * Checks whether this method is a constructor.
+ *
+ * @return {@code true} if the method is a constructor
+ */
+ boolean isConstructor();
+
+ /**
+ * Checks whether this method can be statically bound (usually, that means it is final or
+ * private or static, but not abstract, or the declaring class is final).
+ *
+ * @return {@code true} if this method can be statically bound
+ */
+ boolean canBeStaticallyBound();
+
+ /**
+ * Returns the list of exception handlers for this method.
+ */
+ ExceptionHandler[] getExceptionHandlers();
+
+ /**
+ * Returns a stack trace element for this method and a given bytecode index.
+ */
+ StackTraceElement asStackTraceElement(int bci);
+
+ /**
+ * Returns an object that provides access to the profiling information recorded for this method.
+ */
+ default ProfilingInfo getProfilingInfo() {
+ return getProfilingInfo(true, true);
+ }
+
+ /**
+ * Returns an object that provides access to the profiling information recorded for this method.
+ *
+ * @param includeNormal if true,
+ * {@linkplain ProfilingInfo#getDeoptimizationCount(DeoptimizationReason)
+ * deoptimization counts} will include deoptimization that happened during execution
+ * of standard non-osr methods.
+ * @param includeOSR if true,
+ * {@linkplain ProfilingInfo#getDeoptimizationCount(DeoptimizationReason)
+ * deoptimization counts} will include deoptimization that happened during execution
+ * of on-stack-replacement methods.
+ */
+ ProfilingInfo getProfilingInfo(boolean includeNormal, boolean includeOSR);
+
+ /**
+ * Invalidates the profiling information and restarts profiling upon the next invocation.
+ */
+ void reprofile();
+
+ /**
+ * Returns the constant pool of this method.
+ */
+ ConstantPool getConstantPool();
+
+ /**
+ * Returns all annotations of this method. If no annotations are present, an array of length 0
+ * is returned.
+ */
+ Annotation[] getAnnotations();
+
+ /**
+ * Returns the annotation for the specified type of this method, if such an annotation is
+ * present.
+ *
+ * @param annotationClass the Class object corresponding to the annotation type
+ * @return this element's annotation for the specified annotation type if present on this
+ * method, else {@code null}
+ */
+