aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmljavascriptexpression.cpp
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2012-05-30 10:24:14 +1000
committerQt by Nokia <qt-info@nokia.com>2012-06-05 04:35:50 +0200
commitc734706c69ed5b38cc97aea5be3f0553c194aa0a (patch)
treeec95a87fd3e3d9ad5d9b35c79b4beee291b99088 /src/qml/qml/qqmljavascriptexpression.cpp
parent751c1ca09305a15acc37cb28cb4687e1bb32e1d2 (diff)
Delay conversion of v8 exceptions to QQmlErrors.
This conversion in relatively expensive, and not required for transient exceptions that occur during startup due to the order of binding evaluation. Change-Id: I29a16c075890c8966c0bad0a77412ad232c791bb Reviewed-by: Matthew Vogt <matthew.vogt@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmljavascriptexpression.cpp')
-rw-r--r--src/qml/qml/qqmljavascriptexpression.cpp48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/qml/qml/qqmljavascriptexpression.cpp b/src/qml/qml/qqmljavascriptexpression.cpp
index d0218822d4..9b617564da 100644
--- a/src/qml/qml/qqmljavascriptexpression.cpp
+++ b/src/qml/qml/qqmljavascriptexpression.cpp
@@ -61,6 +61,42 @@ bool QQmlDelayedError::addError(QQmlEnginePrivate *e)
return true;
}
+void QQmlDelayedError::setMessage(v8::Handle<v8::Message> message)
+{
+ qPersistentDispose(m_message);
+ m_message = qPersistentNew<v8::Message>(message);
+}
+
+void QQmlDelayedError::setErrorLocation(const QUrl &url, int line, int column)
+{
+ m_error.setUrl(url);
+ m_error.setLine(line);
+ m_error.setColumn(column);
+}
+
+void QQmlDelayedError::setErrorDescription(const QString &description)
+{
+ m_error.setDescription(description);
+}
+
+/*
+ Converting from a message to an error is relatively expensive.
+
+ We don't want to do this work for transient exceptions (exceptions
+ that occur during startup because of the order of binding
+ execution, but have gone away by the time startup has finished), so we
+ delay conversion until it is required for displaying the error.
+*/
+void QQmlDelayedError::convertMessageToError(QQmlEngine *engine) const
+{
+ if (!m_message.IsEmpty() && engine) {
+ v8::HandleScope handle_scope;
+ v8::Context::Scope context_scope(QQmlEnginePrivate::getV8Engine(engine)->context());
+ QQmlExpressionPrivate::exceptionToError(m_message, m_error);
+ qPersistentDispose(m_message);
+ }
+}
+
QQmlJavaScriptExpression::QQmlJavaScriptExpression(VTable *v)
: m_vtable(v)
{
@@ -142,12 +178,12 @@ QQmlJavaScriptExpression::evaluate(QQmlContextData *context,
v8::Context::Scope scope(ep->v8engine()->context());
v8::Local<v8::Message> message = try_catch.Message();
if (!message.IsEmpty()) {
- QQmlExpressionPrivate::exceptionToError(message, delayedError()->error);
+ delayedError()->setMessage(message);
} else {
- if (hasDelayedError()) delayedError()->error = QQmlError();
+ if (hasDelayedError()) delayedError()->clearError();
}
} else {
- if (hasDelayedError()) delayedError()->error = QQmlError();
+ if (hasDelayedError()) delayedError()->clearError();
}
}
@@ -237,14 +273,14 @@ void QQmlJavaScriptExpression::GuardCapture::captureProperty(QObject *o, int c,
void QQmlJavaScriptExpression::clearError()
{
if (m_vtable.hasValue()) {
- m_vtable.value().error = QQmlError();
+ m_vtable.value().clearError();
m_vtable.value().removeError();
}
}
-QQmlError QQmlJavaScriptExpression::error() const
+QQmlError QQmlJavaScriptExpression::error(QQmlEngine *engine) const
{
- if (m_vtable.hasValue()) return m_vtable.constValue()->error;
+ if (m_vtable.hasValue()) return m_vtable.constValue()->error(engine);
else return QQmlError();
}