summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Burchell <robin.burchell@jollamobile.com>2012-12-05 02:12:30 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-12 00:37:41 +0100
commit6d7d47551de18509a382185e1216632f3d862f01 (patch)
tree036489386a42fba4009772c24700f335380daeb4
parentcae858768f7d16b79f3627cd5b077da89dc0c7c9 (diff)
Process imports in the order they appear in the code.
By placing imports into a hash keyed by the qualifier, imports were not processed in the order they appeared in the source. This is perhaps not a major problem, but it is nice to have predictability. This becomes more important in Qt 5, when QHash is randomly seeded at application startup, as alterations to order could have strange side effects on code. Reported-by: Maciej Blomberg Change-Id: Ibd34fab1eed4bc727b498ba4684c62d801ae713b Reviewed-by: Matthew Vogt <matthew.vogt@qinetic.com.au> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp16
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/a.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/b.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/c.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/d.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/e.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/f.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/g.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/h.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/i.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/importOrderJs.qml30
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/j.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/k.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/l.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/m.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/n.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/o.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/p.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/q.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/r.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/s.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/t.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/u.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/v.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/w.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/x.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/y.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/data/z.js1
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/qdeclarativeimportorder.pro14
-rw-r--r--tests/auto/declarative/qdeclarativeimportorder/tst_qdeclarativeimportorder.cpp99
30 files changed, 177 insertions, 8 deletions
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index f73de7f3..ab321203 100644
--- a/src/declarative/qml/qdeclarativecompiler.cpp
+++ b/src/declarative/qml/qdeclarativecompiler.cpp
@@ -662,7 +662,8 @@ void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
output->bytecode << init;
// Build global import scripts
- QHash<QString, Object::ScriptBlock> importedScripts;
+ QSet<QString> importedScripts;
+ QList<Object::ScriptBlock> importedScriptList;
QStringList importedScriptIndexes;
foreach (const QDeclarativeTypeData::ScriptReference &script, unit->resolvedScripts()) {
@@ -672,24 +673,23 @@ void QDeclarativeCompiler::compileTree(QDeclarativeParser::Object *tree)
Q_ASSERT(!importedScripts.contains(script.qualifier));
if (!scriptCode.isEmpty()) {
- Object::ScriptBlock &scriptBlock = importedScripts[script.qualifier];
+ importedScripts.insert(script.qualifier);
+ Object::ScriptBlock scriptBlock;
scriptBlock.code = scriptCode;
scriptBlock.file = script.script->finalUrl().toString();
scriptBlock.pragmas = pragmas;
+ importedScriptList.append(scriptBlock);
+ importedScriptIndexes.append(script.qualifier);
}
}
- for (QHash<QString, Object::ScriptBlock>::Iterator iter = importedScripts.begin();
- iter != importedScripts.end(); ++iter) {
-
- importedScriptIndexes.append(iter.key());
-
+ for (int i = 0; i < importedScriptList.count(); ++i) {
QDeclarativeInstruction import;
import.type = QDeclarativeInstruction::StoreImportedScript;
import.line = 0;
import.storeScript.value = output->scripts.count();
- output->scripts << *iter;
+ output->scripts << importedScriptList.at(i);
output->bytecode << import;
}
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/a.js b/tests/auto/declarative/qdeclarativeimportorder/data/a.js
new file mode 100644
index 00000000..49c40f77
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/a.js
@@ -0,0 +1 @@
+console.log("a.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/b.js b/tests/auto/declarative/qdeclarativeimportorder/data/b.js
new file mode 100644
index 00000000..786ef862
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/b.js
@@ -0,0 +1 @@
+console.log("b.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/c.js b/tests/auto/declarative/qdeclarativeimportorder/data/c.js
new file mode 100644
index 00000000..3e1d32f0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/c.js
@@ -0,0 +1 @@
+console.log("c.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/d.js b/tests/auto/declarative/qdeclarativeimportorder/data/d.js
new file mode 100644
index 00000000..4c339077
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/d.js
@@ -0,0 +1 @@
+console.log("d.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/e.js b/tests/auto/declarative/qdeclarativeimportorder/data/e.js
new file mode 100644
index 00000000..ac758f93
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/e.js
@@ -0,0 +1 @@
+console.log("e.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/f.js b/tests/auto/declarative/qdeclarativeimportorder/data/f.js
new file mode 100644
index 00000000..04b0cf3a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/f.js
@@ -0,0 +1 @@
+console.log("f.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/g.js b/tests/auto/declarative/qdeclarativeimportorder/data/g.js
new file mode 100644
index 00000000..e6747104
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/g.js
@@ -0,0 +1 @@
+console.log("g.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/h.js b/tests/auto/declarative/qdeclarativeimportorder/data/h.js
new file mode 100644
index 00000000..8f81e240
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/h.js
@@ -0,0 +1 @@
+console.log("h.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/i.js b/tests/auto/declarative/qdeclarativeimportorder/data/i.js
new file mode 100644
index 00000000..a074b78c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/i.js
@@ -0,0 +1 @@
+console.log("i.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/importOrderJs.qml b/tests/auto/declarative/qdeclarativeimportorder/data/importOrderJs.qml
new file mode 100644
index 00000000..6cad175e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/importOrderJs.qml
@@ -0,0 +1,30 @@
+import QtQuick 1.1
+import "a.js" as A
+import "b.js" as B
+import "c.js" as C
+import "d.js" as D
+import "e.js" as E
+import "f.js" as F
+import "g.js" as G
+import "h.js" as H
+import "i.js" as I
+import "j.js" as J
+import "k.js" as K
+import "l.js" as L
+import "m.js" as M
+import "n.js" as N
+import "o.js" as O
+import "p.js" as P
+import "q.js" as Q
+import "r.js" as R
+import "s.js" as S
+import "t.js" as T
+import "u.js" as U
+import "v.js" as V
+import "w.js" as W
+import "x.js" as X
+import "y.js" as Y
+import "z.js" as Z
+
+Item {
+}
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/j.js b/tests/auto/declarative/qdeclarativeimportorder/data/j.js
new file mode 100644
index 00000000..1b336d06
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/j.js
@@ -0,0 +1 @@
+console.log("j.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/k.js b/tests/auto/declarative/qdeclarativeimportorder/data/k.js
new file mode 100644
index 00000000..b205c1c4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/k.js
@@ -0,0 +1 @@
+console.log("k.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/l.js b/tests/auto/declarative/qdeclarativeimportorder/data/l.js
new file mode 100644
index 00000000..36331a88
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/l.js
@@ -0,0 +1 @@
+console.log("l.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/m.js b/tests/auto/declarative/qdeclarativeimportorder/data/m.js
new file mode 100644
index 00000000..f8ec9a06
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/m.js
@@ -0,0 +1 @@
+console.log("m.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/n.js b/tests/auto/declarative/qdeclarativeimportorder/data/n.js
new file mode 100644
index 00000000..59ea354c
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/n.js
@@ -0,0 +1 @@
+console.log("n.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/o.js b/tests/auto/declarative/qdeclarativeimportorder/data/o.js
new file mode 100644
index 00000000..1bdad649
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/o.js
@@ -0,0 +1 @@
+console.log("o.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/p.js b/tests/auto/declarative/qdeclarativeimportorder/data/p.js
new file mode 100644
index 00000000..ba37e9cc
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/p.js
@@ -0,0 +1 @@
+console.log("p.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/q.js b/tests/auto/declarative/qdeclarativeimportorder/data/q.js
new file mode 100644
index 00000000..6f226207
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/q.js
@@ -0,0 +1 @@
+console.log("q.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/r.js b/tests/auto/declarative/qdeclarativeimportorder/data/r.js
new file mode 100644
index 00000000..9f9b25a0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/r.js
@@ -0,0 +1 @@
+console.log("r.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/s.js b/tests/auto/declarative/qdeclarativeimportorder/data/s.js
new file mode 100644
index 00000000..f81ca099
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/s.js
@@ -0,0 +1 @@
+console.log("s.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/t.js b/tests/auto/declarative/qdeclarativeimportorder/data/t.js
new file mode 100644
index 00000000..3f150a77
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/t.js
@@ -0,0 +1 @@
+console.log("t.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/u.js b/tests/auto/declarative/qdeclarativeimportorder/data/u.js
new file mode 100644
index 00000000..426bdd09
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/u.js
@@ -0,0 +1 @@
+console.log("u.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/v.js b/tests/auto/declarative/qdeclarativeimportorder/data/v.js
new file mode 100644
index 00000000..66d23f52
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/v.js
@@ -0,0 +1 @@
+console.log("v.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/w.js b/tests/auto/declarative/qdeclarativeimportorder/data/w.js
new file mode 100644
index 00000000..ecefb1d0
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/w.js
@@ -0,0 +1 @@
+console.log("w.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/x.js b/tests/auto/declarative/qdeclarativeimportorder/data/x.js
new file mode 100644
index 00000000..64112bb4
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/x.js
@@ -0,0 +1 @@
+console.log("x.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/y.js b/tests/auto/declarative/qdeclarativeimportorder/data/y.js
new file mode 100644
index 00000000..9ed70f26
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/y.js
@@ -0,0 +1 @@
+console.log("y.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/data/z.js b/tests/auto/declarative/qdeclarativeimportorder/data/z.js
new file mode 100644
index 00000000..0e6fc83e
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/data/z.js
@@ -0,0 +1 @@
+console.log("z.js")
diff --git a/tests/auto/declarative/qdeclarativeimportorder/qdeclarativeimportorder.pro b/tests/auto/declarative/qdeclarativeimportorder/qdeclarativeimportorder.pro
new file mode 100644
index 00000000..725b6d6a
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/qdeclarativeimportorder.pro
@@ -0,0 +1,14 @@
+CONFIG += testcase
+TARGET = tst_qdeclarativeimportorder
+
+QT += testlib
+contains(QT_CONFIG,declarative): QT += declarative widgets
+macx:CONFIG -= app_bundle
+
+SOURCES += tst_qdeclarativeimportorder.cpp
+
+include(../shared/qdeclarativedatatest.pri)
+
+CONFIG += parallel_test
+
+DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/declarative/qdeclarativeimportorder/tst_qdeclarativeimportorder.cpp b/tests/auto/declarative/qdeclarativeimportorder/tst_qdeclarativeimportorder.cpp
new file mode 100644
index 00000000..ecf35100
--- /dev/null
+++ b/tests/auto/declarative/qdeclarativeimportorder/tst_qdeclarativeimportorder.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Jolla Mobile <robin.burchell@jollamobile.com>
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <qdeclarativedatatest.h>
+#include <QDeclarativeEngine>
+#include <QDeclarativeComponent>
+#include <QDeclarativeContext>
+
+#include <QDebug>
+
+
+class tst_qdeclarativeimportorder : public QDeclarativeDataTest
+{
+ Q_OBJECT
+public:
+ tst_qdeclarativeimportorder()
+ {
+ }
+
+private slots:
+ void qmlObject();
+
+private:
+ QDeclarativeEngine engine;
+};
+
+Q_GLOBAL_STATIC(QStringList, importMessages);
+
+static void orderedImportMsgHandler(QtMsgType type, const QMessageLogContext &, const QString &message)
+{
+ if (type == QtDebugMsg)
+ importMessages()->append(message);
+ else
+ fprintf(stderr, "possibly unexpected message of type %d: %s", type, qPrintable(message));
+}
+
+void tst_qdeclarativeimportorder::qmlObject()
+{
+ QDeclarativeComponent component(&engine, testFileUrl("importOrderJs.qml"));
+
+ QtMessageHandler old = qInstallMessageHandler(orderedImportMsgHandler);
+ QObject *object = component.create();
+ qInstallMessageHandler(old); // do this before the QVERIFY so output goes out ok if it errors
+ QVERIFY(object != 0);
+ QCOMPARE(*importMessages(), QStringList() << "a.js" << "b.js" << "c.js"
+ << "d.js" << "e.js" << "f.js"
+ << "g.js" << "h.js" << "i.js"
+ << "j.js" << "k.js" << "l.js"
+ << "m.js" << "n.js" << "o.js"
+ << "p.js" << "q.js" << "r.js"
+ << "s.js" << "t.js" << "u.js"
+ << "v.js" << "w.js" << "x.js"
+ << "y.js" << "z.js");
+ // now I know my ABCs,
+ // next time won't you sing with me?
+}
+
+QTEST_MAIN(tst_qdeclarativeimportorder)
+
+#include "tst_qdeclarativeimportorder.moc"