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);
`