Skip to content

Commit 56bd369

Browse files
committed
Optimize deserialization of recursive buffered types
1 parent ff259ec commit 56bd369

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

serde/src/de/mod.rs

+14
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,20 @@ pub trait Deserializer<'de>: Sized {
12131213
fn is_human_readable(&self) -> bool {
12141214
true
12151215
}
1216+
1217+
// Not public API.
1218+
#[cfg(all(serde_derive, any(feature = "std", feature = "alloc")))]
1219+
#[doc(hidden)]
1220+
fn __deserialize_content<V>(
1221+
self,
1222+
_: ::actually_private::T,
1223+
visitor: V,
1224+
) -> Result<::private::de::Content<'de>, Self::Error>
1225+
where
1226+
V: Visitor<'de, Value = ::private::de::Content<'de>>,
1227+
{
1228+
self.deserialize_any(visitor)
1229+
}
12161230
}
12171231

12181232
////////////////////////////////////////////////////////////////////////////////

serde/src/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -295,3 +295,8 @@ extern crate serde_derive;
295295
#[cfg(feature = "serde_derive")]
296296
#[doc(hidden)]
297297
pub use serde_derive::*;
298+
299+
#[cfg(all(serde_derive, any(feature = "std", feature = "alloc")))]
300+
mod actually_private {
301+
pub struct T;
302+
}

serde/src/private/de.rs

+27-2
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ mod content {
206206
use lib::*;
207207

208208
use __private::size_hint;
209+
use actually_private;
209210
use de::{
210211
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
211212
MapAccess, SeqAccess, Unexpected, Visitor,
@@ -215,7 +216,7 @@ mod content {
215216
/// deserializing untagged enums and internally tagged enums.
216217
///
217218
/// Not public API. Use serde-value instead.
218-
#[derive(Debug)]
219+
#[derive(Debug, Clone)]
219220
pub enum Content<'de> {
220221
Bool(bool),
221222

@@ -294,7 +295,7 @@ mod content {
294295
// Untagged and internally tagged enums are only supported in
295296
// self-describing formats.
296297
let visitor = ContentVisitor { value: PhantomData };
297-
deserializer.deserialize_any(visitor)
298+
deserializer.__deserialize_content(actually_private::T, visitor)
298299
}
299300
}
300301

@@ -1427,6 +1428,18 @@ mod content {
14271428
drop(self);
14281429
visitor.visit_unit()
14291430
}
1431+
1432+
fn __deserialize_content<V>(
1433+
self,
1434+
_: actually_private::T,
1435+
visitor: V,
1436+
) -> Result<Content<'de>, Self::Error>
1437+
where
1438+
V: Visitor<'de, Value = Content<'de>>,
1439+
{
1440+
let _ = visitor;
1441+
Ok(self.content)
1442+
}
14301443
}
14311444

14321445
impl<'de, E> ContentDeserializer<'de, E> {
@@ -2138,6 +2151,18 @@ mod content {
21382151
{
21392152
visitor.visit_unit()
21402153
}
2154+
2155+
fn __deserialize_content<V>(
2156+
self,
2157+
_: actually_private::T,
2158+
visitor: V,
2159+
) -> Result<Content<'de>, Self::Error>
2160+
where
2161+
V: Visitor<'de, Value = Content<'de>>,
2162+
{
2163+
let _ = visitor;
2164+
Ok(self.content.clone())
2165+
}
21412166
}
21422167

21432168
impl<'a, 'de, E> ContentRefDeserializer<'a, 'de, E> {

0 commit comments

Comments
 (0)