diff options
author | Robin Burchell <robin.burchell@jollamobile.com> | 2012-12-05 02:12:30 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-12-12 00:37:41 +0100 |
commit | 6d7d47551de18509a382185e1216632f3d862f01 (patch) | |
tree | 036489386a42fba4009772c24700f335380daeb4 | |
parent | cae858768f7d16b79f3627cd5b077da89dc0c7c9 (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>
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" |