1
1
use oxc_ast:: ast:: * ;
2
2
3
+ use crate :: is_global_reference:: IsGlobalReference ;
4
+
3
5
/// `ToNumber`
4
6
///
5
- /// <https://tc39.es/ecma262/#sec-tonumber>
7
+ /// <https://tc39.es/ecma262/multipage/abstract-operations.html #sec-tonumber>
6
8
pub trait ToNumber < ' a > {
7
- fn to_number ( & self ) -> Option < f64 > ;
9
+ fn to_number ( & self , is_global_reference : & impl IsGlobalReference ) -> Option < f64 > ;
8
10
}
9
11
10
12
impl < ' a > ToNumber < ' a > for Expression < ' a > {
11
- fn to_number ( & self ) -> Option < f64 > {
13
+ fn to_number ( & self , is_global_reference : & impl IsGlobalReference ) -> Option < f64 > {
12
14
match self {
13
15
Expression :: NumericLiteral ( number_literal) => Some ( number_literal. value ) ,
14
16
Expression :: BooleanLiteral ( bool_literal) => {
@@ -20,16 +22,22 @@ impl<'a> ToNumber<'a> for Expression<'a> {
20
22
}
21
23
Expression :: NullLiteral ( _) => Some ( 0.0 ) ,
22
24
Expression :: Identifier ( ident) => match ident. name . as_str ( ) {
23
- "Infinity" => Some ( f64:: INFINITY ) ,
24
- "NaN" | "undefined" => Some ( f64:: NAN ) ,
25
+ "Infinity" if is_global_reference. is_global_reference ( ident) == Some ( true ) => {
26
+ Some ( f64:: INFINITY )
27
+ }
28
+ "NaN" | "undefined"
29
+ if is_global_reference. is_global_reference ( ident) == Some ( true ) =>
30
+ {
31
+ Some ( f64:: NAN )
32
+ }
25
33
_ => None ,
26
34
} ,
27
35
Expression :: StringLiteral ( lit) => {
28
36
use crate :: StringToNumber ;
29
37
Some ( lit. value . as_str ( ) . string_to_number ( ) )
30
38
}
31
39
Expression :: UnaryExpression ( unary) if unary. operator . is_not ( ) => {
32
- let number = unary. argument . to_number ( ) ?;
40
+ let number = unary. argument . to_number ( is_global_reference ) ?;
33
41
Some ( if number == 0.0 { 1.0 } else { 0.0 } )
34
42
}
35
43
_ => None ,
0 commit comments