diff --git a/pyo3-benches/benches/bench_call.rs b/pyo3-benches/benches/bench_call.rs index 50772097961..3347b548603 100644 --- a/pyo3-benches/benches/bench_call.rs +++ b/pyo3-benches/benches/bench_call.rs @@ -13,6 +13,7 @@ fn bench_call_0(b: &mut Bencher<'_>) { let module = test_module!(py, "def foo(): pass"); let foo_module = module.getattr("foo").unwrap(); + let foo_module = &foo_module.as_borrowed(); b.iter(|| { for _ in 0..1000 { @@ -34,6 +35,7 @@ class Foo: ); let foo_module = module.getattr("Foo").unwrap().call0().unwrap(); + let foo_module = &foo_module.as_borrowed(); b.iter(|| { for _ in 0..1000 { diff --git a/pyo3-benches/benches/bench_decimal.rs b/pyo3-benches/benches/bench_decimal.rs index 6db6704bf8e..896305ec84b 100644 --- a/pyo3-benches/benches/bench_decimal.rs +++ b/pyo3-benches/benches/bench_decimal.rs @@ -17,6 +17,7 @@ py_dec = decimal.Decimal("0.0") ) .unwrap(); let py_dec = locals.get_item("py_dec").unwrap().unwrap(); + let py_dec = &py_dec.as_borrowed(); b.iter(|| { let _: Decimal = black_box(&py_dec).extract().unwrap(); diff --git a/pyo3-benches/benches/bench_extract.rs b/pyo3-benches/benches/bench_extract.rs index 1c783c3b706..1df8bad0891 100644 --- a/pyo3-benches/benches/bench_extract.rs +++ b/pyo3-benches/benches/bench_extract.rs @@ -50,7 +50,7 @@ fn extract_str_downcast_fail(bench: &mut Bencher<'_>) { fn extract_int_extract_success(bench: &mut Bencher<'_>) { Python::with_gil(|py| { let int_obj: PyObject = 123.into_py(py); - let int = int_obj.as_ref(py); + let int = int_obj.bind(py); bench.iter(|| { let v = black_box(int).extract::().unwrap(); @@ -73,7 +73,7 @@ fn extract_int_extract_fail(bench: &mut Bencher<'_>) { fn extract_int_downcast_success(bench: &mut Bencher<'_>) { Python::with_gil(|py| { let int_obj: PyObject = 123.into_py(py); - let int = int_obj.as_ref(py); + let int = int_obj.bind(py); bench.iter(|| { let py_int = black_box(int).downcast::().unwrap(); @@ -97,7 +97,7 @@ fn extract_int_downcast_fail(bench: &mut Bencher<'_>) { fn extract_float_extract_success(bench: &mut Bencher<'_>) { Python::with_gil(|py| { let float_obj: PyObject = 23.42.into_py(py); - let float = float_obj.as_ref(py); + let float = float_obj.bind(py); bench.iter(|| { let v = black_box(float).extract::().unwrap(); @@ -120,7 +120,7 @@ fn extract_float_extract_fail(bench: &mut Bencher<'_>) { fn extract_float_downcast_success(bench: &mut Bencher<'_>) { Python::with_gil(|py| { let float_obj: PyObject = 23.42.into_py(py); - let float = float_obj.as_ref(py); + let float = float_obj.bind(py); bench.iter(|| { let py_int = black_box(float).downcast::().unwrap(); diff --git a/pyo3-benches/benches/bench_frompyobject.rs b/pyo3-benches/benches/bench_frompyobject.rs index 8114ee5a802..2bba0d0a12a 100644 --- a/pyo3-benches/benches/bench_frompyobject.rs +++ b/pyo3-benches/benches/bench_frompyobject.rs @@ -62,7 +62,7 @@ fn not_a_list_via_extract_enum(b: &mut Bencher<'_>) { Python::with_gil(|py| { let any: &Bound<'_, PyAny> = &PyString::new_bound(py, "foobar"); - b.iter(|| match black_box(any).extract::>() { + b.iter(|| match black_box(&any).extract::>() { Ok(ListOrNotList::List(_list)) => panic!(), Ok(ListOrNotList::NotList(any)) => any, Err(_) => panic!(), diff --git a/src/conversions/num_complex.rs b/src/conversions/num_complex.rs index d15121f9bed..ba741323611 100644 --- a/src/conversions/num_complex.rs +++ b/src/conversions/num_complex.rs @@ -151,7 +151,7 @@ macro_rules! complex_conversion { unsafe { let complex; let obj = if obj.is_instance_of::() { - obj.clone() + obj } else if let Some(method) = obj.lookup_special(crate::intern!(obj.py(), "__complex__"))? { @@ -161,7 +161,7 @@ macro_rules! complex_conversion { // `obj` might still implement `__float__` or `__index__`, which will be // handled by `PyComplex_{Real,Imag}AsDouble`, including propagating any // errors if those methods don't exist / raise exceptions. - obj.clone() + obj }; let ptr = obj.as_ptr(); let real = ffi::PyComplex_RealAsDouble(ptr); diff --git a/src/err/mod.rs b/src/err/mod.rs index 644645875b0..75d7ab9e1c6 100644 --- a/src/err/mod.rs +++ b/src/err/mod.rs @@ -875,15 +875,15 @@ impl PyErrArguments for PyDowncastErrorArguments { } /// Convert `PyDowncastError` to Python `TypeError`. -impl<'a> std::convert::From> for PyErr { +impl std::convert::From> for PyErr { fn from(err: PyDowncastError<'_>) -> PyErr { PyErr::from(err.0) } } -impl<'a> std::error::Error for PyDowncastError<'a> {} +impl std::error::Error for PyDowncastError<'_> {} -impl<'a> std::fmt::Display for PyDowncastError<'a> { +impl std::fmt::Display for PyDowncastError<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { self.0.fmt(f) } diff --git a/src/instance.rs b/src/instance.rs index 08fda5a2926..38659d51396 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -149,6 +149,14 @@ impl<'py> Bound<'py, PyAny> { ) -> Option { Py::from_borrowed_ptr_or_opt(py, ptr).map(|obj| Self(py, ManuallyDrop::new(obj))) } + + /// Constructs a new Bound from a borrowed pointer, incrementing the reference count. + /// + /// # Safety + /// ptr must be a valid pointer to a Python object. + pub unsafe fn from_borrowed_ptr_unchecked(py: Python<'py>, ptr: *mut ffi::PyObject) -> Self { + Self::from_borrowed_ptr_or_opt(py, ptr).unwrap() + } } impl<'py, T> Bound<'py, T> @@ -511,7 +519,8 @@ impl<'a, 'py> Borrowed<'a, 'py, PyAny> { /// This is similar to `std::slice::from_raw_parts`, the lifetime `'a` is completely defined by /// the caller and it's the caller's responsibility to ensure that the reference this is /// derived from is valid for the lifetime `'a`. - pub(crate) unsafe fn from_ptr_unchecked(py: Python<'py>, ptr: *mut ffi::PyObject) -> Self { + #[doc(hidden)] // Used in macro code. + pub unsafe fn from_ptr_unchecked(py: Python<'py>, ptr: *mut ffi::PyObject) -> Self { Self(NonNull::new_unchecked(ptr), PhantomData, py) } diff --git a/src/pycell.rs b/src/pycell.rs index 66d998317a4..fecc1a3f040 100644 --- a/src/pycell.rs +++ b/src/pycell.rs @@ -196,7 +196,6 @@ use crate::ffi_ptr_ext::FfiPtrExt; use crate::impl_::pyclass::{ PyClassBaseType, PyClassDict, PyClassImpl, PyClassThreadChecker, PyClassWeakRef, }; -use crate::instance::Bound; use crate::pyclass::{ boolean_struct::{False, True}, PyClass, diff --git a/tests/ui/invalid_result_conversion.stderr b/tests/ui/invalid_result_conversion.stderr index d2417a86336..a7af0b898db 100644 --- a/tests/ui/invalid_result_conversion.stderr +++ b/tests/ui/invalid_result_conversion.stderr @@ -5,10 +5,10 @@ error[E0277]: the trait bound `PyErr: From` is not satisfied | ^^^^^^^^^^^^^ the trait `From` is not implemented for `PyErr` | = help: the following other types implement trait `From`: + >> > > > - >> >> >> >