diff options
author | Frank Meerkoetter <frank.meerkoetter@basyskom.com> | 2015-07-24 22:33:23 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2015-08-18 20:25:52 +0000 |
commit | 44ac9e797ce30c1c9f6af704a7677fe0c9ac5794 (patch) | |
tree | 7ad204a74d7b6371a95b5cc5cdaf8f530c394691 /src/qml/qml/qqmlvmemetaobject.cpp | |
parent | d40b206b734ca001819129b92ff270bfe2ea1942 (diff) |
Port QVariant away from QQmlVMEVariant
QVariants are now stored as QV4::VariantObject inside a javascript
array.
Change-Id: Idcc65eed6845b561038e224d74e5efdf0c9e1c28
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject.cpp')
-rw-r--r-- | src/qml/qml/qqmlvmemetaobject.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp index 39ddaa5e32..0d10550fab 100644 --- a/src/qml/qml/qqmlvmemetaobject.cpp +++ b/src/qml/qml/qqmlvmemetaobject.cpp @@ -1265,7 +1265,6 @@ QVariant QQmlVMEMetaObject::readPropertyAsVariant(int id) QV4::ScopedValue val(scope, o->getIndexed(id)); return scope.engine->toVariant(val, -1); } - return QVariant(); } else { if (ensurePropertiesAllocated()) { QV4::ExecutionEngine *v4 = properties.engine(); @@ -1275,9 +1274,15 @@ QVariant QQmlVMEMetaObject::readPropertyAsVariant(int id) const QV4::QObjectWrapper *wrapper = sv->as<QV4::QObjectWrapper>(); if (wrapper) return QVariant::fromValue(wrapper->object()); + const QV4::VariantObject *v = sv->as<QV4::VariantObject>(); + if (!v) { + writeProperty(id, QVariant()); + return QVariant(); + } + return v->d()->data; } - return data[id].asQVariant(); } + return QVariant(); } void QQmlVMEMetaObject::writeVarProperty(int id, const QV4::Value &value) @@ -1358,10 +1363,22 @@ void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value) needActivate = readPropertyAsQObject(id) != o; // TODO: still correct? writeProperty(id, o); } else { - needActivate = (data[id].dataType() != qMetaTypeId<QVariant>() || - data[id].asQVariant().userType() != value.userType() || - data[id].asQVariant() != value); - data[id].setValue(value); + if (ensurePropertiesAllocated()) { + QV4::ExecutionEngine *v4 = properties.engine(); + QV4::Scope scope(v4); + QV4::ScopedObject o(scope, properties.value()); + QV4::ScopedValue sv(scope, o->getIndexed(id)); + QV4::VariantObject *v = sv->as<QV4::VariantObject>(); + needActivate = (!v || + v->d()->data.userType() != value.userType() || + v->d()->data != value); + if (v) + v->removeVmePropertyReference(); + + QV4::Scoped<QV4::VariantObject> svo(scope, properties.engine()->newVariantObject(value)); + svo->addVmePropertyReference(); + o->putIndexed(id, svo); + } } if (needActivate) |