qt5-5.15.9
This commit is contained in:
@@ -1,52 +1,23 @@
|
||||
diff --git a/src/qml/common/qqmljsfixedpoolarray_p.h b/src/qml/common/qqmljsfixedpoolarray_p.h
|
||||
index b65b994d6c..15a8cd6878 100644
|
||||
--- a/src/qml/common/qqmljsfixedpoolarray_p.h
|
||||
+++ b/src/qml/common/qqmljsfixedpoolarray_p.h
|
||||
@@ -86,7 +86,7 @@ public:
|
||||
if (QTypeInfo<T>::isComplex) {
|
||||
for (int i = 0; i < count; ++i)
|
||||
new (data + i) T(vector.at(i));
|
||||
- } else {
|
||||
+ } else if (count) {
|
||||
memcpy(data, static_cast<const void*>(vector.constData()), count * sizeof(T));
|
||||
}
|
||||
}
|
||||
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
|
||||
index e57cdd8278..94613598af 100644
|
||||
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
|
||||
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
|
||||
@@ -1145,8 +1145,7 @@ void Heap::QObjectWrapper::markObjects(Heap::Base *that, QV4::MarkStack *markSta
|
||||
void QObjectWrapper::destroyObject(bool lastCall)
|
||||
{
|
||||
Heap::QObjectWrapper *h = d();
|
||||
- if (!h->internalClass)
|
||||
- return; // destroyObject already got called
|
||||
+ Q_ASSERT(h->internalClass);
|
||||
|
||||
if (h->object()) {
|
||||
QQmlData *ddata = QQmlData::get(h->object(), false);
|
||||
@@ -1176,7 +1175,7 @@ void QObjectWrapper::destroyObject(bool lastCall)
|
||||
}
|
||||
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
|
||||
index 10c6c41338..39bfcdc999 100644
|
||||
--- a/src/qml/qml/qqmlimport.cpp
|
||||
+++ b/src/qml/qml/qqmlimport.cpp
|
||||
@@ -2120,9 +2120,12 @@ void QQmlImportDatabase::addImportPath(const QString& path)
|
||||
cPath.replace(Backslash, Slash);
|
||||
}
|
||||
|
||||
- h->~Data();
|
||||
+ h->destroy();
|
||||
- if (!cPath.isEmpty()
|
||||
- && !fileImportPath.contains(cPath))
|
||||
- fileImportPath.prepend(cPath);
|
||||
+ if (!cPath.isEmpty()) {
|
||||
+ if (fileImportPath.contains(cPath))
|
||||
+ fileImportPath.move(fileImportPath.indexOf(cPath), 0);
|
||||
+ else
|
||||
+ fileImportPath.prepend(cPath);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp
|
||||
index 06caf04e5a..da149a67c4 100644
|
||||
--- a/src/qml/memory/qv4mm.cpp
|
||||
+++ b/src/qml/memory/qv4mm.cpp
|
||||
@@ -981,7 +981,7 @@ void MemoryManager::sweep(bool lastSweep, ClassDestroyStatsCallback classCountPt
|
||||
|
||||
if (MultiplyWrappedQObjectMap *multiplyWrappedQObjects = engine->m_multiplyWrappedQObjects) {
|
||||
for (MultiplyWrappedQObjectMap::Iterator it = multiplyWrappedQObjects->begin(); it != multiplyWrappedQObjects->end();) {
|
||||
- if (!it.value().isNullOrUndefined())
|
||||
+ if (it.value().isNullOrUndefined())
|
||||
it = multiplyWrappedQObjects->erase(it);
|
||||
else
|
||||
++it;
|
||||
/*!
|
||||
diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp
|
||||
index 175de8b936..a6ba4b8cb3 100644
|
||||
--- a/src/qml/qml/qqmltypewrapper.cpp
|
||||
@@ -78,7 +49,7 @@ index 29ed62cd39..aba930dfe1 100644
|
||||
}
|
||||
}
|
||||
diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp
|
||||
index 2079a8ed04..a577cb2351 100644
|
||||
index 523c0df779..bc6b2447af 100644
|
||||
--- a/src/qmlmodels/qqmldelegatemodel.cpp
|
||||
+++ b/src/qmlmodels/qqmldelegatemodel.cpp
|
||||
@@ -389,6 +389,12 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel()
|
||||
@@ -107,7 +78,7 @@ index 2079a8ed04..a577cb2351 100644
|
||||
QObject::disconnect(aim, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)),
|
||||
q, SLOT(_q_dataChanged(QModelIndex,QModelIndex,QVector<int>)));
|
||||
QObject::disconnect(aim, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
|
||||
@@ -1973,6 +1985,38 @@ void QQmlDelegateModel::_q_rowsMoved(
|
||||
@@ -1974,6 +1986,38 @@ void QQmlDelegateModel::_q_rowsMoved(
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,7 +132,7 @@ index 8aab4badca..d140bfbaaf 100644
|
||||
void _q_rowsRemoved(const QModelIndex &,int,int);
|
||||
void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
|
||||
diff --git a/src/quick/accessible/qaccessiblequickitem.cpp b/src/quick/accessible/qaccessiblequickitem.cpp
|
||||
index 85719fdc80..78e2ab302c 100644
|
||||
index ae1954ae8d..a8df58d450 100644
|
||||
--- a/src/quick/accessible/qaccessiblequickitem.cpp
|
||||
+++ b/src/quick/accessible/qaccessiblequickitem.cpp
|
||||
@@ -46,6 +46,7 @@
|
||||
@@ -217,7 +188,7 @@ index 85719fdc80..78e2ab302c 100644
|
||||
} else {
|
||||
while (parent && !parent->d_func()->isAccessible)
|
||||
parent = parent->parentItem();
|
||||
@@ -188,7 +197,7 @@ QAccessible::State QAccessibleQuickItem::state() const
|
||||
@@ -193,7 +202,7 @@ QAccessible::State QAccessibleQuickItem::state() const
|
||||
QRect viewRect_ = viewRect();
|
||||
QRect itemRect = rect();
|
||||
|
||||
@@ -226,7 +197,7 @@ index 85719fdc80..78e2ab302c 100644
|
||||
state.invisible = true;
|
||||
if (!viewRect_.intersects(itemRect))
|
||||
state.offscreen = true;
|
||||
@@ -201,6 +210,10 @@ QAccessible::State QAccessibleQuickItem::state() const
|
||||
@@ -206,6 +215,10 @@ QAccessible::State QAccessibleQuickItem::state() const
|
||||
if (role() == QAccessible::EditableText)
|
||||
if (auto ti = qobject_cast<QQuickTextInput *>(item()))
|
||||
state.passwordEdit = ti->echoMode() != QQuickTextInput::Normal;
|
||||
@@ -281,7 +252,7 @@ index 8321fcfeed..383078b3b9 100644
|
||||
drag->setMimeData(mimeData);
|
||||
if (pixmapLoader.isReady()) {
|
||||
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
|
||||
index 75f1457816..dec0ae19ae 100644
|
||||
index 33da9762d3..c370d6e5c3 100644
|
||||
--- a/src/quick/items/qquickitem.cpp
|
||||
+++ b/src/quick/items/qquickitem.cpp
|
||||
@@ -59,6 +59,7 @@
|
||||
@@ -418,19 +389,6 @@ index 841d91bb40..ade8fb61f2 100644
|
||||
|
||||
enum DirtyType {
|
||||
TransformOrigin = 0x00000001,
|
||||
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
|
||||
index 010a0152e1..f8ad168a17 100644
|
||||
--- a/src/quick/items/qquickitemview.cpp
|
||||
+++ b/src/quick/items/qquickitemview.cpp
|
||||
@@ -1785,7 +1785,7 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to)
|
||||
|
||||
do {
|
||||
bufferPause.stop();
|
||||
- if (currentChanges.hasPendingChanges() || bufferedChanges.hasPendingChanges()) {
|
||||
+ if (currentChanges.hasPendingChanges() || bufferedChanges.hasPendingChanges() || currentChanges.active) {
|
||||
currentChanges.reset();
|
||||
bufferedChanges.reset();
|
||||
releaseVisibleItems(reusableFlag);
|
||||
diff --git a/src/quick/items/qquickmousearea_p_p.h b/src/quick/items/qquickmousearea_p_p.h
|
||||
index fba383e268..0d63618622 100644
|
||||
--- a/src/quick/items/qquickmousearea_p_p.h
|
||||
@@ -451,65 +409,6 @@ index fba383e268..0d63618622 100644
|
||||
QPointF startScene;
|
||||
QPointF targetStartPos;
|
||||
QPointF lastPos;
|
||||
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
|
||||
index 6230186933..e823ca1095 100644
|
||||
--- a/src/quick/items/qquicktext.cpp
|
||||
+++ b/src/quick/items/qquicktext.cpp
|
||||
@@ -2168,7 +2168,7 @@ void QQuickText::resetMaximumLineCount()
|
||||
<img src="" align="top,middle,bottom" width="" height=""> - inline images
|
||||
<ol type="">, <ul type=""> and <li> - ordered and unordered lists
|
||||
<pre></pre> - preformatted
|
||||
- > < &
|
||||
+ > < & " '
|
||||
\endcode
|
||||
|
||||
\c Text.StyledText parser is strict, requiring tags to be correctly nested.
|
||||
diff --git a/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp
|
||||
index eb4db0f85e..2325a2665b 100644
|
||||
--- a/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp
|
||||
+++ b/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp
|
||||
@@ -446,7 +446,7 @@ bool QSGRhiDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
|
||||
|
||||
const char *textureRecord = allocatorData;
|
||||
for (int i = 0; i < textureCount; ++i, textureRecord += Qtdf::TextureRecordSize) {
|
||||
- if (textureRecord + Qtdf::TextureRecordSize > qtdfTableEnd) {
|
||||
+ if (qtdfTableEnd - textureRecord < Qtdf::TextureRecordSize) {
|
||||
qWarning("qtdf table too small in font '%s'.",
|
||||
qPrintable(font.familyName()));
|
||||
return false;
|
||||
@@ -462,7 +462,7 @@ bool QSGRhiDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
|
||||
|
||||
const char *glyphRecord = textureRecord;
|
||||
for (quint32 i = 0; i < glyphCount; ++i, glyphRecord += Qtdf::GlyphRecordSize) {
|
||||
- if (glyphRecord + Qtdf::GlyphRecordSize > qtdfTableEnd) {
|
||||
+ if (qtdfTableEnd - glyphRecord < Qtdf:: GlyphRecordSize) {
|
||||
qWarning("qtdf table too small in font '%s'.",
|
||||
qPrintable(font.familyName()));
|
||||
return false;
|
||||
@@ -512,8 +512,8 @@ bool QSGRhiDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
|
||||
|
||||
int width = texInfo->allocatedArea.width();
|
||||
int height = texInfo->allocatedArea.height();
|
||||
- qint64 size = width * height;
|
||||
- if (reinterpret_cast<const char *>(textureData + size) > qtdfTableEnd) {
|
||||
+ qint64 size = qint64(width) * height;
|
||||
+ if (qtdfTableEnd - reinterpret_cast<const char *>(textureData) < size) {
|
||||
qWarning("qtdf table too small in font '%s'.",
|
||||
qPrintable(font.familyName()));
|
||||
return false;
|
||||
diff --git a/src/quick/util/qquickstyledtext.cpp b/src/quick/util/qquickstyledtext.cpp
|
||||
index d531fc9205..a25af90414 100644
|
||||
--- a/src/quick/util/qquickstyledtext.cpp
|
||||
+++ b/src/quick/util/qquickstyledtext.cpp
|
||||
@@ -564,6 +564,8 @@ void QQuickStyledTextPrivate::parseEntity(const QChar *&ch, const QString &textI
|
||||
textOut += QChar(60);
|
||||
else if (entity == QLatin1String("amp"))
|
||||
textOut += QChar(38);
|
||||
+ else if (entity == QLatin1String("apos"))
|
||||
+ textOut += QChar(39);
|
||||
else if (entity == QLatin1String("quot"))
|
||||
textOut += QChar(34);
|
||||
else if (entity == QLatin1String("nbsp"))
|
||||
diff --git a/src/quickwidgets/qaccessiblequickwidget.cpp b/src/quickwidgets/qaccessiblequickwidget.cpp
|
||||
new file mode 100644
|
||||
index 0000000000..8a1c901880
|
||||
@@ -1005,63 +904,6 @@ index 2438e577ae..85d156b8a3 100644
|
||||
+ qaccessiblequickwidgetfactory.cpp
|
||||
|
||||
load(qt_module)
|
||||
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
|
||||
index 3b7d74df63..b75bf820d5 100644
|
||||
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
|
||||
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
|
||||
@@ -102,6 +102,7 @@ private slots:
|
||||
void valueConversion_RegularExpression();
|
||||
void castWithMultipleInheritance();
|
||||
void collectGarbage();
|
||||
+ void collectGarbageNestedWrappersTwoEngines();
|
||||
void gcWithNestedDataStructure();
|
||||
void stacktrace();
|
||||
void numberParsing_data();
|
||||
@@ -1809,6 +1810,44 @@ void tst_QJSEngine::collectGarbage()
|
||||
QVERIFY(ptr.isNull());
|
||||
}
|
||||
|
||||
+class TestObjectContainer : public QObject
|
||||
+{
|
||||
+ Q_OBJECT
|
||||
+ Q_PROPERTY(QObject *dummy MEMBER m_dummy CONSTANT)
|
||||
+
|
||||
+public:
|
||||
+ TestObjectContainer() : m_dummy(new QObject(this)) {}
|
||||
+
|
||||
+private:
|
||||
+ QObject *m_dummy;
|
||||
+};
|
||||
+
|
||||
+void tst_QJSEngine::collectGarbageNestedWrappersTwoEngines()
|
||||
+{
|
||||
+ QJSEngine engine1;
|
||||
+ QJSEngine engine2;
|
||||
+
|
||||
+ TestObjectContainer container;
|
||||
+ QQmlEngine::setObjectOwnership(&container, QQmlEngine::CppOwnership);
|
||||
+
|
||||
+ engine1.globalObject().setProperty("foobar", engine1.newQObject(&container));
|
||||
+ engine2.globalObject().setProperty("foobar", engine2.newQObject(&container));
|
||||
+
|
||||
+ engine1.evaluate("foobar.dummy.baz = 42");
|
||||
+ engine2.evaluate("foobar.dummy.baz = 43");
|
||||
+
|
||||
+ QCOMPARE(engine1.evaluate("foobar.dummy.baz").toInt(), 42);
|
||||
+ QCOMPARE(engine2.evaluate("foobar.dummy.baz").toInt(), 43);
|
||||
+
|
||||
+ engine1.collectGarbage();
|
||||
+ engine2.collectGarbage();
|
||||
+
|
||||
+ // The GC should not collect dummy object wrappers neither in engine1 nor engine2, we
|
||||
+ // verify that by checking whether the baz property still has its previous value.
|
||||
+ QCOMPARE(engine1.evaluate("foobar.dummy.baz").toInt(), 42);
|
||||
+ QCOMPARE(engine2.evaluate("foobar.dummy.baz").toInt(), 43);
|
||||
+}
|
||||
+
|
||||
void tst_QJSEngine::gcWithNestedDataStructure()
|
||||
{
|
||||
// The GC must be able to traverse deeply nested objects, otherwise this
|
||||
diff --git a/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml b/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml
|
||||
new file mode 100644
|
||||
index 0000000000..206133bb39
|
||||
@@ -1131,6 +973,22 @@ index 35f1e2c94d..1722447830 100644
|
||||
QTEST_MAIN(tst_QQmlDelegateModel)
|
||||
|
||||
#include "tst_qqmldelegatemodel.moc"
|
||||
diff --git a/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp b/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
|
||||
index 9c865b3f73..1f788f7a7f 100644
|
||||
--- a/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
|
||||
+++ b/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
|
||||
@@ -154,6 +154,11 @@ void tst_QQmlImport::importPathOrder()
|
||||
engine.addImportPath(QT_QMLTEST_DATADIR);
|
||||
expectedImportPaths.prepend(QT_QMLTEST_DATADIR);
|
||||
QCOMPARE(expectedImportPaths, engine.importPathList());
|
||||
+
|
||||
+ // Add qml2Imports again to make it the first of the list
|
||||
+ engine.addImportPath(qml2Imports);
|
||||
+ expectedImportPaths.move(expectedImportPaths.indexOf(qml2Imports), 0);
|
||||
+ QCOMPARE(expectedImportPaths, engine.importPathList());
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(QQmlImports::ImportVersion)
|
||||
diff --git a/tests/auto/qml/qqmllanguage/data/Broken.qml b/tests/auto/qml/qqmllanguage/data/Broken.qml
|
||||
new file mode 100644
|
||||
index 0000000000..e24d9112a8
|
||||
@@ -1188,24 +1046,6 @@ index bffb62c59e..97cc64991f 100644
|
||||
QTEST_MAIN(tst_qqmllanguage)
|
||||
|
||||
#include "tst_qqmllanguage.moc"
|
||||
diff --git a/tests/auto/qml/qv4mm/tst_qv4mm.cpp b/tests/auto/qml/qv4mm/tst_qv4mm.cpp
|
||||
index 5d635aa63b..824fd89e5b 100644
|
||||
--- a/tests/auto/qml/qv4mm/tst_qv4mm.cpp
|
||||
+++ b/tests/auto/qml/qv4mm/tst_qv4mm.cpp
|
||||
@@ -76,10 +76,10 @@ void tst_qv4mm::multiWrappedQObjects()
|
||||
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.
|
||||
+ // The additional WeakValue from m_multiplyWrappedQObjects hasn't been moved
|
||||
+ // to m_pendingFreedObjectWrapperValue yet. It's still alive after all.
|
||||
engine1.memoryManager->runGC();
|
||||
- QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 2);
|
||||
+ QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 1);
|
||||
|
||||
// engine2 doesn't own the object as engine1 was the first to wrap it above.
|
||||
// Therefore, no effect here.
|
||||
diff --git a/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml b/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml
|
||||
new file mode 100644
|
||||
index 0000000000..889e480f3b
|
||||
|
||||
Reference in New Issue
Block a user