@@ -14,11 +14,7 @@ pub use is_literal_value::IsLiteralValue;
14
14
pub use value:: ConstantValue ;
15
15
pub use value_type:: ValueType ;
16
16
17
- pub trait ConstantEvaluation < ' a > {
18
- fn is_global_reference ( & self , ident : & IdentifierReference < ' a > ) -> bool {
19
- matches ! ( ident. name. as_str( ) , "undefined" | "NaN" | "Infinity" )
20
- }
21
-
17
+ pub trait ConstantEvaluation < ' a > : MayHaveSideEffects < ' a > {
22
18
fn resolve_binding ( & self , ident : & IdentifierReference < ' a > ) -> Option < ConstantValue < ' a > > {
23
19
match ident. name . as_str ( ) {
24
20
"undefined" if self . is_global_reference ( ident) => Some ( ConstantValue :: Undefined ) ,
@@ -36,7 +32,7 @@ pub trait ConstantEvaluation<'a> {
36
32
// and there are only a very few cases where we can compute a number value, but there could
37
33
// also be side effects. e.g. `void doSomething()` has value NaN, regardless of the behavior
38
34
// of `doSomething()`
39
- if value. is_some ( ) && expr . may_have_side_effects ( ) {
35
+ if value. is_some ( ) && self . expression_may_have_side_efffects ( expr ) {
40
36
None
41
37
} else {
42
38
value
@@ -45,23 +41,23 @@ pub trait ConstantEvaluation<'a> {
45
41
46
42
fn get_side_free_string_value ( & self , expr : & Expression < ' a > ) -> Option < Cow < ' a , str > > {
47
43
let value = expr. to_js_string ( ) ;
48
- if value. is_some ( ) && !expr . may_have_side_effects ( ) {
44
+ if value. is_some ( ) && !self . expression_may_have_side_efffects ( expr ) {
49
45
return value;
50
46
}
51
47
None
52
48
}
53
49
54
50
fn get_side_free_boolean_value ( & self , expr : & Expression < ' a > ) -> Option < bool > {
55
51
let value = self . get_boolean_value ( expr) ;
56
- if value. is_some ( ) && !expr . may_have_side_effects ( ) {
52
+ if value. is_some ( ) && !self . expression_may_have_side_efffects ( expr ) {
57
53
return value;
58
54
}
59
55
None
60
56
}
61
57
62
58
fn get_side_free_bigint_value ( & self , expr : & Expression < ' a > ) -> Option < BigInt > {
63
59
let value = expr. to_big_int ( ) ;
64
- if value. is_some ( ) && expr . may_have_side_effects ( ) {
60
+ if value. is_some ( ) && self . expression_may_have_side_efffects ( expr ) {
65
61
None
66
62
} else {
67
63
value
@@ -205,7 +201,9 @@ pub trait ConstantEvaluation<'a> {
205
201
) -> Option < ConstantValue < ' a > > {
206
202
match operator {
207
203
BinaryOperator :: Addition => {
208
- if left. may_have_side_effects ( ) || right. may_have_side_effects ( ) {
204
+ if self . expression_may_have_side_efffects ( left)
205
+ || self . expression_may_have_side_efffects ( right)
206
+ {
209
207
return None ;
210
208
}
211
209
let left_type = ValueType :: from ( left) ;
@@ -321,7 +319,7 @@ pub trait ConstantEvaluation<'a> {
321
319
None
322
320
}
323
321
BinaryOperator :: Instanceof => {
324
- if left . may_have_side_effects ( ) {
322
+ if self . expression_may_have_side_efffects ( left ) {
325
323
return None ;
326
324
}
327
325
if let Expression :: Identifier ( right_ident) = right {
@@ -380,8 +378,9 @@ pub trait ConstantEvaluation<'a> {
380
378
} ;
381
379
Some ( ConstantValue :: String ( Cow :: Borrowed ( s) ) )
382
380
}
383
- UnaryOperator :: Void => ( expr. argument . is_literal ( ) || !expr. may_have_side_effects ( ) )
384
- . then_some ( ConstantValue :: Undefined ) ,
381
+ UnaryOperator :: Void => ( expr. argument . is_literal ( )
382
+ || !self . expression_may_have_side_efffects ( & expr. argument ) )
383
+ . then_some ( ConstantValue :: Undefined ) ,
385
384
UnaryOperator :: LogicalNot => self
386
385
. get_side_free_boolean_value ( & expr. argument )
387
386
. map ( |b| !b)
@@ -424,10 +423,9 @@ pub trait ConstantEvaluation<'a> {
424
423
if let Some ( ConstantValue :: String ( s) ) = self . eval_expression ( & expr. object ) {
425
424
Some ( ConstantValue :: Number ( s. encode_utf16 ( ) . count ( ) . to_f64 ( ) . unwrap ( ) ) )
426
425
} else {
427
- if expr. object . may_have_side_effects ( ) {
426
+ if self . expression_may_have_side_efffects ( & expr. object ) {
428
427
return None ;
429
428
}
430
-
431
429
if let Expression :: ArrayExpression ( arr) = & expr. object {
432
430
Some ( ConstantValue :: Number ( arr. elements . len ( ) . to_f64 ( ) . unwrap ( ) ) )
433
431
} else {
@@ -448,10 +446,9 @@ pub trait ConstantEvaluation<'a> {
448
446
if let Some ( ConstantValue :: String ( s) ) = self . eval_expression ( & expr. object ) {
449
447
Some ( ConstantValue :: Number ( s. encode_utf16 ( ) . count ( ) . to_f64 ( ) . unwrap ( ) ) )
450
448
} else {
451
- if expr. object . may_have_side_effects ( ) {
449
+ if self . expression_may_have_side_efffects ( & expr. object ) {
452
450
return None ;
453
451
}
454
-
455
452
if let Expression :: ArrayExpression ( arr) = & expr. object {
456
453
Some ( ConstantValue :: Number ( arr. elements . len ( ) . to_f64 ( ) . unwrap ( ) ) )
457
454
} else {
0 commit comments