Skip to content
This repository has been archived by the owner on Mar 25, 2024. It is now read-only.

Commit

Permalink
Merge pull request #157 from dtolnay/float
Browse files Browse the repository at this point in the history
Only accept finite values from f64::from_str
  • Loading branch information
dtolnay committed May 10, 2020
2 parents b570f07 + 5e6632f commit c49f115
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 11 deletions.
6 changes: 4 additions & 2 deletions src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -582,8 +582,10 @@ where
if v == ".nan" || v == ".NaN" || v == ".NAN" {
return visitor.visit_f64(f64::NAN);
}
if let Ok(n) = v.parse() {
return visitor.visit_f64(n);
if let Ok(n) = v.parse::<f64>() {
if n.is_finite() {
return visitor.visit_f64(n);
}
}
visitor.visit_str(v)
}
Expand Down
10 changes: 5 additions & 5 deletions src/number.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,9 @@ impl Number {
/// ```
/// # use std::f64;
/// # fn yaml(i: &str) -> serde_yaml::Value { serde_yaml::from_str(i).unwrap() }
/// assert_eq!(yaml("inf").as_f64(), Some(f64::INFINITY));
/// assert_eq!(yaml("-inf").as_f64(), Some(f64::NEG_INFINITY));
/// assert!(yaml("NaN").as_f64().unwrap().is_nan());
/// assert_eq!(yaml(".inf").as_f64(), Some(f64::INFINITY));
/// assert_eq!(yaml("-.inf").as_f64(), Some(f64::NEG_INFINITY));
/// assert!(yaml(".nan").as_f64().unwrap().is_nan());
/// ```
#[inline]
pub fn as_f64(&self) -> Option<f64> {
Expand Down Expand Up @@ -323,9 +323,9 @@ impl PartialEq for N {
(N::NegInt(a), N::NegInt(b)) => a == b,
(N::Float(a), N::Float(b)) => {
if a.is_nan() && b.is_nan() {
// YAML only has two NaNs;
// YAML only has one NaN;
// the bit representation isn't preserved
a.is_sign_positive() == b.is_sign_positive()
true
} else {
a == b
}
Expand Down
9 changes: 5 additions & 4 deletions tests/test_value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ use std::f64;

#[test]
fn test_nan() {
let pos_nan = serde_yaml::from_str::<Value>("NaN").unwrap();
let neg_nan = serde_yaml::from_str::<Value>("-NaN").unwrap();
let pos_nan = serde_yaml::from_str::<Value>(".nan").unwrap();
assert!(pos_nan.is_f64());
assert_eq!(pos_nan, pos_nan);
assert_eq!(neg_nan, neg_nan);
assert_ne!(pos_nan, neg_nan);

let neg_fake_nan = serde_yaml::from_str::<Value>("-.nan").unwrap();
assert!(neg_fake_nan.is_string());

let significand_mask = 0xF_FFFF_FFFF_FFFF;
let bits = (f64::NAN.to_bits() ^ significand_mask) | 1;
Expand Down

0 comments on commit c49f115

Please sign in to comment.