diff --git a/src/pyclasses/cache.rs b/src/pyclasses/cache.rs index cf58c5d..131d364 100644 --- a/src/pyclasses/cache.rs +++ b/src/pyclasses/cache.rs @@ -292,7 +292,7 @@ impl PyCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -347,7 +347,7 @@ impl PyCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; diff --git a/src/pyclasses/fifocache.rs b/src/pyclasses/fifocache.rs index 05a26f4..da3a015 100644 --- a/src/pyclasses/fifocache.rs +++ b/src/pyclasses/fifocache.rs @@ -297,7 +297,7 @@ impl PyFIFOCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -352,7 +352,7 @@ impl PyFIFOCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; diff --git a/src/pyclasses/lfucache.rs b/src/pyclasses/lfucache.rs index 0030466..879ff69 100644 --- a/src/pyclasses/lfucache.rs +++ b/src/pyclasses/lfucache.rs @@ -315,7 +315,7 @@ impl PyLFUCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -370,7 +370,7 @@ impl PyLFUCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; @@ -717,7 +717,7 @@ impl PyLFUCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } diff --git a/src/pyclasses/lrucache.rs b/src/pyclasses/lrucache.rs index b4e534d..08541b0 100644 --- a/src/pyclasses/lrucache.rs +++ b/src/pyclasses/lrucache.rs @@ -324,7 +324,7 @@ impl PyLRUCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -379,7 +379,7 @@ impl PyLRUCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; @@ -704,7 +704,7 @@ impl PyLRUCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } diff --git a/src/pyclasses/rrcache.rs b/src/pyclasses/rrcache.rs index 749a662..b433dd5 100644 --- a/src/pyclasses/rrcache.rs +++ b/src/pyclasses/rrcache.rs @@ -295,7 +295,7 @@ impl PyRRCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -350,7 +350,7 @@ impl PyRRCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; diff --git a/src/pyclasses/ttlcache.rs b/src/pyclasses/ttlcache.rs index ecf68ce..6c1b83f 100644 --- a/src/pyclasses/ttlcache.rs +++ b/src/pyclasses/ttlcache.rs @@ -300,7 +300,7 @@ impl PyTTLCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -355,7 +355,7 @@ impl PyTTLCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; @@ -745,7 +745,7 @@ impl PyTTLCache { utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning Ok(( - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind(), + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind(), 0.0, )) }, diff --git a/src/pyclasses/vttlcache.rs b/src/pyclasses/vttlcache.rs index 95793e2..e96b9f8 100644 --- a/src/pyclasses/vttlcache.rs +++ b/src/pyclasses/vttlcache.rs @@ -283,7 +283,7 @@ impl PyVTTLCache { utils::OptionalArgument::Defined(x) => Ok(x), utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - Ok(pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind()) + Ok(pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind()) }, } } @@ -336,7 +336,7 @@ impl PyVTTLCache { utils::OptionalArgument::Defined(x) => x, utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind() + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind() }, }; @@ -690,7 +690,7 @@ impl PyVTTLCache { utils::OptionalArgument::Undefined => unsafe { // SAFETY: None is immortal, so reference counting has no meaning Ok(( - pyo3::Bound::from_owned_ptr(py, pyo3::ffi::Py_None()).unbind(), + pyo3::Bound::from_borrowed_ptr(py, pyo3::ffi::Py_None()).unbind(), py.None(), )) }, diff --git a/tests/mixins.py b/tests/mixins.py index f9c47a2..f76e867 100644 --- a/tests/mixins.py +++ b/tests/mixins.py @@ -1095,6 +1095,19 @@ def test_concurrent_inserts_with_finalizers(self): done.stderr or f"exit code {done.returncode}" ) + def test_none_refcount(self): + cache = self.create_cache(1000) + + if isinstance(cache, cachebox.Cache): + pytest.skip() + + for i in range(10_000): + cache[i] = None + + for i in range(10_000): + v = cache.get(i) + assert v is None + class SweepIntervalMixin(BaseMixin): def _create_sweep_cache(