Source

Target

Commits (4)
Showing with 53 additions and 11 deletions
......@@ -3032,6 +3032,13 @@ public:
linuxPageFlush(current, current + page);
linuxPageFlush(current, end);
#elif OS(QNX)
#if !ENABLE(ASSEMBLER_WX_EXCLUSIVE)
msync(code, size, MS_INVALIDATE_ICACHE);
#else
UNUSED_PARAM(code);
UNUSED_PARAM(size);
#endif
#else
#error "The cacheFlush support is missing on this platform."
#endif
......
......@@ -147,11 +147,6 @@ inline long lroundf(float num) { return static_cast<long>(roundf(num)); }
#endif
#if COMPILER(GCC) && OS(QNX) && _CPPLIB_VER < 640
// The stdlib on QNX < 6.6 doesn't contain long abs(long). See PR #104666.
inline long long abs(long num) { return labs(num); }
#endif
#if COMPILER(MSVC) && COMPILER(MSVC12_OR_LOWER)
// MSVC's math.h does not currently supply log2 or log2f.
inline double log2(double num)
......
......@@ -95,7 +95,7 @@ inline double trunc(double d) { return d > 0 ? floor(d) : ceil(d); }
&& (defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_QNX) || defined(Q_OS_FREEBSD))
# define V4_ENABLE_JIT
#elif defined(Q_PROCESSOR_X86_64) && (QT_POINTER_SIZE == 8) \
&& (defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_FREEBSD))
&& (defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_QNX) || defined(Q_OS_MAC) || defined(Q_OS_FREEBSD))
# define V4_ENABLE_JIT
#elif defined(Q_PROCESSOR_ARM_32) && (QT_POINTER_SIZE == 4)
# if defined(thumb2) || defined(__thumb2__) || ((defined(__thumb) || defined(__thumb__)) && __TARGET_ARCH_THUMB-0 == 4)
......@@ -104,7 +104,7 @@ inline double trunc(double d) { return d > 0 ? floor(d) : ceil(d); }
# define V4_ENABLE_JIT
# endif
#elif defined(Q_PROCESSOR_ARM_64) && (QT_POINTER_SIZE == 8)
# if defined(Q_OS_LINUX)
# if defined(Q_OS_LINUX) || defined(Q_OS_QNX)
# define V4_ENABLE_JIT
# endif
#elif defined(Q_PROCESSOR_MIPS_32) && defined(Q_OS_LINUX)
......
......@@ -651,6 +651,10 @@ void QObjectWrapper::put(Managed *m, String *name, const Value &value)
PropertyAttributes QObjectWrapper::query(const Managed *m, String *name)
{
const QObjectWrapper *that = static_cast<const QObjectWrapper*>(m);
const QObject *thatObject = that->d()->object();
if (QQmlData::wasDeleted(thatObject))
return QV4::Object::query(m, name);
ExecutionEngine *engine = that->engine();
QQmlContextData *qmlContext = engine->callingQmlContext();
QQmlPropertyData local;
......
......@@ -259,7 +259,7 @@ public:
bool hasExtendedData() const { return extendedData != 0; }
QHash<int, QObject *> *attachedProperties() const;
static inline bool wasDeleted(QObject *);
static inline bool wasDeleted(const QObject *);
static void markAsDeleted(QObject *);
static void setQueuedForDeletion(QObject *);
......@@ -296,16 +296,16 @@ private:
}
};
bool QQmlData::wasDeleted(QObject *object)
bool QQmlData::wasDeleted(const QObject *object)
{
if (!object)
return true;
QObjectPrivate *priv = QObjectPrivate::get(object);
const QObjectPrivate *priv = QObjectPrivate::get(object);
if (!priv || priv->wasDeleted)
return true;
QQmlData *ddata = QQmlData::get(object);
const QQmlData *ddata = QQmlData::get(object);
return ddata && ddata->isQueuedForDeletion;
}
......
import QtQuick 2.0
Item {
id: root
Component.onCompleted: {
var createdObject = objectCreator.create()
createdObject.del()
// Shouldn't crash.
var test = "index" in createdObject
}
}
......@@ -269,6 +269,8 @@ private slots:
void concurrentLoadQmlDir();
void accessDeletedObject();
private:
QQmlEngine engine;
QStringList defaultImportPathList;
......@@ -4571,6 +4573,28 @@ void tst_qqmllanguage::concurrentLoadQmlDir()
engine.setImportPathList(defaultImportPathList);
}
// Test that deleting an object and then accessing it doesn't crash.
// QTBUG-44153
class ObjectCreator : public QObject
{
Q_OBJECT
public slots:
QObject *create() { return (new ObjectCreator); }
void del() { delete this; }
};
void tst_qqmllanguage::accessDeletedObject()
{
QQmlEngine engine;
engine.rootContext()->setContextProperty("objectCreator", new ObjectCreator);
QQmlComponent component(&engine, testFileUrl("accessDeletedObject.qml"));
VERIFY_ERRORS(0);
QScopedPointer<QObject> o(component.create());
QVERIFY(!o.isNull());
}
QTEST_MAIN(tst_qqmllanguage)
#include "tst_qqmllanguage.moc"