From 3d7497608ba8dd0b82d69944f484febdad7dc507 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 13 Apr 2016 15:27:33 +0300 Subject: Issue #26718: super.__init__ no longer leaks memory if called multiple times. NOTE: A direct call of super.__init__ is not endorsed! --- Lib/test/test_super.py | 9 +++++++++ Misc/NEWS | 3 +++ Objects/typeobject.c | 6 +++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py index dc3a15f..b84863f 100644 --- a/Lib/test/test_super.py +++ b/Lib/test/test_super.py @@ -171,6 +171,15 @@ class TestSuper(unittest.TestCase): c = f().__closure__[0] self.assertRaises(TypeError, X.meth, c) + def test_super_init_leaks(self): + # Issue #26718: super.__init__ leaked memory if called multiple times. + # This will be caught by regrtest.py -R if this leak. + # NOTE: Despite the use in the test a direct call of super.__init__ + # is not endorsed. + sp = super(float, 1.0) + for i in range(1000): + super.__init__(sp, int, i) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS index d1227f5..37dc453 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: tba Core and Builtins ----------------- +- Issue #26718: super.__init__ no longer leaks memory if called multiple times. + NOTE: A direct call of super.__init__ is not endorsed! + - Issue #25339: PYTHONIOENCODING now has priority over locale in setting the error handler for stdin and stdout. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index f88a5fb..3a09af5 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -7336,9 +7336,9 @@ super_init(PyObject *self, PyObject *args, PyObject *kwds) Py_INCREF(obj); } Py_INCREF(type); - su->type = type; - su->obj = obj; - su->obj_type = obj_type; + Py_XSETREF(su->type, type); + Py_XSETREF(su->obj, obj); + Py_XSETREF(su->obj_type, obj_type); return 0; } -- cgit v0.12