forked from qt-creator/qt-creator
debugger: also pretty-print typedefs to references
Change-Id: Id845d9cf412efb6797feadcb4d83286d16db7123 Reviewed-on: http://codereview.qt.nokia.com/3048 Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
@@ -1333,16 +1333,19 @@ class Dumper:
|
|||||||
|
|
||||||
value = item.value
|
value = item.value
|
||||||
realtype = value.type
|
realtype = value.type
|
||||||
type = realtype;
|
type = value.type.unqualified()
|
||||||
format = self.itemFormat(item)
|
format = self.itemFormat(item)
|
||||||
|
|
||||||
if type.code == gdb.TYPE_CODE_REF:
|
typedefStrippedType = stripTypedefs(type)
|
||||||
|
|
||||||
|
if typedefStrippedType.code == gdb.TYPE_CODE_REF:
|
||||||
try:
|
try:
|
||||||
# This throws "RuntimeError: Attempt to dereference a
|
# This throws "RuntimeError: Attempt to dereference a
|
||||||
# generic pointer." with MinGW's gcc 4.5 when it "identifies"
|
# generic pointer." with MinGW's gcc 4.5 when it "identifies"
|
||||||
# a "QWidget &" as "void &".
|
# a "QWidget &" as "void &".
|
||||||
type = type.target()
|
type = type.target()
|
||||||
value = value.cast(type)
|
typedefStrippedType = typedefStrippedType.target()
|
||||||
|
value = value.cast(typedefStrippedType)
|
||||||
item.value = value
|
item.value = value
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
value = item.value
|
value = item.value
|
||||||
@@ -1372,8 +1375,6 @@ class Dumper:
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
typedefStrippedType = stripTypedefs(type)
|
|
||||||
|
|
||||||
if typedefStrippedType.code == gdb.TYPE_CODE_INT:
|
if typedefStrippedType.code == gdb.TYPE_CODE_INT:
|
||||||
if self.alienSource and str(type) == "unsigned long long":
|
if self.alienSource and str(type) == "unsigned long long":
|
||||||
strlen = value % (1L<<32)
|
strlen = value % (1L<<32)
|
||||||
@@ -1404,7 +1405,7 @@ class Dumper:
|
|||||||
self.putNumChild(0)
|
self.putNumChild(0)
|
||||||
return
|
return
|
||||||
|
|
||||||
if value.type.code == gdb.TYPE_CODE_ARRAY:
|
if typedefStrippedType.code == gdb.TYPE_CODE_ARRAY:
|
||||||
targettype = realtype.target()
|
targettype = realtype.target()
|
||||||
self.putAddress(value.address)
|
self.putAddress(value.address)
|
||||||
self.putType(realtype)
|
self.putType(realtype)
|
||||||
@@ -1603,9 +1604,9 @@ class Dumper:
|
|||||||
#warn("INAME: %s " % item.iname)
|
#warn("INAME: %s " % item.iname)
|
||||||
#warn("INAMES: %s " % self.expandedINames)
|
#warn("INAMES: %s " % self.expandedINames)
|
||||||
#warn("EXPANDED: %s " % (item.iname in self.expandedINames))
|
#warn("EXPANDED: %s " % (item.iname in self.expandedINames))
|
||||||
fields = extractFields(type)
|
fields = extractFields(typedefStrippedType)
|
||||||
|
|
||||||
self.putType(type)
|
self.putType(realtype)
|
||||||
try:
|
try:
|
||||||
self.putAddress(item.value.address)
|
self.putAddress(item.value.address)
|
||||||
except:
|
except:
|
||||||
|
@@ -2418,14 +2418,6 @@ QString fooxx()
|
|||||||
return "bababa";
|
return "bababa";
|
||||||
}
|
}
|
||||||
|
|
||||||
int testReference()
|
|
||||||
{
|
|
||||||
QString a = "hello";
|
|
||||||
const QString &b = fooxx();
|
|
||||||
const QString c = "world";
|
|
||||||
return a.size() + b.size() + c.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace basic {
|
namespace basic {
|
||||||
|
|
||||||
@@ -2645,6 +2637,30 @@ namespace basic {
|
|||||||
dummyStatement(&i, &d, &s);
|
dummyStatement(&i, &d, &s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testReference1()
|
||||||
|
{
|
||||||
|
int a = 43;
|
||||||
|
const int &b = a;
|
||||||
|
typedef int &Ref;
|
||||||
|
const int c = 44;
|
||||||
|
const Ref d = a;
|
||||||
|
// <=== Break here.
|
||||||
|
dummyStatement(&a, &b);
|
||||||
|
dummyStatement(&c, &d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testReference2()
|
||||||
|
{
|
||||||
|
QString a = "hello";
|
||||||
|
const QString &b = fooxx();
|
||||||
|
typedef QString &Ref;
|
||||||
|
const QString c = "world";
|
||||||
|
const Ref d = a;
|
||||||
|
// <=== Break here.
|
||||||
|
dummyStatement(&a, &b);
|
||||||
|
dummyStatement(&c, &d);
|
||||||
|
}
|
||||||
|
|
||||||
void testBasic()
|
void testBasic()
|
||||||
{
|
{
|
||||||
testChar();
|
testChar();
|
||||||
@@ -2658,6 +2674,8 @@ namespace basic {
|
|||||||
testStringWithNewline();
|
testStringWithNewline();
|
||||||
testMemoryView();
|
testMemoryView();
|
||||||
testColoredMemoryView();
|
testColoredMemoryView();
|
||||||
|
testReference1();
|
||||||
|
testReference2();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace basic
|
} // namespace basic
|
||||||
@@ -3290,11 +3308,14 @@ namespace bug5799 {
|
|||||||
s2.m1 = 5;
|
s2.m1 = 5;
|
||||||
S4 s4;
|
S4 s4;
|
||||||
s4.m1 = 5;
|
s4.m1 = 5;
|
||||||
S1 arr[10];
|
S1 a1[10];
|
||||||
|
typedef S1 Array[10];
|
||||||
|
Array a2;
|
||||||
// <=== Break here.
|
// <=== Break here.
|
||||||
// Expand s2 and s4.
|
// Expand s2 and s4.
|
||||||
// Check there is no <unavailable synchronous data>
|
// Check there is no <unavailable synchronous data>
|
||||||
dummyStatement(&s2, &s4, &arr);
|
dummyStatement(&s2, &s4);
|
||||||
|
dummyStatement(&a1, &a2);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace bug5799
|
} // namespace bug5799
|
||||||
@@ -3406,7 +3427,6 @@ int main(int argc, char *argv[])
|
|||||||
testPeekAndPoke3();
|
testPeekAndPoke3();
|
||||||
testFunctionPointer();
|
testFunctionPointer();
|
||||||
testAnonymous();
|
testAnonymous();
|
||||||
testReference();
|
|
||||||
//testEndlessLoop();
|
//testEndlessLoop();
|
||||||
//testEndlessRecursion();
|
//testEndlessRecursion();
|
||||||
testQStack();
|
testQStack();
|
||||||
|
Reference in New Issue
Block a user