Coverage Report

Created: 2025-11-11 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/json/src/de.rs
Line
Count
Source
1
//! Deserialize JSON data to a Rust data structure.
2
3
use crate::error::{Error, ErrorCode, Result};
4
#[cfg(feature = "float_roundtrip")]
5
use crate::lexical;
6
use crate::number::Number;
7
use crate::read::{self, Fused, Reference};
8
use alloc::string::String;
9
use alloc::vec::Vec;
10
#[cfg(feature = "float_roundtrip")]
11
use core::iter;
12
use core::iter::FusedIterator;
13
use core::marker::PhantomData;
14
use core::result;
15
use core::str::FromStr;
16
use serde::de::{self, Expected, Unexpected};
17
use serde::forward_to_deserialize_any;
18
19
#[cfg(feature = "arbitrary_precision")]
20
use crate::number::NumberDeserializer;
21
22
pub use crate::read::{Read, SliceRead, StrRead};
23
24
#[cfg(feature = "std")]
25
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
26
pub use crate::read::IoRead;
27
28
//////////////////////////////////////////////////////////////////////////////
29
30
/// A structure that deserializes JSON into Rust values.
31
pub struct Deserializer<R> {
32
    read: R,
33
    scratch: Vec<u8>,
34
    remaining_depth: u8,
35
    #[cfg(feature = "float_roundtrip")]
36
    single_precision: bool,
37
    #[cfg(feature = "unbounded_depth")]
38
    disable_recursion_limit: bool,
39
}
40
41
impl<'de, R> Deserializer<R>
42
where
43
    R: read::Read<'de>,
44
{
45
    /// Create a JSON deserializer from one of the possible serde_json input
46
    /// sources.
47
    ///
48
    /// When reading from a source against which short reads are not efficient, such
49
    /// as a [`File`], you will want to apply your own buffering because serde_json
50
    /// will not buffer the input. See [`std::io::BufReader`].
51
    ///
52
    /// Typically it is more convenient to use one of these methods instead:
53
    ///
54
    ///   - Deserializer::from_str
55
    ///   - Deserializer::from_slice
56
    ///   - Deserializer::from_reader
57
    ///
58
    /// [`File`]: std::fs::File
59
6.06k
    pub fn new(read: R) -> Self {
60
6.06k
        Deserializer {
61
6.06k
            read,
62
6.06k
            scratch: Vec::new(),
63
6.06k
            remaining_depth: 128,
64
6.06k
            #[cfg(feature = "float_roundtrip")]
65
6.06k
            single_precision: false,
66
6.06k
            #[cfg(feature = "unbounded_depth")]
67
6.06k
            disable_recursion_limit: false,
68
6.06k
        }
69
6.06k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::new
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::new
Line
Count
Source
59
6.06k
    pub fn new(read: R) -> Self {
60
6.06k
        Deserializer {
61
6.06k
            read,
62
6.06k
            scratch: Vec::new(),
63
6.06k
            remaining_depth: 128,
64
6.06k
            #[cfg(feature = "float_roundtrip")]
65
6.06k
            single_precision: false,
66
6.06k
            #[cfg(feature = "unbounded_depth")]
67
6.06k
            disable_recursion_limit: false,
68
6.06k
        }
69
6.06k
    }
70
}
71
72
#[cfg(feature = "std")]
73
impl<R> Deserializer<read::IoRead<R>>
74
where
75
    R: crate::io::Read,
76
{
77
    /// Creates a JSON deserializer from an `io::Read`.
78
    ///
79
    /// Reader-based deserializers do not support deserializing borrowed types
80
    /// like `&str`, since the `std::io::Read` trait has no non-copying methods
81
    /// -- everything it does involves copying bytes out of the data source.
82
    pub fn from_reader(reader: R) -> Self {
83
        Deserializer::new(read::IoRead::new(reader))
84
    }
85
}
86
87
impl<'a> Deserializer<read::SliceRead<'a>> {
88
    /// Creates a JSON deserializer from a `&[u8]`.
89
0
    pub fn from_slice(bytes: &'a [u8]) -> Self {
90
0
        Deserializer::new(read::SliceRead::new(bytes))
91
0
    }
92
}
93
94
impl<'a> Deserializer<read::StrRead<'a>> {
95
    /// Creates a JSON deserializer from a `&str`.
96
0
    pub fn from_str(s: &'a str) -> Self {
97
0
        Deserializer::new(read::StrRead::new(s))
98
0
    }
99
}
100
101
macro_rules! overflow {
102
    ($a:ident * 10 + $b:ident, $c:expr) => {
103
        match $c {
104
            c => $a >= c / 10 && ($a > c / 10 || $b > c % 10),
105
        }
106
    };
107
}
108
109
pub(crate) enum ParserNumber {
110
    F64(f64),
111
    U64(u64),
112
    I64(i64),
113
    #[cfg(feature = "arbitrary_precision")]
114
    String(String),
115
}
116
117
impl ParserNumber {
118
2.40M
    fn visit<'de, V>(self, visitor: V) -> Result<V::Value>
119
2.40M
    where
120
2.40M
        V: de::Visitor<'de>,
121
    {
122
2.40M
        match self {
123
171k
            ParserNumber::F64(x) => visitor.visit_f64(x),
124
2.21M
            ParserNumber::U64(x) => visitor.visit_u64(x),
125
18.6k
            ParserNumber::I64(x) => visitor.visit_i64(x),
126
            #[cfg(feature = "arbitrary_precision")]
127
            ParserNumber::String(x) => visitor.visit_map(NumberDeserializer { number: x.into() }),
128
        }
129
2.40M
    }
130
131
0
    fn invalid_type(self, exp: &dyn Expected) -> Error {
132
0
        match self {
133
0
            ParserNumber::F64(x) => de::Error::invalid_type(Unexpected::Float(x), exp),
134
0
            ParserNumber::U64(x) => de::Error::invalid_type(Unexpected::Unsigned(x), exp),
135
0
            ParserNumber::I64(x) => de::Error::invalid_type(Unexpected::Signed(x), exp),
136
            #[cfg(feature = "arbitrary_precision")]
137
            ParserNumber::String(_) => de::Error::invalid_type(Unexpected::Other("number"), exp),
138
        }
139
0
    }
140
}
141
142
impl<'de, R: Read<'de>> Deserializer<R> {
143
    /// The `Deserializer::end` method should be called after a value has been fully deserialized.
144
    /// This allows the `Deserializer` to validate that the input stream is at the end or that it
145
    /// only has trailing whitespace.
146
1.11k
    pub fn end(&mut self) -> Result<()> {
147
1.11k
        match tri!(self.parse_whitespace()) {
148
145
            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
149
970
            None => Ok(()),
150
        }
151
1.11k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::end
Line
Count
Source
146
1.11k
    pub fn end(&mut self) -> Result<()> {
147
1.11k
        match tri!(self.parse_whitespace()) {
148
145
            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
149
970
            None => Ok(()),
150
        }
151
1.11k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::end
152
153
    /// Turn a JSON deserializer into an iterator over values of type T.
154
    pub fn into_iter<T>(self) -> StreamDeserializer<'de, R, T>
155
    where
156
        T: de::Deserialize<'de>,
157
    {
158
        // This cannot be an implementation of std::iter::IntoIterator because
159
        // we need the caller to choose what T is.
160
        let offset = self.read.byte_offset();
161
        StreamDeserializer {
162
            de: self,
163
            offset,
164
            failed: false,
165
            output: PhantomData,
166
            lifetime: PhantomData,
167
        }
168
    }
169
170
    /// Parse arbitrarily deep JSON structures without any consideration for
171
    /// overflowing the stack.
172
    ///
173
    /// You will want to provide some other way to protect against stack
174
    /// overflows, such as by wrapping your Deserializer in the dynamically
175
    /// growing stack adapter provided by the serde_stacker crate. Additionally
176
    /// you will need to be careful around other recursive operations on the
177
    /// parsed result which may overflow the stack after deserialization has
178
    /// completed, including, but not limited to, Display and Debug and Drop
179
    /// impls.
180
    ///
181
    /// *This method is only available if serde_json is built with the
182
    /// `"unbounded_depth"` feature.*
183
    ///
184
    /// # Examples
185
    ///
186
    /// ```
187
    /// use serde::Deserialize;
188
    /// use serde_json::Value;
189
    ///
190
    /// fn main() {
191
    ///     let mut json = String::new();
192
    ///     for _ in 0..10000 {
193
    ///         json = format!("[{}]", json);
194
    ///     }
195
    ///
196
    ///     let mut deserializer = serde_json::Deserializer::from_str(&json);
197
    ///     deserializer.disable_recursion_limit();
198
    ///     let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
199
    ///     let value = Value::deserialize(deserializer).unwrap();
200
    ///
201
    ///     carefully_drop_nested_arrays(value);
202
    /// }
203
    ///
204
    /// fn carefully_drop_nested_arrays(value: Value) {
205
    ///     let mut stack = vec![value];
206
    ///     while let Some(value) = stack.pop() {
207
    ///         if let Value::Array(array) = value {
208
    ///             stack.extend(array);
209
    ///         }
210
    ///     }
211
    /// }
212
    /// ```
213
    #[cfg(feature = "unbounded_depth")]
214
    #[cfg_attr(docsrs, doc(cfg(feature = "unbounded_depth")))]
215
    pub fn disable_recursion_limit(&mut self) {
216
        self.disable_recursion_limit = true;
217
    }
218
219
40.5M
    pub(crate) fn peek(&mut self) -> Result<Option<u8>> {
220
40.5M
        self.read.peek()
221
40.5M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::peek
Line
Count
Source
219
40.5M
    pub(crate) fn peek(&mut self) -> Result<Option<u8>> {
220
40.5M
        self.read.peek()
221
40.5M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::peek
222
223
30.1M
    fn peek_or_null(&mut self) -> Result<u8> {
224
30.1M
        Ok(tri!(self.peek()).unwrap_or(b'\x00'))
225
30.1M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::peek_or_null
Line
Count
Source
223
30.1M
    fn peek_or_null(&mut self) -> Result<u8> {
224
30.1M
        Ok(tri!(self.peek()).unwrap_or(b'\x00'))
225
30.1M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::peek_or_null
226
227
31.0M
    fn eat_char(&mut self) {
228
31.0M
        self.read.discard();
229
31.0M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::eat_char
Line
Count
Source
227
31.0M
    fn eat_char(&mut self) {
228
31.0M
        self.read.discard();
229
31.0M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::eat_char
230
231
2.57M
    fn next_char(&mut self) -> Result<Option<u8>> {
232
2.57M
        self.read.next()
233
2.57M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::next_char
Line
Count
Source
231
2.57M
    fn next_char(&mut self) -> Result<Option<u8>> {
232
2.57M
        self.read.next()
233
2.57M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::next_char
234
235
    fn next_char_or_null(&mut self) -> Result<u8> {
236
        Ok(tri!(self.next_char()).unwrap_or(b'\x00'))
237
    }
238
239
    /// Error caused by a byte from next_char().
240
    #[cold]
241
822
    fn error(&self, reason: ErrorCode) -> Error {
242
822
        let position = self.read.position();
243
822
        Error::syntax(reason, position.line, position.column)
244
822
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::error
Line
Count
Source
241
822
    fn error(&self, reason: ErrorCode) -> Error {
242
822
        let position = self.read.position();
243
822
        Error::syntax(reason, position.line, position.column)
244
822
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::error
245
246
    /// Error caused by a byte from peek().
247
    #[cold]
248
28.5k
    fn peek_error(&self, reason: ErrorCode) -> Error {
249
28.5k
        let position = self.read.peek_position();
250
28.5k
        Error::syntax(reason, position.line, position.column)
251
28.5k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::peek_error
Line
Count
Source
248
28.5k
    fn peek_error(&self, reason: ErrorCode) -> Error {
249
28.5k
        let position = self.read.peek_position();
250
28.5k
        Error::syntax(reason, position.line, position.column)
251
28.5k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::peek_error
252
253
    /// Returns the first non-whitespace byte without consuming it, or `None` if
254
    /// EOF is encountered.
255
7.71M
    fn parse_whitespace(&mut self) -> Result<Option<u8>> {
256
        loop {
257
10.4M
            match tri!(self.peek()) {
258
2.75M
                Some(b' ' | b'\n' | b'\t' | b'\r') => {
259
2.75M
                    self.eat_char();
260
2.75M
                }
261
7.71M
                other => {
262
7.71M
                    return Ok(other);
263
                }
264
            }
265
        }
266
7.71M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_whitespace
Line
Count
Source
255
7.71M
    fn parse_whitespace(&mut self) -> Result<Option<u8>> {
256
        loop {
257
10.4M
            match tri!(self.peek()) {
258
2.75M
                Some(b' ' | b'\n' | b'\t' | b'\r') => {
259
2.75M
                    self.eat_char();
260
2.75M
                }
261
7.71M
                other => {
262
7.71M
                    return Ok(other);
263
                }
264
            }
265
        }
266
7.71M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_whitespace
267
268
    #[cold]
269
0
    fn peek_invalid_type(&mut self, exp: &dyn Expected) -> Error {
270
0
        let err = match self.peek_or_null().unwrap_or(b'\x00') {
271
            b'n' => {
272
0
                self.eat_char();
273
0
                if let Err(err) = self.parse_ident(b"ull") {
274
0
                    return err;
275
0
                }
276
0
                de::Error::invalid_type(Unexpected::Unit, exp)
277
            }
278
            b't' => {
279
0
                self.eat_char();
280
0
                if let Err(err) = self.parse_ident(b"rue") {
281
0
                    return err;
282
0
                }
283
0
                de::Error::invalid_type(Unexpected::Bool(true), exp)
284
            }
285
            b'f' => {
286
0
                self.eat_char();
287
0
                if let Err(err) = self.parse_ident(b"alse") {
288
0
                    return err;
289
0
                }
290
0
                de::Error::invalid_type(Unexpected::Bool(false), exp)
291
            }
292
            b'-' => {
293
0
                self.eat_char();
294
0
                match self.parse_any_number(false) {
295
0
                    Ok(n) => n.invalid_type(exp),
296
0
                    Err(err) => return err,
297
                }
298
            }
299
0
            b'0'..=b'9' => match self.parse_any_number(true) {
300
0
                Ok(n) => n.invalid_type(exp),
301
0
                Err(err) => return err,
302
            },
303
            b'"' => {
304
0
                self.eat_char();
305
0
                self.scratch.clear();
306
0
                match self.read.parse_str(&mut self.scratch) {
307
0
                    Ok(s) => de::Error::invalid_type(Unexpected::Str(&s), exp),
308
0
                    Err(err) => return err,
309
                }
310
            }
311
0
            b'[' => de::Error::invalid_type(Unexpected::Seq, exp),
312
0
            b'{' => de::Error::invalid_type(Unexpected::Map, exp),
313
0
            _ => self.peek_error(ErrorCode::ExpectedSomeValue),
314
        };
315
316
0
        self.fix_position(err)
317
0
    }
318
319
    pub(crate) fn deserialize_number<'any, V>(&mut self, visitor: V) -> Result<V::Value>
320
    where
321
        V: de::Visitor<'any>,
322
    {
323
        let peek = match tri!(self.parse_whitespace()) {
324
            Some(b) => b,
325
            None => {
326
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
327
            }
328
        };
329
330
        let value = match peek {
331
            b'-' => {
332
                self.eat_char();
333
                tri!(self.parse_integer(false)).visit(visitor)
334
            }
335
            b'0'..=b'9' => tri!(self.parse_integer(true)).visit(visitor),
336
            _ => Err(self.peek_invalid_type(&visitor)),
337
        };
338
339
        match value {
340
            Ok(value) => Ok(value),
341
            Err(err) => Err(self.fix_position(err)),
342
        }
343
    }
344
345
    #[cfg(feature = "float_roundtrip")]
346
    pub(crate) fn do_deserialize_f32<'any, V>(&mut self, visitor: V) -> Result<V::Value>
347
    where
348
        V: de::Visitor<'any>,
349
    {
350
        self.single_precision = true;
351
        let val = self.deserialize_number(visitor);
352
        self.single_precision = false;
353
        val
354
    }
355
356
    pub(crate) fn do_deserialize_i128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
357
    where
358
        V: de::Visitor<'any>,
359
    {
360
        let mut buf = String::new();
361
362
        match tri!(self.parse_whitespace()) {
363
            Some(b'-') => {
364
                self.eat_char();
365
                buf.push('-');
366
            }
367
            Some(_) => {}
368
            None => {
369
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
370
            }
371
        }
372
373
        tri!(self.scan_integer128(&mut buf));
374
375
        let value = match buf.parse() {
376
            Ok(int) => visitor.visit_i128(int),
377
            Err(_) => {
378
                return Err(self.error(ErrorCode::NumberOutOfRange));
379
            }
380
        };
381
382
        match value {
383
            Ok(value) => Ok(value),
384
            Err(err) => Err(self.fix_position(err)),
385
        }
386
    }
387
388
    pub(crate) fn do_deserialize_u128<'any, V>(&mut self, visitor: V) -> Result<V::Value>
389
    where
390
        V: de::Visitor<'any>,
391
    {
392
        match tri!(self.parse_whitespace()) {
393
            Some(b'-') => {
394
                return Err(self.peek_error(ErrorCode::NumberOutOfRange));
395
            }
396
            Some(_) => {}
397
            None => {
398
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
399
            }
400
        }
401
402
        let mut buf = String::new();
403
        tri!(self.scan_integer128(&mut buf));
404
405
        let value = match buf.parse() {
406
            Ok(int) => visitor.visit_u128(int),
407
            Err(_) => {
408
                return Err(self.error(ErrorCode::NumberOutOfRange));
409
            }
410
        };
411
412
        match value {
413
            Ok(value) => Ok(value),
414
            Err(err) => Err(self.fix_position(err)),
415
        }
416
    }
417
418
    fn scan_integer128(&mut self, buf: &mut String) -> Result<()> {
419
        match tri!(self.next_char_or_null()) {
420
            b'0' => {
421
                buf.push('0');
422
                // There can be only one leading '0'.
423
                match tri!(self.peek_or_null()) {
424
                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
425
                    _ => Ok(()),
426
                }
427
            }
428
            c @ b'1'..=b'9' => {
429
                buf.push(c as char);
430
                while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
431
                    self.eat_char();
432
                    buf.push(c as char);
433
                }
434
                Ok(())
435
            }
436
            _ => Err(self.error(ErrorCode::InvalidNumber)),
437
        }
438
    }
439
440
    #[cold]
441
26.7k
    fn fix_position(&self, err: Error) -> Error {
442
26.7k
        err.fix_position(move |code| self.error(code))
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::SliceRead>>::fix_position::{closure#0}
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::fix_position::{closure#0}
443
26.7k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::fix_position
Line
Count
Source
441
26.7k
    fn fix_position(&self, err: Error) -> Error {
442
26.7k
        err.fix_position(move |code| self.error(code))
443
26.7k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::fix_position
444
445
25.3k
    fn parse_ident(&mut self, ident: &[u8]) -> Result<()> {
446
111k
        for expected in ident {
447
86.1k
            match tri!(self.next_char()) {
448
                None => {
449
49
                    return Err(self.error(ErrorCode::EofWhileParsingValue));
450
                }
451
86.1k
                Some(next) => {
452
86.1k
                    if next != *expected {
453
275
                        return Err(self.error(ErrorCode::ExpectedSomeIdent));
454
85.8k
                    }
455
                }
456
            }
457
        }
458
459
25.0k
        Ok(())
460
25.3k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_ident
Line
Count
Source
445
25.3k
    fn parse_ident(&mut self, ident: &[u8]) -> Result<()> {
446
111k
        for expected in ident {
447
86.1k
            match tri!(self.next_char()) {
448
                None => {
449
49
                    return Err(self.error(ErrorCode::EofWhileParsingValue));
450
                }
451
86.1k
                Some(next) => {
452
86.1k
                    if next != *expected {
453
275
                        return Err(self.error(ErrorCode::ExpectedSomeIdent));
454
85.8k
                    }
455
                }
456
            }
457
        }
458
459
25.0k
        Ok(())
460
25.3k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_ident
461
462
2.40M
    fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> {
463
2.40M
        let next = match tri!(self.next_char()) {
464
2.40M
            Some(b) => b,
465
            None => {
466
13
                return Err(self.error(ErrorCode::EofWhileParsingValue));
467
            }
468
        };
469
470
2.40M
        match next {
471
            b'0' => {
472
                // There can be only one leading '0'.
473
1.47M
                match tri!(self.peek_or_null()) {
474
4.82k
                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
475
1.47M
                    _ => self.parse_number(positive, 0),
476
                }
477
            }
478
923k
            c @ b'1'..=b'9' => {
479
923k
                let mut significand = (c - b'0') as u64;
480
481
                loop {
482
2.87M
                    match tri!(self.peek_or_null()) {
483
2.07M
                        c @ b'0'..=b'9' => {
484
2.02M
                            let digit = (c - b'0') as u64;
485
486
                            // We need to be careful with overflow. If we can,
487
                            // try to keep the number as a `u64` until we grow
488
                            // too large. At that point, switch to parsing the
489
                            // value as a `f64`.
490
2.02M
                            if overflow!(significand * 10 + digit, u64::MAX) {
491
122
                                return Ok(ParserNumber::F64(tri!(
492
71.6k
                                    self.parse_long_integer(positive, significand),
493
                                )));
494
1.94M
                            }
495
496
1.94M
                            self.eat_char();
497
1.94M
                            significand = significand * 10 + digit;
498
                        }
499
                        _ => {
500
852k
                            return self.parse_number(positive, significand);
501
                        }
502
                    }
503
                }
504
            }
505
32
            _ => Err(self.error(ErrorCode::InvalidNumber)),
506
        }
507
2.40M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_integer
Line
Count
Source
462
2.40M
    fn parse_integer(&mut self, positive: bool) -> Result<ParserNumber> {
463
2.40M
        let next = match tri!(self.next_char()) {
464
2.40M
            Some(b) => b,
465
            None => {
466
13
                return Err(self.error(ErrorCode::EofWhileParsingValue));
467
            }
468
        };
469
470
2.40M
        match next {
471
            b'0' => {
472
                // There can be only one leading '0'.
473
1.47M
                match tri!(self.peek_or_null()) {
474
4.82k
                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
475
1.47M
                    _ => self.parse_number(positive, 0),
476
                }
477
            }
478
923k
            c @ b'1'..=b'9' => {
479
923k
                let mut significand = (c - b'0') as u64;
480
481
                loop {
482
2.87M
                    match tri!(self.peek_or_null()) {
483
2.07M
                        c @ b'0'..=b'9' => {
484
2.02M
                            let digit = (c - b'0') as u64;
485
486
                            // We need to be careful with overflow. If we can,
487
                            // try to keep the number as a `u64` until we grow
488
                            // too large. At that point, switch to parsing the
489
                            // value as a `f64`.
490
2.02M
                            if overflow!(significand * 10 + digit, u64::MAX) {
491
122
                                return Ok(ParserNumber::F64(tri!(
492
71.6k
                                    self.parse_long_integer(positive, significand),
493
                                )));
494
1.94M
                            }
495
496
1.94M
                            self.eat_char();
497
1.94M
                            significand = significand * 10 + digit;
498
                        }
499
                        _ => {
500
852k
                            return self.parse_number(positive, significand);
501
                        }
502
                    }
503
                }
504
            }
505
32
            _ => Err(self.error(ErrorCode::InvalidNumber)),
506
        }
507
2.40M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_integer
508
509
2.32M
    fn parse_number(&mut self, positive: bool, significand: u64) -> Result<ParserNumber> {
510
2.32M
        Ok(match tri!(self.peek_or_null()) {
511
41.3k
            b'.' => ParserNumber::F64(tri!(self.parse_decimal(positive, significand, 0))),
512
58.2k
            b'e' | b'E' => ParserNumber::F64(tri!(self.parse_exponent(positive, significand, 0))),
513
            _ => {
514
2.22M
                if positive {
515
2.21M
                    ParserNumber::U64(significand)
516
                } else {
517
19.4k
                    let neg = (significand as i64).wrapping_neg();
518
519
                    // Convert into a float if we underflow, or on `-0`.
520
19.4k
                    if neg >= 0 {
521
839
                        ParserNumber::F64(-(significand as f64))
522
                    } else {
523
18.6k
                        ParserNumber::I64(neg)
524
                    }
525
                }
526
            }
527
        })
528
2.32M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_number
Line
Count
Source
509
2.32M
    fn parse_number(&mut self, positive: bool, significand: u64) -> Result<ParserNumber> {
510
2.32M
        Ok(match tri!(self.peek_or_null()) {
511
41.3k
            b'.' => ParserNumber::F64(tri!(self.parse_decimal(positive, significand, 0))),
512
58.2k
            b'e' | b'E' => ParserNumber::F64(tri!(self.parse_exponent(positive, significand, 0))),
513
            _ => {
514
2.22M
                if positive {
515
2.21M
                    ParserNumber::U64(significand)
516
                } else {
517
19.4k
                    let neg = (significand as i64).wrapping_neg();
518
519
                    // Convert into a float if we underflow, or on `-0`.
520
19.4k
                    if neg >= 0 {
521
839
                        ParserNumber::F64(-(significand as f64))
522
                    } else {
523
18.6k
                        ParserNumber::I64(neg)
524
                    }
525
                }
526
            }
527
        })
528
2.32M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_number
529
530
87.1k
    fn parse_decimal(
531
87.1k
        &mut self,
532
87.1k
        positive: bool,
533
87.1k
        mut significand: u64,
534
87.1k
        exponent_before_decimal_point: i32,
535
87.1k
    ) -> Result<f64> {
536
87.1k
        self.eat_char();
537
538
87.1k
        let mut exponent_after_decimal_point = 0;
539
13.0M
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
540
12.9M
            let digit = (c - b'0') as u64;
541
542
12.9M
            if overflow!(significand * 10 + digit, u64::MAX) {
543
42.0k
                let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
544
42.0k
                return self.parse_decimal_overflow(positive, significand, exponent);
545
12.9M
            }
546
547
12.9M
            self.eat_char();
548
12.9M
            significand = significand * 10 + digit;
549
12.9M
            exponent_after_decimal_point -= 1;
550
        }
551
552
        // Error if there is not at least one digit after the decimal point.
553
45.0k
        if exponent_after_decimal_point == 0 {
554
64
            match tri!(self.peek()) {
555
45
                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
556
19
                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
557
            }
558
45.0k
        }
559
560
45.0k
        let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
561
45.0k
        match tri!(self.peek_or_null()) {
562
15.8k
            b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
563
29.1k
            _ => self.f64_from_parts(positive, significand, exponent),
564
        }
565
87.1k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_decimal
Line
Count
Source
530
87.1k
    fn parse_decimal(
531
87.1k
        &mut self,
532
87.1k
        positive: bool,
533
87.1k
        mut significand: u64,
534
87.1k
        exponent_before_decimal_point: i32,
535
87.1k
    ) -> Result<f64> {
536
87.1k
        self.eat_char();
537
538
87.1k
        let mut exponent_after_decimal_point = 0;
539
13.0M
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
540
12.9M
            let digit = (c - b'0') as u64;
541
542
12.9M
            if overflow!(significand * 10 + digit, u64::MAX) {
543
42.0k
                let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
544
42.0k
                return self.parse_decimal_overflow(positive, significand, exponent);
545
12.9M
            }
546
547
12.9M
            self.eat_char();
548
12.9M
            significand = significand * 10 + digit;
549
12.9M
            exponent_after_decimal_point -= 1;
550
        }
551
552
        // Error if there is not at least one digit after the decimal point.
553
45.0k
        if exponent_after_decimal_point == 0 {
554
64
            match tri!(self.peek()) {
555
45
                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
556
19
                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
557
            }
558
45.0k
        }
559
560
45.0k
        let exponent = exponent_before_decimal_point + exponent_after_decimal_point;
561
45.0k
        match tri!(self.peek_or_null()) {
562
15.8k
            b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
563
29.1k
            _ => self.f64_from_parts(positive, significand, exponent),
564
        }
565
87.1k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_decimal
566
567
86.4k
    fn parse_exponent(
568
86.4k
        &mut self,
569
86.4k
        positive: bool,
570
86.4k
        significand: u64,
571
86.4k
        starting_exp: i32,
572
86.4k
    ) -> Result<f64> {
573
86.4k
        self.eat_char();
574
575
86.4k
        let positive_exp = match tri!(self.peek_or_null()) {
576
            b'+' => {
577
28.2k
                self.eat_char();
578
28.2k
                true
579
            }
580
            b'-' => {
581
35.5k
                self.eat_char();
582
35.5k
                false
583
            }
584
22.6k
            _ => true,
585
        };
586
587
86.4k
        let next = match tri!(self.next_char()) {
588
86.3k
            Some(b) => b,
589
            None => {
590
99
                return Err(self.error(ErrorCode::EofWhileParsingValue));
591
            }
592
        };
593
594
        // Make sure a digit follows the exponent place.
595
86.3k
        let mut exp = match next {
596
86.3k
            c @ b'0'..=b'9' => (c - b'0') as i32,
597
            _ => {
598
31
                return Err(self.error(ErrorCode::InvalidNumber));
599
            }
600
        };
601
602
340k
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
603
271k
            self.eat_char();
604
271k
            let digit = (c - b'0') as i32;
605
606
271k
            if overflow!(exp * 10 + digit, i32::MAX) {
607
17.7k
                let zero_significand = significand == 0;
608
17.7k
                return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
609
254k
            }
610
611
254k
            exp = exp * 10 + digit;
612
        }
613
614
68.5k
        let final_exp = if positive_exp {
615
49.8k
            starting_exp.saturating_add(exp)
616
        } else {
617
18.6k
            starting_exp.saturating_sub(exp)
618
        };
619
620
68.5k
        self.f64_from_parts(positive, significand, final_exp)
621
86.4k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_exponent
Line
Count
Source
567
86.4k
    fn parse_exponent(
568
86.4k
        &mut self,
569
86.4k
        positive: bool,
570
86.4k
        significand: u64,
571
86.4k
        starting_exp: i32,
572
86.4k
    ) -> Result<f64> {
573
86.4k
        self.eat_char();
574
575
86.4k
        let positive_exp = match tri!(self.peek_or_null()) {
576
            b'+' => {
577
28.2k
                self.eat_char();
578
28.2k
                true
579
            }
580
            b'-' => {
581
35.5k
                self.eat_char();
582
35.5k
                false
583
            }
584
22.6k
            _ => true,
585
        };
586
587
86.4k
        let next = match tri!(self.next_char()) {
588
86.3k
            Some(b) => b,
589
            None => {
590
99
                return Err(self.error(ErrorCode::EofWhileParsingValue));
591
            }
592
        };
593
594
        // Make sure a digit follows the exponent place.
595
86.3k
        let mut exp = match next {
596
86.3k
            c @ b'0'..=b'9' => (c - b'0') as i32,
597
            _ => {
598
31
                return Err(self.error(ErrorCode::InvalidNumber));
599
            }
600
        };
601
602
340k
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
603
271k
            self.eat_char();
604
271k
            let digit = (c - b'0') as i32;
605
606
271k
            if overflow!(exp * 10 + digit, i32::MAX) {
607
17.7k
                let zero_significand = significand == 0;
608
17.7k
                return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
609
254k
            }
610
611
254k
            exp = exp * 10 + digit;
612
        }
613
614
68.5k
        let final_exp = if positive_exp {
615
49.8k
            starting_exp.saturating_add(exp)
616
        } else {
617
18.6k
            starting_exp.saturating_sub(exp)
618
        };
619
620
68.5k
        self.f64_from_parts(positive, significand, final_exp)
621
86.4k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_exponent
622
623
    #[cfg(feature = "float_roundtrip")]
624
    fn f64_from_parts(&mut self, positive: bool, significand: u64, exponent: i32) -> Result<f64> {
625
        let f = if self.single_precision {
626
            lexical::parse_concise_float::<f32>(significand, exponent) as f64
627
        } else {
628
            lexical::parse_concise_float::<f64>(significand, exponent)
629
        };
630
631
        if f.is_infinite() {
632
            Err(self.error(ErrorCode::NumberOutOfRange))
633
        } else {
634
            Ok(if positive { f } else { -f })
635
        }
636
    }
637
638
    #[cfg(not(feature = "float_roundtrip"))]
639
153k
    fn f64_from_parts(
640
153k
        &mut self,
641
153k
        positive: bool,
642
153k
        significand: u64,
643
153k
        mut exponent: i32,
644
153k
    ) -> Result<f64> {
645
153k
        let mut f = significand as f64;
646
        loop {
647
186k
            match POW10.get(exponent.wrapping_abs() as usize) {
648
135k
                Some(&pow) => {
649
135k
                    if exponent >= 0 {
650
111k
                        f *= pow;
651
111k
                        if f.is_infinite() {
652
7
                            return Err(self.error(ErrorCode::NumberOutOfRange));
653
111k
                        }
654
24.1k
                    } else {
655
24.1k
                        f /= pow;
656
24.1k
                    }
657
135k
                    break;
658
                }
659
                None => {
660
50.9k
                    if f == 0.0 {
661
17.0k
                        break;
662
33.8k
                    }
663
33.8k
                    if exponent >= 0 {
664
163
                        return Err(self.error(ErrorCode::NumberOutOfRange));
665
33.7k
                    }
666
33.7k
                    f /= 1e308;
667
33.7k
                    exponent += 308;
668
                }
669
            }
670
        }
671
153k
        Ok(if positive { f } else { -f })
672
153k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::f64_from_parts
Line
Count
Source
639
153k
    fn f64_from_parts(
640
153k
        &mut self,
641
153k
        positive: bool,
642
153k
        significand: u64,
643
153k
        mut exponent: i32,
644
153k
    ) -> Result<f64> {
645
153k
        let mut f = significand as f64;
646
        loop {
647
186k
            match POW10.get(exponent.wrapping_abs() as usize) {
648
135k
                Some(&pow) => {
649
135k
                    if exponent >= 0 {
650
111k
                        f *= pow;
651
111k
                        if f.is_infinite() {
652
7
                            return Err(self.error(ErrorCode::NumberOutOfRange));
653
111k
                        }
654
24.1k
                    } else {
655
24.1k
                        f /= pow;
656
24.1k
                    }
657
135k
                    break;
658
                }
659
                None => {
660
50.9k
                    if f == 0.0 {
661
17.0k
                        break;
662
33.8k
                    }
663
33.8k
                    if exponent >= 0 {
664
163
                        return Err(self.error(ErrorCode::NumberOutOfRange));
665
33.7k
                    }
666
33.7k
                    f /= 1e308;
667
33.7k
                    exponent += 308;
668
                }
669
            }
670
        }
671
153k
        Ok(if positive { f } else { -f })
672
153k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::f64_from_parts
673
674
    #[cfg(feature = "float_roundtrip")]
675
    #[cold]
676
    #[inline(never)]
677
    fn parse_long_integer(&mut self, positive: bool, partial_significand: u64) -> Result<f64> {
678
        // To deserialize floats we'll first push the integer and fraction
679
        // parts, both as byte strings, into the scratch buffer and then feed
680
        // both slices to lexical's parser. For example if the input is
681
        // `12.34e5` we'll push b"1234" into scratch and then pass b"12" and
682
        // b"34" to lexical. `integer_end` will be used to track where to split
683
        // the scratch buffer.
684
        //
685
        // Note that lexical expects the integer part to contain *no* leading
686
        // zeroes and the fraction part to contain *no* trailing zeroes. The
687
        // first requirement is already handled by the integer parsing logic.
688
        // The second requirement will be enforced just before passing the
689
        // slices to lexical in f64_long_from_parts.
690
        self.scratch.clear();
691
        self.scratch
692
            .extend_from_slice(itoa::Buffer::new().format(partial_significand).as_bytes());
693
694
        loop {
695
            match tri!(self.peek_or_null()) {
696
                c @ b'0'..=b'9' => {
697
                    self.scratch.push(c);
698
                    self.eat_char();
699
                }
700
                b'.' => {
701
                    self.eat_char();
702
                    return self.parse_long_decimal(positive, self.scratch.len());
703
                }
704
                b'e' | b'E' => {
705
                    return self.parse_long_exponent(positive, self.scratch.len());
706
                }
707
                _ => {
708
                    return self.f64_long_from_parts(positive, self.scratch.len(), 0);
709
                }
710
            }
711
        }
712
    }
713
714
    #[cfg(not(feature = "float_roundtrip"))]
715
    #[cold]
716
    #[inline(never)]
717
71.6k
    fn parse_long_integer(&mut self, positive: bool, significand: u64) -> Result<f64> {
718
71.6k
        let mut exponent = 0;
719
        loop {
720
9.56M
            match tri!(self.peek_or_null()) {
721
9.50M
                b'0'..=b'9' => {
722
9.49M
                    self.eat_char();
723
9.49M
                    // This could overflow... if your integer is gigabytes long.
724
9.49M
                    // Ignore that possibility.
725
9.49M
                    exponent += 1;
726
9.49M
                }
727
                b'.' => {
728
45.8k
                    return self.parse_decimal(positive, significand, exponent);
729
                }
730
                b'e' | b'E' => {
731
2.04k
                    return self.parse_exponent(positive, significand, exponent);
732
                }
733
                _ => {
734
23.7k
                    return self.f64_from_parts(positive, significand, exponent);
735
                }
736
            }
737
        }
738
71.6k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_long_integer
Line
Count
Source
717
71.6k
    fn parse_long_integer(&mut self, positive: bool, significand: u64) -> Result<f64> {
718
71.6k
        let mut exponent = 0;
719
        loop {
720
9.56M
            match tri!(self.peek_or_null()) {
721
9.50M
                b'0'..=b'9' => {
722
9.49M
                    self.eat_char();
723
9.49M
                    // This could overflow... if your integer is gigabytes long.
724
9.49M
                    // Ignore that possibility.
725
9.49M
                    exponent += 1;
726
9.49M
                }
727
                b'.' => {
728
45.8k
                    return self.parse_decimal(positive, significand, exponent);
729
                }
730
                b'e' | b'E' => {
731
2.04k
                    return self.parse_exponent(positive, significand, exponent);
732
                }
733
                _ => {
734
23.7k
                    return self.f64_from_parts(positive, significand, exponent);
735
                }
736
            }
737
        }
738
71.6k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_long_integer
739
740
    #[cfg(feature = "float_roundtrip")]
741
    #[cold]
742
    fn parse_long_decimal(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
743
        let mut at_least_one_digit = integer_end < self.scratch.len();
744
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
745
            self.scratch.push(c);
746
            self.eat_char();
747
            at_least_one_digit = true;
748
        }
749
750
        if !at_least_one_digit {
751
            match tri!(self.peek()) {
752
                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
753
                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
754
            }
755
        }
756
757
        match tri!(self.peek_or_null()) {
758
            b'e' | b'E' => self.parse_long_exponent(positive, integer_end),
759
            _ => self.f64_long_from_parts(positive, integer_end, 0),
760
        }
761
    }
762
763
    #[cfg(feature = "float_roundtrip")]
764
    fn parse_long_exponent(&mut self, positive: bool, integer_end: usize) -> Result<f64> {
765
        self.eat_char();
766
767
        let positive_exp = match tri!(self.peek_or_null()) {
768
            b'+' => {
769
                self.eat_char();
770
                true
771
            }
772
            b'-' => {
773
                self.eat_char();
774
                false
775
            }
776
            _ => true,
777
        };
778
779
        let next = match tri!(self.next_char()) {
780
            Some(b) => b,
781
            None => {
782
                return Err(self.error(ErrorCode::EofWhileParsingValue));
783
            }
784
        };
785
786
        // Make sure a digit follows the exponent place.
787
        let mut exp = match next {
788
            c @ b'0'..=b'9' => (c - b'0') as i32,
789
            _ => {
790
                return Err(self.error(ErrorCode::InvalidNumber));
791
            }
792
        };
793
794
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
795
            self.eat_char();
796
            let digit = (c - b'0') as i32;
797
798
            if overflow!(exp * 10 + digit, i32::MAX) {
799
                let zero_significand = self.scratch.iter().all(|&digit| digit == b'0');
800
                return self.parse_exponent_overflow(positive, zero_significand, positive_exp);
801
            }
802
803
            exp = exp * 10 + digit;
804
        }
805
806
        let final_exp = if positive_exp { exp } else { -exp };
807
808
        self.f64_long_from_parts(positive, integer_end, final_exp)
809
    }
810
811
    // This cold code should not be inlined into the middle of the hot
812
    // decimal-parsing loop above.
813
    #[cfg(feature = "float_roundtrip")]
814
    #[cold]
815
    #[inline(never)]
816
    fn parse_decimal_overflow(
817
        &mut self,
818
        positive: bool,
819
        significand: u64,
820
        exponent: i32,
821
    ) -> Result<f64> {
822
        let mut buffer = itoa::Buffer::new();
823
        let significand = buffer.format(significand);
824
        let fraction_digits = -exponent as usize;
825
        self.scratch.clear();
826
        if let Some(zeros) = fraction_digits.checked_sub(significand.len() + 1) {
827
            self.scratch.extend(iter::repeat(b'0').take(zeros + 1));
828
        }
829
        self.scratch.extend_from_slice(significand.as_bytes());
830
        let integer_end = self.scratch.len() - fraction_digits;
831
        self.parse_long_decimal(positive, integer_end)
832
    }
833
834
    #[cfg(not(feature = "float_roundtrip"))]
835
    #[cold]
836
    #[inline(never)]
837
42.0k
    fn parse_decimal_overflow(
838
42.0k
        &mut self,
839
42.0k
        positive: bool,
840
42.0k
        significand: u64,
841
42.0k
        exponent: i32,
842
42.0k
    ) -> Result<f64> {
843
        // The next multiply/add would overflow, so just ignore all further
844
        // digits.
845
210k
        while let b'0'..=b'9' = tri!(self.peek_or_null()) {
846
168k
            self.eat_char();
847
168k
        }
848
849
42.0k
        match tri!(self.peek_or_null()) {
850
10.3k
            b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
851
31.7k
            _ => self.f64_from_parts(positive, significand, exponent),
852
        }
853
42.0k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_decimal_overflow
Line
Count
Source
837
42.0k
    fn parse_decimal_overflow(
838
42.0k
        &mut self,
839
42.0k
        positive: bool,
840
42.0k
        significand: u64,
841
42.0k
        exponent: i32,
842
42.0k
    ) -> Result<f64> {
843
        // The next multiply/add would overflow, so just ignore all further
844
        // digits.
845
210k
        while let b'0'..=b'9' = tri!(self.peek_or_null()) {
846
168k
            self.eat_char();
847
168k
        }
848
849
42.0k
        match tri!(self.peek_or_null()) {
850
10.3k
            b'e' | b'E' => self.parse_exponent(positive, significand, exponent),
851
31.7k
            _ => self.f64_from_parts(positive, significand, exponent),
852
        }
853
42.0k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_decimal_overflow
854
855
    // This cold code should not be inlined into the middle of the hot
856
    // exponent-parsing loop above.
857
    #[cold]
858
    #[inline(never)]
859
17.7k
    fn parse_exponent_overflow(
860
17.7k
        &mut self,
861
17.7k
        positive: bool,
862
17.7k
        zero_significand: bool,
863
17.7k
        positive_exp: bool,
864
17.7k
    ) -> Result<f64> {
865
        // Error instead of +/- infinity.
866
17.7k
        if !zero_significand && positive_exp {
867
153
            return Err(self.error(ErrorCode::NumberOutOfRange));
868
17.6k
        }
869
870
126k
        while let b'0'..=b'9' = tri!(self.peek_or_null()) {
871
108k
            self.eat_char();
872
108k
        }
873
17.6k
        Ok(if positive { 0.0 } else { -0.0 })
874
17.7k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_exponent_overflow
Line
Count
Source
859
17.7k
    fn parse_exponent_overflow(
860
17.7k
        &mut self,
861
17.7k
        positive: bool,
862
17.7k
        zero_significand: bool,
863
17.7k
        positive_exp: bool,
864
17.7k
    ) -> Result<f64> {
865
        // Error instead of +/- infinity.
866
17.7k
        if !zero_significand && positive_exp {
867
153
            return Err(self.error(ErrorCode::NumberOutOfRange));
868
17.6k
        }
869
870
126k
        while let b'0'..=b'9' = tri!(self.peek_or_null()) {
871
108k
            self.eat_char();
872
108k
        }
873
17.6k
        Ok(if positive { 0.0 } else { -0.0 })
874
17.7k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_exponent_overflow
875
876
    #[cfg(feature = "float_roundtrip")]
877
    fn f64_long_from_parts(
878
        &mut self,
879
        positive: bool,
880
        integer_end: usize,
881
        exponent: i32,
882
    ) -> Result<f64> {
883
        let integer = &self.scratch[..integer_end];
884
        let fraction = &self.scratch[integer_end..];
885
886
        let f = if self.single_precision {
887
            lexical::parse_truncated_float::<f32>(integer, fraction, exponent) as f64
888
        } else {
889
            lexical::parse_truncated_float::<f64>(integer, fraction, exponent)
890
        };
891
892
        if f.is_infinite() {
893
            Err(self.error(ErrorCode::NumberOutOfRange))
894
        } else {
895
            Ok(if positive { f } else { -f })
896
        }
897
    }
898
899
0
    fn parse_any_signed_number(&mut self) -> Result<ParserNumber> {
900
0
        let peek = match tri!(self.peek()) {
901
0
            Some(b) => b,
902
            None => {
903
0
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
904
            }
905
        };
906
907
0
        let value = match peek {
908
            b'-' => {
909
0
                self.eat_char();
910
0
                self.parse_any_number(false)
911
            }
912
0
            b'0'..=b'9' => self.parse_any_number(true),
913
0
            _ => Err(self.peek_error(ErrorCode::InvalidNumber)),
914
        };
915
916
0
        let value = match tri!(self.peek()) {
917
0
            Some(_) => Err(self.peek_error(ErrorCode::InvalidNumber)),
918
0
            None => value,
919
        };
920
921
0
        match value {
922
0
            Ok(value) => Ok(value),
923
            // The de::Error impl creates errors with unknown line and column.
924
            // Fill in the position here by looking at the current index in the
925
            // input. There is no way to tell whether this should call `error`
926
            // or `peek_error` so pick the one that seems correct more often.
927
            // Worst case, the position is off by one character.
928
0
            Err(err) => Err(self.fix_position(err)),
929
        }
930
0
    }
931
932
    #[cfg(not(feature = "arbitrary_precision"))]
933
2.40M
    fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
934
2.40M
        self.parse_integer(positive)
935
2.40M
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_any_number
Line
Count
Source
933
2.40M
    fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
934
2.40M
        self.parse_integer(positive)
935
2.40M
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_any_number
936
937
    #[cfg(feature = "arbitrary_precision")]
938
    fn parse_any_number(&mut self, positive: bool) -> Result<ParserNumber> {
939
        let mut buf = String::with_capacity(16);
940
        if !positive {
941
            buf.push('-');
942
        }
943
        tri!(self.scan_integer(&mut buf));
944
        if positive {
945
            if let Ok(unsigned) = buf.parse() {
946
                return Ok(ParserNumber::U64(unsigned));
947
            }
948
        } else {
949
            if let Ok(signed) = buf.parse() {
950
                return Ok(ParserNumber::I64(signed));
951
            }
952
        }
953
        Ok(ParserNumber::String(buf))
954
    }
955
956
    #[cfg(feature = "arbitrary_precision")]
957
    fn scan_or_eof(&mut self, buf: &mut String) -> Result<u8> {
958
        match tri!(self.next_char()) {
959
            Some(b) => {
960
                buf.push(b as char);
961
                Ok(b)
962
            }
963
            None => Err(self.error(ErrorCode::EofWhileParsingValue)),
964
        }
965
    }
966
967
    #[cfg(feature = "arbitrary_precision")]
968
    fn scan_integer(&mut self, buf: &mut String) -> Result<()> {
969
        match tri!(self.scan_or_eof(buf)) {
970
            b'0' => {
971
                // There can be only one leading '0'.
972
                match tri!(self.peek_or_null()) {
973
                    b'0'..=b'9' => Err(self.peek_error(ErrorCode::InvalidNumber)),
974
                    _ => self.scan_number(buf),
975
                }
976
            }
977
            b'1'..=b'9' => loop {
978
                match tri!(self.peek_or_null()) {
979
                    c @ b'0'..=b'9' => {
980
                        self.eat_char();
981
                        buf.push(c as char);
982
                    }
983
                    _ => {
984
                        return self.scan_number(buf);
985
                    }
986
                }
987
            },
988
            _ => Err(self.error(ErrorCode::InvalidNumber)),
989
        }
990
    }
991
992
    #[cfg(feature = "arbitrary_precision")]
993
    fn scan_number(&mut self, buf: &mut String) -> Result<()> {
994
        match tri!(self.peek_or_null()) {
995
            b'.' => self.scan_decimal(buf),
996
            e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
997
            _ => Ok(()),
998
        }
999
    }
1000
1001
    #[cfg(feature = "arbitrary_precision")]
1002
    fn scan_decimal(&mut self, buf: &mut String) -> Result<()> {
1003
        self.eat_char();
1004
        buf.push('.');
1005
1006
        let mut at_least_one_digit = false;
1007
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1008
            self.eat_char();
1009
            buf.push(c as char);
1010
            at_least_one_digit = true;
1011
        }
1012
1013
        if !at_least_one_digit {
1014
            match tri!(self.peek()) {
1015
                Some(_) => return Err(self.peek_error(ErrorCode::InvalidNumber)),
1016
                None => return Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1017
            }
1018
        }
1019
1020
        match tri!(self.peek_or_null()) {
1021
            e @ (b'e' | b'E') => self.scan_exponent(e as char, buf),
1022
            _ => Ok(()),
1023
        }
1024
    }
1025
1026
    #[cfg(feature = "arbitrary_precision")]
1027
    fn scan_exponent(&mut self, e: char, buf: &mut String) -> Result<()> {
1028
        self.eat_char();
1029
        buf.push(e);
1030
1031
        match tri!(self.peek_or_null()) {
1032
            b'+' => {
1033
                self.eat_char();
1034
                buf.push('+');
1035
            }
1036
            b'-' => {
1037
                self.eat_char();
1038
                buf.push('-');
1039
            }
1040
            _ => {}
1041
        }
1042
1043
        // Make sure a digit follows the exponent place.
1044
        match tri!(self.scan_or_eof(buf)) {
1045
            b'0'..=b'9' => {}
1046
            _ => {
1047
                return Err(self.error(ErrorCode::InvalidNumber));
1048
            }
1049
        }
1050
1051
        while let c @ b'0'..=b'9' = tri!(self.peek_or_null()) {
1052
            self.eat_char();
1053
            buf.push(c as char);
1054
        }
1055
1056
        Ok(())
1057
    }
1058
1059
275k
    fn parse_object_colon(&mut self) -> Result<()> {
1060
275k
        match tri!(self.parse_whitespace()) {
1061
            Some(b':') => {
1062
275k
                self.eat_char();
1063
275k
                Ok(())
1064
            }
1065
77
            Some(_) => Err(self.peek_error(ErrorCode::ExpectedColon)),
1066
185
            None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1067
        }
1068
275k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::parse_object_colon
Line
Count
Source
1059
275k
    fn parse_object_colon(&mut self) -> Result<()> {
1060
275k
        match tri!(self.parse_whitespace()) {
1061
            Some(b':') => {
1062
275k
                self.eat_char();
1063
275k
                Ok(())
1064
            }
1065
77
            Some(_) => Err(self.peek_error(ErrorCode::ExpectedColon)),
1066
185
            None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1067
        }
1068
275k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::parse_object_colon
1069
1070
31.1k
    fn end_seq(&mut self) -> Result<()> {
1071
31.1k
        match tri!(self.parse_whitespace()) {
1072
            Some(b']') => {
1073
12.8k
                self.eat_char();
1074
12.8k
                Ok(())
1075
            }
1076
            Some(b',') => {
1077
353
                self.eat_char();
1078
353
                match self.parse_whitespace() {
1079
69
                    Ok(Some(b']')) => Err(self.peek_error(ErrorCode::TrailingComma)),
1080
284
                    _ => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1081
                }
1082
            }
1083
4.49k
            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1084
13.5k
            None => Err(self.peek_error(ErrorCode::EofWhileParsingList)),
1085
        }
1086
31.1k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::end_seq
Line
Count
Source
1070
31.1k
    fn end_seq(&mut self) -> Result<()> {
1071
31.1k
        match tri!(self.parse_whitespace()) {
1072
            Some(b']') => {
1073
12.8k
                self.eat_char();
1074
12.8k
                Ok(())
1075
            }
1076
            Some(b',') => {
1077
353
                self.eat_char();
1078
353
                match self.parse_whitespace() {
1079
69
                    Ok(Some(b']')) => Err(self.peek_error(ErrorCode::TrailingComma)),
1080
284
                    _ => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1081
                }
1082
            }
1083
4.49k
            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1084
13.5k
            None => Err(self.peek_error(ErrorCode::EofWhileParsingList)),
1085
        }
1086
31.1k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::end_seq
1087
1088
9.29k
    fn end_map(&mut self) -> Result<()> {
1089
9.29k
        match tri!(self.parse_whitespace()) {
1090
            Some(b'}') => {
1091
1.32k
                self.eat_char();
1092
1.32k
                Ok(())
1093
            }
1094
134
            Some(b',') => Err(self.peek_error(ErrorCode::TrailingComma)),
1095
1.93k
            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1096
5.90k
            None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1097
        }
1098
9.29k
    }
<serde_json::de::Deserializer<serde_json::read::SliceRead>>::end_map
Line
Count
Source
1088
9.29k
    fn end_map(&mut self) -> Result<()> {
1089
9.29k
        match tri!(self.parse_whitespace()) {
1090
            Some(b'}') => {
1091
1.32k
                self.eat_char();
1092
1.32k
                Ok(())
1093
            }
1094
134
            Some(b',') => Err(self.peek_error(ErrorCode::TrailingComma)),
1095
1.93k
            Some(_) => Err(self.peek_error(ErrorCode::TrailingCharacters)),
1096
5.90k
            None => Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1097
        }
1098
9.29k
    }
Unexecuted instantiation: <serde_json::de::Deserializer<serde_json::read::StrRead>>::end_map
1099
1100
    fn ignore_value(&mut self) -> Result<()> {
1101
        self.scratch.clear();
1102
        let mut enclosing = None;
1103
1104
        loop {
1105
            let peek = match tri!(self.parse_whitespace()) {
1106
                Some(b) => b,
1107
                None => {
1108
                    return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1109
                }
1110
            };
1111
1112
            let frame = match peek {
1113
                b'n' => {
1114
                    self.eat_char();
1115
                    tri!(self.parse_ident(b"ull"));
1116
                    None
1117
                }
1118
                b't' => {
1119
                    self.eat_char();
1120
                    tri!(self.parse_ident(b"rue"));
1121
                    None
1122
                }
1123
                b'f' => {
1124
                    self.eat_char();
1125
                    tri!(self.parse_ident(b"alse"));
1126
                    None
1127
                }
1128
                b'-' => {
1129
                    self.eat_char();
1130
                    tri!(self.ignore_integer());
1131
                    None
1132
                }
1133
                b'0'..=b'9' => {
1134
                    tri!(self.ignore_integer());
1135
                    None
1136
                }
1137
                b'"' => {
1138
                    self.eat_char();
1139
                    tri!(self.read.ignore_str());
1140
                    None
1141
                }
1142
                frame @ (b'[' | b'{') => {
1143
                    self.scratch.extend(enclosing.take());
1144
                    self.eat_char();
1145
                    Some(frame)
1146
                }
1147
                _ => return Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1148
            };
1149
1150
            let (mut accept_comma, mut frame) = match frame {
1151
                Some(frame) => (false, frame),
1152
                None => match enclosing.take() {
1153
                    Some(frame) => (true, frame),
1154
                    None => match self.scratch.pop() {
1155
                        Some(frame) => (true, frame),
1156
                        None => return Ok(()),
1157
                    },
1158
                },
1159
            };
1160
1161
            loop {
1162
                match tri!(self.parse_whitespace()) {
1163
                    Some(b',') if accept_comma => {
1164
                        self.eat_char();
1165
                        break;
1166
                    }
1167
                    Some(b']') if frame == b'[' => {}
1168
                    Some(b'}') if frame == b'{' => {}
1169
                    Some(_) => {
1170
                        if accept_comma {
1171
                            return Err(self.peek_error(match frame {
1172
                                b'[' => ErrorCode::ExpectedListCommaOrEnd,
1173
                                b'{' => ErrorCode::ExpectedObjectCommaOrEnd,
1174
                                _ => unreachable!(),
1175
                            }));
1176
                        } else {
1177
                            break;
1178
                        }
1179
                    }
1180
                    None => {
1181
                        return Err(self.peek_error(match frame {
1182
                            b'[' => ErrorCode::EofWhileParsingList,
1183
                            b'{' => ErrorCode::EofWhileParsingObject,
1184
                            _ => unreachable!(),
1185
                        }));
1186
                    }
1187
                }
1188
1189
                self.eat_char();
1190
                frame = match self.scratch.pop() {
1191
                    Some(frame) => frame,
1192
                    None => return Ok(()),
1193
                };
1194
                accept_comma = true;
1195
            }
1196
1197
            if frame == b'{' {
1198
                match tri!(self.parse_whitespace()) {
1199
                    Some(b'"') => self.eat_char(),
1200
                    Some(_) => return Err(self.peek_error(ErrorCode::KeyMustBeAString)),
1201
                    None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1202
                }
1203
                tri!(self.read.ignore_str());
1204
                match tri!(self.parse_whitespace()) {
1205
                    Some(b':') => self.eat_char(),
1206
                    Some(_) => return Err(self.peek_error(ErrorCode::ExpectedColon)),
1207
                    None => return Err(self.peek_error(ErrorCode::EofWhileParsingObject)),
1208
                }
1209
            }
1210
1211
            enclosing = Some(frame);
1212
        }
1213
    }
1214
1215
    fn ignore_integer(&mut self) -> Result<()> {
1216
        match tri!(self.next_char_or_null()) {
1217
            b'0' => {
1218
                // There can be only one leading '0'.
1219
                if let b'0'..=b'9' = tri!(self.peek_or_null()) {
1220
                    return Err(self.peek_error(ErrorCode::InvalidNumber));
1221
                }
1222
            }
1223
            b'1'..=b'9' => {
1224
                while let b'0'..=b'9' = tri!(self.peek_or_null()) {
1225
                    self.eat_char();
1226
                }
1227
            }
1228
            _ => {
1229
                return Err(self.error(ErrorCode::InvalidNumber));
1230
            }
1231
        }
1232
1233
        match tri!(self.peek_or_null()) {
1234
            b'.' => self.ignore_decimal(),
1235
            b'e' | b'E' => self.ignore_exponent(),
1236
            _ => Ok(()),
1237
        }
1238
    }
1239
1240
    fn ignore_decimal(&mut self) -> Result<()> {
1241
        self.eat_char();
1242
1243
        let mut at_least_one_digit = false;
1244
        while let b'0'..=b'9' = tri!(self.peek_or_null()) {
1245
            self.eat_char();
1246
            at_least_one_digit = true;
1247
        }
1248
1249
        if !at_least_one_digit {
1250
            return Err(self.peek_error(ErrorCode::InvalidNumber));
1251
        }
1252
1253
        match tri!(self.peek_or_null()) {
1254
            b'e' | b'E' => self.ignore_exponent(),
1255
            _ => Ok(()),
1256
        }
1257
    }
1258
1259
    fn ignore_exponent(&mut self) -> Result<()> {
1260
        self.eat_char();
1261
1262
        match tri!(self.peek_or_null()) {
1263
            b'+' | b'-' => self.eat_char(),
1264
            _ => {}
1265
        }
1266
1267
        // Make sure a digit follows the exponent place.
1268
        match tri!(self.next_char_or_null()) {
1269
            b'0'..=b'9' => {}
1270
            _ => {
1271
                return Err(self.error(ErrorCode::InvalidNumber));
1272
            }
1273
        }
1274
1275
        while let b'0'..=b'9' = tri!(self.peek_or_null()) {
1276
            self.eat_char();
1277
        }
1278
1279
        Ok(())
1280
    }
1281
1282
    #[cfg(feature = "raw_value")]
1283
    fn deserialize_raw_value<V>(&mut self, visitor: V) -> Result<V::Value>
1284
    where
1285
        V: de::Visitor<'de>,
1286
    {
1287
        tri!(self.parse_whitespace());
1288
        self.read.begin_raw_buffering();
1289
        tri!(self.ignore_value());
1290
        self.read.end_raw_buffering(visitor)
1291
    }
1292
}
1293
1294
impl FromStr for Number {
1295
    type Err = Error;
1296
1297
0
    fn from_str(s: &str) -> result::Result<Self, Self::Err> {
1298
0
        Deserializer::from_str(s)
1299
0
            .parse_any_signed_number()
1300
0
            .map(Into::into)
1301
0
    }
1302
}
1303
1304
#[cfg(not(feature = "float_roundtrip"))]
1305
static POW10: [f64; 309] = [
1306
    1e000, 1e001, 1e002, 1e003, 1e004, 1e005, 1e006, 1e007, 1e008, 1e009, //
1307
    1e010, 1e011, 1e012, 1e013, 1e014, 1e015, 1e016, 1e017, 1e018, 1e019, //
1308
    1e020, 1e021, 1e022, 1e023, 1e024, 1e025, 1e026, 1e027, 1e028, 1e029, //
1309
    1e030, 1e031, 1e032, 1e033, 1e034, 1e035, 1e036, 1e037, 1e038, 1e039, //
1310
    1e040, 1e041, 1e042, 1e043, 1e044, 1e045, 1e046, 1e047, 1e048, 1e049, //
1311
    1e050, 1e051, 1e052, 1e053, 1e054, 1e055, 1e056, 1e057, 1e058, 1e059, //
1312
    1e060, 1e061, 1e062, 1e063, 1e064, 1e065, 1e066, 1e067, 1e068, 1e069, //
1313
    1e070, 1e071, 1e072, 1e073, 1e074, 1e075, 1e076, 1e077, 1e078, 1e079, //
1314
    1e080, 1e081, 1e082, 1e083, 1e084, 1e085, 1e086, 1e087, 1e088, 1e089, //
1315
    1e090, 1e091, 1e092, 1e093, 1e094, 1e095, 1e096, 1e097, 1e098, 1e099, //
1316
    1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109, //
1317
    1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119, //
1318
    1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129, //
1319
    1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139, //
1320
    1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149, //
1321
    1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159, //
1322
    1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169, //
1323
    1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179, //
1324
    1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189, //
1325
    1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199, //
1326
    1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209, //
1327
    1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219, //
1328
    1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229, //
1329
    1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239, //
1330
    1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249, //
1331
    1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259, //
1332
    1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269, //
1333
    1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279, //
1334
    1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289, //
1335
    1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299, //
1336
    1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
1337
];
1338
1339
macro_rules! deserialize_number {
1340
    ($method:ident) => {
1341
        deserialize_number!($method, deserialize_number);
1342
    };
1343
1344
    ($method:ident, $using:ident) => {
1345
        fn $method<V>(self, visitor: V) -> Result<V::Value>
1346
        where
1347
            V: de::Visitor<'de>,
1348
        {
1349
            self.$using(visitor)
1350
        }
1351
    };
1352
}
1353
1354
#[cfg(not(feature = "unbounded_depth"))]
1355
macro_rules! if_checking_recursion_limit {
1356
    ($($body:tt)*) => {
1357
        $($body)*
1358
    };
1359
}
1360
1361
#[cfg(feature = "unbounded_depth")]
1362
macro_rules! if_checking_recursion_limit {
1363
    ($this:ident $($body:tt)*) => {
1364
        if !$this.disable_recursion_limit {
1365
            $this $($body)*
1366
        }
1367
    };
1368
}
1369
1370
macro_rules! check_recursion {
1371
    ($this:ident $($body:tt)*) => {
1372
        if_checking_recursion_limit! {
1373
            $this.remaining_depth -= 1;
1374
            if $this.remaining_depth == 0 {
1375
                return Err($this.peek_error(ErrorCode::RecursionLimitExceeded));
1376
            }
1377
        }
1378
1379
        $this $($body)*
1380
1381
        if_checking_recursion_limit! {
1382
            $this.remaining_depth += 1;
1383
        }
1384
    };
1385
}
1386
1387
impl<'de, R: Read<'de>> de::Deserializer<'de> for &mut Deserializer<R> {
1388
    type Error = Error;
1389
1390
    #[inline]
1391
2.47M
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1392
2.47M
    where
1393
2.47M
        V: de::Visitor<'de>,
1394
    {
1395
2.47M
        let peek = match tri!(self.parse_whitespace()) {
1396
2.47M
            Some(b) => b,
1397
            None => {
1398
77
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1399
            }
1400
        };
1401
1402
2.47M
        let value = match peek {
1403
            b'n' => {
1404
4.76k
                self.eat_char();
1405
4.76k
                tri!(self.parse_ident(b"ull"));
1406
4.65k
                visitor.visit_unit()
1407
            }
1408
            b't' => {
1409
9.96k
                self.eat_char();
1410
9.96k
                tri!(self.parse_ident(b"rue"));
1411
9.88k
                visitor.visit_bool(true)
1412
            }
1413
            b'f' => {
1414
10.6k
                self.eat_char();
1415
10.6k
                tri!(self.parse_ident(b"alse"));
1416
10.4k
                visitor.visit_bool(false)
1417
            }
1418
            b'-' => {
1419
34.8k
                self.eat_char();
1420
34.8k
                tri!(self.parse_any_number(false)).visit(visitor)
1421
            }
1422
2.36M
            b'0'..=b'9' => tri!(self.parse_any_number(true)).visit(visitor),
1423
            b'"' => {
1424
6.81k
                self.eat_char();
1425
6.81k
                self.scratch.clear();
1426
6.81k
                match tri!(self.read.parse_str(&mut self.scratch)) {
1427
1.49k
                    Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1428
3.70k
                    Reference::Copied(s) => visitor.visit_str(s),
1429
                }
1430
            }
1431
            b'[' => {
1432
31.1k
                check_recursion! {
1433
                    self.eat_char();
1434
31.1k
                    let ret = visitor.visit_seq(SeqAccess::new(self));
1435
                }
1436
1437
31.1k
                match (ret, self.end_seq()) {
1438
12.6k
                    (Ok(ret), Ok(())) => Ok(ret),
1439
18.5k
                    (Err(err), _) | (_, Err(err)) => Err(err),
1440
                }
1441
            }
1442
            b'{' => {
1443
9.29k
                check_recursion! {
1444
                    self.eat_char();
1445
9.29k
                    let ret = visitor.visit_map(MapAccess::new(self));
1446
                }
1447
1448
9.29k
                match (ret, self.end_map()) {
1449
1.25k
                    (Ok(ret), Ok(())) => Ok(ret),
1450
8.04k
                    (Err(err), _) | (_, Err(err)) => Err(err),
1451
                }
1452
            }
1453
186
            _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1454
        };
1455
1456
2.47M
        match value {
1457
2.44M
            Ok(value) => Ok(value),
1458
            // The de::Error impl creates errors with unknown line and column.
1459
            // Fill in the position here by looking at the current index in the
1460
            // input. There is no way to tell whether this should call `error`
1461
            // or `peek_error` so pick the one that seems correct more often.
1462
            // Worst case, the position is off by one character.
1463
26.7k
            Err(err) => Err(self.fix_position(err)),
1464
        }
1465
2.47M
    }
<&mut serde_json::de::Deserializer<serde_json::read::SliceRead> as serde_core::de::Deserializer>::deserialize_any::<<serde_json::value::Value as serde_core::de::Deserialize>::deserialize::ValueVisitor>
Line
Count
Source
1391
2.47M
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1392
2.47M
    where
1393
2.47M
        V: de::Visitor<'de>,
1394
    {
1395
2.47M
        let peek = match tri!(self.parse_whitespace()) {
1396
2.47M
            Some(b) => b,
1397
            None => {
1398
77
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1399
            }
1400
        };
1401
1402
2.47M
        let value = match peek {
1403
            b'n' => {
1404
4.76k
                self.eat_char();
1405
4.76k
                tri!(self.parse_ident(b"ull"));
1406
4.65k
                visitor.visit_unit()
1407
            }
1408
            b't' => {
1409
9.96k
                self.eat_char();
1410
9.96k
                tri!(self.parse_ident(b"rue"));
1411
9.88k
                visitor.visit_bool(true)
1412
            }
1413
            b'f' => {
1414
10.6k
                self.eat_char();
1415
10.6k
                tri!(self.parse_ident(b"alse"));
1416
10.4k
                visitor.visit_bool(false)
1417
            }
1418
            b'-' => {
1419
34.8k
                self.eat_char();
1420
34.8k
                tri!(self.parse_any_number(false)).visit(visitor)
1421
            }
1422
2.36M
            b'0'..=b'9' => tri!(self.parse_any_number(true)).visit(visitor),
1423
            b'"' => {
1424
6.81k
                self.eat_char();
1425
6.81k
                self.scratch.clear();
1426
6.81k
                match tri!(self.read.parse_str(&mut self.scratch)) {
1427
1.49k
                    Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1428
3.70k
                    Reference::Copied(s) => visitor.visit_str(s),
1429
                }
1430
            }
1431
            b'[' => {
1432
31.1k
                check_recursion! {
1433
                    self.eat_char();
1434
31.1k
                    let ret = visitor.visit_seq(SeqAccess::new(self));
1435
                }
1436
1437
31.1k
                match (ret, self.end_seq()) {
1438
12.6k
                    (Ok(ret), Ok(())) => Ok(ret),
1439
18.5k
                    (Err(err), _) | (_, Err(err)) => Err(err),
1440
                }
1441
            }
1442
            b'{' => {
1443
9.29k
                check_recursion! {
1444
                    self.eat_char();
1445
9.29k
                    let ret = visitor.visit_map(MapAccess::new(self));
1446
                }
1447
1448
9.29k
                match (ret, self.end_map()) {
1449
1.25k
                    (Ok(ret), Ok(())) => Ok(ret),
1450
8.04k
                    (Err(err), _) | (_, Err(err)) => Err(err),
1451
                }
1452
            }
1453
186
            _ => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1454
        };
1455
1456
2.47M
        match value {
1457
2.44M
            Ok(value) => Ok(value),
1458
            // The de::Error impl creates errors with unknown line and column.
1459
            // Fill in the position here by looking at the current index in the
1460
            // input. There is no way to tell whether this should call `error`
1461
            // or `peek_error` so pick the one that seems correct more often.
1462
            // Worst case, the position is off by one character.
1463
26.7k
            Err(err) => Err(self.fix_position(err)),
1464
        }
1465
2.47M
    }
Unexecuted instantiation: <&mut serde_json::de::Deserializer<serde_json::read::StrRead> as serde_core::de::Deserializer>::deserialize_any::<<serde_json::value::Value as serde_core::de::Deserialize>::deserialize::ValueVisitor>
1466
1467
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
1468
    where
1469
        V: de::Visitor<'de>,
1470
    {
1471
        let peek = match tri!(self.parse_whitespace()) {
1472
            Some(b) => b,
1473
            None => {
1474
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1475
            }
1476
        };
1477
1478
        let value = match peek {
1479
            b't' => {
1480
                self.eat_char();
1481
                tri!(self.parse_ident(b"rue"));
1482
                visitor.visit_bool(true)
1483
            }
1484
            b'f' => {
1485
                self.eat_char();
1486
                tri!(self.parse_ident(b"alse"));
1487
                visitor.visit_bool(false)
1488
            }
1489
            _ => Err(self.peek_invalid_type(&visitor)),
1490
        };
1491
1492
        match value {
1493
            Ok(value) => Ok(value),
1494
            Err(err) => Err(self.fix_position(err)),
1495
        }
1496
    }
1497
1498
    deserialize_number!(deserialize_i8);
1499
    deserialize_number!(deserialize_i16);
1500
    deserialize_number!(deserialize_i32);
1501
    deserialize_number!(deserialize_i64);
1502
    deserialize_number!(deserialize_u8);
1503
    deserialize_number!(deserialize_u16);
1504
    deserialize_number!(deserialize_u32);
1505
    deserialize_number!(deserialize_u64);
1506
    #[cfg(not(feature = "float_roundtrip"))]
1507
    deserialize_number!(deserialize_f32);
1508
    deserialize_number!(deserialize_f64);
1509
1510
    #[cfg(feature = "float_roundtrip")]
1511
    deserialize_number!(deserialize_f32, do_deserialize_f32);
1512
    deserialize_number!(deserialize_i128, do_deserialize_i128);
1513
    deserialize_number!(deserialize_u128, do_deserialize_u128);
1514
1515
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
1516
    where
1517
        V: de::Visitor<'de>,
1518
    {
1519
        self.deserialize_str(visitor)
1520
    }
1521
1522
    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
1523
    where
1524
        V: de::Visitor<'de>,
1525
    {
1526
        let peek = match tri!(self.parse_whitespace()) {
1527
            Some(b) => b,
1528
            None => {
1529
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1530
            }
1531
        };
1532
1533
        let value = match peek {
1534
            b'"' => {
1535
                self.eat_char();
1536
                self.scratch.clear();
1537
                match tri!(self.read.parse_str(&mut self.scratch)) {
1538
                    Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
1539
                    Reference::Copied(s) => visitor.visit_str(s),
1540
                }
1541
            }
1542
            _ => Err(self.peek_invalid_type(&visitor)),
1543
        };
1544
1545
        match value {
1546
            Ok(value) => Ok(value),
1547
            Err(err) => Err(self.fix_position(err)),
1548
        }
1549
    }
1550
1551
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
1552
    where
1553
        V: de::Visitor<'de>,
1554
    {
1555
        self.deserialize_str(visitor)
1556
    }
1557
1558
    /// Parses a JSON string as bytes. Note that this function does not check
1559
    /// whether the bytes represent a valid UTF-8 string.
1560
    ///
1561
    /// The relevant part of the JSON specification is Section 8.2 of [RFC
1562
    /// 7159]:
1563
    ///
1564
    /// > When all the strings represented in a JSON text are composed entirely
1565
    /// > of Unicode characters (however escaped), then that JSON text is
1566
    /// > interoperable in the sense that all software implementations that
1567
    /// > parse it will agree on the contents of names and of string values in
1568
    /// > objects and arrays.
1569
    /// >
1570
    /// > However, the ABNF in this specification allows member names and string
1571
    /// > values to contain bit sequences that cannot encode Unicode characters;
1572
    /// > for example, "\uDEAD" (a single unpaired UTF-16 surrogate). Instances
1573
    /// > of this have been observed, for example, when a library truncates a
1574
    /// > UTF-16 string without checking whether the truncation split a
1575
    /// > surrogate pair.  The behavior of software that receives JSON texts
1576
    /// > containing such values is unpredictable; for example, implementations
1577
    /// > might return different values for the length of a string value or even
1578
    /// > suffer fatal runtime exceptions.
1579
    ///
1580
    /// [RFC 7159]: https://tools.ietf.org/html/rfc7159
1581
    ///
1582
    /// The behavior of serde_json is specified to fail on non-UTF-8 strings
1583
    /// when deserializing into Rust UTF-8 string types such as String, and
1584
    /// succeed with the bytes representing the [WTF-8] encoding of code points
1585
    /// when deserializing using this method.
1586
    ///
1587
    /// [WTF-8]: https://simonsapin.github.io/wtf-8
1588
    ///
1589
    /// Escape sequences are processed as usual, and for `\uXXXX` escapes it is
1590
    /// still checked if the hex number represents a valid Unicode code point.
1591
    ///
1592
    /// # Examples
1593
    ///
1594
    /// You can use this to parse JSON strings containing invalid UTF-8 bytes,
1595
    /// or unpaired surrogates.
1596
    ///
1597
    /// ```
1598
    /// use serde_bytes::ByteBuf;
1599
    ///
1600
    /// fn look_at_bytes() -> Result<(), serde_json::Error> {
1601
    ///     let json_data = b"\"some bytes: \xe5\x00\xe5\"";
1602
    ///     let bytes: ByteBuf = serde_json::from_slice(json_data)?;
1603
    ///
1604
    ///     assert_eq!(b'\xe5', bytes[12]);
1605
    ///     assert_eq!(b'\0', bytes[13]);
1606
    ///     assert_eq!(b'\xe5', bytes[14]);
1607
    ///
1608
    ///     Ok(())
1609
    /// }
1610
    /// #
1611
    /// # look_at_bytes().unwrap();
1612
    /// ```
1613
    ///
1614
    /// Backslash escape sequences like `\n` are still interpreted and required
1615
    /// to be valid. `\u` escape sequences are required to represent a valid
1616
    /// Unicode code point or lone surrogate.
1617
    ///
1618
    /// ```
1619
    /// use serde_bytes::ByteBuf;
1620
    ///
1621
    /// fn look_at_bytes() -> Result<(), serde_json::Error> {
1622
    ///     let json_data = b"\"lone surrogate: \\uD801\"";
1623
    ///     let bytes: ByteBuf = serde_json::from_slice(json_data)?;
1624
    ///     let expected = b"lone surrogate: \xED\xA0\x81";
1625
    ///     assert_eq!(expected, bytes.as_slice());
1626
    ///     Ok(())
1627
    /// }
1628
    /// #
1629
    /// # look_at_bytes();
1630
    /// ```
1631
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
1632
    where
1633
        V: de::Visitor<'de>,
1634
    {
1635
        let peek = match tri!(self.parse_whitespace()) {
1636
            Some(b) => b,
1637
            None => {
1638
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1639
            }
1640
        };
1641
1642
        let value = match peek {
1643
            b'"' => {
1644
                self.eat_char();
1645
                self.scratch.clear();
1646
                match tri!(self.read.parse_str_raw(&mut self.scratch)) {
1647
                    Reference::Borrowed(b) => visitor.visit_borrowed_bytes(b),
1648
                    Reference::Copied(b) => visitor.visit_bytes(b),
1649
                }
1650
            }
1651
            b'[' => self.deserialize_seq(visitor),
1652
            _ => Err(self.peek_invalid_type(&visitor)),
1653
        };
1654
1655
        match value {
1656
            Ok(value) => Ok(value),
1657
            Err(err) => Err(self.fix_position(err)),
1658
        }
1659
    }
1660
1661
    #[inline]
1662
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
1663
    where
1664
        V: de::Visitor<'de>,
1665
    {
1666
        self.deserialize_bytes(visitor)
1667
    }
1668
1669
    /// Parses a `null` as a None, and any other values as a `Some(...)`.
1670
    #[inline]
1671
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
1672
    where
1673
        V: de::Visitor<'de>,
1674
    {
1675
        match tri!(self.parse_whitespace()) {
1676
            Some(b'n') => {
1677
                self.eat_char();
1678
                tri!(self.parse_ident(b"ull"));
1679
                visitor.visit_none()
1680
            }
1681
            _ => visitor.visit_some(self),
1682
        }
1683
    }
1684
1685
    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
1686
    where
1687
        V: de::Visitor<'de>,
1688
    {
1689
        let peek = match tri!(self.parse_whitespace()) {
1690
            Some(b) => b,
1691
            None => {
1692
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1693
            }
1694
        };
1695
1696
        let value = match peek {
1697
            b'n' => {
1698
                self.eat_char();
1699
                tri!(self.parse_ident(b"ull"));
1700
                visitor.visit_unit()
1701
            }
1702
            _ => Err(self.peek_invalid_type(&visitor)),
1703
        };
1704
1705
        match value {
1706
            Ok(value) => Ok(value),
1707
            Err(err) => Err(self.fix_position(err)),
1708
        }
1709
    }
1710
1711
    fn deserialize_unit_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
1712
    where
1713
        V: de::Visitor<'de>,
1714
    {
1715
        self.deserialize_unit(visitor)
1716
    }
1717
1718
    /// Parses a newtype struct as the underlying value.
1719
    #[inline]
1720
    fn deserialize_newtype_struct<V>(self, name: &str, visitor: V) -> Result<V::Value>
1721
    where
1722
        V: de::Visitor<'de>,
1723
    {
1724
        #[cfg(feature = "raw_value")]
1725
        {
1726
            if name == crate::raw::TOKEN {
1727
                return self.deserialize_raw_value(visitor);
1728
            }
1729
        }
1730
1731
        let _ = name;
1732
        visitor.visit_newtype_struct(self)
1733
    }
1734
1735
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
1736
    where
1737
        V: de::Visitor<'de>,
1738
    {
1739
        let peek = match tri!(self.parse_whitespace()) {
1740
            Some(b) => b,
1741
            None => {
1742
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1743
            }
1744
        };
1745
1746
        let value = match peek {
1747
            b'[' => {
1748
                check_recursion! {
1749
                    self.eat_char();
1750
                    let ret = visitor.visit_seq(SeqAccess::new(self));
1751
                }
1752
1753
                match (ret, self.end_seq()) {
1754
                    (Ok(ret), Ok(())) => Ok(ret),
1755
                    (Err(err), _) | (_, Err(err)) => Err(err),
1756
                }
1757
            }
1758
            _ => Err(self.peek_invalid_type(&visitor)),
1759
        };
1760
1761
        match value {
1762
            Ok(value) => Ok(value),
1763
            Err(err) => Err(self.fix_position(err)),
1764
        }
1765
    }
1766
1767
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
1768
    where
1769
        V: de::Visitor<'de>,
1770
    {
1771
        self.deserialize_seq(visitor)
1772
    }
1773
1774
    fn deserialize_tuple_struct<V>(
1775
        self,
1776
        _name: &'static str,
1777
        _len: usize,
1778
        visitor: V,
1779
    ) -> Result<V::Value>
1780
    where
1781
        V: de::Visitor<'de>,
1782
    {
1783
        self.deserialize_seq(visitor)
1784
    }
1785
1786
0
    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
1787
0
    where
1788
0
        V: de::Visitor<'de>,
1789
    {
1790
0
        let peek = match tri!(self.parse_whitespace()) {
1791
0
            Some(b) => b,
1792
            None => {
1793
0
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1794
            }
1795
        };
1796
1797
0
        let value = match peek {
1798
            b'{' => {
1799
0
                check_recursion! {
1800
                    self.eat_char();
1801
0
                    let ret = visitor.visit_map(MapAccess::new(self));
1802
                }
1803
1804
0
                match (ret, self.end_map()) {
1805
0
                    (Ok(ret), Ok(())) => Ok(ret),
1806
0
                    (Err(err), _) | (_, Err(err)) => Err(err),
1807
                }
1808
            }
1809
0
            _ => Err(self.peek_invalid_type(&visitor)),
1810
        };
1811
1812
0
        match value {
1813
0
            Ok(value) => Ok(value),
1814
0
            Err(err) => Err(self.fix_position(err)),
1815
        }
1816
0
    }
1817
1818
    fn deserialize_struct<V>(
1819
        self,
1820
        _name: &'static str,
1821
        _fields: &'static [&'static str],
1822
        visitor: V,
1823
    ) -> Result<V::Value>
1824
    where
1825
        V: de::Visitor<'de>,
1826
    {
1827
        let peek = match tri!(self.parse_whitespace()) {
1828
            Some(b) => b,
1829
            None => {
1830
                return Err(self.peek_error(ErrorCode::EofWhileParsingValue));
1831
            }
1832
        };
1833
1834
        let value = match peek {
1835
            b'[' => {
1836
                check_recursion! {
1837
                    self.eat_char();
1838
                    let ret = visitor.visit_seq(SeqAccess::new(self));
1839
                }
1840
1841
                match (ret, self.end_seq()) {
1842
                    (Ok(ret), Ok(())) => Ok(ret),
1843
                    (Err(err), _) | (_, Err(err)) => Err(err),
1844
                }
1845
            }
1846
            b'{' => {
1847
                check_recursion! {
1848
                    self.eat_char();
1849
                    let ret = visitor.visit_map(MapAccess::new(self));
1850
                }
1851
1852
                match (ret, self.end_map()) {
1853
                    (Ok(ret), Ok(())) => Ok(ret),
1854
                    (Err(err), _) | (_, Err(err)) => Err(err),
1855
                }
1856
            }
1857
            _ => Err(self.peek_invalid_type(&visitor)),
1858
        };
1859
1860
        match value {
1861
            Ok(value) => Ok(value),
1862
            Err(err) => Err(self.fix_position(err)),
1863
        }
1864
    }
1865
1866
    /// Parses an enum as an object like `{"$KEY":$VALUE}`, where $VALUE is either a straight
1867
    /// value, a `[..]`, or a `{..}`.
1868
    #[inline]
1869
    fn deserialize_enum<V>(
1870
        self,
1871
        _name: &str,
1872
        _variants: &'static [&'static str],
1873
        visitor: V,
1874
    ) -> Result<V::Value>
1875
    where
1876
        V: de::Visitor<'de>,
1877
    {
1878
        match tri!(self.parse_whitespace()) {
1879
            Some(b'{') => {
1880
                check_recursion! {
1881
                    self.eat_char();
1882
                    let ret = visitor.visit_enum(VariantAccess::new(self));
1883
                }
1884
                let value = tri!(ret);
1885
1886
                match tri!(self.parse_whitespace()) {
1887
                    Some(b'}') => {
1888
                        self.eat_char();
1889
                        Ok(value)
1890
                    }
1891
                    Some(_) => Err(self.error(ErrorCode::ExpectedSomeValue)),
1892
                    None => Err(self.error(ErrorCode::EofWhileParsingObject)),
1893
                }
1894
            }
1895
            Some(b'"') => visitor.visit_enum(UnitVariantAccess::new(self)),
1896
            Some(_) => Err(self.peek_error(ErrorCode::ExpectedSomeValue)),
1897
            None => Err(self.peek_error(ErrorCode::EofWhileParsingValue)),
1898
        }
1899
    }
1900
1901
    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
1902
    where
1903
        V: de::Visitor<'de>,
1904
    {
1905
        self.deserialize_str(visitor)
1906
    }
1907
1908
    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
1909
    where
1910
        V: de::Visitor<'de>,
1911
    {
1912
        tri!(self.ignore_value());
1913
        visitor.visit_unit()
1914
    }
1915
}
1916
1917
struct SeqAccess<'a, R: 'a> {
1918
    de: &'a mut Deserializer<R>,
1919
    first: bool,
1920
}
1921
1922
impl<'a, R: 'a> SeqAccess<'a, R> {
1923
31.1k
    fn new(de: &'a mut Deserializer<R>) -> Self {
1924
31.1k
        SeqAccess { de, first: true }
1925
31.1k
    }
<serde_json::de::SeqAccess<serde_json::read::SliceRead>>::new
Line
Count
Source
1923
31.1k
    fn new(de: &'a mut Deserializer<R>) -> Self {
1924
31.1k
        SeqAccess { de, first: true }
1925
31.1k
    }
Unexecuted instantiation: <serde_json::de::SeqAccess<serde_json::read::StrRead>>::new
1926
}
1927
1928
impl<'de, 'a, R: Read<'de> + 'a> de::SeqAccess<'de> for SeqAccess<'a, R> {
1929
    type Error = Error;
1930
1931
2.20M
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1932
2.20M
    where
1933
2.20M
        T: de::DeserializeSeed<'de>,
1934
    {
1935
2.20M
        fn has_next_element<'de, 'a, R: Read<'de> + 'a>(
1936
2.20M
            seq: &mut SeqAccess<'a, R>,
1937
2.20M
        ) -> Result<bool> {
1938
2.20M
            let peek = match tri!(seq.de.parse_whitespace()) {
1939
2.20M
                Some(b) => b,
1940
                None => {
1941
573
                    return Err(seq.de.peek_error(ErrorCode::EofWhileParsingList));
1942
                }
1943
            };
1944
1945
2.20M
            if peek == b']' {
1946
12.6k
                Ok(false)
1947
2.19M
            } else if seq.first {
1948
19.2k
                seq.first = false;
1949
19.2k
                Ok(true)
1950
2.17M
            } else if peek == b',' {
1951
2.17M
                seq.de.eat_char();
1952
2.17M
                match tri!(seq.de.parse_whitespace()) {
1953
1
                    Some(b']') => Err(seq.de.peek_error(ErrorCode::TrailingComma)),
1954
2.17M
                    Some(_) => Ok(true),
1955
96
                    None => Err(seq.de.peek_error(ErrorCode::EofWhileParsingValue)),
1956
                }
1957
            } else {
1958
75
                Err(seq.de.peek_error(ErrorCode::ExpectedListCommaOrEnd))
1959
            }
1960
2.20M
        }
<serde_json::de::SeqAccess<_> as serde_core::de::SeqAccess>::next_element_seed::has_next_element::<serde_json::read::SliceRead>
Line
Count
Source
1935
2.20M
        fn has_next_element<'de, 'a, R: Read<'de> + 'a>(
1936
2.20M
            seq: &mut SeqAccess<'a, R>,
1937
2.20M
        ) -> Result<bool> {
1938
2.20M
            let peek = match tri!(seq.de.parse_whitespace()) {
1939
2.20M
                Some(b) => b,
1940
                None => {
1941
573
                    return Err(seq.de.peek_error(ErrorCode::EofWhileParsingList));
1942
                }
1943
            };
1944
1945
2.20M
            if peek == b']' {
1946
12.6k
                Ok(false)
1947
2.19M
            } else if seq.first {
1948
19.2k
                seq.first = false;
1949
19.2k
                Ok(true)
1950
2.17M
            } else if peek == b',' {
1951
2.17M
                seq.de.eat_char();
1952
2.17M
                match tri!(seq.de.parse_whitespace()) {
1953
1
                    Some(b']') => Err(seq.de.peek_error(ErrorCode::TrailingComma)),
1954
2.17M
                    Some(_) => Ok(true),
1955
96
                    None => Err(seq.de.peek_error(ErrorCode::EofWhileParsingValue)),
1956
                }
1957
            } else {
1958
75
                Err(seq.de.peek_error(ErrorCode::ExpectedListCommaOrEnd))
1959
            }
1960
2.20M
        }
Unexecuted instantiation: <serde_json::de::SeqAccess<_> as serde_core::de::SeqAccess>::next_element_seed::has_next_element::<serde_json::read::StrRead>
1961
1962
2.20M
        if tri!(has_next_element(self)) {
1963
2.19M
            Ok(Some(tri!(seed.deserialize(&mut *self.de))))
1964
        } else {
1965
12.6k
            Ok(None)
1966
        }
1967
2.20M
    }
<serde_json::de::SeqAccess<serde_json::read::SliceRead> as serde_core::de::SeqAccess>::next_element_seed::<core::marker::PhantomData<serde_json::value::Value>>
Line
Count
Source
1931
2.20M
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1932
2.20M
    where
1933
2.20M
        T: de::DeserializeSeed<'de>,
1934
    {
1935
        fn has_next_element<'de, 'a, R: Read<'de> + 'a>(
1936
            seq: &mut SeqAccess<'a, R>,
1937
        ) -> Result<bool> {
1938
            let peek = match tri!(seq.de.parse_whitespace()) {
1939
                Some(b) => b,
1940
                None => {
1941
                    return Err(seq.de.peek_error(ErrorCode::EofWhileParsingList));
1942
                }
1943
            };
1944
1945
            if peek == b']' {
1946
                Ok(false)
1947
            } else if seq.first {
1948
                seq.first = false;
1949
                Ok(true)
1950
            } else if peek == b',' {
1951
                seq.de.eat_char();
1952
                match tri!(seq.de.parse_whitespace()) {
1953
                    Some(b']') => Err(seq.de.peek_error(ErrorCode::TrailingComma)),
1954
                    Some(_) => Ok(true),
1955
                    None => Err(seq.de.peek_error(ErrorCode::EofWhileParsingValue)),
1956
                }
1957
            } else {
1958
                Err(seq.de.peek_error(ErrorCode::ExpectedListCommaOrEnd))
1959
            }
1960
        }
1961
1962
2.20M
        if tri!(has_next_element(self)) {
1963
2.19M
            Ok(Some(tri!(seed.deserialize(&mut *self.de))))
1964
        } else {
1965
12.6k
            Ok(None)
1966
        }
1967
2.20M
    }
Unexecuted instantiation: <serde_json::de::SeqAccess<serde_json::read::StrRead> as serde_core::de::SeqAccess>::next_element_seed::<core::marker::PhantomData<serde_json::value::Value>>
1968
}
1969
1970
struct MapAccess<'a, R: 'a> {
1971
    de: &'a mut Deserializer<R>,
1972
    first: bool,
1973
}
1974
1975
impl<'a, R: 'a> MapAccess<'a, R> {
1976
9.29k
    fn new(de: &'a mut Deserializer<R>) -> Self {
1977
9.29k
        MapAccess { de, first: true }
1978
9.29k
    }
<serde_json::de::MapAccess<serde_json::read::SliceRead>>::new
Line
Count
Source
1976
9.29k
    fn new(de: &'a mut Deserializer<R>) -> Self {
1977
9.29k
        MapAccess { de, first: true }
1978
9.29k
    }
Unexecuted instantiation: <serde_json::de::MapAccess<serde_json::read::StrRead>>::new
1979
}
1980
1981
impl<'de, 'a, R: Read<'de> + 'a> de::MapAccess<'de> for MapAccess<'a, R> {
1982
    type Error = Error;
1983
1984
277k
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1985
277k
    where
1986
277k
        K: de::DeserializeSeed<'de>,
1987
    {
1988
277k
        fn has_next_key<'de, 'a, R: Read<'de> + 'a>(map: &mut MapAccess<'a, R>) -> Result<bool> {
1989
277k
            let peek = match tri!(map.de.parse_whitespace()) {
1990
277k
                Some(b) => b,
1991
                None => {
1992
560
                    return Err(map.de.peek_error(ErrorCode::EofWhileParsingObject));
1993
                }
1994
            };
1995
1996
277k
            if peek == b'}' {
1997
1.25k
                Ok(false)
1998
275k
            } else if map.first {
1999
8.93k
                map.first = false;
2000
8.93k
                if peek == b'"' {
2001
8.89k
                    Ok(true)
2002
                } else {
2003
41
                    Err(map.de.peek_error(ErrorCode::KeyMustBeAString))
2004
                }
2005
266k
            } else if peek == b',' {
2006
266k
                map.de.eat_char();
2007
266k
                match tri!(map.de.parse_whitespace()) {
2008
266k
                    Some(b'"') => Ok(true),
2009
1
                    Some(b'}') => Err(map.de.peek_error(ErrorCode::TrailingComma)),
2010
18
                    Some(_) => Err(map.de.peek_error(ErrorCode::KeyMustBeAString)),
2011
64
                    None => Err(map.de.peek_error(ErrorCode::EofWhileParsingValue)),
2012
                }
2013
            } else {
2014
52
                Err(map.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd))
2015
            }
2016
277k
        }
<serde_json::de::MapAccess<_> as serde_core::de::MapAccess>::next_key_seed::has_next_key::<serde_json::read::SliceRead>
Line
Count
Source
1988
277k
        fn has_next_key<'de, 'a, R: Read<'de> + 'a>(map: &mut MapAccess<'a, R>) -> Result<bool> {
1989
277k
            let peek = match tri!(map.de.parse_whitespace()) {
1990
277k
                Some(b) => b,
1991
                None => {
1992
560
                    return Err(map.de.peek_error(ErrorCode::EofWhileParsingObject));
1993
                }
1994
            };
1995
1996
277k
            if peek == b'}' {
1997
1.25k
                Ok(false)
1998
275k
            } else if map.first {
1999
8.93k
                map.first = false;
2000
8.93k
                if peek == b'"' {
2001
8.89k
                    Ok(true)
2002
                } else {
2003
41
                    Err(map.de.peek_error(ErrorCode::KeyMustBeAString))
2004
                }
2005
266k
            } else if peek == b',' {
2006
266k
                map.de.eat_char();
2007
266k
                match tri!(map.de.parse_whitespace()) {
2008
266k
                    Some(b'"') => Ok(true),
2009
1
                    Some(b'}') => Err(map.de.peek_error(ErrorCode::TrailingComma)),
2010
18
                    Some(_) => Err(map.de.peek_error(ErrorCode::KeyMustBeAString)),
2011
64
                    None => Err(map.de.peek_error(ErrorCode::EofWhileParsingValue)),
2012
                }
2013
            } else {
2014
52
                Err(map.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd))
2015
            }
2016
277k
        }
Unexecuted instantiation: <serde_json::de::MapAccess<_> as serde_core::de::MapAccess>::next_key_seed::has_next_key::<serde_json::read::StrRead>
2017
2018
277k
        if tri!(has_next_key(self)) {
2019
275k
            Ok(Some(tri!(seed.deserialize(MapKey { de: &mut *self.de }))))
2020
        } else {
2021
1.25k
            Ok(None)
2022
        }
2023
277k
    }
<serde_json::de::MapAccess<serde_json::read::SliceRead> as serde_core::de::MapAccess>::next_key_seed::<core::marker::PhantomData<alloc::string::String>>
Line
Count
Source
1984
268k
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1985
268k
    where
1986
268k
        K: de::DeserializeSeed<'de>,
1987
    {
1988
        fn has_next_key<'de, 'a, R: Read<'de> + 'a>(map: &mut MapAccess<'a, R>) -> Result<bool> {
1989
            let peek = match tri!(map.de.parse_whitespace()) {
1990
                Some(b) => b,
1991
                None => {
1992
                    return Err(map.de.peek_error(ErrorCode::EofWhileParsingObject));
1993
                }
1994
            };
1995
1996
            if peek == b'}' {
1997
                Ok(false)
1998
            } else if map.first {
1999
                map.first = false;
2000
                if peek == b'"' {
2001
                    Ok(true)
2002
                } else {
2003
                    Err(map.de.peek_error(ErrorCode::KeyMustBeAString))
2004
                }
2005
            } else if peek == b',' {
2006
                map.de.eat_char();
2007
                match tri!(map.de.parse_whitespace()) {
2008
                    Some(b'"') => Ok(true),
2009
                    Some(b'}') => Err(map.de.peek_error(ErrorCode::TrailingComma)),
2010
                    Some(_) => Err(map.de.peek_error(ErrorCode::KeyMustBeAString)),
2011
                    None => Err(map.de.peek_error(ErrorCode::EofWhileParsingValue)),
2012
                }
2013
            } else {
2014
                Err(map.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd))
2015
            }
2016
        }
2017
2018
268k
        if tri!(has_next_key(self)) {
2019
266k
            Ok(Some(tri!(seed.deserialize(MapKey { de: &mut *self.de }))))
2020
        } else {
2021
975
            Ok(None)
2022
        }
2023
268k
    }
<serde_json::de::MapAccess<serde_json::read::SliceRead> as serde_core::de::MapAccess>::next_key_seed::<serde_json::value::de::KeyClassifier>
Line
Count
Source
1984
9.29k
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1985
9.29k
    where
1986
9.29k
        K: de::DeserializeSeed<'de>,
1987
    {
1988
        fn has_next_key<'de, 'a, R: Read<'de> + 'a>(map: &mut MapAccess<'a, R>) -> Result<bool> {
1989
            let peek = match tri!(map.de.parse_whitespace()) {
1990
                Some(b) => b,
1991
                None => {
1992
                    return Err(map.de.peek_error(ErrorCode::EofWhileParsingObject));
1993
                }
1994
            };
1995
1996
            if peek == b'}' {
1997
                Ok(false)
1998
            } else if map.first {
1999
                map.first = false;
2000
                if peek == b'"' {
2001
                    Ok(true)
2002
                } else {
2003
                    Err(map.de.peek_error(ErrorCode::KeyMustBeAString))
2004
                }
2005
            } else if peek == b',' {
2006
                map.de.eat_char();
2007
                match tri!(map.de.parse_whitespace()) {
2008
                    Some(b'"') => Ok(true),
2009
                    Some(b'}') => Err(map.de.peek_error(ErrorCode::TrailingComma)),
2010
                    Some(_) => Err(map.de.peek_error(ErrorCode::KeyMustBeAString)),
2011
                    None => Err(map.de.peek_error(ErrorCode::EofWhileParsingValue)),
2012
                }
2013
            } else {
2014
                Err(map.de.peek_error(ErrorCode::ExpectedObjectCommaOrEnd))
2015
            }
2016
        }
2017
2018
9.29k
        if tri!(has_next_key(self)) {
2019
8.89k
            Ok(Some(tri!(seed.deserialize(MapKey { de: &mut *self.de }))))
2020
        } else {
2021
279
            Ok(None)
2022
        }
2023
9.29k
    }
Unexecuted instantiation: <serde_json::de::MapAccess<serde_json::read::StrRead> as serde_core::de::MapAccess>::next_key_seed::<core::marker::PhantomData<alloc::string::String>>
Unexecuted instantiation: <serde_json::de::MapAccess<serde_json::read::StrRead> as serde_core::de::MapAccess>::next_key_seed::<serde_json::value::de::KeyClassifier>
2024
2025
275k
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
2026
275k
    where
2027
275k
        V: de::DeserializeSeed<'de>,
2028
    {
2029
275k
        tri!(self.de.parse_object_colon());
2030
2031
275k
        seed.deserialize(&mut *self.de)
2032
275k
    }
<serde_json::de::MapAccess<serde_json::read::SliceRead> as serde_core::de::MapAccess>::next_value_seed::<core::marker::PhantomData<serde_json::value::Value>>
Line
Count
Source
2025
275k
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
2026
275k
    where
2027
275k
        V: de::DeserializeSeed<'de>,
2028
    {
2029
275k
        tri!(self.de.parse_object_colon());
2030
2031
275k
        seed.deserialize(&mut *self.de)
2032
275k
    }
Unexecuted instantiation: <serde_json::de::MapAccess<serde_json::read::StrRead> as serde_core::de::MapAccess>::next_value_seed::<core::marker::PhantomData<serde_json::value::Value>>
2033
}
2034
2035
struct VariantAccess<'a, R: 'a> {
2036
    de: &'a mut Deserializer<R>,
2037
}
2038
2039
impl<'a, R: 'a> VariantAccess<'a, R> {
2040
    fn new(de: &'a mut Deserializer<R>) -> Self {
2041
        VariantAccess { de }
2042
    }
2043
}
2044
2045
impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for VariantAccess<'a, R> {
2046
    type Error = Error;
2047
    type Variant = Self;
2048
2049
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
2050
    where
2051
        V: de::DeserializeSeed<'de>,
2052
    {
2053
        let val = tri!(seed.deserialize(&mut *self.de));
2054
        tri!(self.de.parse_object_colon());
2055
        Ok((val, self))
2056
    }
2057
}
2058
2059
impl<'de, 'a, R: Read<'de> + 'a> de::VariantAccess<'de> for VariantAccess<'a, R> {
2060
    type Error = Error;
2061
2062
    fn unit_variant(self) -> Result<()> {
2063
        de::Deserialize::deserialize(self.de)
2064
    }
2065
2066
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
2067
    where
2068
        T: de::DeserializeSeed<'de>,
2069
    {
2070
        seed.deserialize(self.de)
2071
    }
2072
2073
    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
2074
    where
2075
        V: de::Visitor<'de>,
2076
    {
2077
        de::Deserializer::deserialize_seq(self.de, visitor)
2078
    }
2079
2080
    fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
2081
    where
2082
        V: de::Visitor<'de>,
2083
    {
2084
        de::Deserializer::deserialize_struct(self.de, "", fields, visitor)
2085
    }
2086
}
2087
2088
struct UnitVariantAccess<'a, R: 'a> {
2089
    de: &'a mut Deserializer<R>,
2090
}
2091
2092
impl<'a, R: 'a> UnitVariantAccess<'a, R> {
2093
    fn new(de: &'a mut Deserializer<R>) -> Self {
2094
        UnitVariantAccess { de }
2095
    }
2096
}
2097
2098
impl<'de, 'a, R: Read<'de> + 'a> de::EnumAccess<'de> for UnitVariantAccess<'a, R> {
2099
    type Error = Error;
2100
    type Variant = Self;
2101
2102
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self)>
2103
    where
2104
        V: de::DeserializeSeed<'de>,
2105
    {
2106
        let variant = tri!(seed.deserialize(&mut *self.de));
2107
        Ok((variant, self))
2108
    }
2109
}
2110
2111
impl<'de, 'a, R: Read<'de> + 'a> de::VariantAccess<'de> for UnitVariantAccess<'a, R> {
2112
    type Error = Error;
2113
2114
    fn unit_variant(self) -> Result<()> {
2115
        Ok(())
2116
    }
2117
2118
    fn newtype_variant_seed<T>(self, _seed: T) -> Result<T::Value>
2119
    where
2120
        T: de::DeserializeSeed<'de>,
2121
    {
2122
        Err(de::Error::invalid_type(
2123
            Unexpected::UnitVariant,
2124
            &"newtype variant",
2125
        ))
2126
    }
2127
2128
    fn tuple_variant<V>(self, _len: usize, _visitor: V) -> Result<V::Value>
2129
    where
2130
        V: de::Visitor<'de>,
2131
    {
2132
        Err(de::Error::invalid_type(
2133
            Unexpected::UnitVariant,
2134
            &"tuple variant",
2135
        ))
2136
    }
2137
2138
    fn struct_variant<V>(self, _fields: &'static [&'static str], _visitor: V) -> Result<V::Value>
2139
    where
2140
        V: de::Visitor<'de>,
2141
    {
2142
        Err(de::Error::invalid_type(
2143
            Unexpected::UnitVariant,
2144
            &"struct variant",
2145
        ))
2146
    }
2147
}
2148
2149
/// Only deserialize from this after peeking a '"' byte! Otherwise it may
2150
/// deserialize invalid JSON successfully.
2151
struct MapKey<'a, R: 'a> {
2152
    de: &'a mut Deserializer<R>,
2153
}
2154
2155
macro_rules! deserialize_numeric_key {
2156
    ($method:ident) => {
2157
        fn $method<V>(self, visitor: V) -> Result<V::Value>
2158
        where
2159
            V: de::Visitor<'de>,
2160
        {
2161
            self.deserialize_number(visitor)
2162
        }
2163
    };
2164
2165
    ($method:ident, $delegate:ident) => {
2166
        fn $method<V>(self, visitor: V) -> Result<V::Value>
2167
        where
2168
            V: de::Visitor<'de>,
2169
        {
2170
            self.de.eat_char();
2171
2172
            match tri!(self.de.peek()) {
2173
                Some(b'0'..=b'9' | b'-') => {}
2174
                _ => return Err(self.de.error(ErrorCode::ExpectedNumericKey)),
2175
            }
2176
2177
            let value = tri!(self.de.$delegate(visitor));
2178
2179
            match tri!(self.de.peek()) {
2180
                Some(b'"') => self.de.eat_char(),
2181
                _ => return Err(self.de.peek_error(ErrorCode::ExpectedDoubleQuote)),
2182
            }
2183
2184
            Ok(value)
2185
        }
2186
    };
2187
}
2188
2189
impl<'de, 'a, R> MapKey<'a, R>
2190
where
2191
    R: Read<'de>,
2192
{
2193
    deserialize_numeric_key!(deserialize_number, deserialize_number);
2194
}
2195
2196
impl<'de, 'a, R> de::Deserializer<'de> for MapKey<'a, R>
2197
where
2198
    R: Read<'de>,
2199
{
2200
    type Error = Error;
2201
2202
    #[inline]
2203
275k
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
2204
275k
    where
2205
275k
        V: de::Visitor<'de>,
2206
    {
2207
275k
        self.de.eat_char();
2208
275k
        self.de.scratch.clear();
2209
275k
        match tri!(self.de.read.parse_str(&mut self.de.scratch)) {
2210
263k
            Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2211
11.9k
            Reference::Copied(s) => visitor.visit_str(s),
2212
        }
2213
275k
    }
<serde_json::de::MapKey<serde_json::read::SliceRead> as serde_core::de::Deserializer>::deserialize_any::<serde_core::de::impls::StringVisitor>
Line
Count
Source
2203
266k
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
2204
266k
    where
2205
266k
        V: de::Visitor<'de>,
2206
    {
2207
266k
        self.de.eat_char();
2208
266k
        self.de.scratch.clear();
2209
266k
        match tri!(self.de.read.parse_str(&mut self.de.scratch)) {
2210
256k
            Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2211
10.4k
            Reference::Copied(s) => visitor.visit_str(s),
2212
        }
2213
266k
    }
<serde_json::de::MapKey<serde_json::read::SliceRead> as serde_core::de::Deserializer>::deserialize_any::<serde_json::value::de::KeyClassifier>
Line
Count
Source
2203
8.89k
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
2204
8.89k
    where
2205
8.89k
        V: de::Visitor<'de>,
2206
    {
2207
8.89k
        self.de.eat_char();
2208
8.89k
        self.de.scratch.clear();
2209
8.89k
        match tri!(self.de.read.parse_str(&mut self.de.scratch)) {
2210
7.15k
            Reference::Borrowed(s) => visitor.visit_borrowed_str(s),
2211
1.51k
            Reference::Copied(s) => visitor.visit_str(s),
2212
        }
2213
8.89k
    }
Unexecuted instantiation: <serde_json::de::MapKey<serde_json::read::StrRead> as serde_core::de::Deserializer>::deserialize_any::<serde_core::de::impls::StringVisitor>
Unexecuted instantiation: <serde_json::de::MapKey<serde_json::read::StrRead> as serde_core::de::Deserializer>::deserialize_any::<serde_json::value::de::KeyClassifier>
2214
2215
    deserialize_numeric_key!(deserialize_i8);
2216
    deserialize_numeric_key!(deserialize_i16);
2217
    deserialize_numeric_key!(deserialize_i32);
2218
    deserialize_numeric_key!(deserialize_i64);
2219
    deserialize_numeric_key!(deserialize_i128, deserialize_i128);
2220
    deserialize_numeric_key!(deserialize_u8);
2221
    deserialize_numeric_key!(deserialize_u16);
2222
    deserialize_numeric_key!(deserialize_u32);
2223
    deserialize_numeric_key!(deserialize_u64);
2224
    deserialize_numeric_key!(deserialize_u128, deserialize_u128);
2225
    #[cfg(not(feature = "float_roundtrip"))]
2226
    deserialize_numeric_key!(deserialize_f32);
2227
    #[cfg(feature = "float_roundtrip")]
2228
    deserialize_numeric_key!(deserialize_f32, deserialize_f32);
2229
    deserialize_numeric_key!(deserialize_f64);
2230
2231
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
2232
    where
2233
        V: de::Visitor<'de>,
2234
    {
2235
        self.de.eat_char();
2236
2237
        let peek = match tri!(self.de.next_char()) {
2238
            Some(b) => b,
2239
            None => {
2240
                return Err(self.de.peek_error(ErrorCode::EofWhileParsingValue));
2241
            }
2242
        };
2243
2244
        let value = match peek {
2245
            b't' => {
2246
                tri!(self.de.parse_ident(b"rue\""));
2247
                visitor.visit_bool(true)
2248
            }
2249
            b'f' => {
2250
                tri!(self.de.parse_ident(b"alse\""));
2251
                visitor.visit_bool(false)
2252
            }
2253
            _ => {
2254
                self.de.scratch.clear();
2255
                let s = tri!(self.de.read.parse_str(&mut self.de.scratch));
2256
                Err(de::Error::invalid_type(Unexpected::Str(&s), &visitor))
2257
            }
2258
        };
2259
2260
        match value {
2261
            Ok(value) => Ok(value),
2262
            Err(err) => Err(self.de.fix_position(err)),
2263
        }
2264
    }
2265
2266
    #[inline]
2267
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
2268
    where
2269
        V: de::Visitor<'de>,
2270
    {
2271
        // Map keys cannot be null.
2272
        visitor.visit_some(self)
2273
    }
2274
2275
    #[inline]
2276
    fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
2277
    where
2278
        V: de::Visitor<'de>,
2279
    {
2280
        #[cfg(feature = "raw_value")]
2281
        {
2282
            if name == crate::raw::TOKEN {
2283
                return self.de.deserialize_raw_value(visitor);
2284
            }
2285
        }
2286
2287
        let _ = name;
2288
        visitor.visit_newtype_struct(self)
2289
    }
2290
2291
    #[inline]
2292
    fn deserialize_enum<V>(
2293
        self,
2294
        name: &'static str,
2295
        variants: &'static [&'static str],
2296
        visitor: V,
2297
    ) -> Result<V::Value>
2298
    where
2299
        V: de::Visitor<'de>,
2300
    {
2301
        self.de.deserialize_enum(name, variants, visitor)
2302
    }
2303
2304
    #[inline]
2305
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
2306
    where
2307
        V: de::Visitor<'de>,
2308
    {
2309
        self.de.deserialize_bytes(visitor)
2310
    }
2311
2312
    #[inline]
2313
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
2314
    where
2315
        V: de::Visitor<'de>,
2316
    {
2317
        self.de.deserialize_bytes(visitor)
2318
    }
2319
2320
    forward_to_deserialize_any! {
2321
        char str string unit unit_struct seq tuple tuple_struct map struct
2322
        identifier ignored_any
2323
    }
2324
}
2325
2326
//////////////////////////////////////////////////////////////////////////////
2327
2328
/// Iterator that deserializes a stream into multiple JSON values.
2329
///
2330
/// A stream deserializer can be created from any JSON deserializer using the
2331
/// `Deserializer::into_iter` method.
2332
///
2333
/// The data can consist of any JSON value. Values need to be a self-delineating value e.g.
2334
/// arrays, objects, or strings, or be followed by whitespace or a self-delineating value.
2335
///
2336
/// ```
2337
/// use serde_json::{Deserializer, Value};
2338
///
2339
/// fn main() {
2340
///     let data = "{\"k\": 3}1\"cool\"\"stuff\" 3{}  [0, 1, 2]";
2341
///
2342
///     let stream = Deserializer::from_str(data).into_iter::<Value>();
2343
///
2344
///     for value in stream {
2345
///         println!("{}", value.unwrap());
2346
///     }
2347
/// }
2348
/// ```
2349
pub struct StreamDeserializer<'de, R, T> {
2350
    de: Deserializer<R>,
2351
    offset: usize,
2352
    failed: bool,
2353
    output: PhantomData<T>,
2354
    lifetime: PhantomData<&'de ()>,
2355
}
2356
2357
impl<'de, R, T> StreamDeserializer<'de, R, T>
2358
where
2359
    R: read::Read<'de>,
2360
    T: de::Deserialize<'de>,
2361
{
2362
    /// Create a JSON stream deserializer from one of the possible serde_json
2363
    /// input sources.
2364
    ///
2365
    /// Typically it is more convenient to use one of these methods instead:
2366
    ///
2367
    ///   - Deserializer::from_str(...).into_iter()
2368
    ///   - Deserializer::from_slice(...).into_iter()
2369
    ///   - Deserializer::from_reader(...).into_iter()
2370
    pub fn new(read: R) -> Self {
2371
        let offset = read.byte_offset();
2372
        StreamDeserializer {
2373
            de: Deserializer::new(read),
2374
            offset,
2375
            failed: false,
2376
            output: PhantomData,
2377
            lifetime: PhantomData,
2378
        }
2379
    }
2380
2381
    /// Returns the number of bytes so far deserialized into a successful `T`.
2382
    ///
2383
    /// If a stream deserializer returns an EOF error, new data can be joined to
2384
    /// `old_data[stream.byte_offset()..]` to try again.
2385
    ///
2386
    /// ```
2387
    /// let data = b"[0] [1] [";
2388
    ///
2389
    /// let de = serde_json::Deserializer::from_slice(data);
2390
    /// let mut stream = de.into_iter::<Vec<i32>>();
2391
    /// assert_eq!(0, stream.byte_offset());
2392
    ///
2393
    /// println!("{:?}", stream.next()); // [0]
2394
    /// assert_eq!(3, stream.byte_offset());
2395
    ///
2396
    /// println!("{:?}", stream.next()); // [1]
2397
    /// assert_eq!(7, stream.byte_offset());
2398
    ///
2399
    /// println!("{:?}", stream.next()); // error
2400
    /// assert_eq!(8, stream.byte_offset());
2401
    ///
2402
    /// // If err.is_eof(), can join the remaining data to new data and continue.
2403
    /// let remaining = &data[stream.byte_offset()..];
2404
    /// ```
2405
    ///
2406
    /// *Note:* In the future this method may be changed to return the number of
2407
    /// bytes so far deserialized into a successful T *or* syntactically valid
2408
    /// JSON skipped over due to a type error. See [serde-rs/json#70] for an
2409
    /// example illustrating this.
2410
    ///
2411
    /// [serde-rs/json#70]: https://github.com/serde-rs/json/issues/70
2412
    pub fn byte_offset(&self) -> usize {
2413
        self.offset
2414
    }
2415
2416
    fn peek_end_of_value(&mut self) -> Result<()> {
2417
        match tri!(self.de.peek()) {
2418
            Some(b' ' | b'\n' | b'\t' | b'\r' | b'"' | b'[' | b']' | b'{' | b'}' | b',' | b':')
2419
            | None => Ok(()),
2420
            Some(_) => {
2421
                let position = self.de.read.peek_position();
2422
                Err(Error::syntax(
2423
                    ErrorCode::TrailingCharacters,
2424
                    position.line,
2425
                    position.column,
2426
                ))
2427
            }
2428
        }
2429
    }
2430
}
2431
2432
impl<'de, R, T> Iterator for StreamDeserializer<'de, R, T>
2433
where
2434
    R: Read<'de>,
2435
    T: de::Deserialize<'de>,
2436
{
2437
    type Item = Result<T>;
2438
2439
    fn next(&mut self) -> Option<Result<T>> {
2440
        if R::should_early_return_if_failed && self.failed {
2441
            return None;
2442
        }
2443
2444
        // skip whitespaces, if any
2445
        // this helps with trailing whitespaces, since whitespaces between
2446
        // values are handled for us.
2447
        match self.de.parse_whitespace() {
2448
            Ok(None) => {
2449
                self.offset = self.de.read.byte_offset();
2450
                None
2451
            }
2452
            Ok(Some(b)) => {
2453
                // If the value does not have a clear way to show the end of the value
2454
                // (like numbers, null, true etc.) we have to look for whitespace or
2455
                // the beginning of a self-delineated value.
2456
                let self_delineated_value = match b {
2457
                    b'[' | b'"' | b'{' => true,
2458
                    _ => false,
2459
                };
2460
                self.offset = self.de.read.byte_offset();
2461
                let result = de::Deserialize::deserialize(&mut self.de);
2462
2463
                Some(match result {
2464
                    Ok(value) => {
2465
                        self.offset = self.de.read.byte_offset();
2466
                        if self_delineated_value {
2467
                            Ok(value)
2468
                        } else {
2469
                            self.peek_end_of_value().map(|()| value)
2470
                        }
2471
                    }
2472
                    Err(e) => {
2473
                        self.de.read.set_failed(&mut self.failed);
2474
                        Err(e)
2475
                    }
2476
                })
2477
            }
2478
            Err(e) => {
2479
                self.de.read.set_failed(&mut self.failed);
2480
                Some(Err(e))
2481
            }
2482
        }
2483
    }
2484
}
2485
2486
impl<'de, R, T> FusedIterator for StreamDeserializer<'de, R, T>
2487
where
2488
    R: Read<'de> + Fused,
2489
    T: de::Deserialize<'de>,
2490
{
2491
}
2492
2493
//////////////////////////////////////////////////////////////////////////////
2494
2495
6.06k
fn from_trait<'de, R, T>(read: R) -> Result<T>
2496
6.06k
where
2497
6.06k
    R: Read<'de>,
2498
6.06k
    T: de::Deserialize<'de>,
2499
{
2500
6.06k
    let mut de = Deserializer::new(read);
2501
6.06k
    let value = tri!(de::Deserialize::deserialize(&mut de));
2502
2503
    // Make sure the whole stream has been consumed.
2504
1.11k
    tri!(de.end());
2505
970
    Ok(value)
2506
6.06k
}
serde_json::de::from_trait::<serde_json::read::SliceRead, serde_json::value::Value>
Line
Count
Source
2495
6.06k
fn from_trait<'de, R, T>(read: R) -> Result<T>
2496
6.06k
where
2497
6.06k
    R: Read<'de>,
2498
6.06k
    T: de::Deserialize<'de>,
2499
{
2500
6.06k
    let mut de = Deserializer::new(read);
2501
6.06k
    let value = tri!(de::Deserialize::deserialize(&mut de));
2502
2503
    // Make sure the whole stream has been consumed.
2504
1.11k
    tri!(de.end());
2505
970
    Ok(value)
2506
6.06k
}
Unexecuted instantiation: serde_json::de::from_trait::<serde_json::read::StrRead, serde_json::map::Map<alloc::string::String, serde_json::value::Value>>
Unexecuted instantiation: serde_json::de::from_trait::<serde_json::read::StrRead, serde_json::value::Value>
2507
2508
/// Deserialize an instance of type `T` from an I/O stream of JSON.
2509
///
2510
/// The content of the I/O stream is deserialized directly from the stream
2511
/// without being buffered in memory by serde_json.
2512
///
2513
/// When reading from a source against which short reads are not efficient, such
2514
/// as a [`File`], you will want to apply your own buffering because serde_json
2515
/// will not buffer the input. See [`std::io::BufReader`].
2516
///
2517
/// It is expected that the input stream ends after the deserialized object.
2518
/// If the stream does not end, such as in the case of a persistent socket connection,
2519
/// this function will not return. It is possible instead to deserialize from a prefix of an input
2520
/// stream without looking for EOF by managing your own [`Deserializer`].
2521
///
2522
/// Note that counter to intuition, this function is usually slower than
2523
/// reading a file completely into memory and then applying [`from_str`]
2524
/// or [`from_slice`] on it. See [issue #160].
2525
///
2526
/// [`File`]: std::fs::File
2527
/// [issue #160]: https://github.com/serde-rs/json/issues/160
2528
///
2529
/// # Example
2530
///
2531
/// Reading the contents of a file.
2532
///
2533
/// ```
2534
/// use serde::Deserialize;
2535
///
2536
/// use std::error::Error;
2537
/// use std::fs::File;
2538
/// use std::io::BufReader;
2539
/// use std::path::Path;
2540
///
2541
/// #[derive(Deserialize, Debug)]
2542
/// struct User {
2543
///     fingerprint: String,
2544
///     location: String,
2545
/// }
2546
///
2547
/// fn read_user_from_file<P: AsRef<Path>>(path: P) -> Result<User, Box<dyn Error>> {
2548
///     // Open the file in read-only mode with buffer.
2549
///     let file = File::open(path)?;
2550
///     let reader = BufReader::new(file);
2551
///
2552
///     // Read the JSON contents of the file as an instance of `User`.
2553
///     let u = serde_json::from_reader(reader)?;
2554
///
2555
///     // Return the `User`.
2556
///     Ok(u)
2557
/// }
2558
///
2559
/// fn main() {
2560
/// # }
2561
/// # fn fake_main() {
2562
///     let u = read_user_from_file("test.json").unwrap();
2563
///     println!("{:#?}", u);
2564
/// }
2565
/// ```
2566
///
2567
/// Reading from a persistent socket connection.
2568
///
2569
/// ```
2570
/// use serde::Deserialize;
2571
///
2572
/// use std::error::Error;
2573
/// use std::io::BufReader;
2574
/// use std::net::{TcpListener, TcpStream};
2575
///
2576
/// #[derive(Deserialize, Debug)]
2577
/// struct User {
2578
///     fingerprint: String,
2579
///     location: String,
2580
/// }
2581
///
2582
/// fn read_user_from_stream(stream: &mut BufReader<TcpStream>) -> Result<User, Box<dyn Error>> {
2583
///     let mut de = serde_json::Deserializer::from_reader(stream);
2584
///     let u = User::deserialize(&mut de)?;
2585
///
2586
///     Ok(u)
2587
/// }
2588
///
2589
/// fn main() {
2590
/// # }
2591
/// # fn fake_main() {
2592
///     let listener = TcpListener::bind("127.0.0.1:4000").unwrap();
2593
///
2594
///     for tcp_stream in listener.incoming() {
2595
///         let mut buffered = BufReader::new(tcp_stream.unwrap());
2596
///         println!("{:#?}", read_user_from_stream(&mut buffered));
2597
///     }
2598
/// }
2599
/// ```
2600
///
2601
/// # Errors
2602
///
2603
/// This conversion can fail if the structure of the input does not match the
2604
/// structure expected by `T`, for example if `T` is a struct type but the input
2605
/// contains something other than a JSON map. It can also fail if the structure
2606
/// is correct but `T`'s implementation of `Deserialize` decides that something
2607
/// is wrong with the data, for example required struct fields are missing from
2608
/// the JSON map or some number is too big to fit in the expected primitive
2609
/// type.
2610
#[cfg(feature = "std")]
2611
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
2612
pub fn from_reader<R, T>(rdr: R) -> Result<T>
2613
where
2614
    R: crate::io::Read,
2615
    T: de::DeserializeOwned,
2616
{
2617
    from_trait(read::IoRead::new(rdr))
2618
}
2619
2620
/// Deserialize an instance of type `T` from bytes of JSON text.
2621
///
2622
/// # Example
2623
///
2624
/// ```
2625
/// use serde::Deserialize;
2626
///
2627
/// #[derive(Deserialize, Debug)]
2628
/// struct User {
2629
///     fingerprint: String,
2630
///     location: String,
2631
/// }
2632
///
2633
/// fn main() {
2634
///     // The type of `j` is `&[u8]`
2635
///     let j = b"
2636
///         {
2637
///             \"fingerprint\": \"0xF9BA143B95FF6D82\",
2638
///             \"location\": \"Menlo Park, CA\"
2639
///         }";
2640
///
2641
///     let u: User = serde_json::from_slice(j).unwrap();
2642
///     println!("{:#?}", u);
2643
/// }
2644
/// ```
2645
///
2646
/// # Errors
2647
///
2648
/// This conversion can fail if the structure of the input does not match the
2649
/// structure expected by `T`, for example if `T` is a struct type but the input
2650
/// contains something other than a JSON map. It can also fail if the structure
2651
/// is correct but `T`'s implementation of `Deserialize` decides that something
2652
/// is wrong with the data, for example required struct fields are missing from
2653
/// the JSON map or some number is too big to fit in the expected primitive
2654
/// type.
2655
6.06k
pub fn from_slice<'a, T>(v: &'a [u8]) -> Result<T>
2656
6.06k
where
2657
6.06k
    T: de::Deserialize<'a>,
2658
{
2659
6.06k
    from_trait(read::SliceRead::new(v))
2660
6.06k
}
2661
2662
/// Deserialize an instance of type `T` from a string of JSON text.
2663
///
2664
/// # Example
2665
///
2666
/// ```
2667
/// use serde::Deserialize;
2668
///
2669
/// #[derive(Deserialize, Debug)]
2670
/// struct User {
2671
///     fingerprint: String,
2672
///     location: String,
2673
/// }
2674
///
2675
/// fn main() {
2676
///     // The type of `j` is `&str`
2677
///     let j = "
2678
///         {
2679
///             \"fingerprint\": \"0xF9BA143B95FF6D82\",
2680
///             \"location\": \"Menlo Park, CA\"
2681
///         }";
2682
///
2683
///     let u: User = serde_json::from_str(j).unwrap();
2684
///     println!("{:#?}", u);
2685
/// }
2686
/// ```
2687
///
2688
/// # Errors
2689
///
2690
/// This conversion can fail if the structure of the input does not match the
2691
/// structure expected by `T`, for example if `T` is a struct type but the input
2692
/// contains something other than a JSON map. It can also fail if the structure
2693
/// is correct but `T`'s implementation of `Deserialize` decides that something
2694
/// is wrong with the data, for example required struct fields are missing from
2695
/// the JSON map or some number is too big to fit in the expected primitive
2696
/// type.
2697
0
pub fn from_str<'a, T>(s: &'a str) -> Result<T>
2698
0
where
2699
0
    T: de::Deserialize<'a>,
2700
{
2701
0
    from_trait(read::StrRead::new(s))
2702
0
}
Unexecuted instantiation: serde_json::de::from_str::<serde_json::map::Map<alloc::string::String, serde_json::value::Value>>
Unexecuted instantiation: serde_json::de::from_str::<serde_json::value::Value>