summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qmlbinding.cpp13
-rw-r--r--src/declarative/qml/qmlcompiler.cpp5
-rw-r--r--src/declarative/qml/qmlvmemetaobject.cpp11
-rw-r--r--src/declarative/qml/qmlvmemetaobject_p.h3
4 files changed, 26 insertions, 6 deletions
diff --git a/src/declarative/qml/qmlbinding.cpp b/src/declarative/qml/qmlbinding.cpp
index b0a4d6e..ef92308 100644
--- a/src/declarative/qml/qmlbinding.cpp
+++ b/src/declarative/qml/qmlbinding.cpp
@@ -175,7 +175,18 @@ void QmlBinding::update(QmlMetaProperty::WriteFlags flags)
bool isUndefined = false;
QVariant value = this->value(&isUndefined);
- if (!isUndefined && data->property.object() &&
+ if (isUndefined && !data->error.isValid()) {
+
+ QUrl url = data->url;
+ int line = data->line;
+ if (url.isEmpty()) url = QUrl(QLatin1String("<Unknown File>"));
+
+ data->error.setUrl(url);
+ data->error.setLine(line);
+ data->error.setColumn(-1);
+ data->error.setDescription(QLatin1String("Unable to assign [undefined] to ") + QLatin1String(QMetaType::typeName(data->property.propertyType())));
+
+ } else if (!isUndefined && data->property.object() &&
!data->property.write(value, flags)) {
QUrl url = data->url;
diff --git a/src/declarative/qml/qmlcompiler.cpp b/src/declarative/qml/qmlcompiler.cpp
index 8e92eb4..81ebd86 100644
--- a/src/declarative/qml/qmlcompiler.cpp
+++ b/src/declarative/qml/qmlcompiler.cpp
@@ -2340,6 +2340,7 @@ bool QmlCompiler::compileAlias(QMetaObjectBuilder &builder,
QByteArray typeName;
int propIdx = -1;
+ int flags = 0;
bool writable = false;
if (alias.count() == 2) {
propIdx = idObject->metaObject()->indexOfProperty(alias.at(1).toUtf8().constData());
@@ -2359,8 +2360,12 @@ bool QmlCompiler::compileAlias(QMetaObjectBuilder &builder,
typeName += "*";
}
+ if (typeName.endsWith('*'))
+ flags |= QML_ALIAS_FLAG_PTR;
+
data.append((const char *)&idObject->idIndex, sizeof(idObject->idIndex));
data.append((const char *)&propIdx, sizeof(propIdx));
+ data.append((const char *)&flags, sizeof(flags));
builder.addSignal(prop.name + "Changed()");
QMetaPropertyBuilder propBuilder =
diff --git a/src/declarative/qml/qmlvmemetaobject.cpp b/src/declarative/qml/qmlvmemetaobject.cpp
index 5315089..ed28d78 100644
--- a/src/declarative/qml/qmlvmemetaobject.cpp
+++ b/src/declarative/qml/qmlvmemetaobject.cpp
@@ -210,17 +210,18 @@ int QmlVMEMetaObject::metaCall(QMetaObject::Call c, int _id, void **a)
if (id < metaData->aliasCount) {
- if (!ctxt) return -1;
QmlVMEMetaData::AliasData *d = metaData->aliasData() + id;
+
+ if (d->flags & QML_ALIAS_FLAG_PTR && c == QMetaObject::ReadProperty)
+ *reinterpret_cast<void **>(a[0]) = 0;
+
+ if (!ctxt) return -1;
QmlContextPrivate *ctxtPriv =
(QmlContextPrivate *)QObjectPrivate::get(ctxt);
QObject *target = ctxtPriv->idValues[d->contextIdx].data();
- if (!target) {
- if (d->propertyIdx == -1)
- *reinterpret_cast<QObject **>(a[0]) = target;
+ if (!target)
return -1;
- }
if (c == QMetaObject::ReadProperty && !aConnected.testBit(id)) {
int sigIdx = methodOffset + id + metaData->propertyCount;
diff --git a/src/declarative/qml/qmlvmemetaobject_p.h b/src/declarative/qml/qmlvmemetaobject_p.h
index 9262b19..f2ee09b 100644
--- a/src/declarative/qml/qmlvmemetaobject_p.h
+++ b/src/declarative/qml/qmlvmemetaobject_p.h
@@ -61,6 +61,8 @@
QT_BEGIN_NAMESPACE
+#define QML_ALIAS_FLAG_PTR 0x00000001
+
struct QmlVMEMetaData
{
short propertyCount;
@@ -71,6 +73,7 @@ struct QmlVMEMetaData
struct AliasData {
int contextIdx;
int propertyIdx;
+ int flags;
};
struct PropertyData {