aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-09-15 18:46:26 +1000
committerQt by Nokia <qt-info@nokia.com>2011-09-16 06:37:43 +0200
commit98bb73aee9765b38a1e6d8b6094334850afb8b51 (patch)
tree7988db13326a1aeeb26c21ba0be8a80d4aa2b97f
parenteca61962be628c59ad39dd23e2e286fdd21e7680 (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.cpp2
-rw-r--r--src/declarative/qml/v4/qdeclarativev4bindings.cpp11
-rw-r--r--src/declarative/qml/v4/qdeclarativev4bindings_p.h3
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);