From 0d97e08568378ea5bb593c2ceb69598df6bcd073 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Thu, 14 May 2020 12:39:44 +0200 Subject: [PATCH] if f32 was requested use 32-bit minimal-lexical instead of using the 64-bit version and then casting down to f32 --- src/de.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/de.rs b/src/de.rs index 5dc0b0e..749c955 100644 --- a/src/de.rs +++ b/src/de.rs @@ -23,6 +23,7 @@ pub struct Deserializer { read: R, scratch: Vec, remaining_depth: u8, + requested_f32: bool, #[cfg(feature = "unbounded_depth")] disable_recursion_limit: bool, } @@ -43,6 +44,7 @@ where #[cfg(not(feature = "unbounded_depth"))] { Deserializer { + requested_f32: false, read: read, scratch: Vec::new(), remaining_depth: 128, @@ -52,6 +54,7 @@ where #[cfg(feature = "unbounded_depth")] { Deserializer { + requested_f32: false, read: read, scratch: Vec::new(), remaining_depth: 128, @@ -743,7 +746,11 @@ impl<'de, R: Read<'de>> Deserializer { let integer = &self.scratch[..integer_end]; let fraction = &self.scratch[integer_end..]; - let f: f64 = minimal_lexical::parse_float(integer.iter(), fraction.iter(), exponent); + let f = if self.requested_f32 { + minimal_lexical::parse_float::(integer.iter(), fraction.iter(), exponent) as f64 + } else { + minimal_lexical::parse_float::(integer.iter(), fraction.iter(), exponent) + }; self.scratch.clear(); if f.is_infinite() { @@ -1161,9 +1168,18 @@ impl<'de, 'a, R: Read<'de>> de::Deserializer<'de> for &'a mut Deserializer { deserialize_prim_number!(deserialize_u16); deserialize_prim_number!(deserialize_u32); deserialize_prim_number!(deserialize_u64); - deserialize_prim_number!(deserialize_f32); deserialize_prim_number!(deserialize_f64); + fn deserialize_f32(self, visitor: V) -> Result + where + V: de::Visitor<'de>, + { + self.requested_f32 = true; + let val = self.deserialize_any(visitor); + self.requested_f32 = false; + val + } + serde_if_integer128! { fn deserialize_i128(self, visitor: V) -> Result where