diff options
Diffstat (limited to 'src/declarative/qml/qdeclarativeexpression_p.h')
-rw-r--r-- | src/declarative/qml/qdeclarativeexpression_p.h | 141 |
1 files changed, 48 insertions, 93 deletions
diff --git a/src/declarative/qml/qdeclarativeexpression_p.h b/src/declarative/qml/qdeclarativeexpression_p.h index 4e31efb806..bfe031fbc8 100644 --- a/src/declarative/qml/qdeclarativeexpression_p.h +++ b/src/declarative/qml/qdeclarativeexpression_p.h @@ -55,14 +55,15 @@ #include "qdeclarativeexpression.h" -#include <private/qdeclarativeengine_p.h> -#include <private/qdeclarativeguard_p.h> - #include <private/qv8engine_p.h> +#include <private/qfieldlist_p.h> +#include <private/qdeletewatcher_p.h> +#include <private/qdeclarativeguard_p.h> +#include <private/qdeclarativeengine_p.h> QT_BEGIN_NAMESPACE -class QDeclarativeAbstractExpression +class QDeclarativeAbstractExpression : public QDeleteWatchable { public: QDeclarativeAbstractExpression(); @@ -107,31 +108,8 @@ private: QDeclarativeDelayedError **prevError; }; -class QDeclarativeDeleteWatchable -{ -public: - inline QDeclarativeDeleteWatchable(); - inline ~QDeclarativeDeleteWatchable(); -private: - friend class QDeclarativeDeleteWatcher; - bool *m_wasDeleted; -}; - -class QDeclarativeDeleteWatcher { -public: - inline QDeclarativeDeleteWatcher(QDeclarativeDeleteWatchable *data); - inline ~QDeclarativeDeleteWatcher(); - inline bool wasDeleted() const; -private: - void *operator new(size_t); - bool *m_wasDeleted; - bool m_wasDeletedStorage; - QDeclarativeDeleteWatchable *m_d; -}; - class QDeclarativeJavaScriptExpression : public QDeclarativeAbstractExpression, - public QDeclarativeDelayedError, - public QDeclarativeDeleteWatchable + public QDeclarativeDelayedError { public: QDeclarativeJavaScriptExpression(); @@ -164,28 +142,28 @@ private: QObject *m_scopeObject; - class GuardList { - public: - inline GuardList(); - inline ~GuardList(); - void inline clear(); - - typedef QPODVector<QDeclarativeEnginePrivate::CapturedProperty> CapturedProperties; - void updateGuards(QDeclarativeJavaScriptExpression *, const CapturedProperties &properties); - - private: - struct Endpoint : public QDeclarativeNotifierEndpoint { - Endpoint() : expression(0) { callback = &endpointCallback; } - static void endpointCallback(QDeclarativeNotifierEndpoint *e) { - static_cast<Endpoint *>(e)->expression->expressionChanged(); - } - QDeclarativeJavaScriptExpression *expression; - }; - - Endpoint *endpoints; - int length; + typedef QDeclarativeJavaScriptExpressionGuard Guard; + + struct GuardCapture : public QDeclarativeEnginePrivate::PropertyCapture { + GuardCapture(QDeclarativeJavaScriptExpression *e) : expression(e), errorString(0) { + } + ~GuardCapture() { + Q_ASSERT(guards.isEmpty()); + Q_ASSERT(errorString == 0); + } + + virtual void captureProperty(QDeclarativeNotifier *); + virtual void captureProperty(QObject *, int, int); + + QDeclarativeJavaScriptExpression *expression; + QFieldList<Guard, &Guard::next> guards; + QStringList *errorString; }; - GuardList guardList; + + QFieldList<Guard, &Guard::next> activeGuards; + GuardCapture *guardCapture; + + void clearGuards(); }; class QDeclarativeExpression; @@ -233,35 +211,6 @@ public: QDeclarativeRefCount *dataRef; }; -QDeclarativeDeleteWatchable::QDeclarativeDeleteWatchable() -: m_wasDeleted(0) -{ -} - -QDeclarativeDeleteWatchable::~QDeclarativeDeleteWatchable() -{ - if (m_wasDeleted) *m_wasDeleted = true; -} - -QDeclarativeDeleteWatcher::QDeclarativeDeleteWatcher(QDeclarativeDeleteWatchable *data) -: m_wasDeletedStorage(false), m_d(data) -{ - if (!m_d->m_wasDeleted) - m_d->m_wasDeleted = &m_wasDeletedStorage; - m_wasDeleted = m_d->m_wasDeleted; -} - -QDeclarativeDeleteWatcher::~QDeclarativeDeleteWatcher() -{ - if (false == *m_wasDeleted && m_wasDeleted == m_d->m_wasDeleted) - m_d->m_wasDeleted = 0; -} - -bool QDeclarativeDeleteWatcher::wasDeleted() const -{ - return *m_wasDeleted; -} - bool QDeclarativeJavaScriptExpression::requiresThisObject() const { return m_requiresThisObject; @@ -302,36 +251,42 @@ QString QDeclarativeJavaScriptExpression::expressionIdentifier() return QString(); } -QDeclarativeJavaScriptExpression::GuardList::GuardList() -: endpoints(0), length(0) +QDeclarativeExpressionPrivate *QDeclarativeExpressionPrivate::get(QDeclarativeExpression *expr) { + return static_cast<QDeclarativeExpressionPrivate *>(QObjectPrivate::get(expr)); } -QDeclarativeJavaScriptExpression::GuardList::~GuardList() -{ - clear(); +QDeclarativeExpression *QDeclarativeExpressionPrivate::get(QDeclarativeExpressionPrivate *expr) +{ + return expr->q_func(); } -void QDeclarativeJavaScriptExpression::GuardList::clear() +QString QDeclarativeExpressionPrivate::expressionIdentifier() +{ + return QLatin1String("\"") + expression + QLatin1String("\""); +} + +QDeclarativeJavaScriptExpressionGuard::QDeclarativeJavaScriptExpressionGuard(QDeclarativeJavaScriptExpression *e) +: expression(e), next(0) { - delete [] endpoints; - endpoints = 0; - length = 0; + callback = &endpointCallback; } -QDeclarativeExpressionPrivate *QDeclarativeExpressionPrivate::get(QDeclarativeExpression *expr) +void QDeclarativeJavaScriptExpressionGuard::endpointCallback(QDeclarativeNotifierEndpoint *e) { - return static_cast<QDeclarativeExpressionPrivate *>(QObjectPrivate::get(expr)); + static_cast<QDeclarativeJavaScriptExpressionGuard *>(e)->expression->expressionChanged(); } -QDeclarativeExpression *QDeclarativeExpressionPrivate::get(QDeclarativeExpressionPrivate *expr) +QDeclarativeJavaScriptExpressionGuard * +QDeclarativeJavaScriptExpressionGuard::New(QDeclarativeJavaScriptExpression *e) { - return expr->q_func(); + Q_ASSERT(e); + return QDeclarativeEnginePrivate::get(e->context()->engine)->jsExpressionGuardPool.New(e); } -QString QDeclarativeExpressionPrivate::expressionIdentifier() +void QDeclarativeJavaScriptExpressionGuard::Delete() { - return QLatin1String("\"") + expression + QLatin1String("\""); + QRecyclePool<QDeclarativeJavaScriptExpressionGuard>::Delete(this); } QT_END_NAMESPACE |