From f446bebadc936c7d6e3247037277e1985982f113 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 20 Jun 2011 15:23:28 +0200 Subject: [PATCH] debugger: with gdb 7.3 we can have proper display of dynamic types. So use it. Change-Id: If33d087a9b767f0b2e6b16e57a36e9e7aa6e7c16 Reviewed-on: http://codereview.qt.nokia.com/522 Reviewed-by: Qt Sanity Bot Reviewed-by: hjk --- share/qtcreator/gdbmacros/dumper.py | 21 ++++++++++++------- .../gdbdebugger/simple/simple_gdbtest_app.cpp | 5 ++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index ea0b5a9a5ec..4c88a25364b 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -93,6 +93,13 @@ def hasInferiorThreadList(): except: return False +def upcast(value): + try: + type = value.dynamic_type + return value.cast(type) + except: + return value + typeCache = {} class TypeInfo: @@ -1287,6 +1294,7 @@ class Dumper: pass for item in locals: + item.value = upcast(item.value) with OutputSafer(self, "", ""): self.anonNumber = -1 #warn("ITEM NAME %s: " % item.name) @@ -1614,10 +1622,7 @@ class Dumper: # warn("REAL VALUE: ") value = item.value - try: - realtype = value.dynamic_type - except: - realtype = value.type + realtype = value.type type = realtype; format = self.itemFormat(item) @@ -1886,7 +1891,7 @@ class Dumper: #warn("EXPANDED: %s " % (item.iname in self.expandedINames)) fields = extractFields(type) - self.putType(item.value.type) + self.putType(type) try: self.putAddress(item.value.address) except: @@ -1907,7 +1912,7 @@ class Dumper: if self.isExpanded(item): innerType = None if len(fields) == 1 and fields[0].name is None: - innerType = value.type.target() + innerType = type.target() with Children(self, 1, innerType): child = Item(value, item.iname, None, item.name) self.putFields(child) @@ -1923,7 +1928,7 @@ class Dumper: def putFields(self, item, dumpBase = True): value = item.value type = stripTypedefs(value.type) - fields = extractFields(type) + fields = extractFields(value.type) baseNumber = 0 for field in fields: #warn("FIELD: %s" % field) @@ -1974,7 +1979,7 @@ class Dumper: else: # Named field. with SubItem(self): - child = Item(value[field.name], + child = Item(upcast(value[field.name]), item.iname, field.name, field.name) bitsize = getattr(field, "bitsize", None) if not bitsize is None: diff --git a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp index cd6e5ceaeed..bae3ee397d0 100644 --- a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp +++ b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp @@ -2733,7 +2733,10 @@ namespace qc42170 { void test() { - helper(new Circle(1.5, -2.5, 3.0, 15)); + Circle *circle = new Circle(1.5, -2.5, 3.0, 15); + Object *obj = circle; + helper(circle); + helper(obj); } } // namespace qc42170