From 44ac9e797ce30c1c9f6af704a7677fe0c9ac5794 Mon Sep 17 00:00:00 2001 From: Frank Meerkoetter Date: Fri, 24 Jul 2015 22:33:23 +0200 Subject: Port QVariant away from QQmlVMEVariant QVariants are now stored as QV4::VariantObject inside a javascript array. Change-Id: Idcc65eed6845b561038e224d74e5efdf0c9e1c28 Reviewed-by: Simon Hausmann --- src/qml/qml/qqmlvmemetaobject.cpp | 29 +++++++++++++++++++++++------ 1 file 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(); if (wrapper) return QVariant::fromValue(wrapper->object()); + const QV4::VariantObject *v = sv->as(); + 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() || - 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(); + needActivate = (!v || + v->d()->data.userType() != value.userType() || + v->d()->data != value); + if (v) + v->removeVmePropertyReference(); + + QV4::Scoped svo(scope, properties.engine()->newVariantObject(value)); + svo->addVmePropertyReference(); + o->putIndexed(id, svo); + } } if (needActivate) -- cgit v1.2.3