Mercurial > cpython-lru_cache-weakref
diff Objects/floatobject.c @ 10432:1cc5d20d2ed8 legacy-trunk
Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
a block cannot be freed, add its free items back to the free list.
This is necessary to avoid leaking when Python is reinitialized later.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 19 Mar 1999 20:59:40 +0000 |
| parents | 7b810aa35b5c |
| children | 135c1ec9636c |
line wrap: on
line diff
--- a/Objects/floatobject.c Fri Mar 19 20:30:39 1999 +0000 +++ b/Objects/floatobject.c Fri Mar 19 20:59:40 1999 +0000 @@ -631,11 +631,13 @@ fsum = 0; list = block_list; block_list = NULL; + free_list = NULL; while (list != NULL) { - p = &list->objects[0]; bc++; frem = 0; - for (i = 0; i < N_FLOATOBJECTS; i++, p++) { + for (i = 0, p = &list->objects[0]; + i < N_FLOATOBJECTS; + i++, p++) { if (PyFloat_Check(p) && p->ob_refcnt != 0) frem++; } @@ -643,6 +645,15 @@ if (frem) { list->next = block_list; block_list = list; + for (i = 0, p = &list->objects[0]; + i < N_FLOATOBJECTS; + i++, p++) { + if (!PyFloat_Check(p) || p->ob_refcnt == 0) { + p->ob_type = (struct _typeobject *) + free_list; + free_list = p; + } + } } else { PyMem_FREE(list); @@ -666,13 +677,14 @@ if (Py_VerboseFlag > 1) { list = block_list; while (list != NULL) { - p = &list->objects[0]; - for (i = 0; i < N_FLOATOBJECTS; i++, p++) { + for (i = 0, p = &list->objects[0]; + i < N_FLOATOBJECTS; + i++, p++) { if (PyFloat_Check(p) && p->ob_refcnt != 0) { char buf[100]; PyFloat_AsString(buf, p); fprintf(stderr, - "# <float object at %lx, refcnt=%d, val=%s>\n", + "# <float at %lx, refcnt=%d, val=%s>\n", p, p->ob_refcnt, buf); } }
