QStateMachine: fix some misleading code
The old code creates a RestorableId from the passed (QObject*, QByteArray) and used it for lookup in a hash table (ok) and as a container for the (QObject*, QByteArray), satisfying later references to those parameters from the RestorableId instance instead of using the parameters directly. Now, RestorableId holds the QObject* in a QPointer, so the code might have wanted to detect the object being destroyed as part of the operation, BUT: a) the operation is a read-only one, and b) the code didn't check for nullness before dereferencing the QObject*. Fix by moving the creation of the RestorableId into the scope it's used and otherwise using the parameters directly. Change-Id: Iaf12f722fe6841ee1a55037fe33a6115aa699aca Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
3ecc44d5d2
commit
65eb573926
@ -882,11 +882,10 @@ QVariant QStateMachinePrivate::savedValueForRestorable(const QList<QAbstractStat
|
|||||||
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
|
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
|
||||||
qDebug() << q_func() << ": savedValueForRestorable(" << exitedStates_sorted << object << propertyName << ")";
|
qDebug() << q_func() << ": savedValueForRestorable(" << exitedStates_sorted << object << propertyName << ")";
|
||||||
#endif
|
#endif
|
||||||
RestorableId id(object, propertyName);
|
|
||||||
for (int i = exitedStates_sorted.size() - 1; i >= 0; --i) {
|
for (int i = exitedStates_sorted.size() - 1; i >= 0; --i) {
|
||||||
QAbstractState *s = exitedStates_sorted.at(i);
|
QAbstractState *s = exitedStates_sorted.at(i);
|
||||||
QHash<RestorableId, QVariant> restorables = registeredRestorablesForState.value(s);
|
QHash<RestorableId, QVariant> restorables = registeredRestorablesForState.value(s);
|
||||||
QHash<RestorableId, QVariant>::const_iterator it = restorables.constFind(id);
|
QHash<RestorableId, QVariant>::const_iterator it = restorables.constFind(RestorableId(object, propertyName));
|
||||||
if (it != restorables.constEnd()) {
|
if (it != restorables.constEnd()) {
|
||||||
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
|
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
|
||||||
qDebug() << q_func() << ": using" << it.value() << "from" << s;
|
qDebug() << q_func() << ": using" << it.value() << "from" << s;
|
||||||
@ -897,7 +896,7 @@ QVariant QStateMachinePrivate::savedValueForRestorable(const QList<QAbstractStat
|
|||||||
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
|
#ifdef QSTATEMACHINE_RESTORE_PROPERTIES_DEBUG
|
||||||
qDebug() << q_func() << ": falling back to current value";
|
qDebug() << q_func() << ": falling back to current value";
|
||||||
#endif
|
#endif
|
||||||
return id.first->property(id.second);
|
return object->property(propertyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QStateMachinePrivate::registerRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName,
|
void QStateMachinePrivate::registerRestorable(QAbstractState *state, QObject *object, const QByteArray &propertyName,
|
||||||
|
Loading…
Reference in New Issue
Block a user