diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2025-06-13 14:09:08 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2025-06-18 08:05:17 +0200 |
| commit | 6204cf5bbd199005c8c79448b1d7055dbd7fadfb (patch) | |
| tree | 086c96c42622c3415f4923ac5587efc21a68f11d /src/qml/jsapi/qjsengine.cpp | |
| parent | 95504ec1c70daddac002d246649fa1d741234521 (diff) | |
QJSEngine: Use QQmlScriptBlob instead of loadModule
We need to get rid of the local file loading. Also, sort the includes of
qjsengine.cpp.
Change-Id: I62629e21ababb9aadc2b146a75cda712d26cffa3
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'src/qml/jsapi/qjsengine.cpp')
| -rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 85 |
1 files changed, 58 insertions, 27 deletions
diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index 8cae6c55be..b920647de5 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -2,41 +2,42 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qjsengine.h" -#include "qjsengine_p.h" -#include "qjsvalue.h" -#include "qjsvalue_p.h" - -#include "private/qv4engine_p.h" -#include "private/qv4mm_p.h" -#include "private/qv4errorobject_p.h" -#include "private/qv4globalobject_p.h" -#include "private/qv4script_p.h" -#include "private/qv4runtime_p.h" -#include <private/qv4dateobject_p.h> + +#include <private/qjsengine_p.h> +#include <private/qjsvalue_p.h> #include <private/qqmlbuiltinfunctions_p.h> #include <private/qqmldebugconnector_p.h> -#include <private/qv4qobjectwrapper_p.h> +#include <private/qqmlglobal_p.h> +#include <private/qqmlscriptblob_p.h> +#include <private/qqmltypeloader_p.h> +#include <private/qv4dateobject_p.h> +#include <private/qv4engine_p.h> +#include <private/qv4errorobject_p.h> +#include <private/qv4globalobject_p.h> +#include <private/qv4mm_p.h> +#include <private/qv4module_p.h> #include <private/qv4qmetaobjectwrapper_p.h> +#include <private/qv4qobjectwrapper_p.h> +#include <private/qv4runtime_p.h> +#include <private/qv4script_p.h> #include <private/qv4stackframe_p.h> -#include <private/qv4module_p.h> #include <private/qv4symbol_p.h> -#include <QtCore/qdatetime.h> -#include <QtCore/qmetaobject.h> -#include <QtCore/qstringlist.h> -#include <QtCore/qvariant.h> -#include <QtCore/qdatetime.h> +#include <QtQml/qjsvalue.h> +#include <QtQml/qqmlengine.h> #include <QtCore/qcoreapplication.h> +#include <QtCore/qdatetime.h> #include <QtCore/qdir.h> #include <QtCore/qfile.h> #include <QtCore/qfileinfo.h> +#include <QtCore/qmetaobject.h> +#include <QtCore/qmutex.h> #include <QtCore/qpluginloader.h> -#include <qthread.h> -#include <qmutex.h> -#include <qwaitcondition.h> -#include <private/qqmlglobal_p.h> -#include <qqmlengine.h> +#include <QtCore/qstringlist.h> +#include <QtCore/qthread.h> +#include <QtCore/qvariant.h> +#include <QtCore/qwaitcondition.h> Q_DECLARE_METATYPE(QList<int>) @@ -576,10 +577,40 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in */ QJSValue QJSEngine::importModule(const QString &fileName) { - const QUrl url = urlForFileName(QFileInfo(fileName).canonicalFilePath()); - const auto module = m_v4Engine->loadModule(url); - if (m_v4Engine->hasException) - return QJSValuePrivate::fromReturnedValue(m_v4Engine->catchException()); + QUrl url = urlForFileName(QFileInfo(fileName).canonicalFilePath()); + if (!fileName.endsWith(QLatin1String(".mjs"))) + url.setFragment(QLatin1String("module")); + + QQmlRefPointer<QQmlScriptBlob> scriptBlob = m_v4Engine->typeLoader()->getScript(url); + + if (scriptBlob->isError()) { + const QList<QQmlError> errors = scriptBlob->errors(); + switch (errors.length()) { + case 0: + Q_UNREACHABLE_RETURN(QJSValue()); + case 1: { + const QQmlError &error = errors[0]; + m_v4Engine->throwSyntaxError( + error.description(), error.url().toString(), error.line(), error.column()); + return QJSValuePrivate::fromReturnedValue(m_v4Engine->catchException()); + } + default: { + QString errorString = QStringLiteral("Importing module failed:"); + for (const QQmlError &error : errors) { + errorString += QLatin1String("\n "); + errorString += error.toString(); + } + m_v4Engine->throwSyntaxError(errorString); + return QJSValuePrivate::fromReturnedValue(m_v4Engine->catchException()); + } + } + } + + // We've just created the URL from a local file. So it has to be synchronous. + Q_ASSERT(scriptBlob->isComplete()); + + const auto module + = m_v4Engine->executableCompilationUnit(scriptBlob->scriptData()->compilationUnit()); // If there is neither a native nor a compiled module, we should have seen an exception Q_ASSERT(module); |
