diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2012-05-23 16:01:21 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-24 17:50:13 +0200 |
commit | d12c9306ee2355a76e3e037877ee445b31f66a23 (patch) | |
tree | 324f6b5979ae334358bf71474348a7e3700a68da /src/qml/qml/v4 | |
parent | 6ff8aa4b83e801acadd45cc32759ea77cf4532c8 (diff) |
Use static dispatch tables for QQmlAbstractBinding
This saves us the space of the virtual table pointer, but does
somewhat limit us to the 4 QQmlAbstractBinding types that we
have today.
Change-Id: I03d06ef2ec0c51271c28e7a5aab6dc689d369da4
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/qml/qml/v4')
-rw-r--r-- | src/qml/qml/v4/qv4bindings.cpp | 64 | ||||
-rw-r--r-- | src/qml/qml/v4/qv4bindings_p.h | 20 |
2 files changed, 53 insertions, 31 deletions
diff --git a/src/qml/qml/v4/qv4bindings.cpp b/src/qml/qml/v4/qv4bindings.cpp index 39b571f336..ba90654661 100644 --- a/src/qml/qml/v4/qv4bindings.cpp +++ b/src/qml/qml/v4/qv4bindings.cpp @@ -73,6 +73,16 @@ QT_BEGIN_NAMESPACE using namespace QQmlJS; +QQmlAbstractBinding::VTable QV4Bindings_Binding_vtable = { + QV4Bindings::Binding::destroy, + QQmlAbstractBinding::default_expression, + QV4Bindings::Binding::propertyIndex, + QV4Bindings::Binding::object, + QV4Bindings::Binding::setEnabled, + QV4Bindings::Binding::update, + QV4Bindings::Binding::retargetBinding +}; + namespace { struct Register { typedef QQmlRegisterType Type; @@ -307,46 +317,58 @@ QQmlAbstractBinding *QV4Bindings::configBinding(int index, QObject *target, return rv; } -void QV4Bindings::Binding::setEnabled(bool e, QQmlPropertyPrivate::WriteFlags flags) +void QV4Bindings::Binding::setEnabled(QQmlAbstractBinding *_This, + bool e, QQmlPropertyPrivate::WriteFlags flags) { - if (enabled != e) { - enabled = e; + QV4Bindings::Binding *This = static_cast<QV4Bindings::Binding *>(_This); - if (e) update(flags); + if (This->enabled != e) { + This->enabled = e; + + if (e) update(_This, flags); } } -void QV4Bindings::Binding::update(QQmlPropertyPrivate::WriteFlags flags) +void QV4Bindings::Binding::update(QQmlAbstractBinding *_This, QQmlPropertyPrivate::WriteFlags flags) { - parent->run(this, flags); + QV4Bindings::Binding *This = static_cast<QV4Bindings::Binding *>(_This); + This->parent->run(This, flags); } -void QV4Bindings::Binding::destroy() +void QV4Bindings::Binding::destroy(QQmlAbstractBinding *_This) { - enabled = false; - removeFromObject(); - clear(); - removeError(); - parent->release(); + QV4Bindings::Binding *This = static_cast<QV4Bindings::Binding *>(_This); + + This->enabled = false; + This->removeFromObject(); + This->clear(); + This->removeError(); + This->parent->release(); } -int QV4Bindings::Binding::propertyIndex() const +int QV4Bindings::Binding::propertyIndex(const QQmlAbstractBinding *_This) { - if (target.hasValue()) return target.constValue()->targetProperty; + const QV4Bindings::Binding *This = static_cast<const QV4Bindings::Binding *>(_This); + + if (This->target.hasValue()) return This->target.constValue()->targetProperty; //mask out the type information set for value types - else return property & 0xFF00FFFF; + else return This->property & 0xFF00FFFF; } -QObject *QV4Bindings::Binding::object() const +QObject *QV4Bindings::Binding::object(const QQmlAbstractBinding *_This) { - if (target.hasValue()) return target.constValue()->target; - return *target; + const QV4Bindings::Binding *This = static_cast<const QV4Bindings::Binding *>(_This); + + if (This->target.hasValue()) return This->target.constValue()->target; + return *This->target; } -void QV4Bindings::Binding::retargetBinding(QObject *t, int i) +void QV4Bindings::Binding::retargetBinding(QQmlAbstractBinding *_This, QObject *t, int i) { - target.value().target = t; - target.value().targetProperty = i; + QV4Bindings::Binding *This = static_cast<QV4Bindings::Binding *>(_This); + + This->target.value().target = t; + This->target.value().targetProperty = i; } QV4Bindings::Subscription::Subscription() diff --git a/src/qml/qml/v4/qv4bindings_p.h b/src/qml/qml/v4/qv4bindings_p.h index d2d8520a83..e9c6301cef 100644 --- a/src/qml/qml/v4/qv4bindings_p.h +++ b/src/qml/qml/v4/qv4bindings_p.h @@ -79,20 +79,17 @@ public: static void **getDecodeInstrTable(); #endif -private: - Q_DISABLE_COPY(QV4Bindings) - struct Binding : public QQmlAbstractBinding, public QQmlDelayedError { - Binding() : enabled(false), updating(0), property(0), + Binding() : QQmlAbstractBinding(V4), enabled(false), updating(0), property(0), scope(0), target(0), executedBlocks(0), parent(0) {} // Inherited from QQmlAbstractBinding - virtual void setEnabled(bool, QQmlPropertyPrivate::WriteFlags flags); - virtual void update(QQmlPropertyPrivate::WriteFlags flags); - virtual void destroy(); - virtual int propertyIndex() const; - virtual void retargetBinding(QObject *, int); - virtual QObject *object() const; + static void destroy(QQmlAbstractBinding *); + static int propertyIndex(const QQmlAbstractBinding *); + static QObject *object(const QQmlAbstractBinding *); + static void setEnabled(QQmlAbstractBinding *, bool, QQmlPropertyPrivate::WriteFlags); + static void update(QQmlAbstractBinding *, QQmlPropertyPrivate::WriteFlags); + static void retargetBinding(QQmlAbstractBinding *, QObject *, int); struct Retarget { QObject *target; @@ -114,6 +111,9 @@ private: QV4Bindings *parent; }; +private: + Q_DISABLE_COPY(QV4Bindings) + class Subscription : public QQmlNotifierEndpoint { public: |