forked from pool/libqt5-qtdeclarative
Accepting request 264855 from KDE:Qt5
Update to 5.4.0 OBS-URL: https://build.opensuse.org/request/show/264855 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtdeclarative?expand=0&rev=21
This commit is contained in:
parent
fca35fc28e
commit
d47514e450
@ -1,115 +0,0 @@
|
|||||||
From 8f3311276e4ca44acb69c8870ccfc3167682b898 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Gunnar Sletta <gunnar@sletta.org>
|
|
||||||
Date: Thu, 28 Aug 2014 11:27:02 +0200
|
|
||||||
Subject: [PATCH 1/6] Fix crash with cleanup of animators.
|
|
||||||
|
|
||||||
We had several separate issues relating to how the jobs were cleaned up.
|
|
||||||
|
|
||||||
The first was that upon getting setWindow(0), the animator did not
|
|
||||||
reset m_controller to 0, leading to the starts() coming after that to
|
|
||||||
post null jobs to the controller. This would later crash in
|
|
||||||
beforeNodeSync as the starting job was null.
|
|
||||||
|
|
||||||
The second issue was that during shutdown, QQuickAnimatorProxy
|
|
||||||
would try to delete jobs on the controller which was already
|
|
||||||
deleted. The controller is deleted on the GUI thread regardless
|
|
||||||
of render loop, so this was solved with a QPointer.
|
|
||||||
|
|
||||||
The third was that we were a bit too aggressive in trying to clean up
|
|
||||||
jobs on the GUI thread, so we introduced a new bool which gets set to
|
|
||||||
true in startJob() so that Proxy::deleteJob() knows who owns the job.
|
|
||||||
|
|
||||||
Task-number: QTBUG-37833
|
|
||||||
Change-Id: I1b6221a2c1ce2bfd0758801b950cda00ff6899d0
|
|
||||||
Reviewed-by: Michael Brasser <michael.brasser@live.com>
|
|
||||||
---
|
|
||||||
src/quick/util/qquickanimatorcontroller.cpp | 1 +
|
|
||||||
src/quick/util/qquickanimatorjob.cpp | 14 ++++++++++----
|
|
||||||
src/quick/util/qquickanimatorjob_p.h | 4 +++-
|
|
||||||
3 files changed, 14 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/quick/util/qquickanimatorcontroller.cpp b/src/quick/util/qquickanimatorcontroller.cpp
|
|
||||||
index 697c25b..f8e24bf 100644
|
|
||||||
--- a/src/quick/util/qquickanimatorcontroller.cpp
|
|
||||||
+++ b/src/quick/util/qquickanimatorcontroller.cpp
|
|
||||||
@@ -262,6 +262,7 @@ void QQuickAnimatorController::requestSync()
|
|
||||||
// These functions are called on the GUI thread.
|
|
||||||
void QQuickAnimatorController::startJob(QQuickAnimatorProxyJob *proxy, QAbstractAnimationJob *job)
|
|
||||||
{
|
|
||||||
+ proxy->markJobManagedByController();
|
|
||||||
m_starting[job] = proxy;
|
|
||||||
requestSync();
|
|
||||||
}
|
|
||||||
diff --git a/src/quick/util/qquickanimatorjob.cpp b/src/quick/util/qquickanimatorjob.cpp
|
|
||||||
index 9f81f28..d61066b 100644
|
|
||||||
--- a/src/quick/util/qquickanimatorjob.cpp
|
|
||||||
+++ b/src/quick/util/qquickanimatorjob.cpp
|
|
||||||
@@ -57,6 +57,7 @@ QQuickAnimatorProxyJob::QQuickAnimatorProxyJob(QAbstractAnimationJob *job, QObje
|
|
||||||
: m_controller(0)
|
|
||||||
, m_job(job)
|
|
||||||
, m_internalState(State_Stopped)
|
|
||||||
+ , m_jobManagedByController(false)
|
|
||||||
{
|
|
||||||
m_isRenderThreadProxy = true;
|
|
||||||
m_animation = qobject_cast<QQuickAbstractAnimation *>(item);
|
|
||||||
@@ -101,7 +102,10 @@ void QQuickAnimatorProxyJob::deleteJob()
|
|
||||||
// so delete it through the controller to clean up properly.
|
|
||||||
if (m_controller)
|
|
||||||
m_controller->deleteJob(m_job);
|
|
||||||
- else
|
|
||||||
+
|
|
||||||
+ // We explicitly delete the job if the animator controller has never touched
|
|
||||||
+ // it. If it has, it will have ownership as well.
|
|
||||||
+ else if (!m_jobManagedByController)
|
|
||||||
delete m_job;
|
|
||||||
m_job = 0;
|
|
||||||
}
|
|
||||||
@@ -149,11 +153,13 @@ void QQuickAnimatorProxyJob::controllerWasDeleted()
|
|
||||||
void QQuickAnimatorProxyJob::setWindow(QQuickWindow *window)
|
|
||||||
{
|
|
||||||
if (!window) {
|
|
||||||
- // Stop will trigger syncBackCurrentValues so best to do it before
|
|
||||||
- // we delete m_job.
|
|
||||||
stop();
|
|
||||||
deleteJob();
|
|
||||||
- return;
|
|
||||||
+
|
|
||||||
+ // Upon leaving a window, we reset the controller. This means that
|
|
||||||
+ // animators will only enter the Starting phase and won't be making
|
|
||||||
+ // calls to QQuickAnimatorController::startjob().
|
|
||||||
+ m_controller = 0;
|
|
||||||
|
|
||||||
} else if (!m_controller && m_job) {
|
|
||||||
m_controller = QQuickWindowPrivate::get(window)->animationController;
|
|
||||||
diff --git a/src/quick/util/qquickanimatorjob_p.h b/src/quick/util/qquickanimatorjob_p.h
|
|
||||||
index 03b13bc..1ebf12f 100644
|
|
||||||
--- a/src/quick/util/qquickanimatorjob_p.h
|
|
||||||
+++ b/src/quick/util/qquickanimatorjob_p.h
|
|
||||||
@@ -77,6 +77,7 @@ public:
|
|
||||||
|
|
||||||
void startedByController();
|
|
||||||
void controllerWasDeleted();
|
|
||||||
+ void markJobManagedByController() { m_jobManagedByController = true; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool event(QEvent *);
|
|
||||||
@@ -95,7 +96,7 @@ private:
|
|
||||||
void setWindow(QQuickWindow *window);
|
|
||||||
static QObject *findAnimationContext(QQuickAbstractAnimation *);
|
|
||||||
|
|
||||||
- QQuickAnimatorController *m_controller;
|
|
||||||
+ QPointer<QQuickAnimatorController> m_controller;
|
|
||||||
QQuickAbstractAnimation *m_animation;
|
|
||||||
QAbstractAnimationJob *m_job;
|
|
||||||
int m_duration;
|
|
||||||
@@ -108,6 +109,7 @@ private:
|
|
||||||
};
|
|
||||||
|
|
||||||
InternalState m_internalState;
|
|
||||||
+ bool m_jobManagedByController;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Q_QUICK_PRIVATE_EXPORT QQuickAnimatorJob : public QAbstractAnimationJob
|
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
From cf44ee7761f2e4175f9193b42ee7296a2f3b694a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
|
|
||||||
Date: Fri, 29 Aug 2014 15:40:52 +0200
|
|
||||||
Subject: [PATCH 2/6] Support padding in images stored in atlas texture
|
|
||||||
|
|
||||||
If the stride does not match the width of the image, we upload
|
|
||||||
it line-by-line instead of as one big rect.
|
|
||||||
|
|
||||||
Change-Id: I5e08afcf5c35dc810fed25e45255d55d932b2a4c
|
|
||||||
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
|
|
||||||
---
|
|
||||||
src/quick/scenegraph/util/qsgatlastexture.cpp | 11 ++++++++++-
|
|
||||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/quick/scenegraph/util/qsgatlastexture.cpp b/src/quick/scenegraph/util/qsgatlastexture.cpp
|
|
||||||
index 782beca..53b3110 100644
|
|
||||||
--- a/src/quick/scenegraph/util/qsgatlastexture.cpp
|
|
||||||
+++ b/src/quick/scenegraph/util/qsgatlastexture.cpp
|
|
||||||
@@ -319,7 +319,16 @@ void Atlas::uploadBgra(Texture *texture)
|
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, r.x() + iw + 1, r.y() + 1, 1, ih, m_externalFormat, GL_UNSIGNED_BYTE, dst);
|
|
||||||
|
|
||||||
// Inner part of the image....
|
|
||||||
- glTexSubImage2D(GL_TEXTURE_2D, 0, r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2, m_externalFormat, GL_UNSIGNED_BYTE, src);
|
|
||||||
+ if (bpl != iw) {
|
|
||||||
+ int sy = r.y() + 1;
|
|
||||||
+ int ey = sy + r.height() - 2;
|
|
||||||
+ for (int y = sy; y < ey; ++y) {
|
|
||||||
+ glTexSubImage2D(GL_TEXTURE_2D, 0, r.x() + 1, y, r.width() - 2, 1, m_externalFormat, GL_UNSIGNED_BYTE, src);
|
|
||||||
+ src += bpl;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ glTexSubImage2D(GL_TEXTURE_2D, 0, r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2, m_externalFormat, GL_UNSIGNED_BYTE, src);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
@ -1,155 +0,0 @@
|
|||||||
From 210475565969ca5381174016b47cd32ddc96eaed Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lars Knoll <lars.knoll@digia.com>
|
|
||||||
Date: Thu, 12 Jun 2014 14:35:53 +0200
|
|
||||||
Subject: [PATCH 3/6] Fix crashes when calling Array.sort with imperfect sort
|
|
||||||
functions
|
|
||||||
|
|
||||||
We can't use std::sort to implement Array.sort. The reason is that
|
|
||||||
std::sort expects a conformant compare function, and can do weird
|
|
||||||
things (esp. crash) when the sort function isn't conformant.
|
|
||||||
|
|
||||||
Falling back to qSort is not possible, as the method has been
|
|
||||||
deprecated. So add a copy of the qSort implementation here, and
|
|
||||||
use that one instead.
|
|
||||||
|
|
||||||
Fix the sortint test in tst_qqmlecmascript to have a consistent
|
|
||||||
sort function for strings, as the result of calling sort is
|
|
||||||
otherwise undefined according to the ecma standard.
|
|
||||||
|
|
||||||
Task-number: QTBUG-39072
|
|
||||||
Change-Id: I0602b3aa1ffa4de5006da58396f166805cf4a5e2
|
|
||||||
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
|
|
||||||
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
|
|
||||||
---
|
|
||||||
src/qml/jsruntime/qv4arraydata.cpp | 56 +++++++++++++++++++++-
|
|
||||||
tests/auto/qml/qjsengine/tst_qjsengine.cpp | 19 ++++++++
|
|
||||||
.../auto/qml/qqmlecmascript/data/sequenceSort.qml | 2 +-
|
|
||||||
3 files changed, 75 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp
|
|
||||||
index 7d76a10..9627848 100644
|
|
||||||
--- a/src/qml/jsruntime/qv4arraydata.cpp
|
|
||||||
+++ b/src/qml/jsruntime/qv4arraydata.cpp
|
|
||||||
@@ -674,6 +674,60 @@ bool ArrayElementLessThan::operator()(Value v1, Value v2) const
|
|
||||||
return p1s->toQString() < p2s->toQString();
|
|
||||||
}
|
|
||||||
|
|
||||||
+template <typename RandomAccessIterator, typename T, typename LessThan>
|
|
||||||
+void sortHelper(RandomAccessIterator start, RandomAccessIterator end, const T &t, LessThan lessThan)
|
|
||||||
+{
|
|
||||||
+top:
|
|
||||||
+ int span = int(end - start);
|
|
||||||
+ if (span < 2)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ --end;
|
|
||||||
+ RandomAccessIterator low = start, high = end - 1;
|
|
||||||
+ RandomAccessIterator pivot = start + span / 2;
|
|
||||||
+
|
|
||||||
+ if (lessThan(*end, *start))
|
|
||||||
+ qSwap(*end, *start);
|
|
||||||
+ if (span == 2)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ if (lessThan(*pivot, *start))
|
|
||||||
+ qSwap(*pivot, *start);
|
|
||||||
+ if (lessThan(*end, *pivot))
|
|
||||||
+ qSwap(*end, *pivot);
|
|
||||||
+ if (span == 3)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ qSwap(*pivot, *end);
|
|
||||||
+
|
|
||||||
+ while (low < high) {
|
|
||||||
+ while (low < high && lessThan(*low, *end))
|
|
||||||
+ ++low;
|
|
||||||
+
|
|
||||||
+ while (high > low && lessThan(*end, *high))
|
|
||||||
+ --high;
|
|
||||||
+
|
|
||||||
+ if (low < high) {
|
|
||||||
+ qSwap(*low, *high);
|
|
||||||
+ ++low;
|
|
||||||
+ --high;
|
|
||||||
+ } else {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (lessThan(*low, *end))
|
|
||||||
+ ++low;
|
|
||||||
+
|
|
||||||
+ qSwap(*end, *low);
|
|
||||||
+ sortHelper(start, low, t, lessThan);
|
|
||||||
+
|
|
||||||
+ start = low + 1;
|
|
||||||
+ ++end;
|
|
||||||
+ goto top;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const ValueRef comparefn, uint len)
|
|
||||||
{
|
|
||||||
if (!len)
|
|
||||||
@@ -765,7 +819,7 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
|
|
||||||
ArrayElementLessThan lessThan(context, thisObject, comparefn);
|
|
||||||
|
|
||||||
Value *begin = thisObject->arrayData->data;
|
|
||||||
- std::sort(begin, begin + len, lessThan);
|
|
||||||
+ sortHelper(begin, begin + len, *begin, lessThan);
|
|
||||||
|
|
||||||
#ifdef CHECK_SPARSE_ARRAYS
|
|
||||||
thisObject->initSparseArray();
|
|
||||||
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
|
|
||||||
index 51cd699..4b47e55 100644
|
|
||||||
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
|
|
||||||
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
|
|
||||||
@@ -135,6 +135,7 @@ private slots:
|
|
||||||
void reentrancy_objectCreation();
|
|
||||||
void jsIncDecNonObjectProperty();
|
|
||||||
void JSONparse();
|
|
||||||
+ void arraySort();
|
|
||||||
|
|
||||||
void qRegExpInport_data();
|
|
||||||
void qRegExpInport();
|
|
||||||
@@ -2729,6 +2730,24 @@ void tst_QJSEngine::JSONparse()
|
|
||||||
QVERIFY(ret.isObject());
|
|
||||||
}
|
|
||||||
|
|
||||||
+void tst_QJSEngine::arraySort()
|
|
||||||
+{
|
|
||||||
+ // tests that calling Array.sort with a bad sort function doesn't cause issues
|
|
||||||
+ // Using std::sort is e.g. not safe when used with a bad sort function and causes
|
|
||||||
+ // crashes
|
|
||||||
+ QJSEngine eng;
|
|
||||||
+ eng.evaluate("function crashMe() {"
|
|
||||||
+ " var data = [];"
|
|
||||||
+ " for (var i = 0; i < 50; i++) {"
|
|
||||||
+ " data[i] = 'whatever';"
|
|
||||||
+ " }"
|
|
||||||
+ " data.sort(function(a, b) {"
|
|
||||||
+ " return -1;"
|
|
||||||
+ " });"
|
|
||||||
+ "}"
|
|
||||||
+ "crashMe();");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static QRegExp minimal(QRegExp r) { r.setMinimal(true); return r; }
|
|
||||||
|
|
||||||
void tst_QJSEngine::qRegExpInport_data()
|
|
||||||
diff --git a/tests/auto/qml/qqmlecmascript/data/sequenceSort.qml b/tests/auto/qml/qqmlecmascript/data/sequenceSort.qml
|
|
||||||
index 5e2892a..b130408 100644
|
|
||||||
--- a/tests/auto/qml/qqmlecmascript/data/sequenceSort.qml
|
|
||||||
+++ b/tests/auto/qml/qqmlecmascript/data/sequenceSort.qml
|
|
||||||
@@ -23,7 +23,7 @@ Item {
|
|
||||||
}
|
|
||||||
|
|
||||||
function compareStrings(a, b) {
|
|
||||||
- return (a < b) ? 1 : -1;
|
|
||||||
+ return (a == b) ? 0 : ((a < b) ? 1 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function compareNumbers(a, b) {
|
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
|||||||
From f7c3035fa1d965dceb36892122683a5ceb6cab89 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Erik Verbruggen <erik.verbruggen@digia.com>
|
|
||||||
Date: Thu, 28 Aug 2014 13:12:53 +0200
|
|
||||||
Subject: [PATCH 4/6] QML: parse .js files as JavaScript, not QML.
|
|
||||||
|
|
||||||
When importing a JS library into a QML file with the "import" keyword,
|
|
||||||
that JS file was parsed in QML mode, disallowing QML keywords like "as".
|
|
||||||
|
|
||||||
Task-number: QTBUG-40143
|
|
||||||
Change-Id: Ie98adceb27544732c2e96657d41170db36bff288
|
|
||||||
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
|
|
||||||
---
|
|
||||||
src/qml/jsruntime/qv4script.cpp | 2 +-
|
|
||||||
.../qml/qqmlecmascript/data/importScriptsWithoutQmlMode.js | 7 +++++++
|
|
||||||
.../qml/qqmlecmascript/data/importScriptsWithoutQmlMode.qml | 10 ++++++++++
|
|
||||||
tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp | 11 +++++++++++
|
|
||||||
4 files changed, 29 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100644 tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.js
|
|
||||||
create mode 100644 tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.qml
|
|
||||||
|
|
||||||
diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp
|
|
||||||
index 36f61a1..4d6e069 100644
|
|
||||||
--- a/src/qml/jsruntime/qv4script.cpp
|
|
||||||
+++ b/src/qml/jsruntime/qv4script.cpp
|
|
||||||
@@ -349,7 +349,7 @@ QV4::CompiledData::CompilationUnit *Script::precompile(IR::Module *module, Compi
|
|
||||||
|
|
||||||
QQmlJS::Engine ee;
|
|
||||||
QQmlJS::Lexer lexer(&ee);
|
|
||||||
- lexer.setCode(source, /*line*/1, /*qml mode*/true);
|
|
||||||
+ lexer.setCode(source, /*line*/1, /*qml mode*/false);
|
|
||||||
QQmlJS::Parser parser(&ee);
|
|
||||||
|
|
||||||
parser.parseProgram();
|
|
||||||
diff --git a/tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.js b/tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.js
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..aabcc9f
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.js
|
|
||||||
@@ -0,0 +1,7 @@
|
|
||||||
+.pragma library
|
|
||||||
+
|
|
||||||
+var as = undefined
|
|
||||||
+function isLegal() {
|
|
||||||
+ var as = true;
|
|
||||||
+ return as;
|
|
||||||
+}
|
|
||||||
diff --git a/tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.qml b/tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.qml
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..17d1219
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/auto/qml/qqmlecmascript/data/importScriptsWithoutQmlMode.qml
|
|
||||||
@@ -0,0 +1,10 @@
|
|
||||||
+import QtQuick 2.0
|
|
||||||
+
|
|
||||||
+import "importScriptsWithoutQmlMode.js" as Export
|
|
||||||
+
|
|
||||||
+Rectangle {
|
|
||||||
+ id: root
|
|
||||||
+ property bool success: false
|
|
||||||
+
|
|
||||||
+ Component.onCompleted: success = Export.isLegal()
|
|
||||||
+}
|
|
||||||
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
|
|
||||||
index 34413b2..7e9adea 100644
|
|
||||||
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
|
|
||||||
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
|
|
||||||
@@ -321,6 +321,7 @@ private slots:
|
|
||||||
void lazyBindingEvaluation();
|
|
||||||
void varPropertyAccessOnObjectWithInvalidContext();
|
|
||||||
void importedScriptsAccessOnObjectWithInvalidContext();
|
|
||||||
+ void importedScriptsWithoutQmlMode();
|
|
||||||
void contextObjectOnLazyBindings();
|
|
||||||
void garbageCollectionDuringCreation();
|
|
||||||
|
|
||||||
@@ -7609,6 +7610,16 @@ void tst_qqmlecmascript::importedScriptsAccessOnObjectWithInvalidContext()
|
|
||||||
QTRY_VERIFY(obj->property("success") == true);
|
|
||||||
}
|
|
||||||
|
|
||||||
+void tst_qqmlecmascript::importedScriptsWithoutQmlMode()
|
|
||||||
+{
|
|
||||||
+ QQmlComponent component(&engine, testFileUrl("importScriptsWithoutQmlMode.qml"));
|
|
||||||
+ QScopedPointer<QObject> obj(component.create());
|
|
||||||
+ if (obj.isNull())
|
|
||||||
+ qDebug() << component.errors().first().toString();
|
|
||||||
+ QVERIFY(!obj.isNull());
|
|
||||||
+ QTRY_VERIFY(obj->property("success") == true);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void tst_qqmlecmascript::contextObjectOnLazyBindings()
|
|
||||||
{
|
|
||||||
QQmlComponent component(&engine, testFileUrl("contextObjectOnLazyBindings.qml"));
|
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
@ -1,126 +0,0 @@
|
|||||||
From 4d07bf91ed2d36aee9178ef48508c16277fbb318 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Simon Hausmann <simon.hausmann@digia.com>
|
|
||||||
Date: Thu, 21 Aug 2014 16:24:54 +0200
|
|
||||||
Subject: [PATCH 5/6] Fix crash with foreach on arguments object
|
|
||||||
|
|
||||||
We call fullyCreate() on the arguments object when it's initialized
|
|
||||||
on an foreach iterator. That itself however might trigger an allocation,
|
|
||||||
which in turn might collect the ForEachIteratorObject, which is missing
|
|
||||||
a "ProtectThis" in its constructor.
|
|
||||||
|
|
||||||
Change-Id: Ib8f7e39201e727cde91cbbe8a82cba78aa980f0d
|
|
||||||
Task-number: QTBUG-40844
|
|
||||||
Reviewed-by: Albert Astals Cid <albert.astals@canonical.com>
|
|
||||||
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
|
|
||||||
---
|
|
||||||
src/qml/jsruntime/qv4objectiterator.cpp | 40 +++++++++++++++++++++++++--------
|
|
||||||
src/qml/jsruntime/qv4objectiterator_p.h | 11 ++++-----
|
|
||||||
2 files changed, 37 insertions(+), 14 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/qml/jsruntime/qv4objectiterator.cpp b/src/qml/jsruntime/qv4objectiterator.cpp
|
|
||||||
index e5f693c..0efd304 100644
|
|
||||||
--- a/src/qml/jsruntime/qv4objectiterator.cpp
|
|
||||||
+++ b/src/qml/jsruntime/qv4objectiterator.cpp
|
|
||||||
@@ -54,13 +54,7 @@ ObjectIterator::ObjectIterator(Value *scratch1, Value *scratch2, const ObjectRef
|
|
||||||
, memberIndex(0)
|
|
||||||
, flags(flags)
|
|
||||||
{
|
|
||||||
- object = o.getPointer();
|
|
||||||
- current = o.getPointer();
|
|
||||||
-
|
|
||||||
- if (!!object && object->asArgumentsObject()) {
|
|
||||||
- Scope scope(object->engine());
|
|
||||||
- Scoped<ArgumentsObject> (scope, object->asReturnedValue())->fullyCreate();
|
|
||||||
- }
|
|
||||||
+ init(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
ObjectIterator::ObjectIterator(Scope &scope, const ObjectRef o, uint flags)
|
|
||||||
@@ -71,8 +65,26 @@ ObjectIterator::ObjectIterator(Scope &scope, const ObjectRef o, uint flags)
|
|
||||||
, memberIndex(0)
|
|
||||||
, flags(flags)
|
|
||||||
{
|
|
||||||
- object = o;
|
|
||||||
- current = o;
|
|
||||||
+ init(o);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+ObjectIterator::ObjectIterator(Value *scratch1, Value *scratch2, uint flags)
|
|
||||||
+ : object(ObjectRef::fromValuePointer(scratch1))
|
|
||||||
+ , current(ObjectRef::fromValuePointer(scratch2))
|
|
||||||
+ , arrayNode(0)
|
|
||||||
+ , arrayIndex(0)
|
|
||||||
+ , memberIndex(0)
|
|
||||||
+ , flags(flags)
|
|
||||||
+{
|
|
||||||
+ object = (Object*)0;
|
|
||||||
+ current = (Object*)0;
|
|
||||||
+ // Caller needs to call init!
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void ObjectIterator::init(const ObjectRef o)
|
|
||||||
+{
|
|
||||||
+ object = o.getPointer();
|
|
||||||
+ current = o.getPointer();
|
|
||||||
|
|
||||||
if (!!object && object->asArgumentsObject()) {
|
|
||||||
Scope scope(object->engine());
|
|
||||||
@@ -194,6 +206,16 @@ ReturnedValue ObjectIterator::nextPropertyNameAsString()
|
|
||||||
|
|
||||||
DEFINE_OBJECT_VTABLE(ForEachIteratorObject);
|
|
||||||
|
|
||||||
+ForEachIteratorObject::ForEachIteratorObject(ExecutionContext *ctx, const ObjectRef o)
|
|
||||||
+ : Object(ctx->engine), it(workArea, workArea + 1, ObjectIterator::EnumerableOnly|ObjectIterator::WithProtoChain)
|
|
||||||
+{
|
|
||||||
+ Scope scope(ctx);
|
|
||||||
+ ScopedObject protectThis(scope, this);
|
|
||||||
+
|
|
||||||
+ setVTable(staticVTable());
|
|
||||||
+ it.init(o);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void ForEachIteratorObject::markObjects(Managed *that, ExecutionEngine *e)
|
|
||||||
{
|
|
||||||
ForEachIteratorObject *o = static_cast<ForEachIteratorObject *>(that);
|
|
||||||
diff --git a/src/qml/jsruntime/qv4objectiterator_p.h b/src/qml/jsruntime/qv4objectiterator_p.h
|
|
||||||
index c87f284..5ead1f5 100644
|
|
||||||
--- a/src/qml/jsruntime/qv4objectiterator_p.h
|
|
||||||
+++ b/src/qml/jsruntime/qv4objectiterator_p.h
|
|
||||||
@@ -58,6 +58,7 @@ struct ExecutionContext;
|
|
||||||
struct Property;
|
|
||||||
struct String;
|
|
||||||
struct InternalClass;
|
|
||||||
+struct ForEachIteratorObject;
|
|
||||||
|
|
||||||
struct Q_QML_EXPORT ObjectIterator
|
|
||||||
{
|
|
||||||
@@ -76,21 +77,21 @@ struct Q_QML_EXPORT ObjectIterator
|
|
||||||
|
|
||||||
ObjectIterator(Value *scratch1, Value *scratch2, const ObjectRef o, uint flags);
|
|
||||||
ObjectIterator(Scope &scope, const ObjectRef o, uint flags);
|
|
||||||
+ void init(const ObjectRef o);
|
|
||||||
void next(StringRef name, uint *index, Property *pd, PropertyAttributes *attributes = 0);
|
|
||||||
ReturnedValue nextPropertyName(ValueRef value);
|
|
||||||
ReturnedValue nextPropertyNameAsString(ValueRef value);
|
|
||||||
ReturnedValue nextPropertyNameAsString();
|
|
||||||
+private:
|
|
||||||
+ friend struct ForEachIteratorObject;
|
|
||||||
+ ObjectIterator(Value *scratch1, Value *scratch2, uint flags); // Constructor that requires calling init()
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ForEachIteratorObject: Object {
|
|
||||||
V4_OBJECT
|
|
||||||
Q_MANAGED_TYPE(ForeachIteratorObject)
|
|
||||||
ObjectIterator it;
|
|
||||||
- ForEachIteratorObject(ExecutionContext *ctx, const ObjectRef o)
|
|
||||||
- : Object(ctx->engine), it(workArea, workArea + 1,
|
|
||||||
- o, ObjectIterator::EnumerableOnly|ObjectIterator::WithProtoChain) {
|
|
||||||
- setVTable(staticVTable());
|
|
||||||
- }
|
|
||||||
+ ForEachIteratorObject(ExecutionContext *ctx, const ObjectRef o);
|
|
||||||
|
|
||||||
ReturnedValue nextPropertyName() { return it.nextPropertyNameAsString(); }
|
|
||||||
|
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
From 5a9f0131f8c0b7424a4d323b0f65237206be45ea Mon Sep 17 00:00:00 2001
|
|
||||||
From: Josh Arenson <joshua.arenson@canonical.com>
|
|
||||||
Date: Mon, 4 Aug 2014 09:42:27 -0700
|
|
||||||
Subject: [PATCH 6/6] Move syncTimer measurment to the correct place.
|
|
||||||
|
|
||||||
syncTimer was including the time spent waiting for VSYNC on unchanged
|
|
||||||
frames. This was causing the reported value to be much higher than expected.
|
|
||||||
|
|
||||||
Task-number: QTBUG-40556
|
|
||||||
Change-Id: Ife759b4e27faf2124ab330be8d1f42d15c4d2d33
|
|
||||||
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
|
|
||||||
---
|
|
||||||
src/quick/scenegraph/qsgthreadedrenderloop.cpp | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
|
|
||||||
index c17eb91..1cfc689 100644
|
|
||||||
--- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp
|
|
||||||
+++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
|
|
||||||
@@ -586,6 +586,10 @@ void QSGRenderThread::syncAndRender()
|
|
||||||
QSG_RT_DEBUG(" - update pending, doing sync");
|
|
||||||
sync();
|
|
||||||
}
|
|
||||||
+#ifndef QSG_NO_RENDER_TIMING
|
|
||||||
+ if (profileFrames)
|
|
||||||
+ syncTime = threadTimer.nsecsElapsed();
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
if (!syncResultedInChanges && !(repaintRequested)) {
|
|
||||||
QSG_RT_DEBUG(" - no changes, rendering aborted");
|
|
||||||
@@ -595,10 +599,6 @@ void QSGRenderThread::syncAndRender()
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#ifndef QSG_NO_RENDER_TIMING
|
|
||||||
- if (profileFrames)
|
|
||||||
- syncTime = threadTimer.nsecsElapsed();
|
|
||||||
-#endif
|
|
||||||
QSG_RT_DEBUG(" - rendering starting");
|
|
||||||
|
|
||||||
QQuickWindowPrivate *d = QQuickWindowPrivate::get(window);
|
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
@ -1,3 +1,26 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Dec 10 11:00:06 UTC 2014 - hrvoje.senjan@gmail.com
|
||||||
|
|
||||||
|
- Update to 5.4 Final
|
||||||
|
* For more details please see:
|
||||||
|
http://blog.qt.digia.com/blog/2014/12/10/qt-5-4-released/
|
||||||
|
and http://qt-project.org/wiki/New-Features-in-Qt-5.4
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Nov 27 15:58:41 UTC 2014 - hrvoje.senjan@gmail.com
|
||||||
|
|
||||||
|
- Update to 5.4 RC
|
||||||
|
* For more details please see:
|
||||||
|
http://blog.qt.digia.com/blog/2014/11/27/qt-5-4-release-candidate-available/
|
||||||
|
and http://qt-project.org/wiki/New-Features-in-Qt-5.4
|
||||||
|
- Drop patches merged upstream:
|
||||||
|
0005-Fix-crash-with-foreach-on-arguments-object.patch
|
||||||
|
0004-QML-parse-.js-files-as-JavaScript-not-QML.patch
|
||||||
|
0006-Move-syncTimer-measurment-to-the-correct-place.patch
|
||||||
|
0003-Fix-crashes-when-calling-Array.sort-with-imperfect-s.patch
|
||||||
|
0001-Fix-crash-with-cleanup-of-animators.patch
|
||||||
|
0002-Support-padding-in-images-stored-in-atlas-texture.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Sep 22 18:11:03 UTC 2014 - hrvoje.senjan@gmail.com
|
Mon Sep 22 18:11:03 UTC 2014 - hrvoje.senjan@gmail.com
|
||||||
|
|
||||||
|
@ -21,25 +21,18 @@
|
|||||||
%define libname libQtQuick5
|
%define libname libQtQuick5
|
||||||
|
|
||||||
Name: libqt5-qtdeclarative
|
Name: libqt5-qtdeclarative
|
||||||
Version: 5.3.2
|
Version: 5.4.0
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Qt 5 Declarative Library
|
Summary: Qt 5 Declarative Library
|
||||||
License: SUSE-LGPL-2.1-with-digia-exception-1.1 or GPL-3.0
|
License: SUSE-LGPL-2.1-with-digia-exception-1.1 or GPL-3.0
|
||||||
Group: Development/Libraries/X11
|
Group: Development/Libraries/X11
|
||||||
Url: http://qt.digia.com
|
Url: http://qt.digia.com
|
||||||
%define base_name libqt5
|
%define base_name libqt5
|
||||||
%define real_version 5.3.2
|
%define real_version 5.4.0
|
||||||
%define so_version 5.3.2
|
%define so_version 5.4.0
|
||||||
%define tar_version qtdeclarative-opensource-src-%{real_version}
|
%define tar_version qtdeclarative-opensource-src-%{real_version}
|
||||||
Source: %{tar_version}.tar.xz
|
Source: %{tar_version}.tar.xz
|
||||||
Source1: baselibs.conf
|
Source1: baselibs.conf
|
||||||
# PATCHES FROM UPSTREAM 5.3 branch
|
|
||||||
Patch0: 0001-Fix-crash-with-cleanup-of-animators.patch
|
|
||||||
Patch1: 0002-Support-padding-in-images-stored-in-atlas-texture.patch
|
|
||||||
Patch2: 0003-Fix-crashes-when-calling-Array.sort-with-imperfect-s.patch
|
|
||||||
Patch3: 0004-QML-parse-.js-files-as-JavaScript-not-QML.patch
|
|
||||||
Patch4: 0005-Fix-crash-with-foreach-on-arguments-object.patch
|
|
||||||
Patch5: 0006-Move-syncTimer-measurment-to-the-correct-place.patch
|
|
||||||
# PATCH-FIX-OPENSUSE sse2_nojit.patch -- enable JIT and sse2 only on sse2 case
|
# PATCH-FIX-OPENSUSE sse2_nojit.patch -- enable JIT and sse2 only on sse2 case
|
||||||
Patch100: sse2_nojit.patch
|
Patch100: sse2_nojit.patch
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
@ -71,12 +64,6 @@ handling.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n qtdeclarative-opensource-src-%{real_version}
|
%setup -q -n qtdeclarative-opensource-src-%{real_version}
|
||||||
%patch0 -p1
|
|
||||||
%patch1 -p1
|
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1
|
|
||||||
%patch5 -p1
|
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
|
|
||||||
%package -n %libname
|
%package -n %libname
|
||||||
@ -200,7 +187,7 @@ popd
|
|||||||
|
|
||||||
%files -n %libname
|
%files -n %libname
|
||||||
%defattr(-,root,root,755)
|
%defattr(-,root,root,755)
|
||||||
%doc LGPL_EXCEPTION.txt LICENSE.FDL LICENSE.GPL LICENSE.LGPL
|
%doc LGPL_EXCEPTION.txt LICENSE.*
|
||||||
%{_libqt5_libdir}/libQt5Q*.so.*
|
%{_libqt5_libdir}/libQt5Q*.so.*
|
||||||
%ifarch %ix86
|
%ifarch %ix86
|
||||||
%{_libqt5_libdir}/sse2/libQt5Q*.so.*
|
%{_libqt5_libdir}/sse2/libQt5Q*.so.*
|
||||||
@ -208,29 +195,29 @@ popd
|
|||||||
%{_libqt5_archdatadir}/qml/QtQuick
|
%{_libqt5_archdatadir}/qml/QtQuick
|
||||||
%{_libqt5_archdatadir}/qml/QtQuick.2
|
%{_libqt5_archdatadir}/qml/QtQuick.2
|
||||||
%{_libqt5_archdatadir}/qml/QtQml/Models.2
|
%{_libqt5_archdatadir}/qml/QtQml/Models.2
|
||||||
|
%{_libqt5_archdatadir}/qml/QtQml/StateMachine/
|
||||||
%dir %{_libqt5_archdatadir}/qml
|
%dir %{_libqt5_archdatadir}/qml
|
||||||
%dir %{_libqt5_archdatadir}/qml/Qt
|
%dir %{_libqt5_archdatadir}/qml/Qt
|
||||||
%dir %{_libqt5_archdatadir}/qml/Qt/labs
|
%dir %{_libqt5_archdatadir}/qml/Qt/labs
|
||||||
%dir %{_libqt5_archdatadir}/qml/QtQml
|
%dir %{_libqt5_archdatadir}/qml/QtQml
|
||||||
%{_libqt5_archdatadir}/qml/Qt/labs/folderlistmodel
|
%{_libqt5_archdatadir}/qml/Qt/labs/folderlistmodel
|
||||||
%{_libqt5_archdatadir}/qml/Qt/labs/settings/
|
%{_libqt5_archdatadir}/qml/Qt/labs/settings/
|
||||||
%{_libqt5_plugindir}/accessible
|
|
||||||
%{_libqt5_plugindir}/qmltooling
|
%{_libqt5_plugindir}/qmltooling
|
||||||
|
|
||||||
%files private-headers-devel
|
%files private-headers-devel
|
||||||
%defattr(-,root,root,755)
|
%defattr(-,root,root,755)
|
||||||
%doc LGPL_EXCEPTION.txt LICENSE.FDL LICENSE.GPL LICENSE.LGPL
|
%doc LGPL_EXCEPTION.txt LICENSE.*
|
||||||
%{_libqt5_includedir}/Qt*/%{so_version}
|
%{_libqt5_includedir}/Qt*/%{so_version}
|
||||||
|
|
||||||
%files tools
|
%files tools
|
||||||
%defattr(-,root,root,755)
|
%defattr(-,root,root,755)
|
||||||
%doc LGPL_EXCEPTION.txt LICENSE.FDL LICENSE.GPL LICENSE.LGPL
|
%doc LGPL_EXCEPTION.txt LICENSE.*
|
||||||
%{_bindir}/*
|
%{_bindir}/*
|
||||||
%{_libqt5_bindir}/*
|
%{_libqt5_bindir}/*
|
||||||
|
|
||||||
%files devel
|
%files devel
|
||||||
%defattr(-,root,root,755)
|
%defattr(-,root,root,755)
|
||||||
%doc LGPL_EXCEPTION.txt LICENSE.FDL LICENSE.GPL LICENSE.LGPL
|
%doc LGPL_EXCEPTION.txt LICENSE.*
|
||||||
%exclude %{_libqt5_includedir}/Qt*/%{so_version}
|
%exclude %{_libqt5_includedir}/Qt*/%{so_version}
|
||||||
%{_libqt5_includedir}/Qt*
|
%{_libqt5_includedir}/Qt*
|
||||||
%{_libqt5_libdir}/cmake/Qt5*
|
%{_libqt5_libdir}/cmake/Qt5*
|
||||||
@ -244,7 +231,7 @@ popd
|
|||||||
|
|
||||||
%files examples
|
%files examples
|
||||||
%defattr(-,root,root,755)
|
%defattr(-,root,root,755)
|
||||||
%doc LGPL_EXCEPTION.txt LICENSE.FDL LICENSE.GPL LICENSE.LGPL
|
%doc LGPL_EXCEPTION.txt LICENSE.*
|
||||||
%{_libqt5_examplesdir}/
|
%{_libqt5_examplesdir}/
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:04108193b9642c0394c157e98b5c1d81f555f9f495289e07ebfb6f03448b2382
|
|
||||||
size 18171760
|
|
3
qtdeclarative-opensource-src-5.4.0.tar.xz
Normal file
3
qtdeclarative-opensource-src-5.4.0.tar.xz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:e67c9275b0f6869a7c1e8023ad7c0a23fb19f8a8d2f350371e954ead0cfad7b6
|
||||||
|
size 18401844
|
@ -1,26 +1,13 @@
|
|||||||
diff --git a/src/qml/jsruntime/jsruntime.pri b/src/qml/jsruntime/jsruntime.pri
|
|
||||||
index 72010d3..2bd5acb 100644
|
|
||||||
--- a/src/qml/jsruntime/jsruntime.pri
|
|
||||||
+++ b/src/qml/jsruntime/jsruntime.pri
|
|
||||||
@@ -107,7 +107,7 @@ SOURCES += \
|
|
||||||
|
|
||||||
# Use SSE2 floating point math on 32 bit instead of the default
|
|
||||||
# 387 to make test results pass on 32 and on 64 bit builds.
|
|
||||||
-linux-g++*:isEqual(QT_ARCH,i386) {
|
|
||||||
+linux-g++*:isEqual(QT_ARCH,i386):!no_sse2 {
|
|
||||||
QMAKE_CFLAGS += -march=pentium4 -msse2 -mfpmath=sse
|
|
||||||
QMAKE_CXXFLAGS += -march=pentium4 -msse2 -mfpmath=sse
|
|
||||||
}
|
|
||||||
diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h
|
diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h
|
||||||
index a00231c..2a8f5d3 100644
|
index a00231c..2a8f5d3 100644
|
||||||
--- a/src/qml/jsruntime/qv4global_p.h
|
--- a/src/qml/jsruntime/qv4global_p.h
|
||||||
+++ b/src/qml/jsruntime/qv4global_p.h
|
+++ b/src/qml/jsruntime/qv4global_p.h
|
||||||
@@ -75,7 +75,7 @@ inline double trunc(double d) { return d > 0 ? floor(d) : ceil(d); }
|
@@ -85,7 +85,7 @@ inline double trunc(double d) { return d
|
||||||
|
|
||||||
// White list architectures
|
// Black list some platforms
|
||||||
|
#if defined(V4_ENABLE_JIT)
|
||||||
-#if defined(Q_PROCESSOR_X86)
|
-#if defined(Q_OS_IOS) || defined(Q_OS_WINRT)
|
||||||
+#if defined(Q_PROCESSOR_X86) && defined(__SSE2__)
|
+#if defined(Q_OS_IOS) || defined(Q_OS_WINRT) || (defined(Q_PROCESSOR_X86) && !defined(__SSE2__))
|
||||||
#define V4_ENABLE_JIT
|
# undef V4_ENABLE_JIT
|
||||||
#elif defined(Q_PROCESSOR_X86_64)
|
#endif
|
||||||
#define V4_ENABLE_JIT
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user