Skip to content

Commit

Permalink
fix(es/compat): Make SwitchCase handler of block-scoping stateless (
Browse files Browse the repository at this point in the history
#7888)

**Related issue:**

 - Closes #7885
  • Loading branch information
kdy1 committed Aug 29, 2023
1 parent 4a2c24b commit 4b33d41
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 8 deletions.
19 changes: 19 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7885/input/.swcrc
@@ -0,0 +1,19 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": false
},
"target": "es5",
"loose": false,
"minify": {
"compress": false,
"mangle": false
}
},
"module": {
"type": "es6"
},
"minify": false,
"isModule": true
}
12 changes: 12 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7885/input/1.js
@@ -0,0 +1,12 @@
export const loopError = () => {
const stack: number[] = [1];
while (stack.shift() !== undefined) {
const object = 1;
[].map((): number => object);
}
const kind = 0;
switch (kind) {
case 0:
break;
}
};
17 changes: 17 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7885/output/1.js
@@ -0,0 +1,17 @@
export var loopError = function() {
var _loop = function() {
var object = 1;
[].map(function() {
return object;
});
};
var stack = [
1
];
while(stack.shift() !== undefined)_loop();
var kind = 0;
switch(kind){
case 0:
break;
}
};
22 changes: 15 additions & 7 deletions crates/swc_ecma_transforms_compat/src/es2015/block_scoping/mod.rs
Expand Up @@ -431,13 +431,6 @@ impl VisitMut for BlockScoping {
self.handle_capture_of_vars(&mut node.body);
}

fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) {
self.visit_mut_with_scope(ScopeKind::new_loop(), &mut node.body);

node.test.visit_mut_with(self);
self.handle_capture_of_vars(&mut node.body);
}

fn visit_mut_for_in_stmt(&mut self, node: &mut ForInStmt) {
let blockifyed = self.blockify_for_stmt_body(&mut node.body);
let lexical_var = if let ForHead::VarDecl(decl) = &node.left {
Expand Down Expand Up @@ -544,6 +537,14 @@ impl VisitMut for BlockScoping {
self.visit_mut_stmt_like(n);
}

fn visit_mut_switch_case(&mut self, n: &mut SwitchCase) {
let old_vars = self.vars.take();

n.visit_mut_children_with(self);

self.vars = old_vars;
}

fn visit_mut_var_decl(&mut self, var: &mut VarDecl) {
let old = self.var_decl_kind;
self.var_decl_kind = var.kind;
Expand All @@ -569,6 +570,13 @@ impl VisitMut for BlockScoping {
}
}
}

fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) {
self.visit_mut_with_scope(ScopeKind::new_loop(), &mut node.body);

node.test.visit_mut_with(self);
self.handle_capture_of_vars(&mut node.body);
}
}

impl BlockScoping {
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_transforms_compat/src/es2015/for_of.rs
Expand Up @@ -670,7 +670,7 @@ impl VisitMut for ForOf {
*s = self.fold_for_stmt(Some(label.clone()), stmt.take());
}
_ => {
body.visit_mut_children_with(self);
body.visit_mut_with(self);
}
}
}
Expand Down

1 comment on commit 4b33d41

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 4b33d41 Previous: a505012 Ratio
es/full/bugs-1 284121 ns/iter (± 7856) 297477 ns/iter (± 10965) 0.96
es/full/minify/libraries/antd 1340191977 ns/iter (± 9309604) 1398844945 ns/iter (± 14485520) 0.96
es/full/minify/libraries/d3 282717171 ns/iter (± 3731227) 291508053 ns/iter (± 6794911) 0.97
es/full/minify/libraries/echarts 1094872664 ns/iter (± 21300696) 1131738893 ns/iter (± 9575779) 0.97
es/full/minify/libraries/jquery 84068208 ns/iter (± 259870) 86562678 ns/iter (± 486225) 0.97
es/full/minify/libraries/lodash 97606336 ns/iter (± 342719) 100129730 ns/iter (± 1116613) 0.97
es/full/minify/libraries/moment 49839576 ns/iter (± 218339) 51010459 ns/iter (± 478201) 0.98
es/full/minify/libraries/react 18142544 ns/iter (± 156850) 18230514 ns/iter (± 149057) 1.00
es/full/minify/libraries/terser 224190702 ns/iter (± 4666589) 227364173 ns/iter (± 2195504) 0.99
es/full/minify/libraries/three 405068954 ns/iter (± 14221761) 413922373 ns/iter (± 7634614) 0.98
es/full/minify/libraries/typescript 2740477063 ns/iter (± 43451146) 2794314118 ns/iter (± 18358894) 0.98
es/full/minify/libraries/victory 611895605 ns/iter (± 11843132) 620937338 ns/iter (± 11534755) 0.99
es/full/minify/libraries/vue 124675747 ns/iter (± 1886866) 122158101 ns/iter (± 1049819) 1.02
es/full/codegen/es3 35312 ns/iter (± 61) 33702 ns/iter (± 257) 1.05
es/full/codegen/es5 35310 ns/iter (± 195) 33696 ns/iter (± 107) 1.05
es/full/codegen/es2015 35318 ns/iter (± 80) 33812 ns/iter (± 95) 1.04
es/full/codegen/es2016 35315 ns/iter (± 108) 33968 ns/iter (± 316) 1.04
es/full/codegen/es2017 35331 ns/iter (± 309) 33887 ns/iter (± 71) 1.04
es/full/codegen/es2018 35350 ns/iter (± 62) 33813 ns/iter (± 96) 1.05
es/full/codegen/es2019 35256 ns/iter (± 45) 33753 ns/iter (± 78) 1.04
es/full/codegen/es2020 35293 ns/iter (± 98) 33655 ns/iter (± 124) 1.05
es/full/all/es3 171500106 ns/iter (± 1327009) 176544976 ns/iter (± 4798887) 0.97
es/full/all/es5 162370254 ns/iter (± 1168677) 164547525 ns/iter (± 1268525) 0.99
es/full/all/es2015 120994136 ns/iter (± 606286) 121872475 ns/iter (± 737998) 0.99
es/full/all/es2016 120577779 ns/iter (± 568005) 121344645 ns/iter (± 1192114) 0.99
es/full/all/es2017 120049998 ns/iter (± 627620) 120150975 ns/iter (± 877927) 1.00
es/full/all/es2018 117723480 ns/iter (± 827805) 117796456 ns/iter (± 962178) 1.00
es/full/all/es2019 116768165 ns/iter (± 308619) 117568178 ns/iter (± 879761) 0.99
es/full/all/es2020 112169735 ns/iter (± 543188) 113120498 ns/iter (± 1165115) 0.99
es/full/parser 493071 ns/iter (± 5532) 495921 ns/iter (± 5888) 0.99
es/full/base/fixer 17402 ns/iter (± 102) 20437 ns/iter (± 287) 0.85
es/full/base/resolver_and_hygiene 79774 ns/iter (± 212) 81748 ns/iter (± 187) 0.98
serialization of serde 291 ns/iter (± 3) 292 ns/iter (± 0) 1.00
css/minify/libraries/bootstrap 29229806 ns/iter (± 194376) 29198706 ns/iter (± 320371) 1.00
css/visitor/compare/clone 1653504 ns/iter (± 20340) 1650767 ns/iter (± 7474) 1.00
css/visitor/compare/visit_mut_span 1783900 ns/iter (± 15756) 1778853 ns/iter (± 25827) 1.00
css/visitor/compare/visit_mut_span_panic 1859793 ns/iter (± 7127) 1839667 ns/iter (± 6221) 1.01
css/visitor/compare/fold_span 2599967 ns/iter (± 25261) 2577119 ns/iter (± 9864) 1.01
css/visitor/compare/fold_span_panic 2786982 ns/iter (± 17764) 2756819 ns/iter (± 5613) 1.01
css/lexer/bootstrap_5_1_3 4506390 ns/iter (± 19663) 4536028 ns/iter (± 12104) 0.99
css/lexer/foundation_6_7_4 3787057 ns/iter (± 6347) 3821445 ns/iter (± 9154) 0.99
css/lexer/tailwind_3_1_1 721350 ns/iter (± 2289) 727064 ns/iter (± 2204) 0.99
css/parser/bootstrap_5_1_3 19997067 ns/iter (± 85460) 19671719 ns/iter (± 83332) 1.02
css/parser/foundation_6_7_4 16224174 ns/iter (± 191854) 15971035 ns/iter (± 84846) 1.02
css/parser/tailwind_3_1_1 3081842 ns/iter (± 5007) 3051732 ns/iter (± 4189) 1.01
es/codegen/colors 728150 ns/iter (± 396422) 735376 ns/iter (± 401796) 0.99
es/codegen/large 2905229 ns/iter (± 1531182) 2895004 ns/iter (± 1539681) 1.00
es/codegen/with-parser/colors 45721 ns/iter (± 266) 45714 ns/iter (± 196) 1.00
es/codegen/with-parser/large 496069 ns/iter (± 869) 498816 ns/iter (± 2061) 0.99
es/minify/libraries/antd 1223766934 ns/iter (± 22033676) 1264643417 ns/iter (± 16902280) 0.97
es/minify/libraries/d3 248912815 ns/iter (± 2695670) 250490428 ns/iter (± 3142805) 0.99
es/minify/libraries/echarts 985014493 ns/iter (± 15103597) 975192760 ns/iter (± 14266798) 1.01
es/minify/libraries/jquery 74863426 ns/iter (± 834606) 74265223 ns/iter (± 253313) 1.01
es/minify/libraries/lodash 88711143 ns/iter (± 491604) 88760099 ns/iter (± 937073) 1.00
es/minify/libraries/moment 43794265 ns/iter (± 231441) 43984194 ns/iter (± 255345) 1.00
es/minify/libraries/react 16092557 ns/iter (± 80998) 16266274 ns/iter (± 95282) 0.99
es/minify/libraries/terser 201349726 ns/iter (± 3856912) 193229619 ns/iter (± 3665810) 1.04
es/minify/libraries/three 351561037 ns/iter (± 8129563) 341510027 ns/iter (± 4055733) 1.03
es/minify/libraries/typescript 2363755528 ns/iter (± 32424499) 2398415308 ns/iter (± 32814533) 0.99
es/minify/libraries/victory 516568759 ns/iter (± 12548699) 532936504 ns/iter (± 17963060) 0.97
es/minify/libraries/vue 107919787 ns/iter (± 719030) 108720328 ns/iter (± 1376453) 0.99
es/visitor/compare/clone 1983964 ns/iter (± 5317) 1986174 ns/iter (± 14529) 1.00
es/visitor/compare/visit_mut_span 2302585 ns/iter (± 4976) 2287172 ns/iter (± 6834) 1.01
es/visitor/compare/visit_mut_span_panic 2369577 ns/iter (± 8847) 2346820 ns/iter (± 8016) 1.01
es/visitor/compare/fold_span 3390620 ns/iter (± 8381) 3407033 ns/iter (± 9811) 1.00
es/visitor/compare/fold_span_panic 3518725 ns/iter (± 10206) 3488177 ns/iter (± 11927) 1.01
es/lexer/colors 12992 ns/iter (± 115) 13464 ns/iter (± 9) 0.96
es/lexer/angular 6045234 ns/iter (± 5633) 6187749 ns/iter (± 17697) 0.98
es/lexer/backbone 779178 ns/iter (± 1193) 807953 ns/iter (± 1019) 0.96
es/lexer/jquery 4429120 ns/iter (± 42578) 4535882 ns/iter (± 6972) 0.98
es/lexer/jquery mobile 6795063 ns/iter (± 7989) 6975531 ns/iter (± 4962) 0.97
es/lexer/mootools 3548046 ns/iter (± 2669) 3615533 ns/iter (± 1692) 0.98
es/lexer/underscore 657141 ns/iter (± 841) 678868 ns/iter (± 501) 0.97
es/lexer/three 21350964 ns/iter (± 42271) 21692944 ns/iter (± 16878) 0.98
es/lexer/yui 3811699 ns/iter (± 9301) 3879550 ns/iter (± 1300) 0.98
es/parser/colors 27299 ns/iter (± 142) 26960 ns/iter (± 49) 1.01
es/parser/angular 13589859 ns/iter (± 81351) 13637983 ns/iter (± 99145) 1.00
es/parser/backbone 2002679 ns/iter (± 10500) 2002899 ns/iter (± 9680) 1.00
es/parser/jquery 10938710 ns/iter (± 47346) 11014451 ns/iter (± 80191) 0.99
es/parser/jquery mobile 16821974 ns/iter (± 63592) 16911159 ns/iter (± 184167) 0.99
es/parser/mootools 8379139 ns/iter (± 20713) 8433070 ns/iter (± 15215) 0.99
es/parser/underscore 1725067 ns/iter (± 10247) 1728877 ns/iter (± 8928) 1.00
es/parser/three 47668735 ns/iter (± 434397) 49380201 ns/iter (± 445900) 0.97
es/parser/yui 8343221 ns/iter (± 43015) 8365280 ns/iter (± 57138) 1.00
es/preset-env/usage/builtin_type 137796 ns/iter (± 33128) 135384 ns/iter (± 31917) 1.02
es/preset-env/usage/property 16977 ns/iter (± 50) 16919 ns/iter (± 47) 1.00
es/resolver/typescript 91735087 ns/iter (± 923034) 92078170 ns/iter (± 820174) 1.00
es/fixer/typescript 66238379 ns/iter (± 422374) 67860675 ns/iter (± 458961) 0.98
es/hygiene/typescript 134731392 ns/iter (± 930923) 139170069 ns/iter (± 1391180) 0.97
es/resolver_with_hygiene/typescript 256345299 ns/iter (± 4165891) 252690247 ns/iter (± 3092534) 1.01
es/visitor/base-perf/module_clone 59569 ns/iter (± 279) 59539 ns/iter (± 218) 1.00
es/visitor/base-perf/fold_empty 63411 ns/iter (± 325) 63235 ns/iter (± 140) 1.00
es/visitor/base-perf/fold_noop_impl_all 63231 ns/iter (± 226) 63104 ns/iter (± 408) 1.00
es/visitor/base-perf/fold_noop_impl_vec 63544 ns/iter (± 232) 63503 ns/iter (± 215) 1.00
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 57 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 40 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 110 ns/iter (± 0) 111 ns/iter (± 0) 0.99
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 75 ns/iter (± 0) 1.05
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2627 ns/iter (± 13) 2620 ns/iter (± 11) 1.00
es/base/parallel/resolver/typescript 3808827405 ns/iter (± 270193472) 4457074707 ns/iter (± 278566843) 0.85
es/base/parallel/hygiene/typescript 1471037004 ns/iter (± 6661214) 1509050251 ns/iter (± 20435881) 0.97
misc/visitors/time-complexity/time 5 138 ns/iter (± 1) 120 ns/iter (± 1) 1.15
misc/visitors/time-complexity/time 10 390 ns/iter (± 6) 393 ns/iter (± 7) 0.99
misc/visitors/time-complexity/time 15 715 ns/iter (± 19) 678 ns/iter (± 6) 1.05
misc/visitors/time-complexity/time 20 1129 ns/iter (± 23) 1047 ns/iter (± 3) 1.08
misc/visitors/time-complexity/time 40 3661 ns/iter (± 30) 4129 ns/iter (± 295) 0.89
misc/visitors/time-complexity/time 60 7381 ns/iter (± 26) 8781 ns/iter (± 3) 0.84
es/full-target/es2016 234873 ns/iter (± 447) 228086 ns/iter (± 505) 1.03
es/full-target/es2017 227996 ns/iter (± 650) 217976 ns/iter (± 591) 1.05
es/full-target/es2018 213579 ns/iter (± 399) 206450 ns/iter (± 1008) 1.03
es2020_nullish_coalescing 70898 ns/iter (± 343) 71108 ns/iter (± 402) 1.00
es2020_optional_chaining 81692 ns/iter (± 327) 82086 ns/iter (± 257) 1.00
es2022_class_properties 117431 ns/iter (± 339) 114480 ns/iter (± 411) 1.03
es2018_object_rest_spread 75209 ns/iter (± 184) 75172 ns/iter (± 354) 1.00
es2019_optional_catch_binding 65363 ns/iter (± 331) 65533 ns/iter (± 183) 1.00
es2017_async_to_generator 63005 ns/iter (± 180) 65654 ns/iter (± 182) 0.96
es2016_exponentiation 66391 ns/iter (± 217) 67168 ns/iter (± 409) 0.99
es2015_arrow 73176 ns/iter (± 220) 72333 ns/iter (± 277) 1.01
es2015_block_scoped_fn 69602 ns/iter (± 225) 68875 ns/iter (± 223) 1.01
es2015_block_scoping 124917 ns/iter (± 356) 120401 ns/iter (± 449) 1.04

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.