aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/debugger/watchhandler.cpp
diff options
context:
space:
mode:
authorhjk <[email protected]>2009-12-08 16:00:06 +0100
committerhjk <[email protected]>2009-12-08 17:46:53 +0100
commit1c94133b581e9761718716ebae72b9a648034328 (patch)
tree4938ca1f9a0a1d4762146d98b490739c32f22c46 /src/plugins/debugger/watchhandler.cpp
parentd92f8b80ca535e561b4e1ed5aa0ac5bb0fd04074 (diff)
debugger: start working on infrastructure to allow selection of encoding of char
arrays
Diffstat (limited to 'src/plugins/debugger/watchhandler.cpp')
-rw-r--r--src/plugins/debugger/watchhandler.cpp56
1 files changed, 44 insertions, 12 deletions
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index c8b25794722..f4ff199c1cb 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -627,18 +627,35 @@ template <class IntType> QString reformatInteger(IntType value, int format)
return QString::number(value); // not reached
}
-static QString formattedValue(const WatchData &data,
- int individualFormat, int typeFormat)
+static QString formattedValue(const WatchData &data, int format)
{
if (isIntType(data.type)) {
- const int format = individualFormat == -1 ? typeFormat : individualFormat;
if (format <= 0)
return data.value;
- if (data.type.contains(QLatin1String("unsigned"))) {
+ if (data.type.contains(QLatin1String("unsigned")))
return reformatInteger(data.value.toULongLong(), format);
- } else {
- return reformatInteger(data.value.toLongLong(), format);
- }
+ return reformatInteger(data.value.toLongLong(), format);
+ }
+ if (0 && !data.addr.isEmpty()) {
+ if (format == BaldPointerFormat)
+ return data.value;
+ bool ok = false;
+ const void *addr =
+ reinterpret_cast<void *>(data.value.toULongLong(&ok, 0));
+ if (!ok || !addr)
+ return data.value;
+ // FIXME: add a round trip throught the debugger to prevent crashs?
+ if (format == Latin1StringFormat)
+ return QString::fromLatin1(static_cast<const char *>(addr));
+ if (format == Local8BitStringFormat)
+ return QString::fromLocal8Bit(static_cast<const char *>(addr));
+ if (format == Utf8StringFormat)
+ return QString::fromUtf8(static_cast<const char *>(addr));
+ if (format == Utf16StringFormat)
+ return QString::fromUtf16(static_cast<const ushort *>(addr));
+ if (format == Ucs4StringFormat)
+ return QString::fromUcs4(static_cast<const uint *>(addr));
+ return data.value;
}
return data.value;
}
@@ -762,14 +779,20 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
switch (role) {
case Qt::DisplayRole: {
switch (idx.column()) {
- case 0: return data.name;
- case 1: return formattedValue(data,
- m_handler->m_individualFormats.value(data.iname, -1),
- m_handler->m_typeFormats.value(data.type, -1));
- case 2:
+ case 0:
+ return data.name;
+ case 1: {
+ int format = m_handler->m_individualFormats.value(data.iname, -1);
+ if (format == -1)
+ format = m_handler->m_typeFormats.value(data.type, -1);
+ //qDebug() << "FORMATTED: " << format << formattedValue(data, format);
+ return formattedValue(data, format);
+ }
+ case 2: {
if (!data.displayedType.isEmpty())
return data.displayedType;
return niceType(data.type);
+ }
default: break;
}
break;
@@ -806,12 +829,21 @@ QVariant WatchModel::data(const QModelIndex &idx, int role) const
if (isIntType(data.type))
return QStringList() << tr("decimal") << tr("hexadecimal")
<< tr("binary") << tr("octal");
+ if (!data.addr.isEmpty())
+ return QStringList()
+ << tr("Bald pointer")
+ << tr("Latin1 string")
+ << tr("UTF8 string")
+ << tr("UTF16 string")
+ << tr("UCS4 string");
break;
case TypeFormatRole:
return m_handler->m_typeFormats.value(data.type, -1);
+
case IndividualFormatRole:
return m_handler->m_individualFormats.value(data.iname, -1);
+
case AddressRole: {
if (!data.addr.isEmpty())
return data.addr;