Initial bundle support
[profile/ivi/qtdeclarative.git] / src / qml / qml / qqmlscript.cpp
index db59a72..b1a50a4 100644 (file)
@@ -50,6 +50,7 @@
 #include <private/qqmlrewrite_p.h>
 
 #include <QStack>
+#include <QStringList>
 #include <QCoreApplication>
 #include <QtDebug>
 
@@ -65,6 +66,13 @@ QQmlScript::Object::Object()
 : type(-1), idIndex(-1), metatype(0), synthCache(0), defaultProperty(0), parserStatusCast(-1),
   componentCompileState(0), nextAliasingObject(0), nextIdObject(0)
 {
+    // initialize the members in the meta object
+    extObject.d.superdata = 0;
+    extObject.d.stringdata = 0;
+    extObject.d.data = 0;
+    extObject.d.extradata = 0;
+    extObject.d.static_metacall = 0;
+    extObject.d.relatedMetaObjects = 0;
 }
 
 QQmlScript::Object::~Object() 
@@ -181,33 +189,30 @@ Property *QQmlScript::Object::getProperty(const QString &name, bool create)
     }
 }
 
-QQmlScript::Object::DynamicProperty::DynamicProperty()
-: isDefaultProperty(false), isReadOnly(false), type(Variant), defaultValue(0), nextProperty(0),
-  resolvedCustomTypeName(0)
+int QQmlScript::Object::aggregateDynamicSignalParameterCount() const
 {
+    int sum = 0;
+    for (DynamicSignal *s = dynamicSignals.first(); s; s = dynamicSignals.next(s))
+        sum += s->parameterTypes.count() + 1; // +1 for return type
+    return sum;
 }
 
-QQmlScript::Object::DynamicSignal::DynamicSignal()
-: nextSignal(0)
+int QQmlScript::Object::aggregateDynamicSlotParameterCount() const
 {
+    int sum = 0;
+    for (DynamicSlot *s = dynamicSlots.first(); s; s = dynamicSlots.next(s))
+        sum += s->parameterNames.count() + 1; // +1 for return type
+    return sum;
 }
 
-// Returns length in utf8 bytes
-int QQmlScript::Object::DynamicSignal::parameterTypesLength() const
+QQmlScript::Object::DynamicProperty::DynamicProperty()
+: isDefaultProperty(false), isReadOnly(false), type(Variant), defaultValue(0), nextProperty(0)
 {
-    int rv = 0;
-    for (int ii = 0; ii < parameterTypes.count(); ++ii)
-        rv += parameterTypes.at(ii).length();
-    return rv;
 }
 
-// Returns length in utf8 bytes
-int QQmlScript::Object::DynamicSignal::parameterNamesLength() const
+QQmlScript::Object::DynamicSignal::DynamicSignal()
+: nextSignal(0)
 {
-    int rv = 0;
-    for (int ii = 0; ii < parameterNames.count(); ++ii)
-        rv += parameterNames.at(ii).utf8length();
-    return rv;
 }
 
 QQmlScript::Object::DynamicSlot::DynamicSlot()
@@ -446,22 +451,6 @@ QStringList QQmlScript::Variant::asStringList() const
 //
 // Actual parser classes
 //
-void QQmlScript::Import::extractVersion(int *maj, int *min) const
-{
-    *maj = -1; *min = -1;
-
-    if (!version.isEmpty()) {
-        int dot = version.indexOf(QLatin1Char('.'));
-        if (dot < 0) {
-            *maj = version.toInt();
-            *min = 0;
-        } else {
-            *maj = version.left(dot).toInt();
-            *min = version.mid(dot+1).toInt();
-        }
-    }
-}
-
 namespace {
 
 class ProcessAST: protected AST::Visitor
@@ -521,6 +510,8 @@ public:
 
     void operator()(const QString &code, AST::Node *node);
 
+    static void extractVersion(QStringRef string, int *maj, int *min);
+
 protected:
 
     QQmlScript::Object *defineObjectBinding(AST::UiQualifiedId *propertyName, bool onAssignment,
@@ -656,6 +647,26 @@ QString ProcessAST::qualifiedNameId() const
     return _scope.join(QLatin1String("/"));
 }
 
+void ProcessAST::extractVersion(QStringRef string, int *maj, int *min)
+{
+    *maj = -1; *min = -1;
+
+    if (!string.isEmpty()) {
+
+        int dot = string.indexOf(QLatin1Char('.'));
+
+        if (dot < 0) {
+            *maj = string.toString().toInt();
+            *min = 0;
+        } else {
+            const QString *s = string.string();
+            int p = string.position();
+            *maj = QStringRef(s, p, dot).toString().toInt();
+            *min = QStringRef(s, p + dot + 1, string.size() - dot - 1).toString().toInt();
+        }
+    }
+}
+
 QString ProcessAST::asString(AST::UiQualifiedId *node) const
 {
     QString s;
@@ -893,7 +904,7 @@ bool ProcessAST::visit(AST::UiImport *node)
     }
 
     if (node->versionToken.isValid()) {
-        import.version = textAt(node->versionToken);
+        extractVersion(textRefAt(node->versionToken), &import.majorVersion, &import.minorVersion);
     } else if (import.type == QQmlScript::Import::Library) {
         QQmlError error;
         error.setDescription(QCoreApplication::translate("QQmlParser","Library import requires a version"));
@@ -918,25 +929,23 @@ bool ProcessAST::visit(AST::UiPublicMember *node)
         const char *name;
         int nameLength;
         Object::DynamicProperty::Type type;
-        const char *qtName;
-        int qtNameLength;
     } propTypeNameToTypes[] = {
-        { "int", strlen("int"), Object::DynamicProperty::Int, "int", strlen("int") },
-        { "bool", strlen("bool"), Object::DynamicProperty::Bool, "bool", strlen("bool") },
-        { "double", strlen("double"), Object::DynamicProperty::Real, "double", strlen("double") },
-        { "real", strlen("real"), Object::DynamicProperty::Real, "double", strlen("double") },
-        { "string", strlen("string"), Object::DynamicProperty::String, "QString", strlen("QString") },
-        { "url", strlen("url"), Object::DynamicProperty::Url, "QUrl", strlen("QUrl") },
-        { "color", strlen("color"), Object::DynamicProperty::Color, "QColor", strlen("QColor") },
+        { "int", strlen("int"), Object::DynamicProperty::Int },
+        { "bool", strlen("bool"), Object::DynamicProperty::Bool },
+        { "double", strlen("double"), Object::DynamicProperty::Real },
+        { "real", strlen("real"), Object::DynamicProperty::Real },
+        { "string", strlen("string"), Object::DynamicProperty::String },
+        { "url", strlen("url"), Object::DynamicProperty::Url },
+        { "color", strlen("color"), Object::DynamicProperty::Color },
         // Internally QTime, QDate and QDateTime are all supported.
         // To be more consistent with JavaScript we expose only
         // QDateTime as it matches closely with the Date JS type.
         // We also call it "date" to match.
-        // { "time", strlen("time"), Object::DynamicProperty::Time, "QTime", strlen("QTime") },
-        // { "date", strlen("date"), Object::DynamicProperty::Date, "QDate", strlen("QDate") },
-        { "date", strlen("date"), Object::DynamicProperty::DateTime, "QDateTime", strlen("QDateTime") },
-        { "variant", strlen("variant"), Object::DynamicProperty::Variant, "QVariant", strlen("QVariant") },
-        { "var", strlen("var"), Object::DynamicProperty::Var, "QVariant", strlen("QVariant") }
+        // { "time", strlen("time"), Object::DynamicProperty::Time },
+        // { "date", strlen("date"), Object::DynamicProperty::Date },
+        { "date", strlen("date"), Object::DynamicProperty::DateTime },
+        { "variant", strlen("variant"), Object::DynamicProperty::Variant },
+        { "var", strlen("var"), Object::DynamicProperty::Var }
     };
     static const int propTypeNameToTypesCount = sizeof(propTypeNameToTypes) /
                                                 sizeof(propTypeNameToTypes[0]);
@@ -951,7 +960,7 @@ bool ProcessAST::visit(AST::UiPublicMember *node)
         p = node->parameters;
 
         if (paramLength) {
-            signal->parameterTypes = _parser->_pool.NewRawList<QHashedCStringRef>(paramLength);
+            signal->parameterTypes = _parser->_pool.NewRawList<Object::DynamicProperty::Type>(paramLength);
             signal->parameterNames = _parser->_pool.NewRawList<QHashedStringRef>(paramLength);
         }
 
@@ -978,7 +987,7 @@ bool ProcessAST::visit(AST::UiPublicMember *node)
                 return false;
             }
             
-            signal->parameterTypes[index] = QHashedCStringRef(type->qtName, type->qtNameLength);
+            signal->parameterTypes[index] = type->type;
             signal->parameterNames[index] = QHashedStringRef(p->name);
             p = p->next;
             index++;
@@ -1287,8 +1296,13 @@ public:
 };
 }
 
-bool QQmlScript::Parser::parse(const QByteArray &qmldata, const QUrl &url,
-                                       const QString &urlString)
+QByteArray QQmlScript::Parser::preparseData() const
+{
+    return QByteArray();
+}
+
+bool QQmlScript::Parser::parse(const QString &qmlcode, const QByteArray &preparseData,
+                               const QUrl &url, const QString &urlString)
 {
     clear();
 
@@ -1299,11 +1313,7 @@ bool QQmlScript::Parser::parse(const QByteArray &qmldata, const QUrl &url,
         _scriptFile = urlString;
     }
 
-    QTextStream stream(qmldata, QIODevice::ReadOnly);
-#ifndef QT_NO_TEXTCODEC
-    stream.setCodec("UTF-8");
-#endif
-    QString *code = _pool.NewString(stream.readAll());
+    QString *code = _pool.NewString(qmlcode);
 
     data = new QQmlScript::ParserJsASTData(_scriptFile);
 
@@ -1570,7 +1580,6 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
             } else {
                 // URI
                 QString uri;
-                QString version;
 
                 while (true) {
                     if (!isUriToken(token))
@@ -1590,7 +1599,9 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
                 }
 
                 CHECK_TOKEN(T_NUMERIC_LITERAL);
-                version = script.mid(l.tokenOffset(), l.tokenLength());
+                int vmaj, vmin;
+                ProcessAST::extractVersion(QStringRef(&script, l.tokenOffset(), l.tokenLength()),
+                                           &vmaj, &vmin);
 
                 token = l.lex();
 
@@ -1621,7 +1632,8 @@ QQmlScript::Parser::JavaScriptMetaData QQmlScript::Parser::extractMetaData(QStri
                 Import import;
                 import.type = Import::Library;
                 import.uri = uri;
-                import.version = version;
+                import.majorVersion = vmaj;
+                import.minorVersion = vmin;
                 import.qualifier = importId;
                 import.location = location;