Skip to main content

deser_core/de/
driver.rs

1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::marker::PhantomData;
4
5use crate::State;
6use crate::Text;
7use crate::de::arena::Buffer;
8use crate::de::layer::{Layer, LayerEvent, Next};
9use crate::de::lexical::ContentKey;
10use crate::de::{Deserialize, InlineEvent, Sink, SinkHandle};
11use crate::error::{Error, ErrorKind};
12use crate::event::{Atom, ContainerShape, Event};
13
14/// The driver allows emitting deserialization events into a [`Deserialize`].
15///
16/// This is a convenient way to safely drive a [`Sink`](crate::de::Sink) of a [`Deserialize`]
17/// without using the runtime stack.  As rust lifetimes make what this type does
18/// internally impossible with safe code, this is a safe abstractiont that
19/// hides the unsafety internally.
20///
21/// # Events and Their Context
22///
23/// Events are emitted with [`emit`](Self::emit) or, if they borrow from
24/// the data being deserialized, with [`emit_borrowed`](Self::emit_borrowed).
25/// Information about the next event is placed into the [`State`] before it's
26/// emitted: its byte range in the input with
27/// [`State::set_input_range`] and data attached to it with
28/// [`State::event_mut`].  Both are detached after the event was delivered.
29///
30/// ```
31/// use deser::de::DeserializeDriver;
32/// use deser::Event;
33///
34/// let mut out = None::<Vec<u32>>;
35/// let mut driver = DeserializeDriver::new(&mut out);
36/// driver.state_mut().set_input_range(0, 1);
37/// driver.emit(Event::seq_start()).unwrap();
38/// driver.state_mut().set_input_range(1, 3);
39/// driver.emit(42u64).unwrap();
40/// driver.state_mut().set_input_range(3, 4);
41/// driver.emit(Event::SeqEnd).unwrap();
42/// ```
43///
44/// When an event fails, the error gets the context of the event attached
45/// (see [`Error`] and [`State::add_error_context`]).
46///
47/// # Layers
48///
49/// [`Layer`]s sit between the format and the sinks and see every event
50/// before it's delivered.  They are added with
51/// [`push_layer`](Self::push_layer), see [`Layer`] for more information.
52pub struct DeserializeDriver<'a, 'de: 'a> {
53    core: DriverCore<'de>,
54    layers: Vec<Box<dyn Layer>>,
55    // passes events through the layers, set by `push_layer`.  The code of
56    // the layers is only linked into programs that add layers.
57    emit_layered: Option<EmitLayered<'de>>,
58    // the sinks borrow for 'a
59    _marker: PhantomData<&'a mut ()>,
60}
61
62/// Passes an event through the layers (see `DeserializeDriver::emit_layered`).
63type EmitLayered<'de> =
64    fn(&mut Vec<Box<dyn Layer>>, &mut DriverCore<'de>, LayerEvent<'_, 'de>) -> Result<(), Error>;
65
66/// The state and the sinks of a driver.
67pub(crate) struct DriverCore<'de> {
68    pub(crate) state: State,
69    // The sinks borrow from each other: every sink on the stack can borrow
70    // from the sink below it.  The lifetimes of these borrows are erased
71    // (to `'de` as the handles cannot outlive that) and it's the driver's
72    // responsibility to never use a sink while one of the sinks it lent out
73    // is still alive and to drop them in inverse order.
74    //
75    // `root` holds the sink the driver was created with while no container
76    // is open.
77    root: Option<SinkHandle<'de, 'de>>,
78    sink_stack: Vec<(SinkHandle<'de, 'de>, Container)>,
79    // non-zero while the driver is lent out with a shorter lifetime for
80    // the borrowed data (see `DeserializeDriver::transient`): borrowed
81    // atoms are delivered as transient ones.  The value identifies the
82    // call that lent the driver out.
83    transient: usize,
84}
85
86const STACK_CAPACITY: usize = 128;
87
88// an ongoing serialization can move between threads, for instance when it
89// is suspended while waiting for IO.
90const _: () = {
91    const fn assert_send<T: Send>() {}
92    assert_send::<DeserializeDriver<'static, 'static>>();
93};
94
95#[derive(Copy, Clone)]
96enum Container {
97    /// A map, the first flag is `true` if a key is expected next, the
98    /// second if it's a multimap (see [`ContainerShape::with_multimap`]).
99    Map(bool, bool),
100    /// A sequence, the flag is `true` if the sink builds sequences that
101    /// are its elements inline (see [`Sink::__private_seq`]).
102    Seq(bool),
103    /// A sequence whose sink builds an element inline and is within it.
104    /// The number is the index of the next item of the element.
105    Inline(u32),
106    /// A map for a sink that rejected it: the value of the key of the
107    /// content is delivered to the sink, the other entries are skipped (see
108    /// [`ContentKey`]).  The flags are `true` if a key is expected next, if
109    /// the next value is the content and if the content was delivered.
110    Content(bool, bool, bool),
111    /// Takes the next value (an atom or a container) and ignores it.  This
112    /// is placed above a map that recovered from the error of a key (see
113    /// [`Sink::recover`]), the value of the key is skipped.  It holds a null
114    /// sink.
115    SkipValue,
116}
117
118impl Container {
119    /// Returns the state of a container that was just opened.
120    fn new(is_map: bool) -> Container {
121        if is_map {
122            Container::Map(true, false)
123        } else {
124            Container::Seq(false)
125        }
126    }
127
128    /// Returns `true` if the container is a multimap.
129    #[inline(always)]
130    fn is_multimap(&self) -> bool {
131        matches!(self, Container::Map(_, true))
132    }
133}
134
135/// Erases the lifetime of a sink handle.
136///
137/// # Safety
138///
139/// The caller must ensure that the handle is dropped before the data it
140/// borrows from.
141unsafe fn erase_lifetime<'de>(handle: SinkHandle<'_, 'de>) -> SinkHandle<'de, 'de> {
142    unsafe { core::mem::transmute::<SinkHandle<'_, 'de>, SinkHandle<'de, 'de>>(handle) }
143}
144
145/// Restores a driver after it was lent out (see
146/// `DeserializeDriver::transient`).
147struct Lent<'a, 'de> {
148    driver: *mut DeserializeDriver<'a, 'de>,
149    id: usize,
150    outer: usize,
151}
152
153impl Drop for Lent<'_, '_> {
154    fn drop(&mut self) {
155        // SAFETY: the driver outlives this and is not borrowed anymore
156        let driver = unsafe { &mut *self.driver };
157        if driver.core.transient == self.id {
158            driver.core.transient = self.outer;
159            return;
160        }
161        // the callback replaced the driver with one whose sinks can borrow
162        // data that lives shorter than `'de`.  It's dropped while that
163        // data is alive and the driver is left without sinks.
164        let replacement = core::mem::replace(
165            &mut driver.core,
166            DriverCore {
167                state: State::new(),
168                root: None,
169                sink_stack: Vec::new(),
170                transient: 0,
171            },
172        );
173        drop(replacement);
174    }
175}
176
177/// Shortens the lifetimes of a driver (see `DeserializeDriver::transient`).
178///
179/// The lifetime of the sinks becomes the lifetime of the reference, so a
180/// driver that is swapped out cannot outlive the call.
181fn shorten<'r, 'a, 'de, 'f>(
182    driver: &'r mut DeserializeDriver<'a, 'de>,
183) -> &'r mut DeserializeDriver<'r, 'f>
184where
185    'de: 'f,
186    'f: 'r,
187{
188    // SAFETY: the driver has the same layout for all lifetimes.  The
189    // sinks accept data borrowed for `'de` and receive data that lives for
190    // `'f`: the driver delivers borrowed atoms as transient ones while it's
191    // lent out (`DriverCore::transient`), so no data of `'f` is passed to
192    // them as borrowed.  Sinks cannot be wrapped while it's lent out, and
193    // if the driver is replaced the replacement is dropped before `'f`
194    // ends (see `transient`).
195    unsafe { &mut *(driver as *mut DeserializeDriver<'a, 'de>).cast::<DeserializeDriver<'r, 'f>>() }
196}
197
198impl<'a, 'de> DeserializeDriver<'a, 'de> {
199    /// Creates a new deserializer driver.
200    pub fn new<T: Deserialize<'de>>(out: &'a mut Option<T>) -> DeserializeDriver<'a, 'de> {
201        DeserializeDriver::from_fn(|state| T::deserialize_into(out, state))
202    }
203
204    /// Creates a driver that updates an existing value.
205    ///
206    /// See [`Deserialize::deserialize_update`].
207    ///
208    /// ```
209    /// use deser::de::DeserializeDriver;
210    /// use deser::{Deserialize, Event};
211    ///
212    /// #[derive(Deserialize)]
213    /// struct Config {
214    ///     host: String,
215    ///     port: u16,
216    /// }
217    ///
218    /// let mut config = Config { host: "localhost".into(), port: 80 };
219    /// let mut driver = DeserializeDriver::update(&mut config);
220    /// for event in [
221    ///     Event::map_start(),
222    ///     "port".into(),
223    ///     8080u64.into(),
224    ///     Event::MapEnd,
225    /// ] {
226    ///     driver.emit(event).unwrap();
227    /// }
228    /// drop(driver);
229    /// assert_eq!((config.host.as_str(), config.port), ("localhost", 8080));
230    /// ```
231    pub fn update<T: Deserialize<'de>>(value: &'a mut T) -> DeserializeDriver<'a, 'de> {
232        DeserializeDriver::from_fn(|state| T::deserialize_update(value, state))
233    }
234
235    /// Creates a new deserializer driver from a sink.
236    ///
237    /// The sink cannot be allocated in the arena of the driver, see
238    /// [`from_fn`](Self::from_fn) for that.
239    pub fn from_sink(sink: SinkHandle<'a, 'de>) -> DeserializeDriver<'a, 'de> {
240        DeserializeDriver::with_state(State::new(), sink, STACK_CAPACITY)
241    }
242
243    /// Creates a new deserializer driver with a sink that is created with
244    /// the state of the driver.
245    ///
246    /// This allows the sink to be allocated in the arena of the driver
247    /// (see [`SinkHandle::arena`]).
248    ///
249    /// ```
250    /// use deser::de::{DeserializeDriver, Recording};
251    /// use deser::Event;
252    ///
253    /// let mut recording = Recording::new();
254    /// let mut driver =
255    ///     DeserializeDriver::from_fn(|state| recording.recorder(state));
256    /// for event in [Event::seq_start(), 42u64.into(), Event::SeqEnd] {
257    ///     driver.emit(event).unwrap();
258    /// }
259    /// drop(driver);
260    /// assert_eq!(recording.events().count(), 3);
261    /// ```
262    pub fn from_fn(
263        make: impl FnOnce(&mut State) -> SinkHandle<'a, 'de>,
264    ) -> DeserializeDriver<'a, 'de> {
265        // the arena moves into the driver with the state, its chunks (and
266        // the sink in them) do not move
267        let mut state = State::new();
268        let sink = make(&mut state);
269        DeserializeDriver::with_state(state, sink, STACK_CAPACITY)
270    }
271
272    /// Creates a driver from a state and a sink that was created with it.
273    ///
274    /// This is like [`from_fn`](Self::from_fn) for code that creates the
275    /// sink where the type is known and runs the driver in a function that
276    /// is not generic.
277    pub fn from_state(state: State, sink: SinkHandle<'a, 'de>) -> DeserializeDriver<'a, 'de> {
278        DeserializeDriver::with_state(state, sink, STACK_CAPACITY)
279    }
280
281    /// Runs a nested driver within an ongoing deserialization.
282    ///
283    /// The nested driver continues on the state of the ongoing
284    /// deserialization: the extensions are shared and the containers opened
285    /// by the nested driver are placed on top of the ones that are currently
286    /// open.  This is used to replay recorded events so that replayed values
287    /// observe the same state as values that were not buffered.  The nested
288    /// driver has no layers: the replayed events already passed the layers
289    /// when they were recorded.
290    pub(crate) fn nested<R>(
291        state: &mut State,
292        sink: SinkHandle<'_, 'de>,
293        is_map_key: bool,
294        f: impl FnOnce(&mut DeserializeDriver<'_, 'de>) -> R,
295    ) -> R {
296        let depth = state.depth;
297        let outer_is_map_key = state.is_map_key;
298        let outer_is_multimap = state.is_multimap;
299        // replayed values are small and often atoms, the stack is only
300        // allocated once a container is opened
301        let mut driver = DeserializeDriver::with_state(state.take(), sink, 0);
302        driver.core.state.is_map_key = is_map_key;
303        let rv = f(&mut driver);
304        // the sinks and the stack go back to the arena before the state
305        // is returned
306        driver.core.release();
307        *state = driver.core.state.take();
308        drop(driver);
309        // a failed replay can leave containers open
310        state.depth = depth;
311        state.is_map_key = outer_is_map_key;
312        state.is_multimap = outer_is_multimap;
313        rv
314    }
315
316    fn with_state(
317        mut state: State,
318        sink: SinkHandle<'a, 'de>,
319        capacity: usize,
320    ) -> DeserializeDriver<'a, 'de> {
321        // the stack of the last driver is reused
322        let sink_stack = state
323            .arena
324            .take_vec(Buffer::SinkStack)
325            .unwrap_or_else(|| Vec::with_capacity(capacity));
326        DeserializeDriver {
327            core: DriverCore {
328                state,
329                sink_stack,
330                // SAFETY: the driver cannot outlive 'a
331                root: Some(unsafe { erase_lifetime(sink) }),
332                transient: 0,
333            },
334            layers: Vec::new(),
335            emit_layered: None,
336            _marker: PhantomData,
337        }
338    }
339
340    /// Returns a borrowed reference to the current deserializer state.
341    pub fn state(&self) -> &State {
342        &self.core.state
343    }
344
345    /// Returns a mutable reference to the current deserializer state.
346    ///
347    /// Formats use this to publish information for the event they emit
348    /// next into the state.
349    pub fn state_mut(&mut self) -> &mut State {
350        &mut self.core.state
351    }
352
353    /// Adds a layer.
354    ///
355    /// Layers see the events in the order they were added: the layer that
356    /// was added first sees the events emitted into the driver, the last
357    /// one passes them on to the sinks.  See [`Layer`] for more
358    /// information.
359    pub fn push_layer<L: Layer + 'static>(&mut self, layer: L) {
360        self.layers.push(Box::new(layer));
361        self.emit_layered = Some(emit_layered);
362    }
363
364    /// Wraps the sink the driver deserializes into.
365    ///
366    /// This allows placing a sink between the driver and the sink of a
367    /// value, for instance to change how certain values are deserialized.
368    /// Unlike [`Layer`]s such sinks see the sinks of the values and not just
369    /// the events.  Sinks created by a wrapped sink are not wrapped
370    /// automatically, the wrapper needs to wrap them in
371    /// [`next_key`](crate::de::Sink::next_key) and
372    /// [`next_value`](crate::de::Sink::next_value) if it wants to see
373    /// them.
374    ///
375    /// # Panics
376    ///
377    /// Panics if events were already emitted.
378    pub fn wrap_sink<F>(&mut self, f: F)
379    where
380        F: for<'x> FnOnce(SinkHandle<'x, 'de>, &mut State) -> SinkHandle<'x, 'de>,
381    {
382        assert!(
383            self.core.sink_stack.is_empty(),
384            "sinks can only be wrapped before events are emitted"
385        );
386        // a wrapper could keep data of the shorter lifetime
387        assert!(
388            self.core.transient == 0,
389            "sinks cannot be wrapped in a transient driver"
390        );
391        let root = self.core.root.take().expect("no active sink");
392        self.core.root = Some(f(root, &mut self.core.state));
393    }
394
395    /// Emits an event into the driver.
396    ///
397    /// The data of the event is only valid for the call.  To emit data that
398    /// can be borrowed use [`emit_borrowed`](Self::emit_borrowed).
399    ///
400    /// # Panics
401    ///
402    /// The driver keeps an internal state and emitting events when they are
403    /// not expected will cause the driver to panic.
404    #[inline]
405    pub fn emit<'e, E: Into<Event<'e>>>(&mut self, event: E) -> Result<(), Error> {
406        match event.into() {
407            Event::Atom(atom) => self.atom_event(atom),
408            Event::MapStart(shape) => self.start_event(true, shape),
409            Event::SeqStart(shape) => self.start_event(false, shape),
410            Event::MapEnd => self.end_event(true),
411            Event::SeqEnd => self.end_event(false),
412        }
413    }
414
415    /// Emits an event that borrows from the data being deserialized.
416    ///
417    /// This is like [`emit`](Self::emit) but atoms are passed to
418    /// [`Sink::borrowed_atom`](crate::de::Sink::borrowed_atom) which means
419    /// that types like `&str` can borrow them:
420    ///
421    /// ```
422    /// use deser::de::DeserializeDriver;
423    ///
424    /// let input = String::from("hello");
425    /// let mut out = None::<&str>;
426    /// {
427    ///     let mut driver = DeserializeDriver::new(&mut out);
428    ///     driver.emit_borrowed(input.as_str()).unwrap();
429    /// }
430    /// assert_eq!(out, Some("hello"));
431    /// ```
432    #[inline]
433    pub fn emit_borrowed<E: Into<Event<'de>>>(&mut self, event: E) -> Result<(), Error> {
434        match event.into() {
435            Event::Atom(atom) => self.borrowed_atom_event(atom),
436            Event::MapStart(shape) => self.start_event(true, shape),
437            Event::SeqStart(shape) => self.start_event(false, shape),
438            Event::MapEnd => self.end_event(true),
439            Event::SeqEnd => self.end_event(false),
440        }
441    }
442
443    /// Lends the driver out for data that lives shorter than `'de`.
444    ///
445    /// The callback receives the driver with the lifetime `'f` for borrowed
446    /// data.  Events emitted with [`emit_borrowed`](Self::emit_borrowed)
447    /// within it are delivered like the ones emitted with
448    /// [`emit`](Self::emit): types that keep the data copy it and types
449    /// which can only borrow (like `&str`) fail.  This allows data that
450    /// only lives for a call (like the frame of a value in a stream buffer)
451    /// to be deserialized with code that borrows from its input into a
452    /// driver for any lifetime:
453    ///
454    /// ```
455    /// use deser::de::DeserializeDriver;
456    ///
457    /// /// Emits the words of the input, borrowing from it.
458    /// fn words<'de>(input: &'de str, driver: &mut DeserializeDriver<'_, 'de>) {
459    ///     driver.emit(deser::Event::seq_start()).unwrap();
460    ///     for word in input.split(' ') {
461    ///         driver.emit_borrowed(word).unwrap();
462    ///     }
463    ///     driver.emit(deser::Event::SeqEnd).unwrap();
464    /// }
465    ///
466    /// let mut out = None::<Vec<String>>;
467    /// {
468    ///     let mut driver = DeserializeDriver::new(&mut out);
469    ///     let input = String::from("hello world");
470    ///     driver.transient(|driver| words(&input, driver));
471    /// }
472    /// assert_eq!(out.unwrap(), ["hello", "world"]);
473    /// ```
474    ///
475    /// # Panics
476    ///
477    /// Panics if the callback replaces the driver (for instance with
478    /// [`mem::swap`](core::mem::swap)), the driver cannot be used after
479    /// that.  Wrapping the sink ([`wrap_sink`](Self::wrap_sink)) in the
480    /// callback panics as well.
481    pub fn transient<'f, R>(&mut self, f: impl FnOnce(&mut DeserializeDriver<'_, 'f>) -> R) -> R
482    where
483        'de: 'f,
484    {
485        // identifies this call, the address is unique while it runs
486        let marker = 0u8;
487        let id = &marker as *const u8 as usize;
488        let outer = core::mem::replace(&mut self.core.transient, id);
489        let driver: *mut DeserializeDriver<'a, 'de> = self;
490        // restores the driver, also if the callback panics
491        let lent = Lent { driver, id, outer };
492        // SAFETY: the pointer comes from `self`, which is not used until
493        // the callback returned
494        let rv = f(shorten(unsafe { &mut *driver }));
495        // SAFETY: the callback returned, nothing borrows the driver
496        let replaced = unsafe { (*driver).core.transient != id };
497        drop(lent);
498        assert!(!replaced, "the driver was replaced while it was lent out");
499        rv
500    }
501
502    // The following functions deliver an event emitted into the driver and
503    // detach its context afterwards.  They are not inlined so that the code
504    // emitting events stays small.
505
506    #[inline(never)]
507    fn atom_event(&mut self, atom: Atom) -> Result<(), Error> {
508        if !self.layers.is_empty() {
509            return self.emit_layered(LayerEvent::new(Event::Atom(atom)));
510        }
511        let rv = self.core.deliver_atom(atom);
512        self.core.finish_event(rv)
513    }
514
515    #[inline(never)]
516    fn borrowed_atom_event(&mut self, atom: Atom<'de>) -> Result<(), Error> {
517        if !self.layers.is_empty() {
518            return self.emit_layered(LayerEvent::borrowed(Event::Atom(atom)));
519        }
520        let rv = self.core.deliver_borrowed_atom(atom);
521        self.core.finish_event(rv)
522    }
523
524    #[inline(never)]
525    fn start_event(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
526        if !self.layers.is_empty() {
527            let event = if is_map {
528                Event::MapStart(shape)
529            } else {
530                Event::SeqStart(shape)
531            };
532            return self.emit_layered(LayerEvent::new(event));
533        }
534        let rv = self.core.deliver_start(is_map, shape);
535        self.core.finish_event(rv)
536    }
537
538    #[inline(never)]
539    fn end_event(&mut self, is_map: bool) -> Result<(), Error> {
540        if !self.layers.is_empty() {
541            let event = if is_map { Event::MapEnd } else { Event::SeqEnd };
542            return self.emit_layered(LayerEvent::new(event));
543        }
544        let rv = self.core.deliver_end(is_map);
545        self.core.finish_event(rv)
546    }
547
548    /// Passes an event through the layers.
549    ///
550    /// This is marked as cold so that it does not affect the code emitting
551    /// events when there are no layers.
552    #[cold]
553    #[inline(never)]
554    fn emit_layered(&mut self, event: LayerEvent<'_, 'de>) -> Result<(), Error> {
555        let emit = self.emit_layered.expect("layers without push_layer");
556        let rv = emit(&mut self.layers, &mut self.core, event);
557        self.core.finish_event(rv)
558    }
559}
560
561/// Passes an event through the layers.
562///
563/// This is only referred to by `push_layer`, programs that do not use
564/// layers do not contain it.
565fn emit_layered<'de>(
566    layers: &mut Vec<Box<dyn Layer>>,
567    core: &mut DriverCore<'de>,
568    event: LayerEvent<'_, 'de>,
569) -> Result<(), Error> {
570    Next::new(layers, core).emit(event)
571}
572
573impl<'de> DriverCore<'de> {
574    /// Detaches the context of the event that was delivered.
575    ///
576    /// If the event failed, the context is attached to the error.
577    #[inline(always)]
578    fn finish_event(&mut self, rv: Result<(), Error>) -> Result<(), Error> {
579        let rv = match rv {
580            Ok(()) => Ok(()),
581            // the error is thrown away (see `State::discard_errors`)
582            Err(err) if self.state.discards_errors => Err(err),
583            Err(err) => Err(self.state.attach_error_context(err)),
584        };
585        self.state.clear_event();
586        rv
587    }
588
589    /// Sets the position of the next event in the state.
590    #[inline]
591    pub(crate) fn update_position(&mut self, event: &Event<'_>) {
592        self.state.is_map_key = match event {
593            Event::MapEnd | Event::SeqEnd => false,
594            // the keys of maps whose content is delivered are not
595            // delivered to sinks
596            _ => matches!(self.sink_stack.last(), Some((_, Container::Map(true, _)))),
597        };
598    }
599
600    /// Delivers an event to the sinks.
601    #[inline(always)]
602    pub(crate) fn dispatch(&mut self, event: Event<'_>) -> Result<(), Error> {
603        match event {
604            Event::Atom(atom) => self.deliver_atom(atom),
605            Event::MapStart(shape) => self.deliver_start(true, shape),
606            Event::SeqStart(shape) => self.deliver_start(false, shape),
607            Event::MapEnd => self.deliver_end(true),
608            Event::SeqEnd => self.deliver_end(false),
609        }
610    }
611
612    /// Delivers an event that borrows from the data to the sinks.
613    #[inline(always)]
614    pub(crate) fn dispatch_borrowed(&mut self, event: Event<'de>) -> Result<(), Error> {
615        match event {
616            Event::Atom(atom) => self.deliver_borrowed_atom(atom),
617            Event::MapStart(shape) => self.deliver_start(true, shape),
618            Event::SeqStart(shape) => self.deliver_start(false, shape),
619            Event::MapEnd => self.deliver_end(true),
620            Event::SeqEnd => self.deliver_end(false),
621        }
622    }
623
624    // The `deliver_*` functions deliver an event to the sinks.  If the event
625    // fails, the sinks get a chance to recover from the error (see
626    // `recover`).
627
628    #[inline(always)]
629    fn deliver_atom(&mut self, atom: Atom) -> Result<(), Error> {
630        match self.emit_atom(atom) {
631            Ok(()) => Ok(()),
632            Err(err) => self.recover(err, None),
633        }
634    }
635
636    #[inline(always)]
637    fn deliver_borrowed_atom(&mut self, atom: Atom<'de>) -> Result<(), Error> {
638        // the data does not live for the lifetime of the sinks (see
639        // `DeserializeDriver::transient`)
640        if self.transient != 0 {
641            return self.deliver_atom(atom);
642        }
643        match self.emit_borrowed_atom(atom) {
644            Ok(()) => Ok(()),
645            Err(err) => self.recover(err, None),
646        }
647    }
648
649    #[inline(always)]
650    fn deliver_start(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
651        match self.emit_start(is_map, shape) {
652            Ok(()) => Ok(()),
653            Err(err) => self.recover(err, Some(is_map)),
654        }
655    }
656
657    #[inline(always)]
658    fn deliver_end(&mut self, is_map: bool) -> Result<(), Error> {
659        match self.emit_end(is_map) {
660            Ok(()) => Ok(()),
661            Err(err) => self.recover(err, None),
662        }
663    }
664
665    /// Recovers from the error of an item.
666    ///
667    /// The error belongs to the item that was started last in the container
668    /// on top of the stack.  The containers are asked to recover (see
669    /// [`Sink::recover`]) from the innermost to the outermost.  The sinks of
670    /// the ones that do not recover are replaced with null sinks, as the
671    /// error passes through them.  Once a sink recovers, the null sinks
672    /// above it take the remaining events of the failed item: skipping them
673    /// needs no support from the dispatch of the events.  `opened` is set if
674    /// the event that failed was the start of a map (`true`) or sequence,
675    /// the container is open in the input and gets a null sink too.
676    #[cold]
677    #[inline(never)]
678    fn recover(&mut self, err: Error, opened: Option<bool>) -> Result<(), Error> {
679        let mut err = if self.state.discards_errors {
680            // the error is thrown away (see `State::discard_errors`)
681            err
682        } else {
683            self.state.attach_error_context(err)
684        };
685        // an element that is built inline failed, it gets a null sink for
686        // its remaining events like the sink of an element
687        if let Some((_, container @ Container::Inline(_))) = self.sink_stack.last_mut() {
688            *container = Container::Seq(true);
689            self.sink_stack
690                .push((SinkHandle::null(), Container::Seq(false)));
691        }
692        for idx in (0..self.sink_stack.len()).rev() {
693            // the sinks above were replaced, nothing borrows from this one
694            let (sink, container) = &mut self.sink_stack[idx];
695            err = match sink.recover(err, &mut self.state) {
696                Ok(()) => {
697                    // after a key failed its value is skipped as well
698                    if let Container::Map(is_key @ false, _) = container {
699                        *is_key = true;
700                        self.sink_stack
701                            .insert(idx + 1, (SinkHandle::null(), Container::SkipValue));
702                    }
703                    if let Some(is_map) = opened {
704                        self.state.depth += 1;
705                        self.sink_stack
706                            .push((SinkHandle::null(), Container::new(is_map)));
707                    }
708                    return Ok(());
709                }
710                Err(err) => err,
711            };
712            *sink = SinkHandle::null();
713            *container = match *container {
714                Container::Seq(_) => Container::Seq(false),
715                other => other,
716            };
717        }
718        // nothing recovered, the deserialization failed
719        self.sink_stack.clear();
720        Err(err)
721    }
722
723    /// Skips an atom which is the value of a key that failed.
724    #[cold]
725    #[inline(never)]
726    fn skip_value(&mut self) {
727        self.state.is_map_key = false;
728        self.sink_stack.pop();
729    }
730
731    #[inline(always)]
732    fn emit_borrowed_atom(&mut self, atom: Atom<'de>) -> Result<(), Error> {
733        match self.sink_stack.last_mut() {
734            Some((sink, Container::Map(is_key, _))) => {
735                let key = *is_key;
736                *is_key = !key;
737                self.state.is_map_key = key;
738                if key {
739                    sink.__private_borrowed_key_atom(atom, &mut self.state)
740                } else {
741                    sink.__private_borrowed_value_atom(atom, &mut self.state)
742                }
743            }
744            Some((sink, Container::Seq(_))) => {
745                self.state.is_map_key = false;
746                sink.__private_borrowed_value_atom(atom, &mut self.state)
747            }
748            Some((sink, Container::Inline(index))) => {
749                let item = *index;
750                *index = item.saturating_add(1);
751                self.state.is_map_key = false;
752                sink.__private_inline_atom(item as usize, atom, &mut self.state)
753            }
754            Some((sink, Container::Content(is_key, take, found))) => {
755                match content_atom(&self.state, is_key, take, found, &atom)? {
756                    true => sink.borrowed_atom(atom, &mut self.state),
757                    false => Ok(()),
758                }
759            }
760            Some((_, Container::SkipValue)) => {
761                self.skip_value();
762                Ok(())
763            }
764            None => {
765                let sink = self.root.as_mut().expect("no active sink");
766                sink.borrowed_atom(atom, &mut self.state)?;
767                sink.finish(&mut self.state)
768            }
769        }
770    }
771
772    #[inline(always)]
773    fn emit_atom(&mut self, atom: Atom) -> Result<(), Error> {
774        match self.sink_stack.last_mut() {
775            Some((sink, Container::Map(is_key, _))) => {
776                let key = *is_key;
777                *is_key = !key;
778                self.state.is_map_key = key;
779                if key {
780                    sink.__private_key_atom(atom, &mut self.state)
781                } else {
782                    sink.__private_value_atom(atom, &mut self.state)
783                }
784            }
785            Some((sink, Container::Seq(_))) => {
786                self.state.is_map_key = false;
787                sink.__private_value_atom(atom, &mut self.state)
788            }
789            Some((sink, Container::Inline(index))) => {
790                let item = *index;
791                *index = item.saturating_add(1);
792                self.state.is_map_key = false;
793                sink.__private_inline_atom(item as usize, atom, &mut self.state)
794            }
795            Some((sink, Container::Content(is_key, take, found))) => {
796                match content_atom(&self.state, is_key, take, found, &atom)? {
797                    true => sink.atom(atom, &mut self.state),
798                    false => Ok(()),
799                }
800            }
801            Some((_, Container::SkipValue)) => {
802                self.skip_value();
803                Ok(())
804            }
805            None => {
806                let sink = self.root.as_mut().expect("no active sink");
807                sink.atom(atom, &mut self.state)?;
808                sink.finish(&mut self.state)
809            }
810        }
811    }
812
813    #[inline(always)]
814    fn emit_start(&mut self, is_map: bool, shape: ContainerShape) -> Result<(), Error> {
815        let mut sink = match self.sink_stack.last_mut() {
816            Some((parent, Container::Map(is_key, _))) => {
817                let key = *is_key;
818                *is_key = !key;
819                self.state.is_map_key = key;
820                let sink = if key {
821                    parent.next_key(&mut self.state)?
822                } else {
823                    parent.next_value(&mut self.state)?
824                };
825                // SAFETY: the sink borrows from the sink on the top of the
826                // stack.  It's placed above it on the stack and dropped
827                // before it.
828                unsafe { erase_lifetime(sink) }
829            }
830            Some((parent, container @ Container::Seq(_))) => {
831                self.state.is_map_key = false;
832                if let (Container::Seq(true), false) = (*container, is_map) {
833                    // the element is built inline by the parent
834                    self.state.container_shape = shape;
835                    parent.__private_inline_event(InlineEvent::Start, &mut self.state)?;
836                    *container = Container::Inline(0);
837                    self.state.is_multimap = false;
838                    self.state.depth += 1;
839                    return Ok(());
840                }
841                let sink = parent.next_value(&mut self.state)?;
842                // SAFETY: see above
843                unsafe { erase_lifetime(sink) }
844            }
845            // a container in an element that is built inline, its items
846            // are atoms and this fails
847            Some((parent, Container::Inline(index))) => {
848                let item = *index;
849                *index = item.saturating_add(1);
850                self.state.is_map_key = false;
851                self.state.container_shape = shape;
852                let event = InlineEvent::Container(item as usize, is_map);
853                return parent.__private_inline_event(event, &mut self.state);
854            }
855            // entries of a map that is not the content are skipped
856            Some((_, Container::Content(is_key, take, _))) => {
857                if *is_key || *take {
858                    return Err(content_container_error(*is_key));
859                }
860                *is_key = true;
861                self.state.is_map_key = false;
862                self.state.depth += 1;
863                self.sink_stack
864                    .push((SinkHandle::null(), Container::new(is_map)));
865                return Ok(());
866            }
867            // the skipped value is a container, the null sink takes it
868            Some((_, container @ Container::SkipValue)) => {
869                self.state.is_map_key = false;
870                *container = Container::new(is_map);
871                self.state.depth += 1;
872                return Ok(());
873            }
874            None => self.root.take().expect("no active sink"),
875        };
876        self.state.container_shape = shape;
877        let container = if is_map {
878            match sink.map(&mut self.state) {
879                Ok(()) => Container::Map(true, shape.is_multimap()),
880                // a map for a sink that wants its content
881                Err(err)
882                    if err.kind() == ErrorKind::Unexpected
883                        && ContentKey::of(&self.state).is_some() =>
884                {
885                    Container::Content(true, false, false)
886                }
887                Err(err) => return Err(err),
888            }
889        } else {
890            Container::Seq(sink.__private_seq(&mut self.state)?)
891        };
892        self.state.is_multimap = container.is_multimap();
893        self.state.depth += 1;
894        self.sink_stack.push((sink, container));
895        Ok(())
896    }
897
898    #[inline(always)]
899    fn emit_end(&mut self, is_map: bool) -> Result<(), Error> {
900        match self.sink_stack.last() {
901            Some((_, Container::Map(..) | Container::Content(..))) if is_map => {}
902            Some((_, Container::Seq(_))) if !is_map => {}
903            Some((_, Container::Inline(_))) if !is_map => return self.end_inline(),
904            _ => panic!("not inside a {}", if is_map { "map" } else { "sequence" }),
905        }
906        let (mut sink, container) = self.sink_stack.pop().unwrap();
907        // the container remains the current one while it's finished as sinks
908        // can still produce values within it (for instance by replaying
909        // recorded values).
910        self.state.is_multimap = container.is_multimap();
911        let mut rv = Ok(());
912        // a map without content is empty text
913        if let Container::Content(_, _, false) = container {
914            self.state.is_map_key = false;
915            rv = sink
916                .atom(Atom::Lexical(Text::borrowed("")), &mut self.state)
917                .map_err(|err| match err.kind() {
918                    // it's rejected as the map it is
919                    ErrorKind::Unexpected => {
920                        super::default_container(&mut sink, "map", &self.state).unwrap_err()
921                    }
922                    _ => err,
923                });
924        }
925        let rv = rv.and_then(|()| sink.finish(&mut self.state));
926        self.state.depth -= 1;
927        self.state.is_multimap = self
928            .sink_stack
929            .last()
930            .is_some_and(|(_, container)| container.is_multimap());
931        if self.sink_stack.is_empty() {
932            // the root sink is retained until the driver is dropped
933            self.root = Some(sink);
934        } else {
935            sink.release(&mut self.state);
936        }
937        rv
938    }
939
940    /// Ends an element that is built inline by the sink on top of the
941    /// stack.
942    ///
943    /// This behaves like ending the container of an element.
944    #[inline(always)]
945    fn end_inline(&mut self) -> Result<(), Error> {
946        let (sink, container) = self.sink_stack.last_mut().unwrap();
947        let Container::Inline(len) = *container else {
948            unreachable!()
949        };
950        *container = Container::Seq(true);
951        self.state.is_multimap = false;
952        let rv = sink.__private_inline_event(InlineEvent::End(len as usize), &mut self.state);
953        self.state.depth -= 1;
954        rv
955    }
956}
957
958/// Handles an atom of a map whose content is delivered (see
959/// [`Container::Content`]).
960///
961/// Returns `true` if the atom is the content.
962#[cold]
963#[inline(never)]
964fn content_atom(
965    state: &State,
966    is_key: &mut bool,
967    take: &mut bool,
968    found: &mut bool,
969    atom: &Atom<'_>,
970) -> Result<bool, Error> {
971    let was_key = *is_key;
972    *is_key = !was_key;
973    if was_key {
974        *take = match atom {
975            Atom::Str(key) | Atom::Lexical(key) => ContentKey::of(state) == Some(&**key),
976            _ => false,
977        };
978        return Ok(false);
979    }
980    if !core::mem::take(take) {
981        return Ok(false);
982    }
983    if core::mem::replace(found, true) {
984        return Err(Error::new(
985            ErrorKind::Unexpected,
986            "unexpected map with more than one content, expected a single value",
987        ));
988    }
989    Ok(true)
990}
991
992#[cold]
993fn content_container_error(is_key: bool) -> Error {
994    Error::new(
995        ErrorKind::Unexpected,
996        if is_key {
997            "unexpected map with a key that is not a single value, expected a single value"
998        } else {
999            "unexpected map whose content is not a single value, expected a single value"
1000        },
1001    )
1002}
1003
1004impl<'de> DriverCore<'de> {
1005    /// Drops the sinks and keeps the stack for the next driver.
1006    fn release(&mut self) {
1007        // sinks borrow from the sinks below them, drop them in inverse order
1008        while let Some((sink, _)) = self.sink_stack.pop() {
1009            sink.release(&mut self.state);
1010        }
1011        // the sinks are dropped before the state, the arena they are in is
1012        // only freed if they were dropped
1013        if let Some(root) = self.root.take() {
1014            root.release(&mut self.state);
1015        }
1016        let stack = core::mem::take(&mut self.sink_stack);
1017        self.state.arena.put_vec(Buffer::SinkStack, stack);
1018    }
1019}
1020
1021impl<'de> Drop for DriverCore<'de> {
1022    fn drop(&mut self) {
1023        self.release();
1024    }
1025}
1026
1027#[test]
1028fn test_arena_is_not_orphaned() {
1029    use crate::de::Recording;
1030    use crate::de::arena::ORPHANED;
1031    use alloc::collections::BTreeMap;
1032    use alloc::string::String;
1033
1034    let orphaned = ORPHANED.with(|x| x.get());
1035    // nested containers
1036    let mut out = None::<Vec<BTreeMap<String, Vec<u32>>>>;
1037    let mut driver = DeserializeDriver::new(&mut out);
1038    for event in [
1039        Event::seq_start(),
1040        Event::map_start(),
1041        "a".into(),
1042        Event::seq_start(),
1043        1u64.into(),
1044        Event::SeqEnd,
1045        Event::MapEnd,
1046        Event::SeqEnd,
1047    ] {
1048        driver.emit(event).unwrap();
1049    }
1050    drop(driver);
1051    assert_eq!(out.unwrap()[0]["a"], [1]);
1052
1053    // replayed (nested drivers)
1054    let mut recording = Recording::new();
1055    let mut driver = DeserializeDriver::from_fn(|state| recording.recorder(state));
1056    for event in [Event::seq_start(), 1u64.into(), 2u64.into(), Event::SeqEnd] {
1057        driver.emit(event).unwrap();
1058    }
1059    drop(driver);
1060    let mut driver_out = None::<()>;
1061    let mut driver = DeserializeDriver::new(&mut driver_out);
1062    let mut out = None::<Vec<u32>>;
1063    let state = driver.state_mut();
1064    recording
1065        .replay(Vec::<u32>::deserialize_into(&mut out, state), state)
1066        .unwrap();
1067    drop(driver);
1068    assert_eq!(out.unwrap(), [1, 2]);
1069
1070    // an error and an incomplete value
1071    let mut out = None::<Vec<Vec<u32>>>;
1072    let mut driver = DeserializeDriver::new(&mut out);
1073    driver.emit(Event::seq_start()).unwrap();
1074    driver.emit(Event::seq_start()).unwrap();
1075    assert!(driver.emit("not a number").is_err());
1076    drop(driver);
1077
1078    assert_eq!(ORPHANED.with(|x| x.get()), orphaned);
1079}
1080
1081#[test]
1082fn test_sink_outlives_state() {
1083    use crate::de::OwnedSink;
1084    use crate::de::arena::ORPHANED;
1085    use alloc::collections::BTreeMap;
1086    use alloc::string::String;
1087
1088    // the sink is in the arena of a temporary state, the arena is orphaned
1089    // and freed with the sink (miri checks that nothing leaks)
1090    let orphaned = ORPHANED.with(|x| x.get());
1091    let mut out = None::<Vec<BTreeMap<String, u32>>>;
1092    let mut driver = DeserializeDriver::from_sink(Vec::<BTreeMap<String, u32>>::deserialize_into(
1093        &mut out,
1094        &mut State::new(),
1095    ));
1096    assert_eq!(ORPHANED.with(|x| x.get()), orphaned + 1);
1097    for event in [
1098        Event::seq_start(),
1099        Event::map_start(),
1100        "a".into(),
1101        1u64.into(),
1102        Event::MapEnd,
1103        Event::SeqEnd,
1104    ] {
1105        driver.emit(event).unwrap();
1106    }
1107    drop(driver);
1108    assert_eq!(out.unwrap()[0]["a"], 1);
1109
1110    // an owned sink that is kept after its driver
1111    let mut driver_out = None::<()>;
1112    let mut driver = DeserializeDriver::new(&mut driver_out);
1113    let mut owned = OwnedSink::<Vec<u32>>::deserialize(driver.state_mut());
1114    drop(driver);
1115    assert_eq!(ORPHANED.with(|x| x.get()), orphaned + 2);
1116    let mut driver = DeserializeDriver::from_sink(SinkHandle::to(owned.borrow_mut()));
1117    for event in [Event::seq_start(), 1u64.into(), 2u64.into(), Event::SeqEnd] {
1118        driver.emit(event).unwrap();
1119    }
1120    drop(driver);
1121    assert_eq!(owned.take().unwrap(), [1, 2]);
1122    // dropped on another thread
1123    std::thread::spawn(move || drop(owned)).join().unwrap();
1124}
1125
1126#[test]
1127fn test_driver() {
1128    let mut out: Option<alloc::collections::BTreeMap<u32, String>> = None;
1129    {
1130        let mut driver = DeserializeDriver::new(&mut out);
1131        driver.emit(Event::map_start()).unwrap();
1132        driver.emit(1u64).unwrap();
1133        driver.emit("Hello").unwrap();
1134        driver.emit(2u64).unwrap();
1135        driver.emit("World").unwrap();
1136        driver.emit(Event::MapEnd).unwrap();
1137    }
1138
1139    let map = out.unwrap();
1140    assert_eq!(map[&1], "Hello");
1141    assert_eq!(map[&2], "World");
1142}