forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user