summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2019-05-27 17:45:39 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2019-05-29 14:33:01 +0200
commit0f51d6a228b1d042b8ffc1f9436c7d253a454345 (patch)
tree27e1812abb62b7164269798d5406345fd9d839bf
parentfba55184b93e8f084b45716162581a6132fe94cc (diff)
Optimize connectToState() method
Introduce a cache of state name to signal index and use it in connectToStateImpl. Change-Id: I75af2b77b12d6e087163612f3ba10590a14fd9e2 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r--src/scxml/qscxmlstatemachine.cpp8
-rw-r--r--src/scxml/qscxmlstatemachine_p.h1
2 files changed, 7 insertions, 2 deletions
diff --git a/src/scxml/qscxmlstatemachine.cpp b/src/scxml/qscxmlstatemachine.cpp
index 8c9e6d4..23f8a71 100644
--- a/src/scxml/qscxmlstatemachine.cpp
+++ b/src/scxml/qscxmlstatemachine.cpp
@@ -768,6 +768,7 @@ void QScxmlStateMachinePrivate::attach(QScxmlStateMachineInfo *info)
void QScxmlStateMachinePrivate::updateMetaCache()
{
m_stateIndexToSignalIndex.clear();
+ m_stateNameToSignalIndex.clear();
if (!m_tableData)
return;
@@ -776,10 +777,14 @@ void QScxmlStateMachinePrivate::updateMetaCache()
return;
int signalIndex = 0;
+ const int methodOffset = QMetaObjectPrivate::signalOffset(m_metaObject);
for (int i = 0; i < m_stateTable->stateCount; ++i) {
const auto &s = m_stateTable->state(i);
if (!s.isHistoryState() && s.type != StateTable::State::Invalid) {
m_stateIndexToSignalIndex.insert(i, signalIndex);
+ m_stateNameToSignalIndex.insert(m_tableData->string(s.name),
+ signalIndex + methodOffset);
+
++signalIndex;
}
}
@@ -1909,8 +1914,7 @@ QMetaObject::Connection QScxmlStateMachine::connectToStateImpl(const QString &sc
types = QtPrivate::ConnectionTypes<QtPrivate::List<bool> >::types();
Q_D(QScxmlStateMachine);
- int signalIndex = QScxmlInternal::signalIndex(d->m_metaObject,
- scxmlStateName.toUtf8() + "Changed(bool)");
+ const int signalIndex = d->m_stateNameToSignalIndex.value(scxmlStateName);
return signalIndex < 0 ? QMetaObject::Connection()
: QObjectPrivate::connectImpl(this, signalIndex, receiver, slot, slotObj,
type, types, d->m_metaObject);
diff --git a/src/scxml/qscxmlstatemachine_p.h b/src/scxml/qscxmlstatemachine_p.h
index aa08f1c..1c354fa 100644
--- a/src/scxml/qscxmlstatemachine_p.h
+++ b/src/scxml/qscxmlstatemachine_p.h
@@ -382,6 +382,7 @@ private:
QScxmlInternal::StateMachineInfoProxy *m_infoSignalProxy;
QHash<int, int> m_stateIndexToSignalIndex;
+ QHash<QString, int> m_stateNameToSignalIndex;
};
QT_END_NAMESPACE