From 972da59ebc2b04810a198079398447d4b21b3a8d Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 4 Sep 2017 10:56:40 -0700 Subject: [PATCH] Deserialize unsized Arc and Rc --- serde/src/de/impls.rs | 29 +++++++++++++++++++++++++++-- test_suite/tests/test_de.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index c91f431f..ef3e20e6 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1112,10 +1112,10 @@ forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice); #[cfg(any(feature = "std", feature = "alloc"))] forwarded_impl!((), Box, String::into_boxed_str); -#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] +#[cfg(all(not(feature = "unstable"), feature = "rc", any(feature = "std", feature = "alloc")))] forwarded_impl!((T), Arc, Arc::new); -#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))] +#[cfg(all(not(feature = "unstable"), feature = "rc", any(feature = "std", feature = "alloc")))] forwarded_impl!((T), Rc, Rc::new); #[cfg(any(feature = "std", feature = "alloc"))] @@ -1135,6 +1135,31 @@ where //////////////////////////////////////////////////////////////////////////////// +#[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))] +macro_rules! box_forwarded_impl { + ($t:ident) => { + impl<'de, T: ?Sized> Deserialize<'de> for $t + where + Box: Deserialize<'de>, + { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Box::deserialize(deserializer).map(Into::into) + } + } + } +} + +#[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))] +box_forwarded_impl!(Rc); + +#[cfg(all(feature = "unstable", feature = "rc", any(feature = "std", feature = "alloc")))] +box_forwarded_impl!(Arc); + +//////////////////////////////////////////////////////////////////////////////// + impl<'de, T> Deserialize<'de> for Cell where T: Deserialize<'de> + Copy, diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index 2e062840..9fbfed46 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -15,6 +15,8 @@ use std::path::{Path, PathBuf}; use std::time::{Duration, UNIX_EPOCH}; use std::default::Default; use std::ffi::{CString, OsString}; +use std::rc::Rc; +use std::sync::Arc; #[cfg(feature = "unstable")] use std::ffi::CStr; @@ -740,6 +742,40 @@ declare_tests! { Token::Bytes(b"abc"), ], } + test_rc { + Rc::new(true) => &[ + Token::Bool(true), + ], + } + test_arc { + Arc::new(true) => &[ + Token::Bool(true), + ], + } +} + +#[cfg(feature = "unstable")] +declare_tests! { + test_rc_dst { + Rc::::from("s") => &[ + Token::Str("s"), + ], + Rc::<[bool]>::from(&[true][..]) => &[ + Token::Seq { len: Some(1) }, + Token::Bool(true), + Token::SeqEnd, + ], + } + test_arc_dst { + Arc::::from("s") => &[ + Token::Str("s"), + ], + Arc::<[bool]>::from(&[true][..]) => &[ + Token::Seq { len: Some(1) }, + Token::Bool(true), + Token::SeqEnd, + ], + } } #[cfg(unix)]