diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-06-23 12:10:23 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-08-02 16:32:46 +0000 |
commit | db1034d093d76b4b6e66fcdd178800e0cf9d1005 (patch) | |
tree | d486a7b602a00e38dc504f70e86830683a8d04fe /src/qml/qml/qqmlvmemetaobject.cpp | |
parent | 49a11e882059ee1729f776722e085dd21d378c36 (diff) |
Move the engine pointer from the property cache to the VME meta object
This is where it belongs, and it makes the PropertyCache independent
of the engine used.
Task-number: QTBUG-61536
Change-Id: I21c2674ee3e2895abd2418764d140b154b47b868
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject.cpp')
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 71 |
1 files changed, 35 insertions, 36 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 490a4e19ab..1638b5d272 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -311,24 +311,25 @@ QAbstractDynamicMetaObject *QQmlInterceptorMetaObject::toDynamicMetaObject(QObje return this; } -QQmlVMEMetaObject::QQmlVMEMetaObject(QObject *obj, +QQmlVMEMetaObject::QQmlVMEMetaObject(QV4::ExecutionEngine *engine, + QObject *obj, QQmlPropertyCache *cache, QV4::CompiledData::CompilationUnit *qmlCompilationUnit, int qmlObjectId) : QQmlInterceptorMetaObject(obj, cache), + engine(engine), ctxt(QQmlData::get(obj, true)->outerContext), aliasEndpoints(0), compilationUnit(qmlCompilationUnit), compiledObject(0) { + Q_ASSERT(engine); QQmlData::get(obj)->hasVMEMetaObject = true; if (compilationUnit && qmlObjectId >= 0) { compiledObject = compilationUnit->data->objectAt(qmlObjectId); if (compiledObject->nProperties || compiledObject->nFunctions) { - Q_ASSERT(cache && cache->engine); - QV4::ExecutionEngine *v4 = cache->engine; uint size = compiledObject->nProperties + compiledObject->nFunctions; if (size) { - QV4::Heap::MemberData *data = QV4::MemberData::allocate(v4, size); - propertyAndMethodStorage.set(v4, data); + QV4::Heap::MemberData *data = QV4::MemberData::allocate(engine, size); + propertyAndMethodStorage.set(engine, data); std::fill(data->data, data->data + data->size, QV4::Encode::undefined()); } @@ -385,56 +386,56 @@ void QQmlVMEMetaObject::writeProperty(int id, const QString& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newString(v); + *(md->data() + id) = engine->newString(v); } void QQmlVMEMetaObject::writeProperty(int id, const QUrl& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newVariantObject(QVariant::fromValue(v)); + *(md->data() + id) = engine->newVariantObject(QVariant::fromValue(v)); } void QQmlVMEMetaObject::writeProperty(int id, const QDate& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newVariantObject(QVariant::fromValue(v)); + *(md->data() + id) = engine->newVariantObject(QVariant::fromValue(v)); } void QQmlVMEMetaObject::writeProperty(int id, const QDateTime& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newVariantObject(QVariant::fromValue(v)); + *(md->data() + id) = engine->newVariantObject(QVariant::fromValue(v)); } void QQmlVMEMetaObject::writeProperty(int id, const QPointF& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newVariantObject(QVariant::fromValue(v)); + *(md->data() + id) = engine->newVariantObject(QVariant::fromValue(v)); } void QQmlVMEMetaObject::writeProperty(int id, const QSizeF& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newVariantObject(QVariant::fromValue(v)); + *(md->data() + id) = engine->newVariantObject(QVariant::fromValue(v)); } void QQmlVMEMetaObject::writeProperty(int id, const QRectF& v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = cache->engine->newVariantObject(QVariant::fromValue(v)); + *(md->data() + id) = engine->newVariantObject(QVariant::fromValue(v)); } void QQmlVMEMetaObject::writeProperty(int id, QObject* v) { QV4::MemberData *md = propertyAndMethodStorageAsMemberData(); if (md) - *(md->data() + id) = QV4::QObjectWrapper::wrap(cache->engine, v); + *(md->data() + id) = QV4::QObjectWrapper::wrap(engine, v); QQmlVMEVariantQObjectPtr *guard = getQObjectGuardForProperty(id); if (v && !guard) { @@ -451,7 +452,7 @@ int QQmlVMEMetaObject::readPropertyAsInt(int id) const if (!md) return 0; - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); if (!sv->isInt32()) return 0; @@ -464,7 +465,7 @@ bool QQmlVMEMetaObject::readPropertyAsBool(int id) const if (!md) return false; - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); if (!sv->isBoolean()) return false; @@ -477,7 +478,7 @@ double QQmlVMEMetaObject::readPropertyAsDouble(int id) const if (!md) return 0.0; - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); if (!sv->isDouble()) return 0.0; @@ -490,7 +491,7 @@ QString QQmlVMEMetaObject::readPropertyAsString(int id) const if (!md) return QString(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); if (QV4::String *s = sv->stringValue()) return s->toQString(); @@ -503,7 +504,7 @@ QUrl QQmlVMEMetaObject::readPropertyAsUrl(int id) const if (!md) return QUrl(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); if (!v || v->d()->data().type() != QVariant::Url) @@ -517,7 +518,7 @@ QDate QQmlVMEMetaObject::readPropertyAsDate(int id) const if (!md) return QDate(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); if (!v || v->d()->data().type() != QVariant::Date) @@ -531,7 +532,7 @@ QDateTime QQmlVMEMetaObject::readPropertyAsDateTime(int id) if (!md) return QDateTime(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); if (!v || v->d()->data().type() != QVariant::DateTime) @@ -545,7 +546,7 @@ QSizeF QQmlVMEMetaObject::readPropertyAsSizeF(int id) const if (!md) return QSizeF(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); if (!v || v->d()->data().type() != QVariant::SizeF) @@ -559,7 +560,7 @@ QPointF QQmlVMEMetaObject::readPropertyAsPointF(int id) const if (!md) return QPointF(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); if (!v || v->d()->data().type() != QVariant::PointF) @@ -573,7 +574,7 @@ QObject* QQmlVMEMetaObject::readPropertyAsQObject(int id) const if (!md) return 0; - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::QObjectWrapper *wrapper = sv->as<QV4::QObjectWrapper>(); if (!wrapper) @@ -587,11 +588,11 @@ QList<QObject *> *QQmlVMEMetaObject::readPropertyAsList(int id) const if (!md) return 0; - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::Scoped<QV4::VariantObject> v(scope, *(md->data() + id)); if (!v || (int)v->d()->data().userType() != qMetaTypeId<QList<QObject *> >()) { QVariant variant(qVariantFromValue(QList<QObject*>())); - v = cache->engine->newVariantObject(variant); + v = engine->newVariantObject(variant); *(md->data() + id) = v; } return static_cast<QList<QObject *> *>(v->d()->data().data()); @@ -603,7 +604,7 @@ QRectF QQmlVMEMetaObject::readPropertyAsRectF(int id) const if (!md) return QRectF(); - QV4::Scope scope(cache->engine); + QV4::Scope scope(engine); QV4::ScopedValue sv(scope, *(md->data() + id)); const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); if (!v || v->d()->data().type() != QVariant::RectF) @@ -817,7 +818,7 @@ int QQmlVMEMetaObject::metaCall(QObject *o, QMetaObject::Call c, int _id, void * if (QV4::MemberData *md = propertyAndMethodStorageAsMemberData()) { QV4::VariantObject *v = (md->data() + id)->as<QV4::VariantObject>(); if (!v) { - *(md->data() + id) = cache->engine->newVariantObject(QVariant()); + *(md->data() + id) = engine->newVariantObject(QVariant()); v = (md->data() + id)->as<QV4::VariantObject>(); QQml_valueTypeProvider()->initValueType(fallbackMetaType, v->d()->data()); } @@ -1013,7 +1014,7 @@ QVariant QQmlVMEMetaObject::readPropertyAsVariant(int id) const const QV4::VariantObject *v = (md->data() + id)->as<QV4::VariantObject>(); if (v) return v->d()->data(); - return cache->engine->toVariant(*(md->data() + id), -1); + return engine->toVariant(*(md->data() + id), -1); } return QVariant(); } @@ -1073,8 +1074,8 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) // And, if the new value is a scarce resource, we need to ensure that it does not get // automatically released by the engine until no other references to it exist. - QV4::Scope scope(cache->engine); - QV4::ScopedValue newv(scope, cache->engine->fromVariant(value)); + QV4::Scope scope(engine); + QV4::ScopedValue newv(scope, engine->fromVariant(value)); QV4::Scoped<QV4::VariantObject> v(scope, newv); if (!!v) v->addVmePropertyReference(); @@ -1099,7 +1100,7 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) v->d()->data() != value); if (v) v->removeVmePropertyReference(); - *(md->data() + id) = cache->engine->newVariantObject(value); + *(md->data() + id) = engine->newVariantObject(value); v = static_cast<QV4::VariantObject *>(md->data() + id); v->addVmePropertyReference(); } @@ -1163,15 +1164,13 @@ void QQmlVMEMetaObject::setVMEProperty(int index, const QV4::Value &v) void QQmlVMEMetaObject::ensureQObjectWrapper() { - Q_ASSERT(cache && cache->engine); - QV4::ExecutionEngine *v4 = cache->engine; - QV4::QObjectWrapper::wrap(v4, object); + Q_ASSERT(cache); + QV4::QObjectWrapper::wrap(engine, object); } void QQmlVMEMetaObject::mark(QV4::ExecutionEngine *e) { - QV4::ExecutionEngine *v4 = cache ? cache->engine : 0; - if (v4 != e) + if (engine != e) return; propertyAndMethodStorage.markOnce(e); |