blob: 40689922206fb113c63c0ac63faba5e07e4ef8d9 [file] [log] [blame]
/*******************************************************************************
* 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.jdi.hcr;
import com.sun.jdi.Value;
/**
* Hot code replacement extension to <code>com.sun.jdi.ThreadReference</code>.
*/
public interface ThreadReference {
/**
* Resumes the execution of this thread as if the next instruction was a
* return instruction with the given value. This causes the top stack frame
* to be popped with the given value.
* <p>
* A breakpoint instruction at the current instruction is not triggered that
* is, this operation takes precedence over breakpoints.
* <code>try-finally</code> blocks enclosing the current location will be
* triggered in due course.
* <p>
* The triggerFinallyAndSynchronizedBlocks option on this operation controls
* whether <code>try-finally</code> and <code>synchronized</code> blocks
* enclosing the current location should be triggered:
* <ul>
* <li>If no, the stack frame is popped, the return value is returned, and
* execution continues back in the caller. Note that <code>finally</code>
* blocks are not run, and that if the code is nested within a
* <code>synchronized</code> statement, the monitor lock is not released
* (however, if the method is </code>synchronized</code> the monitor lock
* will be properly released). This mechanism is sure-fire, but at the risk
* of not letting the target program clean itself up (e.g., close its
* files).
* <li>If yes, the VM checks to see whether there might be a
* <code>finally</code> or <code>synchronized</code> block enclosing the
* current instruction.
* <ul>
* <li>If there is no enclosing <code>finally</code> block, the operation
* reduces to the above case.
* <li>If there is an enclosing <code>finally</code> block, the VM creates a
* VM exception and activates the <code>finally</code> block with it. If
* this exception eventually causes the stack frame to be popped, the
* exception is caught by the VM itself, the return value is returned, and
* execution continues back in the caller.
* <ul>
* </ul>
* <p>
* Note that a <code>finally</code> block manifests itself as (and is
* indistinguishable from) a <code>catch Throwable</code> block.
* <code>synchronized</code> statements also compile to a
* <code> catch Throwable block<code>.The target program may inadventently
* end up catching this exception.
*
* Since the choices each have their pros and cons, making the decision
* is left to the debugger. However the later option is the recommended choice.
* <p>
* The reply to the operation contains a flag indicating whether any <code>finally</code>
* or <code>synchronized</code> blocks are enclosing the current
* instruction.
* <p>
* This operation is ignored if the thread was not suspended. If the thread
* was suspended multiple times, wait for the same number of resumes before
* executing the return instruction.
* <p>
* The returned value is ignored if the method returns void.
* <p>
* Throws an <code>OperationRefusedException</code> if the VM refused to
* perform this operation. This in recognition that the VM may be in an
* awkward state and unable to comply:
* <ul>
* <li>for example, execution is suspended in a native method,
* <li>for example, execution is suspended during class preparation.
* </ul>
* @param returnValue the value to return from the thread with
* @param triggerFinallyAndSynchronizedBlocks if finally / synchronization blocks should be executed before resuming
* @return if the forced return was successful
*/
public boolean doReturn(Value returnValue,
boolean triggerFinallyAndSynchronizedBlocks);
}