aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2012-04-02 10:02:28 +1000
committerQt by Nokia <qt-info@nokia.com>2012-04-23 05:23:45 +0200
commit66399c6584a86180c1955e5d34617fa46b07f36e (patch)
treec6ed009879801ff7c2d13b696c7963ed08c809c6 /src
parent9542511b013588b2ceb132ec8b34879ec904a21e (diff)
Also check notifier endpoints when checking whether a signal is connected.
This is required for the QQmlBoundSignal optimizations. Change-Id: I63540b96cd7d4523ec49973a2540054c83d82b12 Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/particles/qquickcustomaffector.cpp4
-rw-r--r--src/particles/qquickparticleaffector.cpp4
-rw-r--r--src/particles/qquickparticleemitter.cpp4
-rw-r--r--src/particles/qquicktrailemitter.cpp4
-rw-r--r--src/qml/qml/qqmldata_p.h1
-rw-r--r--src/qml/qml/qqmlengine.cpp17
-rw-r--r--src/qml/qml/qqmlglobal_p.h15
-rw-r--r--src/quick/items/context2d/qquickcanvasitem.cpp7
-rw-r--r--src/quick/items/context2d/qquickcanvasitem_p.h1
-rw-r--r--src/quick/items/qquickitem.cpp10
-rw-r--r--src/quick/items/qquickitem_p.h4
-rw-r--r--src/quick/items/qquickmousearea.cpp14
-rw-r--r--src/quick/items/qquicktext.cpp8
-rw-r--r--src/quick/items/qquickvisualdatamodel.cpp8
14 files changed, 72 insertions, 29 deletions
diff --git a/src/particles/qquickcustomaffector.cpp b/src/particles/qquickcustomaffector.cpp
index acec98192d..788e2446b4 100644
--- a/src/particles/qquickcustomaffector.cpp
+++ b/src/particles/qquickcustomaffector.cpp
@@ -42,6 +42,7 @@
#include "qquickcustomaffector_p.h"
#include <private/qv8engine_p.h>
#include <private/qqmlengine_p.h>
+#include <private/qqmlglobal_p.h>
#include <QQmlEngine>
#include <QDebug>
QT_BEGIN_NAMESPACE
@@ -102,8 +103,7 @@ QQuickCustomAffector::QQuickCustomAffector(QQuickItem *parent) :
bool QQuickCustomAffector::isAffectConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("affectParticles(QQmlV8Handle,qreal)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "affectParticles(QQmlV8Handle,qreal)");
}
void QQuickCustomAffector::affectSystem(qreal dt)
diff --git a/src/particles/qquickparticleaffector.cpp b/src/particles/qquickparticleaffector.cpp
index 0005af86af..e2be8771d4 100644
--- a/src/particles/qquickparticleaffector.cpp
+++ b/src/particles/qquickparticleaffector.cpp
@@ -41,6 +41,7 @@
#include "qquickparticleaffector_p.h"
#include <QDebug>
+#include <private/qqmlglobal_p.h>
QT_BEGIN_NAMESPACE
/*!
@@ -146,8 +147,7 @@ QQuickParticleAffector::QQuickParticleAffector(QQuickItem *parent) :
bool QQuickParticleAffector::isAffectedConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("affected(qreal,qreal)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "affected(qreal,qreal)");
}
diff --git a/src/particles/qquickparticleemitter.cpp b/src/particles/qquickparticleemitter.cpp
index 035d66cbcd..8181e8b4f1 100644
--- a/src/particles/qquickparticleemitter.cpp
+++ b/src/particles/qquickparticleemitter.cpp
@@ -41,6 +41,7 @@
#include "qquickparticleemitter_p.h"
#include <private/qqmlengine_p.h>
+#include <private/qqmlglobal_p.h>
QT_BEGIN_NAMESPACE
@@ -253,8 +254,7 @@ QQuickParticleEmitter::~QQuickParticleEmitter()
bool QQuickParticleEmitter::isEmitConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("emitParticles(QQmlV8Handle)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "emitParticles(QQmlV8Handle)");
}
void QQuickParticleEmitter::componentComplete()
diff --git a/src/particles/qquicktrailemitter.cpp b/src/particles/qquicktrailemitter.cpp
index 32f8763599..3ea68ce681 100644
--- a/src/particles/qquicktrailemitter.cpp
+++ b/src/particles/qquicktrailemitter.cpp
@@ -41,6 +41,7 @@
#include "qquicktrailemitter_p.h"
#include <private/qqmlengine_p.h>
+#include <private/qqmlglobal_p.h>
#include <cmath>
QT_BEGIN_NAMESPACE
@@ -126,8 +127,7 @@ QQuickTrailEmitter::QQuickTrailEmitter(QQuickItem *parent) :
bool QQuickTrailEmitter::isEmitFollowConnected()
{
- static int idx = QObjectPrivate::get(this)->signalIndex("emitFollowParticles(QQmlV8Handle,QQmlV8Handle)");
- return QObjectPrivate::get(this)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(this, "emitFollowParticles(QQmlV8Handle,QQmlV8Handle)");
}
void QQuickTrailEmitter::recalcParticlesPerSecond(){
diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h
index b8eee47750..1a188f9e59 100644
--- a/src/qml/qml/qqmldata_p.h
+++ b/src/qml/qml/qqmldata_p.h
@@ -133,6 +133,7 @@ public:
inline QQmlNotifierEndpoint *notify(int index);
void addNotify(int index, QQmlNotifierEndpoint *);
int endpointCount(int index);
+ bool signalHasEndpoint(int index);
// The context that created the C++ object
QQmlContextData *context;
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp
index 7317689907..c1ce012d27 100644
--- a/src/qml/qml/qqmlengine.cpp
+++ b/src/qml/qml/qqmlengine.cpp
@@ -77,13 +77,13 @@
#include <QtCore/qmetaobject.h>
#include <QNetworkAccessManager>
#include <QDebug>
-#include <QMetaObject>
#include <QtCore/qcoreapplication.h>
#include <QtCore/qdir.h>
#include <QtCore/qmutex.h>
#include <QtNetwork/qnetworkconfigmanager.h>
#include <private/qobject_p.h>
+#include <private/qmetaobject_p.h>
#include <private/qqmllocale_p.h>
@@ -1155,6 +1155,21 @@ void QQmlData::addNotify(int index, QQmlNotifierEndpoint *endpoint)
}
}
+bool QQml_isSignalConnected(QObject *obj, int signal_index, int index)
+{
+ QQmlData *data = QQmlData::get(obj);
+ return QObjectPrivate::get(obj)->isSignalConnected(signal_index) || (data && data->signalHasEndpoint(index));
+}
+
+/*
+ index MUST be the index returned by QMetaMethod::index()
+ This is different than the index returned by QObjectPrivate::signalIndex()
+*/
+bool QQmlData::signalHasEndpoint(int index)
+{
+ return notifyList && (notifyList->connectionMask & (1ULL << quint64(index % 64)));
+}
+
QQmlNotifier *QQmlData::objectNameNotifier() const
{
if (!extendedData) extendedData = new QQmlDataExtended;
diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h
index 2356b2d122..04711ae3fc 100644
--- a/src/qml/qml/qqmlglobal_p.h
+++ b/src/qml/qml/qqmlglobal_p.h
@@ -89,6 +89,21 @@ QT_BEGIN_NAMESPACE
QMetaObject::connect(sender, signalIdx, receiver, methodIdx, Qt::DirectConnection); \
}
+bool Q_QML_EXPORT QQml_isSignalConnected(QObject*, int, int);
+
+#define IS_SIGNAL_CONNECTED(Sender, Signal) \
+do { \
+ QObject *sender = (Sender); \
+ const char *signal = (Signal); \
+ static int signalIdx = -1; \
+ static int methodIdx = -1; \
+ if (signalIdx < 0) { \
+ signalIdx = QObjectPrivate::get(sender)->signalIndex(signal); \
+ methodIdx = sender->metaObject()->indexOfSignal(signal); \
+ } \
+ return QQml_isSignalConnected(sender, signalIdx, methodIdx); \
+} while (0)
+
struct QQmlGraphics_DerivedObject : public QObject
{
void setParent_noEvent(QObject *parent) {
diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp
index 4f849c771b..6c8c8f3f53 100644
--- a/src/quick/items/context2d/qquickcanvasitem.cpp
+++ b/src/quick/items/context2d/qquickcanvasitem.cpp
@@ -446,6 +446,11 @@ QQuickCanvasContext* QQuickCanvasItem::rawContext() const
return d_func()->context;
}
+bool QQuickCanvasItem::isPaintConnected()
+{
+ IS_SIGNAL_CONNECTED(this, "paint(QRect)");
+}
+
void QQuickCanvasItem::sceneGraphInitialized()
{
Q_D(QQuickCanvasItem);
@@ -456,7 +461,7 @@ void QQuickCanvasItem::sceneGraphInitialized()
if (!d->contextType.isNull())
QMetaObject::invokeMethod(this, "delayedCreate", Qt::QueuedConnection);
- else if (receivers(SIGNAL(paint(QRect))) > 0)
+ else if (isPaintConnected())
QMetaObject::invokeMethod(this, "requestPaint", Qt::QueuedConnection);
}
diff --git a/src/quick/items/context2d/qquickcanvasitem_p.h b/src/quick/items/context2d/qquickcanvasitem_p.h
index 9a57733d4c..5238fbcf6d 100644
--- a/src/quick/items/context2d/qquickcanvasitem_p.h
+++ b/src/quick/items/context2d/qquickcanvasitem_p.h
@@ -158,6 +158,7 @@ private:
bool createContext(const QString &contextType);
void initializeContext(QQuickCanvasContext *context, const QVariantMap &args = QVariantMap());
QRect tiledRect(const QRectF &window, const QSize &tileSize);
+ bool isPaintConnected();
};
QT_END_NAMESPACE
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index cf06dc228f..5259b62526 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -907,9 +907,13 @@ const QQuickKeysAttached::SigMap QQuickKeysAttached::sigMap[] = {
{ 0, 0 }
};
-bool QQuickKeysAttachedPrivate::isConnected(const char *signalName)
+bool QQuickKeysAttached::isConnected(const char *signalName)
{
- return isSignalConnected(signalIndex(signalName));
+ Q_D(QQuickKeysAttached);
+ //### doing two string-based lookups isn't ideal
+ int signal_index = d->signalIndex(signalName);
+ int index = metaObject()->indexOfSignal(signalName);
+ return QQml_isSignalConnected(this, signal_index, index);
}
/*!
@@ -1369,7 +1373,7 @@ void QQuickKeysAttached::keyPressed(QKeyEvent *event, bool post)
QByteArray keySignal = keyToSignal(event->key());
if (!keySignal.isEmpty()) {
keySignal += "(QQuickKeyEvent*)";
- if (d->isConnected(keySignal)) {
+ if (isConnected(keySignal)) {
// If we specifically handle a key then default to accepted
ke.setAccepted(true);
int idx = QQuickKeysAttached::staticMetaObject.indexOfSignal(keySignal);
diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h
index 89c09ed015..ed762d011a 100644
--- a/src/quick/items/qquickitem_p.h
+++ b/src/quick/items/qquickitem_p.h
@@ -710,8 +710,6 @@ public:
, inIM(false), enabled(true), imeItem(0), item(0)
{}
- bool isConnected(const char *signalName);
-
//loop detection
bool inPress:1;
bool inRelease:1;
@@ -827,6 +825,8 @@ private:
return keySignal;
}
+ bool isConnected(const char *signalName);
+
struct SigMap {
int key;
const char *sig;
diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp
index 956ca09aac..9185556cc9 100644
--- a/src/quick/items/qquickmousearea.cpp
+++ b/src/quick/items/qquickmousearea.cpp
@@ -45,6 +45,8 @@
#include "qquickevents_p_p.h"
#include "qquickdrag_p.h"
+#include <private/qqmldata_p.h>
+
#include <QtGui/qevent.h>
#include <QtGui/qguiapplication.h>
#include <QtGui/qstylehints.h>
@@ -218,29 +220,25 @@ void QQuickMouseAreaPrivate::saveEvent(QMouseEvent *event)
bool QQuickMouseAreaPrivate::isPressAndHoldConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("pressAndHold(QQuickMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "pressAndHold(QQuickMouseEvent*)");
}
bool QQuickMouseAreaPrivate::isDoubleClickConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("doubleClicked(QQuickMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "doubleClicked(QQuickMouseEvent*)");
}
bool QQuickMouseAreaPrivate::isClickConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("clicked(QQuickMouseEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "clicked(QQuickMouseEvent*)");
}
bool QQuickMouseAreaPrivate::isWheelConnected()
{
Q_Q(QQuickMouseArea);
- static int idx = QObjectPrivate::get(q)->signalIndex("wheel(QQuickWheelEvent*)");
- return QObjectPrivate::get(q)->isSignalConnected(idx);
+ IS_SIGNAL_CONNECTED(q, "wheel(QQuickWheelEvent*)");
}
void QQuickMouseAreaPrivate::propagate(QQuickMouseEvent* event, PropagateType t)
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
index cfedfbd890..2407ade988 100644
--- a/src/quick/items/qquicktext.cpp
+++ b/src/quick/items/qquicktext.cpp
@@ -594,8 +594,8 @@ void QQuickText::doLayout()
bool QQuickTextPrivate::isLineLaidOutConnected()
{
- static int idx = this->signalIndex("lineLaidOut(QQuickTextLine*)");
- return this->isSignalConnected(idx);
+ Q_Q(QQuickText);
+ IS_SIGNAL_CONNECTED(q, "lineLaidOut(QQuickTextLine*)");
}
void QQuickTextPrivate::setupCustomLineGeometry(QTextLine &line, qreal &height, int lineOffset)
@@ -2406,8 +2406,8 @@ QString QQuickTextPrivate::anchorAt(const QPointF &mousePos)
bool QQuickTextPrivate::isLinkActivatedConnected()
{
- static int idx = this->signalIndex("linkActivated(QString)");
- return this->isSignalConnected(idx);
+ Q_Q(QQuickText);
+ IS_SIGNAL_CONNECTED(q, "linkActivated(QString)");
}
/*! \internal */
diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp
index cea83969f3..5046b1afe0 100644
--- a/src/quick/items/qquickvisualdatamodel.cpp
+++ b/src/quick/items/qquickvisualdatamodel.cpp
@@ -1748,11 +1748,15 @@ void QQuickVisualDataGroupPrivate::setModel(QQuickVisualDataModel *m, Compositor
group = g;
}
+static bool isChangedConnected(QObject *obj)
+{
+ IS_SIGNAL_CONNECTED(obj, "changed(QQmlV8Handle,QQmlV8Handle)");
+}
+
void QQuickVisualDataGroupPrivate::emitChanges(QV8Engine *engine)
{
Q_Q(QQuickVisualDataGroup);
- static int idx = signalIndex("changed(QQmlV8Handle,QQmlV8Handle)");
- if (isSignalConnected(idx) && !changeSet.isEmpty()) {
+ if (isChangedConnected(q) && !changeSet.isEmpty()) {
v8::HandleScope handleScope;
v8::Context::Scope contextScope(engine->context());
v8::Local<v8::Array> removed = QQuickVisualDataModelPrivate::buildChangeList(changeSet.removes());