Add protection against "wrong" marking in debug builds
authorSimon Hausmann <simon.hausmann@theqtcompany.com>
Fri, 8 May 2015 10:34:53 +0000 (12:34 +0200)
committerSimon Hausmann <simon.hausmann@theqtcompany.com>
Fri, 8 May 2015 14:55:32 +0000 (14:55 +0000)
To protect against situations where we accidentally mark an object that belongs
to a different engine - there are many possible entry points - this patch adds
an assertion in debug builds for this situation. When it happens, it will point
more or less directly to the code that tries to push an object to the wrong JS
stack for marking. This helped in the investigation of QTBUG-44895

Change-Id: I311b9ff6d282d52e725044b03a62cd77085536be
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/jsruntime/qv4engine.cpp
src/qml/jsruntime/qv4engine_p.h

index a247f85761a9a78f0f9e902d7e78bfb7f73ab7b2..92993259ec332fbdc7ca139b1744a49c15eb2a02 100644 (file)
@@ -1623,6 +1623,15 @@ QV4::ReturnedValue ExecutionEngine::metaTypeToJS(int type, const void *data)
     return 0;
 }
 
+#ifndef QT_NO_DEBUG
+void ExecutionEngine::assertObjectBelongsToEngine(const Value &v)
+{
+    if (!v.isObject())
+        return;
+    Q_ASSERT(v.objectValue()->engine() == this);
+}
+#endif
+
 // Converts a JS value to a meta-type.
 // data must point to a place that can store a value of the given type.
 // Returns true if conversion succeeded, false otherwise.
index f01579be712bb23082ee01ff45a158ce2d0f6369..277cbdf1f55b0150aa1068730259a9a904e384f1 100644 (file)
@@ -340,6 +340,10 @@ public:
     bool metaTypeFromJS(const Value &value, int type, void *data);
     QV4::ReturnedValue metaTypeToJS(int type, const void *data);
 
+#ifndef QT_NO_DEBUG
+    void assertObjectBelongsToEngine(const Value &v);
+#endif
+
 private:
     QmlExtensions *m_qmlExtensions;
 };
@@ -381,6 +385,9 @@ void Managed::mark(QV4::ExecutionEngine *engine)
     Q_ASSERT(inUse());
     if (markBit())
         return;
+#ifndef QT_NO_DEBUG
+    engine->assertObjectBelongsToEngine(*this);
+#endif
     d()->setMarkBit();
     engine->pushForGC(d());
 }