Kaydet (Commit) b7f17e4b authored tarafından Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

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?
üst 519a042c
...@@ -1509,9 +1509,6 @@ _Py_ReadyTypes(void) ...@@ -1509,9 +1509,6 @@ _Py_ReadyTypes(void)
if (PyType_Ready(&PyStdPrinter_Type) < 0) if (PyType_Ready(&PyStdPrinter_Type) < 0)
Py_FatalError("Can't initialize StdPrinter"); Py_FatalError("Can't initialize StdPrinter");
if (PyType_Ready(&PyRange_Type) < 0)
Py_FatalError("Can't initialize 'range'");
} }
......
...@@ -107,7 +107,7 @@ range_dealloc(rangeobject *r) ...@@ -107,7 +107,7 @@ range_dealloc(rangeobject *r)
Py_DECREF(r->start); Py_DECREF(r->start);
Py_DECREF(r->stop); Py_DECREF(r->stop);
Py_DECREF(r->step); 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 /* Return number of items in range (lo, hi, step), when arguments are
...@@ -482,6 +482,7 @@ longrangeiter_dealloc(longrangeiterobject *r) ...@@ -482,6 +482,7 @@ longrangeiter_dealloc(longrangeiterobject *r)
Py_XDECREF(r->start); Py_XDECREF(r->start);
Py_XDECREF(r->step); Py_XDECREF(r->step);
Py_XDECREF(r->len); Py_XDECREF(r->len);
PyObject_Del(r);
} }
static PyObject * static PyObject *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment