Commit 3b31b5c9 authored by hjk's avatar hjk
Browse files

work on std::list dumper; also a bit of refactoring

parent fdfae53a
......@@ -407,12 +407,13 @@ struct QDumper
QDumper &operator<<(unsigned int i);
QDumper &operator<<(const void *p);
QDumper &operator<<(qulonglong c);
void put(char c);
void addCommaIfNeeded();
void putBase64Encoded(const char *buf, int n);
QDumper &operator<<(const char *str);
QDumper &operator<<(const QByteArray &ba);
QDumper &operator<<(const QString &str);
void put(char c);
void addCommaIfNeeded();
void putBase64Encoded(const char *buf, int n);
void putEllipsis();
void disarm();
void beginHash(); // start of data hash output
......@@ -658,6 +659,14 @@ void QDumper::endHash()
put('}');
}
void QDumper::putEllipsis()
{
d.beginHash();
P(d, "name", "Warning:");
P(d, "value", "<incomplete>");
P(d, "type", d.innertype);
d.endHash();
}
//
// Some helpers to keep the dumper code short
......@@ -816,6 +825,27 @@ static void qDumpInnerValue(QDumper &d, const char *type, const void *addr)
}
static void qDumpInnerValueOrPointer(QDumper &d,
const char *type, const char *strippedtype, const void *addr)
{
if (strippedtype) {
if (deref(addr)) {
P(d, "addr", deref(addr));
P(d, "type", strippedtype);
qDumpInnerValueHelper(d, strippedtype, deref(addr));
} else {
P(d, "addr", addr);
P(d, "type", strippedtype);
P(d, "value", "<null>");
P(d, "numchild", "0");
}
} else {
P(d, "addr", addr);
P(d, "type", type);
qDumpInnerValueHelper(d, type, addr);
}
}
//////////////////////////////////////////////////////////////////////////////
static void qDumpQByteArray(QDumper &d)
......@@ -1213,9 +1243,8 @@ static void qDumpQList(QDumper &d)
bool isInternal = innerSize <= int(sizeof(void*))
&& isMovableType(d.innertype);
P(d, "internal", (int)isInternal);
P(d, "childtype", d.innertype);
P(d, "internal", (int)isInternal);
P(d, "childtype", d.innertype);
if (n > 1000)
n = 1000;
d << ",children=[";
......@@ -1245,11 +1274,8 @@ static void qDumpQList(QDumper &d)
}
d.endHash();
}
if (n < nn) {
d.beginHash();
P(d, "value", "<incomplete>");
d.endHash();
}
if (n < nn)
d.putEllipsis();
d << "]";
}
d.disarm();
......@@ -1491,7 +1517,6 @@ static void qDumpQObject(QDumper &d)
d.beginHash();
P(d, "name", "methods");
P(d, "exp", "*(class '"NS"QObject'*)" << d.data);
P(d, "type", NS"QObjectMethodList");
P(d, "value", "<" << mo->methodCount() << " items>");
P(d, "numchild", mo->methodCount());
d.endHash();
......@@ -1877,11 +1902,7 @@ static void qDumpQSet(QDumper &d)
d.endHash();
++i;
if (i > 10000) {
d.beginHash();
P(d, "name", "Warning:");
P(d, "value", "<incomplete>");
P(d, "type", "");
d.endHash();
d.putEllipsis();
break;
}
}
......@@ -1936,13 +1957,8 @@ static void qDumpQStringList(QDumper &d)
P(d, "valueencoded", "1");
d.endHash();
}
if (n < list.size()) {
d.beginHash();
P(d, "name", "Warning:");
P(d, "value", "<incomplete>");
P(d, "type", "");
d.endHash();
}
if (n < list.size())
d.putEllipsis();
d << "]";
}
d.disarm();
......@@ -2066,37 +2082,21 @@ static void qDumpQVector(QDumper &d)
P(d, "valuedisabled", "true");
P(d, "numchild", n);
if (d.dumpChildren) {
bool innerTypeIsPointer = isPointerType(d.innertype);
QByteArray strippedInnerType = stripPointerType(d.innertype);
const char *stripped =
isPointerType(d.innertype) ? strippedInnerType.data() : 0;
if (n > 1000)
n = 1000;
d << ",children=[";
for (int i = 0; i != n; ++i) {
d.beginHash();
P(d, "name", "[" << i << "]");
const void *p = addOffset(v, i * innersize + typeddatasize);
if (innerTypeIsPointer) {
if (deref(p)) {
//P(d, "value","@" << p);
qDumpInnerValue(d, strippedInnerType.data(), deref(p));
} else {
P(d, "type", d.innertype);
P(d, "value", "<null>");
P(d, "numchild", "0");
}
} else {
qDumpInnerValue(d, d.innertype, p);
}
d.endHash();
}
if (n < nn) {
d.beginHash();
P(d, "name", "[...]");
P(d, "value", "<incomplete>");
P(d, "type", d.innertype);
qDumpInnerValueOrPointer(d, d.innertype, stripped,
addOffset(v, i * innersize + typeddatasize));
d.endHash();
}
if (n < nn)
d.putEllipsis();
d << "]";
}
d.disarm();
......@@ -2111,23 +2111,17 @@ static void qDumpStdList(QDumper &d)
qCheckAccess(p);
p = deref(p);
qCheckAccess(p);
p = deref(p);
qCheckAccess(p);
p = deref(addOffset(d.data, sizeof(void*)));
qCheckAccess(p);
p = deref(addOffset(p, sizeof(void*)));
qCheckAccess(p);
p = deref(addOffset(p, sizeof(void*)));
qCheckAccess(p);
p = deref(addOffset(p, sizeof(void*)));
qCheckAccess(p);
int nn = 0;
std::list<int>::const_iterator it = list.begin();
for (int i = 0; i < 101 && it != list.end(); ++i, ++it) {
for (nn < 101 && it != list.end(); ++nn, ++it)
qCheckAccess(it.operator->());
++nn;
}
if (nn > 100)
P(d, "value", "<more than 100 items>");
......@@ -2137,36 +2131,19 @@ static void qDumpStdList(QDumper &d)
P(d, "valuedisabled", "true");
if (d.dumpChildren) {
unsigned innersize = d.extraInt[0];
bool innerTypeIsPointer = isPointerType(d.innertype);
QByteArray strippedInnerType = stripPointerType(d.innertype);
const char *stripped =
isPointerType(d.innertype) ? strippedInnerType.data() : 0;
d << ",children=[";
std::list<int>::const_iterator it = list.begin();
for (int i = 0; i < 1000 && it != list.end(); ++i, ++it) {
d.beginHash();
P(d, "name", "[" << i << "]");
P(d, "type", d.innertype);
const void *p = it.operator->();
if (innerTypeIsPointer) {
if (deref(p)) {
qDumpInnerValue(d, strippedInnerType.data(), deref(p));
} else {
P(d, "type", d.innertype);
P(d, "value", "<null>");
P(d, "numchild", "0");
}
} else {
qDumpInnerValue(d, d.innertype, p);
}
d.endHash();
}
if (it != list.end()) {
d.beginHash();
P(d, "name", "[...]");
P(d, "value", "<incomplete>");
P(d, "type", d.innertype);
qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->());
d.endHash();
}
if (it != list.end())
d.putEllipsis();
d << "]";
}
d.disarm();
......@@ -2238,37 +2215,21 @@ static void qDumpStdVector(QDumper &d)
P(d, "numchild", n);
if (d.dumpChildren) {
unsigned innersize = d.extraInt[0];
bool innerTypeIsPointer = isPointerType(d.innertype);
QByteArray strippedInnerType = stripPointerType(d.innertype);
const char *stripped =
isPointerType(d.innertype) ? strippedInnerType.data() : 0;
if (n > 1000)
n = 1000;
d << ",children=[";
for (int i = 0; i != n; ++i) {
d.beginHash();
P(d, "name", "[" << i << "]");
const void *p = addOffset(v->start, i * innersize);
if (innerTypeIsPointer) {
if (deref(p)) {
//P(d, "value","@" << p);
qDumpInnerValue(d, strippedInnerType.data(), deref(p));
} else {
P(d, "type", d.innertype);
P(d, "value", "<null>");
P(d, "numchild", "0");
}
} else {
qDumpInnerValue(d, d.innertype, p);
}
d.endHash();
}
if (n < nn) {
d.beginHash();
P(d, "name", "[...]");
P(d, "value", "<incomplete>");
P(d, "type", d.innertype);
qDumpInnerValueOrPointer(d, d.innertype, stripped,
addOffset(v->start, i * innersize));
d.endHash();
}
if (n < nn)
d.putEllipsis();
d << "]";
}
d.disarm();
......
......@@ -129,7 +129,7 @@ void testArray()
}
void testByteArray()
void testQByteArray()
{
QByteArray ba = "Hello";
ba += '"';
......@@ -140,7 +140,7 @@ void testByteArray()
}
void testHash()
void testQHash()
{
QHash<int, float> hgg0;
hgg0[11] = 11.0;
......@@ -164,7 +164,7 @@ void testHash()
hash.insert(".", QPointer<QObject>(&ob));
}
void testImage()
void testQImage()
{
QImage im(QSize(200, 200), QImage::Format_RGB32);
im.fill(QColor(200, 100, 130).rgba());
......@@ -192,7 +192,7 @@ void testIO()
}
void testList()
void testQList()
{
#if 1
QList<int> li;
......@@ -254,7 +254,7 @@ void testList()
v.push_back("dd");
}
void testMap()
void testQMap()
{
QMap<uint, QStringList> ggl;
ggl[11] = QStringList() << "11";
......@@ -289,7 +289,7 @@ void testMap()
#endif
}
void testObject(int &argc, char *argv[])
void testQObject(int &argc, char *argv[])
{
QApplication app(argc, argv);
QAction act("xxx", &app);
......@@ -317,7 +317,7 @@ void testObject(int &argc, char *argv[])
app.exec();
}
void testPixmap()
void testQPixmap()
{
QImage im(QSize(200, 200), QImage::Format_RGB32);
im.fill(QColor(200, 100, 130).rgba());
......@@ -353,7 +353,7 @@ void testPlugin()
}
}
void testSet()
void testQSet()
{
QSet<int> hgg0;
hgg0.insert(11);
......@@ -506,7 +506,7 @@ void testStdVector()
vec.push_back(false);
}
void testString()
void testQString()
{
QString str = "Hello ";
str += " big, ";
......@@ -516,19 +516,9 @@ void testString()
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
str += " World ";
}
void testString3()
void testQString3()
{
QString str = "Hello ";
str += " big, ";
......@@ -544,7 +534,7 @@ void testString3()
delete pstring;
}
void testStringList()
void testQStringList()
{
QStringList l;
l << "Hello ";
......@@ -578,7 +568,7 @@ private:
int m_id;
};
void testThreads()
void testQThread()
{
Thread thread1(1);
Thread thread2(2);
......@@ -588,7 +578,7 @@ void testThreads()
thread2.wait();
}
void testVariant1()
void testQVariant1()
{
QVariant v;
v = 1;
......@@ -597,7 +587,7 @@ void testVariant1()
v = 1;
}
void testVariant2()
void testQVariant2()
{
QVariant var;
#if 0
......@@ -622,7 +612,7 @@ void testVariant2()
var.setValue(my);
}
void testVariant3()
void testQVariant3()
{
QList<int> list;
list << 1 << 2 << 3;
......@@ -631,7 +621,7 @@ void testVariant3()
list = qVariantValue<QList<int> >(variant);
}
void testVector()
void testQVector()
{
QVector<Foo *> plist;
plist.append(new Foo(1));
......@@ -652,7 +642,7 @@ void testVector()
vec.append(false);
}
void testVectorOfList()
void testQVectorOfQList()
{
QVector<QList<int> > v;
QVector<QList<int> > *pv = &v;
......@@ -805,28 +795,28 @@ int main(int argc, char *argv[])
testStdVector();
testPlugin();
testList();
testQList();
testNamespace();
//return 0;
testByteArray();
testHash();
testImage();
testMap();
testString();
testSet();
testStringList();
testQByteArray();
testQHash();
testQImage();
testQMap();
testQString();
testQSet();
testQStringList();
testStruct();
//testThreads();
testVariant1();
testVariant2();
testVariant3();
testVector();
testVectorOfList();
testQVariant1();
testQVariant2();
testQVariant3();
testQVector();
testQVectorOfQList();
*(int *)0 = 0;
testObject(argc, argv);
testQObject(argc, argv);
//QColor color(255,128,10);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment