mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-04 23:05:47 +02:00
Bug 378729 - Should not fetch address of a register or convenience
variable Change-Id: I41ed489ad3a1be39d9317245054a5f3fb82c08d5 Signed-off-by: Marc Khouzam <marc.khouzam@ericsson.com> Reviewed-on: https://git.eclipse.org/r/15376 Reviewed-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com> IP-Clean: Mikhail Khodjaiants <mikhailkhod@googlemail.com> Tested-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com>
This commit is contained in:
parent
767a83a455
commit
7e6df21d23
2 changed files with 35 additions and 11 deletions
|
@ -234,6 +234,25 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions,
|
||||||
public void setChildCountLimit(int newLimit) {
|
public void setChildCountLimit(int newLimit) {
|
||||||
this.childCountLimit = newLimit;
|
this.childCountLimit = newLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return if this expression is part of the memory space or not.
|
||||||
|
* If it not part of the memory space, it won't have an address.
|
||||||
|
* @since 4.2
|
||||||
|
*/
|
||||||
|
public boolean inMemory() {
|
||||||
|
// Registers and convenience variables which both start with $
|
||||||
|
// are not part of memory. We care about the top-most parent
|
||||||
|
// as it is the only one that can be a register or convenience var.
|
||||||
|
if (getParent() == null) {
|
||||||
|
if (getRelExpr().startsWith("$")) { //$NON-NLS-1$
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getParent().inMemory();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1066,9 +1085,12 @@ public class MIExpressions extends AbstractDsfService implements IMIExpressions,
|
||||||
|
|
||||||
if (dmc instanceof MIExpressionDMC) {
|
if (dmc instanceof MIExpressionDMC) {
|
||||||
MIExpressionDMC miDMC = (MIExpressionDMC) dmc;
|
MIExpressionDMC miDMC = (MIExpressionDMC) dmc;
|
||||||
if (miDMC.getExpressionInfo().hasDynamicAncestor()) {
|
if (miDMC.getExpressionInfo().hasDynamicAncestor() ||
|
||||||
|
!miDMC.getExpressionInfo().inMemory()) {
|
||||||
// For children of dynamic varobjs, there is no full expression that gdb
|
// For children of dynamic varobjs, there is no full expression that gdb
|
||||||
// could evaluate in order to provide address and size.
|
// could evaluate in order to provide address and size.
|
||||||
|
// Also, if an expression is not in memory, such as a register
|
||||||
|
// or a GDB convenience variable, there is no address to return
|
||||||
rm.setData(new InvalidDMAddress());
|
rm.setData(new InvalidDMAddress());
|
||||||
rm.done();
|
rm.done();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -518,8 +518,9 @@ public class MIMemory extends AbstractDsfService implements IMemory, ICachingSer
|
||||||
protected void handleSuccess() {
|
protected void handleSuccess() {
|
||||||
// Figure out which memory area was modified
|
// Figure out which memory area was modified
|
||||||
IExpressionDMAddress expression = getData();
|
IExpressionDMAddress expression = getData();
|
||||||
final int count = expression.getSize();
|
|
||||||
IAddress expAddress = expression.getAddress();
|
IAddress expAddress = expression.getAddress();
|
||||||
|
if (expAddress != IExpressions.IExpressionDMLocation.INVALID_ADDRESS) {
|
||||||
|
final int count = expression.getSize();
|
||||||
final Addr64 address;
|
final Addr64 address;
|
||||||
if (expAddress instanceof Addr64)
|
if (expAddress instanceof Addr64)
|
||||||
address = (Addr64) expAddress;
|
address = (Addr64) expAddress;
|
||||||
|
@ -530,6 +531,7 @@ public class MIMemory extends AbstractDsfService implements IMemory, ICachingSer
|
||||||
getMemoryCache(memoryDMC).refreshMemory(memoryDMC, address, 0, 1, count, true,
|
getMemoryCache(memoryDMC).refreshMemory(memoryDMC, address, 0, 1, count, true,
|
||||||
new RequestMonitor(getExecutor(), null));
|
new RequestMonitor(getExecutor(), null));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue