From 064c7362074c74c2ed50c090742e9f36beb0cb75 Mon Sep 17 00:00:00 2001 From: Richard Keller Date: Sat, 13 Jun 2020 23:45:35 +0200 Subject: [PATCH 1/6] Use ryu-js crate for number formatting --- Cargo.lock | 6 ++++++ boa/Cargo.toml | 1 + boa/src/builtins/value/display.rs | 16 ++++++---------- boa/src/builtins/value/tests.rs | 25 +++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7335de7acb..855ac771267 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,6 +16,7 @@ dependencies = [ "rand", "regex", "rustc-hash", + "ryu-js", "serde", "serde_json", ] @@ -693,6 +694,11 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +[[package]] +name = "ryu-js" +version = "1.0.5" +source = "git+https://github.com/Tropid/ryu-js#fe366fa397d04324fa693b5d85134851b09719b3" + [[package]] name = "same-file" version = "1.0.6" diff --git a/boa/Cargo.toml b/boa/Cargo.toml index b8b28f45d35..e18f4409c79 100644 --- a/boa/Cargo.toml +++ b/boa/Cargo.toml @@ -23,6 +23,7 @@ rustc-hash = "1.1.0" num-bigint = { version = "0.3.0", features = ["serde"] } num-integer = "0.1.43" bitflags = "1.2.1" +ryu-js = { git = "https://github.com/Tropid/ryu-js" } # Optional Dependencies serde = { version = "1.0.111", features = ["derive"], optional = true } diff --git a/boa/src/builtins/value/display.rs b/boa/src/builtins/value/display.rs index fef09251920..5b8c5c596df 100644 --- a/boa/src/builtins/value/display.rs +++ b/boa/src/builtins/value/display.rs @@ -186,19 +186,15 @@ impl Display for ValueData { None => write!(f, "Symbol()"), }, Self::String(ref v) => write!(f, "{}", v), - Self::Rational(v) => write!( - f, - "{}", - match v { - _ if v.is_nan() => "NaN".to_string(), - _ if v.is_infinite() && v.is_sign_negative() => "-Infinity".to_string(), - _ if v.is_infinite() => "Infinity".to_string(), - _ => v.to_string(), - } - ), + Self::Rational(v) => format_rational(*v, f), Self::Object(_) => write!(f, "{}", log_string_from(self, true)), Self::Integer(v) => write!(f, "{}", v), Self::BigInt(ref num) => write!(f, "{}n", num), } } } + +fn format_rational(v: f64, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut buffer = ryu_js::Buffer::new(); + write!(f, "{}", buffer.format(v)) +} diff --git a/boa/src/builtins/value/tests.rs b/boa/src/builtins/value/tests.rs index 008b04076ad..feb53e9dc3d 100644 --- a/boa/src/builtins/value/tests.rs +++ b/boa/src/builtins/value/tests.rs @@ -213,3 +213,28 @@ fn get_types() { Type::Symbol ); } + +#[test] +fn to_string() { + let f64_to_str = |f| { ValueData::Rational(f).to_string() }; + + assert_eq!(f64_to_str(f64::NAN), "NaN"); + assert_eq!(f64_to_str(0.0), "0"); + assert_eq!(f64_to_str(f64::INFINITY), "Infinity"); + assert_eq!(f64_to_str(f64::NEG_INFINITY), "-Infinity"); + assert_eq!(f64_to_str(90.12), "90.12"); + assert_eq!(f64_to_str(111111111111111111111.0), "111111111111111110000"); + assert_eq!(f64_to_str(1111111111111111111111.0), "1.1111111111111111e+21"); + + assert_eq!(f64_to_str(-90.12), "-90.12"); + + assert_eq!(f64_to_str(-111111111111111111111.0), "-111111111111111110000"); + assert_eq!(f64_to_str(-1111111111111111111111.0), "-1.1111111111111111e+21"); + + assert_eq!(f64_to_str(0.0000001), "1e-7"); + assert_eq!(f64_to_str(0.000001), "0.000001"); + assert_eq!(f64_to_str(0.0000002), "2e-7"); + assert_eq!(f64_to_str(-0.0000001), "-1e-7"); + + assert_eq!(f64_to_str(3e50), "3e+50"); +} From 1e9ea953aca5642d62e8fdce78462d9843897e99 Mon Sep 17 00:00:00 2001 From: Richard Keller Date: Sun, 21 Jun 2020 12:59:25 +0200 Subject: [PATCH 2/6] Fix formatting --- boa/src/builtins/value/tests.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/boa/src/builtins/value/tests.rs b/boa/src/builtins/value/tests.rs index feb53e9dc3d..fd08e459996 100644 --- a/boa/src/builtins/value/tests.rs +++ b/boa/src/builtins/value/tests.rs @@ -216,7 +216,7 @@ fn get_types() { #[test] fn to_string() { - let f64_to_str = |f| { ValueData::Rational(f).to_string() }; + let f64_to_str = |f| ValueData::Rational(f).to_string(); assert_eq!(f64_to_str(f64::NAN), "NaN"); assert_eq!(f64_to_str(0.0), "0"); @@ -224,12 +224,21 @@ fn to_string() { assert_eq!(f64_to_str(f64::NEG_INFINITY), "-Infinity"); assert_eq!(f64_to_str(90.12), "90.12"); assert_eq!(f64_to_str(111111111111111111111.0), "111111111111111110000"); - assert_eq!(f64_to_str(1111111111111111111111.0), "1.1111111111111111e+21"); + assert_eq!( + f64_to_str(1111111111111111111111.0), + "1.1111111111111111e+21" + ); assert_eq!(f64_to_str(-90.12), "-90.12"); - assert_eq!(f64_to_str(-111111111111111111111.0), "-111111111111111110000"); - assert_eq!(f64_to_str(-1111111111111111111111.0), "-1.1111111111111111e+21"); + assert_eq!( + f64_to_str(-111111111111111111111.0), + "-111111111111111110000" + ); + assert_eq!( + f64_to_str(-1111111111111111111111.0), + "-1.1111111111111111e+21" + ); assert_eq!(f64_to_str(0.0000001), "1e-7"); assert_eq!(f64_to_str(0.000001), "0.000001"); From 4831c395b52737124bd30909d0f904d2b3455dff Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Fri, 10 Jul 2020 00:35:36 +0200 Subject: [PATCH 3/6] Made `ryu-js` crate point to `boa-dev/ryu-js` --- boa/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boa/Cargo.toml b/boa/Cargo.toml index 6731d68d570..1f7c26da9e5 100644 --- a/boa/Cargo.toml +++ b/boa/Cargo.toml @@ -23,7 +23,7 @@ rustc-hash = "1.1.0" num-bigint = { version = "0.3.0", features = ["serde"] } num-integer = "0.1.43" bitflags = "1.2.1" -ryu-js = { git = "https://github.com/Tropid/ryu-js" } +ryu-js = { git = "https://github.com/boa-dev/ryu-js" } # Optional Dependencies serde = { version = "1.0.114", features = ["derive"], optional = true } From 83c6d31b707127d8ab88e78dcfa3c086804d6817 Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Fri, 10 Jul 2020 00:38:16 +0200 Subject: [PATCH 4/6] Fixed test compilation --- boa/src/builtins/value/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boa/src/builtins/value/tests.rs b/boa/src/builtins/value/tests.rs index 09547f8b5ad..607d6bdfcc5 100644 --- a/boa/src/builtins/value/tests.rs +++ b/boa/src/builtins/value/tests.rs @@ -216,7 +216,7 @@ fn get_types() { #[test] fn to_string() { - let f64_to_str = |f| ValueData::Rational(f).to_string(); + let f64_to_str = |f| Value::Rational(f).to_string(); assert_eq!(f64_to_str(f64::NAN), "NaN"); assert_eq!(f64_to_str(0.0), "0"); From 567c98fa001ef67a44ce31f2483e9c86b0e58ee0 Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Mon, 13 Jul 2020 20:27:23 +0200 Subject: [PATCH 5/6] Update Cargo.toml --- boa/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boa/Cargo.toml b/boa/Cargo.toml index 1f7c26da9e5..ecdf7fd5e20 100644 --- a/boa/Cargo.toml +++ b/boa/Cargo.toml @@ -23,7 +23,7 @@ rustc-hash = "1.1.0" num-bigint = { version = "0.3.0", features = ["serde"] } num-integer = "0.1.43" bitflags = "1.2.1" -ryu-js = { git = "https://github.com/boa-dev/ryu-js" } +ryu-js = "0.1.0" # Optional Dependencies serde = { version = "1.0.114", features = ["derive"], optional = true } From 1eb0db00ebf6a04f1a1fb0761465bfd2caa271b1 Mon Sep 17 00:00:00 2001 From: HalidOdat Date: Wed, 15 Jul 2020 00:20:47 +0200 Subject: [PATCH 6/6] Change `ryu-js` version to `0.2.0` --- boa/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boa/Cargo.toml b/boa/Cargo.toml index ecdf7fd5e20..5b9a22912f7 100644 --- a/boa/Cargo.toml +++ b/boa/Cargo.toml @@ -23,7 +23,7 @@ rustc-hash = "1.1.0" num-bigint = { version = "0.3.0", features = ["serde"] } num-integer = "0.1.43" bitflags = "1.2.1" -ryu-js = "0.1.0" +ryu-js = "0.2.0" # Optional Dependencies serde = { version = "1.0.114", features = ["derive"], optional = true }