1 // Copyright (c) Facebook, Inc. and its affiliates.
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
7 use std::marker::PhantomData;
9 use bumpalo::collections::Vec as ArenaVec;
11 use ocamlrep_caml_builtins::Int64;
12 use serde::de::Deserializer;
13 use serde::de::SeqAccess;
14 use serde::de::Visitor;
15 use serde::Deserialize;
17 use crate::seed::ArenaSeed;
19 pub trait DeserializeInArena<'arena>: Sized {
20 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
22 D: Deserializer<'arena>;
26 macro_rules! impl_deserialize_in_arena{
27 ($ty:ident < $($lt:lifetime),* $(,)? $($tp:ident),* >) => {
28 impl<'arena, $($tp : 'arena + $crate::DeserializeInArena<'arena>),*> $crate::DeserializeInArena<'arena> for $ty<$($lt,)* $($tp,)* > {
29 fn deserialize_in_arena<__D>(
30 arena: &'arena $crate::bumpalo::Bump,
32 ) -> Result<Self, __D::Error>
34 __D: $crate::serde::Deserializer<'arena>,
37 $crate::serde::Deserialize::deserialize(deserializer)
41 impl<'arena, $($tp : $crate::DeserializeInArena<'arena>),*> $crate::DeserializeInArena<'arena> for &'arena $ty<$($lt,)* $($tp,)* > {
42 fn deserialize_in_arena<__D>(
43 arena: &'arena $crate::bumpalo::Bump,
45 ) -> Result<Self, __D::Error>
47 __D: $crate::serde::Deserializer<'arena>,
49 let value = <$ty<$($tp,)*>>::deserialize_in_arena(arena, deserializer)?;
50 Ok(arena.alloc(value))
55 impl<'arena> $crate::DeserializeInArena<'arena> for $ty {
56 fn deserialize_in_arena<__D>(
57 arena: &'arena $crate::bumpalo::Bump,
59 ) -> Result<Self, __D::Error>
61 __D: $crate::serde::Deserializer<'arena>,
64 $crate::serde::Deserialize::deserialize(deserializer)
68 impl<'arena> $crate::DeserializeInArena<'arena> for &'arena $ty {
69 fn deserialize_in_arena<__D>(
70 arena: &'arena $crate::bumpalo::Bump,
72 ) -> Result<Self, __D::Error>
74 __D: $crate::serde::Deserializer<'arena>,
76 let value = <$ty>::deserialize(deserializer)?;
77 Ok(arena.alloc(value))
83 impl_deserialize_in_arena!(());
84 impl_deserialize_in_arena!(bool);
85 impl_deserialize_in_arena!(i8);
86 impl_deserialize_in_arena!(i16);
87 impl_deserialize_in_arena!(i32);
88 impl_deserialize_in_arena!(i64);
89 impl_deserialize_in_arena!(isize);
90 impl_deserialize_in_arena!(u8);
91 impl_deserialize_in_arena!(u16);
92 impl_deserialize_in_arena!(u32);
93 impl_deserialize_in_arena!(u64);
94 impl_deserialize_in_arena!(usize);
95 impl_deserialize_in_arena!(f32);
96 impl_deserialize_in_arena!(f64);
97 impl_deserialize_in_arena!(char);
98 impl_deserialize_in_arena!(Int64);
100 impl<'arena> DeserializeInArena<'arena> for &'arena str {
101 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
103 D: Deserializer<'arena>,
105 struct StrInArena<'arena> {
109 impl<'arena, 'de> Visitor<'de> for StrInArena<'arena> {
110 type Value = &'arena str;
112 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
113 formatter.write_str("a string")
116 fn visit_str<E>(self, string: &str) -> Result<Self::Value, E>
120 Ok(self.arena.alloc_str(string))
124 deserializer.deserialize_str(StrInArena { arena })
128 impl<'arena> DeserializeInArena<'arena> for &'arena bstr::BStr {
129 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
131 D: Deserializer<'arena>,
133 struct BStrVisitor<'arena> {
137 impl<'arena, 'de> Visitor<'de> for BStrVisitor<'arena> {
138 type Value = &'arena bstr::BStr;
140 fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
141 f.write_str("a borrowed byte string")
145 fn visit_seq<V: SeqAccess<'de>>(self, mut visitor: V) -> Result<Self::Value, V::Error> {
146 let len = std::cmp::min(visitor.size_hint().unwrap_or(0), 256);
147 let mut bytes = ArenaVec::with_capacity_in(len, self.arena);
148 while let Some(v) = visitor.next_element()? {
151 Ok(bytes.into_bump_slice().into())
155 fn visit_borrowed_bytes<E>(self, value: &'de [u8]) -> Result<Self::Value, E>
159 Ok((self.arena.alloc_slice_copy(value) as &[u8]).into())
163 fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
167 Ok((self.arena.alloc_str(value) as &str).into())
171 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
175 Ok((self.arena.alloc_slice_copy(value) as &[u8]).into())
179 deserializer.deserialize_bytes(BStrVisitor { arena })
183 impl<'arena, T> DeserializeInArena<'arena> for &'arena [T]
185 T: DeserializeInArena<'arena>,
187 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
189 D: Deserializer<'arena>,
191 struct SliceInArena<'arena, T> {
193 marker: PhantomData<fn() -> T>,
196 impl<'arena, T> Visitor<'arena> for SliceInArena<'arena, T>
198 T: DeserializeInArena<'arena> + 'arena,
200 type Value = &'arena [T];
202 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
203 formatter.write_str("an array")
206 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
208 A: SeqAccess<'arena>,
210 let mut vec = Vec::with_capacity(seq.size_hint().unwrap_or(0));
211 let seed = ArenaSeed::new();
212 while let Some(value) = seq.next_element_seed(seed)? {
215 Ok(self.arena.alloc_slice_fill_iter(vec))
219 deserializer.deserialize_seq(SliceInArena {
226 impl<'arena, T> DeserializeInArena<'arena> for Option<T>
228 T: DeserializeInArena<'arena>,
230 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
232 D: Deserializer<'arena>,
234 struct OptionVisitor<'arena, T> {
236 marker: PhantomData<fn() -> T>,
239 impl<'arena, T: DeserializeInArena<'arena>> Visitor<'arena> for OptionVisitor<'arena, T> {
240 type Value = Option<T>;
242 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
243 formatter.write_str("option")
247 fn visit_unit<E>(self) -> Result<Self::Value, E>
255 fn visit_none<E>(self) -> Result<Self::Value, E>
263 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
265 D: Deserializer<'arena>,
267 T::deserialize_in_arena(self.arena, deserializer).map(Some)
271 deserializer.deserialize_option(OptionVisitor {
278 impl<'arena, T> DeserializeInArena<'arena> for &'arena Option<T>
280 T: DeserializeInArena<'arena>,
282 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
284 D: Deserializer<'arena>,
286 let v = <Option<T>>::deserialize_in_arena(arena, deserializer)?;
291 macro_rules! tuple_impls {
292 ($($len:tt => ($($n:tt $name:ident)+))+) => {
294 impl<'arena, $($name: DeserializeInArena<'arena>),+> DeserializeInArena<'arena> for ($($name,)+) {
296 fn deserialize_in_arena<D>(_arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
298 D: Deserializer<'arena>,
300 struct TupleVisitor<$($name,)+> {
301 marker: PhantomData<($($name,)+)>,
304 impl<'arena, $($name: DeserializeInArena<'arena>),+> Visitor<'arena> for TupleVisitor<$($name,)+> {
305 type Value = ($($name,)+);
307 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
308 formatter.write_str(concat!("a tuple of size ", $len))
312 #[allow(non_snake_case)]
313 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
315 A: SeqAccess<'arena>,
318 let seed = ArenaSeed::new();
319 let $name = match seq.next_element_seed(seed)? {
320 Some(value) => value,
321 None => return Err(serde::de::Error::invalid_length($n, &self)),
329 deserializer.deserialize_tuple($len, TupleVisitor { marker: PhantomData })
333 impl<'arena, $($name: DeserializeInArena<'arena>),+> DeserializeInArena<'arena> for &'arena ($($name,)+) {
335 fn deserialize_in_arena<D>(arena: &'arena Bump, deserializer: D) -> Result<Self, D::Error>
337 D: Deserializer<'arena>,
339 let v = <($($name,)+)>::deserialize_in_arena(arena, deserializer)?;
350 3 => (0 T0 1 T1 2 T2)
351 4 => (0 T0 1 T1 2 T2 3 T3)
352 5 => (0 T0 1 T1 2 T2 3 T3 4 T4)
353 6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
354 7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
355 8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
356 9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
357 10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
358 11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
359 12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)
360 13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12)
361 14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13)
362 15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14)
363 16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15)