/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.debug.core; import java.util.List; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IDropToFrame; import org.eclipse.debug.core.model.IFilteredStep; import org.eclipse.debug.core.model.IStackFrame; /** * A stack frame in a thread on a Java virtual machine. * <p> * Since 3.1, <code>IJavaStackFrame</code> also implements * {@link org.eclipse.debug.core.model.IDropToFrame}. * </p> * * @see org.eclipse.debug.core.model.IStackFrame * @noimplement This interface is not intended to be implemented by clients. * @noextend This interface is not intended to be extended by clients. */ @SuppressWarnings("deprecation") public interface IJavaStackFrame extends IStackFrame, IJavaModifiers, IFilteredStep, IDropToFrame { /** * Status code indicating a stack frame is invalid. A stack frame becomes * invalid when the thread containing the stack frame resumes. A stack frame * may or may not be valid if the thread subsequently suspends, depending on * the location where the thread suspends. * * @since 3.1 */ public static final int ERR_INVALID_STACK_FRAME = 130; /** * Returns whether this stack frame currently supports the drop to frame * operation. Note that not all VMs support the operation. * * @return whether this stack frame currently supports drop to frame * @deprecated since 3.1, IJavaStackFrame extends * org.eclipse.debug.core.IDropToFrame which defines * canDropToFrame(). Use this method instead. */ @Deprecated boolean supportsDropToFrame(); /** * Returns whether the method associated with this stack frame is a * constructor. * * @return whether this stack frame is associated with a constructor * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public boolean isConstructor() throws DebugException; /** * Returns whether the method associated with this stack frame has been * declared as native. * * @return whether this stack frame has been declared as native * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public boolean isNative() throws DebugException; /** * Returns whether the method associated with this stack frame is a static * initializer. * * @return whether this stack frame is a static initializer * @exception DebugException * if this method fails. Reasons include: * <ul> * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public boolean isStaticInitializer() throws DebugException; /** * Returns whether the method associated with this stack frame has been * declared as synchronized. * * @return whether this stack frame has been declared as synchronized * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public boolean isSynchronized() throws DebugException; /** * Returns whether the method associated with this stack frame is running * code in the VM that is out of synch with the code in the workspace. * * @return whether this stack frame is out of synch with the workspace. * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 2.0 */ public boolean isOutOfSynch() throws DebugException; /** * Returns whether the method associated with this stack frame is obsolete, * that is, it is running old byte codes that have been replaced in the VM. * This can occur when a hot code replace succeeds but the VM is unable to * pop a call to an affected method from the call stack. * * @return whether this stack frame's method is obsolete * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 2.0 */ public boolean isObsolete() throws DebugException; /** * Returns the fully qualified name of the type that declares the method * associated with this stack frame. * * @return declaring type name * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public String getDeclaringTypeName() throws DebugException; /** * Returns the fully qualified name of the type that is the receiving object * associated with this stack frame * * @return receiving type name * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public String getReceivingTypeName() throws DebugException; /** * Returns the JNI signature for the method this stack frame is associated * with. * * @return signature * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public String getSignature() throws DebugException; /** * Returns a list of fully qualified type names of the arguments for the * method associated with this stack frame. * * @return argument type names, or an empty list if this method has no * arguments * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public List<String> getArgumentTypeNames() throws DebugException; /** * Returns the name of the method associated with this stack frame * * @return method name * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public String getMethodName() throws DebugException; /** * Returns the local, static, or "this" variable with the given name, or * <code>null</code> if unable to resolve a variable with the name. * * @param variableName * the name of the variable to search for * @return a variable, or <code>null</code> if none * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public IJavaVariable findVariable(String variableName) throws DebugException; /** * Returns the line number of the instruction pointer in this stack frame * that corresponds to the line in the associated source element in the * specified stratum, or <code>-1</code> if line number information is * unavailable. * * @param stratum * the stratum to use. * @return line number of instruction pointer in this stack frame, or * <code>-1</code> if line number information is unavailable * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the debug target. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * </ul> * * @since 3.0 */ public int getLineNumber(String stratum) throws DebugException; /** * Returns the source name debug attribute associated with the declaring * type of this stack frame, or <code>null</code> if the source name debug * attribute not present. * * @return source name debug attribute, or <code>null</code> * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public String getSourceName() throws DebugException; /** * Returns the source name debug attribute associated with the declaring * type of this stack frame in the specified stratum, or <code>null</code> * if the source name debug attribute not present. * * @param stratum * the stratum to use. * @return source name debug attribute, or <code>null</code> * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * * @since 3.0 */ public String getSourceName(String stratum) throws DebugException; /** * Returns the source path debug attribute associated with this stack frame * in the specified stratum, or <code>null</code> if the source path is not * known. * * @param stratum * the stratum to use. * @return source path debug attribute, or <code>null</code> * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 3.0 */ public String getSourcePath(String stratum) throws DebugException; /** * Returns the source path debug attribute associated with this stack frame, * or <code>null</code> if the source path is not known. * * @return source path debug attribute, or <code>null</code> * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 3.0 */ public String getSourcePath() throws DebugException; /** * Returns a collection of local variables that are visible at the current * point of execution in this stack frame. The list includes arguments. * * @return collection of locals and arguments * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 2.0 */ public IJavaVariable[] getLocalVariables() throws DebugException; /** * Returns a reference to the receiver of the method associated with this * stack frame, or <code>null</code> if this stack frame represents a static * method. * * @return 'this' object, or <code>null</code> * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> */ public IJavaObject getThis() throws DebugException; /** * Returns the class in which this stack frame's method is declared. * * @return the class in which this stack frame's method is declared * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 2.0 * @deprecated Use <code>getReferenceType()</code> instead, as a method is * not restricted to occur in a class. An interface may contain * a synthetic class initializer methods. Since 3.1, this method * throws a <code>DebugException</code> when a stack frame's * method is contained in an interface. */ @Deprecated public IJavaClassType getDeclaringType() throws DebugException; /** * Returns the type in which this stack frame's method is declared. * * @return the type in which this stack frame's method is declared * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 3.1 */ public IJavaReferenceType getReferenceType() throws DebugException; /** * Returns whether local variable information was available when local * variables were retrieved from the target for this frame. Returns * <code>true</code> if locals have never been retrieved. This data is * available after the fact, since variable retrieval is expensive. * * @return whether local variable information was available when variables * were retrieved from the target. Returns <code>true</code> if * locals have never been retrieved * * @since 2.0 */ public boolean wereLocalsAvailable(); /** * Returns whether the method associated with this stack frame accepts a * variable number of arguments. * * @return <code>true</code> if the method associated with this stack frame * accepts a variable number of arguments, <code>false</code> * otherwise. * @exception DebugException * if this method fails. Reasons include: * <ul> * <li>Failure communicating with the VM. The * DebugException's status code contains the underlying * exception responsible for the failure.</li> * <li>This stack frame is no longer valid. That is, the * thread containing this stack frame has since been resumed. * </li> * </ul> * @since 3.1 */ public boolean isVarArgs() throws DebugException; /** * Returns whether this frame currently supports a force return operation. * That is, can this method force a return before it reaches a return * statement. Not all VMs support this feature. * <p> * Force return is only available when a thread is suspended. * </p> * * @return whether force return can be performed currently * @since 3.3 */ public boolean canForceReturn(); /** * Steps out of this frame's method returning the given value. No further * instructions in the method are executed but locks acquired by entering * synchronized blocks are released. The following conditions must be * satisfied: * <ul> * <li>This frame must be suspended in a non-native method.</li> * <li>The return value must be assignment compatible with this frame's * method's return type. Use a void value when a method return type is void * (see <code>IJavaDebugTarget.voidValue()</code>).</li> * </ul> * * @param value * return value that must be assignment compatible with this * frame's method's return value * @throws DebugException * if the operation fails * @since 3.3 */ public void forceReturn(IJavaValue value) throws DebugException; }