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:
Aurindam Jana
2012-03-14 11:58:31 +01:00
parent 02da7db7e1
commit 6e0caec046
6 changed files with 45 additions and 25 deletions

View File

@@ -75,8 +75,9 @@ public:
virtual void changeBreakpoint(const BreakpointModelId &id) = 0; virtual void changeBreakpoint(const BreakpointModelId &id) = 0;
virtual void synchronizeBreakpoints() = 0; virtual void synchronizeBreakpoints() = 0;
virtual void assignValueInDebugger(const QByteArray expr, const quint64 &id, virtual void assignValueInDebugger(const WatchData *data,
const QString &property, const QString &value) = 0; const QString &expression,
const QVariant &valueV) = 0;
virtual void updateWatchData(const WatchData &data) = 0; virtual void updateWatchData(const WatchData &data) = 0;
virtual void executeDebuggerCommand(const QString &command) = 0; virtual void executeDebuggerCommand(const QString &command) = 0;

View File

@@ -973,9 +973,10 @@ bool QmlEngine::setToolTipExpression(const QPoint &mousePos,
void QmlEngine::assignValueInDebugger(const WatchData *data, void QmlEngine::assignValueInDebugger(const WatchData *data,
const QString &expression, const QVariant &valueV) const QString &expression, const QVariant &valueV)
{ {
quint64 objectId = data->id; if (!expression.isEmpty() && d->m_adapter.activeDebuggerClient()) {
if (objectId > 0 && !expression.isEmpty() && d->m_adapter.activeDebuggerClient()) { d->m_adapter.activeDebuggerClient()->assignValueInDebugger(data,
d->m_adapter.activeDebuggerClient()->assignValueInDebugger(expression.toUtf8(), objectId, expression, valueV.toString()); expression,
valueV);
} }
} }

View File

@@ -1153,11 +1153,12 @@ void QmlV8DebuggerClient::synchronizeBreakpoints()
//NOT USED //NOT USED
} }
void QmlV8DebuggerClient::assignValueInDebugger(const QByteArray /*expr*/, const quint64 &/*id*/, void QmlV8DebuggerClient::assignValueInDebugger(const WatchData * /*data*/,
const QString &property, const QString &value) const QString &expr,
const QVariant &valueV)
{ {
StackHandler *stackHandler = d->engine->stackHandler(); 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()) { if (stackHandler->isContentsValid() && stackHandler->currentFrame().isUsable()) {
d->evaluate(expression, false, false, stackHandler->currentIndex()); d->evaluate(expression, false, false, stackHandler->currentIndex());
} else { } else {

View File

@@ -87,8 +87,9 @@ public:
void changeBreakpoint(const BreakpointModelId &id); void changeBreakpoint(const BreakpointModelId &id);
void synchronizeBreakpoints(); void synchronizeBreakpoints();
void assignValueInDebugger(const QByteArray expr, const quint64 &id, void assignValueInDebugger(const WatchData *data,
const QString &property, const QString &value); const QString &expression,
const QVariant &valueV);
void updateWatchData(const WatchData &); void updateWatchData(const WatchData &);
void executeDebuggerCommand(const QString &command); void executeDebuggerCommand(const QString &command);

View File

@@ -222,7 +222,9 @@ void QScriptDebuggerClient::startSession()
//Set all breakpoints //Set all breakpoints
BreakHandler *handler = d->engine->breakHandler(); 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); QTC_CHECK(handler->state(id) == BreakpointInsertProceeding);
handler->notifyBreakpointInsertOk(id); handler->notifyBreakpointInsertOk(id);
} }
@@ -313,17 +315,19 @@ void QScriptDebuggerClient::synchronizeBreakpoints()
sendMessage(reply); sendMessage(reply);
} }
void QScriptDebuggerClient::assignValueInDebugger(const QByteArray expr, const quint64 &id, void QScriptDebuggerClient::assignValueInDebugger(const WatchData *data,
const QString &property, const QString &value) const QString &expr,
const QVariant &valueV)
{ {
QByteArray reply; QByteArray reply;
QDataStream rs(&reply, QIODevice::WriteOnly); QDataStream rs(&reply, QIODevice::WriteOnly);
QByteArray cmd = "SET_PROPERTY"; QByteArray cmd = "EXEC";
rs << cmd; rs << cmd;
rs << expr << id << property << value; QString expression = QString(_("%1 = %2;")).arg(expr).arg(valueV.toString());
d->logSendMessage(QString::fromLatin1("%1 %2 %3 %4 %5"). rs << data->iname << expression;
arg(QLatin1String(cmd), QLatin1String(expr), d->logSendMessage(QString::fromLatin1("%1 %2 %3 %4").
QString::number(id), property, value)); arg(QLatin1String(cmd), QLatin1String(data->iname), expr,
valueV.toString()));
sendMessage(reply); sendMessage(reply);
} }
@@ -365,6 +369,10 @@ void QScriptDebuggerClient::synchronizeWatchers(const QStringList &watchers)
void QScriptDebuggerClient::expandObject(const QByteArray &iname, quint64 objectId) void QScriptDebuggerClient::expandObject(const QByteArray &iname, quint64 objectId)
{ {
//Check if id is valid
if (qint64(objectId) == -1)
return;
QByteArray reply; QByteArray reply;
QDataStream rs(&reply, QIODevice::WriteOnly); QDataStream rs(&reply, QIODevice::WriteOnly);
QByteArray cmd = "EXPAND"; QByteArray cmd = "EXPAND";
@@ -431,7 +439,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
data.iname = d->engine->watchHandler()->watcherName(data.exp); data.iname = d->engine->watchHandler()->watcherName(data.exp);
d->engine->watchHandler()->insertData(data); 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; needPing = true;
expandObject(data.iname,data.id); expandObject(data.iname,data.id);
} }
@@ -441,7 +450,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
data.iname = "local." + data.exp; data.iname = "local." + data.exp;
d->engine->watchHandler()->insertData(data); 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; needPing = true;
expandObject(data.iname,data.id); expandObject(data.iname,data.id);
} }
@@ -511,6 +521,9 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
d->engine->watchHandler()->insertData(data); d->engine->watchHandler()->insertData(data);
} else if (iname == "console") { } else if (iname == "console") {
d->engine->showMessage(data.value, QtMessageLogOutput); 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 { } else {
qWarning() << "QmlEngine: Unexcpected result: " << iname << data.value; qWarning() << "QmlEngine: Unexcpected result: " << iname << data.value;
} }
@@ -527,7 +540,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
data.iname = iname + '.' + data.exp; data.iname = iname + '.' + data.exp;
d->engine->watchHandler()->insertData(data); 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; needPing = true;
expandObject(data.iname, data.id); expandObject(data.iname, data.id);
} }
@@ -552,7 +566,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
data.iname = d->engine->watchHandler()->watcherName(data.exp); data.iname = d->engine->watchHandler()->watcherName(data.exp);
d->engine->watchHandler()->insertData(data); 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; needPing = true;
expandObject(data.iname, data.id); expandObject(data.iname, data.id);
} }
@@ -561,7 +576,8 @@ void QScriptDebuggerClient::messageReceived(const QByteArray &data)
foreach (WatchData data, locals) { foreach (WatchData data, locals) {
data.iname = "local." + data.exp; data.iname = "local." + data.exp;
d->engine->watchHandler()->insertData(data); 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; needPing = true;
expandObject(data.iname, data.id); expandObject(data.iname, data.id);
} }

View File

@@ -72,8 +72,8 @@ public:
void changeBreakpoint(const BreakpointModelId &id); void changeBreakpoint(const BreakpointModelId &id);
void synchronizeBreakpoints(); void synchronizeBreakpoints();
void assignValueInDebugger(const QByteArray expr, const quint64 &id, void assignValueInDebugger(const WatchData *data, const QString &expression,
const QString &property, const QString &value); const QVariant &valueV);
void updateWatchData(const WatchData &data); void updateWatchData(const WatchData &data);
void executeDebuggerCommand(const QString &command); void executeDebuggerCommand(const QString &command);