1
/// Deserialization module.
2
use alloc::{
3
    borrow::ToOwned,
4
    string::{String, ToString},
5
    vec::Vec,
6
};
7
use core::str;
8

            
9
use serde::{
10
    de::{self, DeserializeSeed, Deserializer as _, Visitor},
11
    Deserialize,
12
};
13

            
14
pub use crate::error::{Error, Position, Span, SpannedError};
15
use crate::{
16
    error::{Result, SpannedResult},
17
    extensions::Extensions,
18
    options::Options,
19
    parse::{NewtypeMode, ParsedByteStr, ParsedStr, Parser, StructType, TupleMode},
20
    value::NumberDeserializer,
21
};
22

            
23
#[cfg(feature = "std")]
24
use std::io;
25

            
26
mod id;
27
mod tag;
28
#[cfg(test)]
29
mod tests;
30
mod value;
31

            
32
/// The RON deserializer.
33
///
34
/// If you just want to simply deserialize a value,
35
/// you can use the [`from_str`] convenience function.
36
pub struct Deserializer<'de> {
37
    pub(crate) parser: Parser<'de>,
38
    newtype_variant: bool,
39
    serde_content_newtype: bool,
40
    last_identifier: Option<&'de str>,
41
    recursion_limit: Option<usize>,
42
}
43

            
44
impl<'de> Deserializer<'de> {
45
    // Cannot implement trait here since output is tied to input lifetime 'de.
46
    #[allow(clippy::should_implement_trait)]
47
43766
    pub fn from_str(input: &'de str) -> SpannedResult<Self> {
48
43766
        Self::from_str_with_options(input, &Options::default())
49
43766
    }
50

            
51
310
    pub fn from_bytes(input: &'de [u8]) -> SpannedResult<Self> {
52
310
        Self::from_bytes_with_options(input, &Options::default())
53
310
    }
54

            
55
676362
    pub fn from_str_with_options(input: &'de str, options: &Options) -> SpannedResult<Self> {
56
675466
        let mut deserializer = Deserializer {
57
676362
            parser: Parser::new(input)?,
58
            newtype_variant: false,
59
            serde_content_newtype: false,
60
675466
            last_identifier: None,
61
675466
            recursion_limit: options.recursion_limit,
62
        };
63

            
64
675466
        deserializer.parser.exts |= options.default_extensions;
65

            
66
675466
        Ok(deserializer)
67
676362
    }
68

            
69
    // FIXME: panic is not actually possible, remove once utf8_chunks is stabilized
70
    #[allow(clippy::missing_panics_doc)]
71
5782
    pub fn from_bytes_with_options(input: &'de [u8], options: &Options) -> SpannedResult<Self> {
72
5782
        let err = match str::from_utf8(input) {
73
5162
            Ok(input) => return Self::from_str_with_options(input, options),
74
620
            Err(err) => err,
75
        };
76

            
77
        // FIXME: use [`utf8_chunks`](https://github.com/rust-lang/rust/issues/99543) once stabilised
78
        #[allow(clippy::expect_used)]
79
620
        let valid_input =
80
620
            str::from_utf8(&input[..err.valid_up_to()]).expect("source is valid up to error");
81

            
82
620
        Err(SpannedError {
83
620
            code: err.into(),
84
620
            span: Span {
85
620
                start: Position { line: 1, col: 1 },
86
620
                end: Position::from_src_end(valid_input),
87
620
            },
88
620
        })
89
5782
    }
90

            
91
    #[must_use]
92
8
    pub fn remainder(&self) -> &'de str {
93
8
        self.parser.src()
94
8
    }
95

            
96
    #[must_use]
97
133236
    pub fn span_error(&self, code: Error) -> SpannedError {
98
133236
        self.parser.span_error(code)
99
133236
    }
100

            
101
    #[must_use]
102
29760
    pub fn extensions(&self) -> Extensions {
103
29760
        self.parser.exts
104
29760
    }
105
}
106

            
107
/// A convenience function for building a deserializer
108
/// and deserializing a value of type `T` from a reader.
109
#[cfg(feature = "std")]
110
350
pub fn from_reader<R, T>(rdr: R) -> SpannedResult<T>
111
350
where
112
350
    R: io::Read,
113
350
    T: de::DeserializeOwned,
114
{
115
350
    Options::default().from_reader(rdr)
116
350
}
117

            
118
/// A convenience function for building a deserializer
119
/// and deserializing a value of type `T` from a string.
120
8680
pub fn from_str<'a, T>(s: &'a str) -> SpannedResult<T>
121
8680
where
122
8680
    T: de::Deserialize<'a>,
123
{
124
8680
    Options::default().from_str(s)
125
8680
}
126

            
127
/// A convenience function for building a deserializer
128
/// and deserializing a value of type `T` from bytes.
129
366
pub fn from_bytes<'a, T>(s: &'a [u8]) -> SpannedResult<T>
130
366
where
131
366
    T: de::Deserialize<'a>,
132
{
133
366
    Options::default().from_bytes(s)
134
366
}
135

            
136
/// A convenience function for deserializing a value of type `T`
137
/// from a [`Value`](crate::Value).
138
///
139
/// Unlike the other convenience functions this returns a plain [`Error`]
140
/// rather than a [`SpannedError`], since an in-memory [`Value`](crate::Value)
141
/// has no source text to point a span into.
142
12
pub fn from_value<T>(value: crate::Value) -> Result<T>
143
12
where
144
12
    T: de::DeserializeOwned,
145
{
146
12
    value.into_rust()
147
12
}
148

            
149
macro_rules! guard_recursion {
150
    ($self:expr => $expr:expr) => {{
151
        if let Some(limit) = &mut $self.recursion_limit {
152
            if let Some(new_limit) = limit.checked_sub(1) {
153
                *limit = new_limit;
154
            } else {
155
                return Err(Error::ExceededRecursionLimit);
156
            }
157
        }
158

            
159
        let result = $expr;
160

            
161
        if let Some(limit) = &mut $self.recursion_limit {
162
            *limit = limit.saturating_add(1);
163
        }
164

            
165
        result
166
    }};
167
}
168

            
169
impl<'de> Deserializer<'de> {
170
    /// Check if the remaining bytes are whitespace only,
171
    /// otherwise return an error.
172
541304
    pub fn end(&mut self) -> Result<()> {
173
541304
        self.parser.skip_ws()?;
174

            
175
540684
        if self.parser.src().is_empty() {
176
533546
            Ok(())
177
        } else {
178
7138
            Err(Error::TrailingCharacters)
179
        }
180
541304
    }
181

            
182
    /// Called from [`deserialize_any`][serde::Deserializer::deserialize_any]
183
    /// when a struct was detected. Decides if there is a unit, tuple or usual
184
    /// struct and deserializes it accordingly.
185
    ///
186
    /// This method assumes there is no identifier left.
187
25755
    fn handle_any_struct<V>(&mut self, visitor: V, ident: Option<&str>) -> Result<V::Value>
188
25755
    where
189
25755
        V: Visitor<'de>,
190
    {
191
        // HACK: switch to JSON enum semantics for JSON content
192
        // Robust impl blocked on https://github.com/serde-rs/serde/issues/1183
193
25755
        let is_serde_content =
194
25755
            is_serde_content::<V::Value>() || is_serde_tag_or_content::<V::Value>();
195

            
196
25755
        let old_serde_content_newtype = self.serde_content_newtype;
197
25755
        self.serde_content_newtype = false;
198

            
199
        match (
200
25755
            self.parser.check_struct_type(
201
25755
                NewtypeMode::NoParensMeanUnit,
202
25755
                if old_serde_content_newtype {
203
615
                    TupleMode::DifferentiateNewtype // separate match on NewtypeOrTuple below
204
                } else {
205
25140
                    TupleMode::ImpreciseTupleOrNewtype // Tuple and NewtypeOrTuple match equally
206
                },
207
47
            )?,
208
25708
            ident,
209
        ) {
210
64
            (StructType::Unit, Some(ident)) if is_serde_content => {
211
                // serde's Content type needs the ident for unit variants
212
64
                visitor.visit_str(ident)
213
            }
214
8064
            (StructType::Unit, _) => visitor.visit_unit(),
215
627
            (_, Some(ident)) if is_serde_content => {
216
                // serde's Content type uses a singleton map encoding for enums
217
627
                guard_recursion! { self =>
218
623
                    visitor.visit_map(SerdeEnumContent {
219
623
                        de: &mut *self,
220
623
                        ident: Some(ident),
221
623
                    })
222
                }
223
            }
224
            (StructType::Named, _) => {
225
                // giving no name results in worse errors but is necessary here
226
7975
                self.handle_struct_after_name("", visitor)
227
            }
228
508
            (StructType::NewtypeTuple, _) if old_serde_content_newtype => {
229
                // deserialize a newtype struct or variant
230
508
                self.parser.consume_char('(');
231
508
                self.parser.skip_ws()?;
232
508
                let value = guard_recursion! { self => self.deserialize_any(visitor)? };
233
252
                self.parser.comma()?;
234

            
235
252
                if self.parser.consume_char(')') {
236
252
                    Ok(value)
237
                } else {
238
                    Err(Error::ExpectedStructLikeEnd)
239
                }
240
            }
241
            (
242
                StructType::AnyTuple
243
                | StructType::EmptyTuple
244
                | StructType::NewtypeTuple
245
                | StructType::NonNewtypeTuple,
246
                _,
247
            ) => {
248
                // first argument is technically incorrect, but ignored anyway
249
8470
                self.deserialize_tuple(0, visitor)
250
            }
251
        }
252
25755
    }
253

            
254
9930294
    fn handle_float_range_or_value<V>(
255
9930294
        &mut self,
256
9930294
        number: crate::value::Number,
257
9930294
        visitor: V,
258
9930294
    ) -> Result<V::Value>
259
9930294
    where
260
9930294
        V: Visitor<'de>,
261
    {
262
9930294
        if self.parser.consume_str("..=") {
263
310
            let end = self.parser.any_number()?;
264
310
            return visitor.visit_map(RangeMapAccess::new(number, end, "end", self.parser.exts));
265
9929984
        } else if self.parser.consume_str("..") {
266
1562
            if !self.parser.check_any_number_start() {
267
4
                return visitor.visit_map(RangeFromMapAccess::new(number, self.parser.exts));
268
1558
            }
269
1558
            let end = self.parser.any_number()?;
270
1558
            return visitor.visit_map(RangeMapAccess::new(number, end, "end", self.parser.exts));
271
9928422
        }
272
9928422
        number.visit(visitor)
273
9930294
    }
274

            
275
    /// Called from
276
    /// [`deserialize_struct`][serde::Deserializer::deserialize_struct],
277
    /// [`struct_variant`][serde::de::VariantAccess::struct_variant], and
278
    /// [`handle_any_struct`][Self::handle_any_struct]. Handles
279
    /// deserialising the enclosing parentheses and everything in between.
280
    ///
281
    /// This method assumes there is no struct name identifier left.
282
9494
    fn handle_struct_after_name<V>(
283
9494
        &mut self,
284
9494
        name_for_pretty_errors_only: &'static str,
285
9494
        visitor: V,
286
9494
    ) -> Result<V::Value>
287
9494
    where
288
9494
        V: Visitor<'de>,
289
    {
290
9494
        if self.newtype_variant || self.parser.consume_char('(') {
291
9466
            let old_newtype_variant = self.newtype_variant;
292
9466
            self.newtype_variant = false;
293

            
294
9466
            let value = guard_recursion! { self =>
295
9466
                visitor
296
9466
                    .visit_map(CommaSeparated::new(Terminator::Struct, self))
297
9466
                    .map_err(|err| {
298
984
                        struct_error_name(
299
984
                            err,
300
984
                            if !old_newtype_variant && !name_for_pretty_errors_only.is_empty() {
301
259
                                Some(name_for_pretty_errors_only)
302
                            } else {
303
725
                                None
304
                            },
305
                        )
306
984
                    })?
307
            };
308

            
309
8482
            self.parser.skip_ws()?;
310

            
311
8482
            if old_newtype_variant || self.parser.consume_char(')') {
312
8470
                Ok(value)
313
            } else {
314
12
                Err(Error::ExpectedStructLikeEnd)
315
            }
316
28
        } else if name_for_pretty_errors_only.is_empty() {
317
4
            Err(Error::ExpectedStructLike)
318
        } else {
319
24
            Err(Error::ExpectedNamedStructLike(name_for_pretty_errors_only))
320
        }
321
9494
    }
322
}
323

            
324
impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
325
    type Error = Error;
326

            
327
10083054
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
328
10083054
    where
329
10083054
        V: Visitor<'de>,
330
    {
331
10083054
        if self.newtype_variant {
332
2520
            if self.parser.check_char(')') {
333
                // newtype variant wraps the unit type / a unit struct without name
334
310
                return self.deserialize_unit(visitor);
335
2210
            }
336

            
337
            #[allow(clippy::wildcard_in_or_patterns)]
338
2210
            match self
339
2210
                .parser
340
2210
                .check_struct_type(NewtypeMode::InsideNewtype, TupleMode::DifferentiateNewtype)?
341
            {
342
                StructType::Named => {
343
                    // newtype variant wraps a named struct
344
                    // giving no name results in worse errors but is necessary here
345
310
                    return self.handle_struct_after_name("", visitor);
346
                }
347
                StructType::EmptyTuple | StructType::NonNewtypeTuple => {
348
                    // newtype variant wraps a tuple (struct)
349
                    // first argument is technically incorrect, but ignored anyway
350
310
                    return self.deserialize_tuple(0, visitor);
351
                }
352
                // StructType::Unit is impossible with NewtypeMode::InsideNewtype
353
                // StructType::AnyTuple is impossible with TupleMode::DifferentiateNewtype
354
1590
                StructType::NewtypeTuple | _ => {
355
1590
                    // continue as usual with the inner content of the newtype variant
356
1590
                    self.newtype_variant = false;
357
1590
                }
358
            }
359
10080534
        }
360

            
361
10082124
        if self.parser.consume_ident("true") {
362
1605
            return visitor.visit_bool(true);
363
10080519
        } else if self.parser.consume_ident("false") {
364
1255
            return visitor.visit_bool(false);
365
10079264
        } else if self.parser.check_ident("Some") {
366
4730
            return self.deserialize_option(visitor);
367
10074534
        } else if self.parser.consume_ident("None") {
368
5588
            return visitor.visit_none();
369
10068946
        } else if self.parser.consume_unit()? {
370
2298
            return visitor.visit_unit();
371
10066644
        } else if self.parser.consume_ident("inf") || self.parser.consume_ident("inff32") {
372
2798
            let number = crate::value::Number::F32(crate::value::F32(core::f32::INFINITY));
373
2798
            return self.handle_float_range_or_value(number, visitor);
374
10063846
        } else if self.parser.consume_ident("inff64") {
375
1240
            let number = crate::value::Number::F64(crate::value::F64(core::f64::INFINITY));
376
1240
            return self.handle_float_range_or_value(number, visitor);
377
10062606
        } else if self.parser.consume_ident("NaN") || self.parser.consume_ident("NaNf32") {
378
2178
            let number = crate::value::Number::F32(crate::value::F32(core::f32::NAN));
379
2178
            return self.handle_float_range_or_value(number, visitor);
380
10060428
        } else if self.parser.consume_ident("NaNf64") {
381
620
            let number = crate::value::Number::F64(crate::value::F64(core::f64::NAN));
382
620
            return self.handle_float_range_or_value(number, visitor);
383
10059808
        }
384

            
385
        // `skip_identifier` does not change state if it fails
386
10059808
        if let Some(ident) = self.parser.skip_identifier() {
387
11255
            self.parser.skip_ws()?;
388

            
389
11255
            return self.handle_any_struct(visitor, Some(ident));
390
10048553
        }
391

            
392
10048553
        match self.parser.peek_char_or_eof()? {
393
14500
            '(' => self.handle_any_struct(visitor, None),
394
7772
            '[' => self.deserialize_seq(visitor),
395
82494
            '{' => self.deserialize_map(visitor),
396
9678987
            '0'..='9' | '+' | '-' | '.' | 'b' => {
397
9930191
                if self.parser.check_char('b') && !self.parser.src().starts_with("b'") {
398
2524
                    return self.deserialize_byte_buf(visitor);
399
9927667
                }
400

            
401
9927667
                if self.parser.check_str("..=") {
402
310
                    self.parser.consume_str("..=");
403
310
                    let end = self.parser.any_number()?;
404
310
                    return visitor.visit_map(RangeToMapAccess::new(end, "end", self.parser.exts));
405
9927357
                }
406

            
407
9927357
                if self.parser.consume_str("..") {
408
1574
                    if self.parser.check_any_number_start() {
409
938
                        let end = self.parser.any_number()?;
410
938
                        return visitor.visit_map(RangeToMapAccess::new(
411
938
                            end,
412
                            "end",
413
938
                            self.parser.exts,
414
                        ));
415
636
                    }
416
636
                    return visitor.visit_unit();
417
9925783
                }
418

            
419
9925783
                let start = self.parser.any_number()?;
420

            
421
9923458
                self.handle_float_range_or_value(start, visitor)
422
            }
423
8576
            '"' | 'r' => self.deserialize_string(visitor),
424
2846
            '\'' => self.deserialize_char(visitor),
425
934
            other => Err(Error::UnexpectedChar(other)),
426
        }
427
10083054
    }
428

            
429
643
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
430
643
    where
431
643
        V: Visitor<'de>,
432
    {
433
643
        visitor.visit_bool(self.parser.bool()?)
434
643
    }
435

            
436
92
    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
437
92
    where
438
92
        V: Visitor<'de>,
439
    {
440
92
        visitor.visit_i8(self.parser.integer()?)
441
92
    }
442

            
443
56
    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
444
56
    where
445
56
        V: Visitor<'de>,
446
    {
447
56
        visitor.visit_i16(self.parser.integer()?)
448
56
    }
449

            
450
1209
    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
451
1209
    where
452
1209
        V: Visitor<'de>,
453
    {
454
1209
        visitor.visit_i32(self.parser.integer()?)
455
1209
    }
456

            
457
118
    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
458
118
    where
459
118
        V: Visitor<'de>,
460
    {
461
118
        visitor.visit_i64(self.parser.integer()?)
462
118
    }
463

            
464
    #[cfg(feature = "integer128")]
465
32
    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
466
32
    where
467
32
        V: Visitor<'de>,
468
    {
469
32
        visitor.visit_i128(self.parser.integer()?)
470
32
    }
471

            
472
23628
    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
473
23628
    where
474
23628
        V: Visitor<'de>,
475
    {
476
23628
        visitor.visit_u8(self.parser.integer()?)
477
23628
    }
478

            
479
56
    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
480
56
    where
481
56
        V: Visitor<'de>,
482
    {
483
56
        visitor.visit_u16(self.parser.integer()?)
484
56
    }
485

            
486
525
    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
487
525
    where
488
525
        V: Visitor<'de>,
489
    {
490
525
        visitor.visit_u32(self.parser.integer()?)
491
525
    }
492

            
493
62
    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
494
62
    where
495
62
        V: Visitor<'de>,
496
    {
497
62
        visitor.visit_u64(self.parser.integer()?)
498
62
    }
499

            
500
    #[cfg(feature = "integer128")]
501
38
    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
502
38
    where
503
38
        V: Visitor<'de>,
504
    {
505
38
        visitor.visit_u128(self.parser.integer()?)
506
38
    }
507

            
508
717
    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
509
717
    where
510
717
        V: Visitor<'de>,
511
    {
512
717
        visitor.visit_f32(self.parser.float()?)
513
717
    }
514

            
515
304
    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
516
304
    where
517
304
        V: Visitor<'de>,
518
    {
519
304
        visitor.visit_f64(self.parser.float()?)
520
304
    }
521

            
522
3596
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
523
3596
    where
524
3596
        V: Visitor<'de>,
525
    {
526
3596
        visitor.visit_char(self.parser.char()?)
527
3596
    }
528

            
529
9971
    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
530
9971
    where
531
9971
        V: Visitor<'de>,
532
    {
533
9971
        match self.parser.string()? {
534
1086
            ParsedStr::Allocated(s) => visitor.visit_string(s),
535
8786
            ParsedStr::Slice(s) => visitor.visit_borrowed_str(s),
536
        }
537
9971
    }
538

            
539
9098
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
540
9098
    where
541
9098
        V: Visitor<'de>,
542
    {
543
9098
        self.deserialize_str(visitor)
544
9098
    }
545

            
546
20
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
547
20
    where
548
20
        V: Visitor<'de>,
549
    {
550
20
        self.deserialize_byte_buf(visitor)
551
20
    }
552

            
553
2664
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
554
2664
    where
555
2664
        V: Visitor<'de>,
556
    {
557
2664
        if self.parser.check_char('[') {
558
4
            let bytes = Vec::<u8>::deserialize(self)?;
559
4
            return visitor.visit_byte_buf(bytes);
560
2660
        }
561

            
562
2660
        match self.parser.byte_string()? {
563
676
            ParsedByteStr::Allocated(byte_buf) => visitor.visit_byte_buf(byte_buf),
564
1948
            ParsedByteStr::Slice(bytes) => visitor.visit_borrowed_bytes(bytes),
565
        }
566
2664
    }
567

            
568
5218
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
569
5218
    where
570
5218
        V: Visitor<'de>,
571
    {
572
5218
        if self.parser.consume_ident("None") {
573
116
            visitor.visit_none()
574
5102
        } else if self.parser.consume_ident("Some") {
575
4930
            self.parser.skip_ws()?;
576

            
577
            // `Some` without its parentheses must not fall through to
578
            // `implicit_some`, which would silently drop the consumed `Some`
579
4930
            if !self.parser.consume_char('(') {
580
322
                return Err(Error::ExpectedOption);
581
4608
            }
582

            
583
4608
            self.parser.skip_ws()?;
584

            
585
4608
            self.newtype_variant = self
586
4608
                .parser
587
4608
                .exts
588
4608
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
589

            
590
4608
            let v = guard_recursion! { self => visitor.visit_some(&mut *self)? };
591

            
592
4604
            self.newtype_variant = false;
593

            
594
4604
            self.parser.comma()?;
595

            
596
4604
            if self.parser.consume_char(')') {
597
4290
                Ok(v)
598
            } else {
599
314
                Err(Error::ExpectedOptionEnd)
600
            }
601
172
        } else if self.parser.exts.contains(Extensions::IMPLICIT_SOME) {
602
168
            guard_recursion! { self => visitor.visit_some(&mut *self) }
603
        } else {
604
4
            Err(Error::ExpectedOption)
605
        }
606
5218
    }
607

            
608
    // In Serde, unit means an anonymous value containing no data.
609
562
    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
610
562
    where
611
562
        V: Visitor<'de>,
612
    {
613
562
        if self.newtype_variant || self.parser.consume_unit()? {
614
550
            self.newtype_variant = false;
615

            
616
550
            visitor.visit_unit()
617
        } else {
618
8
            Err(Error::ExpectedUnit)
619
        }
620
562
    }
621

            
622
204
    fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
623
204
    where
624
204
        V: Visitor<'de>,
625
    {
626
204
        if name == "RangeFull" && self.parser.consume_str("..") {
627
            return visitor.visit_unit();
628
204
        }
629

            
630
204
        if self.newtype_variant || self.parser.consume_struct_name(name)? {
631
56
            self.newtype_variant = false;
632

            
633
56
            visitor.visit_unit()
634
        } else {
635
128
            self.deserialize_unit(visitor)
636
        }
637
204
    }
638

            
639
27946
    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
640
27946
    where
641
27946
        V: Visitor<'de>,
642
    {
643
27946
        if name == crate::value::raw::RAW_VALUE_TOKEN {
644
27468
            let src_before = self.parser.pre_ws_src();
645
27468
            let is_nested = !self.parser.is_at_start();
646
27468
            self.parser.skip_ws()?;
647
27468
            let _ignored = self.deserialize_ignored_any(de::IgnoredAny)?;
648
25914
            let src_value_end = self.parser.src();
649
25914
            self.parser.skip_ws()?;
650
25914
            let src_after = self.parser.src();
651

            
652
25914
            if self.parser.has_unclosed_line_comment() {
653
1558
                return Err(Error::UnclosedLineComment);
654
24356
            }
655

            
656
24356
            let ron_str = if is_nested {
657
128
                trim_raw_value_whitespace(src_before, src_value_end, src_after)
658
            } else {
659
24228
                &src_before[..src_before.len() - src_after.len()]
660
            };
661

            
662
24356
            return visitor
663
24356
                .visit_borrowed_str::<Error>(ron_str)
664
24356
                .map_err(|_| Error::ExpectedRawValue);
665
478
        }
666

            
667
478
        if self.parser.exts.contains(Extensions::UNWRAP_NEWTYPES) || self.newtype_variant {
668
148
            self.newtype_variant = false;
669

            
670
148
            return guard_recursion! { self => visitor.visit_newtype_struct(&mut *self) };
671
330
        }
672

            
673
330
        self.parser.consume_struct_name(name)?;
674

            
675
303
        self.parser.skip_ws()?;
676

            
677
303
        if self.parser.consume_char('(') {
678
276
            self.parser.skip_ws()?;
679
276
            let value = guard_recursion! { self => visitor.visit_newtype_struct(&mut *self)? };
680
276
            self.parser.comma()?;
681

            
682
276
            if self.parser.consume_char(')') {
683
272
                Ok(value)
684
            } else {
685
4
                Err(Error::ExpectedStructLikeEnd)
686
            }
687
27
        } else if name.is_empty() {
688
12
            Err(Error::ExpectedStructLike)
689
        } else {
690
15
            Err(Error::ExpectedNamedStructLike(name))
691
        }
692
27946
    }
693

            
694
11691
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
695
11691
    where
696
11691
        V: Visitor<'de>,
697
    {
698
11691
        self.newtype_variant = false;
699

            
700
11691
        if self.parser.consume_char('[') {
701
11679
            let value = guard_recursion! { self =>
702
11679
                visitor.visit_seq(CommaSeparated::new(Terminator::Seq, self))?
703
            };
704
11040
            self.parser.skip_ws()?;
705

            
706
11040
            if self.parser.consume_char(']') {
707
11028
                Ok(value)
708
            } else {
709
12
                Err(Error::ExpectedArrayEnd)
710
            }
711
        } else {
712
12
            Err(Error::ExpectedArray)
713
        }
714
11691
    }
715

            
716
9277
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
717
9277
    where
718
9277
        V: Visitor<'de>,
719
    {
720
9277
        if self.newtype_variant || self.parser.consume_char('(') {
721
9221
            let old_newtype_variant = self.newtype_variant;
722
9221
            self.newtype_variant = false;
723

            
724
9221
            let value = guard_recursion! { self =>
725
9221
                visitor.visit_seq(CommaSeparated::new(Terminator::Tuple, self))?
726
            };
727
8238
            self.parser.skip_ws()?;
728

            
729
8238
            if old_newtype_variant || self.parser.consume_char(')') {
730
8226
                Ok(value)
731
            } else {
732
12
                Err(Error::ExpectedStructLikeEnd)
733
            }
734
        } else {
735
56
            Err(Error::ExpectedStructLike)
736
        }
737
9277
    }
738

            
739
235
    fn deserialize_tuple_struct<V>(
740
235
        self,
741
235
        name: &'static str,
742
235
        len: usize,
743
235
        visitor: V,
744
235
    ) -> Result<V::Value>
745
235
    where
746
235
        V: Visitor<'de>,
747
    {
748
235
        if !self.newtype_variant {
749
219
            self.parser.consume_struct_name(name)?;
750
16
        }
751

            
752
208
        self.parser.skip_ws()?;
753

            
754
208
        self.deserialize_tuple(len, visitor).map_err(|e| match e {
755
24
            Error::ExpectedStructLike if !name.is_empty() => Error::ExpectedNamedStructLike(name),
756
24
            e => e,
757
36
        })
758
235
    }
759

            
760
82917
    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
761
82917
    where
762
82917
        V: Visitor<'de>,
763
    {
764
        struct VisitorExpecting<V>(V);
765
        impl<'de, V: Visitor<'de>> core::fmt::Display for VisitorExpecting<&'_ V> {
766
82917
            fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
767
82917
                self.0.expecting(fmt)
768
82917
            }
769
        }
770

            
771
82917
        self.newtype_variant = false;
772

            
773
        // TODO: Avoid allocating to perform this check.
774
82917
        let serde_flatten_canary = VisitorExpecting(&visitor)
775
82917
            .to_string()
776
82917
            .starts_with("struct ");
777

            
778
82917
        let terminator = if serde_flatten_canary {
779
276
            Terminator::MapAsStruct
780
        } else {
781
82641
            Terminator::Map
782
        };
783

            
784
82917
        if self.parser.consume_char('{') {
785
82905
            let value = guard_recursion! { self =>
786
81665
                visitor.visit_map(CommaSeparated::new(terminator, self))?
787
            };
788
2730
            self.parser.skip_ws()?;
789

            
790
2730
            if self.parser.consume_char('}') {
791
2718
                Ok(value)
792
            } else {
793
12
                Err(Error::ExpectedMapEnd)
794
            }
795
        } else {
796
12
            Err(Error::ExpectedMap)
797
        }
798
82917
    }
799

            
800
1228
    fn deserialize_struct<V>(
801
1228
        self,
802
1228
        name: &'static str,
803
1228
        fields: &'static [&'static str],
804
1228
        visitor: V,
805
1228
    ) -> Result<V::Value>
806
1228
    where
807
1228
        V: Visitor<'de>,
808
    {
809
        // `RangeInclusive` used `last` as field name before it was renamed to `end` in a newer Rust version
810
1228
        if (name == "Range" && fields == ["start", "end"])
811
1140
            || (name == "RangeInclusive" && matches!(fields, ["start", "end" | "last"]))
812
        {
813
124
            let end_field = fields[1];
814
124
            if self.parser.check_any_number_start() {
815
72
                let start = self.parser.any_number()?;
816

            
817
72
                let inclusive = if self.parser.consume_str("..=") {
818
20
                    true
819
52
                } else if self.parser.consume_str("..") {
820
52
                    false
821
                } else {
822
                    return Err(Error::ExpectedRangeSyntax);
823
                };
824

            
825
72
                if inclusive && name == "Range" {
826
                    return Err(Error::Message(String::from(
827
                        "expected `..` for `Range`, found `..=`",
828
                    )));
829
72
                }
830
72
                if !inclusive && name == "RangeInclusive" {
831
                    return Err(Error::Message(String::from(
832
                        "expected `..=` for `RangeInclusive`, found `..`",
833
                    )));
834
72
                }
835

            
836
72
                let end = self.parser.any_number()?;
837
72
                return visitor.visit_map(RangeMapAccess::new(
838
72
                    start,
839
72
                    end,
840
72
                    end_field,
841
72
                    self.parser.exts,
842
                ));
843
52
            }
844
1104
        }
845

            
846
1156
        if fields == ["start"] && name == "RangeFrom" && self.parser.check_any_number_start() {
847
28
            let start = self.parser.any_number()?;
848
28
            if self.parser.consume_str("..=") {
849
                return Err(Error::Message(String::from(
850
                    "expected `..` for `RangeFrom`, found `..=`",
851
                )));
852
28
            } else if !self.parser.consume_str("..") {
853
                return Err(Error::ExpectedRangeSyntax);
854
28
            }
855
28
            return visitor.visit_map(RangeFromMapAccess::new(start, self.parser.exts));
856
1128
        }
857

            
858
1128
        if fields == ["end"]
859
32
            && name == "RangeTo"
860
24
            && (self.parser.check_str("..=") || self.parser.check_str(".."))
861
        {
862
12
            if self.parser.consume_str("..=") {
863
                return Err(Error::Message(String::from(
864
                    "expected `..` for `RangeTo`, found `..=`",
865
                )));
866
12
            }
867
12
            self.parser.consume_str("..");
868
12
            let end = self.parser.any_number()?;
869
12
            return visitor.visit_map(RangeToMapAccess::new(end, "end", self.parser.exts));
870
1116
        }
871

            
872
        // `last` is the old field name for `RangeToInclusive`, replaced by `end` in a newer Rust version
873
1116
        if matches!(fields, ["end" | "last"])
874
20
            && name == "RangeToInclusive"
875
8
            && (self.parser.check_str("..=") || self.parser.check_str(".."))
876
        {
877
            if !self.parser.consume_str("..=") {
878
                self.parser.consume_str("..");
879
                return Err(Error::Message(String::from(
880
                    "expected `..=` for `RangeToInclusive`, found `..`",
881
                )));
882
            }
883
            let end = self.parser.any_number()?;
884
            return visitor.visit_map(RangeToMapAccess::new(end, fields[0], self.parser.exts));
885
1116
        }
886

            
887
1116
        if !self.newtype_variant {
888
1047
            self.parser.consume_struct_name(name)?;
889
69
        }
890

            
891
1080
        self.parser.skip_ws()?;
892

            
893
1080
        self.handle_struct_after_name(name, visitor)
894
1228
    }
895

            
896
1096
    fn deserialize_enum<V>(
897
1096
        self,
898
1096
        name: &'static str,
899
1096
        _variants: &'static [&'static str],
900
1096
        visitor: V,
901
1096
    ) -> Result<V::Value>
902
1096
    where
903
1096
        V: Visitor<'de>,
904
    {
905
1096
        self.newtype_variant = false;
906

            
907
1096
        match guard_recursion! { self => visitor.visit_enum(Enum::new(self)) } {
908
831
            Ok(value) => Ok(value),
909
            Err(Error::NoSuchEnumVariant {
910
18
                expected,
911
18
                found,
912
                outer: None,
913
18
            }) if !name.is_empty() => Err(Error::NoSuchEnumVariant {
914
18
                expected,
915
18
                found,
916
18
                outer: Some(String::from(name)),
917
18
            }),
918
247
            Err(e) => Err(e),
919
        }
920
1096
    }
921

            
922
16092
    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
923
16092
    where
924
16092
        V: Visitor<'de>,
925
    {
926
16092
        let identifier = self.parser.identifier()?;
927

            
928
16024
        self.last_identifier = Some(identifier);
929

            
930
16024
        visitor.visit_borrowed_str(identifier)
931
16092
    }
932

            
933
66574
    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
934
66574
    where
935
66574
        V: Visitor<'de>,
936
    {
937
66574
        self.deserialize_any(visitor)
938
66574
    }
939
}
940

            
941
enum Terminator {
942
    Map,
943
    MapAsStruct,
944
    Tuple,
945
    Struct,
946
    Seq,
947
}
948

            
949
impl Terminator {
950
10290874
    fn as_char(&self) -> char {
951
10290874
        match self {
952
179110
            Terminator::Map | Terminator::MapAsStruct => '}',
953
441316
            Terminator::Tuple | Terminator::Struct => ')',
954
9670448
            Terminator::Seq => ']',
955
        }
956
10290874
    }
957
}
958

            
959
struct CommaSeparated<'a, 'de: 'a> {
960
    de: &'a mut Deserializer<'de>,
961
    terminator: Terminator,
962
    had_comma: bool,
963
    inside_internally_tagged_enum: bool,
964
}
965

            
966
impl<'a, 'de> CommaSeparated<'a, 'de> {
967
303926
    fn new(terminator: Terminator, de: &'a mut Deserializer<'de>) -> Self {
968
303926
        CommaSeparated {
969
303926
            de,
970
303926
            terminator,
971
303926
            had_comma: true,
972
303926
            inside_internally_tagged_enum: false,
973
303926
        }
974
303926
    }
975

            
976
10290874
    fn has_element(&mut self) -> Result<bool> {
977
10290874
        self.de.parser.skip_ws()?;
978

            
979
10290874
        match (
980
10290874
            self.had_comma,
981
10290874
            !self.de.parser.check_char(self.terminator.as_char()),
982
10290874
        ) {
983
            // Trailing comma, maybe has a next element
984
10193249
            (true, has_element) => Ok(has_element),
985
            // No trailing comma but terminator
986
95139
            (false, false) => Ok(false),
987
            // No trailing comma or terminator
988
2486
            (false, true) => Err(Error::ExpectedComma),
989
        }
990
10290874
    }
991
}
992

            
993
enum RangeMapState {
994
    StartKey,
995
    StartValue,
996
    EndKey,
997
    EndValue,
998
    Done,
999
}
struct RangeMapAccess {
    start: crate::value::Number,
    end: crate::value::Number,
    state: RangeMapState,
    end_key: &'static str,
    exts: Extensions,
}
impl RangeMapAccess {
8060
    fn new(
8060
        start: crate::value::Number,
8060
        end: crate::value::Number,
8060
        end_key: &'static str,
8060
        exts: Extensions,
8060
    ) -> Self {
8060
        RangeMapAccess {
8060
            start,
8060
            end,
8060
            state: RangeMapState::StartKey,
8060
            end_key,
8060
            exts,
8060
        }
8060
    }
}
impl<'de> de::MapAccess<'de> for RangeMapAccess {
    type Error = Error;
5796
    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
5796
        match self.state {
            RangeMapState::StartKey => {
1940
                self.state = RangeMapState::StartValue;
1940
                seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
1940
                    .map(Some)
            }
            RangeMapState::EndKey => {
1928
                self.state = RangeMapState::EndValue;
1928
                seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
1928
                    .map(Some)
            }
1928
            _ => Ok(None),
        }
5796
    }
3868
    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
3868
        match self.state {
            RangeMapState::StartValue => {
1940
                self.state = RangeMapState::EndKey;
1940
                seed.deserialize(NumberDeserializer {
1940
                    number: self.start,
1940
                    extensions: self.exts,
1940
                })
            }
            RangeMapState::EndValue => {
1928
                self.state = RangeMapState::Done;
1928
                seed.deserialize(NumberDeserializer {
1928
                    number: self.end,
1928
                    extensions: self.exts,
1928
                })
            }
            _ => Err(Error::ExpectedDifferentLength {
                expected: String::from("map of length 2"),
                found: 3,
            }),
        }
3868
    }
}
struct RangeFromMapAccess {
    start: crate::value::Number,
    done: bool,
    exts: Extensions,
}
impl RangeFromMapAccess {
2480
    fn new(start: crate::value::Number, exts: Extensions) -> Self {
2480
        RangeFromMapAccess {
2480
            start,
2480
            done: false,
2480
            exts,
2480
        }
2480
    }
}
impl<'de> de::MapAccess<'de> for RangeFromMapAccess {
    type Error = Error;
60
    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
60
        if self.done {
28
            return Ok(None);
32
        }
32
        seed.deserialize(de::value::StrDeserializer::<Error>::new("start"))
32
            .map(Some)
60
    }
32
    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
32
        if self.done {
            return Err(Error::ExpectedDifferentLength {
                expected: String::from("map of length 1"),
                found: 2,
            });
32
        }
32
        self.done = true;
32
        seed.deserialize(NumberDeserializer {
32
            number: self.start,
32
            extensions: self.exts,
32
        })
32
    }
}
struct RangeToMapAccess {
    end: crate::value::Number,
    end_key: &'static str,
    done: bool,
    exts: Extensions,
}
impl RangeToMapAccess {
2790
    fn new(end: crate::value::Number, end_key: &'static str, exts: Extensions) -> Self {
2790
        RangeToMapAccess {
2790
            end,
2790
            end_key,
2790
            done: false,
2790
            exts,
2790
        }
2790
    }
}
impl<'de> de::MapAccess<'de> for RangeToMapAccess {
    type Error = Error;
2516
    fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
2516
        if self.done {
1256
            return Ok(None);
1260
        }
1260
        seed.deserialize(de::value::StrDeserializer::<Error>::new(self.end_key))
1260
            .map(Some)
2516
    }
1260
    fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
1260
        if self.done {
            return Err(Error::ExpectedDifferentLength {
                expected: String::from("map of length 1"),
                found: 2,
            });
1260
        }
1260
        self.done = true;
1260
        seed.deserialize(NumberDeserializer {
1260
            number: self.end,
1260
            extensions: self.exts,
1260
        })
1260
    }
}
impl<'de, 'a> de::SeqAccess<'de> for CommaSeparated<'a, 'de> {
    type Error = Error;
9665331
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
9665331
    where
9665331
        T: DeserializeSeed<'de>,
    {
9665331
        if self.has_element()? {
9646440
            let res = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
9644843
            self.had_comma = self.de.parser.comma()?;
9644843
            Ok(Some(res))
        } else {
18873
            Ok(None)
        }
9665331
    }
}
impl<'de, 'a> de::MapAccess<'de> for CommaSeparated<'a, 'de> {
    type Error = Error;
108616
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
108616
    where
108616
        K: DeserializeSeed<'de>,
    {
108616
        if self.has_element()? {
97251
            self.inside_internally_tagged_enum = is_serde_tag_or_content::<K::Value>();
97251
            match self.terminator {
15096
                Terminator::Struct => guard_recursion! { self.de =>
15096
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, false)).map(Some)
                },
612
                Terminator::MapAsStruct => guard_recursion! { self.de =>
612
                    seed.deserialize(&mut id::Deserializer::new(&mut *self.de, true)).map(Some)
                },
81543
                _ => guard_recursion! { self.de => seed.deserialize(&mut *self.de).map(Some) },
            }
        } else {
11351
            Ok(None)
        }
108616
    }
19408
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
19408
    where
19408
        V: DeserializeSeed<'de>,
    {
19408
        self.de.parser.skip_ws()?;
19408
        if self.de.parser.consume_char(':') {
19090
            self.de.parser.skip_ws()?;
19090
            let res = if self.inside_internally_tagged_enum && !is_serde_content::<V::Value>() {
101
                guard_recursion! { self.de =>
101
                    seed.deserialize(&mut tag::Deserializer::new(&mut *self.de))?
                }
            } else {
18989
                guard_recursion! { self.de =>
18989
                    seed.deserialize(&mut *self.de)?
                }
            };
18380
            self.had_comma = self.de.parser.comma()?;
18380
            Ok(res)
        } else {
318
            Err(Error::ExpectedMapColon)
        }
19408
    }
}
struct Enum<'a, 'de: 'a> {
    de: &'a mut Deserializer<'de>,
}
impl<'a, 'de> Enum<'a, 'de> {
76699
    fn new(de: &'a mut Deserializer<'de>) -> Self {
76699
        Enum { de }
76699
    }
}
impl<'de, 'a> de::EnumAccess<'de> for Enum<'a, 'de> {
    type Error = Error;
    type Variant = Self;
1096
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
1096
    where
1096
        V: DeserializeSeed<'de>,
    {
1096
        self.de.parser.skip_ws()?;
1096
        let value = guard_recursion! { self.de => seed.deserialize(&mut *self.de)? };
1058
        Ok((value, self))
1096
    }
}
impl<'de, 'a> de::VariantAccess<'de> for Enum<'a, 'de> {
    type Error = Error;
18250
    fn unit_variant(self) -> Result<()> {
18250
        Ok(())
18250
    }
559
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
559
    where
559
        T: DeserializeSeed<'de>,
    {
559
        let newtype_variant = self.de.last_identifier;
559
        self.de.parser.skip_ws()?;
559
        if self.de.parser.consume_char('(') {
547
            self.de.parser.skip_ws()?;
547
            self.de.newtype_variant = self
547
                .de
547
                .parser
547
                .exts
547
                .contains(Extensions::UNWRAP_VARIANT_NEWTYPES);
547
            let val = guard_recursion! { self.de =>
547
                seed
547
                    .deserialize(&mut *self.de)
547
                    .map_err(|err| struct_error_name(err, newtype_variant))?
            };
416
            self.de.newtype_variant = false;
416
            self.de.parser.comma()?;
416
            if self.de.parser.consume_char(')') {
404
                Ok(val)
            } else {
12
                Err(Error::ExpectedStructLikeEnd)
            }
        } else {
12
            Err(Error::ExpectedStructLike)
        }
559
    }
99
    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
99
    where
99
        V: Visitor<'de>,
    {
99
        self.de.parser.skip_ws()?;
99
        self.de.deserialize_tuple(len, visitor)
99
    }
129
    fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
129
    where
129
        V: Visitor<'de>,
    {
129
        let struct_variant = self.de.last_identifier;
129
        self.de.parser.skip_ws()?;
129
        self.de
129
            .handle_struct_after_name("", visitor)
129
            .map_err(|err| struct_error_name(err, struct_variant))
129
    }
}
41144
fn struct_error_name(error: Error, name: Option<&str>) -> Error {
4118
    match error {
        Error::NoSuchStructField {
4118
            expected,
4118
            found,
            outer: None,
4118
        } => Error::NoSuchStructField {
4118
            expected,
4118
            found,
4118
            outer: name.map(ToOwned::to_owned),
4118
        },
5516
        Error::MissingStructField { field, outer: None } => Error::MissingStructField {
5516
            field,
5516
            outer: name.map(ToOwned::to_owned),
5516
        },
4118
        Error::DuplicateStructField { field, outer: None } => Error::DuplicateStructField {
4118
            field,
4118
            outer: name.map(ToOwned::to_owned),
4118
        },
27392
        e => e,
    }
41144
}
// Note: OnceLock is only stable with MSRV 1.70 and requires std
struct OnceBox<T> {
    ptr: core::sync::atomic::AtomicPtr<T>,
}
impl<T> OnceBox<T> {
    const fn new() -> Self {
        Self {
            ptr: core::sync::atomic::AtomicPtr::new(core::ptr::null_mut()),
        }
    }
    #[allow(unsafe_code)]
624056
    fn get_or_init<F>(&self, f: F) -> &T
624056
    where
624056
        F: FnOnce() -> T,
    {
624056
        let mut ptr = self.ptr.load(core::sync::atomic::Ordering::Acquire);
624056
        if ptr.is_null() {
25820
            let val = f();
25820
            let new_ptr = alloc::boxed::Box::into_raw(alloc::boxed::Box::new(val));
25820
            match self.ptr.compare_exchange(
25820
                core::ptr::null_mut(),
25820
                new_ptr,
25820
                core::sync::atomic::Ordering::AcqRel,
25820
                core::sync::atomic::Ordering::Acquire,
25820
            ) {
23570
                Ok(_) => ptr = new_ptr,
2250
                Err(actual) => {
2250
                    // SAFETY: `new_ptr` was created via `Box::into_raw` above and lost the CAS race, so it is safe to deallocate.
2250
                    unsafe {
2250
                        drop(alloc::boxed::Box::from_raw(new_ptr));
2250
                    }
2250
                    ptr = actual;
2250
                }
            }
598236
        }
        // SAFETY: `ptr` points to a valid, leaked `T` stored in the atomic static that lives for `'static`.
624056
        unsafe { &*ptr }
624056
    }
}
struct SerdeEnumContent<'a, 'de: 'a> {
    de: &'a mut Deserializer<'de>,
    ident: Option<&'a str>,
}
impl<'de, 'a> de::MapAccess<'de> for SerdeEnumContent<'a, 'de> {
    type Error = Error;
939
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
939
    where
939
        K: DeserializeSeed<'de>,
    {
939
        self.ident
939
            .take()
939
            .map(|ident| seed.deserialize(de::value::StrDeserializer::new(ident)))
939
            .transpose()
939
    }
623
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
623
    where
623
        V: DeserializeSeed<'de>,
    {
623
        self.de.parser.skip_ws()?;
623
        let old_serde_content_newtype = self.de.serde_content_newtype;
623
        self.de.serde_content_newtype = true;
623
        let result = seed.deserialize(&mut *self.de);
623
        self.de.serde_content_newtype = old_serde_content_newtype;
623
        result
623
    }
}
26020
fn is_serde_content<T>() -> bool {
    #[derive(serde_derive::Deserialize)]
    enum A {}
    type B = A;
    #[derive(serde_derive::Deserialize)]
    #[serde(untagged)]
    enum UntaggedEnum {
        A(A),
        B(B),
    }
    struct TypeIdDeserializer;
    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
9772
        fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value, Self::Error> {
9772
            Err(TypeIdError(typeid::of::<V::Value>()))
9772
        }
        serde::forward_to_deserialize_any! {
            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
            bytes byte_buf option unit unit_struct newtype_struct seq tuple
            tuple_struct map struct enum identifier ignored_any
        }
    }
    #[derive(Debug)]
    struct TypeIdError(core::any::TypeId);
    impl core::fmt::Display for TypeIdError {
        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
            Ok(())
        }
    }
    impl de::Error for TypeIdError {
        #[allow(clippy::unreachable)]
        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
            unreachable!()
        }
    }
    impl de::StdError for TypeIdError {}
184993
    fn type_id_of_untagged_enum_default_buffer() -> core::any::TypeId {
        static TYPE_ID: OnceBox<core::any::TypeId> = OnceBox::new();
184993
        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
            Ok(UntaggedEnum::A(void) | UntaggedEnum::B(void)) => match void {},
9772
            Err(TypeIdError(typeid)) => typeid,
9772
        })
184993
    }
26020
    typeid::of::<T>() == type_id_of_untagged_enum_default_buffer()
26020
}
121363
fn is_serde_tag_or_content<T>() -> bool {
    #[derive(serde_derive::Deserialize)]
    enum A {}
    #[derive(serde_derive::Deserialize)]
    #[serde(tag = "tag")]
    enum InternallyTaggedEnum {
        A { a: A },
    }
    struct TypeIdDeserializer;
    impl<'de> de::Deserializer<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
16048
        fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
16048
        where
16048
            V: Visitor<'de>,
        {
16048
            visitor.visit_map(self)
16048
        }
        serde::forward_to_deserialize_any! {
            bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
            bytes byte_buf option unit unit_struct newtype_struct seq tuple
            tuple_struct map struct enum identifier ignored_any
        }
    }
    impl<'de> de::MapAccess<'de> for TypeIdDeserializer {
        type Error = TypeIdError;
16048
        fn next_key_seed<K: DeserializeSeed<'de>>(
16048
            &mut self,
16048
            _seed: K,
16048
        ) -> Result<Option<K::Value>, Self::Error> {
16048
            Err(TypeIdError(typeid::of::<K::Value>()))
16048
        }
        #[allow(clippy::unreachable)]
        fn next_value_seed<V: DeserializeSeed<'de>>(
            &mut self,
            _seed: V,
        ) -> Result<V::Value, Self::Error> {
            unreachable!()
        }
    }
    #[derive(Debug)]
    struct TypeIdError(core::any::TypeId);
    impl core::fmt::Display for TypeIdError {
        fn fmt(&self, _fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
            Ok(())
        }
    }
    impl de::Error for TypeIdError {
        #[allow(clippy::unreachable)]
        fn custom<T: core::fmt::Display>(_msg: T) -> Self {
            unreachable!()
        }
    }
    impl de::StdError for TypeIdError {}
439063
    fn type_id_of_internally_tagged_enum_default_tag_or_buffer() -> core::any::TypeId {
        static TYPE_ID: OnceBox<core::any::TypeId> = OnceBox::new();
439063
        *TYPE_ID.get_or_init(|| match Deserialize::deserialize(TypeIdDeserializer) {
            Ok(InternallyTaggedEnum::A { a: void }) => match void {},
16048
            Err(TypeIdError(typeid)) => typeid,
16048
        })
439063
    }
121363
    typeid::of::<T>() == type_id_of_internally_tagged_enum_default_tag_or_buffer()
121363
}
/// Trim the plain (non-comment) whitespace around a `RawValue`, so that
/// re-serialising it, e.g. with pretty-printing, does not accumulate whitespace.
/// Comments are kept, and whitespace is only trimmed from the end if that does
/// not leave an unclosed line comment behind.
///
/// `src_before` is the source from the start of the whitespace before the value,
/// `src_value_end` the source right after the value (before the trailing
/// whitespace), and `src_after` the source after the trailing whitespace.
9920
fn trim_raw_value_whitespace<'a>(
9920
    src_before: &'a str,
9920
    src_value_end: &str,
9920
    src_after: &str,
9920
) -> &'a str {
9920
    let start = src_before.len() - src_before.trim_start().len();
9920
    let trailing_start = src_before.len() - src_value_end.len();
9920
    let trailing = &src_before[trailing_start..src_before.len() - src_after.len()];
9920
    let trimmed = trailing.trim_end();
9920
    let mut end = trailing_start + trimmed.len();
    // Only the (trimmed) trailing whitespace needs to be re-parsed to find out
    // if it ends in a line comment that the trimmed whitespace would leave open
9920
    if Parser::new(trimmed).map_or(false, |parser| parser.has_unclosed_line_comment()) {
        // Keep the whitespace up to and including the line break that closes the comment
1550
        let rest = &trailing[trimmed.len()..];
1550
        end += rest.find('\n').map_or(rest.len(), |i| i + 1);
8370
    }
9920
    &src_before[start..end]
9920
}