From df6338a7b4ff43b1bb0538c44c632d122a7c3766 Mon Sep 17 00:00:00 2001 From: Christiaan Janssen Date: Wed, 11 Jan 2012 17:50:51 +0100 Subject: QDeclarativeExpression: storing column number in expression location Change-Id: I2d69738158abfc76f80b1cfc0e0ccb145fda2245 Reviewed-by: Aaron Kennedy --- .../debugger/qdeclarativedebugstatesdelegate_p.h | 2 +- .../debugger/qdeclarativedebugtrace.cpp | 30 +++++++++++----------- .../debugger/qdeclarativedebugtrace_p.h | 9 ++++--- .../debugger/qdeclarativeenginedebugservice.cpp | 9 ++++--- .../debugger/qdeclarativeenginedebugservice_p.h | 2 +- src/declarative/qml/qdeclarativebinding.cpp | 7 +++-- src/declarative/qml/qdeclarativeboundsignal.cpp | 2 +- src/declarative/qml/qdeclarativecompiler.cpp | 2 ++ src/declarative/qml/qdeclarativecomponent.cpp | 2 +- src/declarative/qml/qdeclarativeengine.cpp | 2 +- src/declarative/qml/qdeclarativeexpression.cpp | 26 ++++++++++++++----- src/declarative/qml/qdeclarativeexpression.h | 5 ++-- src/declarative/qml/qdeclarativeexpression_p.h | 5 ++-- src/declarative/qml/qdeclarativeinstruction_p.h | 2 ++ src/declarative/qml/qdeclarativescriptstring_p.h | 3 ++- src/declarative/qml/qdeclarativevme.cpp | 3 ++- src/declarative/qml/v4/qv4bindings.cpp | 2 +- src/declarative/qml/v8/qv8qobjectwrapper.cpp | 3 ++- src/declarative/qml/v8/qv8valuetypewrapper.cpp | 3 ++- src/qtquick1/util/qdeclarativeanimation.cpp | 2 +- src/qtquick1/util/qdeclarativeconnections.cpp | 2 +- src/qtquick1/util/qdeclarativepropertychanges.cpp | 6 ++--- src/qtquick1/util/qdeclarativestateoperations.cpp | 2 +- src/quick/qtquick2.cpp | 6 ++--- src/quick/util/qdeclarativeconnections.cpp | 7 ++++- src/quick/util/qdeclarativepropertychanges.cpp | 6 ++--- 26 files changed, 89 insertions(+), 61 deletions(-) diff --git a/src/declarative/debugger/qdeclarativedebugstatesdelegate_p.h b/src/declarative/debugger/qdeclarativedebugstatesdelegate_p.h index 9c4d0949cc..2d2462678c 100644 --- a/src/declarative/debugger/qdeclarativedebugstatesdelegate_p.h +++ b/src/declarative/debugger/qdeclarativedebugstatesdelegate_p.h @@ -79,7 +79,7 @@ public: virtual void updateBinding(QDeclarativeContext *context, const QDeclarativeProperty &property, const QVariant &expression, bool isLiteralValue, - const QString &fileName, int line, + const QString &fileName, int line, int column, bool *inBaseState) = 0; virtual bool setBindingForInvalidProperty(QObject *object, const QString &propertyName, diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp index 60c02c4551..9adcd01ad9 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace.cpp +++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp @@ -66,7 +66,7 @@ QByteArray QDeclarativeDebugData::toByteArray() const if (messageType == (int)QDeclarativeDebugTrace::RangeData) ds << detailData; if (messageType == (int)QDeclarativeDebugTrace::RangeLocation) - ds << detailData << line; + ds << detailData << line << column; if (messageType == (int)QDeclarativeDebugTrace::Event && detailType == (int)QDeclarativeDebugTrace::AnimationFrame) ds << framerate << animationcount; @@ -128,14 +128,14 @@ void QDeclarativeDebugTrace::rangeData(RangeType t, const QUrl &data) traceInstance()->rangeDataImpl(t, data); } -void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QString &fileName, int line) +void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QString &fileName, int line, int column) { - traceInstance()->rangeLocationImpl(t, fileName, line); + traceInstance()->rangeLocationImpl(t, fileName, line, column); } -void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QUrl &fileName, int line) +void QDeclarativeDebugTrace::rangeLocation(RangeType t, const QUrl &fileName, int line, int column) { - traceInstance()->rangeLocationImpl(t, fileName, line); + traceInstance()->rangeLocationImpl(t, fileName, line, column); } void QDeclarativeDebugTrace::endRange(RangeType t) @@ -180,7 +180,7 @@ void QDeclarativeDebugTrace::addEventImpl(EventType event) if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, 0, 0}; + QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, -1, 0, 0}; processMessage(ed); } @@ -189,7 +189,7 @@ void QDeclarativeDebugTrace::startRangeImpl(RangeType range) if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, 0, 0}; + QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, -1, 0, 0}; processMessage(rd); } @@ -198,7 +198,7 @@ void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QString &rData if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, 0, 0}; + QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, -1, 0, 0}; processMessage(rd); } @@ -207,25 +207,25 @@ void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QUrl &rData) if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1, 0, 0}; + QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1, -1, 0, 0}; processMessage(rd); } -void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QString &fileName, int line) +void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QString &fileName, int line, int column) { if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, 0, 0}; + QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, column, 0, 0}; processMessage(rd); } -void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QUrl &fileName, int line) +void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QUrl &fileName, int line, int column) { if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line, 0, 0}; + QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line, column, 0, 0}; processMessage(rd); } @@ -234,7 +234,7 @@ void QDeclarativeDebugTrace::endRangeImpl(RangeType range) if (!QDeclarativeDebugService::isDebuggingEnabled() || !m_enabled) return; - QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, 0, 0}; + QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, -1, 0, 0}; processMessage(rd); } @@ -249,7 +249,7 @@ void QDeclarativeDebugTrace::animationFrameImpl(qint64 delta) if (animCount > 0 && delta > 0) { // trim fps to integer int fps = 1000 / delta; - QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, fps, animCount}; + QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, -1, fps, animCount}; processMessage(ed); } } diff --git a/src/declarative/debugger/qdeclarativedebugtrace_p.h b/src/declarative/debugger/qdeclarativedebugtrace_p.h index 8d15294d58..947b447af3 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace_p.h +++ b/src/declarative/debugger/qdeclarativedebugtrace_p.h @@ -71,6 +71,7 @@ struct Q_AUTOTEST_EXPORT QDeclarativeDebugData //### QString detailData; //used by RangeData and RangeLocation int line; //used by RangeLocation + int column; //used by RangeLocation int framerate; //used by animation events int animationcount; //used by animation events @@ -125,8 +126,8 @@ public: static void startRange(RangeType); static void rangeData(RangeType, const QString &); static void rangeData(RangeType, const QUrl &); - static void rangeLocation(RangeType, const QString &, int); - static void rangeLocation(RangeType, const QUrl &, int); + static void rangeLocation(RangeType, const QString &, int, int); + static void rangeLocation(RangeType, const QUrl &, int, int); static void endRange(RangeType); static void animationFrame(qint64); @@ -145,8 +146,8 @@ private: void startRangeImpl(RangeType); void rangeDataImpl(RangeType, const QString &); void rangeDataImpl(RangeType, const QUrl &); - void rangeLocationImpl(RangeType, const QString &, int); - void rangeLocationImpl(RangeType, const QUrl &, int); + void rangeLocationImpl(RangeType, const QString &, int, int); + void rangeLocationImpl(RangeType, const QUrl &, int, int); void endRangeImpl(RangeType); void animationFrameImpl(qint64); diff --git a/src/declarative/debugger/qdeclarativeenginedebugservice.cpp b/src/declarative/debugger/qdeclarativeenginedebugservice.cpp index fa23bc1024..2a66c8fcb6 100644 --- a/src/declarative/debugger/qdeclarativeenginedebugservice.cpp +++ b/src/declarative/debugger/qdeclarativeenginedebugservice.cpp @@ -540,7 +540,8 @@ void QDeclarativeEngineDebugService::setBinding(int objectId, const QVariant &expression, bool isLiteralValue, QString filename, - int line) + int line, + int column) { QObject *object = objectForId(objectId); QDeclarativeContext *context = qmlContext(object); @@ -552,7 +553,7 @@ void QDeclarativeEngineDebugService::setBinding(int objectId, bool inBaseState = true; if (m_statesDelegate) { m_statesDelegate->updateBinding(context, property, expression, isLiteralValue, - filename, line, &inBaseState); + filename, line, column, &inBaseState); } if (inBaseState) { @@ -561,11 +562,11 @@ void QDeclarativeEngineDebugService::setBinding(int objectId, } else if (hasValidSignal(object, propertyName)) { QDeclarativeExpression *declarativeExpression = new QDeclarativeExpression(context, object, expression.toString()); QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression); - declarativeExpression->setSourceLocation(filename, line); + declarativeExpression->setSourceLocation(filename, line, column); } else if (property.isProperty()) { QDeclarativeBinding *binding = new QDeclarativeBinding(expression.toString(), object, context); binding->setTarget(property); - binding->setSourceLocation(filename, line); + binding->setSourceLocation(filename, line, column); binding->setNotifyOnValueChanged(true); QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, binding); if (oldBinding) diff --git a/src/declarative/debugger/qdeclarativeenginedebugservice_p.h b/src/declarative/debugger/qdeclarativeenginedebugservice_p.h index 0c7f6644df..ebbe82b05b 100644 --- a/src/declarative/debugger/qdeclarativeenginedebugservice_p.h +++ b/src/declarative/debugger/qdeclarativeenginedebugservice_p.h @@ -117,7 +117,7 @@ private: QDeclarativeObjectData objectData(QObject *); QDeclarativeObjectProperty propertyData(QObject *, int); QVariant valueContents(const QVariant &defaultValue) const; - void setBinding(int objectId, const QString &propertyName, const QVariant &expression, bool isLiteralValue, QString filename = QString(), int line = -1); + void setBinding(int objectId, const QString &propertyName, const QVariant &expression, bool isLiteralValue, QString filename = QString(), int line = -1, int column = 0); void resetBinding(int objectId, const QString &propertyName); void setMethodBody(int objectId, const QString &method, const QString &body); diff --git a/src/declarative/qml/qdeclarativebinding.cpp b/src/declarative/qml/qdeclarativebinding.cpp index 552b5988bf..72d1ac0fb4 100644 --- a/src/declarative/qml/qdeclarativebinding.cpp +++ b/src/declarative/qml/qdeclarativebinding.cpp @@ -216,7 +216,7 @@ void QDeclarativeBindingPrivate::refresh() } QDeclarativeBindingPrivate::QDeclarativeBindingPrivate() -: updating(false), enabled(false), columnNumber(0) +: updating(false), enabled(false) { } @@ -268,13 +268,12 @@ QDeclarativeBinding::QDeclarativeBinding(const QString &str, bool isRewritten, Q QDeclarativeContextData *ctxt, const QString &url, int lineNumber, int columnNumber, QObject *parent) -: QDeclarativeExpression(ctxt, obj, str, isRewritten, url, lineNumber, *new QDeclarativeBindingPrivate) +: QDeclarativeExpression(ctxt, obj, str, isRewritten, url, lineNumber, columnNumber, *new QDeclarativeBindingPrivate) { Q_D(QDeclarativeBinding); setParent(parent); setNotifyOnValueChanged(true); - d->columnNumber = columnNumber; } /*! @@ -340,7 +339,7 @@ public: { QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding); QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Binding, bind->expression()); - QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, bind->sourceFile(), bind->lineNumber()); + QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, bind->sourceFile(), bind->lineNumber(), bind->columnNumber()); } ~QDeclarativeBindingProfiler() diff --git a/src/declarative/qml/qdeclarativeboundsignal.cpp b/src/declarative/qml/qdeclarativeboundsignal.cpp index 51691ca6bd..61ad495c1e 100644 --- a/src/declarative/qml/qdeclarativeboundsignal.cpp +++ b/src/declarative/qml/qdeclarativeboundsignal.cpp @@ -173,7 +173,7 @@ int QDeclarativeBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a) if (QDeclarativeDebugService::isDebuggingEnabled()) { QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::HandlingSignal); QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::HandlingSignal, QLatin1String(m_signal.signature()) % QLatin1String(": ") % m_expression->expression()); - QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::HandlingSignal, m_expression->sourceFile(), m_expression->lineNumber()); + QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::HandlingSignal, m_expression->sourceFile(), m_expression->lineNumber(), m_expression->columnNumber()); QV8DebugService::instance()->signalEmitted(QString::fromAscii(m_signal.signature())); } m_isEvaluating = true; diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 3a7a6013e6..25013c9870 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -1270,6 +1270,7 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeScript::Object *obj) // ss.bindingId = rewriteBinding(script, prop->name()); ss.bindingId = rewriteBinding(prop->values.first()->value, QString()); // XXX ss.line = prop->location.start.line; + ss.column = prop->location.start.column; output->addInstruction(ss); } @@ -1331,6 +1332,7 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeScript::Object *obj) store.value = output->indexForString(rewrite); store.context = v->signalExpressionContextStack; store.line = v->location.start.line; + store.column = v->location.start.column; output->addInstruction(store); } diff --git a/src/declarative/qml/qdeclarativecomponent.cpp b/src/declarative/qml/qdeclarativecomponent.cpp index 5e9938dc39..6faeabfdb7 100644 --- a/src/declarative/qml/qdeclarativecomponent.cpp +++ b/src/declarative/qml/qdeclarativecomponent.cpp @@ -768,7 +768,7 @@ QDeclarativeComponentPrivate::beginCreate(QDeclarativeContextData *context) QDeclarativeData *data = QDeclarativeData::get(rv); Q_ASSERT(data); QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Creating, - cc->url, data->lineNumber); + cc->url, data->lineNumber, data->columnNumber); } } diff --git a/src/declarative/qml/qdeclarativeengine.cpp b/src/declarative/qml/qdeclarativeengine.cpp index 1d613ccc26..563f012b94 100644 --- a/src/declarative/qml/qdeclarativeengine.cpp +++ b/src/declarative/qml/qdeclarativeengine.cpp @@ -964,7 +964,7 @@ Q_AUTOTEST_EXPORT void qmlExecuteDeferred(QObject *object) QString typeName = type ? type->qmlTypeName() : QString::fromUtf8(object->metaObject()->className()); QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Creating, typeName); if (data->outerContext) - QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Creating, data->outerContext->url, data->lineNumber); + QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Creating, data->outerContext->url, data->lineNumber, data->columnNumber); } QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(data->context->engine); diff --git a/src/declarative/qml/qdeclarativeexpression.cpp b/src/declarative/qml/qdeclarativeexpression.cpp index f375716de6..bbaca450d9 100644 --- a/src/declarative/qml/qdeclarativeexpression.cpp +++ b/src/declarative/qml/qdeclarativeexpression.cpp @@ -120,10 +120,11 @@ void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, v8::Hand void QDeclarativeExpressionPrivate::init(QDeclarativeContextData *ctxt, const QString &expr, bool isRewritten, QObject *me, const QString &srcUrl, - int lineNumber) + int lineNumber, int columnNumber) { url = srcUrl; line = lineNumber; + column = columnNumber; expression = expr; @@ -159,9 +160,9 @@ QDeclarativeExpressionPrivate::evalFunction(QDeclarativeContextData *ctxt, QObje } QDeclarativeExpression *QDeclarativeExpressionPrivate::create(QDeclarativeContextData *ctxt, QObject *object, const QString &expr, bool isRewritten, - const QString &url, int lineNumber) + const QString &url, int lineNumber, int columnNumber) { - return new QDeclarativeExpression(ctxt, object, expr, isRewritten, url, lineNumber, *new QDeclarativeExpressionPrivate); + return new QDeclarativeExpression(ctxt, object, expr, isRewritten, url, lineNumber, columnNumber, *new QDeclarativeExpressionPrivate); } /*! @@ -206,12 +207,12 @@ QDeclarativeExpression::QDeclarativeExpression() /*! \internal */ QDeclarativeExpression::QDeclarativeExpression(QDeclarativeContextData *ctxt, QObject *object, const QString &expr, bool isRewritten, - const QString &url, int lineNumber, + const QString &url, int lineNumber, int columnNumber, QDeclarativeExpressionPrivate &dd) : QObject(dd, 0) { Q_D(QDeclarativeExpression); - d->init(ctxt, expr, isRewritten, object, url, lineNumber); + d->init(ctxt, expr, isRewritten, object, url, lineNumber, columnNumber); } /*! @@ -250,7 +251,7 @@ QDeclarativeExpression::QDeclarativeExpression(const QDeclarativeScriptString &s if (cdata) d->init(ctxtdata, cdata->primitives.at(id), true, script.scopeObject(), - cdata->name, script.d.data()->lineNumber); + cdata->name, script.d.data()->lineNumber, script.d.data()->columnNumber); else defaultConstruction = true; @@ -694,15 +695,26 @@ int QDeclarativeExpression::lineNumber() const return d->line; } +/*! + Returns the source file column number for this expression. The source location + must have been previously set by calling setSourceLocation(). +*/ +int QDeclarativeExpression::columnNumber() const +{ + Q_D(const QDeclarativeExpression); + return d->column; +} + /*! Set the location of this expression to \a line of \a url. This information is used by the script engine. */ -void QDeclarativeExpression::setSourceLocation(const QString &url, int line) +void QDeclarativeExpression::setSourceLocation(const QString &url, int line, int column) { Q_D(QDeclarativeExpression); d->url = url; d->line = line; + d->column = column; } /*! diff --git a/src/declarative/qml/qdeclarativeexpression.h b/src/declarative/qml/qdeclarativeexpression.h index dca0692002..63beb56a89 100644 --- a/src/declarative/qml/qdeclarativeexpression.h +++ b/src/declarative/qml/qdeclarativeexpression.h @@ -80,7 +80,8 @@ public: QString sourceFile() const; int lineNumber() const; - void setSourceLocation(const QString &fileName, int line); + int columnNumber() const; + void setSourceLocation(const QString &fileName, int line, int column = 0); QObject *scopeObject() const; @@ -99,7 +100,7 @@ protected: QDeclarativeExpression(QDeclarativeContextData *, QObject *, void *, QDeclarativeExpressionPrivate &dd); QDeclarativeExpression(QDeclarativeContextData *, QObject *, const QString &, bool, - const QString &, int, QDeclarativeExpressionPrivate &dd); + const QString &, int, int, QDeclarativeExpressionPrivate &dd); private: QDeclarativeExpression(QDeclarativeContextData *, QObject *, const QString &); diff --git a/src/declarative/qml/qdeclarativeexpression_p.h b/src/declarative/qml/qdeclarativeexpression_p.h index 772f448174..3ba219c139 100644 --- a/src/declarative/qml/qdeclarativeexpression_p.h +++ b/src/declarative/qml/qdeclarativeexpression_p.h @@ -177,7 +177,7 @@ public: void init(QDeclarativeContextData *, const QString &, QObject *); void init(QDeclarativeContextData *, v8::Handle, QObject *); - void init(QDeclarativeContextData *, const QString &, bool, QObject *, const QString &, int); + void init(QDeclarativeContextData *, const QString &, bool, QObject *, const QString &, int, int); QVariant value(QObject *secondaryScope = 0, bool *isUndefined = 0); @@ -194,7 +194,7 @@ public: const QString &code, const QString &filename, int line, v8::Persistent *qmlscope = 0); static QDeclarativeExpression *create(QDeclarativeContextData *, QObject *, const QString &, bool, - const QString &, int); + const QString &, int, int); bool expressionFunctionValid:1; bool expressionFunctionRewritten:1; @@ -209,6 +209,7 @@ public: QString url; // This is a QString for a reason. QUrls are slooooooow... int line; + int column; QString name; //function name, hint for the debugger QDeclarativeRefCount *dataRef; diff --git a/src/declarative/qml/qdeclarativeinstruction_p.h b/src/declarative/qml/qdeclarativeinstruction_p.h index 08cf7c28b8..11f8029f94 100644 --- a/src/declarative/qml/qdeclarativeinstruction_p.h +++ b/src/declarative/qml/qdeclarativeinstruction_p.h @@ -326,6 +326,7 @@ union QDeclarativeInstruction int scope; int bindingId; ushort line; + ushort column; }; struct instr_storeScript { QML_INSTR_HEADER @@ -407,6 +408,7 @@ union QDeclarativeInstruction int value; short context; ushort line; + ushort column; }; struct instr_assignSignalObject { QML_INSTR_HEADER diff --git a/src/declarative/qml/qdeclarativescriptstring_p.h b/src/declarative/qml/qdeclarativescriptstring_p.h index 1c5bd29987..5a9d8be171 100644 --- a/src/declarative/qml/qdeclarativescriptstring_p.h +++ b/src/declarative/qml/qdeclarativescriptstring_p.h @@ -49,13 +49,14 @@ QT_BEGIN_NAMESPACE class QDeclarativeScriptStringPrivate : public QSharedData { public: - QDeclarativeScriptStringPrivate() : context(0), scope(0), bindingId(-1), lineNumber(-1) {} + QDeclarativeScriptStringPrivate() : context(0), scope(0), bindingId(-1), lineNumber(-1), columnNumber(-1) {} QDeclarativeContext *context; QObject *scope; QString script; int bindingId; int lineNumber; + int columnNumber; }; QT_END_NAMESPACE diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp index 5067bcf95e..ea0c27f81b 100644 --- a/src/declarative/qml/qdeclarativevme.cpp +++ b/src/declarative/qml/qdeclarativevme.cpp @@ -711,7 +711,7 @@ QObject *QDeclarativeVME::run(QList *errors, QDeclarativeBoundSignal *bs = new QDeclarativeBoundSignal(target, signal, target); QDeclarativeExpression *expr = - new QDeclarativeExpression(CTXT, context, PRIMITIVES.at(instr.value), true, COMP->name, instr.line, *new QDeclarativeExpressionPrivate); + new QDeclarativeExpression(CTXT, context, PRIMITIVES.at(instr.value), true, COMP->name, instr.line, instr.column, *new QDeclarativeExpressionPrivate); bs->setExpression(expr); QML_END_INSTR(StoreSignal) @@ -728,6 +728,7 @@ QObject *QDeclarativeVME::run(QList *errors, ss.setScript(PRIMITIVES.at(instr.value)); ss.d.data()->bindingId = instr.bindingId; ss.d.data()->lineNumber = instr.line; + ss.d.data()->columnNumber = instr.column; void *a[] = { &ss, 0, &status, &flags }; QMetaObject::metacall(target, QMetaObject::WriteProperty, diff --git a/src/declarative/qml/v4/qv4bindings.cpp b/src/declarative/qml/v4/qv4bindings.cpp index 4e0c1821a5..5255db0163 100644 --- a/src/declarative/qml/v4/qv4bindings.cpp +++ b/src/declarative/qml/v4/qv4bindings.cpp @@ -245,7 +245,7 @@ void QV4Bindings::Binding::update(QDeclarativePropertyPrivate::WriteFlags flags) QDeclarativeDebugTrace::startRange(QDeclarativeDebugTrace::Binding); if (parent->context()) QDeclarativeDebugTrace::rangeLocation(QDeclarativeDebugTrace::Binding, - parent->context()->url, line); + parent->context()->url, line, column); parent->run(this, flags); QDeclarativeDebugTrace::endRange(QDeclarativeDebugTrace::Binding); } diff --git a/src/declarative/qml/v8/qv8qobjectwrapper.cpp b/src/declarative/qml/v8/qv8qobjectwrapper.cpp index 2663344534..2a6b57362e 100644 --- a/src/declarative/qml/v8/qv8qobjectwrapper.cpp +++ b/src/declarative/qml/v8/qv8qobjectwrapper.cpp @@ -589,10 +589,11 @@ static inline void StoreProperty(QV8Engine *engine, QObject *object, QDeclarativ v8::StackTrace::kScriptName)); v8::Local frame = trace->GetFrame(0); int lineNumber = frame->GetLineNumber(); + int columNumber = frame->GetColumn(); QString url = engine->toString(frame->GetScriptName()); newBinding = new QDeclarativeBinding(&function, object, context); - newBinding->setSourceLocation(url, lineNumber); + newBinding->setSourceLocation(url, lineNumber, columNumber); newBinding->setTarget(object, *property, context); newBinding->setEvaluateFlags(newBinding->evaluateFlags() | QDeclarativeBinding::RequiresThisObject); diff --git a/src/declarative/qml/v8/qv8valuetypewrapper.cpp b/src/declarative/qml/v8/qv8valuetypewrapper.cpp index b712ac5028..c9c302c924 100644 --- a/src/declarative/qml/v8/qv8valuetypewrapper.cpp +++ b/src/declarative/qml/v8/qv8valuetypewrapper.cpp @@ -342,10 +342,11 @@ v8::Handle QV8ValueTypeWrapper::Setter(v8::Local property v8::StackTrace::kScriptName)); v8::Local frame = trace->GetFrame(0); int lineNumber = frame->GetLineNumber(); + int columnNumber = frame->GetColumn(); QString url = r->engine->toString(frame->GetScriptName()); newBinding = new QDeclarativeBinding(&function, reference->object, context); - newBinding->setSourceLocation(url, lineNumber); + newBinding->setSourceLocation(url, lineNumber, columnNumber); newBinding->setTarget(reference->object, cacheData, context); newBinding->setEvaluateFlags(newBinding->evaluateFlags() | QDeclarativeBinding::RequiresThisObject); diff --git a/src/qtquick1/util/qdeclarativeanimation.cpp b/src/qtquick1/util/qdeclarativeanimation.cpp index 88b318c33b..76702fbdc9 100644 --- a/src/qtquick1/util/qdeclarativeanimation.cpp +++ b/src/qtquick1/util/qdeclarativeanimation.cpp @@ -830,7 +830,7 @@ void QDeclarative1ScriptActionPrivate::execute() QDeclarativeExpression expr(scriptStr.context(), scriptStr.scopeObject(), str); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expr.setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expr.setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); expr.evaluate(); if (expr.hasError()) qmlInfo(q) << expr.error(); diff --git a/src/qtquick1/util/qdeclarativeconnections.cpp b/src/qtquick1/util/qdeclarativeconnections.cpp index 5aa6a6f3d4..e7bcd9c449 100644 --- a/src/qtquick1/util/qdeclarativeconnections.cpp +++ b/src/qtquick1/util/qdeclarativeconnections.cpp @@ -266,7 +266,7 @@ void QDeclarative1Connections::connectSignals() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(this), 0, script); QDeclarativeData *ddata = QDeclarativeData::get(this); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); signal->setExpression(expression); d->boundsignals += signal; } else { diff --git a/src/qtquick1/util/qdeclarativepropertychanges.cpp b/src/qtquick1/util/qdeclarativepropertychanges.cpp index d728c25c57..61f0aac14e 100644 --- a/src/qtquick1/util/qdeclarativepropertychanges.cpp +++ b/src/qtquick1/util/qdeclarativepropertychanges.cpp @@ -340,7 +340,7 @@ void QDeclarative1PropertyChangesPrivate::decode() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(q), object, data.toString()); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); QDeclarative1ReplaceSignalHandler *handler = new QDeclarative1ReplaceSignalHandler; handler->property = prop; handler->expression = expression; @@ -349,7 +349,7 @@ void QDeclarative1PropertyChangesPrivate::decode() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(q), object, data.toString()); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); expressions << ExpressionChange(name, id, expression); } else { properties << qMakePair(name, data); @@ -483,7 +483,7 @@ QDeclarative1PropertyChanges::ActionList QDeclarative1PropertyChanges::actions() QDeclarativeBinding *newBinding = id != QDeclarativeBinding::Invalid ? QDeclarativeBinding::createBinding(id, object(), qmlContext(this), e->sourceFile(), e->lineNumber()) : 0; if (!newBinding) { newBinding = new QDeclarativeBinding(e->expression(), object(), qmlContext(this)); - newBinding->setSourceLocation(e->sourceFile(), e->lineNumber()); + newBinding->setSourceLocation(e->sourceFile(), e->lineNumber(), e->columnNumber()); } newBinding->setTarget(prop); a.toBinding = newBinding; diff --git a/src/qtquick1/util/qdeclarativestateoperations.cpp b/src/qtquick1/util/qdeclarativestateoperations.cpp index e4edad6828..92110960ff 100644 --- a/src/qtquick1/util/qdeclarativestateoperations.cpp +++ b/src/qtquick1/util/qdeclarativestateoperations.cpp @@ -667,7 +667,7 @@ void QDeclarative1StateChangeScript::execute(Reason) QDeclarativeExpression expr(d->script.context(), d->script.scopeObject(), script); QDeclarativeData *ddata = QDeclarativeData::get(this); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expr.setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expr.setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); expr.evaluate(); if (expr.hasError()) qmlInfo(this, expr.error()); diff --git a/src/quick/qtquick2.cpp b/src/quick/qtquick2.cpp index 8614589557..232a621ce3 100644 --- a/src/quick/qtquick2.cpp +++ b/src/quick/qtquick2.cpp @@ -67,7 +67,7 @@ public: virtual void updateBinding(QDeclarativeContext *context, const QDeclarativeProperty &property, const QVariant &expression, bool isLiteralValue, - const QString &fileName, int line, + const QString &fileName, int line, int column, bool *isBaseState); virtual bool setBindingForInvalidProperty(QObject *object, const QString &propertyName, @@ -122,7 +122,7 @@ void QDeclarativeQtQuick2DebugStatesDelegate::buildStatesList(QObject *obj) void QDeclarativeQtQuick2DebugStatesDelegate::updateBinding(QDeclarativeContext *context, const QDeclarativeProperty &property, const QVariant &expression, bool isLiteralValue, - const QString &fileName, int line, + const QString &fileName, int line, int column, bool *inBaseState) { QObject *object = property.object(); @@ -138,7 +138,7 @@ void QDeclarativeQtQuick2DebugStatesDelegate::updateBinding(QDeclarativeContext newBinding = new QDeclarativeBinding(expression.toString(), object, context); newBinding->setTarget(property); newBinding->setNotifyOnValueChanged(true); - newBinding->setSourceLocation(fileName, line); + newBinding->setSourceLocation(fileName, line, column); } state->changeBindingInRevertList(object, propertyName, newBinding); diff --git a/src/quick/util/qdeclarativeconnections.cpp b/src/quick/util/qdeclarativeconnections.cpp index 92bb1ffa0f..7b977c8f5c 100644 --- a/src/quick/util/qdeclarativeconnections.cpp +++ b/src/quick/util/qdeclarativeconnections.cpp @@ -204,6 +204,7 @@ QDeclarativeConnectionsParser::compile(const QList> script; int line; ds >> line; + int column; + ds >> column; + QDeclarativeProperty prop(target(), propName); if (prop.isValid() && (prop.type() & QDeclarativeProperty::SignalProperty)) { QDeclarativeBoundSignal *signal = @@ -276,7 +281,7 @@ void QDeclarativeConnections::connectSignals() } QDeclarativeExpression *expression = ctxtdata ? - QDeclarativeExpressionPrivate::create(ctxtdata, 0, script, true, location, line) : 0; + QDeclarativeExpressionPrivate::create(ctxtdata, 0, script, true, location, line, column) : 0; signal->setExpression(expression); d->boundsignals += signal; } else { diff --git a/src/quick/util/qdeclarativepropertychanges.cpp b/src/quick/util/qdeclarativepropertychanges.cpp index a475c5f879..9404b24560 100644 --- a/src/quick/util/qdeclarativepropertychanges.cpp +++ b/src/quick/util/qdeclarativepropertychanges.cpp @@ -337,7 +337,7 @@ void QDeclarativePropertyChangesPrivate::decode() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(q), object, data.toString()); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); QDeclarativeReplaceSignalHandler *handler = new QDeclarativeReplaceSignalHandler; handler->property = prop; handler->expression = expression; @@ -346,7 +346,7 @@ void QDeclarativePropertyChangesPrivate::decode() QDeclarativeExpression *expression = new QDeclarativeExpression(qmlContext(q), object, data.toString()); QDeclarativeData *ddata = QDeclarativeData::get(q); if (ddata && ddata->outerContext && !ddata->outerContext->url.isEmpty()) - expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber); + expression->setSourceLocation(ddata->outerContext->url.toString(), ddata->lineNumber, ddata->columnNumber); expressions << ExpressionChange(name, id, expression); } else { properties << qMakePair(name, data); @@ -480,7 +480,7 @@ QDeclarativePropertyChanges::ActionList QDeclarativePropertyChanges::actions() QDeclarativeBinding *newBinding = id != QDeclarativeBinding::Invalid ? QDeclarativeBinding::createBinding(id, object(), qmlContext(this), e->sourceFile(), e->lineNumber()) : 0; if (!newBinding) { newBinding = new QDeclarativeBinding(e->expression(), object(), qmlContext(this)); - newBinding->setSourceLocation(e->sourceFile(), e->lineNumber()); + newBinding->setSourceLocation(e->sourceFile(), e->lineNumber(), e->columnNumber()); } newBinding->setTarget(prop); a.toBinding = newBinding; -- cgit v1.2.3