bitcode/serde/
mod.rs

1use crate::error::{error_from_display, Error};
2use alloc::boxed::Box;
3use alloc::vec::Vec;
4use core::fmt::Display;
5
6mod de;
7mod guard;
8mod ser;
9mod variant;
10
11pub use de::*;
12pub use ser::*;
13
14// Saves code size over calling panic in type_changed macro directly.
15enum Never {}
16#[cold]
17#[inline(never)]
18fn panic_type_changed() -> Never {
19    panic!("type changed")
20}
21macro_rules! type_changed {
22    () => {
23        #[allow(unreachable_code)]
24        match super::panic_type_changed() {} // ! is unstable.
25    };
26}
27use type_changed;
28
29fn default_box_slice<T: Default>(len: usize) -> Box<[T]> {
30    let mut vec = vec![];
31    vec.resize_with(len, Default::default);
32    vec.into()
33}
34
35#[inline(always)]
36fn get_mut_or_resize<T: Default>(vec: &mut Vec<T>, index: usize) -> &mut T {
37    if index >= vec.len() {
38        #[cold]
39        #[inline(never)]
40        fn cold<T: Default>(vec: &mut Vec<T>, index: usize) {
41            vec.resize_with(index + 1, Default::default);
42        }
43        cold(vec, index);
44    }
45    // Safety we've just resized `vec.len()` to be > than `index`.
46    unsafe { vec.get_unchecked_mut(index) }
47}
48
49#[cfg(not(feature = "std"))]
50impl serde::ser::StdError for Error {}
51
52impl serde::ser::Error for Error {
53    fn custom<T>(t: T) -> Self
54    where
55        T: Display,
56    {
57        error_from_display(t)
58    }
59}
60
61impl serde::de::Error for Error {
62    fn custom<T>(t: T) -> Self
63    where
64        T: Display,
65    {
66        error_from_display(t)
67    }
68}