aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-08-06 11:57:42 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-06 12:04:59 +0200
commitf3cbd0b8aa96abfc4b3660df4426ed10b11b18e0 (patch)
treeea79b396d577016b12bcb096ce50d323caa03e9e /tests
parent347496843db38f8f63aa4037d2f8e17a5eff6e15 (diff)
Fix some GC related tests to work with MSVC
Using alloca instead of memset we can convince even MSVC to allocate memory on the stack, to overwrite any previous dead V4 pointers. Change-Id: Ic01bebfc6368e9c3ce1f6155a0f0ea206b90764c Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp18
-rw-r--r--tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp28
2 files changed, 37 insertions, 9 deletions
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index ca3fa8bca4..1f43d21c51 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -49,16 +49,28 @@
#include <QtCore/qnumeric.h>
#include <stdlib.h>
+#ifdef Q_CC_MSVC
+#define NO_INLINE __declspec(noinline)
+#else
+#define NO_INLINE __attribute__((noinline))
+#endif
+
+#if defined(Q_OS_WIN)
+#include <malloc.h>
+#else
+#include <alloca.h>
+#endif
+
Q_DECLARE_METATYPE(QList<int>)
Q_DECLARE_METATYPE(QObjectList)
// The JavaScriptCore GC marks the C stack. To try to ensure that there is
// no JSObject* left in stack memory by the compiler, we call this function
// to zap some bytes of memory before calling collectGarbage().
-static void zapSomeStack()
+static void NO_INLINE zapSomeStack()
{
- char buf[4096];
- memset(buf, 0, sizeof(buf));
+ char *buf = (char*)alloca(4096);
+ memset(buf, 0, 4096);
}
static void collectGarbage_helper(QJSEngine &eng)
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index 3574b58ba4..321aa47297 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -56,6 +56,18 @@
#include <private/qv4functionobject_p.h>
#include <private/qv4exception_p.h>
+#ifdef Q_CC_MSVC
+#define NO_INLINE __declspec(noinline)
+#else
+#define NO_INLINE __attribute__((noinline))
+#endif
+
+#if defined(Q_OS_WIN)
+#include <malloc.h>
+#else
+#include <alloca.h>
+#endif
+
/*
This test covers evaluation of ECMAScript expressions and bindings from within
QML. This does not include static QML language issues.
@@ -298,8 +310,18 @@ private:
QQmlEngine engine;
};
+// The JavaScriptCore GC marks the C stack. To try to ensure that there is
+// no JSObject* left in stack memory by the compiler, we call this function
+// to zap some bytes of memory before calling collectGarbage().
+static void NO_INLINE zapSomeStack()
+{
+ char *buf = (char*)alloca(4096);
+ memset(buf, 0, 4096);
+}
+
static void gc(QQmlEngine &engine)
{
+ zapSomeStack();
engine.collectGarbage();
QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
QCoreApplication::processEvents();
@@ -4880,9 +4902,6 @@ void tst_qqmlecmascript::propertyVarCircular2()
QCOMPARE(childObject->property("textCanary").toInt(), 10);
QMetaObject::invokeMethod(object, "deassignCircular");
gc(engine);
-#if defined(Q_CC_MSVC)
- QSKIP("This test does not work reliably with MSVC.");
-#endif
QVERIFY(rootObjectTracker.isNull()); // should have been collected
QVERIFY(childObjectTracker.isNull()); // should have been collected
delete object;
@@ -4976,9 +4995,6 @@ void tst_qqmlecmascript::propertyVarInheritance2()
QMetaObject::invokeMethod(object, "deassignCircular");
gc(engine);
// an equivalent for pragma GCC optimize is still work-in-progress for CLang, so this test will fail.
-#if defined(Q_CC_MSVC)
- QSKIP("This test does not work reliably with MSVC.");
-#endif
#if !defined(Q_CC_CLANG)
QVERIFY(childObjectVarArrayValueHandle.isEmpty()); // should have been collected now.
#endif