Skip to content

Commit 324f046

Browse files
authored
Merge pull request #41791 from microsoft/fix40643
Reuse temp variable scope for converted loop body
2 parents 69bc3f3 + 27dc177 commit 324f046

File tree

10 files changed

+72
-36
lines changed

10 files changed

+72
-36
lines changed

src/compiler/transformers/es2015.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3155,7 +3155,7 @@ namespace ts {
31553155

31563156
const containsYield = (node.statement.transformFlags & TransformFlags.ContainsYield) !== 0;
31573157

3158-
let emitFlags: EmitFlags = 0;
3158+
let emitFlags: EmitFlags = EmitFlags.ReuseTempVariableScope;
31593159
if (currentState.containsLexicalThis) emitFlags |= EmitFlags.CapturesThis;
31603160
if (containsYield && (hierarchyFacts & HierarchyFacts.AsyncFunctionBody) !== 0) emitFlags |= EmitFlags.AsyncFunctionBody;
31613161

tests/baselines/reference/asyncAwaitWithCapturedBlockScopeVar.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ function fn1() {
4444
case 0:
4545
ar = [];
4646
_loop_1 = function (i) {
47-
return __generator(this, function (_a) {
48-
switch (_a.label) {
47+
return __generator(this, function (_b) {
48+
switch (_b.label) {
4949
case 0: return [4 /*yield*/, 1];
5050
case 1:
51-
_a.sent();
51+
_b.sent();
5252
ar.push(function () { return i; });
5353
return [2 /*return*/];
5454
}
@@ -78,11 +78,11 @@ function fn2() {
7878
case 0:
7979
ar = [];
8080
_loop_2 = function (i) {
81-
return __generator(this, function (_a) {
82-
switch (_a.label) {
81+
return __generator(this, function (_b) {
82+
switch (_b.label) {
8383
case 0: return [4 /*yield*/, 1];
8484
case 1:
85-
_a.sent();
85+
_b.sent();
8686
ar.push(function () { return i; });
8787
return [2 /*return*/, "break"];
8888
}
@@ -114,11 +114,11 @@ function fn3() {
114114
case 0:
115115
ar = [];
116116
_loop_3 = function (i) {
117-
return __generator(this, function (_a) {
118-
switch (_a.label) {
117+
return __generator(this, function (_b) {
118+
switch (_b.label) {
119119
case 0: return [4 /*yield*/, 1];
120120
case 1:
121-
_a.sent();
121+
_b.sent();
122122
ar.push(function () { return i; });
123123
return [2 /*return*/, "continue"];
124124
}
@@ -148,11 +148,11 @@ function fn4() {
148148
case 0:
149149
ar = [];
150150
_loop_4 = function (i) {
151-
return __generator(this, function (_a) {
152-
switch (_a.label) {
151+
return __generator(this, function (_b) {
152+
switch (_b.label) {
153153
case 0: return [4 /*yield*/, 1];
154154
case 1:
155-
_a.sent();
155+
_b.sent();
156156
ar.push(function () { return i; });
157157
return [2 /*return*/, { value: 1 }];
158158
}

tests/baselines/reference/blockScopedBindingsInDownlevelGenerator.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ function a() {
5252
switch (_d.label) {
5353
case 0:
5454
_loop_1 = function (i) {
55-
return __generator(this, function (_a) {
56-
switch (_a.label) {
55+
return __generator(this, function (_e) {
56+
switch (_e.label) {
5757
case 0:
5858
(function () { return i; })();
5959
return [4 /*yield*/, i];
6060
case 1:
61-
_a.sent();
61+
_e.sent();
6262
return [2 /*return*/];
6363
}
6464
});

tests/baselines/reference/capturedLetConstInLoop10.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ var A = /** @class */ (function () {
6969
var b = function () { return y; };
7070
this_2.bar(b());
7171
};
72-
for (var _i = 0, _a = [1]; _i < _a.length; _i++) {
73-
var y = _a[_i];
72+
for (var _b = 0, _c = [1]; _b < _c.length; _b++) {
73+
var y = _c[_b];
7474
_loop_3(y);
7575
}
7676
this_2.bar(a());
@@ -89,8 +89,8 @@ var A = /** @class */ (function () {
8989
var b = function () { return y; };
9090
this_3.bar(b());
9191
};
92-
for (var _i = 0, _a = [1]; _i < _a.length; _i++) {
93-
var y = _a[_i];
92+
for (var _b = 0, _c = [1]; _b < _c.length; _b++) {
93+
var y = _c[_b];
9494
_loop_5(y);
9595
}
9696
};

tests/baselines/reference/capturedLetConstInLoop13.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ var Main = /** @class */ (function () {
3434
names[_i] = arguments[_i];
3535
}
3636
var _loop_1 = function (name_1) {
37-
var _a;
38-
this_1.bar((_a = {},
39-
_a[name_1 + ".a"] = function () { _this.foo(name_1); },
40-
_a));
37+
var _b;
38+
this_1.bar((_b = {},
39+
_b[name_1 + ".a"] = function () { _this.foo(name_1); },
40+
_b));
4141
};
4242
var this_1 = this;
4343
for (var _a = 0, names_1 = names; _a < names_1.length; _a++) {

tests/baselines/reference/capturedLetConstInLoop9.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,16 +178,16 @@ for (var x = 0; x < 1; ++x) {
178178
}
179179
function foo() {
180180
var _loop_3 = function (a) {
181-
var _a;
181+
var _b;
182182
if (a === 1) {
183183
return "break";
184184
}
185185
if (a === 2) {
186186
return "break-l0";
187187
}
188-
for (var _i = 0, _b = []; _i < _b.length; _i++) {
189-
var b = _b[_i];
190-
_a = [{ x: 1, y: 2 }][0], x = _a.x, z = _a.y;
188+
for (var _c = 0, _d = []; _c < _d.length; _c++) {
189+
var b = _d[_c];
190+
_b = [{ x: 1, y: 2 }][0], x = _b.x, z = _b.y;
191191
if (b === 1) {
192192
break;
193193
}
@@ -200,8 +200,8 @@ function foo() {
200200
return { value: 50 };
201201
}
202202
var _loop_4 = function (b) {
203-
var _a;
204-
_a = [{ x1: 1, y: arguments_1.length }][0], x1 = _a.x1, z1 = _a.y;
203+
var _g;
204+
_g = [{ x1: 1, y: arguments_1.length }][0], x1 = _g.x1, z1 = _g.y;
205205
if (b === 1) {
206206
return "break";
207207
}
@@ -211,8 +211,8 @@ function foo() {
211211
(function () { return b; });
212212
return { value: 100 };
213213
};
214-
for (var _c = 0, _d = []; _c < _d.length; _c++) {
215-
var b = _d[_c];
214+
for (var _e = 0, _f = []; _e < _f.length; _e++) {
215+
var b = _f[_e];
216216
var state_2 = _loop_4(b);
217217
if (typeof state_2 === "object")
218218
return state_2;

tests/baselines/reference/nestedLoops.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ var Test = /** @class */ (function () {
3131
var x = outer + inner + newValue;
3232
});
3333
};
34-
for (var _i = 0, innerArray_1 = innerArray; _i < innerArray_1.length; _i++) {
35-
var inner = innerArray_1[_i];
34+
for (var _a = 0, innerArray_1 = innerArray; _a < innerArray_1.length; _a++) {
35+
var inner = innerArray_1[_a];
3636
_loop_2(inner);
3737
}
3838
};

tests/baselines/reference/newLexicalEnvironmentForConvertedLoop.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ function baz(x) {
1818
}
1919
function foo(set) {
2020
var _loop_1 = function (value, i) {
21-
var _a;
21+
var _c;
2222
var bar = [];
2323
(function () { return bar; });
24-
(_a = set.values).push.apply(_a, []);
24+
(_c = set.values).push.apply(_c, []);
2525
};
2626
for (var _i = 0, _a = baz(set.values); _i < _a.length; _i++) {
2727
var _b = _a[_i], value = _b[0], i = _b[1];
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//// [optionalChainingInLoop.ts]
2+
// https://github.com/microsoft/TypeScript/issues/40643
3+
const list: any[] = []
4+
for (const comp of list) {
5+
comp.sp.y = comp.sp.r.find((k: any) => k.c == (comp.xp ? '1' : '0'))
6+
for (const item of comp.c) {
7+
item.v = !!item.t?.length
8+
}
9+
}
10+
11+
//// [optionalChainingInLoop.js]
12+
var _a;
13+
// https://github.com/microsoft/TypeScript/issues/40643
14+
var list = [];
15+
var _loop_1 = function (comp) {
16+
comp.sp.y = comp.sp.r.find(function (k) { return k.c == (comp.xp ? '1' : '0'); });
17+
for (var _b = 0, _c = comp.c; _b < _c.length; _b++) {
18+
var item = _c[_b];
19+
item.v = !!((_a = item.t) === null || _a === void 0 ? void 0 : _a.length);
20+
}
21+
};
22+
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {
23+
var comp = list_1[_i];
24+
_loop_1(comp);
25+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// @target: es5
2+
// @lib: es2015
3+
// @noTypesAndSymbols: true
4+
// https://github.com/microsoft/TypeScript/issues/40643
5+
const list: any[] = []
6+
for (const comp of list) {
7+
comp.sp.y = comp.sp.r.find((k: any) => k.c == (comp.xp ? '1' : '0'))
8+
for (const item of comp.c) {
9+
item.v = !!item.t?.length
10+
}
11+
}

0 commit comments

Comments
 (0)