aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsapi/qjsengine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2025-06-13 14:09:08 +0200
committerUlf Hermann <ulf.hermann@qt.io>2025-06-18 08:05:17 +0200
commit6204cf5bbd199005c8c79448b1d7055dbd7fadfb (patch)
tree086c96c42622c3415f4923ac5587efc21a68f11d /src/qml/jsapi/qjsengine.cpp
parent95504ec1c70daddac002d246649fa1d741234521 (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.cpp85
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);