diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-08-18 12:38:24 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-08-25 14:28:00 +0200 |
commit | 8ef1e1e7a4107f96a526c19bbe25ed6f1654e7ea (patch) | |
tree | 27157247b09d66486a8eccbfe3231581b9b8fb1a /src/qml/qml/qqmlobjectcreator_p.h | |
parent | 44108a88dd616fbfb71cebcc043b09f46b0e036e (diff) |
Protect some members in QQmlObjectCreator
Avoid dangling pointers when nested incubators are being used.
Task-number: QTBUG-40437
Change-Id: I73922d2f373b2efbc00983305cdea9e8d60f0c41
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/qml/qqmlobjectcreator_p.h')
-rw-r--r-- | src/qml/qml/qqmlobjectcreator_p.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h index fb4d71d054..73800ca9df 100644 --- a/src/qml/qml/qqmlobjectcreator_p.h +++ b/src/qml/qml/qqmlobjectcreator_p.h @@ -50,6 +50,8 @@ #include <private/qrecursionwatcher_p.h> #include <private/qqmlprofiler_p.h> +#include <qpointer.h> + QT_BEGIN_NAMESPACE class QQmlAbstractBinding; @@ -63,7 +65,7 @@ struct QQmlObjectCreatorSharedState : public QSharedData QQmlContextData *creationContext; QFiniteStack<QQmlAbstractBinding*> allCreatedBindings; QFiniteStack<QQmlParserStatus*> allParserStatusCallbacks; - QFiniteStack<QObject*> allCreatedObjects; + QFiniteStack<QPointer<QObject> > allCreatedObjects; QV4::Value *allJavaScriptObjects; // pointer to vector on JS stack to reference JS wrappers during creation phase. QQmlComponentAttached *componentAttached; QList<QQmlEnginePrivate::FinalizeCallback> finalizeCallbacks; @@ -89,8 +91,8 @@ public: QList<QQmlError> errors; - QQmlContextData *parentContextData() const { return parentContext; } - QFiniteStack<QObject*> &allCreatedObjects() const { return sharedState->allCreatedObjects; } + QQmlContextData *parentContextData() { return parentContext.contextData(); } + QFiniteStack<QPointer<QObject> > &allCreatedObjects() const { return sharedState->allCreatedObjects; } private: QQmlObjectCreator(QQmlContextData *contextData, QQmlCompiledData *compiledData, QQmlObjectCreatorSharedState *inheritedSharedState); @@ -123,7 +125,7 @@ private: QQmlEngine *engine; QQmlCompiledData *compiledData; const QV4::CompiledData::QmlUnit *qmlUnit; - QQmlContextData *parentContext; + QQmlGuardedContextData parentContext; QQmlContextData *context; const QHash<int, QQmlCompiledData::TypeReference*> &resolvedTypes; const QVector<QQmlPropertyCache *> &propertyCaches; |