From 0e6c9d26f1e3e0ba0d19dcb62e234b606e0ae2d9 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Dec 2016 16:24:57 +0100 Subject: [PATCH] Debugger: Fix pointer arithmetic in dumper framework Task-number: QTCREATORBUG-17428 Change-Id: I1e3a682a6f412af51e191dc783b89ff266020e3b Reviewed-by: Christian Stenger --- share/qtcreator/debugger/dumper.py | 9 ++++++--- share/qtcreator/debugger/misctypes.py | 8 ++++++++ tests/auto/debugger/tst_dumpers.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 8471c8eb49e..cf7f0faba37 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -2880,9 +2880,12 @@ class DumperBase: elif isinstance(index, self.dumper.Field): field = index elif self.dumper.isInt(index): - if self.type.code in (TypeCodeArray, TypeCodePointer): - itemAddress = self.laddress + int(index) * self.type.ltarget.size() - return self.dumper.createValue(itemAddress, self.type.ltarget) + if self.type.code == TypeCodeArray: + addr = self.laddress + int(index) * self.type.ltarget.size() + return self.dumper.createValue(addr, self.type.ltarget) + if self.type.code == TypeCodePointer: + addr = self.pointer() + int(index) * self.type.ltarget.size() + return self.dumper.createValue(addr, self.type.ltarget) return self.members(False)[index] else: error('BAD INDEX TYPE %s' % type(index)) diff --git a/share/qtcreator/debugger/misctypes.py b/share/qtcreator/debugger/misctypes.py index fa7625717f7..6de43eec848 100644 --- a/share/qtcreator/debugger/misctypes.py +++ b/share/qtcreator/debugger/misctypes.py @@ -326,3 +326,11 @@ def qdump__WTF__String(d, value): def qdump__QtcDumperTest_FieldAccessByIndex(d, value): d.putValue(value["d"][2].integer()) +def qdump__QtcDumperTest_PointerArray(d, value): + foos = value["foos"] + d.putItemCount(10) + if d.isExpanded(): + with Children(d, 10): + for i in d.childRange(): + d.putSubItem(i, foos[i]) + diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 2c8359ebc88..e0a6d4af0b6 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -6412,6 +6412,17 @@ void tst_Dumpers::dumper_data() "QtcDumperTest_FieldAccessByIndex d; unused(&d);\n") + Check("d", "12", "QtcDumperTest_FieldAccessByIndex"); + + QTest::newRow("Internal2") + << Data("struct Foo { int bar = 15; }; \n" + "struct QtcDumperTest_PointerArray {\n" + " Foo *foos = new Foo[10];\n" + "};\n\n", + "QtcDumperTest_PointerArray tc; unused(&tc);\n") + + Check("tc.0.bar", "15", "int") + + Check("tc.1.bar", "15", "int") + + Check("tc.2.bar", "15", "int") + + Check("tc.3.bar", "15", "int"); #if 0 #ifdef Q_OS_LINUX // Hint: To open a failing test in Creator, do: