Fixes bug #910 - installEventFilter() increments reference count on target object.

http://bugs.pyside.org/show_bug.cgi?id=910

Also added/fixed unit tests.

Reviewed by Hugo Parente <hugo.lima@openbossa.org>
Reviewed by Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
Marcelo Lira 2011-07-19 15:58:20 -03:00
commit 2e98f87d20
3 changed files with 39 additions and 13 deletions

View file

@ -1284,16 +1284,6 @@
<define-ownership owner="c++"/> <define-ownership owner="c++"/>
</modify-argument> </modify-argument>
</modify-function> </modify-function>
<modify-function signature="installEventFilter(QObject*)">
<inject-code>
Shiboken::Object::keepReference((SbkObject*)%PYARG_1, "eventFilter", %PYSELF, true);
</inject-code>
</modify-function>
<modify-function signature="removeEventFilter(QObject*)">
<inject-code>
Shiboken::Object::removeReference((SbkObject*)%PYARG_1, "eventFilter", %PYSELF);
</inject-code>
</modify-function>
<!-- Invalidate-after-use stuff --> <!-- Invalidate-after-use stuff -->
<modify-function signature="childEvent(QChildEvent*)"> <modify-function signature="childEvent(QChildEvent*)">
<modify-argument index="1" invalidate-after-use="yes"/> <modify-argument index="1" invalidate-after-use="yes"/>

View file

@ -2,6 +2,8 @@
'''Test cases for QObject.eventFilter''' '''Test cases for QObject.eventFilter'''
import unittest import unittest
import weakref
import sys
from PySide.QtCore import QObject, QTimerEvent from PySide.QtCore import QObject, QTimerEvent
@ -76,5 +78,39 @@ class TestQObjectEventFilterPython(UsesQCoreApplication):
self.assertEqual(filtered.times_called, 5) self.assertEqual(filtered.times_called, 5)
self.assertEqual(self.obj_filter.events_handled, 5) self.assertEqual(self.obj_filter.events_handled, 5)
def testInstallEventFilterRefCountAfterDelete(self):
'''Bug 910 - installEventFilter() increments reference count on target object
http://bugs.pyside.org/show_bug.cgi?id=910'''
obj = QObject()
filt = QObject()
self.assertEqual(sys.getrefcount(obj), 2)
self.assertEqual(sys.getrefcount(filt), 2)
obj.installEventFilter(filt)
self.assertEqual(sys.getrefcount(obj), 2)
self.assertEqual(sys.getrefcount(filt), 2)
wref = weakref.ref(obj)
del obj
self.assertEqual(wref(), None)
def testInstallEventFilterRefCountAfterRemove(self):
# Bug 910
obj = QObject()
filt = QObject()
self.assertEqual(sys.getrefcount(obj), 2)
self.assertEqual(sys.getrefcount(filt), 2)
obj.installEventFilter(filt)
self.assertEqual(sys.getrefcount(obj), 2)
self.assertEqual(sys.getrefcount(filt), 2)
obj.removeEventFilter(filt)
self.assertEqual(sys.getrefcount(obj), 2)
self.assertEqual(sys.getrefcount(filt), 2)
wref = weakref.ref(obj)
del obj
self.assertEqual(wref(), None)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -2,7 +2,7 @@ import unittest
import sys import sys
from helper import UsesQApplication from helper import UsesQApplication
from PySide.QtCore import QObject, QEvent, QTimer from PySide.QtCore import QObject, QEvent
from PySide.QtGui import QWidget from PySide.QtGui import QWidget
class MyFilter(QObject): class MyFilter(QObject):
@ -17,10 +17,10 @@ class EventFilter(UsesQApplication):
o = QObject() o = QObject()
filt = MyFilter() filt = MyFilter()
o.installEventFilter(filt) o.installEventFilter(filt)
self.assertEqual(sys.getrefcount(o), 3) self.assertEqual(sys.getrefcount(o), 2)
o.installEventFilter(filt) o.installEventFilter(filt)
self.assertEqual(sys.getrefcount(o), 3) self.assertEqual(sys.getrefcount(o), 2)
o.removeEventFilter(filt) o.removeEventFilter(filt)
self.assertEqual(sys.getrefcount(o), 2) self.assertEqual(sys.getrefcount(o), 2)