diff options
author | hjk <hjk@qt.io> | 2020-12-07 15:15:58 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2020-12-08 14:19:40 +0000 |
commit | fff1fafec73d78d8b22e61a565da21eecb8244bc (patch) | |
tree | 36baad11060a0ffcd6ed9cf23928e259cdbdc640 /share | |
parent | e9ae81612fbbaa00238050fd9eb7cc5dfd9698e7 (diff) |
Debugger: Consolidate list data extraction in dumper
Change-Id: I5b860da4b1d15ffab8c60418321e40943dbbe07a
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'share')
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 19 | ||||
-rw-r--r-- | share/qtcreator/debugger/qttypes.py | 21 |
2 files changed, 23 insertions, 17 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 66c826f101..e94a21996a 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1722,15 +1722,30 @@ class DumperBase(): addr += 1 return result - def listChildrenGenerator(self, addr, innerType): - base = self.extractPointer(addr) + def listData(self, value, check=True): + if self.qtVersion() >= 0x60000: + dd, data, size = self.split('ppi', value) + return data, size + + base = self.extractPointer(value) (ref, alloc, begin, end) = self.split('IIII', base) array = base + 16 if self.qtVersion() < 0x50000: array += self.ptrSize() size = end - begin + + if check: + self.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) + size = end - begin + self.check(size >= 0) + stepSize = self.ptrSize() data = array + begin * stepSize + return data, size + + def listChildrenGenerator(self, addr, innerType): + stepSize = self.ptrSize() + data, size = self.listData(addr) for i in range(size): yield self.createValue(data + i * stepSize, innerType) #yield self.createValue(data + i * stepSize, 'void*') diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index ebff0247cb..62c9d81c5c 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1057,25 +1057,16 @@ def qdump__QVariantList(d, value): def qdumpHelper_QList(d, value, innerType): + data, size = d.listData(value, check=True) + d.putItemCount(size) + if d.qtVersion() >= 0x60000: - dd, data, size = d.split('ppi', value) - d.putItemCount(size) d.putPlotData(data, size, innerType) return - base = d.extractPointer(value) - _, _, begin, end = d.split('IIII', base) - array = base + 16 - if d.qtVersion() < 0x50000: - array += d.ptrSize() - d.check(begin >= 0 and end >= 0 and end <= 1000 * 1000 * 1000) - size = end - begin - d.check(size >= 0) - d.putItemCount(size) if d.isExpanded(): innerSize = innerType.size() stepSize = d.ptrSize() - addr = array + begin * stepSize # The exact condition here is: # QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic # but this data is available neither in the compiled binary nor @@ -1090,17 +1081,17 @@ def qdumpHelper_QList(d, value, innerType): isInternal = innerSize <= stepSize and innerType.isMovableType() if isInternal: if innerSize == stepSize: - d.putArrayData(addr, size, innerType) + d.putArrayData(data, size, innerType) else: with Children(d, size, childType=innerType): for i in d.childRange(): - p = d.createValue(addr + i * stepSize, innerType) + p = d.createValue(data + i * stepSize, innerType) d.putSubItem(i, p) else: # about 0.5s / 1000 items with Children(d, size, maxNumChild=2000, childType=innerType): for i in d.childRange(): - p = d.extractPointer(addr + i * stepSize) + p = d.extractPointer(data + i * stepSize) x = d.createValue(p, innerType) d.putSubItem(i, x) |