diff --git a/0001-scene-graph-fixed-memory-leak-in-qsgbatchrenderer-re.patch b/0001-scene-graph-fixed-memory-leak-in-qsgbatchrenderer-re.patch deleted file mode 100644 index 7076177..0000000 --- a/0001-scene-graph-fixed-memory-leak-in-qsgbatchrenderer-re.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 19f54b2d2539171f682bcf32cdc7983294355e02 Mon Sep 17 00:00:00 2001 -From: Martin Banky -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 - diff --git a/Refactor-FxViewItem-releasing-code.patch b/Refactor-FxViewItem-releasing-code.patch deleted file mode 100644 index 0f1cdef..0000000 --- a/Refactor-FxViewItem-releasing-code.patch +++ /dev/null @@ -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; - } - diff --git a/libqt5-qtdeclarative.changes b/libqt5-qtdeclarative.changes index 344bfb9..2aff45a 100644 --- a/libqt5-qtdeclarative.changes +++ b/libqt5-qtdeclarative.changes @@ -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 diff --git a/libqt5-qtdeclarative.spec b/libqt5-qtdeclarative.spec index d62cb13..c66b4a9 100644 --- a/libqt5-qtdeclarative.spec +++ b/libqt5-qtdeclarative.spec @@ -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) diff --git a/overflow.patch b/overflow.patch new file mode 100644 index 0000000..2ef2556 --- /dev/null +++ b/overflow.patch @@ -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); } diff --git a/qtdeclarative-opensource-src-5.5.1.tar.xz b/qtdeclarative-opensource-src-5.5.1.tar.xz deleted file mode 100644 index e2e6099..0000000 --- a/qtdeclarative-opensource-src-5.5.1.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fd14eefb83fff36fb17681693a70868f6aaf6138603d799c16466a094b26791 -size 18627840 diff --git a/qtdeclarative-opensource-src-5.6.0.tar.xz b/qtdeclarative-opensource-src-5.6.0.tar.xz new file mode 100644 index 0000000..5096b0c --- /dev/null +++ b/qtdeclarative-opensource-src-5.6.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c55f053f0e348577b56da541af74d02d0f2b61c9a6c15152b03dad03dfde04c +size 18865300 diff --git a/sanitize-visibleItems-list-after-model-insertions.patch b/sanitize-visibleItems-list-after-model-insertions.patch deleted file mode 100644 index 76b5a4d..0000000 --- a/sanitize-visibleItems-list-after-model-insertions.patch +++ /dev/null @@ -1,141 +0,0 @@ -From be1ef858f44e1523ba264520a0361981cf9b37c6 Mon Sep 17 00:00:00 2001 -From: Gabriel de Dietrich -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(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(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(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 diff --git a/sse2_nojit.patch b/sse2_nojit.patch deleted file mode 100644 index fdfc115..0000000 --- a/sse2_nojit.patch +++ /dev/null @@ -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 -