From b7f17e4bb4627a0a8bd9a4fe20e9f4e26e9a4d28 Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Thu, 15 Nov 2007 20:52:21 +0000 Subject: 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? --- Objects/object.c | 3 --- Objects/rangeobject.c | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index fa5eb4d..df93a19 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 e159feb..0bb3e7b 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 * -- cgit v0.12