diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2017-05-04 23:10:31 +0300 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2017-05-08 06:58:48 +0000 |
commit | 279192f17a8e67f2c1869f93112613dcd70b8742 (patch) | |
tree | 7027b75e57feba372762f7fc47c3d477de45f249 | |
parent | a4bc6e8ee6d05c09d0e9475e84a690c0cd0140ff (diff) | |
download | qt-creator-279192f17a8e67f2c1869f93112613dcd70b8742.tar.gz |
Dumpers: Fix operator + for pointers
Add an extensive unit test to prevent future regression.
Change-Id: I38b74f9b4f5893285e9afff2ddecaaad106f4114
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 2 | ||||
-rw-r--r-- | share/qtcreator/debugger/misctypes.py | 13 | ||||
-rw-r--r-- | tests/auto/debugger/tst_dumpers.cpp | 26 |
3 files changed, 40 insertions, 1 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 663015e77d..898e3dece2 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3104,7 +3104,7 @@ class DumperBase: if self.dumper.isInt(other): stripped = self.type.stripTypedefs() if stripped.code == TypeCodePointer: - address = self.pointer() + stripped.dereference().size() + address = self.pointer() + stripped.dereference().size() * other val = self.dumper.Value(self.dumper) val.laddress = None val.ldata = bytes(struct.pack(self.dumper.packCode + 'Q', address)) diff --git a/share/qtcreator/debugger/misctypes.py b/share/qtcreator/debugger/misctypes.py index 3550a3def5..d1093bd88b 100644 --- a/share/qtcreator/debugger/misctypes.py +++ b/share/qtcreator/debugger/misctypes.py @@ -349,3 +349,16 @@ def qdump__QtcDumperTest_PointerArray(d, value): for i in d.childRange(): d.putSubItem(i, foos[i]) +def qdump__QtcDumperTest_BufArray(d, value): + maxItems = 1000 + buffer = value['buffer'] + count = int(value['count']) + objsize = int(value['objSize']) + valueType = value.type.templateArgument(0) + d.putItemCount(count, maxItems) + d.putNumChild(count) + if d.isExpanded(): + with Children(d, count, maxNumChild=maxItems, childType=valueType): + for i in d.childRange(): + d.putSubItem(i, (buffer + (i * objsize)).dereference().cast(valueType)) + diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index f4b5bdb52c..4fbee42cb6 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -6748,6 +6748,32 @@ void tst_Dumpers::dumper_data() + Check("tc.3.bar", "15", "int"); + QTest::newRow("BufArray") + << Data("#include <new>\n" + "static int c = 0;\n" + "struct Foo { int bar = c++; int baz = c++; };\n" + "template<class T>\n" + "struct QtcDumperTest_BufArray {\n" + " const int objSize = int(sizeof(T));\n" + " const int count = 10;\n" + " char *buffer;\n" + " QtcDumperTest_BufArray() {\n" + " buffer = new char[count * objSize];\n" + " for (int i = 0; i < count; ++i)\n" + " new(buffer + i * objSize) T;\n" + " }\n" + " ~QtcDumperTest_BufArray() { delete[] buffer; }\n" + "};\n\n", + "QtcDumperTest_BufArray<Foo> arr; unused(&arr);\n") + + Cxx11Profile() + + Check("arr.0.bar", "0", "int") + + Check("arr.0.baz", "1", "int") + + Check("arr.1.bar", "2", "int") + + Check("arr.1.baz", "3", "int") + + Check("arr.2.bar", "4", "int") + + Check("arr.2.baz", "5", "int"); + + QTest::newRow("UndefinedStaticMembers") << Data("struct Foo { int a = 15; static int b; }; \n", "Foo f; unused(&f);\n") |