diff options
Diffstat (limited to 'tests/auto/qml/qv4mm/tst_qv4mm.cpp')
-rw-r--r-- | tests/auto/qml/qv4mm/tst_qv4mm.cpp | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/tests/auto/qml/qv4mm/tst_qv4mm.cpp b/tests/auto/qml/qv4mm/tst_qv4mm.cpp index d4ba363d00..578a47d5fa 100644 --- a/tests/auto/qml/qv4mm/tst_qv4mm.cpp +++ b/tests/auto/qml/qv4mm/tst_qv4mm.cpp @@ -28,29 +28,84 @@ #include <qtest.h> #include <QQmlEngine> +#include <QLoggingCategory> +#include <QQmlComponent> + #include <private/qv4mm_p.h> +#include <private/qv4qobjectwrapper_p.h> + +#include "../../shared/util.h" + +#include <memory> -class tst_qv4mm : public QObject +class tst_qv4mm : public QQmlDataTest { Q_OBJECT private slots: void gcStats(); - void tweaks(); + void multiWrappedQObjects(); + void accessParentOnDestruction(); }; void tst_qv4mm::gcStats() { - qputenv(QV4_MM_STATS, "1"); + QLoggingCategory::setFilterRules("qt.qml.gc.*=true"); QQmlEngine engine; engine.collectGarbage(); } -void tst_qv4mm::tweaks() +void tst_qv4mm::multiWrappedQObjects() +{ + QV4::ExecutionEngine engine1; + QV4::ExecutionEngine engine2; + { + QObject object; + for (int i = 0; i < 10; ++i) + QV4::QObjectWrapper::wrap(i % 2 ? &engine1 : &engine2, &object); + + QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0); + QCOMPARE(engine2.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0); + { + QV4::WeakValue value; + value.set(&engine1, QV4::QObjectWrapper::wrap(&engine1, &object)); + } + + QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 1); + QCOMPARE(engine2.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0); + + // Moves the additional WeakValue from m_multiplyWrappedQObjects to + // m_pendingFreedObjectWrapperValue. It's still alive after all. + engine1.memoryManager->runGC(); + QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 2); + + // engine2 doesn't own the object as engine1 was the first to wrap it above. + // Therefore, no effect here. + engine2.memoryManager->runGC(); + QCOMPARE(engine2.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0); + } + + // Clears m_pendingFreedObjectWrapperValue. Now it's really dead. + engine1.memoryManager->runGC(); + QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0); + + engine2.memoryManager->runGC(); + QCOMPARE(engine2.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0); +} + +void tst_qv4mm::accessParentOnDestruction() { - qputenv(QV4_MM_MAXBLOCK_SHIFT, "5"); - qputenv(QV4_MM_MAX_CHUNK_SIZE, "65536"); + QLoggingCategory::setFilterRules("qt.qml.gc.*=false"); QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("createdestroy.qml")); + std::unique_ptr<QObject> obj(component.create()); + QVERIFY(obj); + QPointer<QObject> timer = qvariant_cast<QObject *>(obj->property("timer")); + QVERIFY(timer); + QTRY_VERIFY(!timer->property("running").toBool()); + QCOMPARE(obj->property("iterations").toInt(), 100); + QCOMPARE(obj->property("creations").toInt(), 100); + QCOMPARE(obj->property("destructions").toInt(), 100); } QTEST_MAIN(tst_qv4mm) |