Reference V4 program data
authorAaron Kennedy <aaron.kennedy@nokia.com>
Thu, 15 Sep 2011 08:46:26 +0000 (18:46 +1000)
committerQt by Nokia <qt-info@nokia.com>
Fri, 16 Sep 2011 04:37:43 +0000 (06:37 +0200)
Change-Id: I84d520da16def8e48ac8bbfaab654450f776abc8
Task-number: QTBUG-21265
Reviewed-on: http://codereview.qt-project.org/4956
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>

src/declarative/qml/qdeclarativevme.cpp
src/declarative/qml/v4/qdeclarativev4bindings.cpp
src/declarative/qml/v4/qdeclarativev4bindings_p.h

index 2bf1dd6..681329a 100644 (file)
@@ -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)
 
index d93d930..20d79dc 100644 (file)
@@ -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);
     }
index 55ddfcd..c0345ea 100644 (file)
@@ -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);