aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlvmemetaobject.cpp
diff options
context:
space:
mode:
authorMatthew Vogt <matthew.vogt@nokia.com>2012-04-26 11:05:41 +1000
committerQt by Nokia <qt-info@nokia.com>2012-04-30 01:52:57 +0200
commit0e8af75e877d46cb656d03cf575804f2c17ec33f (patch)
tree6b3466202d1a62b7c5d7fb5aff904599ee8d3ca5 /src/qml/qml/qqmlvmemetaobject.cpp
parent1b48bb5602bd90dc78e1ff09207f682f6a43edd2 (diff)
Ensure external value types are initialized before write
Ensure that the logic used when writing to a property having a value type provided by an external module matches that used for properties of internal value types. Change-Id: I925b8b30a211ef813e2a51134411a162b0b146b5 Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlvmemetaobject.cpp')
-rw-r--r--src/qml/qml/qqmlvmemetaobject.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp
index b39ca34739..97781617de 100644
--- a/src/qml/qml/qqmlvmemetaobject.cpp
+++ b/src/qml/qml/qqmlvmemetaobject.cpp
@@ -116,6 +116,8 @@ public:
inline void setDataType(int t);
+ inline void ensureValueType(int);
+
private:
int type;
void *data[6]; // Large enough to hold all types
@@ -409,6 +411,15 @@ void QQmlVMEVariant::setDataType(int t)
type = t;
}
+void QQmlVMEVariant::ensureValueType(int t)
+{
+ if (type != t) {
+ cleanup();
+ type = t;
+ QQml_valueTypeProvider()->initValueType(t, dataPtr(), dataSize());
+ }
+}
+
QQmlVMEMetaObjectEndpoint::QQmlVMEMetaObjectEndpoint()
{
callback = &vmecallback;
@@ -645,12 +656,9 @@ int QQmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
writeProperty(id, *reinterpret_cast<QVariant *>(a[0]));
break;
default:
- if (! data[id].dataType())
- QQml_valueTypeProvider()->initValueType(t, data[id].dataPtr(), data[id].dataSize());
- needActivate = QQml_valueTypeProvider()->writeValueType(t, a[0], data[id].dataPtr(), data[id].dataSize());
- if (needActivate) {
- data[id].setDataType(t);
- }
+ data[id].ensureValueType(t);
+ needActivate = !QQml_valueTypeProvider()->equalValueType(t, a[0], data[id].dataPtr());
+ QQml_valueTypeProvider()->writeValueType(t, a[0], data[id].dataPtr(), data[id].dataSize());
break;
}
}