summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-10-28 03:59:33 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-10-28 03:59:33 (GMT)
commiteaab2a271f0d73d5a413902169efe32741208c42 (patch)
treeda00990537be1d2546bbb84d3aac986eccf3dd30 /src/declarative/qml
parent5f9091771eaa26db5ad35e4788c13ac011512b61 (diff)
downloadQt-eaab2a271f0d73d5a413902169efe32741208c42.zip
Qt-eaab2a271f0d73d5a413902169efe32741208c42.tar.gz
Qt-eaab2a271f0d73d5a413902169efe32741208c42.tar.bz2
Add a QmlExpression::error() method
QmlExpression should not print errors itself. This is the responsibility of the caller.
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qmlbinding.cpp8
-rw-r--r--src/declarative/qml/qmlboundsignal.cpp5
-rw-r--r--src/declarative/qml/qmlcontext.cpp7
-rw-r--r--src/declarative/qml/qmlerror.cpp42
-rw-r--r--src/declarative/qml/qmlerror.h2
-rw-r--r--src/declarative/qml/qmlexpression.cpp55
-rw-r--r--src/declarative/qml/qmlexpression.h5
-rw-r--r--src/declarative/qml/qmlexpression_p.h4
8 files changed, 107 insertions, 21 deletions
diff --git a/src/declarative/qml/qmlbinding.cpp b/src/declarative/qml/qmlbinding.cpp
index 65ff789..ab4343c 100644
--- a/src/declarative/qml/qmlbinding.cpp
+++ b/src/declarative/qml/qmlbinding.cpp
@@ -128,10 +128,12 @@ void QmlBinding::update(QmlMetaProperty::WriteFlags flags)
idx, a);
} else {
- bool undefined = false;
- QVariant value = this->value(&undefined);
+ bool isUndefined = false;
+ QVariant value = this->value(&isUndefined);
- if (!undefined && data->property.object() && !data->property.write(value, flags)) {
+ if (this->hasError()) {
+ qWarning().nospace() << qPrintable(this->error().toString());
+ } else if (!isUndefined && data->property.object() && !data->property.write(value, flags)) {
QString fileName = data->fileName;
int line = data->line;
if (fileName.isEmpty()) fileName = QLatin1String("<Unknown File>");
diff --git a/src/declarative/qml/qmlboundsignal.cpp b/src/declarative/qml/qmlboundsignal.cpp
index ce591e8..d715309 100644
--- a/src/declarative/qml/qmlboundsignal.cpp
+++ b/src/declarative/qml/qmlboundsignal.cpp
@@ -175,8 +175,11 @@ int QmlBoundSignal::qt_metacall(QMetaObject::Call c, int id, void **a)
{
if (c == QMetaObject::InvokeMetaMethod && id == evaluateIdx) {
if (m_params) m_params->setValues(a);
- if (m_expression)
+ if (m_expression) {
QmlExpressionPrivate::get(m_expression)->value(m_params);
+ if (m_expression->hasError())
+ qWarning().nospace() << qPrintable(m_expression->error().toString());
+ }
if (m_params) m_params->clearValues();
return -1;
} else {
diff --git a/src/declarative/qml/qmlcontext.cpp b/src/declarative/qml/qmlcontext.cpp
index 2ebdf10..5032ff4 100644
--- a/src/declarative/qml/qmlcontext.cpp
+++ b/src/declarative/qml/qmlcontext.cpp
@@ -77,8 +77,11 @@ void QmlContextPrivate::addScript(const QString &script, QObject *scopeObject,
QScriptValue val = scriptEngine->evaluate(script, fileName, lineNumber);
- if (scriptEngine->hasUncaughtException())
- QmlExpressionPrivate::printException(scriptEngine);
+ if (scriptEngine->hasUncaughtException()) {
+ QmlError error;
+ QmlExpressionPrivate::exceptionToError(scriptEngine, error);
+ qWarning().nospace() << qPrintable(error.toString());
+ }
scriptEngine->popContext();
diff --git a/src/declarative/qml/qmlerror.cpp b/src/declarative/qml/qmlerror.cpp
index 514fe44..f4c9580 100644
--- a/src/declarative/qml/qmlerror.cpp
+++ b/src/declarative/qml/qmlerror.cpp
@@ -70,7 +70,7 @@ QmlErrorPrivate::QmlErrorPrivate()
Create an empty error object.
*/
QmlError::QmlError()
-: d(new QmlErrorPrivate)
+: d(0)
{
}
@@ -78,7 +78,7 @@ QmlError::QmlError()
Create a copy of \a other.
*/
QmlError::QmlError(const QmlError &other)
-: d(new QmlErrorPrivate)
+: d(0)
{
*this = other;
}
@@ -88,10 +88,16 @@ QmlError::QmlError(const QmlError &other)
*/
QmlError &QmlError::operator=(const QmlError &other)
{
- d->url = other.d->url;
- d->description = other.d->description;
- d->line = other.d->line;
- d->column = other.d->column;
+ if (!other.d) {
+ delete d;
+ d = 0;
+ } else {
+ if (!d) d = new QmlErrorPrivate;
+ d->url = other.d->url;
+ d->description = other.d->description;
+ d->line = other.d->line;
+ d->column = other.d->column;
+ }
return *this;
}
@@ -104,11 +110,20 @@ QmlError::~QmlError()
}
/*!
+ Return true if this error is valid, otherwise false.
+*/
+bool QmlError::isValid() const
+{
+ return d != 0;
+}
+
+/*!
Return the url for the file that caused this error.
*/
QUrl QmlError::url() const
{
- return d->url;
+ if (d) return d->url;
+ else return QUrl();
}
/*!
@@ -116,6 +131,7 @@ QUrl QmlError::url() const
*/
void QmlError::setUrl(const QUrl &url)
{
+ if (!d) d = new QmlErrorPrivate;
d->url = url;
}
@@ -124,7 +140,8 @@ void QmlError::setUrl(const QUrl &url)
*/
QString QmlError::description() const
{
- return d->description;
+ if (d) return d->description;
+ else return QString();
}
/*!
@@ -132,6 +149,7 @@ QString QmlError::description() const
*/
void QmlError::setDescription(const QString &description)
{
+ if (!d) d = new QmlErrorPrivate;
d->description = description;
}
@@ -140,7 +158,8 @@ void QmlError::setDescription(const QString &description)
*/
int QmlError::line() const
{
- return d->line;
+ if (d) return d->line;
+ else return -1;
}
/*!
@@ -148,6 +167,7 @@ int QmlError::line() const
*/
void QmlError::setLine(int line)
{
+ if (!d) d = new QmlErrorPrivate;
d->line = line;
}
@@ -156,7 +176,8 @@ void QmlError::setLine(int line)
*/
int QmlError::column() const
{
- return d->column;
+ if (d) return d->column;
+ else return -1;
}
/*!
@@ -164,6 +185,7 @@ int QmlError::column() const
*/
void QmlError::setColumn(int column)
{
+ if (!d) d = new QmlErrorPrivate;
d->column = column;
}
diff --git a/src/declarative/qml/qmlerror.h b/src/declarative/qml/qmlerror.h
index c1a8720..ee3d7b4 100644
--- a/src/declarative/qml/qmlerror.h
+++ b/src/declarative/qml/qmlerror.h
@@ -61,6 +61,8 @@ public:
QmlError &operator=(const QmlError &);
~QmlError();
+ bool isValid() const;
+
QUrl url() const;
void setUrl(const QUrl &);
QString description() const;
diff --git a/src/declarative/qml/qmlexpression.cpp b/src/declarative/qml/qmlexpression.cpp
index c62756b..8231bf8 100644
--- a/src/declarative/qml/qmlexpression.cpp
+++ b/src/declarative/qml/qmlexpression.cpp
@@ -260,7 +260,8 @@ QVariant QmlExpressionPrivate::evalSSE()
return rv;
}
-void QmlExpressionPrivate::printException(QScriptEngine *scriptEngine)
+void QmlExpressionPrivate::exceptionToError(QScriptEngine *scriptEngine,
+ QmlError &error)
{
if (scriptEngine->hasUncaughtException() &&
scriptEngine->uncaughtException().isError()) {
@@ -277,8 +278,12 @@ void QmlExpressionPrivate::printException(QScriptEngine *scriptEngine)
fileName = QLatin1String("<Unknown File>");
}
- qWarning().nospace() << qPrintable(fileName) << ":" << lineNumber << ": "
- << qPrintable(exception.toString());
+ error.setUrl(QUrl(fileName));
+ error.setLine(lineNumber);
+ error.setColumn(-1);
+ error.setDescription(exception.toString());
+ } else {
+ error = QmlError();
}
}
@@ -321,10 +326,13 @@ QVariant QmlExpressionPrivate::evalQtScript(QObject *secondaryScope, bool *isUnd
if (isUndefined)
*isUndefined = svalue.isUndefined() || scriptEngine->hasUncaughtException();
+ // Handle exception
if (scriptEngine->hasUncaughtException()) {
- printException(scriptEngine);
+ exceptionToError(scriptEngine, data->error);
scriptEngine->clearExceptions();
return QVariant();
+ } else {
+ data->error = QmlError();
}
if (secondaryScope) {
@@ -418,6 +426,8 @@ QVariant QmlExpressionPrivate::value(QObject *secondaryScope, bool *isUndefined)
\a isUndefined is set to true if the expression resulted in an
undefined value.
+
+ \sa hasError(), error()
*/
QVariant QmlExpression::value(bool *isUndefined)
{
@@ -509,6 +519,43 @@ QObject *QmlExpression::scopeObject() const
return d->data->me;
}
+/*!
+ Returns true if the last call to value() resulted in an error,
+ otherwise false.
+
+ \sa error(), clearError()
+*/
+bool QmlExpression::hasError() const
+{
+ Q_D(const QmlExpression);
+ return d->data->error.isValid();
+}
+
+/*!
+ Clear any expression errors. Calls to hasError() following this will
+ return false.
+
+ \sa hasError(), error()
+*/
+void QmlExpression::clearError()
+{
+ Q_D(QmlExpression);
+ d->data->error = QmlError();
+}
+
+/*!
+ Return any error from the last call to value(). If there was no error,
+ this returns an invalid QmlError instance.
+
+ \sa hasError(), clearError()
+*/
+
+QmlError QmlExpression::error() const
+{
+ Q_D(const QmlExpression);
+ return d->data->error;
+}
+
/*! \internal */
void QmlExpression::__q_notify()
{
diff --git a/src/declarative/qml/qmlexpression.h b/src/declarative/qml/qmlexpression.h
index 96694d6..127d3f3 100644
--- a/src/declarative/qml/qmlexpression.h
+++ b/src/declarative/qml/qmlexpression.h
@@ -44,6 +44,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qvariant.h>
+#include <QtDeclarative/qmlerror.h>
QT_BEGIN_HEADER
@@ -82,6 +83,10 @@ public:
QObject *scopeObject() const;
+ bool hasError() const;
+ void clearError();
+ QmlError error() const;
+
public Q_SLOTS:
QVariant value(bool *isUndefined = 0);
diff --git a/src/declarative/qml/qmlexpression_p.h b/src/declarative/qml/qmlexpression_p.h
index 3ec8d1c..b453a96 100644
--- a/src/declarative/qml/qmlexpression_p.h
+++ b/src/declarative/qml/qmlexpression_p.h
@@ -92,6 +92,8 @@ public:
bool expressionRewritten:1;
QScriptValue expressionFunction;
+ QmlError error;
+
QmlBasicScript sse;
QObject *me;
bool trackChange;
@@ -151,7 +153,7 @@ public:
return static_cast<QmlExpressionPrivate *>(QObjectPrivate::get(expr));
}
- static void printException(QScriptEngine *);
+ static void exceptionToError(QScriptEngine *, QmlError &);
};
QT_END_NAMESPACE