summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qdeclarativecompiledbindings.cpp12
-rw-r--r--src/declarative/qml/qdeclarativecompiledbindings_p.h2
-rw-r--r--src/declarative/qml/qdeclarativenotifier_p.h25
-rw-r--r--src/declarative/qml/qdeclarativevme.cpp2
4 files changed, 28 insertions, 13 deletions
diff --git a/src/declarative/qml/qdeclarativecompiledbindings.cpp b/src/declarative/qml/qdeclarativecompiledbindings.cpp
index 51ffc10..72a3e53 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings.cpp
+++ b/src/declarative/qml/qdeclarativecompiledbindings.cpp
@@ -235,6 +235,7 @@ public:
void run(Binding *, QDeclarativePropertyPrivate::WriteFlags flags);
const char *programData;
+ QDeclarativeRefCount *dataRef;
Binding *m_bindings;
quint32 *m_signalTable;
@@ -267,7 +268,7 @@ public:
};
QDeclarativeCompiledBindingsPrivate::QDeclarativeCompiledBindingsPrivate()
-: subscriptions(0), identifiers(0)
+: subscriptions(0), identifiers(0), programData(0), dataRef(0), m_bindings(0), m_signalTable(0)
{
}
@@ -275,11 +276,16 @@ QDeclarativeCompiledBindingsPrivate::~QDeclarativeCompiledBindingsPrivate()
{
delete [] subscriptions; subscriptions = 0;
delete [] identifiers; identifiers = 0;
+ if (dataRef) {
+ dataRef->release();
+ dataRef = 0;
+ }
}
int QDeclarativeCompiledBindingsPrivate::methodCount = -1;
-QDeclarativeCompiledBindings::QDeclarativeCompiledBindings(const char *program, QDeclarativeContextData *context)
+QDeclarativeCompiledBindings::QDeclarativeCompiledBindings(const char *program, QDeclarativeContextData *context,
+ QDeclarativeRefCount *dataRef)
: QObject(*(new QDeclarativeCompiledBindingsPrivate))
{
Q_D(QDeclarativeCompiledBindings);
@@ -288,6 +294,8 @@ QDeclarativeCompiledBindings::QDeclarativeCompiledBindings(const char *program,
d->methodCount = QDeclarativeCompiledBindings::staticMetaObject.methodCount();
d->programData = program;
+ d->dataRef = dataRef;
+ if (d->dataRef) d->dataRef->addref();
d->init();
diff --git a/src/declarative/qml/qdeclarativecompiledbindings_p.h b/src/declarative/qml/qdeclarativecompiledbindings_p.h
index e7b6937..8ec0ac3 100644
--- a/src/declarative/qml/qdeclarativecompiledbindings_p.h
+++ b/src/declarative/qml/qdeclarativecompiledbindings_p.h
@@ -95,7 +95,7 @@ class QDeclarativeCompiledBindingsPrivate;
class QDeclarativeCompiledBindings : public QObject, public QDeclarativeAbstractExpression, public QDeclarativeRefCount
{
public:
- QDeclarativeCompiledBindings(const char *program, QDeclarativeContextData *context);
+ QDeclarativeCompiledBindings(const char *program, QDeclarativeContextData *context, QDeclarativeRefCount *);
virtual ~QDeclarativeCompiledBindings();
QDeclarativeAbstractBinding *configBinding(int index, QObject *target, QObject *scope, int property);
diff --git a/src/declarative/qml/qdeclarativenotifier_p.h b/src/declarative/qml/qdeclarativenotifier_p.h
index 5f70f7d..e46b843 100644
--- a/src/declarative/qml/qdeclarativenotifier_p.h
+++ b/src/declarative/qml/qdeclarativenotifier_p.h
@@ -99,8 +99,15 @@ private:
enum { InvalidType, SignalType, NotifierType } type;
union {
- char signalData[sizeof(Signal)];
- char notifierData[sizeof(Notifier)];
+ struct {
+ Signal *signal;
+ union {
+ char signalData[sizeof(Signal)];
+ qint64 q_for_alignment_1;
+ double q_for_alignment_2;
+ };
+ };
+ Notifier notifier;
};
inline Notifier *toNotifier();
@@ -194,7 +201,7 @@ void QDeclarativeNotifierEndpoint::connect(QDeclarativeNotifier *notifier)
void QDeclarativeNotifierEndpoint::disconnect()
{
if (type == SignalType) {
- Signal *s = (Signal *)&signalData;
+ Signal *s = asSignal();
if (s->source) {
QMetaObject::disconnectOne(s->source, s->sourceSignal, target, targetMethod);
s->source = 0;
@@ -234,7 +241,8 @@ QDeclarativeNotifierEndpoint::Notifier *QDeclarativeNotifierEndpoint::toNotifier
QDeclarativeNotifierEndpoint::Notifier *QDeclarativeNotifierEndpoint::asNotifier()
{
- return (Notifier *)(&notifierData);
+ Q_ASSERT(type == NotifierType);
+ return &notifier;
}
QDeclarativeNotifierEndpoint::Signal *QDeclarativeNotifierEndpoint::toSignal()
@@ -243,16 +251,15 @@ QDeclarativeNotifierEndpoint::Signal *QDeclarativeNotifierEndpoint::toSignal()
return asSignal();
disconnect();
- Signal *s = asSignal();
- new (s) Signal;
+ signal = new (&signalData) Signal;
type = SignalType;
-
- return s;
+ return signal;
}
QDeclarativeNotifierEndpoint::Signal *QDeclarativeNotifierEndpoint::asSignal()
{
- return (Signal *)(&signalData);
+ Q_ASSERT(type == SignalType);
+ return signal;
}
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qdeclarativevme.cpp b/src/declarative/qml/qdeclarativevme.cpp
index a23f89d..8cf97d2 100644
--- a/src/declarative/qml/qdeclarativevme.cpp
+++ b/src/declarative/qml/qdeclarativevme.cpp
@@ -209,7 +209,7 @@ QObject *QDeclarativeVME::run(QDeclarativeVMEObjectStack &stack,
if (instr.init.contextCache != -1)
ctxt->setIdPropertyData(comp->contextCaches.at(instr.init.contextCache));
if (instr.init.compiledBinding != -1)
- ctxt->optimizedBindings = new QDeclarativeCompiledBindings(datas.at(instr.init.compiledBinding).constData(), ctxt);
+ ctxt->optimizedBindings = new QDeclarativeCompiledBindings(datas.at(instr.init.compiledBinding).constData(), ctxt, comp);
}
break;