diff options
author | Nobuaki Sukegawa <nsukeg@gmail.com> | 2014-12-15 02:33:05 +0900 |
---|---|---|
committer | Nobuaki Sukegawa <nsukeg@gmail.com> | 2015-01-02 15:31:11 +0100 |
commit | 96178192c451a5e26e30e14a619b96aacd16c29b (patch) | |
tree | 3a916cd5f3efcd09e68f65f948dcc61e493c547b | |
parent | 2b5fb185627f8adfb6c5b3d62990a58429bf4ea7 (diff) |
Do not cause SegFault when importing empty javascript
Change-Id: I31f6571e73b5dd74bf3ade5cadc2daa02475b5cb
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
7 files changed, 27 insertions, 5 deletions
diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index 38d2c12cfb..d4eb388d6e 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -199,14 +199,12 @@ Script::Script(ExecutionEngine *v4, Object *qml, CompiledData::CompilationUnit * { parsed = true; - if (compilationUnit) { - vmFunction = compilationUnit->linkToEngine(v4); - Q_ASSERT(vmFunction); + vmFunction = compilationUnit ? compilationUnit->linkToEngine(v4) : 0; + if (vmFunction) { Scope valueScope(v4); ScopedObject holder(valueScope, v4->memoryManager->alloc<CompilationUnitHolder>(v4, compilationUnit)); compilationUnitHolder = holder.asReturnedValue(); - } else - vmFunction = 0; + } } Script::~Script() diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index fb435a50af..99247fc6b7 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -2574,6 +2574,11 @@ QQmlScriptData *QQmlScriptBlob::scriptData() const return m_scriptData; } +struct EmptyCompilationUnit : public QV4::CompiledData::CompilationUnit +{ + virtual void linkBackendToEngine(QV4::ExecutionEngine *) {} +}; + void QQmlScriptBlob::dataReceived(const Data &data) { QString source = QString::fromUtf8(data.data(), data.size()); @@ -2600,6 +2605,9 @@ void QQmlScriptBlob::dataReceived(const Data &data) setError(errors); return; } + if (!unit) { + unit.take(new EmptyCompilationUnit); + } irUnit.javaScriptCompilationUnit = unit; QmlIR::QmlUnitGenerator qmlGenerator; diff --git a/tests/auto/qml/qqmllanguage/data/importJs.11.errors.txt b/tests/auto/qml/qqmllanguage/data/importJs.11.errors.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/importJs.11.errors.txt diff --git a/tests/auto/qml/qqmllanguage/data/importJs.11.qml b/tests/auto/qml/qqmllanguage/data/importJs.11.qml new file mode 100644 index 0000000000..e76c57b9fc --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/importJs.11.qml @@ -0,0 +1,10 @@ +import org.qtproject.EmptyJsModule 1.0 as Empty +import QtQuick 2.0 + +Item { + property bool test: false + + Component.onCompleted: { + test = typeof Empty == 'object' + } +} diff --git a/tests/auto/qml/qqmllanguage/data/lib/org/qtproject/EmptyJsModule/Empty.js b/tests/auto/qml/qqmllanguage/data/lib/org/qtproject/EmptyJsModule/Empty.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/lib/org/qtproject/EmptyJsModule/Empty.js diff --git a/tests/auto/qml/qqmllanguage/data/lib/org/qtproject/EmptyJsModule/qmldir b/tests/auto/qml/qqmllanguage/data/lib/org/qtproject/EmptyJsModule/qmldir new file mode 100644 index 0000000000..2a436857f1 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/lib/org/qtproject/EmptyJsModule/qmldir @@ -0,0 +1 @@ +EmptyAPI 1.0 Empty.js diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 12d2f53596..734c9a4e1a 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -2924,6 +2924,11 @@ void tst_qqmllanguage::importJs_data() << "importJs.10.qml" << "importJs.10.errors.txt" << true; + + QTest::newRow("emptyScript") + << "importJs.11.qml" + << "importJs.11.errors.txt" + << true; } void tst_qqmllanguage::importJs() |