]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
authorGuido van Rossum <guido@python.org>
Fri, 19 Mar 1999 20:30:39 +0000 (20:30 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 19 Mar 1999 20:30:39 +0000 (20:30 +0000)
a block cannot be freed, add its free items back to the free list, and
add its valid ints back to the small_ints array if they are in range.
This is necessary to avoid leaking when Python is reinitialized later.

Objects/intobject.c

index 0bf1fc545403af30baeb80130ede3fe14a2ced9b..7293515e6c30981b0ee22ded5a54e04e59117bcf 100644 (file)
@@ -831,11 +831,13 @@ PyInt_Fini()
        isum = 0;
        list = block_list;
        block_list = NULL;
+       free_list = NULL;
        while (list != NULL) {
-               p = &list->objects[0];
                bc++;
                irem = 0;
-               for (i = 0; i < N_INTOBJECTS; i++, p++) {
+               for (i = 0, p = &list->objects[0];
+                    i < N_INTOBJECTS;
+                    i++, p++) {
                        if (PyInt_Check(p) && p->ob_refcnt != 0)
                                irem++;
                }
@@ -843,6 +845,25 @@ PyInt_Fini()
                if (irem) {
                        list->next = block_list;
                        block_list = list;
+                       for (i = 0, p = &list->objects[0];
+                            i < N_INTOBJECTS;
+                            i++, p++) {
+                               if (!PyInt_Check(p) || p->ob_refcnt == 0) {
+                                       p->ob_type = (struct _typeobject *)
+                                               free_list;
+                                       free_list = p;
+                               }
+#if NSMALLNEGINTS + NSMALLPOSINTS > 0
+                               else if (-NSMALLNEGINTS <= p->ob_ival &&
+                                        p->ob_ival < NSMALLPOSINTS &&
+                                        small_ints[p->ob_ival +
+                                                   NSMALLNEGINTS] == NULL) {
+                                       Py_INCREF(p);
+                                       small_ints[p->ob_ival +
+                                                  NSMALLNEGINTS] = p;
+                               }
+#endif
+                       }
                }
                else {
                        PyMem_FREE(list);
@@ -866,11 +887,12 @@ PyInt_Fini()
        if (Py_VerboseFlag > 1) {
                list = block_list;
                while (list != NULL) {
-                       p = &list->objects[0];
-                       for (i = 0; i < N_INTOBJECTS; i++, p++) {
+                       for (i = 0, p = &list->objects[0];
+                            i < N_INTOBJECTS;
+                            i++, p++) {
                                if (PyInt_Check(p) && p->ob_refcnt != 0)
                                        fprintf(stderr,
-                               "#   <int object at %lx, refcnt=%d, val=%ld>\n",
+                               "#   <int at %lx, refcnt=%d, val=%ld>\n",
                                                p, p->ob_refcnt, p->ob_ival);
                        }
                        list = list->next;