Delay conversion of v8 exceptions to QQmlErrors.
[profile/ivi/qtdeclarative.git] / src / qml / qml / qqmlexpression.cpp
index 940b3c8..8c24c4a 100644 (file)
@@ -176,7 +176,7 @@ QQmlExpression::QQmlExpression()
 }
 
 /*!  \internal */
-QQmlExpression::QQmlExpression(QQmlContextData *ctxt, 
+QQmlExpression::QQmlExpression(QQmlContextData *ctxt,
                                                QObject *object, const QString &expr, bool isRewritten,
                                                const QString &url, int lineNumber, int columnNumber,
                                                QQmlExpressionPrivate &dd)
@@ -201,7 +201,7 @@ QQmlExpression::QQmlExpression(QQmlContextData *ctxt,
 /*!
     Create a QQmlExpression object that is a child of \a parent.
 
-    The \script provides the expression to be evaluated, the context to evaluate it in,
+    The \script provides the expression to be evaluated, the context to evaluate it in,
     and the scope object to evaluate it with.
 
     This constructor is functionally equivalent to the following, but in most cases
@@ -216,32 +216,28 @@ QQmlExpression::QQmlExpression(const QQmlScriptString &script, QObject *parent)
 : QObject(*new QQmlExpressionPrivate, parent)
 {
     Q_D(QQmlExpression);
-    bool defaultConstruction = false;
+
+    if (!script.context()->isValid())
+        return;
+
+    bool defaultConstruction = true;
 
     int id = script.d.data()->bindingId;
-    if (id < 0) {
-        defaultConstruction = true;
-    } else {
+    if (id >= 0) {
         QQmlContextData *ctxtdata = QQmlContextData::get(script.context());
-
         QQmlEnginePrivate *engine = QQmlEnginePrivate::get(script.context()->engine());
-        QQmlCompiledData *cdata = 0;
-        QQmlTypeData *typeData = 0;
         if (engine && ctxtdata && !ctxtdata->url.isEmpty()) {
-            typeData = engine->typeLoader.get(ctxtdata->url);
-            cdata = typeData->compiledData();
-        }
+            QQmlTypeData *typeData = engine->typeLoader.getType(ctxtdata->url);
+            Q_ASSERT(typeData);
 
-        if (cdata)
-            d->init(ctxtdata, cdata->primitives.at(id), true, script.scopeObject(),
-                    cdata->name, script.d.data()->lineNumber, script.d.data()->columnNumber);
-        else
-           defaultConstruction = true;
+            if (QQmlCompiledData *cdata = typeData->compiledData()) {
+                defaultConstruction = false;
+                d->init(ctxtdata, cdata->primitives.at(id), true, script.scopeObject(),
+                        cdata->name, script.d.data()->lineNumber, script.d.data()->columnNumber);
+            }
 
-        if (cdata)
-            cdata->release();
-        if (typeData)
             typeData->release();
+        }
     }
 
     if (defaultConstruction)
@@ -265,7 +261,7 @@ QQmlExpression::QQmlExpression(QQmlContext *ctxt,
     d->init(QQmlContextData::get(ctxt), expression, scope);
 }
 
-/*! 
+/*!
     \internal
 */
 QQmlExpression::QQmlExpression(QQmlContextData *ctxt, QObject *scope,
@@ -448,7 +444,7 @@ QString QQmlExpression::sourceFile() const
 }
 
 /*!
-    Returns the source file line number for this expression.  The source location 
+    Returns the source file line number for this expression.  The source location
     must have been previously set by calling setSourceLocation().
 */
 int QQmlExpression::lineNumber() const
@@ -494,7 +490,7 @@ QObject *QQmlExpression::scopeObject() const
 /*!
     Returns true if the last call to evaluate() resulted in an error,
     otherwise false.
-    
+
     \sa error(), clearError()
 */
 bool QQmlExpression::hasError() const
@@ -525,7 +521,7 @@ void QQmlExpression::clearError()
 QQmlError QQmlExpression::error() const
 {
     Q_D(const QQmlExpression);
-    return d->error();
+    return d->error(engine());
 }
 
 /*!
@@ -551,7 +547,7 @@ void QQmlExpressionPrivate::expressionChanged()
 QString QQmlExpressionPrivate::expressionIdentifier(QQmlJavaScriptExpression *e)
 {
     QQmlExpressionPrivate *This = static_cast<QQmlExpressionPrivate *>(e);
-    return QLatin1String("\"") + This->expression + QLatin1String("\"");
+    return QLatin1Char('"') + This->expression + QLatin1Char('"');
 }
 
 QT_END_NAMESPACE