From 98bb73aee9765b38a1e6d8b6094334850afb8b51 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 15 Sep 2011 18:46:26 +1000 Subject: Reference V4 program data Change-Id: I84d520da16def8e48ac8bbfaab654450f776abc8 Task-number: QTBUG-21265 Reviewed-on: http://codereview.qt-project.org/4956 Reviewed-by: Aaron Kennedy --- src/declarative/qml/qdeclarativevme.cpp | 2 +- src/declarative/qml/v4/qdeclarativev4bindings.cpp | 11 ++++++++--- 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); -- cgit v1.2.3