From 003dbdfbb3209428b689468e296298b98e8f282bfdc03fcdaa2443be88490936 Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Thu, 22 Dec 2016 15:06:15 +0000 Subject: [PATCH] Accepting request 446437 from KDE:Qt5 Update to 5.7.1 OBS-URL: https://build.opensuse.org/request/show/446437 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtdeclarative?expand=0&rev=36 --- ...facility-to-version-type-information.patch | 41 - ...ys-set-the-tag-when-boxing-a-pointer.patch | 371 --------- V4-Free-up-2-address-bits-in-64bit-mode.patch | 778 ------------------ ...efault-property-aliases-with-layouts.patch | 186 ----- libqt5-qtdeclarative.changes | 15 + libqt5-qtdeclarative.spec | 29 +- masm-unaligned-stack-pointer.patch | 66 -- overflow.patch | 13 - ...source-src-5.6.0-qml_no-lifetime-dse.patch | 12 - qtdeclarative-opensource-src-5.7.0.tar.xz | 3 - qtdeclarative-opensource-src-5.7.1.tar.xz | 3 + 11 files changed, 21 insertions(+), 1496 deletions(-) delete mode 100644 Add-a-facility-to-version-type-information.patch delete mode 100644 V4-Always-set-the-tag-when-boxing-a-pointer.patch delete mode 100644 V4-Free-up-2-address-bits-in-64bit-mode.patch delete mode 100644 fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch delete mode 100644 masm-unaligned-stack-pointer.patch delete mode 100644 overflow.patch delete mode 100644 qtdeclarative-opensource-src-5.6.0-qml_no-lifetime-dse.patch delete mode 100644 qtdeclarative-opensource-src-5.7.0.tar.xz create mode 100644 qtdeclarative-opensource-src-5.7.1.tar.xz diff --git a/Add-a-facility-to-version-type-information.patch b/Add-a-facility-to-version-type-information.patch deleted file mode 100644 index 3fa458c..0000000 --- a/Add-a-facility-to-version-type-information.patch +++ /dev/null @@ -1,41 +0,0 @@ -From ad48b299b7fe0bbed2749adc66725e4f12661f79 Mon Sep 17 00:00:00 2001 -From: hjk -Date: Fri, 16 Sep 2016 14:30:14 +0200 -Subject: [PATCH] Add a facility to version type information for debugging - -This serves the same purpose as qtbase/corelib/global/qhooks.cpp, -but is meant to be in sync with changes in Qt Declarative internals. - -Change-Id: I5a4a7d9ca5c340367581749e05d09380590c46fb -Reviewed-by: Ulf Hermann ---- - src/qml/debugger/qqmldebug.cpp | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/src/qml/debugger/qqmldebug.cpp b/src/qml/debugger/qqmldebug.cpp -index 35dc110..ea98bb1 100644 ---- a/src/qml/debugger/qqmldebug.cpp -+++ b/src/qml/debugger/qqmldebug.cpp -@@ -119,4 +119,22 @@ bool QQmlDebuggingEnabler::connectToLocalDebugger(const QString &socketFileName, - return false; - } - -+enum { HookCount = 3 }; -+ -+// Only add to the end, and bump version if you do. -+quintptr Q_QML_EXPORT qtDeclarativeHookData[] = { -+ // Version of this Array. Bump if you add to end. -+ 1, -+ -+ // Number of entries in this array. -+ HookCount, -+ -+ // TypeInformationVersion, an integral value, bumped whenever private -+ // object sizes or member offsets that are used in Qt Creator's -+ // data structure "pretty printing" change. -+ 1 -+}; -+ -+Q_STATIC_ASSERT(HookCount == sizeof(qtDeclarativeHookData) / sizeof(qtDeclarativeHookData[0])); -+ - QT_END_NAMESPACE diff --git a/V4-Always-set-the-tag-when-boxing-a-pointer.patch b/V4-Always-set-the-tag-when-boxing-a-pointer.patch deleted file mode 100644 index 1ab2d0b..0000000 --- a/V4-Always-set-the-tag-when-boxing-a-pointer.patch +++ /dev/null @@ -1,371 +0,0 @@ -From aa7c3b35ef9b737c574f436ea35452019a2ff29c Mon Sep 17 00:00:00 2001 -From: Erik Verbruggen -Date: Thu, 16 Jun 2016 13:39:57 +0200 -Subject: [PATCH 1/1] V4: Always set the tag when boxing a pointer in - QV4::Value. - -All setters now store tags, so no-one can play loosy-goosy with the -boxed values (and accidentally forget to "tag" a value, resulting in -random garbage). - -Change-Id: Ia0b78aa038d3ff46d5292b14bd593de310da16a0 -Reviewed-by: Simon Hausmann ---- - .../qmldbg_debugger/qqmlnativedebugservice.cpp | 2 +- - src/qml/jsruntime/qv4arraydata.cpp | 10 +-- - src/qml/jsruntime/qv4objectiterator.cpp | 5 -- - src/qml/jsruntime/qv4persistent.cpp | 9 +-- - src/qml/jsruntime/qv4scopedvalue_p.h | 16 +--- - src/qml/jsruntime/qv4value_p.h | 94 ++++++++++++---------- - 6 files changed, 63 insertions(+), 73 deletions(-) - -Index: qtdeclarative-opensource-src-5.6.1/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/plugins/qmltooling/qmldbg_debugger/qqmlnativedebugservice.cpp -@@ -549,7 +549,7 @@ void NativeDebugger::handleExpressions(Q - dict[QStringLiteral("name")] = name; - dict[QStringLiteral("valueencoded")] = QStringLiteral("undefined"); - output.append(dict); -- } else if (result.ptr && result.ptr->_val) { -+ } else if (result.ptr && result.ptr->rawValue()) { - collector.collect(&output, QString(), name, *result); - } else { - QJsonObject dict; -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4arraydata.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4arraydata.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4arraydata.cpp -@@ -93,8 +93,8 @@ Q_STATIC_ASSERT(sizeof(Heap::ArrayData) - - static Q_ALWAYS_INLINE void storeValue(ReturnedValue *target, uint value) - { -- Value v = Value::fromReturnedValue(*target); -- v.setValue(value); -+ Value v; -+ v.setTagValue(Value::fromReturnedValue(*target).tag(), value); - *target = v.asReturnedValue(); - } - -@@ -189,7 +189,7 @@ void ArrayData::realloc(Object *o, Type - n->value = i; - } else { - storeValue(lastFree, i); -- sparse->arrayData[i].setTag(Value::Empty_Type); -+ sparse->arrayData[i].setEmpty(); - lastFree = &sparse->arrayData[i].rawValueRef(); - } - } -@@ -198,7 +198,7 @@ void ArrayData::realloc(Object *o, Type - if (toCopy < sparse->alloc) { - for (uint i = toCopy; i < sparse->alloc; ++i) { - storeValue(lastFree, i); -- sparse->arrayData[i].setTag(Value::Empty_Type); -+ sparse->arrayData[i].setEmpty(); - lastFree = &sparse->arrayData[i].rawValueRef(); - } - storeValue(lastFree, UINT_MAX); -@@ -396,7 +396,7 @@ uint SparseArrayData::allocate(Object *o - // found two slots in a row - uint idx = Value::fromReturnedValue(*last).uint_32(); - Value lastV = Value::fromReturnedValue(*last); -- lastV.setValue(dd->arrayData[lastV.value() + 1].value()); -+ lastV.setTagValue(lastV.tag(), dd->arrayData[lastV.value() + 1].value()); - *last = lastV.rawValue(); - dd->attrs[idx] = Attr_Accessor; - return idx; -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4objectiterator.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4objectiterator.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4objectiterator.cpp -@@ -68,11 +68,6 @@ void ObjectIterator::init(const Object * - object->setM(o ? o->m() : 0); - current->setM(o ? o->m() : 0); - --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- object->setTag(QV4::Value::Managed_Type); -- current->setTag(QV4::Value::Managed_Type); --#endif -- - if (object->as()) { - Scope scope(engine); - Scoped (scope, object->asReturnedValue())->fullyCreate(); -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4persistent.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4persistent.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4persistent.cpp -@@ -79,11 +79,9 @@ Page *allocatePage(PersistentValueStorag - if (p->header.next) - p->header.next->header.prev = &p->header.next; - for (int i = 0; i < kEntriesPerPage - 1; ++i) { -- p->values[i].setTag(QV4::Value::Empty_Type); -- p->values[i].setInt_32(i + 1); -+ p->values[i].setEmpty(i + 1); - } -- p->values[kEntriesPerPage - 1].setTag(QV4::Value::Empty_Type); -- p->values[kEntriesPerPage - 1].setInt_32(-1); -+ p->values[kEntriesPerPage - 1].setEmpty(-1); - - storage->firstPage = p; - -@@ -205,8 +203,7 @@ void PersistentValueStorage::free(Value - - Page *p = getPage(v); - -- v->setTag(QV4::Value::Empty_Type); -- v->setInt_32(p->header.freeList); -+ v->setEmpty(p->header.freeList); - p->header.freeList = v - p->values; - if (!--p->header.refCount) - freePage(p); -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4scopedvalue_p.h -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4scopedvalue_p.h -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4scopedvalue_p.h -@@ -120,9 +120,6 @@ struct ScopedValue - { - ptr = scope.engine->jsStackTop++; - ptr->setM(o); --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- ptr->setTag(QV4::Value::Managed_Type); --#endif - } - - ScopedValue(const Scope &scope, Managed *m) -@@ -144,9 +141,6 @@ struct ScopedValue - - ScopedValue &operator=(Heap::Base *o) { - ptr->setM(o); --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- ptr->setTag(QV4::Value::Managed_Type); --#endif - return *this; - } - -@@ -186,18 +180,12 @@ struct Scoped - - inline void setPointer(const Managed *p) { - ptr->setM(p ? p->m() : 0); --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- ptr->setTag(QV4::Value::Managed_Type); --#endif - } - - Scoped(const Scope &scope) - { - ptr = scope.engine->jsStackTop++; - ptr->setM(0); --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- ptr->setTag(QV4::Value::Managed_Type); --#endif - } - - Scoped(const Scope &scope, const Value &v) -@@ -339,14 +327,14 @@ struct ScopedCallData { - - inline Value &Value::operator =(const ScopedValue &v) - { -- _val = v.ptr->val(); -+ _val = v.ptr->rawValue(); - return *this; - } - - template - inline Value &Value::operator=(const Scoped &t) - { -- _val = t.ptr->val(); -+ _val = t.ptr->rawValue(); - return *this; - } - -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4value_p.h -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4value_p.h -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4value_p.h -@@ -66,6 +66,7 @@ typedef uint Bool; - - struct Q_QML_PRIVATE_EXPORT Value - { -+private: - /* - We use two different ways of encoding JS values. One for 32bit and one for 64bit systems. - -@@ -90,10 +91,10 @@ struct Q_QML_PRIVATE_EXPORT Value - - quint64 _val; - -- Q_ALWAYS_INLINE quint64 val() const { return _val; } -- Q_ALWAYS_INLINE void setVal(quint64 v) { _val = v; } -- Q_ALWAYS_INLINE void setValue(quint32 v) { memcpy(&_val, &v, 4); } -- Q_ALWAYS_INLINE void setTag(quint32 t) { memcpy(4 + (quint8 *)&_val, &t, 4); } -+public: -+ Q_ALWAYS_INLINE quint64 &rawValueRef() { return _val; } -+ Q_ALWAYS_INLINE quint64 rawValue() const { return _val; } -+ Q_ALWAYS_INLINE void setRawValue(quint64 raw) { _val = raw; } - - #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - static inline int valueOffset() { return 0; } -@@ -113,17 +114,52 @@ struct Q_QML_PRIVATE_EXPORT Value - Q_ALWAYS_INLINE Heap::Base *m() const { Q_UNREACHABLE(); return Q_NULLPTR; } - Q_ALWAYS_INLINE void setM(Heap::Base *b) { Q_UNUSED(b); Q_UNREACHABLE(); } - #elif defined(QV4_USE_64_BIT_VALUE_ENCODING) -- 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); } -+ 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); -+ } - #else // !QV4_USE_64_BIT_VALUE_ENCODING -- Q_ALWAYS_INLINE Heap::Base *m() const { Q_STATIC_ASSERT(sizeof(Heap::Base*) == sizeof(quint32)); 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); } -+ Q_ALWAYS_INLINE Heap::Base *m() const -+ { -+ Q_STATIC_ASSERT(sizeof(Heap::Base*) == sizeof(quint32)); -+ 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); -+ setTagValue(Managed_Type, v); -+ } - #endif - -- Q_ALWAYS_INLINE int int_32() const { int i; quint32 v = value(); memcpy(&i, &v, 4); return i; } -- Q_ALWAYS_INLINE void setInt_32(int i) { quint32 u; memcpy(&u, &i, 4); setValue(u); } -+ Q_ALWAYS_INLINE int int_32() const -+ { -+ return int(value()); -+ } -+ Q_ALWAYS_INLINE void setInt_32(int i) -+ { -+ setTagValue(Integer_Type_Internal, quint32(i)); -+ } - Q_ALWAYS_INLINE uint uint_32() const { return value(); } - -+ Q_ALWAYS_INLINE void setEmpty() -+ { -+ setTagValue(Empty_Type, value()); -+ } -+ -+ Q_ALWAYS_INLINE void setEmpty(int i) -+ { -+ setTagValue(Empty_Type, quint32(i)); -+ } - #ifndef QV4_USE_64_BIT_VALUE_ENCODING - enum Masks { - SilentNaNBit = 0x00040000, -@@ -260,7 +296,6 @@ struct Q_QML_PRIVATE_EXPORT Value - int i = (int)d; - if (i == d) { - setInt_32(i); -- setTag(Integer_Type_Internal); - return true; - } - } -@@ -292,22 +327,10 @@ struct Q_QML_PRIVATE_EXPORT Value - return m(); - } - -- Q_ALWAYS_INLINE quint64 &rawValueRef() { -- return _val; -- } -- Q_ALWAYS_INLINE quint64 rawValue() const { -- return _val; -- } -- Q_ALWAYS_INLINE void setRawValue(quint64 raw) { _val = raw; } -- - static inline Value fromHeapObject(Heap::Base *m) - { - Value v; -- v.setRawValue(0); - v.setM(m); --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- v.setTag(Managed_Type); --#endif - return v; - } - -@@ -328,7 +351,7 @@ struct Q_QML_PRIVATE_EXPORT Value - inline bool tryIntegerConversion() { - bool b = integerCompatible(); - if (b) -- setTag(Integer_Type_Internal); -+ setTagValue(Integer_Type_Internal, value()); - return b; - } - -@@ -378,7 +401,7 @@ struct Q_QML_PRIVATE_EXPORT Value - Value &operator=(ReturnedValue v) { _val = v; return *this; } - Value &operator=(Managed *m) { - if (!m) { -- setTagValue(Undefined_Type, 0); -+ setM(0); - } else { - _val = reinterpret_cast(m)->_val; - } -@@ -386,9 +409,6 @@ struct Q_QML_PRIVATE_EXPORT Value - } - Value &operator=(Heap::Base *o) { - setM(o); --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- setTag(Managed_Type); --#endif - return *this; - } - -@@ -479,13 +499,7 @@ struct Q_QML_PRIVATE_EXPORT Primitive : - inline Primitive Primitive::undefinedValue() - { - Primitive v; --#ifdef QV4_USE_64_BIT_VALUE_ENCODING -- v.setRawValue(quint64(Undefined_Type) << Tag_Shift); --#else -- v.setRawValue(0); -- v.setTag(Undefined_Type); -- v.setValue(0); --#endif -+ v.setTagValue(Undefined_Type, 0); - return v; - } - -@@ -499,11 +513,7 @@ inline Primitive Primitive::emptyValue() - inline Primitive Primitive::nullValue() - { - Primitive v; --#ifndef QV4_USE_64_BIT_VALUE_ENCODING -- v.setRawValue(quint64(Null_Type_Internal) << Tag_Shift); --#else - v.setTagValue(Null_Type_Internal, 0); --#endif - return v; - } - -@@ -524,7 +534,7 @@ inline Primitive Primitive::fromDouble(d - inline Primitive Primitive::fromInt32(int i) - { - Primitive v; -- v.setTagValue(Integer_Type_Internal, 0); // For mingw482, because it complains, and for VS9, because of internal compiler errors. -+ v.setTagValue(Integer_Type_Internal, 0); - v.setInt_32(i); - return v; - } -@@ -533,8 +543,7 @@ inline Primitive Primitive::fromUInt32(u - { - Primitive v; - if (i < INT_MAX) { -- v.setTagValue(Integer_Type_Internal, 0); // For mingw482, because it complains, and for VS9, because of internal compiler errors. -- v.setInt_32((int)i); -+ v.setTagValue(Integer_Type_Internal, i); - } else { - v.setDouble(i); - } diff --git a/V4-Free-up-2-address-bits-in-64bit-mode.patch b/V4-Free-up-2-address-bits-in-64bit-mode.patch deleted file mode 100644 index dd593bc..0000000 --- a/V4-Free-up-2-address-bits-in-64bit-mode.patch +++ /dev/null @@ -1,778 +0,0 @@ -From 60c669f13fd331788a2e2aab8af926d6aa7c46a6 Mon Sep 17 00:00:00 2001 -From: Erik Verbruggen -Date: Fri, 23 Sep 2016 11:34:12 +0200 -Subject: [PATCH] V4: Free up 2 address bits in 64bit mode - -This allows for the OS to use 49 address bits. It also maps JS Undefined -to the C++ nullptr on 64bit. - -Task-number: QTBUG-54822 -Change-Id: I7cc90620f499be1506a61aac77d72d067308838c ---- - src/qml/debugger/qqmldebug.cpp | 2 +- - src/qml/jit/qv4assembler.cpp | 38 +++++- - src/qml/jit/qv4assembler_p.h | 5 + - src/qml/jit/qv4isel_masm.cpp | 98 ++++++++++---- - src/qml/jit/qv4isel_masm_p.h | 4 +- - src/qml/jsruntime/qv4scopedvalue_p.h | 2 +- - src/qml/jsruntime/qv4value_p.h | 246 ++++++++++++++++++++--------------- - src/qml/jsruntime/qv4vme_moth.cpp | 26 ++-- - 8 files changed, 269 insertions(+), 152 deletions(-) - -Index: qtdeclarative-opensource-src-5.6.1/src/qml/debugger/qqmldebug.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/debugger/qqmldebug.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/debugger/qqmldebug.cpp -@@ -132,7 +132,7 @@ quintptr Q_QML_EXPORT qtDeclarativeHookD - // TypeInformationVersion, an integral value, bumped whenever private - // object sizes or member offsets that are used in Qt Creator's - // data structure "pretty printing" change. -- 1 -+ 2 - }; - - Q_STATIC_ASSERT(HookCount == sizeof(qtDeclarativeHookData) / sizeof(qtDeclarativeHookData[0])); -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4assembler.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jit/qv4assembler.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4assembler.cpp -@@ -133,8 +133,30 @@ void Assembler::generateCJumpOnNonZero(R - generateCJumpOnCompare(NotEqual, reg, TrustedImm32(0), currentBlock, trueBlock, falseBlock); - } - --void Assembler::generateCJumpOnCompare(RelationalCondition cond, RegisterID left,TrustedImm32 right, -- IR::BasicBlock *currentBlock, IR::BasicBlock *trueBlock, -+#ifdef QV4_USE_64_BIT_VALUE_ENCODING -+void Assembler::generateCJumpOnCompare(RelationalCondition cond, -+ RegisterID left, -+ TrustedImm64 right, -+ IR::BasicBlock *currentBlock, -+ IR::BasicBlock *trueBlock, -+ IR::BasicBlock *falseBlock) -+{ -+ if (trueBlock == _nextBlock) { -+ Jump target = branch64(invert(cond), left, right); -+ addPatch(falseBlock, target); -+ } else { -+ Jump target = branch64(cond, left, right); -+ addPatch(trueBlock, target); -+ jumpToBlock(currentBlock, falseBlock); -+ } -+} -+#endif -+ -+void Assembler::generateCJumpOnCompare(RelationalCondition cond, -+ RegisterID left, -+ TrustedImm32 right, -+ IR::BasicBlock *currentBlock, -+ IR::BasicBlock *trueBlock, - IR::BasicBlock *falseBlock) - { - if (trueBlock == _nextBlock) { -@@ -147,8 +169,11 @@ void Assembler::generateCJumpOnCompare(R - } - } - --void Assembler::generateCJumpOnCompare(RelationalCondition cond, RegisterID left, RegisterID right, -- IR::BasicBlock *currentBlock, IR::BasicBlock *trueBlock, -+void Assembler::generateCJumpOnCompare(RelationalCondition cond, -+ RegisterID left, -+ RegisterID right, -+ IR::BasicBlock *currentBlock, -+ IR::BasicBlock *trueBlock, - IR::BasicBlock *falseBlock) - { - if (trueBlock == _nextBlock) { -@@ -334,9 +359,8 @@ Assembler::Jump Assembler::genTryDoubleC - // not an int, check if it's a double: - isNoInt.link(this); - #ifdef QV4_USE_64_BIT_VALUE_ENCODING -- and32(Assembler::TrustedImm32(Value::IsDouble_Mask), Assembler::ScratchRegister); -- Assembler::Jump isNoDbl = branch32(Assembler::Equal, Assembler::ScratchRegister, -- Assembler::TrustedImm32(0)); -+ rshift32(TrustedImm32(Value::IsDoubleTag_Shift), ScratchRegister); -+ Assembler::Jump isNoDbl = branch32(Equal, ScratchRegister, TrustedImm32(0)); - #else - and32(Assembler::TrustedImm32(Value::NotDouble_Mask), Assembler::ScratchRegister); - Assembler::Jump isNoDbl = branch32(Assembler::Equal, Assembler::ScratchRegister, -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4assembler_p.h -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jit/qv4assembler_p.h -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4assembler_p.h -@@ -374,6 +374,11 @@ public: - void addPatch(DataLabelPtr patch, IR::BasicBlock *target); - void generateCJumpOnNonZero(RegisterID reg, IR::BasicBlock *currentBlock, - IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); -+#ifdef QV4_USE_64_BIT_VALUE_ENCODING -+ void generateCJumpOnCompare(RelationalCondition cond, RegisterID left, TrustedImm64 right, -+ IR::BasicBlock *currentBlock, IR::BasicBlock *trueBlock, -+ IR::BasicBlock *falseBlock); -+#endif - void generateCJumpOnCompare(RelationalCondition cond, RegisterID left, TrustedImm32 right, - IR::BasicBlock *currentBlock, IR::BasicBlock *trueBlock, - IR::BasicBlock *falseBlock); -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4isel_masm.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jit/qv4isel_masm.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4isel_masm.cpp -@@ -703,7 +703,7 @@ void InstructionSelection::loadString(co - #else - _as->store32(Assembler::ReturnValueRegister, destAddr); - destAddr.offset += 4; -- _as->store32(Assembler::TrustedImm32(QV4::Value::Managed_Type), destAddr); -+ _as->store32(Assembler::TrustedImm32(QV4::Value::Managed_Type_Internal), destAddr); - #endif - } - -@@ -1103,7 +1103,7 @@ void InstructionSelection::convertTypeTo - // not an int, check if it's NOT a double: - isNoInt.link(_as); - #ifdef QV4_USE_64_BIT_VALUE_ENCODING -- _as->and32(Assembler::TrustedImm32(Value::IsDouble_Mask), Assembler::ScratchRegister); -+ _as->rshift32(Assembler::TrustedImm32(Value::IsDoubleTag_Shift), Assembler::ScratchRegister); - Assembler::Jump isDbl = _as->branch32(Assembler::NotEqual, Assembler::ScratchRegister, - Assembler::TrustedImm32(0)); - #else -@@ -1194,10 +1194,15 @@ void InstructionSelection::convertTypeTo - _as->load64(addr, Assembler::ScratchRegister); - _as->move(Assembler::ScratchRegister, Assembler::ReturnValueRegister); - -- // check if it's a number -- _as->urshift64(Assembler::TrustedImm32(QV4::Value::IsNumber_Shift), Assembler::ScratchRegister); -- Assembler::Jump isInt = _as->branch32(Assembler::Equal, Assembler::ScratchRegister, Assembler::TrustedImm32(1)); -- Assembler::Jump fallback = _as->branch32(Assembler::Equal, Assembler::ScratchRegister, Assembler::TrustedImm32(0)); -+ // check if it's integer convertible -+ _as->urshift64(Assembler::TrustedImm32(QV4::Value::IsIntegerConvertible_Shift), Assembler::ScratchRegister); -+ Assembler::Jump isIntConvertible = _as->branch32(Assembler::Equal, Assembler::ScratchRegister, Assembler::TrustedImm32(3)); -+ -+ // nope, not integer convertible, so check for a double: -+ _as->urshift64(Assembler::TrustedImm32( -+ QV4::Value::IsDoubleTag_Shift - QV4::Value::IsIntegerConvertible_Shift), -+ Assembler::ScratchRegister); -+ Assembler::Jump fallback = _as->branch32(Assembler::GreaterThan, Assembler::ScratchRegister, Assembler::TrustedImm32(0)); - - // it's a double - _as->move(Assembler::TrustedImm64(QV4::Value::NaNEncodeMask), Assembler::ScratchRegister); -@@ -1212,7 +1217,7 @@ void InstructionSelection::convertTypeTo - generateFunctionCall(Assembler::ReturnValueRegister, Runtime::toInt, - _as->loadAddress(Assembler::ScratchRegister, source)); - -- isInt.link(_as); -+ isIntConvertible.link(_as); - success.link(_as); - IR::Temp *targetTemp = target->asTemp(); - if (!targetTemp || targetTemp->kind == IR::Temp::StackSlot) { -@@ -1784,9 +1789,9 @@ void InstructionSelection::visitCJumpStr - { - Q_ASSERT(binop->op == IR::OpStrictEqual || binop->op == IR::OpStrictNotEqual); - -- if (visitCJumpStrictNullUndefined(IR::NullType, binop, trueBlock, falseBlock)) -+ if (visitCJumpStrictNull(binop, trueBlock, falseBlock)) - return; -- if (visitCJumpStrictNullUndefined(IR::UndefinedType, binop, trueBlock, falseBlock)) -+ if (visitCJumpStrictUndefined(binop, trueBlock, falseBlock)) - return; - if (visitCJumpStrictBool(binop, trueBlock, falseBlock)) - return; -@@ -1802,16 +1807,14 @@ void InstructionSelection::visitCJumpStr - } - - // Only load the non-null temp. --bool InstructionSelection::visitCJumpStrictNullUndefined(IR::Type nullOrUndef, IR::Binop *binop, -- IR::BasicBlock *trueBlock, -- IR::BasicBlock *falseBlock) -+bool InstructionSelection::visitCJumpStrictNull(IR::Binop *binop, -+ IR::BasicBlock *trueBlock, -+ IR::BasicBlock *falseBlock) - { -- Q_ASSERT(nullOrUndef == IR::NullType || nullOrUndef == IR::UndefinedType); -- - IR::Expr *varSrc = 0; -- if (binop->left->type == IR::VarType && binop->right->type == nullOrUndef) -+ if (binop->left->type == IR::VarType && binop->right->type == IR::NullType) - varSrc = binop->left; -- else if (binop->left->type == nullOrUndef && binop->right->type == IR::VarType) -+ else if (binop->left->type == IR::NullType && binop->right->type == IR::VarType) - varSrc = binop->right; - if (!varSrc) - return false; -@@ -1822,7 +1825,7 @@ bool InstructionSelection::visitCJumpStr - } - - if (IR::Const *c = varSrc->asConst()) { -- if (c->type == nullOrUndef) -+ if (c->type == IR::NullType) - _as->jumpToBlock(_block, trueBlock); - else - _as->jumpToBlock(_block, falseBlock); -@@ -1835,9 +1838,54 @@ bool InstructionSelection::visitCJumpStr - _as->load32(tagAddr, tagReg); - - Assembler::RelationalCondition cond = binop->op == IR::OpStrictEqual ? Assembler::Equal -- : Assembler::NotEqual; -- const Assembler::TrustedImm32 tag(nullOrUndef == IR::NullType ? int(QV4::Value::Null_Type_Internal) -- : int(QV4::Value::Undefined_Type)); -+ : Assembler::NotEqual; -+ const Assembler::TrustedImm32 tag(QV4::Value::Null_Type_Internal); -+ _as->generateCJumpOnCompare(cond, tagReg, tag, _block, trueBlock, falseBlock); -+ return true; -+} -+ -+bool InstructionSelection::visitCJumpStrictUndefined(IR::Binop *binop, -+ IR::BasicBlock *trueBlock, -+ IR::BasicBlock *falseBlock) -+{ -+ IR::Expr *varSrc = 0; -+ if (binop->left->type == IR::VarType && binop->right->type == IR::UndefinedType) -+ varSrc = binop->left; -+ else if (binop->left->type == IR::UndefinedType && binop->right->type == IR::VarType) -+ varSrc = binop->right; -+ if (!varSrc) -+ return false; -+ -+ if (varSrc->asTemp() && varSrc->asTemp()->kind == IR::Temp::PhysicalRegister) { -+ _as->jumpToBlock(_block, falseBlock); -+ return true; -+ } -+ -+ if (IR::Const *c = varSrc->asConst()) { -+ if (c->type == IR::UndefinedType) -+ _as->jumpToBlock(_block, trueBlock); -+ else -+ _as->jumpToBlock(_block, falseBlock); -+ return true; -+ } -+ -+ Assembler::RelationalCondition cond = binop->op == IR::OpStrictEqual ? Assembler::Equal -+ : Assembler::NotEqual; -+ const Assembler::RegisterID tagReg = Assembler::ScratchRegister; -+#ifdef QV4_USE_64_BIT_VALUE_ENCODING -+ Assembler::Pointer addr = _as->loadAddress(Assembler::ScratchRegister, varSrc); -+ _as->load64(addr, tagReg); -+ const Assembler::TrustedImm64 tag(0); -+#else // !QV4_USE_64_BIT_VALUE_ENCODING -+ Assembler::Pointer tagAddr = _as->loadAddress(Assembler::ScratchRegister, varSrc); -+ _as->load32(tagAddr, tagReg); -+ Assembler::Jump j = _as->branch32(Assembler::invert(cond), tagReg, Assembler::TrustedImm32(0)); -+ _as->addPatch(falseBlock, j); -+ -+ tagAddr.offset += 4; -+ _as->load32(tagAddr, tagReg); -+ const Assembler::TrustedImm32 tag(QV4::Value::Managed_Type_Internal); -+#endif - _as->generateCJumpOnCompare(cond, tagReg, tag, _block, trueBlock, falseBlock); - return true; - } -@@ -1928,10 +1976,14 @@ bool InstructionSelection::visitCJumpNul - if (binop->op == IR::OpNotEqual) - qSwap(trueBlock, falseBlock); - Assembler::Jump isNull = _as->branch32(Assembler::Equal, tagReg, Assembler::TrustedImm32(int(QV4::Value::Null_Type_Internal))); -- Assembler::Jump isUndefined = _as->branch32(Assembler::Equal, tagReg, Assembler::TrustedImm32(int(QV4::Value::Undefined_Type))); -+ Assembler::Jump isNotUndefinedTag = _as->branch32(Assembler::NotEqual, tagReg, Assembler::TrustedImm32(int(QV4::Value::Managed_Type_Internal))); -+ tagAddr.offset -= 4; -+ _as->load32(tagAddr, tagReg); -+ Assembler::Jump isNotUndefinedValue = _as->branch32(Assembler::NotEqual, tagReg, Assembler::TrustedImm32(0)); - _as->addPatch(trueBlock, isNull); -- _as->addPatch(trueBlock, isUndefined); -- _as->jumpToBlock(_block, falseBlock); -+ _as->addPatch(falseBlock, isNotUndefinedTag); -+ _as->addPatch(falseBlock, isNotUndefinedValue); -+ _as->jumpToBlock(_block, trueBlock); - - return true; - } -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4isel_masm_p.h -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jit/qv4isel_masm_p.h -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jit/qv4isel_masm_p.h -@@ -166,8 +166,8 @@ protected: - bool visitCJumpSInt32(IR::AluOp op, IR::Expr *left, IR::Expr *right, - IR::BasicBlock *iftrue, IR::BasicBlock *iffalse); - void visitCJumpStrict(IR::Binop *binop, IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); -- bool visitCJumpStrictNullUndefined(IR::Type nullOrUndef, IR::Binop *binop, -- IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); -+ bool visitCJumpStrictNull(IR::Binop *binop, IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); -+ bool visitCJumpStrictUndefined(IR::Binop *binop, IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); - bool visitCJumpStrictBool(IR::Binop *binop, IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); - bool visitCJumpNullUndefined(IR::Type nullOrUndef, IR::Binop *binop, - IR::BasicBlock *trueBlock, IR::BasicBlock *falseBlock); -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4scopedvalue_p.h -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4scopedvalue_p.h -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4scopedvalue_p.h -@@ -309,7 +309,7 @@ struct ScopedCallData { - { - int size = qMax(argc, (int)QV4::Global::ReservedArgumentCount) + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value); - ptr = reinterpret_cast(scope.alloc(size)); -- ptr->tag = QV4::Value::Integer_Type; -+ ptr->tag = QV4::Value::Integer_Type_Internal; - ptr->argc = argc; - } - -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4value_p.h -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4value_p.h -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4value_p.h -@@ -70,23 +70,85 @@ private: - /* - We use two different ways of encoding JS values. One for 32bit and one for 64bit systems. - -- In both cases, we use 8 bytes for a value and a different variant of NaN boxing. A Double NaN (actually -qNaN) -- is indicated by a number that has the top 13 bits set. The other values are usually set to 0 by the -- processor, and are thus free for us to store other data. We keep pointers in there for managed objects, -- and encode the other types using the free space given to use by the unused bits for NaN values. This also -- works for pointers on 64 bit systems, as they all currently only have 48 bits of addressable memory. -- -- On 32bit, we store doubles as doubles. All other values, have the high 32bits set to a value that -- will make the number a NaN. The Masks below are used for encoding the other types. -- -- On 64 bit, we xor Doubles with (0xffff8000 << 32). That has the effect that no doubles will get encoded -- with the 13 highest bits all 0. We are now using special values for bits 14-17 to encode our values. These -- can be used, as the highest valid pointer on a 64 bit system is 2^48-1. -- -- If they are all 0, we have a pointer to a Managed object. If bit 14 is set we have an integer. -- This makes testing for pointers and numbers very fast (we have a number if any of the highest 14 bits is set). -- -- Bit 15-17 is then used to encode other immediates. -+ In both cases, we use 8 bytes for a value and a different variant of NaN boxing. A Double -+ NaN (actually -qNaN) is indicated by a number that has the top 13 bits set, and for a -+ signalling NaN it is the top 14 bits. The other values are usually set to 0 by the -+ processor, and are thus free for us to store other data. We keep pointers in there for -+ managed objects, and encode the other types using the free space given to use by the unused -+ bits for NaN values. This also works for pointers on 64 bit systems, as they all currently -+ only have 48 bits of addressable memory. (Note: we do leave the lower 49 bits available for -+ pointers.) -+ -+ On 32bit, we store doubles as doubles. All other values, have the high 32bits set to a value -+ that will make the number a NaN. The Masks below are used for encoding the other types. -+ -+ On 64 bit, we xor Doubles with (0xffff8000 << 32). That has the effect that no doubles will -+ get encoded with bits 63-49 all set to 0. We then use bit 48 to distinguish between -+ managed/undefined (0), or Null/Int/Bool/Empty (1). So, storing a 49 bit pointer will leave -+ the top 15 bits 0, which is exactly the 'natural' representation of pointers. If bit 49 is -+ set, bit 48 indicates Empty (0) or integer-convertible (1). Then the 3 bit below that are -+ used to encode Null/Int/Bool. -+ -+ On both 32bit and 64bit, Undefined is encoded as a managed pointer with value 0. This is -+ the same as a nullptr. -+ -+ Specific bit-sequences: -+ 0 = always 0 -+ 1 = always 1 -+ x = stored value -+ a,b,c,d = specific bit values, see notes -+ -+ 64bit: -+ -+ 32109876 54321098 76543210 98765432 10987654 32109876 54321098 76543210 | -+ 66665555 55555544 44444444 33333333 33222222 22221111 11111100 00000000 | JS Value -+ ------------------------------------------------------------------------+-------------- -+ 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 | Undefined -+ 00000000 0000000x xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | Managed (heap pointer) -+ a0000000 0000bc00 00000000 00000000 00000000 00000000 00000000 00000000 | NaN/Inf -+ dddddddd ddddddxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | double -+ 00000000 00000010 00000000 00000000 00000000 00000000 00000000 00000000 | empty (non-sparse array hole) -+ 00000000 00000011 10000000 00000000 00000000 00000000 00000000 00000000 | Null -+ 00000000 00000011 01000000 00000000 00000000 00000000 00000000 0000000x | Bool -+ 00000000 00000011 00100000 00000000 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | Int -+ -+ Notes: -+ - a: xor-ed signbit, always 1 for NaN -+ - bc, xor-ed values: 11 = inf, 10 = sNaN, 01 = qNaN, 00 = boxed value -+ - d: xor-ed bits, where at least one bit is set, so: (val >> (64-14)) > 0 -+ - Undefined maps to C++ nullptr, so the "default" initialization is the same for both C++ -+ and JS -+ - Managed has the left 15 bits set to 0, so: (val >> (64-15)) == 0 -+ - empty, Null, Bool, and Int have the left 14 bits set to 0, and bit 49 set to 1, -+ so: (val >> (64-15)) == 1 -+ - Null, Bool, and Int have bit 48 set, indicating integer-convertible -+ - xoring _val with NaNEncodeMask will convert to a double in "natural" representation, where -+ any non double results in a NaN -+ -+ 32bit: -+ -+ 32109876 54321098 76543210 98765432 10987654 32109876 54321098 76543210 | -+ 66665555 55555544 44444444 33333333 33222222 22221111 11111100 00000000 | JS Value -+ ------------------------------------------------------------------------+-------------- -+ 01111111 11111100 00000000 00000000 00000000 00000000 00000000 00000000 | Undefined -+ 01111111 11111100 00000000 00000000 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | Managed (heap pointer) -+ a1111111 1111bc00 00000000 00000000 00000000 00000000 00000000 00000000 | NaN/Inf -+ xddddddd ddddddxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | double -+ 01111111 11111110 00000000 00000000 00000000 00000000 00000000 00000000 | empty (non-sparse array hole) -+ 01111111 11111111 10000000 00000000 00000000 00000000 00000000 00000000 | Null -+ 01111111 11111111 01000000 00000000 00000000 00000000 00000000 0000000x | Bool -+ 01111111 11111111 00100000 00000000 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | Int -+ -+ Notes: -+ - the upper 32 bits are the tag, the lower 32 bits the value -+ - Undefined has a nullptr in the value, Managed has a non-nullptr stored in the value -+ - a: sign bit, always 0 for NaN -+ - b,c: 00=inf, 01 = sNaN, 10 = qNaN, 11 = boxed value -+ - d: stored double value, as long as not *all* of them are 1, because that's a boxed value -+ (see above) -+ - empty, Null, Bool, and Int have bit 63 set to 0, bits 62-50 set to 1 (same as undefined -+ and managed), and bit 49 set to 1 (where undefined and managed have it set to 0) -+ - Null, Bool, and Int have bit 48 set, indicating integer-convertible - */ - - quint64 _val; -@@ -137,7 +199,7 @@ public: - { - quint32 v; - memcpy(&v, &b, 4); -- setTagValue(Managed_Type, v); -+ setTagValue(Managed_Type_Internal, v); - } - #endif - -@@ -153,113 +215,96 @@ public: - - Q_ALWAYS_INLINE void setEmpty() - { -- setTagValue(Empty_Type, value()); -+ setTagValue(Empty_Type_Internal, value()); - } - - Q_ALWAYS_INLINE void setEmpty(int i) - { -- setTagValue(Empty_Type, quint32(i)); -+ setTagValue(Empty_Type_Internal, quint32(i)); -+ } -+ -+ enum Type { -+ Undefined_Type, -+ Managed_Type, -+ Empty_Type, -+ Integer_Type, -+ Boolean_Type, -+ Null_Type, -+ Double_Type -+ }; -+ -+ inline Type type() const { -+ if (isUndefined()) return Undefined_Type; -+ if (isManaged()) return Managed_Type; -+ if (isEmpty()) return Empty_Type; -+ if (isInteger()) return Integer_Type; -+ if (isBoolean()) return Boolean_Type; -+ if (isNull()) return Null_Type; -+ Q_ASSERT(isDouble()); return Double_Type; - } - #ifndef QV4_USE_64_BIT_VALUE_ENCODING - enum Masks { - SilentNaNBit = 0x00040000, - NaN_Mask = 0x7ff80000, - NotDouble_Mask = 0x7ffa0000, -- Type_Mask = 0xffffc000, -- Immediate_Mask = NotDouble_Mask | 0x00004000 | SilentNaNBit, -- IsNullOrUndefined_Mask = Immediate_Mask | 0x08000, -+ Immediate_Mask = NotDouble_Mask | 0x00020000u | SilentNaNBit, - Tag_Shift = 32 - }; -- enum ValueType { -- Undefined_Type = Immediate_Mask | 0x00000, -- Null_Type = Immediate_Mask | 0x10000, -- Boolean_Type = Immediate_Mask | 0x08000, -- Integer_Type = Immediate_Mask | 0x18000, -- Managed_Type = NotDouble_Mask | 0x00000 | SilentNaNBit, -- Empty_Type = NotDouble_Mask | 0x18000 | SilentNaNBit -- }; -- -- enum ImmediateFlags { -- ConvertibleToInt = Immediate_Mask | 0x1 -- }; -- -- enum ValueTypeInternal { -- Null_Type_Internal = Null_Type | ConvertibleToInt, -- Boolean_Type_Internal = Boolean_Type | ConvertibleToInt, -- Integer_Type_Internal = Integer_Type | ConvertibleToInt, - -+ enum { -+ Managed_Type_Internal = NotDouble_Mask - }; - #else -- static const quint64 NaNEncodeMask = 0xffff800000000000ll; -- static const quint64 IsInt32Mask = 0x0002000000000000ll; -- static const quint64 IsDoubleMask = 0xfffc000000000000ll; -- static const quint64 IsNumberMask = IsInt32Mask|IsDoubleMask; -- static const quint64 IsNullOrUndefinedMask = 0x0000800000000000ll; -- static const quint64 IsNullOrBooleanMask = 0x0001000000000000ll; -- static const quint64 IsConvertibleToIntMask = IsInt32Mask|IsNullOrBooleanMask; -+ static const quint64 NaNEncodeMask = 0xfffc000000000000ll; -+ static const quint64 Immediate_Mask = 0x00020000u; // bit 49 - - enum Masks { - NaN_Mask = 0x7ff80000, -- Type_Mask = 0xffff8000, -- IsDouble_Mask = 0xfffc0000, -- Immediate_Mask = 0x00018000, -- IsNullOrUndefined_Mask = 0x00008000, -- IsNullOrBoolean_Mask = 0x00010000, -- Tag_Shift = 32 -- }; -- enum ValueType { -- Undefined_Type = IsNullOrUndefined_Mask, -- Null_Type = IsNullOrUndefined_Mask|IsNullOrBoolean_Mask, -- Boolean_Type = IsNullOrBoolean_Mask, -- Integer_Type = 0x20000|IsNullOrBoolean_Mask, -- Managed_Type = 0, -- Empty_Type = Undefined_Type | 0x4000 - }; - enum { - IsDouble_Shift = 64-14, -- IsNumber_Shift = 64-15, -- IsConvertibleToInt_Shift = 64-16, -- IsManaged_Shift = 64-17 -+ IsManagedOrUndefined_Shift = 64-15, -+ IsIntegerConvertible_Shift = 64-16, -+ Tag_Shift = 32, -+ IsDoubleTag_Shift = IsDouble_Shift - Tag_Shift, -+ Managed_Type_Internal = 0 - }; -- -- -+#endif - enum ValueTypeInternal { -- Null_Type_Internal = Null_Type, -- Boolean_Type_Internal = Boolean_Type, -- Integer_Type_Internal = Integer_Type -+ Empty_Type_Internal = Immediate_Mask | 0, -+ ConvertibleToInt = Immediate_Mask | 0x10000u, // bit 48 -+ Null_Type_Internal = ConvertibleToInt | 0x08000u, -+ Boolean_Type_Internal = ConvertibleToInt | 0x04000u, -+ Integer_Type_Internal = ConvertibleToInt | 0x02000u - }; --#endif -- -- inline unsigned type() const { -- return tag() & Type_Mask; -- } - - // used internally in property -- inline bool isEmpty() const { return tag() == Empty_Type; } -- -- inline bool isUndefined() const { return tag() == Undefined_Type; } -+ inline bool isEmpty() const { return tag() == Empty_Type_Internal; } - inline bool isNull() const { return tag() == Null_Type_Internal; } -- inline bool isBoolean() const { return tag ()== Boolean_Type_Internal; } -+ inline bool isBoolean() const { return tag() == Boolean_Type_Internal; } -+ inline bool isInteger() const { return tag() == Integer_Type_Internal; } -+ inline bool isNullOrUndefined() const { return isNull() || isUndefined(); } -+ inline bool isNumber() const { return isDouble() || isInteger(); } -+ - #ifdef QV4_USE_64_BIT_VALUE_ENCODING -- inline bool isInteger() const { return (_val >> IsNumber_Shift) == 1; } -+ inline bool isUndefined() const { return _val == 0; } - inline bool isDouble() const { return (_val >> IsDouble_Shift); } -- inline bool isNumber() const { return (_val >> IsNumber_Shift); } -- inline bool isManaged() const { return !(_val >> IsManaged_Shift); } -- inline bool isNullOrUndefined() const { return ((_val >> IsManaged_Shift) & ~2) == 1; } -- inline bool integerCompatible() const { return ((_val >> IsConvertibleToInt_Shift) & ~2) == 1; } -+ inline bool isManaged() const { return !isUndefined() && ((_val >> IsManagedOrUndefined_Shift) == 0); } -+ -+ inline bool integerCompatible() const { -+ return (_val >> IsIntegerConvertible_Shift) == 3; -+ } - static inline bool integerCompatible(Value a, Value b) { - return a.integerCompatible() && b.integerCompatible(); - } - static inline bool bothDouble(Value a, Value b) { - return a.isDouble() && b.isDouble(); - } -- inline bool isNaN() const { return (tag() & 0x7fff8000) == 0x00078000; } -+ inline bool isNaN() const { return (tag() & 0x7ffc0000 ) == 0x00040000; } - #else -- inline bool isInteger() const { return tag() == Integer_Type_Internal; } -+ inline bool isUndefined() const { return tag() == Managed_Type_Internal && value() == 0; } - inline bool isDouble() const { return (tag() & NotDouble_Mask) != NotDouble_Mask; } -- inline bool isNumber() const { return tag() == Integer_Type_Internal || (tag() & NotDouble_Mask) != NotDouble_Mask; } -- inline bool isManaged() const { return tag() == Managed_Type; } -- inline bool isNullOrUndefined() const { return (tag() & IsNullOrUndefined_Mask) == Undefined_Type; } -+ inline bool isManaged() const { return tag() == Managed_Type_Internal && !isUndefined(); } - inline bool integerCompatible() const { return (tag() & ConvertibleToInt) == ConvertibleToInt; } - static inline bool integerCompatible(Value a, Value b) { - return ((a.tag() & b.tag()) & ConvertibleToInt) == ConvertibleToInt; -@@ -499,14 +544,14 @@ struct Q_QML_PRIVATE_EXPORT Primitive : - inline Primitive Primitive::undefinedValue() - { - Primitive v; -- v.setTagValue(Undefined_Type, 0); -+ v.setM(Q_NULLPTR); - return v; - } - - inline Primitive Primitive::emptyValue() - { - Primitive v; -- v.setTagValue(Value::Empty_Type, 0); -+ v.setEmpty(0); - return v; - } - -@@ -534,7 +579,6 @@ inline Primitive Primitive::fromDouble(d - inline Primitive Primitive::fromInt32(int i) - { - Primitive v; -- v.setTagValue(Integer_Type_Internal, 0); - v.setInt_32(i); - return v; - } -@@ -552,31 +596,23 @@ inline Primitive Primitive::fromUInt32(u - - struct Encode { - static ReturnedValue undefined() { -- return quint64(Value::Undefined_Type) << Value::Tag_Shift; -+ return Primitive::undefinedValue().rawValue(); - } - static ReturnedValue null() { -- return quint64(Value::Null_Type_Internal) << Value::Tag_Shift; -+ return Primitive::nullValue().rawValue(); - } - - Encode(bool b) { -- val = (quint64(Value::Boolean_Type_Internal) << Value::Tag_Shift) | (uint)b; -+ val = Primitive::fromBoolean(b).rawValue(); - } - Encode(double d) { -- Value v; -- v.setDouble(d); -- val = v.rawValue(); -+ val = Primitive::fromDouble(d).rawValue(); - } - Encode(int i) { -- val = (quint64(Value::Integer_Type_Internal) << Value::Tag_Shift) | (uint)i; -+ val = Primitive::fromInt32(i).rawValue(); - } - Encode(uint i) { -- if (i <= INT_MAX) { -- val = (quint64(Value::Integer_Type_Internal) << Value::Tag_Shift) | i; -- } else { -- Value v; -- v.setDouble(i); -- val = v.rawValue(); -- } -+ val = Primitive::fromUInt32(i).rawValue(); - } - Encode(ReturnedValue v) { - val = v; -Index: qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4vme_moth.cpp -=================================================================== ---- qtdeclarative-opensource-src-5.6.1.orig/src/qml/jsruntime/qv4vme_moth.cpp -+++ qtdeclarative-opensource-src-5.6.1/src/qml/jsruntime/qv4vme_moth.cpp -@@ -563,7 +563,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - #endif // DO_TRACE_INSTR - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = QV4::Primitive::undefinedValue(); - STOREVALUE(instr.result, Runtime::callValue(engine, VALUE(instr.dest), callData)); -@@ -573,7 +573,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - TRACE(property name, "%s, args=%u, argc=%u, this=%s", qPrintable(runtimeStrings[instr.name]->toQString()), instr.callData, instr.argc, (VALUE(instr.base)).toString(context)->toQString().toUtf8().constData()); - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::callProperty(engine, instr.name, callData)); -@@ -582,7 +582,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CallPropertyLookup) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::callPropertyLookup(engine, instr.lookupIndex, callData)); -@@ -592,7 +592,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - TRACE(property name, "%s, args=%u, argc=%u, this=%s", qPrintable(runtimeStrings[instr.name]->toQString()), instr.callData, instr.argc, (VALUE(instr.base)).toString(context)->toQString().toUtf8().constData()); - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::callQmlScopeObjectProperty(engine, instr.index, callData)); -@@ -602,7 +602,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - TRACE(property name, "%s, args=%u, argc=%u, this=%s", qPrintable(runtimeStrings[instr.name]->toQString()), instr.callData, instr.argc, (VALUE(instr.base)).toString(context)->toQString().toUtf8().constData()); - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::callQmlContextObjectProperty(engine, instr.index, callData)); -@@ -611,7 +611,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CallElement) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::callElement(engine, VALUE(instr.index), callData)); -@@ -620,7 +620,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CallActivationProperty) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = QV4::Primitive::undefinedValue(); - STOREVALUE(instr.result, Runtime::callActivationProperty(engine, instr.name, callData)); -@@ -629,7 +629,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CallGlobalLookup) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = QV4::Primitive::undefinedValue(); - STOREVALUE(instr.result, Runtime::callGlobalLookup(engine, instr.index, callData)); -@@ -735,7 +735,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CreateValue) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = QV4::Primitive::undefinedValue(); - STOREVALUE(instr.result, Runtime::constructValue(engine, VALUE(instr.func), callData)); -@@ -744,7 +744,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CreateProperty) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::constructProperty(engine, instr.name, callData)); -@@ -753,7 +753,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(ConstructPropertyLookup) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = VALUE(instr.base); - STOREVALUE(instr.result, Runtime::constructPropertyLookup(engine, instr.index, callData)); -@@ -762,7 +762,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(CreateActivationProperty) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = QV4::Primitive::undefinedValue(); - STOREVALUE(instr.result, Runtime::constructActivationProperty(engine, instr.name, callData)); -@@ -771,7 +771,7 @@ QV4::ReturnedValue VME::run(ExecutionEng - MOTH_BEGIN_INSTR(ConstructGlobalLookup) - Q_ASSERT(instr.callData + instr.argc + qOffsetOf(QV4::CallData, args)/sizeof(QV4::Value) <= stackSize); - QV4::CallData *callData = reinterpret_cast(stack + instr.callData); -- callData->tag = QV4::Value::Integer_Type; -+ callData->tag = QV4::Value::Integer_Type_Internal; - callData->argc = instr.argc; - callData->thisObject = QV4::Primitive::undefinedValue(); - STOREVALUE(instr.result, Runtime::constructGlobalLookup(engine, instr.index, callData)); diff --git a/fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch b/fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch deleted file mode 100644 index 56bc871..0000000 --- a/fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch +++ /dev/null @@ -1,186 +0,0 @@ -From 5149aa68eca6ede8836ec4f07a14d22d9da9b161 Mon Sep 17 00:00:00 2001 -From: Mitch Curtis -Date: Tue, 13 Sep 2016 12:42:12 +0200 -Subject: [PATCH 1/1] Fix crash on exit when using default property aliases - with layouts - -The layout was being destroyed before the text, which meant that the -removeItemChangeListener() call never got hit. To ensure that the -listener is always removed, loop through each child in QQuickLayout's -destructor. - -This is a manual cherry-pick of -59c6c0e0b1b5b46747595a58e11311b7393d7e70. - -Task-number: QTBUG-51927 -Change-Id: I669f42beb8c3dd6b4b741cae0b16e017bb3409df -Reviewed-by: J-P Nurmi ---- - src/imports/layouts/qquicklayout.cpp | 4 ++ - .../qquicklayouts/data/rowlayout/Container.qml | 55 ++++++++++++++++++++++ - .../qquicklayouts/data/rowlayout/ContainerUser.qml | 53 +++++++++++++++++++++ - .../quick/qquicklayouts/data/tst_rowlayout.qml | 12 +++++ - 4 files changed, 124 insertions(+) - create mode 100644 tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml - create mode 100644 tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml - -diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp -index abc8f97..9914826 100644 ---- a/src/imports/layouts/qquicklayout.cpp -+++ b/src/imports/layouts/qquicklayout.cpp -@@ -698,6 +698,10 @@ QQuickLayout::QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent) - QQuickLayout::~QQuickLayout() - { - d_func()->m_isReady = false; -+ -+ const auto childItems = d_func()->childItems; -+ for (QQuickItem *child : childItems) -+ QQuickItemPrivate::get(child)->removeItemChangeListener(this, QQuickItemPrivate::SiblingOrder); - } - - QQuickLayoutAttached *QQuickLayout::qmlAttachedProperties(QObject *object) -diff --git a/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml b/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml -new file mode 100644 -index 0000000..22205c1 ---- /dev/null -+++ b/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml -@@ -0,0 +1,55 @@ -+/**************************************************************************** -+** -+** Copyright (C) 2016 The Qt Company Ltd. -+** Contact: http://www.qt.io/licensing/ -+** -+** This file is part of the test suite of the Qt Toolkit. -+** -+** $QT_BEGIN_LICENSE:BSD$ -+** You may use this file under the terms of the BSD license as follows: -+** -+** "Redistribution and use in source and binary forms, with or without -+** modification, are permitted provided that the following conditions are -+** met: -+** * Redistributions of source code must retain the above copyright -+** notice, this list of conditions and the following disclaimer. -+** * Redistributions in binary form must reproduce the above copyright -+** notice, this list of conditions and the following disclaimer in -+** the documentation and/or other materials provided with the -+** distribution. -+** * Neither the name of The Qt Company Ltd nor the names of its -+** contributors may be used to endorse or promote products derived -+** from this software without specific prior written permission. -+** -+** -+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -+** -+** $QT_END_LICENSE$ -+** -+****************************************************************************/ -+ -+import QtQuick 2.7 -+import QtQuick.Layouts 1.3 -+ -+Item { -+ objectName: "qtbug51927-window" -+ visible: true -+ -+ default property alias _contents: customContent.data -+ -+ RowLayout { -+ id: customContent -+ objectName: "qtbug51927-columnLayout" -+ anchors.fill: parent -+ } -+} -diff --git a/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml b/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml -new file mode 100644 -index 0000000..ff7ce62 ---- /dev/null -+++ b/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml -@@ -0,0 +1,53 @@ -+/**************************************************************************** -+** -+** Copyright (C) 2016 The Qt Company Ltd. -+** Contact: http://www.qt.io/licensing/ -+** -+** This file is part of the test suite of the Qt Toolkit. -+** -+** $QT_BEGIN_LICENSE:BSD$ -+** You may use this file under the terms of the BSD license as follows: -+** -+** "Redistribution and use in source and binary forms, with or without -+** modification, are permitted provided that the following conditions are -+** met: -+** * Redistributions of source code must retain the above copyright -+** notice, this list of conditions and the following disclaimer. -+** * Redistributions in binary form must reproduce the above copyright -+** notice, this list of conditions and the following disclaimer in -+** the documentation and/or other materials provided with the -+** distribution. -+** * Neither the name of The Qt Company Ltd nor the names of its -+** contributors may be used to endorse or promote products derived -+** from this software without specific prior written permission. -+** -+** -+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -+** -+** $QT_END_LICENSE$ -+** -+****************************************************************************/ -+ -+import QtQuick 2.6 -+import QtQuick.Window 2.2 -+ -+Container { -+ visible: true -+ -+ Text { -+ objectName: "qtbug51927-text" -+ text: qsTr("Hello World") -+ anchors.centerIn: parent -+ renderType: Text.QtRendering -+ } -+} -diff --git a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml -index 33b8fd0..2d4e227 100644 ---- a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml -+++ b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml -@@ -926,5 +926,17 @@ Item { - waitForRendering(layout) - layout.destroy() - } -+ -+ -+ function test_defaultPropertyAliasCrash() { -+ var containerUserComponent = Qt.createComponent("rowlayout/ContainerUser.qml"); -+ compare(containerUserComponent.status, Component.Ready); -+ -+ var containerUser = containerUserComponent.createObject(testCase); -+ verify(containerUser); -+ -+ // Shouldn't crash. -+ containerUser.destroy(); -+ } - } - } --- -2.7.4 - diff --git a/libqt5-qtdeclarative.changes b/libqt5-qtdeclarative.changes index e8e02a6..161633c 100644 --- a/libqt5-qtdeclarative.changes +++ b/libqt5-qtdeclarative.changes @@ -1,3 +1,18 @@ +------------------------------------------------------------------- +Wed Dec 14 16:05:47 UTC 2016 - hrvoje.senjan@gmail.com + +- Update to 5.7.1 + * For more details please see: + https://blog.qt.io/blog/2016/12/14/qt-5-7-1-released/ + and https://www.qt.io/qt5-7/ +- Drop upstreamed/obsolete patches: + overflow.patch, qtdeclarative-opensource-src-5.6.0-qml_no-lifetime-dse.patch, + V4-Always-set-the-tag-when-boxing-a-pointer.patch, + Add-a-facility-to-version-type-information.patch, + V4-Free-up-2-address-bits-in-64bit-mode.patch, + masm-unaligned-stack-pointer.patch and + fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch + ------------------------------------------------------------------- Mon Oct 17 11:34:00 UTC 2016 - lbeltrame@kde.org diff --git a/libqt5-qtdeclarative.spec b/libqt5-qtdeclarative.spec index 2fb9ac9..13b0efa 100644 --- a/libqt5-qtdeclarative.spec +++ b/libqt5-qtdeclarative.spec @@ -21,32 +21,18 @@ %define libname libQtQuick5 Name: libqt5-qtdeclarative -Version: 5.7.0 +Version: 5.7.1 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.7.0 -%define so_version 5.7.0 +%define real_version 5.7.1 +%define so_version 5.7.1 %define tar_version qtdeclarative-opensource-src-%{real_version} Source: %{tar_version}.tar.xz Source1: baselibs.conf -# PATCH-FIX-OPENSUSE overflow.patch -- Statement might be overflowing a buffer -Patch0: overflow.patch -# PATCH-FIX-OPENSUSE: qtdeclarative-opensource-src-5.6.0-qml_no-lifetime-dse.patch - fix crashes with i586 and Plasma (boo #985768) -Patch2: qtdeclarative-opensource-src-5.6.0-qml_no-lifetime-dse.patch -# PATCH-FIX-UPSTREAM V4-Always-set-the-tag-when-boxing-a-pointer.patch -Patch3: V4-Always-set-the-tag-when-boxing-a-pointer.patch -# PATCH-FIX-UPSTREAM Add-a-facility-to-version-type-information.patch -Patch4: Add-a-facility-to-version-type-information.patch -# PATCH-FIX-UPSTREAM V4-Free-up-2-address-bits-in-64bit-mode.patch -Patch5: V4-Free-up-2-address-bits-in-64bit-mode.patch -# PATCH-FIX-UPSTREAM masm-unaligned-stack-pointer.patch -Patch6: masm-unaligned-stack-pointer.patch -# PATCH-FIX-UPSTREAM fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch - fixes crashes in screenloker (boo#999548) -Patch7: fix-crash-on-exit-when-using-default-property-aliases-with-layouts.patch BuildRequires: fdupes BuildRequires: libQt5Core-private-headers-devel >= %{version} BuildRequires: libQt5Gui-private-headers-devel >= %{version} @@ -83,15 +69,6 @@ handling. %prep %setup -q -n qtdeclarative-opensource-src-%{real_version} -%patch0 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%ifarch aarch64 -%patch5 -p1 -%endif -%patch6 -p1 -%patch7 -p1 %package -n %libname Summary: Qt 5 Declarative Library diff --git a/masm-unaligned-stack-pointer.patch b/masm-unaligned-stack-pointer.patch deleted file mode 100644 index f0a1921..0000000 --- a/masm-unaligned-stack-pointer.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 4493524ec24afb946eba3942f48d9fc1ff3192c1 Mon Sep 17 00:00:00 2001 -From: Erik Verbruggen -Date: Tue, 9 Aug 2016 10:49:22 +0200 -Subject: [PATCH] V4: Align stack on 16 byte boundaries in the YarrJIT - -This is the required alignment for Aarch64, and a number of other ABIs -prefer this size too when calling into system libraries. - -Change-Id: Ie38cabb77cf83543b915553e69c5c5728a67503b -Reviewed-by: Simon Hausmann ---- - src/3rdparty/masm/yarr/YarrJIT.cpp | 22 ++++++++++++++++++++-- - 1 file changed, 20 insertions(+), 2 deletions(-) - -diff --git a/src/3rdparty/masm/yarr/YarrJIT.cpp b/src/3rdparty/masm/yarr/YarrJIT.cpp -index 5664c585b9..d8211ec4b2 100644 ---- a/src/3rdparty/masm/yarr/YarrJIT.cpp -+++ b/src/3rdparty/masm/yarr/YarrJIT.cpp -@@ -338,17 +338,31 @@ class YarrGenerator : private MacroAssembler { - jump(Address(stackPointerRegister, frameLocation * sizeof(void*))); - } - -+ unsigned alignCallFrameSizeInBytes(unsigned callFrameSize) -+ { -+ callFrameSize *= sizeof(void*); -+ if (callFrameSize / sizeof(void*) != m_pattern.m_body->m_callFrameSize) -+ CRASH(); -+ // Originally, the code was: -+// callFrameSize = (callFrameSize + 0x3f) & ~0x3f; -+ // However, 64 bytes is a bit surprising. The biggest "alignment" requirement is on Aarch64, where: -+ // "SP mod 16 = 0. The stack must be quad-word aligned." (IHI0055B_aapcs64.pdf) -+ callFrameSize = (callFrameSize + 0xf) & ~0xf; -+ if (!callFrameSize) -+ CRASH(); -+ return callFrameSize; -+ } - void initCallFrame() - { - unsigned callFrameSize = m_pattern.m_body->m_callFrameSize; - if (callFrameSize) -- subPtr(Imm32(callFrameSize * sizeof(void*)), stackPointerRegister); -+ subPtr(Imm32(alignCallFrameSizeInBytes(callFrameSize)), stackPointerRegister); - } - void removeCallFrame() - { - unsigned callFrameSize = m_pattern.m_body->m_callFrameSize; - if (callFrameSize) -- addPtr(Imm32(callFrameSize * sizeof(void*)), stackPointerRegister); -+ addPtr(Imm32(alignCallFrameSizeInBytes(callFrameSize)), stackPointerRegister); - } - - // Used to record subpatters, should only be called if compileMode is IncludeSubpatterns. -@@ -2565,6 +2579,10 @@ class YarrGenerator : private MacroAssembler { - if (compileMode == IncludeSubpatterns) - loadPtr(Address(X86Registers::ebp, 2 * sizeof(void*)), output); - #endif -+#elif CPU(ARM64) -+ // The ABI doesn't guarantee the upper bits are zero on unsigned arguments, so clear them ourselves. -+ zeroExtend32ToPtr(index, index); -+ zeroExtend32ToPtr(length, length); - #elif CPU(ARM) - push(ARMRegisters::r4); - push(ARMRegisters::r5); --- -2.10.1 - diff --git a/overflow.patch b/overflow.patch deleted file mode 100644 index 91f1575..0000000 --- a/overflow.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- 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 -@@ -123,8 +123,8 @@ struct Q_QML_PRIVATE_EXPORT Value - Q_ALWAYS_INLINE Heap::Base *m() const { Q_UNREACHABLE(); return Q_NULLPTR; } - Q_ALWAYS_INLINE void setM(Heap::Base *b) { Q_UNUSED(b); Q_UNREACHABLE(); } - #elif defined(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 { Q_STATIC_ASSERT(sizeof(Heap::Base*) == sizeof(quint32)); 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.6.0-qml_no-lifetime-dse.patch b/qtdeclarative-opensource-src-5.6.0-qml_no-lifetime-dse.patch deleted file mode 100644 index 5c9bef5..0000000 --- a/qtdeclarative-opensource-src-5.6.0-qml_no-lifetime-dse.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up qtdeclarative-opensource-src-5.6.0/src/qml/qml.pro.1135 qtdeclarative-opensource-src-5.6.0/src/qml/qml.pro ---- qtdeclarative-opensource-src-5.6.0/src/qml/qml.pro.1135 2016-06-02 08:43:24.509068141 -0500 -+++ qtdeclarative-opensource-src-5.6.0/src/qml/qml.pro 2016-06-02 10:25:28.813766581 -0500 -@@ -21,7 +21,7 @@ exists("qqml_enable_gcov") { - - greaterThan(QT_GCC_MAJOR_VERSION, 5) { - # Our code is bad. Temporary workaround. -- QMAKE_CXXFLAGS += -fno-delete-null-pointer-checks -+ QMAKE_CXXFLAGS += -fno-delete-null-pointer-checks -fno-lifetime-dse - } - - QMAKE_DOCS = $$PWD/doc/qtqml.qdocconf diff --git a/qtdeclarative-opensource-src-5.7.0.tar.xz b/qtdeclarative-opensource-src-5.7.0.tar.xz deleted file mode 100644 index fa135fd..0000000 --- a/qtdeclarative-opensource-src-5.7.0.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86de6239f3aee2e5f561c16ad7b6e47d8f341c293d4ed11c85acbc21888cf9f4 -size 18896864 diff --git a/qtdeclarative-opensource-src-5.7.1.tar.xz b/qtdeclarative-opensource-src-5.7.1.tar.xz new file mode 100644 index 0000000..45b664e --- /dev/null +++ b/qtdeclarative-opensource-src-5.7.1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd13dd3059d20694a857ed30ee56a2ade908c0cb93246f9804a65f7a2d775d56 +size 18976920