JSDebugger: Only hit breakpoints in user code

Check that the topmost stack entry is a user defined ScriptFunction.
This avoids hitting the anonymous functions used for bindings, e.g.

onClicked: Qt.quit()

leads to script code

(function onClicked() { Qt.quit(); })

which will be hit twice for the debugger: Once for the function call
itself, then for the execution of Qt.quit().

Change-Id: I4cb374782c93a26d97d4a717ce67d1fb2f6df438
Task-number: QTCREATORBUG-5090
Reviewed-on: http://codereview.qt.nokia.com/2746
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Christiaan Janssen <christiaan.janssen@nokia.com>
This commit is contained in:
Kai Koehne
2011-08-08 14:53:10 +02:00
parent e0ba50066d
commit c42e966184

View File

@@ -370,17 +370,17 @@ void JSDebuggerAgentPrivate::positionChange(qint64 scriptId, int lineNumber, int
// check breakpoints // check breakpoints
if (!breakpoints.isEmpty()) { if (!breakpoints.isEmpty()) {
QHash<qint64, QString>::const_iterator it = filenames.constFind(scriptId);
QScriptContext *ctx = engine()->currentContext(); QScriptContext *ctx = engine()->currentContext();
QScriptContextInfo info(ctx); QScriptContextInfo info(ctx);
if (info.functionType() == QScriptContextInfo::ScriptFunction) {
QHash<qint64, QString>::const_iterator it = filenames.constFind(scriptId);
if (it == filenames.constEnd()) { if (it == filenames.constEnd()) {
// It is possible that the scripts are loaded before the agent is attached // It is possible that the scripts are loaded before the agent is attached
QString filename = info.fileName(); QString filename = info.fileName();
JSAgentStackData frame; JSAgentStackData frame;
frame.functionName = info.functionName().toUtf8(); frame.functionName = info.functionName().toUtf8();
QPair<QString, qint32> key = qMakePair(filename, lineNumber);
it = filenames.insert(scriptId, filename); it = filenames.insert(scriptId, filename);
} }
@@ -394,6 +394,7 @@ void JSDebuggerAgentPrivate::positionChange(qint64 scriptId, int lineNumber, int
} }
} }
} }
}
switch (state) { switch (state) {
case NoState: case NoState: