@@ -64,6 +64,7 @@ pub(crate) struct VarUsageInfo {
64
64
65
65
pub ( crate ) declared_as_for_init : bool ,
66
66
67
+ /// The number of assign and initialization to this identifier.
67
68
pub ( crate ) assign_count : u32 ,
68
69
69
70
/// The number of direct and indirect reference to this identifier.
@@ -171,7 +172,7 @@ impl VarUsageInfo {
171
172
172
173
/// The variable itself or a property of it is modified.
173
174
pub ( crate ) fn mutated ( & self ) -> bool {
174
- self . assign_count > 0 || self . has_property_mutation
175
+ self . assign_count > 1 || self . has_property_mutation
175
176
}
176
177
177
178
pub ( crate ) fn can_inline_fn_once ( & self ) -> bool {
@@ -221,11 +222,16 @@ impl Storage for ProgramData {
221
222
let var_assigned = var_info. assign_count > 0
222
223
|| ( var_info. var_initialized && !e. get ( ) . var_initialized ) ;
223
224
225
+ if var_info. assign_count > 0 {
226
+ if e. get ( ) . initialized ( ) {
227
+ e. get_mut ( ) . reassigned = true
228
+ }
229
+ }
230
+
224
231
if var_info. var_initialized {
225
232
// If it is inited in some other child scope and also inited in current
226
233
// scope
227
234
if e. get ( ) . var_initialized || e. get ( ) . ref_count > 0 {
228
- e. get_mut ( ) . assign_count += 1 ;
229
235
e. get_mut ( ) . reassigned = true ;
230
236
} else {
231
237
// If it is referred outside child scope, it will
@@ -237,7 +243,6 @@ impl Storage for ProgramData {
237
243
// current child scope
238
244
if !inited && e. get ( ) . var_initialized && var_info. ref_count > 0 {
239
245
e. get_mut ( ) . var_initialized = false ;
240
- e. get_mut ( ) . assign_count += 1 ;
241
246
e. get_mut ( ) . reassigned = true
242
247
}
243
248
}
@@ -246,12 +251,6 @@ impl Storage for ProgramData {
246
251
247
252
e. get_mut ( ) . reassigned |= var_info. reassigned ;
248
253
249
- if var_info. assign_count > 0 {
250
- if e. get ( ) . initialized ( ) {
251
- e. get_mut ( ) . reassigned = true
252
- }
253
- }
254
-
255
254
e. get_mut ( ) . has_property_access |= var_info. has_property_access ;
256
255
e. get_mut ( ) . has_property_mutation |= var_info. has_property_mutation ;
257
256
e. get_mut ( ) . exported |= var_info. exported ;
@@ -349,13 +348,16 @@ impl Storage for ProgramData {
349
348
v. is_top_level |= ctx. is_top_level ;
350
349
351
350
// assigned or declared before this declaration
352
- if has_init && ( v. declared || v. var_initialized || v. assign_count > 0 ) {
353
- #[ cfg( feature = "debug" ) ]
354
- {
355
- tracing:: trace!( "declare_decl(`{}`): Already declared" , i) ;
351
+ if has_init {
352
+ if v. declared || v. var_initialized || v. assign_count > 0 {
353
+ #[ cfg( feature = "debug" ) ]
354
+ {
355
+ tracing:: trace!( "declare_decl(`{}`): Already declared" , i) ;
356
+ }
357
+
358
+ v. reassigned = true ;
356
359
}
357
360
358
- v. reassigned = true ;
359
361
v. assign_count += 1 ;
360
362
}
361
363
@@ -403,7 +405,7 @@ impl Storage for ProgramData {
403
405
404
406
for other in to_mark_mutate {
405
407
let other = self . vars . entry ( other) . or_insert_with ( || {
406
- let simple_assign = ctx. is_exact_reassignment && !ctx. is_op_assign ;
408
+ let simple_assign = ctx. is_exact_assignment && !ctx. is_op_assign ;
407
409
408
410
VarUsageInfo {
409
411
used_above_decl : !simple_assign,
@@ -570,7 +572,7 @@ impl ProgramData {
570
572
let e = self . vars . entry ( i. clone ( ) ) . or_insert_with ( || {
571
573
// trace!("insert({}{:?})", i.0, i.1);
572
574
573
- let simple_assign = ctx. is_exact_reassignment && !ctx. is_op_assign ;
575
+ let simple_assign = ctx. is_exact_assignment && !ctx. is_op_assign ;
574
576
575
577
VarUsageInfo {
576
578
used_above_decl : !simple_assign,
@@ -601,7 +603,7 @@ impl ProgramData {
601
603
e. executed_multiple_time |= ctx. executed_multiple_time ;
602
604
e. used_in_cond |= ctx. in_cond ;
603
605
604
- if is_modify && ctx. is_exact_reassignment {
606
+ if is_modify && ctx. is_exact_assignment {
605
607
if is_first {
606
608
if e. assign_count > 0 || e. initialized ( ) {
607
609
e. reassigned = true
@@ -610,13 +612,8 @@ impl ProgramData {
610
612
e. assign_count += 1 ;
611
613
612
614
if !ctx. is_op_assign {
613
- if e. ref_count == 1
614
- && ctx. in_assign_lhs
615
- && e. var_kind != Some ( VarDeclKind :: Const )
616
- && !inited
617
- {
615
+ if e. ref_count == 1 && e. var_kind != Some ( VarDeclKind :: Const ) && !inited {
618
616
self . initialized_vars . insert ( i. clone ( ) ) ;
619
- e. assign_count -= 1 ;
620
617
e. var_initialized = true ;
621
618
} else {
622
619
e. reassigned = true
1 commit comments
github-actions[bot] commentedon Oct 19, 2023
Benchmark
es/full/bugs-1
284560
ns/iter (± 3390
)288688
ns/iter (± 5595
)0.99
es/full/minify/libraries/antd
1383193821
ns/iter (± 13560992
)1383350684
ns/iter (± 11788999
)1.00
es/full/minify/libraries/d3
295542397
ns/iter (± 3617008
)296319155
ns/iter (± 2253807
)1.00
es/full/minify/libraries/echarts
1109847825
ns/iter (± 6939487
)1109579854
ns/iter (± 4405740
)1.00
es/full/minify/libraries/jquery
89467381
ns/iter (± 771486
)88987302
ns/iter (± 168124
)1.01
es/full/minify/libraries/lodash
104195677
ns/iter (± 241040
)104271650
ns/iter (± 479429
)1.00
es/full/minify/libraries/moment
52319062
ns/iter (± 148940
)52421190
ns/iter (± 99243
)1.00
es/full/minify/libraries/react
18788957
ns/iter (± 43939
)18862789
ns/iter (± 70621
)1.00
es/full/minify/libraries/terser
230107110
ns/iter (± 944521
)229662182
ns/iter (± 736719
)1.00
es/full/minify/libraries/three
408363859
ns/iter (± 2399893
)407653860
ns/iter (± 2586256
)1.00
es/full/minify/libraries/typescript
2736354242
ns/iter (± 6486448
)2779689950
ns/iter (± 9224924
)0.98
es/full/minify/libraries/victory
589740453
ns/iter (± 4873132
)594793169
ns/iter (± 2543440
)0.99
es/full/minify/libraries/vue
125492488
ns/iter (± 193039
)125814658
ns/iter (± 204118
)1.00
es/full/codegen/es3
33588
ns/iter (± 151
)34569
ns/iter (± 56
)0.97
es/full/codegen/es5
33671
ns/iter (± 189
)34621
ns/iter (± 165
)0.97
es/full/codegen/es2015
33457
ns/iter (± 91
)34559
ns/iter (± 95
)0.97
es/full/codegen/es2016
33536
ns/iter (± 111
)34608
ns/iter (± 147
)0.97
es/full/codegen/es2017
33644
ns/iter (± 96
)34592
ns/iter (± 151
)0.97
es/full/codegen/es2018
33506
ns/iter (± 151
)34644
ns/iter (± 90
)0.97
es/full/codegen/es2019
33438
ns/iter (± 96
)34592
ns/iter (± 201
)0.97
es/full/codegen/es2020
33415
ns/iter (± 59
)34597
ns/iter (± 108
)0.97
es/full/all/es3
176370241
ns/iter (± 1138533
)176204224
ns/iter (± 709095
)1.00
es/full/all/es5
170723592
ns/iter (± 1033427
)168609182
ns/iter (± 473897
)1.01
es/full/all/es2015
127382600
ns/iter (± 419235
)127574293
ns/iter (± 613526
)1.00
es/full/all/es2016
126985337
ns/iter (± 951262
)126459668
ns/iter (± 1749259
)1.00
es/full/all/es2017
126074714
ns/iter (± 616334
)125908328
ns/iter (± 795191
)1.00
es/full/all/es2018
123968281
ns/iter (± 678247
)123950332
ns/iter (± 1267294
)1.00
es/full/all/es2019
124023376
ns/iter (± 930039
)122742495
ns/iter (± 511746
)1.01
es/full/all/es2020
119918511
ns/iter (± 511295
)119476634
ns/iter (± 426357
)1.00
es/full/parser
559131
ns/iter (± 3507
)559583
ns/iter (± 3375
)1.00
es/full/base/fixer
18015
ns/iter (± 242
)18925
ns/iter (± 90
)0.95
es/full/base/resolver_and_hygiene
83844
ns/iter (± 260
)83590
ns/iter (± 136
)1.00
This comment was automatically generated by workflow using github-action-benchmark.