diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-09-15 18:46:26 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-09-16 06:37:43 +0200 |
commit | 98bb73aee9765b38a1e6d8b6094334850afb8b51 (patch) | |
tree | 7988db13326a1aeeb26c21ba0be8a80d4aa2b97f | |
parent | eca61962be628c59ad39dd23e2e286fdd21e7680 (diff) |
Reference V4 program data
Change-Id: I84d520da16def8e48ac8bbfaab654450f776abc8
Task-number: QTBUG-21265
Reviewed-on: http://codereview.qt-project.org/4956
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
-rw-r--r-- | src/declarative/qml/qdeclarativevme.cpp | 2 | ||||
-rw-r--r-- | src/declarative/qml/v4/qdeclarativev4bindings.cpp | 11 | ||||
-rw-r--r-- | src/declarative/qml/v4/qdeclarativev4bindings_p.h | 3 |
3 files changed, 11 insertions, 5 deletions
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp index 2bf1dd6981..681329ae5c 100644 --- a/src/declarative/qml/qdeclarativevme.cpp +++ b/src/declarative/qml/qdeclarativevme.cpp @@ -218,7 +218,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEObjectStack &stack, ctxt->setIdPropertyData(comp->contextCaches.at(instr.contextCache)); if (instr.compiledBinding != -1) { const char *v4data = datas.at(instr.compiledBinding).constData(); - ctxt->v4bindings = new QDeclarativeV4Bindings(v4data, ctxt); + ctxt->v4bindings = new QDeclarativeV4Bindings(v4data, ctxt, comp); } QML_END_INSTR(Init) diff --git a/src/declarative/qml/v4/qdeclarativev4bindings.cpp b/src/declarative/qml/v4/qdeclarativev4bindings.cpp index d93d930034..20d79dc46d 100644 --- a/src/declarative/qml/v4/qdeclarativev4bindings.cpp +++ b/src/declarative/qml/v4/qdeclarativev4bindings.cpp @@ -221,6 +221,7 @@ public: void run(Binding *, QDeclarativePropertyPrivate::WriteFlags flags); QDeclarativeV4Program *program; + QDeclarativeRefCount *dataRef; Binding *bindings; static int methodCount; @@ -245,18 +246,20 @@ public: }; QDeclarativeV4BindingsPrivate::QDeclarativeV4BindingsPrivate() -: subscriptions(0), program(0), bindings(0) +: subscriptions(0), program(0), dataRef(0), bindings(0) { } QDeclarativeV4BindingsPrivate::~QDeclarativeV4BindingsPrivate() { delete [] subscriptions; subscriptions = 0; + if (dataRef) dataRef->release(); } int QDeclarativeV4BindingsPrivate::methodCount = -1; -QDeclarativeV4Bindings::QDeclarativeV4Bindings(const char *program, QDeclarativeContextData *context) +QDeclarativeV4Bindings::QDeclarativeV4Bindings(const char *program, QDeclarativeContextData *context, + QDeclarativeRefCount *dataRef) : QObject(*(new QDeclarativeV4BindingsPrivate)) { Q_D(QDeclarativeV4Bindings); @@ -265,6 +268,8 @@ QDeclarativeV4Bindings::QDeclarativeV4Bindings(const char *program, QDeclarative d->methodCount = QDeclarativeV4Bindings::staticMetaObject.methodCount(); d->program = (QDeclarativeV4Program *)program; + d->dataRef = dataRef; + if (dataRef) dataRef->addref(); if (program) { d->init(); @@ -744,7 +749,7 @@ void **QDeclarativeV4Bindings::getDecodeInstrTable() { static void **decode_instr; if (!decode_instr) { - QDeclarativeV4Bindings dummy(0, 0); + QDeclarativeV4Bindings dummy(0, 0, 0); quint32 executedBlocks = 0; dummy.d_func()->run(0, executedBlocks, 0, 0, 0, 0, QDeclarativePropertyPrivate::BypassInterceptor, &decode_instr); } diff --git a/src/declarative/qml/v4/qdeclarativev4bindings_p.h b/src/declarative/qml/v4/qdeclarativev4bindings_p.h index 55ddfcd3cd..c0345ea3c4 100644 --- a/src/declarative/qml/v4/qdeclarativev4bindings_p.h +++ b/src/declarative/qml/v4/qdeclarativev4bindings_p.h @@ -67,7 +67,8 @@ class QDeclarativeV4Bindings : public QObject, public QDeclarativeRefCount { public: - QDeclarativeV4Bindings(const char *program, QDeclarativeContextData *context); + QDeclarativeV4Bindings(const char *program, QDeclarativeContextData *context, + QDeclarativeRefCount *); virtual ~QDeclarativeV4Bindings(); QDeclarativeAbstractBinding *configBinding(int index, QObject *target, QObject *scope, int property); |