Skip to content

Commit

Permalink
fix(es/compat): Consider only the variables used in the closure (#9151)
Browse files Browse the repository at this point in the history
**Description:**

The original code separately records the usage of variables and checks if there is a closure. Changed to only record variables used in a closure.

**Related issue:**

 - Closes #8010
  • Loading branch information
CPunisher authored Jul 8, 2024
1 parent 00a18f7 commit 1357531
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 79 deletions.
37 changes: 18 additions & 19 deletions crates/swc/tests/fixture/issues-3xxx/3417/1/output/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,36 @@ export function selectRooms(building) {
}
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
try {
var _loop = function() {
for(var _iterator = levels[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var level = _step.value;
var levelId = level.id;
var levelRooms = roomsOnLevel(levelId, rooms, roomsByLevel);
var sortedRooms = [];
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
try {
for(var _iterator = levelRooms[Symbol.iterator](), _step1; !(_iteratorNormalCompletion = (_step1 = _iterator.next()).done); _iteratorNormalCompletion = true){
for(var _iterator1 = levelRooms[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
var room = _step1.value;
sortedRooms.push(room);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
_didIteratorError1 = true;
_iteratorError1 = err;
} finally{
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
_iterator1.return();
}
} finally{
if (_didIteratorError) {
throw _iteratorError;
if (_didIteratorError1) {
throw _iteratorError1;
}
}
}
sortedRooms.sort(function(a, b) {
return a + b;
});
var visitedRooms = {};
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
try {
var _loop = function() {
var room = _step2.value;
Expand Down Expand Up @@ -79,23 +79,22 @@ export function selectRooms(building) {
FLOOR_MAPPING[levelId]
];
};
for(var _iterator1 = sortedRooms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion1 = (_step2 = _iterator1.next()).done); _iteratorNormalCompletion1 = true)_loop();
for(var _iterator2 = sortedRooms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true)_loop();
} catch (err) {
_didIteratorError1 = true;
_iteratorError1 = err;
_didIteratorError2 = true;
_iteratorError2 = err;
} finally{
try {
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
_iterator1.return();
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
_iterator2.return();
}
} finally{
if (_didIteratorError1) {
throw _iteratorError1;
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
};
for(var _iterator = levels[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
Expand Down
69 changes: 9 additions & 60 deletions crates/swc_ecma_compat_es2015/src/block_scoping/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ use swc_ecma_utils::{
ExprFactory, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, visit_mut_obj_and_computed, Fold, Visit,
VisitMut, VisitMutWith, VisitWith,
as_folder, noop_visit_mut_type, visit_mut_obj_and_computed, Fold, VisitMut, VisitMutWith,
};
use swc_trace_macro::swc_trace;

Expand Down Expand Up @@ -100,17 +99,19 @@ impl BlockScoping {
}

fn mark_as_used(&mut self, i: Id) {
for (idx, scope) in self.scope.iter_mut().rev().enumerate() {
// Only consider the variable used in a non-ScopeKind::Loop, which means it is
// captured in a closure
for scope in self
.scope
.iter_mut()
.rev()
.skip_while(|scope| matches!(scope, ScopeKind::Loop { .. }))
{
if let ScopeKind::Loop {
lexical_var, used, ..
} = scope
{
//
if lexical_var.contains(&i) {
if idx == 0 {
return;
}

used.push(i);
return;
}
Expand All @@ -128,16 +129,6 @@ impl BlockScoping {
fn handle_capture_of_vars(&mut self, body: &mut Box<Stmt>) {
let body_stmt = &mut **body;

{
let mut v = FunctionFinder { found: false };
body_stmt.visit_with(&mut v);
if !v.found {
self.scope.pop();
return;
}
}

//
if let Some(ScopeKind::Loop {
args,
used,
Expand Down Expand Up @@ -935,45 +926,3 @@ impl VisitMut for MutationHandler<'_> {
n.arg = Some(Box::new(self.make_reassignment(val)))
}
}

#[derive(Debug)]
struct FunctionFinder {
found: bool,
}

impl Visit for FunctionFinder {
noop_visit_type!();

fn visit_arrow_expr(&mut self, _: &ArrowExpr) {
self.found = true;
}

/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_do_while_stmt(&mut self, _: &DoWhileStmt) {}

/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_for_in_stmt(&mut self, _: &ForInStmt) {}

/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_for_of_stmt(&mut self, _: &ForOfStmt) {}

/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_for_stmt(&mut self, _: &ForStmt) {}

fn visit_function(&mut self, _: &Function) {
self.found = true
}

/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_while_stmt(&mut self, _: &WhileStmt) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
for (const x of [0, 1, 2]) {
for (let i = 0; i < 1; i++) {
setTimeout(() => console.log(x));
}
}

1 comment on commit 1357531

@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: 1357531 Previous: 962170f Ratio
es/full/bugs-1 276264 ns/iter (± 4280) 298460 ns/iter (± 10054) 0.93
es/full/minify/libraries/antd 1857086591 ns/iter (± 57439258) 1764116943 ns/iter (± 41952085) 1.05
es/full/minify/libraries/d3 349771983 ns/iter (± 6156695) 339999139 ns/iter (± 2203273) 1.03
es/full/minify/libraries/echarts 1701472005 ns/iter (± 80898405) 1507558401 ns/iter (± 45124935) 1.13
es/full/minify/libraries/jquery 102722069 ns/iter (± 523505) 101931554 ns/iter (± 259535) 1.01
es/full/minify/libraries/lodash 114175080 ns/iter (± 850461) 113140629 ns/iter (± 152393) 1.01
es/full/minify/libraries/moment 59636563 ns/iter (± 169216) 59318726 ns/iter (± 141632) 1.01
es/full/minify/libraries/react 18428071 ns/iter (± 76152) 18361232 ns/iter (± 244292) 1.00
es/full/minify/libraries/terser 274585797 ns/iter (± 2400547) 272681248 ns/iter (± 1471280) 1.01
es/full/minify/libraries/three 489000147 ns/iter (± 14874849) 463614110 ns/iter (± 2733797) 1.05
es/full/minify/libraries/typescript 3325506318 ns/iter (± 84602226) 3229179723 ns/iter (± 46371067) 1.03
es/full/minify/libraries/victory 773517990 ns/iter (± 20949161) 731847705 ns/iter (± 9130991) 1.06
es/full/minify/libraries/vue 145742194 ns/iter (± 879256) 144868295 ns/iter (± 261022) 1.01
es/full/codegen/es3 60252 ns/iter (± 604) 59628 ns/iter (± 157) 1.01
es/full/codegen/es5 60282 ns/iter (± 117) 59679 ns/iter (± 124) 1.01
es/full/codegen/es2015 60071 ns/iter (± 315) 59592 ns/iter (± 97) 1.01
es/full/codegen/es2016 60182 ns/iter (± 162) 59753 ns/iter (± 138) 1.01
es/full/codegen/es2017 60050 ns/iter (± 156) 59587 ns/iter (± 180) 1.01
es/full/codegen/es2018 60173 ns/iter (± 202) 59638 ns/iter (± 2441) 1.01
es/full/codegen/es2019 60059 ns/iter (± 191) 59683 ns/iter (± 184) 1.01
es/full/codegen/es2020 60025 ns/iter (± 198) 59790 ns/iter (± 43) 1.00
es/full/all/es3 161791369 ns/iter (± 1391147) 161531179 ns/iter (± 1449389) 1.00
es/full/all/es5 154831080 ns/iter (± 990654) 154365543 ns/iter (± 1326644) 1.00
es/full/all/es2015 114158523 ns/iter (± 705833) 113877741 ns/iter (± 758931) 1.00
es/full/all/es2016 114051443 ns/iter (± 827275) 112949934 ns/iter (± 1021040) 1.01
es/full/all/es2017 112554734 ns/iter (± 948902) 112411492 ns/iter (± 553617) 1.00
es/full/all/es2018 111791956 ns/iter (± 790011) 109963218 ns/iter (± 1285595) 1.02
es/full/all/es2019 109733158 ns/iter (± 452843) 109939330 ns/iter (± 1174177) 1.00
es/full/all/es2020 105932397 ns/iter (± 841242) 105418923 ns/iter (± 801095) 1.00
es/full/parser 457769 ns/iter (± 2757) 445309 ns/iter (± 2199) 1.03
es/full/base/fixer 15905 ns/iter (± 89) 14970 ns/iter (± 39) 1.06
es/full/base/resolver_and_hygiene 80626 ns/iter (± 359) 79214 ns/iter (± 234) 1.02
serialization of serde 278 ns/iter (± 1) 270 ns/iter (± 3) 1.03
css/minify/libraries/bootstrap 21649918 ns/iter (± 28853) 21513667 ns/iter (± 305963) 1.01
css/visitor/compare/clone 1398587 ns/iter (± 8920) 1394581 ns/iter (± 12945) 1.00
css/visitor/compare/visit_mut_span 1528992 ns/iter (± 18414) 1529850 ns/iter (± 6381) 1.00
css/visitor/compare/visit_mut_span_panic 1538564 ns/iter (± 39921) 1544454 ns/iter (± 25559) 1.00
css/visitor/compare/fold_span 2049387 ns/iter (± 5984) 2028952 ns/iter (± 6000) 1.01
css/visitor/compare/fold_span_panic 2171423 ns/iter (± 6708) 2171715 ns/iter (± 9687) 1.00
css/lexer/bootstrap_5_1_3 3472155 ns/iter (± 6125) 3485162 ns/iter (± 35680) 1.00
css/lexer/foundation_6_7_4 2799484 ns/iter (± 6746) 2818035 ns/iter (± 2234) 0.99
css/lexer/tailwind_3_1_1 534455 ns/iter (± 532) 540566 ns/iter (± 2110) 0.99
css/parser/bootstrap_5_1_3 16462406 ns/iter (± 102513) 16218676 ns/iter (± 57732) 1.02
css/parser/foundation_6_7_4 13085583 ns/iter (± 146975) 13075924 ns/iter (± 95241) 1.00
css/parser/tailwind_3_1_1 2521371 ns/iter (± 44381) 2587885 ns/iter (± 14013) 0.97
es/codegen/colors 730991 ns/iter (± 398629) 728089 ns/iter (± 405441) 1.00
es/codegen/large 3028408 ns/iter (± 1596683) 3033992 ns/iter (± 1635266) 1.00
es/codegen/with-parser/colors 40515 ns/iter (± 1148) 41021 ns/iter (± 536) 0.99
es/codegen/with-parser/large 450776 ns/iter (± 1577) 456674 ns/iter (± 2100) 0.99
es/minify/libraries/antd 1605231976 ns/iter (± 22529159) 1449953070 ns/iter (± 45112603) 1.11
es/minify/libraries/d3 346451051 ns/iter (± 13319465) 289459221 ns/iter (± 14552072) 1.20
es/minify/libraries/echarts 1363015314 ns/iter (± 20594018) 1183775098 ns/iter (± 17167056) 1.15
es/minify/libraries/jquery 87405777 ns/iter (± 755817) 82780174 ns/iter (± 481279) 1.06
es/minify/libraries/lodash 108754147 ns/iter (± 1122301) 104759416 ns/iter (± 462313) 1.04
es/minify/libraries/moment 50208110 ns/iter (± 464568) 48476789 ns/iter (± 122821) 1.04
es/minify/libraries/react 16695598 ns/iter (± 48069) 16311068 ns/iter (± 28947) 1.02
es/minify/libraries/terser 252554057 ns/iter (± 11347668) 221914527 ns/iter (± 3314333) 1.14
es/minify/libraries/three 443098302 ns/iter (± 11138695) 377064810 ns/iter (± 7545640) 1.18
es/minify/libraries/typescript 2956269767 ns/iter (± 25043623) 2756411323 ns/iter (± 22259997) 1.07
es/minify/libraries/victory 721409651 ns/iter (± 15221218) 596585096 ns/iter (± 22405660) 1.21
es/minify/libraries/vue 133670241 ns/iter (± 3150245) 122192917 ns/iter (± 682388) 1.09
es/visitor/compare/clone 1726128 ns/iter (± 6297) 1714750 ns/iter (± 7527) 1.01
es/visitor/compare/visit_mut_span 2066655 ns/iter (± 9474) 2068808 ns/iter (± 3516) 1.00
es/visitor/compare/visit_mut_span_panic 2084913 ns/iter (± 41095) 2050612 ns/iter (± 6705) 1.02
es/visitor/compare/fold_span 2797898 ns/iter (± 4576) 2754376 ns/iter (± 5776) 1.02
es/visitor/compare/fold_span_panic 2826270 ns/iter (± 8434) 2802516 ns/iter (± 3070) 1.01
es/lexer/colors 9530 ns/iter (± 34) 9736 ns/iter (± 67) 0.98
es/lexer/angular 5153974 ns/iter (± 45940) 5180011 ns/iter (± 3376) 0.99
es/lexer/backbone 661199 ns/iter (± 6218) 638613 ns/iter (± 1697) 1.04
es/lexer/jquery 3630280 ns/iter (± 3264) 3624151 ns/iter (± 117224) 1.00
es/lexer/jquery mobile 5490308 ns/iter (± 107342) 5407716 ns/iter (± 85178) 1.02
es/lexer/mootools 2925366 ns/iter (± 2541) 2889480 ns/iter (± 9452) 1.01
es/lexer/underscore 540600 ns/iter (± 1907) 538771 ns/iter (± 811) 1.00
es/lexer/three 16445294 ns/iter (± 25438) 16334603 ns/iter (± 106859) 1.01
es/lexer/yui 2921326 ns/iter (± 29936) 2923566 ns/iter (± 22946) 1.00
es/lexer/cal-com 13274008 ns/iter (± 60105) 13075688 ns/iter (± 26059) 1.02
es/lexer/typescript 93218341 ns/iter (± 516590) 91024802 ns/iter (± 295216) 1.02
es/parser/colors 23543 ns/iter (± 136) 23683 ns/iter (± 59) 0.99
es/parser/angular 12661883 ns/iter (± 76101) 12593504 ns/iter (± 93419) 1.01
es/parser/backbone 1823319 ns/iter (± 6119) 1829454 ns/iter (± 5626) 1.00
es/parser/jquery 10069381 ns/iter (± 88765) 10023556 ns/iter (± 147661) 1.00
es/parser/jquery mobile 15426650 ns/iter (± 264449) 15114147 ns/iter (± 115584) 1.02
es/parser/mootools 7837180 ns/iter (± 63908) 7854246 ns/iter (± 95183) 1.00
es/parser/underscore 1584859 ns/iter (± 8461) 1597455 ns/iter (± 9267) 0.99
es/parser/three 44567100 ns/iter (± 607351) 44257981 ns/iter (± 567243) 1.01
es/parser/yui 7488578 ns/iter (± 44050) 7483174 ns/iter (± 107374) 1.00
es/parser/cal-com 40394010 ns/iter (± 371945) 41363200 ns/iter (± 588350) 0.98
es/parser/typescript 268881843 ns/iter (± 1019128) 273664285 ns/iter (± 1131635) 0.98
es/preset-env/usage/builtin_type 136281 ns/iter (± 33509) 136801 ns/iter (± 33643) 1.00
es/preset-env/usage/property 16755 ns/iter (± 434) 16358 ns/iter (± 137) 1.02
es/resolver/typescript 101385834 ns/iter (± 2784973) 99830194 ns/iter (± 2436646) 1.02
es/fixer/typescript 81833340 ns/iter (± 2911310) 80978426 ns/iter (± 3691736) 1.01
es/hygiene/typescript 188856665 ns/iter (± 1897547) 183527689 ns/iter (± 2424946) 1.03
es/resolver_with_hygiene/typescript 328117435 ns/iter (± 4318514) 310309843 ns/iter (± 3620571) 1.06
es/visitor/base-perf/module_clone 56444 ns/iter (± 306) 55617 ns/iter (± 941) 1.01
es/visitor/base-perf/fold_empty 60113 ns/iter (± 987) 59056 ns/iter (± 447) 1.02
es/visitor/base-perf/fold_noop_impl_all 60399 ns/iter (± 873) 59048 ns/iter (± 535) 1.02
es/visitor/base-perf/fold_noop_impl_vec 60261 ns/iter (± 962) 58892 ns/iter (± 410) 1.02
es/visitor/base-perf/boxing_boxed_clone 60 ns/iter (± 0) 61 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 47 ns/iter (± 0) 47 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 106 ns/iter (± 0) 107 ns/iter (± 0) 0.99
es/visitor/base-perf/boxing_unboxed 82 ns/iter (± 0) 81 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 2654 ns/iter (± 9) 2656 ns/iter (± 7) 1.00
es/base/parallel/resolver/typescript 2388492202 ns/iter (± 121542654) 2486447688 ns/iter (± 154119112) 0.96
es/base/parallel/hygiene/typescript 3293513571 ns/iter (± 42394764) 3230288772 ns/iter (± 57296287) 1.02
babelify-only 496297 ns/iter (± 9478) 494244 ns/iter (± 5089) 1.00
parse_and_babelify_angular 46893169 ns/iter (± 1470729) 46485655 ns/iter (± 2446233) 1.01
parse_and_babelify_backbone 4925926 ns/iter (± 300309) 4646630 ns/iter (± 207561) 1.06
parse_and_babelify_jquery 32758457 ns/iter (± 607320) 32697701 ns/iter (± 908898) 1.00
parse_and_babelify_jquery_mobile 56106070 ns/iter (± 1256233) 54210389 ns/iter (± 836379) 1.03
parse_and_babelify_mootools 29756851 ns/iter (± 668219) 29016284 ns/iter (± 237718) 1.03
parse_and_babelify_underscore 3986635 ns/iter (± 161044) 3832632 ns/iter (± 67219) 1.04
parse_and_babelify_yui 28733815 ns/iter (± 1075985) 30744132 ns/iter (± 2122946) 0.93
html/minify/document/css_spec 46901533 ns/iter (± 1704633) 46526817 ns/iter (± 560879) 1.01
html/minify/document/github 18440735 ns/iter (± 95830) 18548000 ns/iter (± 531405) 0.99
html/minify/document/stackoverflow 16920295 ns/iter (± 434714) 16886660 ns/iter (± 495353) 1.00
html/minify/document_fragment/css_spec 45806192 ns/iter (± 681557) 45498769 ns/iter (± 399510) 1.01
html/minify/document_fragment/github 18209579 ns/iter (± 287455) 18261064 ns/iter (± 153295) 1.00
html/minify/document_fragment/stackoverflow 16461119 ns/iter (± 122395) 16521311 ns/iter (± 68913) 1.00
html/document/visitor/compare/clone 165604 ns/iter (± 1810) 163770 ns/iter (± 2166) 1.01
html/document/visitor/compare/visit_mut_span 181803 ns/iter (± 1541) 183714 ns/iter (± 1696) 0.99
html/document/visitor/compare/visit_mut_span_panic 187761 ns/iter (± 5987) 188840 ns/iter (± 6693) 0.99
html/document/visitor/compare/fold_span 229642 ns/iter (± 716) 231964 ns/iter (± 1128) 0.99
html/document/visitor/compare/fold_span_panic 280878 ns/iter (± 404) 279609 ns/iter (± 1760) 1.00
html/document_fragment/visitor/compare/clone 166114 ns/iter (± 1525) 165949 ns/iter (± 988) 1.00
html/document_fragment/visitor/compare/visit_mut_span 182813 ns/iter (± 1312) 180207 ns/iter (± 757) 1.01
html/document_fragment/visitor/compare/visit_mut_span_panic 186020 ns/iter (± 1189) 185358 ns/iter (± 530) 1.00
html/document_fragment/visitor/compare/fold_span 229840 ns/iter (± 1101) 233088 ns/iter (± 1318) 0.99
html/document_fragment/visitor/compare/fold_span_panic 280747 ns/iter (± 1338) 280544 ns/iter (± 1178) 1.00
html/lexer/css_2021_spec 12759300 ns/iter (± 22075) 12830778 ns/iter (± 132581) 0.99
html/lexer/github_com_17_05_2022 4894784 ns/iter (± 9610) 4897786 ns/iter (± 13050) 1.00
html/lexer/stackoverflow_com_17_05_2022 4627390 ns/iter (± 22361) 4638529 ns/iter (± 3085) 1.00
html/parser/parser_document/css_2021_spec 26169522 ns/iter (± 118314) 25822469 ns/iter (± 41664) 1.01
html/parser/parser_document/github_com_17_05_2022 8717570 ns/iter (± 70099) 8763025 ns/iter (± 14124) 0.99
html/parser/parser_document/stackoverflow_com_17_05_2022 7453176 ns/iter (± 7154) 7550969 ns/iter (± 8592) 0.99
html/parser/parser_document_fragment/css_2021_spec 27219426 ns/iter (± 108464) 25908377 ns/iter (± 113934) 1.05
html/parser/parser_document_fragment/github_com_17_05_2022 8914709 ns/iter (± 13322) 8607957 ns/iter (± 29280) 1.04
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7906186 ns/iter (± 16449) 7485850 ns/iter (± 26205) 1.06

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

Please sign in to comment.