|
1 | 1 | use crate::ast::prelude::*; |
| 2 | +use crate::compile::{num, WithSpan}; |
2 | 3 |
|
3 | 4 | use ast::token::NumberSize; |
4 | | -use num::Num; |
5 | 5 |
|
6 | 6 | #[test] |
7 | 7 | #[cfg(not(miri))] |
@@ -59,11 +59,7 @@ impl Parse for LitNumber { |
59 | 59 | impl<'a> Resolve<'a> for LitNumber { |
60 | 60 | type Output = ast::Number; |
61 | 61 |
|
62 | | - fn resolve(&self, cx: ResolveContext<'a>) -> Result<ast::Number> { |
63 | | - fn err_span<E>(span: Span) -> impl Fn(E) -> compile::Error { |
64 | | - move |_| compile::Error::new(span, ErrorKind::BadNumberLiteral) |
65 | | - } |
66 | | - |
| 62 | + fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<ast::Number> { |
67 | 63 | let span = self.span; |
68 | 64 |
|
69 | 65 | let text = match self.source { |
@@ -116,28 +112,27 @@ impl<'a> Resolve<'a> for LitNumber { |
116 | 112 | (suffix, text.is_fractional), |
117 | 113 | (Some(ast::NumberSuffix::Float(..)), _) | (None, true) |
118 | 114 | ) { |
119 | | - let number: f64 = string |
120 | | - .trim_matches(|c: char| c == '_') |
121 | | - .parse() |
122 | | - .map_err(err_span(span))?; |
| 115 | + let number: f64 = num::from_float(cx.scratch, string).with_span(span)?; |
123 | 116 |
|
124 | 117 | return Ok(ast::Number { |
125 | 118 | value: ast::NumberValue::Float(number), |
126 | 119 | suffix, |
127 | 120 | }); |
128 | 121 | } |
129 | 122 |
|
130 | | - let radix = match text.base { |
131 | | - ast::NumberBase::Binary => 2, |
132 | | - ast::NumberBase::Octal => 8, |
133 | | - ast::NumberBase::Hex => 16, |
134 | | - ast::NumberBase::Decimal => 10, |
| 123 | + let parser = match text.base { |
| 124 | + ast::NumberBase::Binary => num::from_ascii_binary, |
| 125 | + ast::NumberBase::Octal => num::from_ascii_octal, |
| 126 | + ast::NumberBase::Hex => num::from_ascii_hex, |
| 127 | + ast::NumberBase::Decimal => num::from_ascii_decimal, |
135 | 128 | }; |
136 | 129 |
|
137 | | - let number = num::BigInt::from_str_radix(string, radix).map_err(err_span(span))?; |
| 130 | + let number = parser(string.as_bytes()) |
| 131 | + .ok_or_else(|| ErrorKind::BadNumberLiteral) |
| 132 | + .with_span(span)?; |
138 | 133 |
|
139 | 134 | Ok(ast::Number { |
140 | | - value: ast::NumberValue::Integer(number), |
| 135 | + value: ast::NumberValue::Integer(number as i128), |
141 | 136 | suffix, |
142 | 137 | }) |
143 | 138 | } |
|
0 commit comments