Immediatley delete QV8QObjectResource objects to reduce memory leaks
authorThomas McGuire <thomas.mcguire.qnx@kdab.com>
Tue, 14 Aug 2012 12:17:10 +0000 (14:17 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 24 Aug 2012 09:31:33 +0000 (11:31 +0200)
This reduces memory leaks when deleting the v8 engine.
Otherwise, the memory would only be reclaimed during a full GC run,
which might not happen at all.

Change-Id: Iac34bad1f2280adc530d3b3d7a074c5d022005a4
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
src/qml/qml/v8/qv8qobjectwrapper.cpp

index 58a7520..627e453 100644 (file)
@@ -926,12 +926,16 @@ static void FastValueSetterReadOnly(v8::Local<v8::String> property, v8::Local<v8
 void QV8QObjectWrapper::WeakQObjectReferenceCallback(v8::Persistent<v8::Value> handle, void *wrapper)
 {
     Q_ASSERT(handle->IsObject());
-    QV8QObjectResource *resource = v8_resource_check<QV8QObjectResource>(handle->ToObject());
+    v8::Handle<v8::Object> v8object = handle->ToObject();
+    QV8QObjectResource *resource = v8_resource_check<QV8QObjectResource>(v8object);
     Q_ASSERT(resource);
 
     static_cast<QV8QObjectWrapper*>(wrapper)->unregisterWeakQObjectReference(resource);
     if (static_cast<QV8QObjectWrapper*>(wrapper)->deleteWeakQObject(resource, false)) {
-        qPersistentDispose(handle); // dispose.
+        // dispose
+        v8object->SetExternalResource(0);
+        delete resource;
+        qPersistentDispose(handle);
     } else {
         handle.MakeWeak(0, WeakQObjectReferenceCallback); // revive.
     }