bpo-32422: Reduce lru_cache memory usage (GH-5008) · python/cpython@3070b71 (original) (raw)

`@@ -677,26 +677,9 @@ typedef struct lru_list_elem {

`

677

677

`static void

`

678

678

`lru_list_elem_dealloc(lru_list_elem *link)

`

679

679

`{

`

680

``

`-

_PyObject_GC_UNTRACK(link);

`

681

680

`Py_XDECREF(link->key);

`

682

681

`Py_XDECREF(link->result);

`

683

``

`-

PyObject_GC_Del(link);

`

684

``

`-

}

`

685

``

-

686

``

`-

static int

`

687

``

`-

lru_list_elem_traverse(lru_list_elem *link, visitproc visit, void *arg)

`

688

``

`-

{

`

689

``

`-

Py_VISIT(link->key);

`

690

``

`-

Py_VISIT(link->result);

`

691

``

`-

return 0;

`

692

``

`-

}

`

693

``

-

694

``

`-

static int

`

695

``

`-

lru_list_elem_clear(lru_list_elem *link)

`

696

``

`-

{

`

697

``

`-

Py_CLEAR(link->key);

`

698

``

`-

Py_CLEAR(link->result);

`

699

``

`-

return 0;

`

``

682

`+

PyObject_Del(link);

`

700

683

`}

`

701

684

``

702

685

`static PyTypeObject lru_list_elem_type = {

`

`@@ -720,10 +703,7 @@ static PyTypeObject lru_list_elem_type = {

`

720

703

`0, /* tp_getattro */

`

721

704

`0, /* tp_setattro */

`

722

705

`0, /* tp_as_buffer */

`

723

``

`-

Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */

`

724

``

`-

0, /* tp_doc */

`

725

``

`-

(traverseproc)lru_list_elem_traverse, /* tp_traverse */

`

726

``

`-

(inquiry)lru_list_elem_clear, /* tp_clear */

`

``

706

`+

Py_TPFLAGS_DEFAULT, /* tp_flags */

`

727

707

`};

`

728

708

``

729

709

``

`@@ -959,8 +939,8 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds

`

959

939

` }

`

960

940

` } else {

`

961

941

`/* Put result in a new link at the front of the queue. */

`

962

``

`-

link = (lru_list_elem *)PyObject_GC_New(lru_list_elem,

`

963

``

`-

&lru_list_elem_type);

`

``

942

`+

link = (lru_list_elem *)PyObject_New(lru_list_elem,

`

``

943

`+

&lru_list_elem_type);

`

964

944

`if (link == NULL) {

`

965

945

`Py_DECREF(key);

`

966

946

`Py_DECREF(result);

`

`@@ -970,7 +950,6 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds

`

970

950

`link->hash = hash;

`

971

951

`link->key = key;

`

972

952

`link->result = result;

`

973

``

`-

_PyObject_GC_TRACK(link);

`

974

953

`if (_PyDict_SetItem_KnownHash(self->cache, key, (PyObject *)link,

`

975

954

`hash) < 0) {

`

976

955

`Py_DECREF(link);

`

`@@ -1151,7 +1130,8 @@ lru_cache_tp_traverse(lru_cache_object *self, visitproc visit, void *arg)

`

1151

1130

`lru_list_elem *link = self->root.next;

`

1152

1131

`while (link != &self->root) {

`

1153

1132

`lru_list_elem *next = link->next;

`

1154

``

`-

Py_VISIT(link);

`

``

1133

`+

Py_VISIT(link->key);

`

``

1134

`+

Py_VISIT(link->result);

`

1155

1135

`link = next;

`

1156

1136

` }

`

1157

1137

`Py_VISIT(self->maxsize_O);

`