@@ -30,12 +30,10 @@ use crate::{
3030#[ derive( Debug , PartialEq , Eq , Clone , Copy , Hash ) ]
3131pub enum LiteralValue < ' a > {
3232 String ( & ' a Atom < ' a > , Option < MangleAtom > ) ,
33- Number ( F64WithEq , Option < & ' a Atom < ' a > > ) ,
33+ Number ( F64WithEq ) ,
3434 BigInt ( & ' a Atom < ' a > ) ,
3535 Boolean ( bool ) ,
3636 Symbol ( SymbolId , & ' a Atom < ' a > ) ,
37- Infinity ( bool ) ,
38- NaN ,
3937 Null ,
4038 Undefined ,
4139}
@@ -191,21 +189,18 @@ impl<'a> ValueTrait<'a> for LiteralValue<'a> {
191189
192190 fn get_to_numeric ( & ' a self , analyzer : & Analyzer < ' a > ) -> Entity < ' a > {
193191 match self {
194- LiteralValue :: Number ( _, _)
195- | LiteralValue :: BigInt ( _)
196- | LiteralValue :: NaN
197- | LiteralValue :: Infinity ( _) => self . into ( ) ,
192+ LiteralValue :: Number ( _) | LiteralValue :: BigInt ( _) => self . into ( ) ,
198193 LiteralValue :: Boolean ( value) => {
199194 if * value {
200- analyzer. factory . number ( 1.0 , Some ( builtin_atom ! ( "1" ) ) )
195+ analyzer. factory . number ( 1.0 )
201196 } else {
202- analyzer. factory . number ( 0.0 , Some ( builtin_atom ! ( "0" ) ) )
197+ analyzer. factory . number ( 0.0 )
203198 }
204199 }
205200 LiteralValue :: String ( str, atom) => {
206201 analyzer. factory . computed ( str. get_to_numeric ( analyzer) , * atom)
207202 }
208- LiteralValue :: Null => analyzer. factory . number ( 0.0 , Some ( builtin_atom ! ( "0" ) ) ) ,
203+ LiteralValue :: Null => analyzer. factory . number ( 0.0 ) ,
209204 LiteralValue :: Symbol ( _, _) => {
210205 // TODO: warn: TypeError: Cannot convert a Symbol value to a number
211206 analyzer. factory . unknown
@@ -254,12 +249,10 @@ impl<'a> ValueTrait<'a> for LiteralValue<'a> {
254249 fn test_typeof ( & self ) -> TypeofResult {
255250 match self {
256251 LiteralValue :: String ( _, _) => TypeofResult :: String ,
257- LiteralValue :: Number ( _, _ ) => TypeofResult :: Number ,
252+ LiteralValue :: Number ( _) => TypeofResult :: Number ,
258253 LiteralValue :: BigInt ( _) => TypeofResult :: BigInt ,
259254 LiteralValue :: Boolean ( _) => TypeofResult :: Boolean ,
260255 LiteralValue :: Symbol ( _, _) => TypeofResult :: Symbol ,
261- LiteralValue :: Infinity ( _) => TypeofResult :: Number ,
262- LiteralValue :: NaN => TypeofResult :: Number ,
263256 LiteralValue :: Null => TypeofResult :: Object ,
264257 LiteralValue :: Undefined => TypeofResult :: Undefined ,
265258 }
@@ -268,12 +261,11 @@ impl<'a> ValueTrait<'a> for LiteralValue<'a> {
268261 fn test_truthy ( & self ) -> Option < bool > {
269262 Some ( match self {
270263 LiteralValue :: String ( value, _) => !value. is_empty ( ) ,
271- LiteralValue :: Number ( value, _ ) => * value != 0.0 . into ( ) && * value != ( -0.0 ) . into ( ) ,
264+ LiteralValue :: Number ( value) => * value != 0.0 . into ( ) && * value != ( -0.0 ) . into ( ) ,
272265 LiteralValue :: BigInt ( value) => !value. chars ( ) . all ( |c| c == '0' ) ,
273266 LiteralValue :: Boolean ( value) => * value,
274267 LiteralValue :: Symbol ( _, _) => true ,
275- LiteralValue :: Infinity ( _) => true ,
276- LiteralValue :: NaN | LiteralValue :: Null | LiteralValue :: Undefined => false ,
268+ LiteralValue :: Null | LiteralValue :: Undefined => false ,
277269 } )
278270 }
279271
@@ -304,10 +296,15 @@ impl<'a> LiteralValue<'a> {
304296 let mangled = atom. and_then ( |a| mangler. resolve ( a) ) . unwrap_or ( value) ;
305297 ast. expression_string_literal ( span, mangled, None )
306298 }
307- LiteralValue :: Number ( value, raw ) => {
299+ LiteralValue :: Number ( value) => {
308300 let negated = value. 0 . is_sign_negative ( ) ;
309- let absolute =
310- ast. expression_numeric_literal ( span, value. 0 . abs ( ) , raw. copied ( ) , NumberBase :: Decimal ) ;
301+ let absolute = if value. 0 . is_infinite ( ) {
302+ ast. expression_identifier ( span, "Infinity" )
303+ } else if value. 0 . is_nan ( ) {
304+ ast. expression_identifier ( span, "NaN" )
305+ } else {
306+ ast. expression_numeric_literal ( span, value. 0 . abs ( ) , None , NumberBase :: Decimal )
307+ } ;
311308 if negated {
312309 ast. expression_unary ( span, UnaryOperator :: UnaryNegation , absolute)
313310 } else {
@@ -319,18 +316,6 @@ impl<'a> LiteralValue<'a> {
319316 }
320317 LiteralValue :: Boolean ( value) => ast. expression_boolean_literal ( span, * value) ,
321318 LiteralValue :: Symbol ( _, _) => unreachable ! ( "Cannot build expression for Symbol" ) ,
322- LiteralValue :: Infinity ( positive) => {
323- if * positive {
324- ast. expression_identifier ( span, "Infinity" )
325- } else {
326- ast. expression_unary (
327- span,
328- UnaryOperator :: UnaryNegation ,
329- ast. expression_identifier ( span, "Infinity" ) ,
330- )
331- }
332- }
333- LiteralValue :: NaN => ast. expression_identifier ( span, "NaN" ) ,
334319 LiteralValue :: Null => ast. expression_null_literal ( span) ,
335320 LiteralValue :: Undefined => ast. expression_unary (
336321 span,
@@ -344,16 +329,15 @@ impl<'a> LiteralValue<'a> {
344329 let config = & analyzer. config ;
345330 match self {
346331 LiteralValue :: String ( value, _) => value. len ( ) <= config. max_simple_string_length ,
347- LiteralValue :: Number ( value, _) => {
348- value. 0 . fract ( ) == 0.0
349- && config. min_simple_number_value <= ( value. 0 as i64 )
350- && ( value. 0 as i64 ) <= config. max_simple_number_value
332+ LiteralValue :: Number ( value) => {
333+ !value. 0 . is_finite ( )
334+ || ( value. 0 . fract ( ) == 0.0
335+ && config. min_simple_number_value <= ( value. 0 as i64 )
336+ && ( value. 0 as i64 ) <= config. max_simple_number_value )
351337 }
352338 LiteralValue :: BigInt ( _) => false ,
353339 LiteralValue :: Boolean ( _) => true ,
354340 LiteralValue :: Symbol ( _, _) => false ,
355- LiteralValue :: Infinity ( _) => true ,
356- LiteralValue :: NaN => true ,
357341 LiteralValue :: Null => true ,
358342 LiteralValue :: Undefined => true ,
359343 }
@@ -362,9 +346,7 @@ impl<'a> LiteralValue<'a> {
362346 pub fn to_string ( self , allocator : & ' a Allocator ) -> & ' a Atom < ' a > {
363347 match self {
364348 LiteralValue :: String ( value, _) => value,
365- LiteralValue :: Number ( value, str_rep) => {
366- str_rep. unwrap_or_else ( || value. 0 . to_js_string ( ) . to_atom_ref ( allocator) )
367- }
349+ LiteralValue :: Number ( value) => value. 0 . to_js_string ( ) . to_atom_ref ( allocator) ,
368350 LiteralValue :: BigInt ( value) => value,
369351 LiteralValue :: Boolean ( value) => {
370352 if value {
@@ -374,14 +356,6 @@ impl<'a> LiteralValue<'a> {
374356 }
375357 }
376358 LiteralValue :: Symbol ( _, str_rep) => str_rep,
377- LiteralValue :: Infinity ( positive) => {
378- if positive {
379- builtin_atom ! ( "Infinity" )
380- } else {
381- builtin_atom ! ( "-Infinity" )
382- }
383- }
384- LiteralValue :: NaN => builtin_atom ! ( "NaN" ) ,
385359 LiteralValue :: Null => builtin_atom ! ( "null" ) ,
386360 LiteralValue :: Undefined => builtin_atom ! ( "undefined" ) ,
387361 }
@@ -390,7 +364,7 @@ impl<'a> LiteralValue<'a> {
390364 // `None` for unresolvable, `Some(None)` for NaN, `Some(Some(value))` for number
391365 pub fn to_number ( self ) -> Option < Option < F64WithEq > > {
392366 match self {
393- LiteralValue :: Number ( value, _ ) => Some ( Some ( value) ) ,
367+ LiteralValue :: Number ( value) => Some ( Some ( value) ) ,
394368 LiteralValue :: BigInt ( _value) => {
395369 // TODO: warn: TypeError: Cannot convert a BigInt value to a number
396370 None
@@ -405,34 +379,27 @@ impl<'a> LiteralValue<'a> {
405379 // TODO: warn: TypeError: Cannot convert a Symbol value to a number
406380 None
407381 }
408- LiteralValue :: NaN | LiteralValue :: Undefined => Some ( None ) ,
409- LiteralValue :: Infinity ( _) => None ,
382+ LiteralValue :: Undefined => Some ( None ) ,
410383 }
411384 }
412385
413386 fn get_prototype ( & self , analyzer : & mut Analyzer < ' a > ) -> & ' a BuiltinPrototype < ' a > {
414387 match self {
415388 LiteralValue :: String ( _, _) => & analyzer. builtins . prototypes . string ,
416- LiteralValue :: Number ( _, _ ) => & analyzer. builtins . prototypes . number ,
389+ LiteralValue :: Number ( _) => & analyzer. builtins . prototypes . number ,
417390 LiteralValue :: BigInt ( _) => & analyzer. builtins . prototypes . bigint ,
418391 LiteralValue :: Boolean ( _) => & analyzer. builtins . prototypes . boolean ,
419392 LiteralValue :: Symbol ( _, _) => & analyzer. builtins . prototypes . symbol ,
420- LiteralValue :: Infinity ( _) => & analyzer. builtins . prototypes . number ,
421- LiteralValue :: NaN => & analyzer. builtins . prototypes . number ,
422393 LiteralValue :: Null | LiteralValue :: Undefined => {
423394 unreachable ! ( "Cannot get prototype of null or undefined" )
424395 }
425396 }
426397 }
427398
428399 pub fn strict_eq ( self , other : LiteralValue , object_is : bool ) -> ( bool , Option < MangleConstraint > ) {
429- // 0.0 === -0.0
430- if !object_is && let ( LiteralValue :: Number ( l, _) , LiteralValue :: Number ( r, _) ) = ( self , other) {
431- let eq = if l == 0.0 . into ( ) || l == ( -0.0 ) . into ( ) {
432- r == 0.0 . into ( ) || r == ( -0.0 ) . into ( )
433- } else {
434- l == r
435- } ;
400+ if let ( LiteralValue :: Number ( l) , LiteralValue :: Number ( r) ) = ( self , other) {
401+ // 0.0 === -0.0
402+ let eq = if object_is { l == r } else { l. 0 == r. 0 } ;
436403 return ( eq, None ) ;
437404 }
438405
@@ -445,10 +412,6 @@ impl<'a> LiteralValue<'a> {
445412 return ( false , None ) ;
446413 }
447414
448- if !object_is && self == LiteralValue :: NaN {
449- return ( false , None ) ;
450- }
451-
452415 ( true , None )
453416 }
454417}
0 commit comments