[neon/qt6/qt6-declarative/Neon/release] debian/patches: add dc2358e.diff as recommended by distro list

Carlos De Maine null at kde.org
Fri Jan 16 00:21:35 GMT 2026


Git commit cca68e1e24353da66d4f76217933c46ea7f5dbc4 by Carlos De Maine.
Committed on 16/01/2026 at 00:21.
Pushed by carlosdem into branch 'Neon/release'.

add dc2358e.diff as recommended by distro list

A  +133  -0    debian/patches/dc2358e.diff
M  +1    -0    debian/patches/series

https://invent.kde.org/neon/qt6/qt6-declarative/-/commit/cca68e1e24353da66d4f76217933c46ea7f5dbc4

diff --git a/debian/patches/dc2358e.diff b/debian/patches/dc2358e.diff
new file mode 100644
index 0000000..9ce08be
--- /dev/null
+++ b/debian/patches/dc2358e.diff
@@ -0,0 +1,133 @@
+From dc2358e98b8ddab532866a403ffc09d1162ad0f9 Mon Sep 17 00:00:00 2001
+From: Ulf Hermann <ulf.hermann at qt.io>
+Date: Tue, 13 Jan 2026 11:53:27 +0100
+Subject: [PATCH] QtQml: Do not clear objects' propertyCaches on last GC run
+
+The property caches are not specific to the engine. The same object may
+be exposed to other engines and still require its property cache. When
+the clearing of the property caches on engine destruction was
+introduced, the property caches were still engine-specific and we had no
+choice but to clear them. Otherwise any further access would lead to a
+dereference of a dangling pointer.
+
+Furthermore, when clearing the JS wrapper for a QObject, check if it's
+actually the wrapper being deleted. We don't want to clear some other
+engine's wrapper.
+
+Amends commit 749a7212e903d8e8c6f256edb1836b9449cc7fe1.
+Amends commit c6b2dd879d02b21b18f80faab541f8f04286685a.
+
+Pick-to: 6.11 6.10
+Fixes: QTBUG-142514
+Change-Id: I40bb1aeca65225d56cb1d2ff498f5f1722216a70
+Reviewed-by: Fabian Kosmale <fabian.kosmale at qt.io>
+---
+
+diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
+index a8dfd50..e61867b 100644
+--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
++++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
+@@ -1583,10 +1583,9 @@
+                     o->deleteLater();
+             } else {
+                 // If the object is C++-owned, we still have to release the weak reference we have
+-                // to it.
+-                ddata->jsWrapper.clear();
+-                if (lastCall && ddata->propertyCache)
+-                    ddata->propertyCache.reset();
++                // to it. If the "main" wrapper is not ours, we should leave it alone, though.
++                if (ddata->jsWrapper.as<QObjectWrapper>() == this)
++                    ddata->jsWrapper.clear();
+             }
+         }
+     }
+diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+index b56b241..11bc62e 100644
+--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
++++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+@@ -1119,7 +1119,7 @@
+         engine.newQObject(obj.data());
+         QVERIFY(QQmlData::get(obj.data())->propertyCache);
+     }
+-    QVERIFY(!QQmlData::get(obj.data())->propertyCache);
++    QVERIFY(QQmlData::get(obj.data())->propertyCache);
+ }
+ 
+ void tst_QJSEngine::newQMetaObject() {
+diff --git a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt
+index 88cc102..8949d00 100644
+--- a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt
++++ b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt
+@@ -326,6 +326,7 @@
+     stringLength.qml
+     stringToByteArray.qml
+     structuredValueType.qml
++    multiEnginePropertyCache.qml
+     takenumber.qml
+     testlogger.js
+     text.qml
+diff --git a/tests/auto/qml/qmlcppcodegen/data/multiEnginePropertyCache.qml b/tests/auto/qml/qmlcppcodegen/data/multiEnginePropertyCache.qml
+new file mode 100644
+index 0000000..222b2f8
+--- /dev/null
++++ b/tests/auto/qml/qmlcppcodegen/data/multiEnginePropertyCache.qml
+@@ -0,0 +1,20 @@
++pragma Strict
++import QtQml
++
++QtObject {
++    id: root
++
++    property int foo: 0
++    onFooChanged: root.close1()
++
++    property int bar: 0
++    onBarChanged: close2()
++
++    function close1() {
++        console.log("close1")
++    }
++
++    function close2() {
++        console.log("close2")
++    }
++}
+diff --git a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
+index 3ce5627..8d98c02 100644
+--- a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
++++ b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
+@@ -280,6 +280,7 @@
+     void stringLength();
+     void stringToByteArray();
+     void structuredValueType();
++    void multiEnginePropertyCache();
+     void takeNumbers();
+     void takeNumbers_data();
+     void testIsnan();
+@@ -5795,6 +5796,26 @@
+     QCOMPARE(o->property("w2").value<WeatherModelUrl>(), w2);
+ }
+ 
++void tst_QmlCppCodegen::multiEnginePropertyCache()
++{
++    QQmlEngine engine;
++    QQmlComponent c(&engine, QUrl(u"qrc:/qt/qml/TestTypes/multiEnginePropertyCache.qml"_s));
++    QVERIFY2(c.isReady(), qPrintable(c.errorString()));
++    std::unique_ptr<QObject> o(c.create());
++    QVERIFY(o);
++
++    {
++        QJSEngine other;
++        other.newQObject(o.get());
++    }
++
++    QTest::ignoreMessage(QtDebugMsg, "close1");
++    o->setProperty("foo", 1);
++
++    QTest::ignoreMessage(QtDebugMsg, "close2");
++    o->setProperty("bar", 2);
++}
++
+ void tst_QmlCppCodegen::takeNumbers()
+ {
+     QFETCH(QByteArray, method);
diff --git a/debian/patches/series b/debian/patches/series
index 2794c67..0df3e7d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,2 @@
 9c6b2b7.diff
+dc2358e.diff


More information about the Neon-commits mailing list