diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-02-22 04:56:49 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2010-02-22 05:53:27 (GMT) |
commit | 33eb76f050b45718d87926a8ff7afc89d6201c16 (patch) | |
tree | 935ddc2337b3891aab1ad7edcb06a62aabf14668 /src/declarative/qml/qmlvme.cpp | |
parent | 5f63321e3fe2b436d469d2722dc464ea4c7830c4 (diff) | |
download | Qt-33eb76f050b45718d87926a8ff7afc89d6201c16.zip Qt-33eb76f050b45718d87926a8ff7afc89d6201c16.tar.gz Qt-33eb76f050b45718d87926a8ff7afc89d6201c16.tar.bz2 |
Replace QmlList* and QList* support with a single QmlListProperty type
As a value type QmlListProperty doesn't consume any memory in the object.
It also has a companion QmlListReference class that is part of the public
API for C++ developers to interact with that also manages memory issues
that existed with previous solutions (if the containing QObject was
destroyed it left a dangling pointer).
Diffstat (limited to 'src/declarative/qml/qmlvme.cpp')
-rw-r--r-- | src/declarative/qml/qmlvme.cpp | 60 |
1 files changed, 10 insertions, 50 deletions
diff --git a/src/declarative/qml/qmlvme.cpp b/src/declarative/qml/qmlvme.cpp index 39de062..8655809 100644 --- a/src/declarative/qml/qmlvme.cpp +++ b/src/declarative/qml/qmlvme.cpp @@ -91,15 +91,13 @@ QmlVME::QmlVME() struct ListInstance { - ListInstance() {} - ListInstance(QList<void *> *q, int t) - : type(t), qListInterface(q), qmlListInterface(0) {} - ListInstance(QmlPrivate::ListInterface *q, int t) - : type(t), qListInterface(0), qmlListInterface(q) {} + ListInstance() + : type(0) {} + ListInstance(int t) + : type(t) {} int type; - QList<void *> *qListInterface; - QmlPrivate::ListInterface *qmlListInterface; + QmlListProperty<void> qListProperty; }; QObject *QmlVME::run(QmlContext *ctxt, QmlCompiledData *comp, @@ -654,22 +652,12 @@ QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt, } break; - case QmlInstruction::StoreObjectQmlList: - { - QObject *assign = stack.pop(); - const ListInstance &list = qliststack.top(); - - void *d = (void *)&assign; - list.qmlListInterface->append(d); - } - break; - case QmlInstruction::StoreObjectQList: { QObject *assign = stack.pop(); const ListInstance &list = qliststack.top(); - list.qListInterface->append((void *)assign); + list.qListProperty.append((QmlListProperty<void>*)&list.qListProperty, assign); } break; @@ -690,12 +678,7 @@ QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt, VME_EXCEPTION(QCoreApplication::translate("QmlVME","Cannot assign object to list")); - if (list.qmlListInterface) { - void *d = (void *)&ptr; - list.qmlListInterface->append(d); - } else { - list.qListInterface->append(ptr); - } + list.qListProperty.append((QmlListProperty<void>*)&list.qListProperty, ptr); } break; @@ -750,39 +733,16 @@ QObject *QmlVME::run(QmlVMEStack<QObject *> &stack, QmlContext *ctxt, } break; - case QmlInstruction::FetchQmlList: - { - QObject *target = stack.top(); - - void *a[1]; - // We know that QmlList<*> can be converted to - // QmlPrivate::ListInterface - QmlPrivate::ListInterface *list = 0; - a[0] = &list; - QMetaObject::metacall(target, QMetaObject::ReadProperty, - instr.fetchQmlList.property, a); - if (!list) - VME_EXCEPTION(QCoreApplication::translate("QmlVME","Cannot assign to null list")); - - qliststack.push(ListInstance(list, instr.fetchQmlList.type)); - } - break; - case QmlInstruction::FetchQList: { QObject *target = stack.top(); + qliststack.push(ListInstance(instr.fetchQmlList.type)); + void *a[1]; - // We know that QList<T *>* can be converted to - // QList<void *>* - QList<void *> *list = 0; - a[0] = &list; + a[0] = (void *)&(qliststack.top().qListProperty); QMetaObject::metacall(target, QMetaObject::ReadProperty, instr.fetchQmlList.property, a); - if (!list) - VME_EXCEPTION(QCoreApplication::translate("QmlVME","Cannot assign to null list")); - - qliststack.push(ListInstance(list, instr.fetchQmlList.type)); } break; |