Issue #28653: Fix a refleak in functools.lru_cache.
This commit is contained in:
parent
28f42fd4f8
commit
46a02db90b
|
@ -1162,6 +1162,25 @@ class TestLRU:
|
||||||
self.assertEqual(misses, 4)
|
self.assertEqual(misses, 4)
|
||||||
self.assertEqual(currsize, 2)
|
self.assertEqual(currsize, 2)
|
||||||
|
|
||||||
|
def test_lru_type_error(self):
|
||||||
|
# Regression test for issue #28653.
|
||||||
|
# lru_cache was leaking when one of the arguments
|
||||||
|
# wasn't cacheable.
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=None)
|
||||||
|
def infinite_cache(o):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=10)
|
||||||
|
def limited_cache(o):
|
||||||
|
pass
|
||||||
|
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
infinite_cache([])
|
||||||
|
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
limited_cache([])
|
||||||
|
|
||||||
def test_lru_with_maxsize_none(self):
|
def test_lru_with_maxsize_none(self):
|
||||||
@self.module.lru_cache(maxsize=None)
|
@self.module.lru_cache(maxsize=None)
|
||||||
def fib(n):
|
def fib(n):
|
||||||
|
|
|
@ -457,6 +457,8 @@ Library
|
||||||
|
|
||||||
- Issue #28652: Make loop methods reject socket kinds they do not support.
|
- Issue #28652: Make loop methods reject socket kinds they do not support.
|
||||||
|
|
||||||
|
- Issue #28653: Fix a refleak in functools.lru_cache.
|
||||||
|
|
||||||
IDLE
|
IDLE
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
|
@ -781,8 +781,10 @@ infinite_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwd
|
||||||
if (!key)
|
if (!key)
|
||||||
return NULL;
|
return NULL;
|
||||||
hash = PyObject_Hash(key);
|
hash = PyObject_Hash(key);
|
||||||
if (hash == -1)
|
if (hash == -1) {
|
||||||
|
Py_DECREF(key);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
result = _PyDict_GetItem_KnownHash(self->cache, key, hash);
|
result = _PyDict_GetItem_KnownHash(self->cache, key, hash);
|
||||||
if (result) {
|
if (result) {
|
||||||
Py_INCREF(result);
|
Py_INCREF(result);
|
||||||
|
@ -837,8 +839,10 @@ bounded_lru_cache_wrapper(lru_cache_object *self, PyObject *args, PyObject *kwds
|
||||||
if (!key)
|
if (!key)
|
||||||
return NULL;
|
return NULL;
|
||||||
hash = PyObject_Hash(key);
|
hash = PyObject_Hash(key);
|
||||||
if (hash == -1)
|
if (hash == -1) {
|
||||||
|
Py_DECREF(key);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
link = (lru_list_elem *)_PyDict_GetItem_KnownHash(self->cache, key, hash);
|
link = (lru_list_elem *)_PyDict_GetItem_KnownHash(self->cache, key, hash);
|
||||||
if (link) {
|
if (link) {
|
||||||
lru_cache_extricate_link(link);
|
lru_cache_extricate_link(link);
|
||||||
|
|
Loading…
Reference in New Issue