Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2012-10-02 00:29:48 +0000
committerEugene Tarassov2012-10-02 15:23:59 +0000
commit64b9f51a43e092a16cb91f670cbc3e6a9152bfb2 (patch)
tree583e802b62c214a08c0e937a5cf26221fe73e697 /plugins
parent418c1c2a5f447700048229a2a85bf05ee7c9eb17 (diff)
downloadorg.eclipse.tcf-64b9f51a43e092a16cb91f670cbc3e6a9152bfb2.tar.gz
org.eclipse.tcf-64b9f51a43e092a16cb91f670cbc3e6a9152bfb2.tar.xz
org.eclipse.tcf-64b9f51a43e092a16cb91f670cbc3e6a9152bfb2.zip
TCF Debugger: fixed "pretty printing" of structs with bitfields
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenSubExpressions.java9
-rw-r--r--plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java94
2 files changed, 68 insertions, 35 deletions
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenSubExpressions.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenSubExpressions.java
index 4bfab7e98..2d00ef899 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenSubExpressions.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFChildrenSubExpressions.java
@@ -77,13 +77,15 @@ public class TCFChildrenSubExpressions extends TCFChildren {
for (int i = 0; i < a.length; i++) a[i].dispose();
}
- private TCFNodeExpression findField(String field_id, boolean deref) {
+ TCFNodeExpression getField(String field_id, boolean deref) {
assert field_id != null;
for (TCFNode n : getNodes()) {
TCFNodeExpression e = (TCFNodeExpression)n;
if (field_id.equals(e.getFieldID()) && e.isDeref() == deref) return e;
}
- return null;
+ TCFNodeExpression e = new TCFNodeExpression(node, null, field_id, null, null, -1, deref);
+ add(e);
+ return e;
}
private boolean findFields(ISymbols.Symbol type, Map<String,TCFNode> map, boolean deref) {
@@ -106,8 +108,7 @@ public class TCFChildrenSubExpressions extends TCFChildren {
if (!findFields(sym_data, map, deref)) return false;
}
else {
- TCFNodeExpression n = findField(id, deref);
- if (n == null) add(n = new TCFNodeExpression(node, null, id, null, null, -1, deref));
+ TCFNodeExpression n = getField(id, deref);
n.setSortPosition(map.size());
map.put(n.id, n);
}
diff --git a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java
index b54d9632f..b88cc2dc9 100644
--- a/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java
+++ b/plugins/org.eclipse.tcf.debug.ui/src/org/eclipse/tcf/internal/debug/ui/model/TCFNodeExpression.java
@@ -559,8 +559,8 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
}
StyledStringBuffer bf = new StyledStringBuffer();
bf.append('{');
- if (!appendCompositeValueText(bf, 1, base_type_data, buf,
- 0, size, base_type_data.isBigEndian(), this)) return false;
+ if (!appendCompositeValueText(bf, 1, base_type_data, TCFNodeExpression.this, true,
+ buf, 0, size, base_type_data.isBigEndian(), this)) return false;
bf.append('}');
set(null, null, bf);
return true;
@@ -1297,7 +1297,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
if (v != null) {
byte[] data = v.getValue();
if (data != null) {
- if (!appendValueText(bf, 1, v.getTypeID(),
+ if (!appendValueText(bf, 1, v.getTypeID(), this,
data, 0, data.length, v.isBigEndian(), done)) return null;
}
}
@@ -1318,7 +1318,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
break;
}
if (n > 0) bf.append(", ");
- if (!appendValueText(bf, level + 1, type.getBaseTypeID(),
+ if (!appendValueText(bf, level + 1, type.getBaseTypeID(), null,
data, offs + n * elem_size, elem_size, big_endian, done)) return false;
}
}
@@ -1326,7 +1326,9 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
return true;
}
- private boolean appendCompositeValueText(StyledStringBuffer bf, int level, ISymbols.Symbol type,
+ private boolean appendCompositeValueText(
+ StyledStringBuffer bf, int level, ISymbols.Symbol type,
+ TCFNodeExpression data_node, boolean data_deref,
byte[] data, int offs, int size, boolean big_endian, Runnable done) {
TCFDataCache<String[]> children_cache = model.getSymbolChildrenCache(type.getID());
if (children_cache == null) {
@@ -1347,26 +1349,40 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
pending = field_cache;
continue;
}
- ISymbols.Symbol field_data = field_cache.getData();
- if (field_data == null) continue;
- if (field_data.getSymbolClass() != ISymbols.SymbolClass.reference) continue;
- String name = field_data.getName();
- int f_offs = field_data.getOffset();
- int f_size = field_data.getSize();
+ ISymbols.Symbol field_props = field_cache.getData();
+ if (field_props == null) continue;
+ if (field_props.getSymbolClass() != ISymbols.SymbolClass.reference) continue;
+ String name = field_props.getName();
+ if (name == null && type != null && field_props.getFlag(ISymbols.SYM_FLAG_INHERITANCE)) {
+ name = type.getName();
+ }
+ TCFNodeExpression field_node = null;
+ if (data_node != null) field_node = data_node.children.getField(id, data_deref);
+ if (field_props.getProperties().get(ISymbols.PROP_OFFSET) == null) {
+ // Bitfield - use field_node to retrieve the value
+ if (name == null || field_node == null) continue;
+ if (cnt > 0) bf.append(", ");
+ bf.append(name);
+ bf.append('=');
+ if (!field_node.value.validate(done)) return false;
+ IExpressions.Value field_value = field_node.value.getData();
+ byte[] field_data = field_value.getValue();
+ if (!field_node.appendValueText(bf, level + 1, field_props.getTypeID(), field_node,
+ field_data, 0, field_data.length, big_endian, done)) return false;
+ cnt++;
+ continue;
+ }
+ int f_offs = field_props.getOffset();
+ int f_size = field_props.getSize();
if (name == null) {
- // Super-class members
- if (offs + f_offs + f_size > data.length) {
- continue;
- }
- else {
- StyledStringBuffer bf1 = new StyledStringBuffer();
- if (!appendCompositeValueText(bf1, level, field_data, data,
- offs + f_offs, f_size, big_endian, done)) return false;
- if (bf1.length() > 0) {
- if (cnt > 0) bf.append(", ");
- bf.append(bf1);
- cnt++;
- }
+ if (offs + f_offs + f_size > data.length) continue;
+ StyledStringBuffer bf1 = new StyledStringBuffer();
+ if (!appendCompositeValueText(bf1, level, field_props, field_node, false,
+ data, offs + f_offs, f_size, big_endian, done)) return false;
+ if (bf1.length() > 0) {
+ if (cnt > 0) bf.append(", ");
+ bf.append(bf1);
+ cnt++;
}
}
else {
@@ -1377,7 +1393,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
bf.append('?');
}
else {
- if (!appendValueText(bf, level + 1, field_data.getTypeID(),
+ if (!appendValueText(bf, level + 1, field_props.getTypeID(), field_node,
data, offs + f_offs, f_size, big_endian, done)) return false;
}
cnt++;
@@ -1402,7 +1418,8 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
}
@SuppressWarnings("incomplete-switch")
- private boolean appendValueText(StyledStringBuffer bf, int level, String type_id,
+ private boolean appendValueText(
+ StyledStringBuffer bf, int level, String type_id, TCFNodeExpression data_node,
byte[] data, int offs, int size, boolean big_endian, Runnable done) {
if (data == null) return true;
ISymbols.Symbol type_data = null;
@@ -1487,7 +1504,8 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
case composite:
if (level > 0) {
bf.append('{');
- if (!appendCompositeValueText(bf, level, type_data, data, offs, size, big_endian, done)) return false;
+ if (!appendCompositeValueText(bf, level, type_data, data_node, false,
+ data, offs, size, big_endian, done)) return false;
bf.append('}');
}
break;
@@ -1571,25 +1589,39 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
byte[] data = v.getValue();
if (data != null) {
boolean big_endian = v.isBigEndian();
- if (!appendValueText(bf, 0, v.getTypeID(),
+ if (!appendValueText(bf, 0, v.getTypeID(), this,
data, 0, data.length, big_endian, done)) return false;
}
+ int cnt = 0;
String reg_id = v.getRegisterID();
if (reg_id != null) {
String nm = getRegisterName(reg_id, done);
if (nm == null) return false;
bf.append("Register: ", SWT.BOLD);
bf.append(nm);
- bf.append('\n');
+ cnt++;
+ }
+ TCFDataCache<ISymbols.Symbol> field_cache = model.getSymbolInfoCache(field_id);
+ if (field_cache != null) {
+ if (!field_cache.validate(done)) return false;
+ ISymbols.Symbol field_props = field_cache.getData();
+ if (field_props != null && field_props.getProperties().get(ISymbols.PROP_OFFSET) != null) {
+ if (cnt > 0) bf.append(", ");
+ bf.append("Offset: ", SWT.BOLD);
+ bf.append(Integer.toString(field_props.getOffset()), StyledStringBuffer.MONOSPACED);
+ cnt++;
+ }
}
Number addr = v.getAddress();
if (addr != null) {
BigInteger i = JSON.toBigInteger(addr);
+ if (cnt > 0) bf.append(", ");
bf.append("Address: ", SWT.BOLD);
bf.append("0x", StyledStringBuffer.MONOSPACED);
bf.append(i.toString(16), StyledStringBuffer.MONOSPACED);
- bf.append('\n');
+ cnt++;
}
+ if (cnt > 0) bf.append('\n');
}
}
return true;
@@ -1604,7 +1636,7 @@ public class TCFNodeExpression extends TCFNode implements IElementEditor, ICastT
byte[] data = v.getValue();
if (data != null) {
boolean big_endian = v.isBigEndian();
- if (!appendValueText(bf, 1, v.getTypeID(),
+ if (!appendValueText(bf, 1, v.getTypeID(), this,
data, 0, data.length, big_endian, done)) return null;
}
}

Back to the top