@@ -573,34 +573,34 @@ impl<'a, 'b> PeepholeOptimizations {
573
573
if e. arguments . len ( ) != 1 {
574
574
return None ;
575
575
}
576
- Some ( ctx. value_to_expr (
577
- e. span ,
578
- ConstantValue :: Number ( match & e. arguments [ 0 ] {
579
- // `Number(undefined)` -> `NaN`
580
- Argument :: Identifier ( ident) if ctx. is_identifier_undefined ( ident) => f64:: NAN ,
581
- // `Number(null)` -> `0`
582
- Argument :: NullLiteral ( _) => 0.0 ,
583
- // `Number(true)` -> `1` `Number(false)` -> `0`
584
- Argument :: BooleanLiteral ( b) => f64:: from ( b. value ) ,
585
- // `Number(100)` -> `100`
586
- Argument :: NumericLiteral ( n) => n. value ,
587
- // `Number("a")` -> `+"a"` -> `NaN`
588
- // `Number("1")` -> `+"1"` -> `1`
589
- Argument :: StringLiteral ( n) => {
590
- let argument = ctx. ast . expression_string_literal ( n. span , n. value , n. raw ) ;
591
- if let Some ( n) = ctx. eval_to_number ( & argument) {
592
- n
593
- } else {
594
- return Some ( ctx. ast . expression_unary (
595
- e. span ,
596
- UnaryOperator :: UnaryPlus ,
597
- argument,
598
- ) ) ;
599
- }
576
+ let arg = e. arguments [ 0 ] . as_expression ( ) ?;
577
+ let value = ConstantValue :: Number ( match arg {
578
+ // `Number(undefined)` -> `NaN`
579
+ Expression :: Identifier ( ident) if ctx. is_identifier_undefined ( ident) => f64:: NAN ,
580
+ // `Number(null)` -> `0`
581
+ Expression :: NullLiteral ( _) => 0.0 ,
582
+ // `Number(true)` -> `1` `Number(false)` -> `0`
583
+ Expression :: BooleanLiteral ( b) => f64:: from ( b. value ) ,
584
+ // `Number(100)` -> `100`
585
+ Expression :: NumericLiteral ( n) => n. value ,
586
+ // `Number("a")` -> `+"a"` -> `NaN`
587
+ // `Number("1")` -> `+"1"` -> `1`
588
+ Expression :: StringLiteral ( n) => {
589
+ let argument = ctx. ast . expression_string_literal ( n. span , n. value , n. raw ) ;
590
+ if let Some ( n) = ctx. eval_to_number ( & argument) {
591
+ n
592
+ } else {
593
+ return Some ( ctx. ast . expression_unary (
594
+ e. span ,
595
+ UnaryOperator :: UnaryPlus ,
596
+ argument,
597
+ ) ) ;
600
598
}
601
- _ => return None ,
602
- } ) ,
603
- ) )
599
+ }
600
+ e if e. is_void_0 ( ) => f64:: NAN ,
601
+ _ => return None ,
602
+ } ) ;
603
+ Some ( ctx. value_to_expr ( e. span , value) )
604
604
}
605
605
606
606
fn try_fold_binary_typeof_comparison (
@@ -1744,6 +1744,7 @@ mod test {
1744
1744
#[ test]
1745
1745
fn test_number_constructor ( ) {
1746
1746
test ( "Number(undefined)" , "NaN" ) ;
1747
+ test ( "Number(void 0)" , "NaN" ) ;
1747
1748
test ( "Number(null)" , "0" ) ;
1748
1749
test ( "Number(true)" , "1" ) ;
1749
1750
test ( "Number(false)" , "0" ) ;
0 commit comments