From: Amaury Forgeot d'Arc Date: Thu, 15 Nov 2007 20:52:21 +0000 (+0000) Subject: Found another memory leak in longrangeiter. And redo the previous correction X-Git-Tag: v3.0a2~179 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b7f17e4bb4627a0a8bd9a4fe20e9f4e26e9a4d28;p=thirdparty%2FPython%2Fcpython.git Found another memory leak in longrangeiter. And redo the previous correction without calling PyType_Ready(). Question 1: Should the interpreter register all types with PyType_Ready()? Many types seem to avoid it. Question 2: To reproduce the problem, run the following code: def f(): while True: for a in iter(range(0,1,10**20)): pass f() And watch the memory used by the process. How do we test this in a unittest? --- diff --git a/Objects/object.c b/Objects/object.c index fa5eb4d11ba9..df93a192d607 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1509,9 +1509,6 @@ _Py_ReadyTypes(void) if (PyType_Ready(&PyStdPrinter_Type) < 0) Py_FatalError("Can't initialize StdPrinter"); - - if (PyType_Ready(&PyRange_Type) < 0) - Py_FatalError("Can't initialize 'range'"); } diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index e159febdac1f..0bb3e7b0ae5f 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -107,7 +107,7 @@ range_dealloc(rangeobject *r) Py_DECREF(r->start); Py_DECREF(r->stop); Py_DECREF(r->step); - Py_Type(r)->tp_free(r); + PyObject_Del(r); } /* Return number of items in range (lo, hi, step), when arguments are @@ -482,6 +482,7 @@ longrangeiter_dealloc(longrangeiterobject *r) Py_XDECREF(r->start); Py_XDECREF(r->step); Py_XDECREF(r->len); + PyObject_Del(r); } static PyObject *