QtMessageLogHandler: Fix crash

Set a parent when creating QtMessageLogItem.

Change-Id: I8faf76059dcc517794a4eb3d202bc14cd1632ca8
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
This commit is contained in:
Aurindam Jana
2012-03-21 15:06:18 +01:00
parent 39cb4e954d
commit 3d1f5bd85c
5 changed files with 43 additions and 33 deletions

View File

@@ -1045,13 +1045,15 @@ void QmlEngine::onDebugQueryStateChanged(
qobject_cast<QmlJsDebugClient::QDeclarativeDebugExpressionQuery *>( qobject_cast<QmlJsDebugClient::QDeclarativeDebugExpressionQuery *>(
sender()); sender());
if (query && state != QmlJsDebugClient::QDeclarativeDebugQuery::Error) { if (query && state != QmlJsDebugClient::QDeclarativeDebugQuery::Error) {
QtMessageLogItem *item = constructLogItemTree(query->result()); QtMessageLogItem *item = constructLogItemTree(qtMessageLogHandler()->root(),
query->result());
if (item) if (item)
qtMessageLogHandler()->appendItem(item); qtMessageLogHandler()->appendItem(item);
} else } else
qtMessageLogHandler()-> qtMessageLogHandler()->
appendItem(new QtMessageLogItem(QtMessageLogHandler::ErrorType, appendItem(new QtMessageLogItem(qtMessageLogHandler()->root(),
_("Error evaluating expression."))); QtMessageLogHandler::ErrorType,
_("Error evaluating expression.")));
delete query; delete query;
} }
@@ -1122,7 +1124,8 @@ void QmlEngine::appendDebugOutput(QtMsgType type, const QString &message,
//This case is not possible //This case is not possible
return; return;
} }
QtMessageLogItem *item = new QtMessageLogItem(itemType, message); QtMessageLogItem *item = new QtMessageLogItem(qtMessageLogHandler()->root(),
itemType, message);
item->file = info.file; item->file = info.file;
item->line = info.line; item->line = info.line;
qtMessageLogHandler()->appendItem(item); qtMessageLogHandler()->appendItem(item);
@@ -1175,8 +1178,9 @@ bool QmlEngine::evaluateScriptExpression(const QString& expression)
//Incase of invalid context, show Error message //Incase of invalid context, show Error message
qtMessageLogHandler()-> qtMessageLogHandler()->
appendItem(new QtMessageLogItem( appendItem(new QtMessageLogItem(
qtMessageLogHandler()->root(),
QtMessageLogHandler::ErrorType, QtMessageLogHandler::ErrorType,
_("Cannot evaluate without" _("Cannot evaluate without "
"a valid QML/JS Context.")), "a valid QML/JS Context.")),
qtMessageLogHandler()->rowCount()); qtMessageLogHandler()->rowCount());
} }
@@ -1287,12 +1291,12 @@ bool QmlEngine::canEvaluateScript(const QString &script)
} }
QtMessageLogItem *QmlEngine::constructLogItemTree( QtMessageLogItem *QmlEngine::constructLogItemTree(
const QVariant &result, const QString &key) QtMessageLogItem *parent, const QVariant &result, const QString &key)
{ {
if (!result.isValid()) if (!result.isValid())
return 0; return 0;
QtMessageLogItem *item = new QtMessageLogItem(); QtMessageLogItem *item = new QtMessageLogItem(parent);
if (result.type() == QVariant::Map) { if (result.type() == QVariant::Map) {
if (key.isEmpty()) if (key.isEmpty())
item->text = _("Object"); item->text = _("Object");
@@ -1302,7 +1306,8 @@ QtMessageLogItem *QmlEngine::constructLogItemTree(
QMapIterator<QString, QVariant> i(result.toMap()); QMapIterator<QString, QVariant> i(result.toMap());
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
QtMessageLogItem *child = constructLogItemTree(i.value(), i.key()); QtMessageLogItem *child = constructLogItemTree(item,
i.value(), i.key());
if (child) if (child)
item->insertChild(item->childCount(), child); item->insertChild(item->childCount(), child);
} }
@@ -1313,7 +1318,7 @@ QtMessageLogItem *QmlEngine::constructLogItemTree(
item->text = QString(_("[%1] : List")).arg(key); item->text = QString(_("[%1] : List")).arg(key);
QVariantList resultList = result.toList(); QVariantList resultList = result.toList();
for (int i = 0; i < resultList.count(); i++) { for (int i = 0; i < resultList.count(); i++) {
QtMessageLogItem *child = constructLogItemTree(resultList.at(i), QtMessageLogItem *child = constructLogItemTree(item, resultList.at(i),
QString::number(i)); QString::number(i));
if (child) if (child)
item->insertChild(item->childCount(), child); item->insertChild(item->childCount(), child);

View File

@@ -187,7 +187,8 @@ private:
void updateEditor(Core::IEditor *editor, const QTextDocument *document); void updateEditor(Core::IEditor *editor, const QTextDocument *document);
bool canEvaluateScript(const QString &script); bool canEvaluateScript(const QString &script);
QtMessageLogItem *constructLogItemTree(const QVariant &result, QtMessageLogItem *constructLogItemTree(QtMessageLogItem *parent,
const QVariant &result,
const QString &key = QString()); const QString &key = QString());
bool adjustBreakpointLineAndColumn(const QString &filePath, quint32 *line, bool adjustBreakpointLineAndColumn(const QString &filePath, quint32 *line,
quint32 *column, bool *valid); quint32 *column, bool *valid);

View File

@@ -128,8 +128,8 @@ public:
//TODO:: remove this method //TODO:: remove this method
void reformatRequest(QByteArray &request); void reformatRequest(QByteArray &request);
QtMessageLogItem *constructLogItemTree(const QmlV8ObjectData &objectData, QtMessageLogItem *constructLogItemTree(QtMessageLogItem *parent,
const QVariant &refsVal); const QmlV8ObjectData &objectData, const QVariant &refsVal);
private: private:
QByteArray packMessage(const QByteArray &type, const QByteArray &message = QByteArray()); QByteArray packMessage(const QByteArray &type, const QByteArray &message = QByteArray());
QScriptValue initObject(); QScriptValue initObject();
@@ -974,6 +974,7 @@ void QmlV8DebuggerClientPrivate::reformatRequest(QByteArray &request)
} }
QtMessageLogItem *QmlV8DebuggerClientPrivate::constructLogItemTree( QtMessageLogItem *QmlV8DebuggerClientPrivate::constructLogItemTree(
QtMessageLogItem *parent,
const QmlV8ObjectData &objectData, const QmlV8ObjectData &objectData,
const QVariant &refsVal) const QVariant &refsVal)
{ {
@@ -987,12 +988,12 @@ QtMessageLogItem *QmlV8DebuggerClientPrivate::constructLogItemTree(
text = QString(_("%1: %2")).arg(QString::fromAscii(objectData.name)) text = QString(_("%1: %2")).arg(QString::fromAscii(objectData.name))
.arg(objectData.value.toString()); .arg(objectData.value.toString());
QtMessageLogItem *item = new QtMessageLogItem( QtMessageLogItem *item = new QtMessageLogItem(parent,
QtMessageLogHandler::UndefinedType, text); QtMessageLogHandler::UndefinedType, text);
foreach (const QVariant &property, objectData.properties) { foreach (const QVariant &property, objectData.properties) {
QtMessageLogItem *child = constructLogItemTree( QtMessageLogItem *child = constructLogItemTree(
extractData(property, refsVal), refsVal); item, extractData(property, refsVal), refsVal);
if (child) if (child)
item->insertChild(item->childCount(), child); item->insertChild(item->childCount(), child);
} }
@@ -1837,7 +1838,8 @@ void QmlV8DebuggerClient::updateEvaluationResult(int sequence, bool success, con
} else if (d->debuggerCommands.contains(sequence)) { } else if (d->debuggerCommands.contains(sequence)) {
d->updateLocalsAndWatchers.removeOne(sequence); d->updateLocalsAndWatchers.removeOne(sequence);
QmlV8ObjectData body = d->extractData(bodyVal, refsVal); QmlV8ObjectData body = d->extractData(bodyVal, refsVal);
QtMessageLogItem *item = d->constructLogItemTree(body, refsVal); QtMessageLogItem *item = d->constructLogItemTree(d->engine->qtMessageLogHandler()->root(),
body, refsVal);
if (item) if (item)
d->engine->qtMessageLogHandler()->appendItem(item); d->engine->qtMessageLogHandler()->appendItem(item);
//Update the locals //Update the locals

View File

@@ -45,8 +45,8 @@ namespace Internal {
// //
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
QtMessageLogItem::QtMessageLogItem(QtMessageLogHandler::ItemType itemType, QtMessageLogItem::QtMessageLogItem(QtMessageLogItem *parent,
const QString &text, QtMessageLogItem *parent) QtMessageLogHandler::ItemType itemType, const QString &text)
: m_parentItem(parent), : m_parentItem(parent),
text(text), text(text),
itemType(itemType), itemType(itemType),
@@ -86,8 +86,8 @@ bool QtMessageLogItem::insertChildren(int position, int count)
for (int row = 0; row < count; ++row) { for (int row = 0; row < count; ++row) {
QtMessageLogItem *item = new QtMessageLogItem *item = new
QtMessageLogItem(QtMessageLogHandler::UndefinedType, QString(), QtMessageLogItem(this , QtMessageLogHandler::UndefinedType,
this); QString());
m_childItems.insert(position, item); m_childItems.insert(position, item);
} }
@@ -99,10 +99,6 @@ bool QtMessageLogItem::insertChild(int position, QtMessageLogItem *item)
if (position < 0 || position > m_childItems.size()) if (position < 0 || position > m_childItems.size())
return false; return false;
if (item->parent())
item->parent()->detachChild(item->childNumber());
item->m_parentItem = this;
m_childItems.insert(position, item); m_childItems.insert(position, item);
return true; return true;
@@ -143,7 +139,7 @@ bool QtMessageLogItem::detachChild(int position)
QtMessageLogHandler::QtMessageLogHandler(QObject *parent) : QtMessageLogHandler::QtMessageLogHandler(QObject *parent) :
QAbstractItemModel(parent), QAbstractItemModel(parent),
m_hasEditableRow(false), m_hasEditableRow(false),
m_rootItem(new QtMessageLogItem()), m_rootItem(new QtMessageLogItem(0)),
m_maxSizeOfFileName(0) m_maxSizeOfFileName(0)
{ {
} }
@@ -157,8 +153,8 @@ void QtMessageLogHandler::clear()
{ {
beginResetModel(); beginResetModel();
reset(); reset();
delete m_rootItem; qDeleteAll(m_rootItem->m_childItems);
m_rootItem = new QtMessageLogItem(); m_rootItem->m_childItems.clear();
endResetModel(); endResetModel();
if (m_hasEditableRow) if (m_hasEditableRow)
@@ -180,7 +176,7 @@ bool QtMessageLogHandler::appendItem(QtMessageLogItem *item, int position)
bool QtMessageLogHandler::appendMessage(QtMessageLogHandler::ItemType itemType, bool QtMessageLogHandler::appendMessage(QtMessageLogHandler::ItemType itemType,
const QString &message, int position) const QString &message, int position)
{ {
return appendItem(new QtMessageLogItem(itemType, message), position); return appendItem(new QtMessageLogItem(m_rootItem, itemType, message), position);
} }
void QtMessageLogHandler::setHasEditableRow(bool hasEditableRow) void QtMessageLogHandler::setHasEditableRow(bool hasEditableRow)
@@ -202,7 +198,7 @@ bool QtMessageLogHandler::hasEditableRow() const
void QtMessageLogHandler::appendEditableRow() void QtMessageLogHandler::appendEditableRow()
{ {
int position = m_rootItem->childCount(); int position = m_rootItem->childCount();
if (appendItem(new QtMessageLogItem(QtMessageLogHandler::InputType), position)) if (appendItem(new QtMessageLogItem(m_rootItem, QtMessageLogHandler::InputType), position))
emit selectEditableRow(index(position, 0), emit selectEditableRow(index(position, 0),
QItemSelectionModel::ClearAndSelect); QItemSelectionModel::ClearAndSelect);
} }
@@ -289,7 +285,8 @@ QModelIndex QtMessageLogHandler::parent(const QModelIndex &index) const
return QModelIndex(); return QModelIndex();
//can parentItem be 0? //can parentItem be 0?
QTC_ASSERT(parentItem, qDebug("Parent is Null!!")); if (!parentItem)
return QModelIndex();
return createIndex(parentItem->childNumber(), 0, parentItem); return createIndex(parentItem->childNumber(), 0, parentItem);
} }

View File

@@ -78,6 +78,8 @@ public:
int sizeOfFile(const QFont &font); int sizeOfFile(const QFont &font);
int sizeOfLineNumber(const QFont &font); int sizeOfLineNumber(const QFont &font);
QtMessageLogItem *root() const { return m_rootItem; }
public slots: public slots:
void clear(); void clear();
@@ -116,9 +118,9 @@ private:
class QtMessageLogItem class QtMessageLogItem
{ {
public: public:
QtMessageLogItem(QtMessageLogHandler::ItemType type = QtMessageLogHandler::UndefinedType, QtMessageLogItem(QtMessageLogItem *parent,
const QString &data = QString(), QtMessageLogHandler::ItemType type = QtMessageLogHandler::UndefinedType,
QtMessageLogItem *parent = 0); const QString &data = QString());
~QtMessageLogItem(); ~QtMessageLogItem();
QtMessageLogItem *child(int number); QtMessageLogItem *child(int number);
@@ -139,6 +141,9 @@ public:
QtMessageLogHandler::ItemType itemType; QtMessageLogHandler::ItemType itemType;
QString file; QString file;
int line; int line;
private:
friend class QtMessageLogHandler;
}; };
} //Internal } //Internal