aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvmemetaobject.cpp
diff options
context:
space:
mode:
authorFrank Meerkoetter <frank.meerkoetter@basyskom.com>2015-07-24 22:33:23 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-08-18 20:25:52 +0000
commit44ac9e797ce30c1c9f6af704a7677fe0c9ac5794 (patch)
tree7ad204a74d7b6371a95b5cc5cdaf8f530c394691 /src/qml/qml/qqmlvmemetaobject.cpp
parentd40b206b734ca001819129b92ff270bfe2ea1942 (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.cpp29
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)