Ensure f32 deserialized from f64 and vice versa preserve NaN sign
This commit is contained in:
parent
a091a07aa2
commit
d2fcc346b9
@ -27,6 +27,12 @@ fn main() {
|
|||||||
println!("cargo:rustc-cfg=no_relaxed_trait_bounds");
|
println!("cargo:rustc-cfg=no_relaxed_trait_bounds");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// f32::copysign and f64::copysign stabilized in Rust 1.35.
|
||||||
|
// https://blog.rust-lang.org/2019/05/23/Rust-1.35.0.html#copy-the-sign-of-a-floating-point-number-onto-another
|
||||||
|
if minor < 35 {
|
||||||
|
println!("cargo:rustc-cfg=no_float_copysign");
|
||||||
|
}
|
||||||
|
|
||||||
// Current minimum supported version of serde_derive crate is Rust 1.56.
|
// Current minimum supported version of serde_derive crate is Rust 1.56.
|
||||||
if minor < 56 {
|
if minor < 56 {
|
||||||
println!("cargo:rustc-cfg=no_serde_derive");
|
println!("cargo:rustc-cfg=no_serde_derive");
|
||||||
|
@ -180,6 +180,28 @@ macro_rules! num_as_self {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! num_as_copysign_self {
|
||||||
|
($ty:ident : $visit:ident) => {
|
||||||
|
#[inline]
|
||||||
|
fn $visit<E>(self, v: $ty) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
#[cfg(no_float_copysign)]
|
||||||
|
{
|
||||||
|
Ok(v as Self::Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(no_float_copysign))]
|
||||||
|
{
|
||||||
|
// Preserve sign of NaN. The `as` produces a nondeterministic sign.
|
||||||
|
let sign = if v.is_sign_positive() { 1.0 } else { -1.0 };
|
||||||
|
Ok((v as Self::Value).copysign(sign))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! int_to_int {
|
macro_rules! int_to_int {
|
||||||
($ty:ident : $visit:ident) => {
|
($ty:ident : $visit:ident) => {
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -351,7 +373,7 @@ impl_deserialize_num! {
|
|||||||
impl_deserialize_num! {
|
impl_deserialize_num! {
|
||||||
f32, deserialize_f32
|
f32, deserialize_f32
|
||||||
num_self!(f32:visit_f32);
|
num_self!(f32:visit_f32);
|
||||||
num_as_self!(f64:visit_f64);
|
num_as_copysign_self!(f64:visit_f64);
|
||||||
num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);
|
num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);
|
||||||
num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);
|
num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);
|
||||||
}
|
}
|
||||||
@ -359,7 +381,7 @@ impl_deserialize_num! {
|
|||||||
impl_deserialize_num! {
|
impl_deserialize_num! {
|
||||||
f64, deserialize_f64
|
f64, deserialize_f64
|
||||||
num_self!(f64:visit_f64);
|
num_self!(f64:visit_f64);
|
||||||
num_as_self!(f32:visit_f32);
|
num_as_copysign_self!(f32:visit_f32);
|
||||||
num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);
|
num_as_self!(i8:visit_i8 i16:visit_i16 i32:visit_i32 i64:visit_i64);
|
||||||
num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);
|
num_as_self!(u8:visit_u8 u16:visit_u16 u32:visit_u32 u64:visit_u64);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user