Strengthen reference to var properties during construction
authorAlan Alpert <aalpert@rim.com>
Fri, 25 Jan 2013 01:31:41 +0000 (17:31 -0800)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 29 Jan 2013 18:18:04 +0000 (19:18 +0100)
Normally var properties are kept alive by a reference to the object they
are declared on, but during the construction of that object the GC may
not be aware of said object. This change uses a strong reference during
GC passes which take place while the object is being constructed.

Task-number: QTBUG-29138
Change-Id: Ieecfcc7567aefac0d67cb933728daf16ed3eed0a
Reviewed-by: Christopher Adams <chris.adams@jollamobile.com>

src/qml/qml/v8/qv8engine.cpp

index 3fe3d28..2619c1a 100644 (file)
@@ -813,6 +813,12 @@ QDateTime QV8Engine::qtDateTimeFromJsDate(double jsDate)
 
 v8::Persistent<v8::Object> *QV8Engine::findOwnerAndStrength(QObject *object, bool *shouldBeStrong)
 {
+    QQmlData *data = QQmlData::get(object);
+    if (data && data->rootObjectInCreation) { // When the object is still being created it may not show up to the GC.
+        *shouldBeStrong = true;
+        return 0;
+    }
+
     QObject *parent = object->parent();
     if (!parent) {
         // if the object has JS ownership, the object's v8object owns the lifetime of the persistent value.