forked from qt-creator/qt-creator
QmlDebugging: Assign Value in Debugger
Call EXEC instead of SET_PROPERTY for assigning a value in Locals and Expressions. Also check if the id of the object is valid before calling EXPAND. Task-number: QTCREATORBUG-7089 Change-Id: I2769e5345cfb7ecf87e36125821f141821556690 Reviewed-by: Christian Stenger <christian.stenger@nokia.com>
This commit is contained in:
@@ -75,8 +75,9 @@ public:
|
||||
virtual void changeBreakpoint(const BreakpointModelId &id) = 0;
|
||||
virtual void synchronizeBreakpoints() = 0;
|
||||
|
||||
virtual void assignValueInDebugger(const QByteArray expr, const quint64 &id,
|
||||
const QString &property, const QString &value) = 0;
|
||||
virtual void assignValueInDebugger(const WatchData *data,
|
||||
const QString &expression,
|
||||
const QVariant &valueV) = 0;
|
||||
|
||||
virtual void updateWatchData(const WatchData &data) = 0;
|
||||
virtual void executeDebuggerCommand(const QString &command) = 0;
|
||||
|
@@ -973,9 +973,10 @@ bool QmlEngine::setToolTipExpression(const QPoint &mousePos,
|
||||
void QmlEngine::assignValueInDebugger(const WatchData *data,
|
||||
const QString &expression, const QVariant &valueV)
|
||||
{
|
||||
quint64 objectId = data->id;
|
||||
if (objectId > 0 && !expression.isEmpty() && d->m_adapter.activeDebuggerClient()) {
|
||||
d->m_adapter.activeDebuggerClient()->assignValueInDebugger(expression.toUtf8(), objectId, expression, valueV.toString());
|
||||
if (!expression.isEmpty() && d->m_adapter.activeDebuggerClient()) {
|
||||
d->m_adapter.activeDebuggerClient()->assignValueInDebugger(data,
|
||||
expression,
|
||||
valueV);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1153,11 +1153,12 @@ void QmlV8DebuggerClient::synchronizeBreakpoints()
|
||||
//NOT USED
|
||||
}
|
||||
|
||||
void QmlV8DebuggerClient::assignValueInDebugger(const QByteArray /*expr*/, const quint64 &/*id*/,
|
||||
const QString &property, const QString &value)
|
||||
void QmlV8DebuggerClient::assignValueInDebugger(const WatchData * /*data*/,
|
||||
const QString &expr,
|
||||
const QVariant &valueV)
|
||||
{
|
||||
StackHandler *stackHandler = d->engine->stackHandler();
|
||||
QString expression = QString(_("%1 = %2;")).arg(property).arg(value);
|
||||
QString expression = QString(_("%1 = %2;")).arg(expr).arg(valueV.toString());
|
||||
if (stackHandler->isContentsValid() && stackHandler->currentFrame().isUsable()) {
|
||||
d->evaluate(expression, false, false, stackHandler->currentIndex());
|
||||
} else {
|
||||
|
@@ -87,8 +87,9 @@ public:
|
||||
void changeBreakpoint(const BreakpointModelId &id);
|
||||
void synchronizeBreakpoints();
|
||||
|
||||
void assignValueInDebugger(const QByteArray expr, const quint64 &id,
|
||||
const QString &property, const QString &value);
|
||||
void assignValueInDebugger(const WatchData *data,
|
||||
const QString &expression,
|
||||
const QVariant &valueV);
|
||||
|
||||
void updateWatchData(const WatchData &);
|
||||
void executeDebuggerCommand(const QString &command);
|
||||
|
@@ -222,7 +222,9 @@ void QScriptDebuggerClient::startSession()
|
||||
|
||||
//Set all breakpoints
|
||||
BreakHandler *handler = d->engine->breakHandler();
|
||||
foreach (BreakpointModelId id, handler->engineBreakpointIds(d->engine)) {
|
||||
DebuggerEngine * engine = d->engine->isSlaveEngine() ?
|
||||
d->engine->masterEngine() : d->engine;
|
||||
foreach (BreakpointModelId id, handler->engineBreakpointIds(engine)) {
|
||||
QTC_CHECK(handler->state(id) == BreakpointInsertProceeding);
|
||||
handler->notifyBreakpointInsertOk(id);
|
||||
}
|
||||
@@ -313,17 +315,19 @@ void QScriptDebuggerClient::synchronizeBreakpoints()
|
||||
sendMessage(reply);
|
||||
}
|
||||
|
||||
void QScriptDebuggerClient::assignValueInDebugger(const QByteArray expr, const quint64 &id,
|
||||
const QString &property, const QString &value)
|
||||
void QScriptDebuggerClient::assignValueInDebugger(const WatchData *data,
|
||||
const QString &expr,
|
||||
const QVariant &valueV)
|
||||
{
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
QByteArray cmd = "SET_PROPERTY";
|
||||
QByteArray cmd = "EXEC";
|
||||
rs << cmd;
|
||||
rs << expr << id << property << value;
|
||||
d->logSendMessage(QString::fromLatin1("%1 %2 %3 %4 %5").
|
||||
arg(QLatin1String(cmd), QLatin1String(expr),
|
||||
QString::number(id), property, value));
|
||||
QString expression = QString(_("%1 = %2;")).arg(expr).arg(valueV.toString());
|
||||
rs << data->iname << expression;
|
||||
d->logSendMessage(QString::fromLatin1("%1 %2 %3 %4").
|
||||
arg(QLatin1String(cmd), QLatin1String(data->iname), expr,
|
||||
valueV.toString()));
|
||||
sendMessage(reply);
|
||||
}
|
||||
|
||||
@@ -365,6 +369,10 @@ void QScriptDebuggerClient::synchronizeWatchers(const QStringList &watchers)
|
||||
|
||||
void QScriptDebuggerClient::expandObject(const QByteArray &iname, quint64 objectId)
|
||||
{
|
||||
//Check if id is valid
|
||||
if (qint64(objectId) == -1)
|
||||
return;
|
||||
|
||||
QByteArray reply;
|
||||
QDataStream rs(&reply, QIODevice::WriteOnly);
|
||||
QByteArray cmd = "EXPAND";
|
||||
@@ -431,7 +439,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
||||
data.iname = d->engine->watchHandler()->watcherName(data.exp);
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname)) {
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname) &&
|
||||
qint64(data.id) != -1) {
|
||||
needPing = true;
|
||||
expandObject(data.iname,data.id);
|
||||
}
|
||||
@@ -441,7 +450,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
||||
data.iname = "local." + data.exp;
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname)) {
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname) &&
|
||||
qint64(data.id) != -1) {
|
||||
needPing = true;
|
||||
expandObject(data.iname,data.id);
|
||||
}
|
||||
@@ -511,6 +521,9 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
} else if (iname == "console") {
|
||||
d->engine->showMessage(data.value, QtMessageLogOutput);
|
||||
} else if (iname.startsWith("local.")) {
|
||||
data.name = data.name.left(data.name.indexOf(QLatin1Char(' ')));
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
} else {
|
||||
qWarning() << "QmlEngine: Unexcpected result: " << iname << data.value;
|
||||
}
|
||||
@@ -527,7 +540,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
||||
data.iname = iname + '.' + data.exp;
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname)) {
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname) &&
|
||||
qint64(data.id) != -1) {
|
||||
needPing = true;
|
||||
expandObject(data.iname, data.id);
|
||||
}
|
||||
@@ -552,7 +566,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
||||
data.iname = d->engine->watchHandler()->watcherName(data.exp);
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname)) {
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname) &&
|
||||
qint64(data.id) != -1) {
|
||||
needPing = true;
|
||||
expandObject(data.iname, data.id);
|
||||
}
|
||||
@@ -561,7 +576,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
|
||||
foreach (WatchData data, locals) {
|
||||
data.iname = "local." + data.exp;
|
||||
d->engine->watchHandler()->insertData(data);
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname)) {
|
||||
if (d->engine->watchHandler()->expandedINames().contains(data.iname) &&
|
||||
qint64(data.id) != -1) {
|
||||
needPing = true;
|
||||
expandObject(data.iname, data.id);
|
||||
}
|
||||
|
@@ -72,8 +72,8 @@ public:
|
||||
void changeBreakpoint(const BreakpointModelId &id);
|
||||
void synchronizeBreakpoints();
|
||||
|
||||
void assignValueInDebugger(const QByteArray expr, const quint64 &id,
|
||||
const QString &property, const QString &value);
|
||||
void assignValueInDebugger(const WatchData *data, const QString &expression,
|
||||
const QVariant &valueV);
|
||||
|
||||
void updateWatchData(const WatchData &data);
|
||||
void executeDebuggerCommand(const QString &command);
|
||||
|
Reference in New Issue
Block a user