Use the AST for binding rewriting when possible.
authorMichael Brasser <michael.brasser@nokia.com>
Mon, 21 Nov 2011 05:51:54 +0000 (15:51 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 23 Nov 2011 21:31:45 +0000 (22:31 +0100)
Change-Id: I1ac8bd39ea7e02f7c236c030ca233e1060746431
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>

src/declarative/qml/qdeclarativecompiler.cpp
src/declarative/qml/qdeclarativecompiler_p.h
src/declarative/qml/qdeclarativecustomparser.cpp
src/declarative/qml/qdeclarativecustomparser_p.h
src/declarative/util/qdeclarativepropertychanges.cpp
src/qtquick1/util/qdeclarativepropertychanges.cpp

index e7d9b80..a2eae79 100644 (file)
@@ -1170,7 +1170,7 @@ void QDeclarativeCompiler::genObjectBody(QDeclarativeScript::Object *obj)
         ss.value = output->indexForString(script);
         ss.scope = prop->scriptStringScope;
 //        ss.bindingId = rewriteBinding(script, prop->name());
-        ss.bindingId = rewriteBinding(script, QString()); // XXX
+        ss.bindingId = rewriteBinding(prop->values.first()->value, QString()); // XXX
         ss.line = prop->location.start.line;
         output->addInstruction(ss);
     }
@@ -2484,12 +2484,12 @@ const QMetaObject *QDeclarativeCompiler::resolveType(const QString& name) const
 
 // similar to logic of completeComponentBuild, but also sticks data
 // into primitives at the end
-int QDeclarativeCompiler::rewriteBinding(const QString& expression, const QString& name)
+int QDeclarativeCompiler::rewriteBinding(const QDeclarativeScript::Variant& value, const QString& name)
 {
     QDeclarativeRewrite::RewriteBinding rewriteBinding;
     rewriteBinding.setName(QLatin1Char('$') + name.mid(name.lastIndexOf(QLatin1Char('.')) + 1));
 
-    QString rewrite = rewriteBinding(expression, 0, 0);
+    QString rewrite = rewriteBinding(value.asAST(), value.asScript(), 0);
 
     return output->indexForString(rewrite);
 }
index f6229bc..1ee5afb 100644 (file)
@@ -279,7 +279,7 @@ public:
 
     int evaluateEnum(const QByteArray& script) const; // for QDeclarativeCustomParser::evaluateEnum
     const QMetaObject *resolveType(const QString& name) const; // for QDeclarativeCustomParser::resolveType
-    int rewriteBinding(const QString& expression, const QString& name); // for QDeclarativeCustomParser::rewriteBinding
+    int rewriteBinding(const QDeclarativeScript::Variant& value, const QString& name); // for QDeclarativeCustomParser::rewriteBinding
 
 private:
     typedef QDeclarativeCompiledData::Instruction Instruction;
index e783d3a..9d643d3 100644 (file)
@@ -298,13 +298,13 @@ const QMetaObject *QDeclarativeCustomParser::resolveType(const QString& name) co
 }
 
 /*!
-    Rewrites \a expression and returns an identifier that can be
+    Rewrites \a value and returns an identifier that can be
     used to construct the binding later. \a name
     is used as the name of the rewritten function.
 */
-QDeclarativeBinding::Identifier QDeclarativeCustomParser::rewriteBinding(const QString& expression, const QString& name)
+QDeclarativeBinding::Identifier QDeclarativeCustomParser::rewriteBinding(const QDeclarativeScript::Variant &value, const QString& name)
 {
-    return compiler->rewriteBinding(expression, name);
+    return compiler->rewriteBinding(value, name);
 }
 
 QT_END_NAMESPACE
index 94b6865..83e1319 100644 (file)
@@ -142,7 +142,7 @@ protected:
 
     const QMetaObject *resolveType(const QString&) const;
 
-    QDeclarativeBinding::Identifier rewriteBinding(const QString&, const QString&);
+    QDeclarativeBinding::Identifier rewriteBinding(const QDeclarativeScript::Variant&, const QString&);
 
 private:
     QList<QDeclarativeError> exceptions;
index 72add56..e9dc559 100644 (file)
@@ -298,8 +298,7 @@ QDeclarativePropertyChangesParser::compile(const QList<QDeclarativeCustomParserP
             var = QVariant(v.asScript());
             {
                 // Pre-rewrite the expression
-                QString expression = v.asScript();
-                id = rewriteBinding(expression, data.at(ii).first); //### recreates the AST, which is slow
+                id = rewriteBinding(v, data.at(ii).first);
             }
             break;
         }
index 3ea22e8..2aaf64b 100644 (file)
@@ -301,9 +301,7 @@ QDeclarative1PropertyChangesParser::compile(const QList<QDeclarativeCustomParser
         case QDeclarativeScript::Variant::Script:
             var = QVariant(v.asScript());
             {
-                // Pre-rewrite the expression
-                QString expression = v.asScript();
-                id = rewriteBinding(expression, data.at(ii).first); //### recreates the AST, which is slow
+                id = rewriteBinding(v, data.at(ii).first);
             }
             break;
         }