diff options
Diffstat (limited to 'src/qml/jsruntime')
| -rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 31 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 20 | ||||
| -rw-r--r-- | src/qml/jsruntime/qv4qmlcontext.cpp | 2 |
3 files changed, 25 insertions, 28 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 82e653a645..1f27ca1f1e 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -856,6 +856,10 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) ExecutionEngine::~ExecutionEngine() { +#if QT_CONFIG(qml_network) + delete networkAccessManager; +#endif + m_typeLoader.reset(); qDeleteAll(m_extensionData); delete m_multiplyWrappedQObjects; m_multiplyWrappedQObjects = nullptr; @@ -884,6 +888,15 @@ ExecutionEngine::~ExecutionEngine() #endif } +#if QT_CONFIG(qml_network) +QNetworkAccessManager *ExecutionEngine::getNetworkAccessManager() +{ + if (!networkAccessManager) + networkAccessManager = typeLoader()->createNetworkAccessManager(nullptr); + return networkAccessManager; +} +#endif + #if QT_CONFIG(qml_debug) void ExecutionEngine::setDebugger(Debugging::Debugger *debugger) { @@ -2194,13 +2207,10 @@ ExecutionEngine::Module ExecutionEngine::registerNativeModule( return Module(); QQmlRefPointer<CompiledData::CompilationUnit> cu; - if (m_qmlEngine) { - // Make sure the type loader doesn't try to resolve the module anymore. - // If some other code requests that same module, we need to produce the same CU. - cu = QQmlEnginePrivate::get(m_qmlEngine)->typeLoader.injectModule(url, unit); - } else { - cu = QQml::makeRefPointer<CompiledData::CompilationUnit>(unit); - } + + // Make sure the type loader doesn't try to resolve the module anymore. + // If some other code requests that same module, we need to produce the same CU. + cu = typeLoader()->injectModule(url, unit); QQmlRefPointer<ExecutableCompilationUnit> newModule = insertCompilationUnit(std::move(cu)); @@ -2956,11 +2966,4 @@ int ExecutionEngine::registerExtension() return registrationData()->extensionCount++; } -#if QT_CONFIG(qml_network) -QNetworkAccessManager *QV4::detail::getNetworkAccessManager(ExecutionEngine *engine) -{ - return engine->qmlEngine()->networkAccessManager(); -} -#endif // qml_network - QT_END_NAMESPACE diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 764a796f9d..8c1c12e543 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -57,16 +57,8 @@ QT_BEGIN_NAMESPACE #if QT_CONFIG(qml_network) class QNetworkAccessManager; - -namespace QV4 { -struct QObjectMethod; -namespace detail { -QNetworkAccessManager *getNetworkAccessManager(ExecutionEngine *engine); -} -} -#else -namespace QV4 { struct QObjectMethod; } #endif // qml_network +namespace QV4 { struct QObjectMethod; } // Used to allow a QObject method take and return raw V4 handles without having to expose // 48 in the public API. @@ -176,9 +168,9 @@ public: template<typename TypeLoader = QQmlTypeLoader> TypeLoader *typeLoader() { - if (m_qmlEngine) - return TypeLoader::get(m_qmlEngine); - return nullptr; + if (!m_typeLoader) + m_typeLoader = std::make_unique<TypeLoader>(this); + return m_typeLoader.get(); } enum JSObjects { @@ -359,7 +351,8 @@ public: FunctionObject *thrower() const { return reinterpret_cast<FunctionObject *>(jsObjects + ThrowerObject); } #if QT_CONFIG(qml_network) - QNetworkAccessManager* (*networkAccessManager)(ExecutionEngine*) = detail::getNetworkAccessManager; + QNetworkAccessManager *getNetworkAccessManager(); + QNetworkAccessManager *networkAccessManager = nullptr; #endif enum JSStrings { @@ -866,6 +859,7 @@ private: void *m_xmlHttpRequestData = nullptr; #endif + std::unique_ptr<QQmlTypeLoader> m_typeLoader; QQmlEngine *m_qmlEngine = nullptr; QQmlDelayedCallQueue m_delayedCallQueue; diff --git a/src/qml/jsruntime/qv4qmlcontext.cpp b/src/qml/jsruntime/qv4qmlcontext.cpp index baef0b4864..4d29d6b890 100644 --- a/src/qml/jsruntime/qv4qmlcontext.cpp +++ b/src/qml/jsruntime/qv4qmlcontext.cpp @@ -201,7 +201,7 @@ ReturnedValue QQmlContextWrapper::getPropertyAndBase(const QQmlContextWrapper *r if (context->imports() && (name->startsWithUpper() || context->valueTypesAreAddressable())) { // Search for attached properties, enums and imported scripts QQmlTypeNameCache::Result r = context->imports()->query<QQmlImport::AllowRecursion>( - name, QQmlTypeLoader::get(ep)); + name, v4->typeLoader()); if (r.isValid()) { if (hasProperty) |
