forked from qt-creator/qt-creator
Debugger: Add some convenience to display "paired" data
The switch between compact/full display was so far part of the individual dumpers, there's some potential for code-reuse here. Change-Id: I47e3308cfd2209948adbf70fca617908e793c0fc Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
@@ -181,6 +181,34 @@ class Children:
|
|||||||
self.d.put('],')
|
self.d.put('],')
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class PairedChildrenData:
|
||||||
|
def __init__(self, d, pairType):
|
||||||
|
self.pairType = pairType
|
||||||
|
self.keyType = d.templateArgument(pairType, 0).unqualified()
|
||||||
|
self.valueType = d.templateArgument(pairType, 1)
|
||||||
|
self.isCompact = d.isMapCompact(self.keyType, self.valueType)
|
||||||
|
self.childNumChild = None if self.isCompact else 2
|
||||||
|
self.childType = self.valueType if self.isCompact else self.pairType
|
||||||
|
ns = d.qtNamespace()
|
||||||
|
self.keyIsQString = str(self.keyType) == ns + "QString"
|
||||||
|
self.keyIsQByteArray = str(self.keyType) == ns + "QByteArray"
|
||||||
|
|
||||||
|
class PairedChildren:
|
||||||
|
def __init__(self, d, numChild, pairType, maxNumChild = None):
|
||||||
|
self.d = d
|
||||||
|
d.pairData = PairedChildrenData(d, pairType)
|
||||||
|
Children.__init__(self, d, numChild,
|
||||||
|
d.pairData.childType, d.pairData.childNumChild,
|
||||||
|
maxNumChild, addrBase = None, addrStep = None)
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
self.savedPairData = self.d.pairData if hasattr(self.d, "pairData") else None
|
||||||
|
Children.__enter__(self)
|
||||||
|
|
||||||
|
def __exit__(self, exType, exValue, exTraceBack):
|
||||||
|
Children.__exit__(self, exType, exValue, exTraceBack)
|
||||||
|
self.d.pairData = self.savedPairData if self.savedPairData else None
|
||||||
|
|
||||||
|
|
||||||
class SubItem:
|
class SubItem:
|
||||||
def __init__(self, d, component):
|
def __init__(self, d, component):
|
||||||
@@ -424,6 +452,30 @@ class DumperBase:
|
|||||||
else:
|
else:
|
||||||
self.put('key="[%d] %s",' % (index, val))
|
self.put('key="[%d] %s",' % (index, val))
|
||||||
|
|
||||||
|
def putPair(self, pair, index = -1):
|
||||||
|
key = pair["first"]
|
||||||
|
value = pair["second"]
|
||||||
|
if self.pairData.isCompact:
|
||||||
|
if self.pairData.keyIsQString:
|
||||||
|
self.put('key="%s",' % self.encodeString(key))
|
||||||
|
self.put('keyencoded="%s",' % Hex4EncodedLittleEndian)
|
||||||
|
elif self.pairData.keyIsQByteArray:
|
||||||
|
self.put('key="%s",' % self.encodeByteArray(key))
|
||||||
|
self.put('keyencoded="%s",' % Hex2EncodedLatin1)
|
||||||
|
else:
|
||||||
|
name = str(key.GetValue()) if self.isLldb else str(key)
|
||||||
|
if index == -1:
|
||||||
|
self.put('name="%s",' % name)
|
||||||
|
else:
|
||||||
|
self.put('key="[%d] %s",' % (index, name))
|
||||||
|
self.putItem(value)
|
||||||
|
else:
|
||||||
|
self.putEmptyValue()
|
||||||
|
if self.isExpanded():
|
||||||
|
with Children(self, 2):
|
||||||
|
self.putSubItem("first", key)
|
||||||
|
self.putSubItem("second", value)
|
||||||
|
|
||||||
def isMapCompact(self, keyType, valueType):
|
def isMapCompact(self, keyType, valueType):
|
||||||
format = self.currentItemFormat()
|
format = self.currentItemFormat()
|
||||||
if format == 2:
|
if format == 2:
|
||||||
|
@@ -192,42 +192,14 @@ def qdump__std__map(d, value):
|
|||||||
d.putNumChild(size)
|
d.putNumChild(size)
|
||||||
|
|
||||||
if d.isExpanded():
|
if d.isExpanded():
|
||||||
keyType = d.templateArgument(value.type, 0)
|
pairType = d.templateArgument(d.templateArgument(value.type, 3), 0)
|
||||||
valueType = d.templateArgument(value.type, 1)
|
pairPointer = pairType.pointer()
|
||||||
try:
|
with PairedChildren(d, size, pairType, maxNumChild=1000):
|
||||||
# Does not work on gcc 4.4, the allocator type (fourth template
|
node = impl["_M_header"]["_M_left"]
|
||||||
# argument) seems not to be available.
|
|
||||||
pairType = d.templateArgument(d.templateArgument(value.type, 3), 0)
|
|
||||||
pairPointer = pairType.pointer()
|
|
||||||
except:
|
|
||||||
# So use this as workaround:
|
|
||||||
pairType = d.templateArgument(impl.type, 1)
|
|
||||||
pairPointer = pairType.pointer()
|
|
||||||
isCompact = d.isMapCompact(keyType, valueType)
|
|
||||||
innerType = pairType
|
|
||||||
if isCompact:
|
|
||||||
innerType = valueType
|
|
||||||
node = impl["_M_header"]["_M_left"]
|
|
||||||
childType = innerType
|
|
||||||
if size == 0:
|
|
||||||
childType = pairType
|
|
||||||
childNumChild = 2
|
|
||||||
if isCompact:
|
|
||||||
childNumChild = None
|
|
||||||
with Children(d, size, maxNumChild=1000,
|
|
||||||
childType=childType, childNumChild=childNumChild):
|
|
||||||
for i in d.childRange():
|
for i in d.childRange():
|
||||||
with SubItem(d, i):
|
with SubItem(d, i):
|
||||||
pair = (node + 1).cast(pairPointer).dereference()
|
pair = (node + 1).cast(pairPointer).dereference()
|
||||||
if isCompact:
|
d.putPair(pair)
|
||||||
d.putMapName(pair["first"])
|
|
||||||
d.putItem(pair["second"])
|
|
||||||
else:
|
|
||||||
d.putEmptyValue()
|
|
||||||
if d.isExpanded():
|
|
||||||
with Children(d, 2):
|
|
||||||
d.putSubItem("first", pair["first"])
|
|
||||||
d.putSubItem("second", pair["second"])
|
|
||||||
if d.isNull(node["_M_right"]):
|
if d.isNull(node["_M_right"]):
|
||||||
parent = node["_M_parent"]
|
parent = node["_M_parent"]
|
||||||
while node == parent["_M_right"]:
|
while node == parent["_M_right"]:
|
||||||
|
Reference in New Issue
Block a user