QQmlMetaType: Clear property caches on qmlClearTypeRegistrations
Otherwise we may retain dangling pointers referencing invalid property caches. Some metaobjects are created on the heap. If the memory manager decides to re-use the heap space for new metaobjects, we can retrieve the invalid property caches. Pick-to: 6.5 6.4 6.2 Task-number: QTBUG-110933 Change-Id: Ic00bb852151bcf58ba6ae798a6bf2cea686a9e10 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
parent
93956372d9
commit
6937f2e50d
|
@ -317,6 +317,7 @@ void QQmlMetaType::clearTypeRegistrations()
|
|||
data->urlToNonFileImportType.clear();
|
||||
data->metaObjectToType.clear();
|
||||
data->undeletableTypes.clear();
|
||||
data->propertyCaches.clear();
|
||||
}
|
||||
|
||||
int QQmlMetaType::registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &function)
|
||||
|
|
|
@ -51,6 +51,8 @@ private slots:
|
|||
void enumsInRecursiveImport();
|
||||
|
||||
void revertValueTypeAnimation();
|
||||
|
||||
void clearPropertyCaches();
|
||||
};
|
||||
|
||||
class TestType : public QObject
|
||||
|
@ -724,6 +726,18 @@ void tst_qqmlmetatype::revertValueTypeAnimation()
|
|||
QCOMPARE(o->property("pointSize").toDouble(), 12.0);
|
||||
}
|
||||
|
||||
void tst_qqmlmetatype::clearPropertyCaches()
|
||||
{
|
||||
qmlClearTypeRegistrations();
|
||||
qmlRegisterType<TestType>("ClearPropertyCaches", 1, 0, "A");
|
||||
QQmlPropertyCache::ConstPtr oldCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject);
|
||||
QVERIFY(oldCache);
|
||||
qmlClearTypeRegistrations();
|
||||
qmlRegisterType<TestType>("ClearPropertyCaches", 1, 0, "B");
|
||||
QQmlPropertyCache::ConstPtr newCache = QQmlMetaType::propertyCache(&TestType::staticMetaObject);
|
||||
QVERIFY(oldCache.data() != newCache.data());
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_qqmlmetatype)
|
||||
|
||||
#include "tst_qqmlmetatype.moc"
|
||||
|
|
Loading…
Reference in New Issue