diff options
Diffstat (limited to 'src')
44 files changed, 157 insertions, 166 deletions
diff --git a/src/imports/statemachine/signaltransition.cpp b/src/imports/statemachine/signaltransition.cpp index aaf32f6d19..3c3142cce8 100644 --- a/src/imports/statemachine/signaltransition.cpp +++ b/src/imports/statemachine/signaltransition.cpp @@ -109,7 +109,7 @@ void SignalTransition::setSignal(const QJSValue &signal) m_signal = signal; - QV4::ExecutionEngine *jsEngine = QV8Engine::getV4(QQmlEngine::contextForObject(this)->engine()); + QV4::ExecutionEngine *jsEngine = QQmlEngine::contextForObject(this)->engine()->handle(); QV4::Scope scope(jsEngine); QObject *sender; @@ -169,7 +169,7 @@ void SignalTransition::connectTriggered() const QV4::CompiledData::Binding *binding = m_bindings.at(0); Q_ASSERT(binding->type == QV4::CompiledData::Binding::Type_Script); - QV4::ExecutionEngine *jsEngine = QV8Engine::getV4(QQmlEngine::contextForObject(this)->engine()); + QV4::ExecutionEngine *jsEngine = QQmlEngine::contextForObject(this)->engine()->handle(); QV4::Scope scope(jsEngine); QV4::Scoped<QV4::QObjectMethod> qobjectSignal(scope, QJSValuePrivate::convertedToValue(jsEngine, m_signal)); Q_ASSERT(qobjectSignal); diff --git a/src/imports/testlib/main.cpp b/src/imports/testlib/main.cpp index 00e9592557..ab84d83ff7 100644 --- a/src/imports/testlib/main.cpp +++ b/src/imports/testlib/main.cpp @@ -103,7 +103,7 @@ public Q_SLOTS: } QQmlEngine *engine = qmlEngine(this); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *v4 = engine->handle(); QV4::Scope scope(v4); QV4::ScopedValue s(scope, v4->newString(name)); return QQmlV4Handle(s); @@ -116,7 +116,7 @@ public Q_SLOTS: QQmlV4Handle callerFile(int frameIndex = 0) const { QQmlEngine *engine = qmlEngine(this); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *v4 = engine->handle(); QV4::Scope scope(v4); QVector<QV4::StackFrame> stack = v4->stackTrace(frameIndex + 2); @@ -129,7 +129,7 @@ public Q_SLOTS: int callerLine(int frameIndex = 0) const { QQmlEngine *engine = qmlEngine(this); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *v4 = engine->handle(); QVector<QV4::StackFrame> stack = v4->stackTrace(frameIndex + 2); if (stack.size() > frameIndex + 1) diff --git a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp index a013e8cf69..d14810a01b 100644 --- a/src/imports/xmllistmodel/qqmlxmllistmodel.cpp +++ b/src/imports/xmllistmodel/qqmlxmllistmodel.cpp @@ -923,8 +923,7 @@ QQmlV4Handle QQuickXmlListModel::get(int index) const return QQmlV4Handle(Encode::undefined()); QQmlEngine *engine = qmlContext(this)->engine(); - QV8Engine *v8engine = QQmlEnginePrivate::getV8Engine(engine); - ExecutionEngine *v4engine = QV8Engine::getV4(v8engine); + ExecutionEngine *v4engine = engine->handle(); Scope scope(v4engine); Scoped<Object> o(scope, v4engine->newObject()); ScopedString name(scope); diff --git a/src/particles/qquickcustomaffector.cpp b/src/particles/qquickcustomaffector.cpp index e152c436db..53557e1d0b 100644 --- a/src/particles/qquickcustomaffector.cpp +++ b/src/particles/qquickcustomaffector.cpp @@ -148,7 +148,7 @@ void QQuickCustomAffector::affectSystem(qreal dt) dt = 1.0; QQmlEngine *qmlEngine = ::qmlEngine(this); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine->handle()); + QV4::ExecutionEngine *v4 = qmlEngine->handle(); QV4::Scope scope(v4); QV4::ScopedArrayObject array(scope, v4->newArrayObject(toAffect.size())); diff --git a/src/particles/qquickparticleemitter.cpp b/src/particles/qquickparticleemitter.cpp index d4e6552d95..d17c8fc2ba 100644 --- a/src/particles/qquickparticleemitter.cpp +++ b/src/particles/qquickparticleemitter.cpp @@ -486,7 +486,7 @@ void QQuickParticleEmitter::emitWindow(int timeStamp) if (isEmitConnected()) { QQmlEngine *qmlEngine = ::qmlEngine(this); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine->handle()); + QV4::ExecutionEngine *v4 = qmlEngine->handle(); QV4::Scope scope(v4); //Done after emitParticle so that the Painter::load is done first, this allows you to customize its static variables diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp index cc7d9edbc8..5e613c484a 100644 --- a/src/particles/qquickparticlesystem.cpp +++ b/src/particles/qquickparticlesystem.cpp @@ -526,7 +526,7 @@ void QQuickParticleData::clone(const QQuickParticleData& other) QQmlV4Handle QQuickParticleData::v4Value(QQuickParticleSystem* particleSystem) { if (!v8Datum) - v8Datum = new QQuickV4ParticleData(QQmlEnginePrivate::getV8Engine(qmlEngine(particleSystem)), this, particleSystem); + v8Datum = new QQuickV4ParticleData(qmlEngine(particleSystem)->handle(), this, particleSystem); return v8Datum->v4Value(); } diff --git a/src/particles/qquicktrailemitter.cpp b/src/particles/qquicktrailemitter.cpp index 49ee728bfd..16b87f0e51 100644 --- a/src/particles/qquicktrailemitter.cpp +++ b/src/particles/qquicktrailemitter.cpp @@ -267,7 +267,7 @@ void QQuickTrailEmitter::emitWindow(int timeStamp) if (isEmitConnected() || isEmitFollowConnected()) { QQmlEngine *qmlEngine = ::qmlEngine(this); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine->handle()); + QV4::ExecutionEngine *v4 = qmlEngine->handle(); QV4::Scope scope(v4); QV4::ScopedArrayObject array(scope, v4->newArrayObject(toEmit.size())); diff --git a/src/particles/qquickv4particledata.cpp b/src/particles/qquickv4particledata.cpp index 52acd3d371..fb674e1b64 100644 --- a/src/particles/qquickv4particledata.cpp +++ b/src/particles/qquickv4particledata.cpp @@ -510,12 +510,12 @@ QV4ParticleDataDeletable::~QV4ParticleDataDeletable() V4_DEFINE_EXTENSION(QV4ParticleDataDeletable, particleV4Data); -QQuickV4ParticleData::QQuickV4ParticleData(QV8Engine* engine, QQuickParticleData* datum, QQuickParticleSystem *system) +QQuickV4ParticleData::QQuickV4ParticleData(QV4::ExecutionEngine* v4, QQuickParticleData* datum, + QQuickParticleSystem *system) { - if (!engine || !datum) + if (!v4 || !datum) return; - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); QV4::Scope scope(v4); QV4ParticleDataDeletable *d = particleV4Data(scope.engine); QV4::ScopedObject o(scope, v4->memoryManager->allocObject<QV4ParticleData>(datum, system)); diff --git a/src/particles/qquickv4particledata_p.h b/src/particles/qquickv4particledata_p.h index d73e3b644d..3d682ab297 100644 --- a/src/particles/qquickv4particledata_p.h +++ b/src/particles/qquickv4particledata_p.h @@ -61,7 +61,7 @@ class QQuickParticleData; class QQuickParticleSystem; class QQuickV4ParticleData { public: - QQuickV4ParticleData(QV8Engine*, QQuickParticleData*, QQuickParticleSystem *system); + QQuickV4ParticleData(QV4::ExecutionEngine*, QQuickParticleData*, QQuickParticleSystem *system); ~QQuickV4ParticleData(); QQmlV4Handle v4Value() const; private: diff --git a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp index f191fe9679..a6d89cd066 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qqmlenginedebugservice.cpp @@ -758,7 +758,7 @@ bool QQmlEngineDebugServiceImpl::setMethodBody(int objectId, const QString &meth QQmlVMEMetaObject *vmeMetaObject = QQmlVMEMetaObject::get(object); Q_ASSERT(vmeMetaObject); // the fact we found the property above should guarentee this - QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine(object)->handle()); + QV4::ExecutionEngine *v4 = qmlEngine(object)->handle(); QV4::Scope scope(v4); int lineNumber = 0; diff --git a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp index fca811cb28..99a57be5d6 100644 --- a/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_debugger/qv4debugservice.cpp @@ -702,7 +702,7 @@ void QV4DebugServiceImpl::engineAdded(QJSEngine *engine) { QMutexLocker lock(&m_configMutex); if (engine) { - QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *ee = engine->handle(); if (QQmlDebugConnector *server = QQmlDebugConnector::instance()) { if (ee) { QV4Debugger *debugger = new QV4Debugger(ee); @@ -720,7 +720,7 @@ void QV4DebugServiceImpl::engineAboutToBeRemoved(QJSEngine *engine) { QMutexLocker lock(&m_configMutex); if (engine){ - const QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); + const QV4::ExecutionEngine *ee = engine->handle(); if (ee) { QV4Debugger *debugger = qobject_cast<QV4Debugger *>(ee->debugger()); if (debugger) diff --git a/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp b/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp index eeedb59ce6..ba33de9714 100644 --- a/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp +++ b/src/plugins/qmltooling/qmldbg_nativedebugger/qqmlnativedebugservice.cpp @@ -713,7 +713,7 @@ void QQmlNativeDebugServiceImpl::engineAboutToBeAdded(QJSEngine *engine) { TRACE_PROTOCOL("Adding engine" << engine); if (engine) { - QV4::ExecutionEngine *ee = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *ee = engine->handle(); TRACE_PROTOCOL("Adding execution engine" << ee); if (ee) { NativeDebugger *debugger = new NativeDebugger(this, ee); @@ -729,7 +729,7 @@ void QQmlNativeDebugServiceImpl::engineAboutToBeRemoved(QJSEngine *engine) { TRACE_PROTOCOL("Removing engine" << engine); if (engine) { - QV4::ExecutionEngine *executionEngine = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *executionEngine = engine->handle(); const auto debuggersCopy = m_debuggers; for (NativeDebugger *debugger : debuggersCopy) { if (debugger->engine() == executionEngine) diff --git a/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp b/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp index 0d69b2ab66..de05ca76a3 100644 --- a/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp +++ b/src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp @@ -126,7 +126,7 @@ void QQmlProfilerServiceImpl::engineAboutToBeAdded(QJSEngine *engine) = new QQmlProfilerAdapter(this, &(enginePrivate->typeLoader)); addEngineProfiler(compileAdapter, engine); } - QV4ProfilerAdapter *v4Adapter = new QV4ProfilerAdapter(this, QV8Engine::getV4(engine->handle())); + QV4ProfilerAdapter *v4Adapter = new QV4ProfilerAdapter(this, engine->handle()); addEngineProfiler(v4Adapter, engine); QQmlConfigurableDebugService<QQmlProfilerService>::engineAboutToBeAdded(engine); } diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp index 836aa8c416..62bddd2509 100644 --- a/src/qml/compiler/qqmltypecompiler.cpp +++ b/src/qml/compiler/qqmltypecompiler.cpp @@ -295,7 +295,7 @@ SignalHandlerConverter::SignalHandlerConverter(QQmlTypeCompiler *typeCompiler) , imports(typeCompiler->imports()) , customParsers(typeCompiler->customParserCache()) , resolvedTypes(typeCompiler->resolvedTypes) - , illegalNames(QV8Engine::get(QQmlEnginePrivate::get(typeCompiler->enginePrivate()))->illegalNames()) + , illegalNames(typeCompiler->enginePrivate()->v8engine()->illegalNames()) , propertyCaches(typeCompiler->propertyCaches()) { } diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index fffb190513..020a83f837 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -290,8 +290,9 @@ QJSEngine::QJSEngine() QJSEngine::QJSEngine(QObject *parent) : QObject(*new QJSEnginePrivate, parent) - , d(new QV8Engine(this)) + , m_v4Engine(new QV4::ExecutionEngine) { + m_v4Engine->v8Engine = new QV8Engine(this, m_v4Engine); checkForApplicationInstance(); QJSEnginePrivate::addToDebugServer(this); @@ -302,8 +303,9 @@ QJSEngine::QJSEngine(QObject *parent) */ QJSEngine::QJSEngine(QJSEnginePrivate &dd, QObject *parent) : QObject(dd, parent) - , d(new QV8Engine(this)) + , m_v4Engine(new QV4::ExecutionEngine) { + m_v4Engine->v8Engine = new QV8Engine(this, m_v4Engine); checkForApplicationInstance(); } @@ -317,11 +319,12 @@ QJSEngine::QJSEngine(QJSEnginePrivate &dd, QObject *parent) QJSEngine::~QJSEngine() { QJSEnginePrivate::removeFromDebugServer(this); - delete d; + delete m_v4Engine->v8Engine; + delete m_v4Engine; } /*! - \fn QV8Engine *QJSEngine::handle() const + \fn QV4::ExecutionEngine *QJSEngine::handle() const \internal */ @@ -338,7 +341,7 @@ QJSEngine::~QJSEngine() */ void QJSEngine::collectGarbage() { - d->m_v4Engine->memoryManager->runGC(); + m_v4Engine->memoryManager->runGC(); } #if QT_DEPRECATED_SINCE(5, 6) @@ -395,12 +398,12 @@ void QJSEngine::installTranslatorFunctions(const QJSValue &object) void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object) { QV4::ExecutionEngine *otherEngine = QJSValuePrivate::engine(&object); - if (otherEngine && otherEngine != d->m_v4Engine) { + if (otherEngine && otherEngine != m_v4Engine) { qWarning("QJSEngine: Trying to install extensions from a different engine"); return; } - QV4::Scope scope(d->m_v4Engine); + QV4::Scope scope(m_v4Engine); QV4::ScopedObject obj(scope); QV4::Value *val = QJSValuePrivate::getValue(&object); if (val) @@ -441,7 +444,7 @@ void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSVal */ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) { - QV4::ExecutionEngine *v4 = d->m_v4Engine; + QV4::ExecutionEngine *v4 = m_v4Engine; QV4::Scope scope(v4); QV4::ScopedValue result(scope); @@ -473,9 +476,9 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in */ QJSValue QJSEngine::newObject() { - QV4::Scope scope(d->m_v4Engine); - QV4::ScopedValue v(scope, d->m_v4Engine->newObject()); - return QJSValue(d->m_v4Engine, v->asReturnedValue()); + QV4::Scope scope(m_v4Engine); + QV4::ScopedValue v(scope, m_v4Engine->newObject()); + return QJSValue(m_v4Engine, v->asReturnedValue()); } /*! @@ -485,12 +488,12 @@ QJSValue QJSEngine::newObject() */ QJSValue QJSEngine::newArray(uint length) { - QV4::Scope scope(d->m_v4Engine); - QV4::ScopedArrayObject array(scope, d->m_v4Engine->newArrayObject()); + QV4::Scope scope(m_v4Engine); + QV4::ScopedArrayObject array(scope, m_v4Engine->newArrayObject()); if (length < 0x1000) array->arrayReserve(length); array->setArrayLengthUnchecked(length); - return QJSValue(d->m_v4Engine, array.asReturnedValue()); + return QJSValue(m_v4Engine, array.asReturnedValue()); } /*! @@ -516,7 +519,7 @@ QJSValue QJSEngine::newArray(uint length) QJSValue QJSEngine::newQObject(QObject *object) { Q_D(QJSEngine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(d); + QV4::ExecutionEngine *v4 = m_v4Engine; QV4::Scope scope(v4); if (object) { QQmlData *ddata = QQmlData::get(object, true); @@ -543,7 +546,7 @@ QJSValue QJSEngine::newQObject(QObject *object) QJSValue QJSEngine::newQMetaObject(const QMetaObject* metaObject) { Q_D(QJSEngine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(d); + QV4::ExecutionEngine *v4 = m_v4Engine; QV4::Scope scope(v4); QV4::ScopedValue v(scope, QV4::QMetaObjectWrapper::create(v4, metaObject)); return QJSValue(v4, v->asReturnedValue()); @@ -571,10 +574,9 @@ QJSValue QJSEngine::newQMetaObject(const QMetaObject* metaObject) { */ QJSValue QJSEngine::globalObject() const { - Q_D(const QJSEngine); - QV4::Scope scope(d->m_v4Engine); - QV4::ScopedValue v(scope, d->m_v4Engine->globalObject); - return QJSValue(d->m_v4Engine, v->asReturnedValue()); + QV4::Scope scope(m_v4Engine); + QV4::ScopedValue v(scope, m_v4Engine->globalObject); + return QJSValue(m_v4Engine, v->asReturnedValue()); } /*! @@ -583,10 +585,9 @@ QJSValue QJSEngine::globalObject() const */ QJSValue QJSEngine::create(int type, const void *ptr) { - Q_D(QJSEngine); - QV4::Scope scope(d->m_v4Engine); + QV4::Scope scope(m_v4Engine); QV4::ScopedValue v(scope, scope.engine->metaTypeToJS(type, ptr)); - return QJSValue(d->m_v4Engine, v->asReturnedValue()); + return QJSValue(m_v4Engine, v->asReturnedValue()); } /*! @@ -726,7 +727,7 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) QJSEnginePrivate *QJSEnginePrivate::get(QV4::ExecutionEngine *e) { - return e->v8Engine->publicEngine()->d_func(); + return e->jsEngine()->d_func(); } QJSEnginePrivate::~QJSEnginePrivate() diff --git a/src/qml/jsapi/qjsengine.h b/src/qml/jsapi/qjsengine.h index 913757107f..89642b6f20 100644 --- a/src/qml/jsapi/qjsengine.h +++ b/src/qml/jsapi/qjsengine.h @@ -52,8 +52,6 @@ QT_BEGIN_NAMESPACE -class QV8Engine; - template <typename T> inline T qjsvalue_cast(const QJSValue &); @@ -111,7 +109,7 @@ public: void installExtensions(Extensions extensions, const QJSValue &object = QJSValue()); - QV8Engine *handle() const { return d; } + QV4::ExecutionEngine *handle() const { return m_v4Engine; } private: QJSValue create(int type, const void *ptr); @@ -124,10 +122,9 @@ protected: QJSEngine(QJSEnginePrivate &dd, QObject *parent = nullptr); private: - QV8Engine *d; + QV4::ExecutionEngine *m_v4Engine; Q_DISABLE_COPY(QJSEngine) Q_DECLARE_PRIVATE(QJSEngine) - friend class QV8Engine; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QJSEngine::Extensions) diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 167a40bc51..85a93ce2e3 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -1552,6 +1552,11 @@ QV4::ReturnedValue ExecutionEngine::metaTypeToJS(int type, const void *data) return 0; } +ReturnedValue ExecutionEngine::global() +{ + return globalObject->asReturnedValue(); +} + // Converts a JS value to a meta-type. // data must point to a place that can store a value of the given type. // Returns true if conversion succeeded, false otherwise. diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 44f57299bb..c048f5f68d 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -494,6 +494,8 @@ public: #endif } + QV4::ReturnedValue global(); + private: #if QT_CONFIG(qml_debug) QScopedPointer<QV4::Debugging::Debugger> m_debugger; diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index 11a1e6edee..a968aa908d 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -84,7 +84,7 @@ QQmlBinding *QQmlBinding::create(const QQmlPropertyData *property, const QQmlScr b->QQmlJavaScriptExpression::setContext(QQmlContextData::get(ctxt ? ctxt : scriptPrivate->context)); b->setScopeObject(obj ? obj : scriptPrivate->scope); - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::get(b->context()->engine)->v4engine(); + QV4::ExecutionEngine *v4 = b->context()->engine->handle(); if (runtimeFunction) { QV4::Scope scope(v4); QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(v4->rootContext(), ctxtdata, b->scopeObject())); @@ -158,13 +158,13 @@ void QQmlBinding::update(QQmlPropertyData::WriteFlags flags) DeleteWatcher watcher(this); - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(context()->engine); - QV4::Scope scope(ep->v4engine()); + QQmlEngine *engine = context()->engine; + QV4::Scope scope(engine->handle()); if (canUseAccessor()) flags.setFlag(QQmlPropertyData::BypassInterceptor); - QQmlBindingProfiler prof(ep->profiler, function()); + QQmlBindingProfiler prof(QQmlEnginePrivate::get(engine)->profiler, function()); doUpdate(watcher, flags, scope); if (!watcher.wasDeleted()) @@ -351,7 +351,7 @@ Q_NEVER_INLINE bool QQmlBinding::slowWrite(const QQmlPropertyData &core, bool isUndefined, QQmlPropertyData::WriteFlags flags) { QQmlEngine *engine = context()->engine; - QV8Engine *v8engine = QQmlEnginePrivate::getV8Engine(engine); + QV4::ExecutionEngine *v4engine = engine->handle(); int type = valueTypeData.isValid() ? valueTypeData.propType() : core.propType(); @@ -362,13 +362,13 @@ Q_NEVER_INLINE bool QQmlBinding::slowWrite(const QQmlPropertyData &core, if (isUndefined) { } else if (core.isQList()) { - value = QV8Engine::getV4(v8engine)->toVariant(result, qMetaTypeId<QList<QObject *> >()); + value = v4engine->toVariant(result, qMetaTypeId<QList<QObject *> >()); } else if (result.isNull() && core.isQObject()) { value = QVariant::fromValue((QObject *)0); } else if (core.propType() == qMetaTypeId<QList<QUrl> >()) { - value = QQmlPropertyPrivate::resolvedUrlSequence(QV8Engine::getV4(v8engine)->toVariant(result, qMetaTypeId<QList<QUrl> >()), context()); + value = QQmlPropertyPrivate::resolvedUrlSequence(v4engine->toVariant(result, qMetaTypeId<QList<QUrl> >()), context()); } else if (!isVarProperty && type != qMetaTypeId<QJSValue>()) { - value = QV8Engine::getV4(v8engine)->toVariant(result, type); + value = v4engine->toVariant(result, type); } if (hasError()) { @@ -397,7 +397,7 @@ Q_NEVER_INLINE bool QQmlBinding::slowWrite(const QQmlPropertyData &core, return false; } QQmlPropertyPrivate::writeValueProperty(m_target.data(), core, valueTypeData, QVariant::fromValue( - QJSValue(QV8Engine::getV4(v8engine), result.asReturnedValue())), + QJSValue(v4engine, result.asReturnedValue())), context(), flags); } else if (isUndefined) { const QLatin1String typeName(QMetaType::typeName(type) @@ -455,12 +455,13 @@ Q_NEVER_INLINE bool QQmlBinding::slowWrite(const QQmlPropertyData &core, QVariant QQmlBinding::evaluate() { - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(context()->engine); + QQmlEngine *engine = context()->engine; + QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); ep->referenceScarceResources(); bool isUndefined = false; - QV4::Scope scope(ep->v4engine()); + QV4::Scope scope(engine->handle()); QV4::ScopedValue result(scope, QQmlJavaScriptExpression::evaluate(&isUndefined)); ep->dereferenceScarceResources(); diff --git a/src/qml/qml/qqmlboundsignal.cpp b/src/qml/qml/qqmlboundsignal.cpp index 1d7a37fc99..501184b630 100644 --- a/src/qml/qml/qqmlboundsignal.cpp +++ b/src/qml/qml/qqmlboundsignal.cpp @@ -74,8 +74,7 @@ QQmlBoundSignalExpression::QQmlBoundSignalExpression(QObject *target, int index, { init(ctxt, scope); - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine()); - QV4::ExecutionEngine *v4 = ep->v4engine(); + QV4::ExecutionEngine *v4 = engine()->handle(); QString function; @@ -123,7 +122,7 @@ QQmlBoundSignalExpression::QQmlBoundSignalExpression(QObject *target, int index, // It's important to call init first, because m_index gets remapped in case of cloned signals. init(ctxt, scope); - QV4::ExecutionEngine *engine = QQmlEnginePrivate::getV4Engine(ctxt->engine); + QV4::ExecutionEngine *engine = ctxt->engine->handle(); QList<QByteArray> signalParameters = QMetaObjectPrivate::signal(m_target->metaObject(), m_index).parameterNames(); if (!signalParameters.isEmpty()) { @@ -182,8 +181,10 @@ void QQmlBoundSignalExpression::evaluate(void **a) if (!expressionFunctionValid()) return; - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine()); - QV4::Scope scope(ep->v4engine()); + QQmlEngine *qmlengine = engine(); + QQmlEnginePrivate *ep = QQmlEnginePrivate::get(qmlengine); + QV4::ExecutionEngine *v4 = qmlengine->handle(); + QV4::Scope scope(v4); ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. @@ -215,7 +216,7 @@ void QQmlBoundSignalExpression::evaluate(void **a) if (!*reinterpret_cast<void* const *>(a[ii + 1])) jsCall->args[ii] = QV4::Primitive::nullValue(); else - jsCall->args[ii] = QV4::QObjectWrapper::wrap(ep->v4engine(), *reinterpret_cast<QObject* const *>(a[ii + 1])); + jsCall->args[ii] = QV4::QObjectWrapper::wrap(v4, *reinterpret_cast<QObject* const *>(a[ii + 1])); } else { jsCall->args[ii] = scope.engine->fromVariant(QVariant(type, a[ii + 1])); } @@ -233,8 +234,9 @@ void QQmlBoundSignalExpression::evaluate(const QList<QVariant> &args) if (!expressionFunctionValid()) return; - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine()); - QV4::Scope scope(ep->v4engine()); + QQmlEngine *qmlengine = engine(); + QQmlEnginePrivate *ep = QQmlEnginePrivate::get(qmlengine); + QV4::Scope scope(qmlengine->handle()); ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. diff --git a/src/qml/qml/qqmlcomponent.cpp b/src/qml/qml/qqmlcomponent.cpp index e3dc3be81e..b175223e13 100644 --- a/src/qml/qml/qqmlcomponent.cpp +++ b/src/qml/qml/qqmlcomponent.cpp @@ -1436,8 +1436,7 @@ void QQmlComponent::incubateObject(QQmlV4Function *args) // XXX used by QSGLoader void QQmlComponentPrivate::initializeObjectWithInitialProperties(QV4::QmlContext *qmlContext, const QV4::Value &valuemap, QObject *toCreate) { - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); - QV4::ExecutionEngine *v4engine = QV8Engine::getV4(ep->v8engine()); + QV4::ExecutionEngine *v4engine = engine->handle(); QV4::Scope scope(v4engine); QV4::ScopedValue object(scope, QV4::QObjectWrapper::wrap(v4engine, toCreate)); diff --git a/src/qml/qml/qqmlcontext.cpp b/src/qml/qml/qqmlcontext.cpp index 9d2e37a2ab..aa1c83d74c 100644 --- a/src/qml/qml/qqmlcontext.cpp +++ b/src/qml/qml/qqmlcontext.cpp @@ -837,7 +837,7 @@ const QV4::IdentifierHash &QQmlContextData::propertyNames() const if (typeCompilationUnit) propertyNameCache = typeCompilationUnit->namedObjectsPerComponent(componentObjectIndex); else - propertyNameCache = QV4::IdentifierHash(QV8Engine::getV4(engine)); + propertyNameCache = QV4::IdentifierHash(engine->handle()); } return propertyNameCache; } diff --git a/src/qml/qml/qqmldelayedcallqueue_p.h b/src/qml/qml/qqmldelayedcallqueue_p.h index b3d361581d..47e211829c 100644 --- a/src/qml/qml/qqmldelayedcallqueue_p.h +++ b/src/qml/qml/qqmldelayedcallqueue_p.h @@ -60,7 +60,6 @@ QT_BEGIN_NAMESPACE -class QV8Engine; class QQmlDelayedCallQueue : public QObject { Q_OBJECT diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index a66bcaa9bd..d93aa6b9b6 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -2080,7 +2080,7 @@ void QQmlEnginePrivate::cleanupScarceResources() // note that the actual SRD is owned by the JS engine, // so we cannot delete the SRD; but we can free the // memory used by the variant in the SRD. - QV4::ExecutionEngine *engine = QV8Engine::getV4(v8engine()); + QV4::ExecutionEngine *engine = v4engine(); while (QV4::ExecutionEngine::ScarceResourceData *sr = engine->scarceResources.first()) { sr->data = QVariant(); engine->scarceResources.remove(sr); diff --git a/src/qml/qml/qqmlengine_p.h b/src/qml/qml/qqmlengine_p.h index 74e232fd84..f12409ed9a 100644 --- a/src/qml/qml/qqmlengine_p.h +++ b/src/qml/qml/qqmlengine_p.h @@ -150,8 +150,8 @@ public: QQmlDelayedError *erroredBindings; int inProgressCreations; - QV8Engine *v8engine() const { return q_func()->handle(); } - QV4::ExecutionEngine *v4engine() const { return QV8Engine::getV4(q_func()->handle()); } + QV8Engine *v8engine() const { return q_func()->handle()->v8Engine; } + QV4::ExecutionEngine *v4engine() const { return q_func()->handle(); } QQuickWorkerScriptEngine *getWorkerScriptEngine(); QQuickWorkerScriptEngine *workerScriptEngine; @@ -295,7 +295,7 @@ inline void QQmlEnginePrivate::dereferenceScarceResources() // expression must have completed. We can safely release the // scarce resources. if (Q_LIKELY(scarceResourcesRefCount == 0)) { - QV4::ExecutionEngine *engine = QV8Engine::getV4(v8engine()); + QV4::ExecutionEngine *engine = v4engine(); if (Q_UNLIKELY(!engine->scarceResources.isEmpty())) { cleanupScarceResources(); } @@ -385,14 +385,14 @@ QV8Engine *QQmlEnginePrivate::getV8Engine(QQmlEngine *e) { Q_ASSERT(e); - return e->d_func()->v8engine(); + return e->handle()->v8Engine; } QV4::ExecutionEngine *QQmlEnginePrivate::getV4Engine(QQmlEngine *e) { Q_ASSERT(e); - return e->d_func()->v4engine(); + return e->handle(); } QQmlEnginePrivate *QQmlEnginePrivate::get(QQmlEngine *e) @@ -428,9 +428,7 @@ QQmlEngine *QQmlEnginePrivate::get(QQmlEnginePrivate *p) QQmlEnginePrivate *QQmlEnginePrivate::get(QV4::ExecutionEngine *e) { - if (!e->v8Engine) - return 0; - QQmlEngine *qmlEngine = e->v8Engine->engine(); + QQmlEngine *qmlEngine = e->qmlEngine(); if (!qmlEngine) return 0; return get(qmlEngine); diff --git a/src/qml/qml/qqmlexpression.cpp b/src/qml/qml/qqmlexpression.cpp index 35dbaccbbe..3ba0afc7bd 100644 --- a/src/qml/qml/qqmlexpression.cpp +++ b/src/qml/qml/qqmlexpression.cpp @@ -74,7 +74,7 @@ void QQmlExpressionPrivate::init(QQmlContextData *ctxt, const QString &expr, QOb void QQmlExpressionPrivate::init(QQmlContextData *ctxt, QV4::Function *runtimeFunction, QObject *me) { expressionFunctionValid = true; - QV4::ExecutionEngine *engine = QQmlEnginePrivate::getV4Engine(ctxt->engine); + QV4::ExecutionEngine *engine = ctxt->engine->handle(); QV4::Scope scope(engine); QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(engine->rootContext(), ctxt, me)); setupFunction(qmlContext, runtimeFunction); @@ -266,13 +266,14 @@ QVariant QQmlExpressionPrivate::value(bool *isUndefined) return QVariant(); } - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(q->engine()); + QQmlEngine *engine = q->engine(); + QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); QVariant rv; ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. { - QV4::Scope scope(QV8Engine::getV4(ep->v8engine())); + QV4::Scope scope(engine->handle()); QV4::ScopedValue result(scope, v4value(isUndefined)); if (!hasError()) rv = scope.engine->toVariant(result, -1); diff --git a/src/qml/qml/qqmljavascriptexpression.cpp b/src/qml/qml/qqmljavascriptexpression.cpp index 006611e089..cd35ab93c6 100644 --- a/src/qml/qml/qqmljavascriptexpression.cpp +++ b/src/qml/qml/qqmljavascriptexpression.cpp @@ -183,7 +183,7 @@ void QQmlJavaScriptExpression::refresh() QV4::ReturnedValue QQmlJavaScriptExpression::evaluate(bool *isUndefined) { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(m_context->engine); + QV4::ExecutionEngine *v4 = m_context->engine->handle(); QV4::Scope scope(v4); QV4::JSCallData jsCall(scope); @@ -217,7 +217,7 @@ QV4::ReturnedValue QQmlJavaScriptExpression::evaluate(QV4::CallData *callData, b if (notifyOnValueChanged()) capture.guards.copyAndClearPrepend(activeGuards); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine()); + QV4::ExecutionEngine *v4 = m_context->engine->handle(); callData->thisObject = v4->globalObject; if (scopeObject()) { QV4::ReturnedValue scope = QV4::QObjectWrapper::wrap(v4, scopeObject()); @@ -414,7 +414,7 @@ QQmlJavaScriptExpression::evalFunction(QQmlContextData *ctxt, QObject *scopeObje QQmlEngine *engine = ctxt->engine; QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine()); + QV4::ExecutionEngine *v4 = engine->handle(); QV4::Scope scope(v4); QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(v4->rootContext(), ctxt, scopeObject)); @@ -444,7 +444,7 @@ void QQmlJavaScriptExpression::createQmlBinding(QQmlContextData *ctxt, QObject * QQmlEngine *engine = ctxt->engine; QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(ep->v8engine()); + QV4::ExecutionEngine *v4 = engine->handle(); QV4::Scope scope(v4); QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(v4->rootContext(), ctxt, qmlScope)); diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp index 8d17ae3233..1c3e24fe02 100644 --- a/src/qml/qml/qqmlobjectcreator.cpp +++ b/src/qml/qml/qqmlobjectcreator.cpp @@ -114,7 +114,7 @@ void QQmlObjectCreator::init(QQmlContextData *providedParentContext) { parentContext = providedParentContext; engine = parentContext->engine; - v4 = QV8Engine::getV4(engine); + v4 = engine->handle(); if (compilationUnit && !compilationUnit->engine) compilationUnit->linkToEngine(v4); @@ -1024,7 +1024,7 @@ bool QQmlObjectCreator::setPropertyBinding(const QQmlPropertyData *property, con } else if (property->propType() == QMetaType::QVariant) { if (property->isVarProperty()) { QV4::Scope scope(v4); - QV4::ScopedValue wrappedObject(scope, QV4::QObjectWrapper::wrap(QV8Engine::getV4(engine), createdSubObject)); + QV4::ScopedValue wrappedObject(scope, QV4::QObjectWrapper::wrap(engine->handle(), createdSubObject)); _vmeMetaObject->setVMEProperty(property->coreIndex(), wrappedObject); } else { QVariant value = QVariant::fromValue(createdSubObject); diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index fab5cf6c1f..2afcf1da3e 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -1524,7 +1524,7 @@ void QQmlTypeLoader::Blob::dependencyComplete(QQmlDataBlob *blob) bool QQmlTypeLoader::Blob::isDebugging() const { - return QV8Engine::getV4(typeLoader()->engine())->debugger() != 0; + return typeLoader()->engine()->handle()->debugger() != 0; } bool QQmlTypeLoader::Blob::qmldirDataAvailable(QQmlQmldirData *data, QList<QQmlError> *errors) @@ -2097,7 +2097,7 @@ bool QQmlTypeData::tryLoadFromDiskCache() if (isDebugging()) return false; - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(typeLoader()->engine()); + QV4::ExecutionEngine *v4 = typeLoader()->engine()->handle(); if (!v4) return false; @@ -2440,7 +2440,7 @@ bool QQmlTypeData::loadFromSource() m_document.reset(new QmlIR::Document(isDebugging())); m_document->jsModule.sourceTimeStamp = m_backupSourceCode.sourceTimeStamp(); QQmlEngine *qmlEngine = typeLoader()->engine(); - QmlIR::IRBuilder compiler(QV8Engine::get(qmlEngine)->illegalNames()); + QmlIR::IRBuilder compiler(qmlEngine->handle()->v8Engine->illegalNames()); QString sourceError; const QString source = m_backupSourceCode.readAll(&sourceError); @@ -2828,9 +2828,7 @@ void QQmlScriptData::initialize(QQmlEngine *engine) Q_ASSERT(engine); Q_ASSERT(!hasEngine()); - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); - QV8Engine *v8engine = ep->v8engine(); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(v8engine); + QV4::ExecutionEngine *v4 = engine->handle(); m_program = new QV4::Script(v4, 0, m_precompiledScript); @@ -2846,7 +2844,7 @@ QV4::ReturnedValue QQmlScriptData::scriptValueForContext(QQmlContextData *parent Q_ASSERT(parentCtxt && parentCtxt->engine); QQmlEnginePrivate *ep = QQmlEnginePrivate::get(parentCtxt->engine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(parentCtxt->engine); + QV4::ExecutionEngine *v4 = parentCtxt->engine->handle(); QV4::Scope scope(v4); bool shared = m_precompiledScript->data->flags & QV4::CompiledData::Unit::IsSharedLibrary; diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 281d64ac79..73cb20dc7f 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -926,12 +926,14 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void * id -= plainSignals; if (id < methodCount) { - if (!ctxt->engine) + QQmlEngine *engine = ctxt->engine; + if (!engine) return -1; // We can't run the method - QQmlEnginePrivate *ep = QQmlEnginePrivate::get(ctxt->engine); + QQmlEnginePrivate *ep = QQmlEnginePrivate::get(engine); + QV4::ExecutionEngine *v4 = engine->handle(); ep->referenceScarceResources(); // "hold" scarce resources in memory during evaluation. - QV4::Scope scope(ep->v4engine()); + QV4::Scope scope(v4); QV4::ScopedFunctionObject function(scope, method(id)); @@ -951,7 +953,7 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void * const unsigned int parameterCount = function->formalParameterCount(); QV4::JSCallData jsCallData(scope, parameterCount); - *jsCallData->thisObject = ep->v8engine()->global(); + *jsCallData->thisObject = v4->global(); for (uint ii = 0; ii < parameterCount; ++ii) jsCallData->args[ii] = scope.engine->fromVariant(*(QVariant *)a[ii + 1]); diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp index f2b396ad00..44ad174f37 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions.cpp +++ b/src/qml/qml/v8/qqmlbuiltinfunctions.cpp @@ -1116,8 +1116,7 @@ ReturnedValue QtObject::method_createQmlObject(const FunctionObject *b, const Va } }; - QV8Engine *v8engine = scope.engine->v8Engine; - QQmlEngine *engine = v8engine->engine(); + QQmlEngine *engine = scope.engine->qmlEngine(); QQmlContextData *context = scope.engine->callingQmlContext(); Q_ASSERT(context); @@ -1244,8 +1243,7 @@ ReturnedValue QtObject::method_createComponent(const FunctionObject *b, const Va if (argc < 1 || argc > 3) THROW_GENERIC_ERROR("Qt.createComponent(): Invalid arguments"); - QV8Engine *v8engine = scope.engine->v8Engine; - QQmlEngine *engine = v8engine->engine(); + QQmlEngine *engine = scope.engine->qmlEngine(); QQmlContextData *context = scope.engine->callingQmlContext(); Q_ASSERT(context); diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index 2947f7870a..2bf623f144 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -123,9 +123,10 @@ static void restoreJSValue(QDataStream &stream, void *data) } } -QV8Engine::QV8Engine(QJSEngine* qq) +QV8Engine::QV8Engine(QJSEngine *qq, QV4::ExecutionEngine *v4) : q(qq) , m_engine(0) + , m_v4Engine(v4) , m_xmlHttpRequestData(0) { #ifdef Q_PROCESSOR_X86_32 @@ -146,8 +147,6 @@ QV8Engine::QV8Engine(QJSEngine* qq) QMetaType::registerConverter<QJSValue, QStringList>(convertJSValueToVariantType<QStringList>); QMetaType::registerStreamOperators(qMetaTypeId<QJSValue>(), saveJSValue, restoreJSValue); - m_v4Engine = new QV4::ExecutionEngine; - m_v4Engine->v8Engine = this; m_delayedCallQueue.init(m_v4Engine); QV4::QObjectWrapper::initializeBindings(m_v4Engine); @@ -162,8 +161,6 @@ QV8Engine::~QV8Engine() qt_rem_qmlxmlhttprequest(m_v4Engine, m_xmlHttpRequestData); m_xmlHttpRequestData = 0; #endif - - delete m_v4Engine; } #if QT_CONFIG(qml_network) @@ -288,11 +285,6 @@ void QV8Engine::setEngine(QQmlEngine *engine) initQmlGlobalObject(); } -QV4::ReturnedValue QV8Engine::global() -{ - return m_v4Engine->globalObject->asReturnedValue(); -} - void QV8Engine::startTimer(const QString &timerName) { if (!m_time.isValid()) diff --git a/src/qml/qml/v8/qv8engine_p.h b/src/qml/qml/v8/qv8engine_p.h index 98b182147c..eb2b8b474c 100644 --- a/src/qml/qml/v8/qv8engine_p.h +++ b/src/qml/qml/v8/qv8engine_p.h @@ -153,12 +153,11 @@ class Q_QML_PRIVATE_EXPORT QV8Engine { friend class QJSEngine; public: - static QV8Engine* get(QJSEngine* q) { Q_ASSERT(q); return q->handle(); } // static QJSEngine* get(QV8Engine* d) { Q_ASSERT(d); return d->q; } - static QV4::ExecutionEngine *getV4(QJSEngine *q) { return q->handle()->m_v4Engine; } + static QV4::ExecutionEngine *getV4(QJSEngine *q) { return q->handle(); } static QV4::ExecutionEngine *getV4(QV8Engine *d) { return d->m_v4Engine; } - QV8Engine(QJSEngine* qq); + QV8Engine(QJSEngine* qq, QV4::ExecutionEngine *v4); virtual ~QV8Engine(); // This enum should be in sync with QQmlEngine::ObjectOwnership @@ -172,7 +171,6 @@ public: void setEngine(QQmlEngine *engine); QQmlEngine *engine() { return m_engine; } QJSEngine *publicEngine() { return q; } - QV4::ReturnedValue global(); QQmlDelayedCallQueue *delayedCallQueue() { return &m_delayedCallQueue; } void *xmlHttpRequestData() const { return m_xmlHttpRequestData; } diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp index fa1be563b5..0e2de0da7a 100644 --- a/src/qml/types/qqmldelegatemodel.cpp +++ b/src/qml/types/qqmldelegatemodel.cpp @@ -128,7 +128,8 @@ public: QQmlDelegateModelEngineData(QV4::ExecutionEngine *v4); ~QQmlDelegateModelEngineData(); - QV4::ReturnedValue array(QV8Engine *engine, const QVector<QQmlChangeSet::Change> &changes); + QV4::ReturnedValue array(QV4::ExecutionEngine *engine, + const QVector<QQmlChangeSet::Change> &changes); QV4::PersistentValue changeProto; }; @@ -325,7 +326,7 @@ void QQmlDelegateModel::componentComplete() } d->m_cacheMetaType = new QQmlDelegateModelItemMetaType( - QQmlEnginePrivate::getV8Engine(d->m_context->engine()), this, groupNames); + d->m_context->engine()->handle(), this, groupNames); d->m_compositor.setGroupCount(d->m_groupCount); d->m_compositor.setDefaultGroups(defaultGroups); @@ -1481,7 +1482,7 @@ void QQmlDelegateModelPrivate::emitChanges() return; m_transaction = true; - QV8Engine *engine = QQmlEnginePrivate::getV8Engine(m_context->engine()); + QV4::ExecutionEngine *engine = m_context->engine()->handle(); for (int i = 1; i < m_groupCount; ++i) QQmlDelegateModelGroupPrivate::get(m_groups[i])->emitChanges(engine); m_transaction = false; @@ -1676,10 +1677,10 @@ bool QQmlDelegateModelPrivate::insert(Compositor::insert_iterator &before, const //============================================================================ QQmlDelegateModelItemMetaType::QQmlDelegateModelItemMetaType( - QV8Engine *engine, QQmlDelegateModel *model, const QStringList &groupNames) + QV4::ExecutionEngine *engine, QQmlDelegateModel *model, const QStringList &groupNames) : model(model) , groupCount(groupNames.count() + 1) - , v8Engine(engine) + , v4Engine(engine) , metaObject(0) , groupNames(groupNames) { @@ -1720,37 +1721,36 @@ void QQmlDelegateModelItemMetaType::initializeMetaObject() void QQmlDelegateModelItemMetaType::initializePrototype() { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(v8Engine); - QV4::Scope scope(v4); + QV4::Scope scope(v4Engine); - QV4::ScopedObject proto(scope, v4->newObject()); + QV4::ScopedObject proto(scope, v4Engine->newObject()); proto->defineAccessorProperty(QStringLiteral("model"), QQmlDelegateModelItem::get_model, 0); proto->defineAccessorProperty(QStringLiteral("groups"), QQmlDelegateModelItem::get_groups, QQmlDelegateModelItem::set_groups); QV4::ScopedString s(scope); QV4::ScopedProperty p(scope); - s = v4->newString(QStringLiteral("isUnresolved")); + s = v4Engine->newString(QStringLiteral("isUnresolved")); QV4::ScopedFunctionObject f(scope); QV4::ExecutionContext *global = scope.engine->rootContext(); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, 30, QQmlDelegateModelItem::get_member))); p->setSetter(0); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); - s = v4->newString(QStringLiteral("inItems")); + s = v4Engine->newString(QStringLiteral("inItems")); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, QQmlListCompositor::Default, QQmlDelegateModelItem::get_member))); p->setSetter((f = QV4::DelegateModelGroupFunction::create(global, QQmlListCompositor::Default, QQmlDelegateModelItem::set_member))); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); - s = v4->newString(QStringLiteral("inPersistedItems")); + s = v4Engine->newString(QStringLiteral("inPersistedItems")); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, QQmlListCompositor::Persisted, QQmlDelegateModelItem::get_member))); p->setSetter((f = QV4::DelegateModelGroupFunction::create(global, QQmlListCompositor::Persisted, QQmlDelegateModelItem::set_member))); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); - s = v4->newString(QStringLiteral("itemsIndex")); + s = v4Engine->newString(QStringLiteral("itemsIndex")); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, QQmlListCompositor::Default, QQmlDelegateModelItem::get_index))); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); - s = v4->newString(QStringLiteral("persistedItemsIndex")); + s = v4Engine->newString(QStringLiteral("persistedItemsIndex")); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, QQmlListCompositor::Persisted, QQmlDelegateModelItem::get_index))); p->setSetter(0); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); @@ -1758,19 +1758,19 @@ void QQmlDelegateModelItemMetaType::initializePrototype() for (int i = 2; i < groupNames.count(); ++i) { QString propertyName = QLatin1String("in") + groupNames.at(i); propertyName.replace(2, 1, propertyName.at(2).toUpper()); - s = v4->newString(propertyName); + s = v4Engine->newString(propertyName); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, i + 1, QQmlDelegateModelItem::get_member))); p->setSetter((f = QV4::DelegateModelGroupFunction::create(global, i + 1, QQmlDelegateModelItem::set_member))); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); } for (int i = 2; i < groupNames.count(); ++i) { const QString propertyName = groupNames.at(i) + QLatin1String("Index"); - s = v4->newString(propertyName); + s = v4Engine->newString(propertyName); p->setGetter((f = QV4::DelegateModelGroupFunction::create(global, i + 1, QQmlDelegateModelItem::get_index))); p->setSetter(0); proto->insertMember(s, p, QV4::Attr_Accessor|QV4::Attr_NotConfigurable|QV4::Attr_NotEnumerable); } - modelItemProto.set(v4, proto); + modelItemProto.set(v4Engine, proto); } int QQmlDelegateModelItemMetaType::parseGroups(const QStringList &groups) const @@ -1787,7 +1787,7 @@ int QQmlDelegateModelItemMetaType::parseGroups(const QStringList &groups) const int QQmlDelegateModelItemMetaType::parseGroups(const QV4::Value &groups) const { int groupFlags = 0; - QV4::Scope scope(QV8Engine::getV4(v8Engine)); + QV4::Scope scope(v4Engine); QV4::ScopedString s(scope, groups); if (s) { @@ -1907,7 +1907,7 @@ void QV4::Heap::QQmlDelegateModelItemObject::destroy() QQmlDelegateModelItem::QQmlDelegateModelItem( QQmlDelegateModelItemMetaType *metaType, int modelIndex) - : v4(QV8Engine::getV4(metaType->v8Engine)) + : v4(metaType->v4Engine) , metaType(metaType) , contextData(0) , object(0) @@ -2245,13 +2245,13 @@ bool QQmlDelegateModelGroupPrivate::isChangedConnected() IS_SIGNAL_CONNECTED(q, QQmlDelegateModelGroup, changed, (const QQmlV4Handle &,const QQmlV4Handle &)); } -void QQmlDelegateModelGroupPrivate::emitChanges(QV8Engine *engine) +void QQmlDelegateModelGroupPrivate::emitChanges(QV4::ExecutionEngine *v4) { Q_Q(QQmlDelegateModelGroup); if (isChangedConnected() && !changeSet.isEmpty()) { - QV4::Scope scope(QV8Engine::getV4(engine)); - QV4::ScopedValue removed(scope, engineData(scope.engine)->array(engine, changeSet.removes())); - QV4::ScopedValue inserted(scope, engineData(scope.engine)->array(engine, changeSet.inserts())); + QV4::Scope scope(v4); + QV4::ScopedValue removed(scope, engineData(scope.engine)->array(v4, changeSet.removes())); + QV4::ScopedValue inserted(scope, engineData(scope.engine)->array(v4, changeSet.inserts())); emit q->changed(QQmlV4Handle(removed), QQmlV4Handle(inserted)); } if (changeSet.difference() != 0) @@ -2480,8 +2480,7 @@ QQmlV4Handle QQmlDelegateModelGroup::get(int index) if (model->m_cacheMetaType->modelItemProto.isUndefined()) model->m_cacheMetaType->initializePrototype(); - QV8Engine *v8 = model->m_cacheMetaType->v8Engine; - QV4::ExecutionEngine *v4 = QV8Engine::getV4(v8); + QV4::ExecutionEngine *v4 = model->m_cacheMetaType->v4Engine; QV4::Scope scope(v4); QV4::ScopedObject o(scope, v4->memoryManager->allocObject<QQmlDelegateModelItemObject>(cacheItem)); QV4::ScopedObject p(scope, model->m_cacheMetaType->modelItemProto.value()); @@ -3347,9 +3346,9 @@ QQmlDelegateModelEngineData::~QQmlDelegateModelEngineData() { } -QV4::ReturnedValue QQmlDelegateModelEngineData::array(QV8Engine *engine, const QVector<QQmlChangeSet::Change> &changes) +QV4::ReturnedValue QQmlDelegateModelEngineData::array(QV4::ExecutionEngine *v4, + const QVector<QQmlChangeSet::Change> &changes) { - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); QV4::Scope scope(v4); QV4::ScopedObject o(scope, QQmlDelegateModelGroupChangeArray::create(v4, changes)); return o.asReturnedValue(); diff --git a/src/qml/types/qqmldelegatemodel_p_p.h b/src/qml/types/qqmldelegatemodel_p_p.h index 537937df57..7b60bcddc0 100644 --- a/src/qml/types/qqmldelegatemodel_p_p.h +++ b/src/qml/types/qqmldelegatemodel_p_p.h @@ -69,7 +69,7 @@ class QQmlDelegateModelAttachedMetaObject; class QQmlDelegateModelItemMetaType : public QQmlRefCount { public: - QQmlDelegateModelItemMetaType(QV8Engine *engine, QQmlDelegateModel *model, const QStringList &groupNames); + QQmlDelegateModelItemMetaType(QV4::ExecutionEngine *engine, QQmlDelegateModel *model, const QStringList &groupNames); ~QQmlDelegateModelItemMetaType(); void initializeMetaObject(); @@ -80,7 +80,7 @@ public: QPointer<QQmlDelegateModel> model; const int groupCount; - QV8Engine * const v8Engine; + QV4::ExecutionEngine * const v4Engine; QQmlDelegateModelAttachedMetaObject *metaObject; const QStringList groupNames; QV4::PersistentValue modelItemProto; @@ -220,7 +220,7 @@ public: void setModel(QQmlDelegateModel *model, Compositor::Group group); bool isChangedConnected(); - void emitChanges(QV8Engine *engine); + void emitChanges(QV4::ExecutionEngine *engine); void emitModelUpdated(bool reset); void createdPackage(int index, QQuickPackage *package); diff --git a/src/qml/types/qqmllistmodel.cpp b/src/qml/types/qqmllistmodel.cpp index 3e477edc07..299de8de70 100644 --- a/src/qml/types/qqmllistmodel.cpp +++ b/src/qml/types/qqmllistmodel.cpp @@ -1865,7 +1865,7 @@ QQmlListModel *QQmlListModel::createWithOwner(QQmlListModel *newOwner) QV4::ExecutionEngine *QQmlListModel::engine() const { if (m_engine == 0) { - m_engine = QQmlEnginePrivate::get(qmlEngine(this))->v4engine(); + m_engine = qmlEngine(this)->handle(); } return m_engine; @@ -2682,7 +2682,7 @@ void QQmlListModelParser::applyBindings(QObject *obj, QV4::CompiledData::Compila { QQmlListModel *rv = static_cast<QQmlListModel *>(obj); - rv->m_engine = QV8Engine::getV4(qmlEngine(rv)); + rv->m_engine = qmlEngine(rv)->handle(); const QV4::CompiledData::Unit *qmlUnit = compilationUnit->data; diff --git a/src/qml/types/qquickworkerscript.cpp b/src/qml/types/qquickworkerscript.cpp index 231c0fa810..32c0c86ff6 100644 --- a/src/qml/types/qquickworkerscript.cpp +++ b/src/qml/types/qquickworkerscript.cpp @@ -201,7 +201,7 @@ private: }; QQuickWorkerScriptEnginePrivate::WorkerEngine::WorkerEngine(QQuickWorkerScriptEnginePrivate *parent) -: QV8Engine(0), p(parent) + : QV8Engine(nullptr, new QV4::ExecutionEngine), p(parent) #if QT_CONFIG(qml_network) , accessManager(0) #endif @@ -214,6 +214,7 @@ QQuickWorkerScriptEnginePrivate::WorkerEngine::~WorkerEngine() #if QT_CONFIG(qml_network) delete accessManager; #endif + delete m_v4Engine; } void QQuickWorkerScriptEnginePrivate::WorkerEngine::init() @@ -250,7 +251,7 @@ void QQuickWorkerScriptEnginePrivate::WorkerEngine::init() QQuickWorkerScriptEnginePrivate::method_sendMessage)); QV4::JSCallData jsCallData(scope, 1); jsCallData->args[0] = function; - *jsCallData->thisObject = global(); + *jsCallData->thisObject = m_v4Engine->global(); createsend.set(scope.engine, createsendconstructor->call(jsCallData)); } @@ -267,7 +268,7 @@ QV4::ReturnedValue QQuickWorkerScriptEnginePrivate::WorkerEngine::sendFunction(i QV4::ScopedValue v(scope); QV4::JSCallData jsCallData(scope, 1); jsCallData->args[0] = QV4::Primitive::fromInt32(id); - *jsCallData->thisObject = global(); + *jsCallData->thisObject = m_v4Engine->global(); v = f->call(jsCallData); if (scope.hasException()) v = scope.engine->catchException(); @@ -367,7 +368,7 @@ void QQuickWorkerScriptEnginePrivate::processMessage(int id, const QByteArray &d Q_ASSERT(!!qmlContext); QV4::JSCallData jsCallData(scope, 2); - *jsCallData->thisObject = workerEngine->global(); + *jsCallData->thisObject = v4->global(); jsCallData->args[0] = qmlContext->d()->qml(); // ### jsCallData->args[1] = value; f->call(jsCallData); @@ -730,8 +731,7 @@ bool QQuickWorkerScript::event(QEvent *event) QQmlEngine *engine = qmlEngine(this); if (engine) { WorkerDataEvent *workerEvent = static_cast<WorkerDataEvent *>(event); - QV8Engine *v8engine = QQmlEnginePrivate::get(engine)->v8engine(); - QV4::Scope scope(QV8Engine::getV4(v8engine)); + QV4::Scope scope(engine->handle()); QV4::ScopedValue value(scope, QV4::Serialize::deserialize(workerEvent->data(), scope.engine)); emit message(QQmlV4Handle(value)); } diff --git a/src/qmltest/quicktestresult.cpp b/src/qmltest/quicktestresult.cpp index 8a2282f5c6..d7d692a80d 100644 --- a/src/qmltest/quicktestresult.cpp +++ b/src/qmltest/quicktestresult.cpp @@ -143,7 +143,7 @@ public Q_SLOTS: QImageWriter writer(filePath); if (!writer.write(m_image)) { QQmlEngine *engine = qmlContext(this)->engine(); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine->handle()); + QV4::ExecutionEngine *v4 = engine->handle(); v4->throwError(QStringLiteral("Can't save to %1: %2").arg(filePath, writer.errorString())); } } diff --git a/src/quick/designer/qqmldesignermetaobject.cpp b/src/quick/designer/qqmldesignermetaobject.cpp index 33ea442b76..63364192c6 100644 --- a/src/quick/designer/qqmldesignermetaobject.cpp +++ b/src/quick/designer/qqmldesignermetaobject.cpp @@ -127,7 +127,7 @@ void QQmlDesignerMetaObject::init(QObject *object, QQmlEngine *engine) } QQmlDesignerMetaObject::QQmlDesignerMetaObject(QObject *object, QQmlEngine *engine) - : QQmlVMEMetaObject(QQmlEnginePrivate::getV4Engine(engine), object, cacheForObject(object, engine), /*qml compilation unit*/nullptr, /*qmlObjectId*/-1), + : QQmlVMEMetaObject(engine->handle(), object, cacheForObject(object, engine), /*qml compilation unit*/nullptr, /*qmlObjectId*/-1), m_context(engine->contextForObject(object)), m_data(new MetaPropertyData) { diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index 57936d8cec..0739889e67 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -727,7 +727,7 @@ void QQuickCanvasItem::updatePolish() QMap<int, QV4::PersistentValue> animationCallbacks = d->animationCallbacks; d->animationCallbacks.clear(); - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(qmlEngine(this)); + QV4::ExecutionEngine *v4 = qmlEngine(this)->handle(); QV4::Scope scope(v4); QV4::ScopedFunctionObject function(scope); QV4::JSCallData jsCall(scope, 1); @@ -1210,7 +1210,7 @@ void QQuickCanvasItem::initializeContext(QQuickCanvasContext *context, const QVa d->context = context; d->context->init(this, args); - d->context->setV4Engine(QQmlEnginePrivate::get(qmlEngine(this))->v4engine()); + d->context->setV4Engine(qmlEngine(this)->handle()); connect(d->context, SIGNAL(textureChanged()), SLOT(update())); connect(d->context, SIGNAL(textureChanged()), SIGNAL(painted())); emit contextChanged(); diff --git a/src/quick/items/qquickloader.cpp b/src/quick/items/qquickloader.cpp index 27b8d32707..42dd532d91 100644 --- a/src/quick/items/qquickloader.cpp +++ b/src/quick/items/qquickloader.cpp @@ -662,7 +662,7 @@ void QQuickLoaderPrivate::setInitialState(QObject *obj) QQmlComponentPrivate *d = QQmlComponentPrivate::get(component); Q_ASSERT(d && d->engine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(d->engine); + QV4::ExecutionEngine *v4 = d->engine->handle(); Q_ASSERT(v4); QV4::Scope scope(v4); QV4::ScopedValue ipv(scope, initialPropertyValues.value()); diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp index 9a29d6c2ca..ff9789ad57 100644 --- a/src/quick/items/qquickview.cpp +++ b/src/quick/items/qquickview.cpp @@ -70,7 +70,7 @@ void QQuickViewPrivate::init(QQmlEngine* e) { // The content item has CppOwnership policy (set in QQuickWindow). Ensure the presence of a JS // wrapper so that the garbage collector can see the policy. - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine.data()); + QV4::ExecutionEngine *v4 = engine.data()->handle(); QV4::QObjectWrapper::wrap(v4, contentItem); } } diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index 45e3f0004d..ebf5809658 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -112,7 +112,7 @@ void QQuickWindowQmlImpl::classBegin() { // The content item has CppOwnership policy (set in QQuickWindow). Ensure the presence of a JS // wrapper so that the garbage collector can see the policy. - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(e); + QV4::ExecutionEngine *v4 = e->handle(); QV4::QObjectWrapper::wrap(v4, d->contentItem); } } diff --git a/src/quick/util/qquickpropertychanges.cpp b/src/quick/util/qquickpropertychanges.cpp index 4a9b4a95c1..96b2e0f7a0 100644 --- a/src/quick/util/qquickpropertychanges.cpp +++ b/src/quick/util/qquickpropertychanges.cpp @@ -454,7 +454,7 @@ QQuickPropertyChanges::ActionList QQuickPropertyChanges::actions() QQmlBinding *newBinding = 0; if (e.id != QQmlBinding::Invalid) { - QV4::Scope scope(QQmlEnginePrivate::getV4Engine(qmlEngine(this))); + QV4::Scope scope(qmlEngine(this)->handle()); QV4::Scoped<QV4::QmlContext> qmlContext(scope, QV4::QmlContext::create(scope.engine->rootContext(), context, object())); newBinding = QQmlBinding::create(&QQmlPropertyPrivate::get(prop)->core, d->compilationUnit->runtimeFunctions.at(e.id), object(), context, qmlContext); |