Merge remote-tracking branch 'origin/5.6.1' into 5.7.0

Conflicts:
	src/corelib/tools/qsimd_p.h
	src/network/socket/qnativesocketengine_winrt.cpp

Change-Id: I2765b671664c2a84839b2f88ba724fdf0c1fa7c6
This commit is contained in:
Liang Qi 2016-05-26 09:40:39 +02:00 committed by Paul Olav Tvete
commit 2fb026d58b
13 changed files with 242 additions and 93 deletions

165
dist/changes-5.6.1 vendored Normal file
View File

@ -0,0 +1,165 @@
Qt 5.6.1 is a bug-fix release. It maintains both forward and backward
compatibility (source and binary) with Qt 5.6.0.
For more details, refer to the online documentation included in this
distribution. The documentation is also available online:
https://doc.qt.io/qt-5/
The Qt version 5.6 series is binary compatible with the 5.5.x series.
Applications compiled for 5.5 will continue to run with 5.6.
Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:
https://bugreports.qt.io/
Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
****************************************************************************
* Important Behavior Changes *
****************************************************************************
- Support for DirectFB is disabled by default, due to lack of
development in upstream. To enable the platform plugin, pass the
-directfb option to configure.
- [QTBUG-44964] The new X event compression feature that was added in 5.6.0
no longer applies to motion events from drawing tablets.
configure & build system
------------------------
- The configure -D/-I/-L/-l/-R options do not affect the build of Qt's
host tools any more when cross-building. While this usually improves
the chances of a build succeeding, it may also require adjustments.
qmake
-----
- [Unix] Paths passed to configure -R are not automatically used by 3rd
party projects any more. Use QMAKE_RPATHDIR if your project explicitly
depends on external libraries. Note that this is not needed for Qt or
its transitive dependencies.
- Expansions of ${QMAKE_FILE_IN_BASE} and ${QMAKE_FILE_OUT_BASE} in extra
compilers are now automatically quoted.
****************************************************************************
* Library *
****************************************************************************
QtCore
------
- QObject:
* [QTBUG-52542] If the compiler supports variadic templates, functors
connected to signals will no longer be copied each time the signal is
emitted.
- QRect:
* Fixed integer overflow in center(). This fixes the result for some
corner-cases such as a 1x1 rectangle at (INT_MIN, INT_MIN), for which the
previous implementation could return anything (due to invoking undefined
behavior), but commonly returned (0, 0).
- QStringRef:
* Fixed relational operators against (const char*) to return the correct
result.
QtGui
-----
- [QTBUG-50199] QWheelEvent::phase() now returns zero rather than
Qt::ScrollUpdate when the wheel event comes from an actual non-emulated
mouse wheel, and the QT_ENABLE_MOUSE_WHEEL_TRACKING environment variable
is set.
- Image:
* [QTBUG-50745] Fixed possible crash in QImage::pixel() for mono or indexed
images.
QtWidgets
---------
- Dialogs:
* [QTBUG-51148] Fixed font dialog support for fonts with a non-existent
family name and/or pixel size.
- QHeaderView:
* [QTBUG-50171] Fixed a repainting issue when items had been reordered.
- QListWidget:
* [QTBUG-15741] Fixed a bug that caused the default drop action to be
ignored when using icon mode.
****************************************************************************
* Platform-specific Changes *
****************************************************************************
Android
-------
- The navigation bar is now hidden only on Android API level 19 and above.
OS X
----
- [QTBUG-50262] QStandardPaths now returns the correct display name for the
download folder.
- [QTBUG-7000] QMacPrintEngine now really sets the printer resolution.
- [QTBUG-48138] QPinchGesture on OS X now behaves like on other platforms:
totalScaleFactor is the magnitude of the pinch and scaleFactor is the delta
for the current event.
Windows
-------
- Text:
* [QTBUG-18711] Fixed disabling hints for application fonts.
For example, when automatic scaling by device pixel ratio is in effect.
* [QTBUG-47141] Made it possible to disable antialiasing for text when
drawing into images.
X11/XCB
-------
- [QTBUG-49071] Fixed failure to deliver focusIn events on hide/show.
****************************************************************************
* Tools *
****************************************************************************
configure & build system
------------------------
- [QTBUG-11545][Windows] Added missing -pch/-no-pch options to configure.exe.
- [QTBUG-37952][Apple] configure -separate-debug-info is now supported.
- [QTBUG-47313][QTBUG-47639] Fixed builds with "debug" and/or "release" in
the build path's name.
- [QTBUG-51621][Unix] Fixed transitive dependencies on non-Qt libraries.
- [QTBUG-51644][QTBUG-53017] Fixed cross-builds which use a host compiler
which is significantly different from the target compiler.
- [QTBUG-52578][QNX] Unified some defaults between the Unix and Windows
configures.
- [Unix] configure -R now supports paths relative to -libdir.
- [Android@Windows] Added missing -android-ndk-host option to configure.exe.
- [MinGW] Fixed -release -force-debug-info builds actually being neither.
- [WinCE] Fixed (Open)SSL detection.
- Fixed builds with static libc.
qmake
-----
- [QTBUG-34182] Fixed UTF-8 BOM breaking dependency calculation.
- [QTBUG-38802][WinRT] Capabilities needed by Qt are now automatically
added to the manifest.
- [QTBUG-50924][WEC7][VS] Fixed deployment of Qt.
- [QTBUG-51775][Unix@Windows] Fixed installation of target.targets when
cross-building.
- [QTBUG-51782] Fixed simultaneous use of the separate_debug_info and
no_plugin_name_prefix CONFIG flags.
- [QTBUG-52008] qmake-generated Visual Studio projects now automatically
invoke windeployqt by default.
- [QTBUG-52998] Restored use of -P option when invoking lex.
- The expansions ${QMAKE_FILE_IN_EXT}, ${QMAKE_FILE_IN_NAME}, and
${QMAKE_FILE_OUT_PATH} are now understood in extra compilers.

View File

@ -49,6 +49,11 @@
QT_BEGIN_NAMESPACE
#ifdef __has_builtin
# define QT_HAS_BUILTIN(x) __has_builtin(x)
#else
# define QT_HAS_BUILTIN(x) 0
#endif
/*
* ENDIAN FUNCTIONS
@ -71,18 +76,29 @@ template <typename T> inline void qbswap(const T src, uchar *dest)
// Used to implement a type-safe and alignment-safe copy operation
// If you want to avoid the memcpy, you must write specializations for these functions
template <typename T> inline void qToUnaligned(const T src, uchar *dest)
template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, uchar *dest)
{
// Using sizeof(T) inside memcpy function produces internal compiler error with
// MSVC2008/ARM in tst_endian -> use extra indirection to resolve size of T.
const size_t size = sizeof(T);
memcpy(dest, &src, size);
#if QT_HAS_BUILTIN(__builtin_memcpy)
__builtin_memcpy
#else
memcpy
#endif
(dest, &src, size);
}
template <typename T> inline T qFromUnaligned(const uchar *src)
template <typename T> Q_ALWAYS_INLINE T qFromUnaligned(const uchar *src)
{
T dest;
const size_t size = sizeof(T);
memcpy(&dest, src, size);
#if QT_HAS_BUILTIN(__builtin_memcpy)
__builtin_memcpy
#else
memcpy
#endif
(&dest, src, size);
return dest;
}

View File

@ -33,6 +33,29 @@
little and big endian representations of numbers.
*/
/*!
\internal
\fn T qFromUnaligned(const uchar *ptr)
\since 5.5
Loads a \c{T} from address \a ptr, which may be misaligned.
Use of this function avoids the undefined behavior that the C++ standard
otherwise attributes to unaligned loads.
*/
/*!
\internal
\fn void qToUnaligned(T t, uchar *ptr)
\since 4.5
Stores \a t to address \a ptr, which may be misaligned.
Use of this function avoids the undefined behavior that the C++ standard
otherwise attributes to unaligned stores.
*/
/*!
\fn T qFromBigEndian(const uchar *src)
\since 4.3

View File

@ -410,7 +410,7 @@ public:
// pack with itself, we'll discard the high part anyway
chunk = _mm_packus_epi16(chunk, chunk);
// unaligned 64-bit store
qUnalignedStore(l + i, _mm_cvtsi128_si64(chunk));
qToUnaligned(_mm_cvtsi128_si64(chunk), l + i);
i += 8;
}
# endif

View File

@ -48,7 +48,6 @@
#include <QtCore/QList>
#include <QtCore/QDebug>
#include <qendian.h>
#include <private/qsimd_p.h> // for qUnalignedLoad
QT_BEGIN_NAMESPACE
@ -164,7 +163,7 @@ bool QMimeMagicRule::matchNumber(const QByteArray &data) const
const char *p = data.constData() + m_startPos;
const char *e = data.constData() + qMin(data.size() - int(sizeof(T)), m_endPos + 1);
for ( ; p <= e; ++p) {
if ((qUnalignedLoad<T>(p) & mask) == (value & mask))
if ((qFromUnaligned<T>(reinterpret_cast<const uchar *>(p)) & mask) == (value & mask))
return true;
}

View File

@ -42,6 +42,7 @@
#include <qalgorithms.h>
#include <qdatastream.h>
#include <qdebug.h>
#include <qendian.h>
#include <string.h>
QT_BEGIN_NAMESPACE
@ -169,25 +170,6 @@ QBitArray::QBitArray(int size, bool value)
Same as size().
*/
template <typename T> T qUnalignedLoad(const uchar *ptr)
{
/*
* Testing with different compilers shows that they all optimize the memcpy
* call away and replace with direct loads whenever possible. On x86 and PPC,
* GCC does direct unaligned loads; on MIPS, it generates a pair of load-left
* and load-right instructions. ICC and Clang do the same on x86. This is both
* 32- and 64-bit.
*
* On ARM cores without unaligned loads, the compiler leaves a call to
* memcpy.
*/
T u;
memcpy(&u, ptr, sizeof(u));
return u;
}
/*!
If \a on is true, this function returns the number of
1-bits stored in the bit array; otherwise the number
@ -203,17 +185,17 @@ int QBitArray::count(bool on) const
const quint8 *const end = reinterpret_cast<const quint8 *>(d.end());
while (bits + 7 <= end) {
quint64 v = qUnalignedLoad<quint64>(bits);
quint64 v = qFromUnaligned<quint64>(bits);
bits += 8;
numBits += int(qPopulationCount(v));
}
if (bits + 3 <= end) {
quint32 v = qUnalignedLoad<quint32>(bits);
quint32 v = qFromUnaligned<quint32>(bits);
bits += 4;
numBits += int(qPopulationCount(v));
}
if (bits + 1 < end) {
quint16 v = qUnalignedLoad<quint16>(bits);
quint16 v = qFromUnaligned<quint16>(bits);
bits += 2;
numBits += int(qPopulationCount(v));
}

View File

@ -58,6 +58,7 @@
#include <qbytearray.h>
#include <qdatetime.h>
#include <qbasicatomic.h>
#include <qendian.h>
#include <private/qsimd_p.h>
#ifndef QT_BOOTSTRAPPED
@ -112,24 +113,24 @@ static uint crc32(const Char *ptr, size_t len, uint h)
p += 8;
for ( ; p <= e; p += 8)
h2 = _mm_crc32_u64(h2, qUnalignedLoad<qlonglong>(p - 8));
h2 = _mm_crc32_u64(h2, qFromUnaligned<qlonglong>(p - 8));
h = h2;
p -= 8;
len = e - p;
if (len & 4) {
h = _mm_crc32_u32(h, qUnalignedLoad<uint>(p));
h = _mm_crc32_u32(h, qFromUnaligned<uint>(p));
p += 4;
}
# else
p += 4;
for ( ; p <= e; p += 4)
h = _mm_crc32_u32(h, qUnalignedLoad<uint>(p - 4));
h = _mm_crc32_u32(h, qFromUnaligned<uint>(p - 4));
p -= 4;
len = e - p;
# endif
if (len & 2) {
h = _mm_crc32_u16(h, qUnalignedLoad<ushort>(p));
h = _mm_crc32_u16(h, qFromUnaligned<ushort>(p));
p += 2;
}
if (sizeof(Char) == 1 && len & 1)

View File

@ -751,26 +751,4 @@ void qDumpCPUFeatures()
puts("");
}
/*!
\internal
\fn T qUnalignedLoad(const void *ptr)
\since 5.6.1
Loads a \c{T} from address \a ptr, which may be misaligned.
Use of this function avoid the undefined behavior that the C++ standard
otherwise attributes to unaligned loads.
*/
/*!
\internal
\fn void qUnalignedStore(void *ptr, T t)
\since 5.6.1
Stores \a t to address \a ptr, which may be misaligned.
Use of this function avoid the undefined behavior that the C++ standard
otherwise attributes to unaligned stores.
*/
QT_END_NAMESPACE

View File

@ -527,32 +527,6 @@ unsigned _bit_scan_forward(unsigned val)
#define ALIGNMENT_PROLOGUE_16BYTES(ptr, i, length) \
for (; i < static_cast<int>(qMin(static_cast<quintptr>(length), ((4 - ((reinterpret_cast<quintptr>(ptr) >> 2) & 0x3)) & 0x3))); ++i)
template <typename T>
Q_ALWAYS_INLINE
T qUnalignedLoad(const void *ptr) Q_DECL_NOTHROW
{
T result;
#if QT_HAS_BUILTIN(__builtin_memcpy)
__builtin_memcpy
#else
memcpy
#endif
/*memcpy*/(&result, ptr, sizeof result);
return result;
}
template <typename T>
Q_ALWAYS_INLINE
void qUnalignedStore(void *ptr, T t) Q_DECL_NOTHROW
{
#if QT_HAS_BUILTIN(__builtin_memcpy)
__builtin_memcpy
#else
memcpy
#endif
/*memcpy*/(ptr, &t, sizeof t);
}
QT_END_NAMESPACE
#endif // QSIMD_P_H

View File

@ -584,7 +584,7 @@ static int ucstrncmp(const QChar *a, const uchar *c, int l)
// we'll read uc[offset..offset+7] (16 bytes) and c[offset..offset+7] (8 bytes)
if (uc + offset + 7 < e) {
// same, but we're using an 8-byte load
__m128i chunk = _mm_cvtsi64_si128(qUnalignedLoad<long long>(c + offset));
__m128i chunk = _mm_cvtsi64_si128(qFromUnaligned<long long>(c + offset));
__m128i secondHalf = _mm_unpacklo_epi8(chunk, nullmask);
__m128i ucdata = _mm_loadu_si128((const __m128i*)(uc + offset));

View File

@ -289,6 +289,12 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int
format = QImage::Format_Mono;
}
if (depth != 32) {
ncols = bi.biClrUsed ? bi.biClrUsed : 1 << nbits;
if (ncols < 1 || ncols > 256) // sanity check - don't run out of mem if color table is broken
return false;
}
if (bi.biHeight < 0)
h = -h; // support images with negative height
@ -296,19 +302,15 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int
image = QImage(w, h, format);
if (image.isNull()) // could not create image
return false;
}
if (depth != 32) {
ncols = bi.biClrUsed ? bi.biClrUsed : 1 << nbits;
if (ncols < 1 || ncols > 256) // sanity check - don't run out of mem if color table is broken
return false;
image.setColorCount(ncols);
if (ncols)
image.setColorCount(ncols); // Ensure valid QImage
}
image.setDotsPerMeterX(bi.biXPelsPerMeter);
image.setDotsPerMeterY(bi.biYPelsPerMeter);
if (ncols > 0) { // read color table
image.setColorCount(ncols);
uchar rgb[4];
int rgb_len = t == BMP_OLD ? 3 : 4;
for (int i=0; i<ncols; i++) {

View File

@ -477,6 +477,9 @@ void QNativeSocketEngine::close()
hr = socket3->CancelIOAsync(&action);
Q_ASSERT_SUCCEEDED(hr);
hr = QWinRTFunctions::await(action);
// If there is no pending IO (no read established before) the function will fail with
// "function was called at an unexpected time" which is fine.
if (hr != E_ILLEGAL_METHOD_CALL)
Q_ASSERT_SUCCEEDED(hr);
return S_OK;
});

View File

@ -663,7 +663,9 @@ QT_WARNING_POP
- (BOOL)becomeFirstResponder
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
if (!m_window || !m_platformWindow)
return NO;
if (m_window->flags() & Qt::WindowTransparentForInput)
return NO;
if (!m_platformWindow->windowIsPopupType() && !m_isMenuView)
QWindowSystemInterface::handleWindowActivated([self topLevelWindow]);
@ -672,11 +674,13 @@ QT_WARNING_POP
- (BOOL)acceptsFirstResponder
{
if (!m_window || !m_platformWindow)
return NO;
if (m_isMenuView)
return NO;
if (m_platformWindow->shouldRefuseKeyWindowAndFirstResponder())
return NO;
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
if (m_window->flags() & Qt::WindowTransparentForInput)
return NO;
if ((m_window->flags() & Qt::ToolTip) == Qt::ToolTip)
return NO;
@ -686,7 +690,9 @@ QT_WARNING_POP
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
Q_UNUSED(theEvent)
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
if (!m_window || !m_platformWindow)
return NO;
if (m_window->flags() & Qt::WindowTransparentForInput)
return NO;
return YES;
}