mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 240556
If no frame context is provided in an expression, but an execution (thread) is present, then we define the expression to belong to the top-most frame of that thread.
This commit is contained in:
parent
963ba7e067
commit
255b92bfbd
2 changed files with 36 additions and 2 deletions
|
@ -501,7 +501,16 @@ public class ExpressionService extends AbstractDsfService implements IExpression
|
||||||
|
|
||||||
IMIExecutionDMContext execCtx = DMContexts.getAncestorOfType(ctx, IMIExecutionDMContext.class);
|
IMIExecutionDMContext execCtx = DMContexts.getAncestorOfType(ctx, IMIExecutionDMContext.class);
|
||||||
if (execCtx != null) {
|
if (execCtx != null) {
|
||||||
return new MIExpressionDMC(getSession().getId(), expression, relExpr, execCtx);
|
// If we have a thread context but not a frame context, we give the user
|
||||||
|
// the expression as per the top-most frame of the specified thread.
|
||||||
|
// To do this, we create our own frame context.
|
||||||
|
MIStack stackService = getServicesTracker().getService(MIStack.class);
|
||||||
|
if (stackService != null) {
|
||||||
|
frameDmc = stackService.createFrameDMContext(execCtx, 0);
|
||||||
|
return new MIExpressionDMC(getSession().getId(), expression, relExpr, frameDmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new InvalidContextExpressionDMC(getSession().getId(), expression, execCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
IMemoryDMContext memoryCtx = DMContexts.getAncestorOfType(ctx, IMemoryDMContext.class);
|
IMemoryDMContext memoryCtx = DMContexts.getAncestorOfType(ctx, IMemoryDMContext.class);
|
||||||
|
|
|
@ -1161,7 +1161,7 @@ public class ExpressionServiceTest extends BaseTestCase {
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
// @Test
|
@Test
|
||||||
public void testGlobalVariables() throws Throwable {
|
public void testGlobalVariables() throws Throwable {
|
||||||
|
|
||||||
// Step to a stack level of 2 to be able to test differen stack frames
|
// Step to a stack level of 2 to be able to test differen stack frames
|
||||||
|
@ -1259,6 +1259,31 @@ public class ExpressionServiceTest extends BaseTestCase {
|
||||||
executeExpressionSubTests(tests, frameDmc);
|
executeExpressionSubTests(tests, frameDmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test makes sure that if a request for expression values are made with
|
||||||
|
* a thread selected, the top-most stack frame is used for evaluation
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testThreadContext() throws Throwable {
|
||||||
|
|
||||||
|
// Step to a stack level of 2 to be able to test differen stack frames
|
||||||
|
SyncUtil.SyncRunToLocation("locals2");
|
||||||
|
MIStoppedEvent stoppedEvent = SyncUtil.SyncStep(StepType.STEP_OVER);
|
||||||
|
|
||||||
|
// Create a map of expressions to expected values.
|
||||||
|
Map<String, String[]> tests = new HashMap<String, String[]>();
|
||||||
|
|
||||||
|
// First make sure we have a different value on the other stack frame and that we select
|
||||||
|
// a frame that is not the top frame
|
||||||
|
tests.put("lIntVar", new String[] { "0x3039", "030071", "11000000111001", "12345", "12345" });
|
||||||
|
executeExpressionSubTests(tests, SyncUtil.SyncGetStackFrame(stoppedEvent.getDMContext(), 1));
|
||||||
|
|
||||||
|
// Now check that we get the same values as the top stack when selecting the thread only
|
||||||
|
tests = new HashMap<String, String[]>();
|
||||||
|
tests.put("lIntVar", new String[] { "0x1a85", "015205", "1101010000101", "6789", "6789" });
|
||||||
|
executeExpressionSubTests(tests, stoppedEvent.getDMContext());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test verifies that the ExpressionService can handle having a
|
* This test verifies that the ExpressionService can handle having a
|
||||||
* child variable with the same name in two methods that also have the same name
|
* child variable with the same name in two methods that also have the same name
|
||||||
|
|
Loading…
Add table
Reference in a new issue