forked from qt-creator/qt-creator
Debugger: Fix boost::unordered_set dumper for older boost versions
Somewhere between 1.48 and 1.58 structure layout changed. Change-Id: Id8bcb473f364537342261dd2596f9f1bdacb5c79 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -108,45 +108,30 @@ def qdump__boost__posix_time__time_duration(d, value):
|
||||
|
||||
|
||||
def qdump__boost__unordered__unordered_set(d, value):
|
||||
base = value.address()
|
||||
ptrSize = d.ptrSize()
|
||||
size = d.extractInt(base + 2 * ptrSize)
|
||||
innerType = value.type[0]
|
||||
newer = value.type.size() == 6 * d.ptrSize() # 48 for boost 1.58, 40 for boost 1.48
|
||||
if newer:
|
||||
# boost 1.58
|
||||
# bases are 3? bytes, and mlf is actually a float, but since
|
||||
# its followed by size_t maxload, it's # effectively padded to a size_t
|
||||
bases, bucketCount, size, mlf, maxload, buckets = value.split('tttttp')
|
||||
code = 'pp{%s}' % innerType.name
|
||||
else:
|
||||
# boost 1.48
|
||||
# Values are stored before the next pointers. Determine the offset.
|
||||
buckets, bucketCount, size, mlf, maxload = value.split('ptttt')
|
||||
code = '{%s}@p' % innerType.name
|
||||
(pp, ssize, fields) = d.describeStruct(code)
|
||||
offset = fields[2].offset()
|
||||
|
||||
d.putItemCount(size)
|
||||
|
||||
if d.isExpanded():
|
||||
innerType = value.type[0]
|
||||
bucketCount = d.extractInt(base + ptrSize)
|
||||
#warn("A BUCKET COUNT: %s" % bucketCount)
|
||||
#warn("X BUCKET COUNT: %s" % d.parseAndEvaluate("s1.table_.bucket_count_").value())
|
||||
try:
|
||||
# boost 1.58
|
||||
table = value["table_"]
|
||||
bucketsAddr = table["buckets_"].integer()
|
||||
#warn("A BUCKETS: 0x%x" % bucketsAddr)
|
||||
#warn("X BUCKETS: 0x%x" % d.parseAndEvaluate("s1.table_.buckets_").pointer())
|
||||
lastBucketAddr = bucketsAddr + bucketCount * ptrSize
|
||||
#warn("A LAST BUCKET: 0x%x" % lastBucketAddr)
|
||||
#warn("X LAST BUCKET: 0x%x" % d.parseAndEvaluate("s1.table_.get_bucket(s1.table_.bucket_count_)").pointer())
|
||||
previousStartAddr = lastBucketAddr
|
||||
#warn("A PREVIOUS START: 0x%x" % previousStartAddr)
|
||||
#warn("X PREVIOUS START: 0x%x" % d.parseAndEvaluate("s1.table_.get_previous_start()").pointer())
|
||||
item = d.extractPointer(previousStartAddr)
|
||||
#warn("A KEY ADDR: 0x%x" % item)
|
||||
#warn("X KEY ADDR: 0x%x" % d.parseAndEvaluate("s1.table_.get_previous_start()->next_").pointer())
|
||||
item = d.extractPointer(previousStartAddr)
|
||||
#warn("A VALUE: %x" % d.extractInt(item + ptrSize))
|
||||
#warn("X VALUE: %x" % d.parseAndEvaluate("*(int*)(s1.table_.get_previous_start()->next_ + 1)").integer())
|
||||
with Children(d, size, maxNumChild=10000):
|
||||
for j in d.childRange():
|
||||
d.putSubItem(j, d.createValue(item + 2 * ptrSize, innerType))
|
||||
item = d.extractPointer(item)
|
||||
except:
|
||||
# boost 1.48
|
||||
offset = int((innerType.size() + ptrSize - 1) / ptrSize) * ptrSize
|
||||
with Children(d, size, maxNumChild=10000):
|
||||
afterBuckets = d.extractPointer(base + 5 * ptrSize)
|
||||
afterBuckets += bucketCount * ptrSize
|
||||
item = d.extractPointer(afterBuckets)
|
||||
for j in d.childRange():
|
||||
d.putSubItem(j, d.createValue(item - offset, innerType))
|
||||
item = d.extractPointer(item)
|
||||
p = d.extractPointer(buckets + bucketCount * d.ptrSize())
|
||||
with Children(d, size, maxNumChild=10000):
|
||||
for j in d.childRange():
|
||||
if newer:
|
||||
p, dummy, val = d.split(code, p)
|
||||
else:
|
||||
val, pad, p = d.split(code, p - offset)
|
||||
d.putSubItem(j, val)
|
||||
|
||||
@@ -3768,11 +3768,14 @@ class DumperBase:
|
||||
readingTypeName = False
|
||||
fieldType = self.createType(typeName)
|
||||
fieldAlign = fieldType.alignment()
|
||||
builder.addField(n, fieldIsStruct = True, fieldType = fieldType, fieldAlign = fieldAlign)
|
||||
builder.addField(n, fieldIsStruct = True,
|
||||
fieldType = fieldType, fieldAlign = fieldAlign)
|
||||
typeName = None
|
||||
n = None
|
||||
else:
|
||||
typeName += c
|
||||
elif c == 't': # size_t
|
||||
builder.addField(ptrSize, self.ptrCode(), fieldAlign = ptrSize)
|
||||
elif c == 'p': # Pointer as int
|
||||
builder.addField(ptrSize, self.ptrCode(), fieldAlign = ptrSize)
|
||||
elif c == 'P': # Pointer as Value
|
||||
|
||||
Reference in New Issue
Block a user