Accepting request 379806 from KDE:Qt5

Update to 5.6.0

OBS-URL: https://build.opensuse.org/request/show/379806
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtdeclarative?expand=0&rev=29
This commit is contained in:
Dominique Leuenberger 2016-05-17 15:04:44 +00:00 committed by Git OBS Bridge
parent 3dfeb5c7b0
commit 8072a17d1a
9 changed files with 40 additions and 328 deletions

View File

@ -1,43 +0,0 @@
From 19f54b2d2539171f682bcf32cdc7983294355e02 Mon Sep 17 00:00:00 2001
From: Martin Banky <Martin.Banky@gmail.com>
Date: Thu, 15 Oct 2015 23:07:32 -0700
Subject: [PATCH] Scene Graph: Fixed memory leak in
QSGBatchRenderer::Renderer::map()
In the uncommon case (m_context->hasBrokenIndexBufferObjects()
|| m_visualizeMode != VisualizeNothing) of mapping a buffer, malloc is
called without first freeing the previous malloc.
Regression was introduced with:
qt5 commit: 9347499e78f03710eaf24af3c1e7ac650d0ef81d
qtdeclarative commit: a371bac3fba73f92aaa63a68d8ab1ae81a1d1031
[ChangeLog][QtQuick][Scene Graph] Fixed memory leak in
QSGBatchRenderer::Renderer::map()
Task-number: QTBUG-48799
Change-Id: I5ef4b7301d390463845aeb192851f86655962499
---
src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index 60ada14..75923d7 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -902,7 +902,11 @@ void Renderer::map(Buffer *buffer, int byteSize, bool isIndexBuf)
pool.resize(byteSize);
buffer->data = pool.data();
} else {
- buffer->data = (char *) malloc(byteSize);
+ if (buffer->size != byteSize) {
+ if (buffer->data)
+ free(buffer->data);
+ buffer->data = (char *) malloc(byteSize);
+ }
}
buffer->size = byteSize;
--
2.6.0

View File

@ -1,62 +0,0 @@
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index 20b6dd5..96759b1 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -81,6 +81,8 @@ public:
bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo) Q_DECL_OVERRIDE;
void visibleItemsChanged() Q_DECL_OVERRIDE;
+ void removeItem(FxViewItem *item);
+
FxViewItem *newViewItem(int index, QQuickItem *item) Q_DECL_OVERRIDE;
void initializeViewItem(FxViewItem *item) Q_DECL_OVERRIDE;
bool releaseItem(FxViewItem *item) Q_DECL_OVERRIDE;
@@ -686,6 +688,18 @@ bool QQuickListViewPrivate::addVisibleItems(qreal fillFrom, qreal fillTo, qreal
return changed;
}
+void QQuickListViewPrivate::removeItem(FxViewItem *item)
+{
+ if (item->transitionScheduledOrRunning()) {
+ qCDebug(lcItemViewDelegateLifecycle) << "\tnot releasing animating item" << item->index << item->item->objectName();
+ item->releaseAfterTransition = true;
+ releasePendingTransition.append(item);
+ } else {
+ qCDebug(lcItemViewDelegateLifecycle) << "\treleasing stationary item" << item->index << item->item->objectName();
+ releaseItem(item);
+ }
+}
+
bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal bufferTo)
{
FxViewItem *item = 0;
@@ -708,13 +722,7 @@ bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer
if (item->index != -1)
visibleIndex++;
visibleItems.removeAt(index);
- if (item->transitionScheduledOrRunning()) {
- qCDebug(lcItemViewDelegateLifecycle) << "\tnot releasing animating item" << item->index << item->item->objectName();
- item->releaseAfterTransition = true;
- releasePendingTransition.append(item);
- } else {
- releaseItem(item);
- }
+ removeItem(item);
if (index == 0)
break;
item = visibleItems.at(--index);
@@ -730,13 +738,7 @@ bool QQuickListViewPrivate::removeNonVisibleItems(qreal bufferFrom, qreal buffer
break;
qCDebug(lcItemViewDelegateLifecycle) << "refill: remove last" << visibleIndex+visibleItems.count()-1 << item->position() << item->item->objectName();
visibleItems.removeLast();
- if (item->transitionScheduledOrRunning()) {
- qCDebug(lcItemViewDelegateLifecycle) << "\tnot releasing animating item" << item->index << item->item->objectName();
- item->releaseAfterTransition = true;
- releasePendingTransition.append(item);
- } else {
- releaseItem(item);
- }
+ removeItem(item);
changed = true;
}

View File

@ -1,3 +1,19 @@
-------------------------------------------------------------------
Fri Mar 18 19:03:05 UTC 2016 - hrvoje.senjan@gmail.com
- Update to 5.6.0
- Drop support for non-SSE2 machines
- Drop sse2_nojit.patch
- Drop upstreamed patches:
0001-scene-graph-fixed-memory-leak-in-qsgbatchrenderer-re.patch,
Refactor-FxViewItem-releasing-code.patch and
sanitize-visibleItems-list-after-model-insertions.patch
- Add overflow.patch to resolve
"Statement might be overflowing a buffer" post-build-check error
* For more details please see:
http://blog.qt.io/blog/2016/03/16/qt-5-6-released/
and https://wiki.qt.io/New_Features_in_Qt_5.6
-------------------------------------------------------------------
Sat Feb 13 01:54:31 UTC 2016 - matz@suse.com

View File

@ -21,26 +21,20 @@
%define libname libQtQuick5
Name: libqt5-qtdeclarative
Version: 5.5.1
Version: 5.6.0
Release: 0
Summary: Qt 5 Declarative Library
License: SUSE-LGPL-2.1-with-digia-exception-1.1 or GPL-3.0
Group: Development/Libraries/X11
Url: http://qt.digia.com
%define base_name libqt5
%define real_version 5.5.1
%define so_version 5.5.1
%define real_version 5.6.0
%define so_version 5.6.0
%define tar_version qtdeclarative-opensource-src-%{real_version}
Source: %{tar_version}.tar.xz
Source1: baselibs.conf
# PATCH-FIX-OPENSUSE sse2_nojit.patch -- enable JIT and sse2 only on sse2 case
Patch100: sse2_nojit.patch
# PATCH-FIX-UPSTREAM Refactor-FxViewItem-releasing-code.patch
Patch101: Refactor-FxViewItem-releasing-code.patch
# PATCH-FIX-UPSTREAM sanitize-visibleItems-list-after-model-insertions.patch
Patch102: sanitize-visibleItems-list-after-model-insertions.patch
# PATCH-FIX-UPSTREAM QTBUG-48799
Patch103: 0001-scene-graph-fixed-memory-leak-in-qsgbatchrenderer-re.patch
# PATCH-FIX-OPENSUSE overflow.patch -- Statement might be overflowing a buffer
Patch0: overflow.patch
BuildRequires: fdupes
BuildRequires: libQt5Core-private-headers-devel >= %{version}
BuildRequires: libQt5Gui-private-headers-devel >= %{version}
@ -77,10 +71,7 @@ handling.
%prep
%setup -q -n qtdeclarative-opensource-src-%{real_version}
%patch100 -p1
%patch101 -p1
%patch102 -p1
%patch103 -p1
%patch0 -p1
%package -n %libname
Summary: Qt 5 Declarative Library
@ -156,29 +147,11 @@ popd
%make_jobs -C %{_target_platform}
%ifarch %ix86
# build libQt5Qml with no_sse2
mkdir -p %{_target_platform}-no_sse2
pushd %{_target_platform}-no_sse2
%qmake5 -config no_sse2 ..
make sub-src-clean
%make_jobs -C src/qml
popd
%endif
%install
pushd %{_target_platform}
%qmake5_install
popd
%ifarch %ix86
mkdir -p %{buildroot}%{_libqt5_libdir}//sse2
mv %{buildroot}%{_libqt5_libdir}/libQt5Qml.so.5* %{buildroot}%{_libqt5_libdir}/sse2/
pushd %{_target_platform}-no_sse2/src/qml
%qmake5_install
popd
%endif
find %{buildroot}/%{_libdir} -type f -name '*la' -print -exec perl -pi -e 's, -L%{_builddir}/\S+,,g' {} \;
find %{buildroot}/%{_libdir}/pkgconfig -type f -name '*pc' -print -exec perl -pi -e 's, -L%{_builddir}/\S+,,g' {} \;
# kill .la files
@ -209,9 +182,6 @@ popd
%defattr(-,root,root,755)
%doc LGPL_EXCEPTION.txt LICENSE.*
%{_libqt5_libdir}/libQt5Q*.so.*
%ifarch %ix86
%{_libqt5_libdir}/sse2/libQt5Q*.so.*
%endif
%{_libqt5_archdatadir}/qml/QtQuick
%{_libqt5_archdatadir}/qml/QtQuick.2
%{_libqt5_archdatadir}/qml/QtQml/Models.2
@ -222,6 +192,8 @@ popd
%dir %{_libqt5_archdatadir}/qml/QtQml
%{_libqt5_archdatadir}/qml/Qt/labs/folderlistmodel
%{_libqt5_archdatadir}/qml/Qt/labs/settings/
%{_libqt5_archdatadir}/qml/QtQml
%{_libqt5_archdatadir}/qml/builtins.qmltypes
%{_libqt5_plugindir}/qmltooling
%files private-headers-devel
@ -247,7 +219,6 @@ popd
%{_libqt5_libdir}/pkgconfig/Qt5Q*.pc
%{_libqt5_archdatadir}/mkspecs/modules/*.pri
%{_libqt5_archdatadir}/qml/QtTest
%{_libqt5_libdir}/pkgconfig/Qt5QuickParticles.pc
%files examples
%defattr(-,root,root,755)

13
overflow.patch Normal file
View File

@ -0,0 +1,13 @@
--- a/src/qml/jsruntime/qv4value_p.h.orig 2015-08-23 09:15:03.157582462 +0200
+++ b/src/qml/jsruntime/qv4value_p.h 2015-08-23 09:19:46.516039994 +0200
@@ -103,8 +103,8 @@ struct Q_QML_PRIVATE_EXPORT Value
#endif
#ifdef QV4_USE_64_BIT_VALUE_ENCODING
- Q_ALWAYS_INLINE Heap::Base *m() const { Heap::Base *b; memcpy(&b, &_val, 8); return b; }
- Q_ALWAYS_INLINE void setM(Heap::Base *b) { memcpy(&_val, &b, 8); }
+ Q_ALWAYS_INLINE Heap::Base *m() const { Heap::Base *b; memcpy(&b, &_val, QT_POINTER_SIZE); return b; }
+ Q_ALWAYS_INLINE void setM(Heap::Base *b) { memcpy(&_val, &b, QT_POINTER_SIZE); }
#else // !QV4_USE_64_BIT_VALUE_ENCODING
Q_ALWAYS_INLINE Heap::Base *m() const { Heap::Base *b; quint32 v = value(); memcpy(&b, &v, 4); return b; }
Q_ALWAYS_INLINE void setM(Heap::Base *b) { quint32 v; memcpy(&v, &b, 4); setValue(v); }

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5fd14eefb83fff36fb17681693a70868f6aaf6138603d799c16466a094b26791
size 18627840

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8c55f053f0e348577b56da541af74d02d0f2b61c9a6c15152b03dad03dfde04c
size 18865300

View File

@ -1,141 +0,0 @@
From be1ef858f44e1523ba264520a0361981cf9b37c6 Mon Sep 17 00:00:00 2001
From: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
Date: Wed, 25 Nov 2015 12:14:52 -0800
Subject: [PATCH] ListView: Sanitize visibleItems list after model insertions
In QQuickListViewPrivate::applyInsertionChange(), we update the
visibleItems list by first shifting the currently visible items
and then we add as many items as the model was added and at the
right position. We do this in such a way that we won't create
items that will not be visible right away (and may be deleted
right after by removeNonVisibleItems()). However, this may leave
gaps in the item index sequence, and QQuickListView doesn't always
recover gracefully from it.
The purpose of this patch is to make sure those gaps are cleared
right after inserting the new items. Since the insertions can happen
in two different places (either before or after the first visible
item) we need to update the visibleItems list accordingly. The way
we sanitize visibleItems is by removing those items that lie beyond
a possible index gap. If insertion happens before the first visible
item, we'll remove all those items before the insertion point. If
the insertion happens after the first visible item, we'll remove the
items after the insertion point.
Besides that, the logic for inserting before the visible position was
wrong. As items are inserted bottom-up in that case, the insertion
would start by just accounting for the item's size until the condition
pos > from && insertionIdx < visibleIndex
would become false only because 'pos' would be small enough. After
that, the next loop run would start adding items before the 'from'
position, which is wrong. Our fix is to move the condition outside
the loop if the insertion index will be before the visible index
and just account for the items' size in that case. Otherwise, the
insertion happens as usual until pos < from.
Change-Id: I35767cf6e9737bea1fe7677e580245fc7172710c
Task-number: QTBUG-48870
---
src/quick/items/qquicklistview.cpp | 59 ++++++++++++++++++----
1 files changed, 59 insertions(+), 4 deletions(-)
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index c7df855..9f53586 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -3097,12 +3097,13 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch
int i = 0;
qreal from = tempPos - displayMarginBeginning - buffer;
- for (i = count-1; i >= 0; --i) {
- if (pos > from && insertionIdx < visibleIndex) {
- // item won't be visible, just note the size for repositioning
- insertResult->sizeChangesBeforeVisiblePos += averageSize + spacing;
- pos -= averageSize + spacing;
- } else {
+ if (insertionIdx < visibleIndex) {
+ if (pos >= from) {
+ // items won't be visible, just note the size for repositioning
+ insertResult->sizeChangesBeforeVisiblePos += count * (averageSize + spacing);
+ }
+ } else {
+ for (i = count-1; i >= 0 && pos >= from; --i) {
// item is before first visible e.g. in cache buffer
FxViewItem *item = 0;
if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i))))
@@ -3117,17 +3118,33 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch
insertResult->changedFirstItem = true;
if (!change.isMove()) {
addedItems->append(item);
- item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true);
+ if (transitioner)
+ item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true);
+ else
+ static_cast<FxListItemSG *>(item)->setPosition(pos, true);
}
insertResult->sizeChangesBeforeVisiblePos += item->size() + spacing;
pos -= item->size() + spacing;
+ index++;
+ }
+ }
+
+ int firstOkIdx = -1;
+ for (int i = 0; i <= insertionIdx && i < visibleItems.count() - 1; i++) {
+ if (visibleItems.at(i)->index + 1 != visibleItems.at(i + 1)->index) {
+ firstOkIdx = i + 1;
+ break;
}
- index++;
}
+ for (int i = 0; i < firstOkIdx; i++) {
+ FxViewItem *nvItem = visibleItems.takeFirst();
+ addedItems->removeOne(nvItem);
+ removeItem(nvItem);
+ }
+
} else {
- int i = 0;
qreal to = buffer + displayMarginEnd + tempPos + size();
- for (i = 0; i < count && pos <= to; ++i) {
+ for (int i = 0; i < count && pos <= to; ++i) {
FxViewItem *item = 0;
if (change.isMove() && (item = currentChanges.removedItems.take(change.moveKey(modelIndex + i))))
item->index = modelIndex + i;
@@ -3147,12 +3164,32 @@ bool QQuickListViewPrivate::applyInsertionChange(const QQmlChangeSet::Change &ch
movingIntoView->append(MovedItem(item, change.moveKey(item->index)));
} else {
addedItems->append(item);
- item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true);
+ if (transitioner)
+ item->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true);
+ else
+ static_cast<FxListItemSG *>(item)->setPosition(pos, true);
}
insertResult->sizeChangesAfterVisiblePos += item->size() + spacing;
pos += item->size() + spacing;
++index;
}
+
+ if (0 < index && index < visibleItems.count()) {
+ FxViewItem *prevItem = visibleItems.at(index - 1);
+ FxViewItem *item = visibleItems.at(index);
+ if (prevItem->index != item->index - 1) {
+ int i = index;
+ qreal prevPos = prevItem->position();
+ while (i < visibleItems.count()) {
+ FxListItemSG *nvItem = static_cast<FxListItemSG *>(visibleItems.takeLast());
+ insertResult->sizeChangesAfterVisiblePos -= nvItem->size() + spacing;
+ addedItems->removeOne(nvItem);
+ if (nvItem->transitionScheduledOrRunning())
+ nvItem->setPosition(prevPos + (nvItem->index - prevItem->index) * averageSize);
+ removeItem(nvItem);
+ }
+ }
+ }
}
updateVisibleIndex();
--
2.6.2.2.g1b5ffa3

View File

@ -1,42 +0,0 @@
diff --git a/src/qml/jsruntime/jsruntime.pri b/src/qml/jsruntime/jsruntime.pri
index c27aaa9..05c86e8 100644
--- a/src/qml/jsruntime/jsruntime.pri
+++ b/src/qml/jsruntime/jsruntime.pri
@@ -105,6 +105,11 @@ SOURCES += \
$$PWD/qv4string.cpp \
$$PWD/qv4value.cpp
+linux-g++*:isEqual(QT_ARCH,i386):!no_sse2 {
+ QMAKE_CFLAGS += -msse2 -mfpmath=sse
+ QMAKE_CXXFLAGS += -msse2 -mfpmath=sse
+}
+
valgrind {
DEFINES += V4_USE_VALGRIND
}
diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h
index a58beb3..85e8dc0 100644
--- a/src/qml/jsruntime/qv4global_p.h
+++ b/src/qml/jsruntime/qv4global_p.h
@@ -85,7 +85,7 @@ inline double trunc(double d) { return d > 0 ? floor(d) : ceil(d); }
// Black list some platforms
#if defined(V4_ENABLE_JIT)
-#if defined(Q_OS_IOS) || defined(Q_OS_WINRT)
+#if defined(Q_OS_IOS) || defined(Q_OS_WINRT) || (defined(Q_PROCESSOR_X86) && !defined(__SSE2__))
# undef V4_ENABLE_JIT
#endif
#endif
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index 39b816f..762ee61 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -123,7 +123,7 @@ QV8Engine::QV8Engine(QJSEngine* qq)
{
#ifdef Q_PROCESSOR_X86_32
if (!qCpuHasFeature(SSE2)) {
- qFatal("This program requires an X86 processor that supports SSE2 extension, at least a Pentium 4 or newer");
+ qDebug("This program requires an X86 processor that supports SSE2 extension, at least a Pentium 4 or newer, processors missing the extension are NOT supported to run QML2 code!");
}
#endif