diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2012-05-30 10:24:14 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-05 04:35:50 +0200 |
commit | c734706c69ed5b38cc97aea5be3f0553c194aa0a (patch) | |
tree | ec95a87fd3e3d9ad5d9b35c79b4beee291b99088 /src/qml/qml/qqmljavascriptexpression.cpp | |
parent | 751c1ca09305a15acc37cb28cb4687e1bb32e1d2 (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.cpp | 48 |
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(); } |