From ab92c14bbedbc1acfc63d189989b1ee427411b6a Mon Sep 17 00:00:00 2001 From: hjk <hjk121@nokiamail.com> Date: Thu, 24 Oct 2013 17:38:57 +0200 Subject: [PATCH] Debugger: Fix std::complex dumper for LLDB Change-Id: I5ffb0f60039bb05f8467e925e71cf710a0712791 Reviewed-by: hjk <hjk121@nokiamail.com> --- share/qtcreator/debugger/gdbbridge.py | 15 +++++++++++++-- share/qtcreator/debugger/stdtypes.py | 5 ++--- tests/auto/debugger/tst_dumpers.cpp | 6 ++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 8955c09612a..2d0df4275a4 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -1215,7 +1215,14 @@ class Dumper(DumperBase): return toInteger(value.address) def createPointerValue(self, address, pointeeType): - return gdb.Value(address).cast(pointeeType.pointer()) + # This might not always work: + # a Python 3 based GDB due to the bug addressed in + # https://sourceware.org/ml/gdb-patches/2013-09/msg00571.html + try: + return gdb.Value(address).cast(pointeeType.pointer()) + except: + # Try _some_ fallback (good enough for the std::complex dumper) + return gdb.parse_and_eval("(%s*)%s" % (pointeeType, address)) def intSize(self): return 4 @@ -1227,7 +1234,11 @@ class Dumper(DumperBase): return self.lookupType('void*').sizeof == 4 def createValue(self, address, referencedType): - return gdb.Value(address).cast(referencedType.pointer()).dereference() + try: + return gdb.Value(address).cast(referencedType.pointer()).dereference() + except: + # Try _some_ fallback (good enough for the std::complex dumper) + return gdb.parse_and_eval("{%s}%s" % (referencedType, address)) def readRawMemory(self, addr, size): mem = gdb.selected_inferior().read_memory(addr, size) diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 428373ad320..4ca65badb0f 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -79,9 +79,8 @@ def qdump__std____1__array(d, value): def qdump__std__complex(d, value): innerType = d.templateArgument(value.type, 0) - base = value.address.cast(innerType.pointer()) - real = base.dereference() - imag = (base + 1).dereference() + real = value.cast(innerType) + imag = d.createValue(d.addressOf(value) + innerType.sizeof, innerType) d.putValue("(%f, %f)" % (real, imag)); d.putNumChild(2) if d.isExpanded(): diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index fba59c77c93..7b08bb3514c 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -2469,8 +2469,10 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdComplex") << Data("#include <complex>\n", - "std::complex<double> c(1, 2);\n") - % Check("c", "(1.000000, 2.000000)", "std::complex<double>"); + "std::complex<double> c(1, 2);\n" + "unused(&c);\n") + % Check("c", "(1.000000, 2.000000)", "std::complex<double>") + % CheckType("c.real", "double"); QTest::newRow("CComplexGdb") << Data("#include <complex.h>\n", -- GitLab