From af087e11a5c5668328fcd25b57ffbe55969d7054 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 5 Jan 2024 11:41:25 +0000 Subject: [PATCH 1/4] Implement `ToPyObject` for `Box` There are implementations for `&T`, `Vec` etc, so makes sense to also do for `Box`. --- src/conversion.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/conversion.rs b/src/conversion.rs index 429ca9e8779..bc69098144c 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -243,6 +243,21 @@ impl ToPyObject for &'_ T { } } +impl ToPyObject for Box { + fn to_object(&self, py: Python<'_>) -> PyObject { + self.as_ref().to_object(py) + } +} + +impl IntoPy for Box +where + for<'a> &'a T: IntoPy, +{ + fn into_py(self, py: Python<'_>) -> PyObject { + self.as_ref().into_py(py) + } +} + /// `Option::Some` is converted like `T`. /// `Option::None` is converted to Python `None`. impl ToPyObject for Option @@ -578,7 +593,7 @@ mod test_no_clone {} #[cfg(test)] mod tests { - use crate::{PyObject, Python}; + use crate::{IntoPy, PyObject, Python, ToPyObject}; #[allow(deprecated)] mod deprecated { @@ -641,4 +656,22 @@ mod tests { assert_eq!(none.get_refcnt(), ref_cnt); }); } + + #[test] + fn test_box_topyobject() { + let s: Box = "test".into(); + + let obj = Python::with_gil(|py| s.to_object(py)); + + assert_eq!(&obj.to_string(), "test") + } + + #[test] + fn test_box_intopy() { + let s: Box = "test".into(); + + let obj = Python::with_gil(|py| s.into_py(py)); + + assert_eq!(&obj.to_string(), "test") + } } From 7c3391a601abdbba23cdbf378327052953faac1a Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 5 Jan 2024 11:59:37 +0000 Subject: [PATCH 2/4] Newsfile --- newsfragments/3729.added | 1 + 1 file changed, 1 insertion(+) create mode 100644 newsfragments/3729.added diff --git a/newsfragments/3729.added b/newsfragments/3729.added new file mode 100644 index 00000000000..44f06b46851 --- /dev/null +++ b/newsfragments/3729.added @@ -0,0 +1 @@ +Implement `IntoPy` and `ToPyObject` for `Box`. From 8043ceed3552429c100c9960a2b0546277c6e409 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Fri, 5 Jan 2024 12:00:53 +0000 Subject: [PATCH 3/4] Newfile2 --- newsfragments/{3729.added => 3729.added.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename newsfragments/{3729.added => 3729.added.md} (100%) diff --git a/newsfragments/3729.added b/newsfragments/3729.added.md similarity index 100% rename from newsfragments/3729.added rename to newsfragments/3729.added.md From 6497b108492a3e499b4ee4b9bc1f5c4fa248aa35 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Mon, 8 Jan 2024 09:09:30 +0000 Subject: [PATCH 4/4] Don't use reference fir IntoPy --- src/conversion.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conversion.rs b/src/conversion.rs index bc69098144c..7f2cc0afb96 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -251,10 +251,10 @@ impl ToPyObject for Box { impl IntoPy for Box where - for<'a> &'a T: IntoPy, + T: IntoPy, { fn into_py(self, py: Python<'_>) -> PyObject { - self.as_ref().into_py(py) + (*self).into_py(py) } } @@ -670,7 +670,7 @@ mod tests { fn test_box_intopy() { let s: Box = "test".into(); - let obj = Python::with_gil(|py| s.into_py(py)); + let obj: PyObject = Python::with_gil(|py| s.into_py(py)); assert_eq!(&obj.to_string(), "test") }