From b6835eaa8032d454eecedae5669a29f0e6c52f2c Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Wed, 31 Aug 2011 13:45:12 +0200 Subject: [PATCH] dumpers: fix two regressions in std::string and general pointer checking Change-Id: I971ff4ad425e291c3536bc25ae6ee4933e46a681 Reviewed-on: http://codereview.qt.nokia.com/3957 Reviewed-by: hjk <qthjk@ovi.com> --- share/qtcreator/dumper/dumper.py | 24 ++++++++++++++++++++++-- share/qtcreator/dumper/qttypes.py | 20 +++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py index 0deca79fef1..29525936365 100644 --- a/share/qtcreator/dumper/dumper.py +++ b/share/qtcreator/dumper/dumper.py @@ -443,6 +443,12 @@ def checkPointer(p, align = 1): if not isNull(p): p.dereference() +def isAccessible(p): + try: + long(p) + return True + except: + return False def isNull(p): # The following can cause evaluation to abort with "UnicodeEncodeError" @@ -454,7 +460,11 @@ def isNull(p): # return p.cast(lookupType("void").pointer()) == 0 #except: # return False - return long(p) == 0 + try: + # Can fail with: "RuntimeError: Cannot access memory at address 0x5" + return long(p) == 0 + except: + return False movableTypes = set([ "QBrush", "QBitArray", "QByteArray", "QCustomTypeInfo", "QChar", "QDate", @@ -1128,6 +1138,11 @@ class Dumper: # in SubItem.__exit__(). self.putBetterType(" ") + def putInaccessible(self): + #self.putBetterType(" ") + self.putNumChild(0) + self.currentValue = None + def putBetterType(self, type, priority = 0): self.currentType = str(type) self.currentTypePriority = self.currentTypePriority + 1 @@ -1211,7 +1226,7 @@ class Dumper: return True if isSimpleType(type): return True - return self.stripNamespaceFromType(type) in movableTypes + return self.stripNamespaceFromType(str(type)) in movableTypes def putIntItem(self, name, value): with SubItem(self, name): @@ -1332,6 +1347,11 @@ class Dumper: if type.code == PointerCode: #warn("POINTER: %s" % value) + if not isAccessible(value): + self.currentValue = None + self.putNumChild(0) + return + if isNull(value): #warn("NULL POINTER") self.putAddress(value.address) diff --git a/share/qtcreator/dumper/qttypes.py b/share/qtcreator/dumper/qttypes.py index 2ae9ea63ee9..6345b2c9261 100644 --- a/share/qtcreator/dumper/qttypes.py +++ b/share/qtcreator/dumper/qttypes.py @@ -51,8 +51,15 @@ def qdump__QChar(d, value): d.putNumChild(0) +def qform__QModelIndex(): + return "Normal,Enhanced" def qdump__QAbstractItemModel(d, value): + format = d.currentItemFormat() + if format == 1: + d.putPlainChildren(value) + return + #format == 2: # Create a default-constructed QModelIndex on the stack. try: ri = makeValue(d.ns + "QModelIndex", "-1, -1, 0, 0") @@ -86,7 +93,14 @@ def qdump__QAbstractItemModel(d, value): #d.putType(mi.type) #gdb.execute("call free($ri)") +def qform__QModelIndex(): + return "Normal,Enhanced" + def qdump__QModelIndex(d, value): + format = d.currentItemFormat() + if format == 1: + d.putPlainChildren(value) + return r = value["r"] c = value["c"] p = value["p"] @@ -681,6 +695,7 @@ def qdump__QObject(d, value): if privateType is None: d.putNumChild(4) #d.putValue(cleanAddress(value.address)) + d.putPlainChildren(value) if d.isExpanded(): with Children(d): d.putFields(value) @@ -688,6 +703,9 @@ def qdump__QObject(d, value): #warn("OBJECTNAME: %s " % objectName) #warn("D_PTR: %s " % d_ptr) mo = d_ptr["metaObject"] + if not isAccessible(mo): + d.putInaccessible() + return if isNull(mo): mo = staticMetaObject #warn("MO: %s " % mo) @@ -1807,7 +1825,7 @@ def qdump__std__stack(d, value): def qdump__std__string(d, value): data = value["_M_dataplus"]["_M_p"] baseType = value.type.unqualified().strip_typedefs() - if baseType.code == ReferenceType: + if baseType.code == ReferenceCode: baseType = baseType.target().unqualified().strip_typedefs() # We might encounter 'std::string' or 'std::basic_string<>' # or even 'std::locale::string' on MinGW due to some type lookup glitch. -- GitLab