From c9389a56fe87ee736d89190d79618c31e9235251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikodem=20Rabuli=C5=84ski?= Date: Sat, 2 Oct 2021 09:28:00 +0200 Subject: [PATCH 1/3] Changed overflowing int parsing Instead of manually parsing and adding each character to i128::from_str_radix, which is then converted to f64 --- boa/src/syntax/lexer/number.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/boa/src/syntax/lexer/number.rs b/boa/src/syntax/lexer/number.rs index 38da06db679..9d85465185a 100644 --- a/boa/src/syntax/lexer/number.rs +++ b/boa/src/syntax/lexer/number.rs @@ -11,6 +11,7 @@ use crate::{ }; use std::io::Read; use std::str; +use std::num::IntErrorKind; /// Number literal lexing. /// @@ -398,13 +399,13 @@ impl Tokenizer for NumberLiteral { if let Ok(num) = i32::from_str_radix(num_str, base) { Numeric::Integer(num) } else { - let b = f64::from(base); - let mut result = 0.0_f64; - for c in num_str.chars() { - let digit = f64::from(c.to_digit(base).expect("could not parse digit after already checking validity")); - result = result * b + digit; - } - Numeric::Rational(result) + let num = i128::from_str_radix(num_str, base) + .unwrap_or_else(|e| match e.kind() { + IntErrorKind::PosOverflow => i128::MAX, + IntErrorKind::NegOverflow => i128::MIN, + _ => unreachable!("Failed to parse integer after checks") + }); + Numeric::Rational(num as f64) } } }; From e8c1262770bf4e7b5ca6a54466a5fe8420fa6498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikodem=20Rabuli=C5=84ski?= Date: Sat, 2 Oct 2021 09:47:51 +0200 Subject: [PATCH 2/3] Formatting --- boa/src/syntax/lexer/number.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boa/src/syntax/lexer/number.rs b/boa/src/syntax/lexer/number.rs index 9d85465185a..8fc7fe3926e 100644 --- a/boa/src/syntax/lexer/number.rs +++ b/boa/src/syntax/lexer/number.rs @@ -10,8 +10,8 @@ use crate::{ JsBigInt, }; use std::io::Read; -use std::str; use std::num::IntErrorKind; +use std::str; /// Number literal lexing. /// From 8295339fc07c0c6444260ef84eb47dc45f88bf1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikodem=20Rabuli=C5=84ski?= Date: Sat, 2 Oct 2021 20:32:27 +0200 Subject: [PATCH 3/3] Use BigInt for parsing long integers --- boa/src/syntax/lexer/number.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/boa/src/syntax/lexer/number.rs b/boa/src/syntax/lexer/number.rs index 8fc7fe3926e..a37d95d3467 100644 --- a/boa/src/syntax/lexer/number.rs +++ b/boa/src/syntax/lexer/number.rs @@ -10,7 +10,6 @@ use crate::{ JsBigInt, }; use std::io::Read; -use std::num::IntErrorKind; use std::str; /// Number literal lexing. @@ -399,13 +398,8 @@ impl Tokenizer for NumberLiteral { if let Ok(num) = i32::from_str_radix(num_str, base) { Numeric::Integer(num) } else { - let num = i128::from_str_radix(num_str, base) - .unwrap_or_else(|e| match e.kind() { - IntErrorKind::PosOverflow => i128::MAX, - IntErrorKind::NegOverflow => i128::MIN, - _ => unreachable!("Failed to parse integer after checks") - }); - Numeric::Rational(num as f64) + let num = JsBigInt::from_string_radix(num_str, base).expect("Failed to parse integer after checks"); + Numeric::Rational(num.to_f64()) } } };