Skip to content

Commit 905f350

Browse files
committed
Do not create a temp for RHS if it's an identifier
1 parent 4bb0587 commit 905f350

22 files changed

Lines changed: 85 additions & 41 deletions

src/compiler/emitter.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3523,17 +3523,26 @@ module ts {
35233523

35243524
// Do not call create recordTempDeclaration because we are declaring the temps
35253525
// right here. Recording means they will be declared later.
3526+
// In the case where the user wrote an identifier as the RHS, like this:
3527+
//
3528+
// for (var v of arr) { }
3529+
//
3530+
// we don't want to emit a temporary variable for the RHS, just use it directly.
3531+
var rhsIsIdentifier = node.expression.kind === SyntaxKind.Identifier;
35263532
var counter = createTempVariable(node, /*forLoopVariable*/ true);
3527-
var rhsReference = createTempVariable(node, /*forLoopVariable*/ false);
3533+
var rhsReference = rhsIsIdentifier ? <Identifier>node.expression : createTempVariable(node, /*forLoopVariable*/ false);
35283534

3529-
// _i = 0,
3535+
// _i = 0
35303536
emit(counter);
3531-
write(" = 0, ");
3537+
write(" = 0");
35323538

3533-
// _a = expr;
3534-
emit(rhsReference);
3535-
write(" = ");
3536-
emit(node.expression);
3539+
if (!rhsIsIdentifier) {
3540+
// , _a = expr
3541+
write(", ");
3542+
emit(rhsReference);
3543+
write(" = ");
3544+
emit(node.expression);
3545+
}
35373546
write("; ");
35383547

35393548
// _i < _a.length;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [ES5For-of24.ts]
2+
var a = [1, 2, 3];
3+
for (var v of a) {
4+
let a = 0;
5+
}
6+
7+
//// [ES5For-of24.js]
8+
var a = [1, 2, 3];
9+
for (var _i = 0; _i < a.length; _i++) {
10+
var v = a[_i];
11+
var _a = 0;
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [ES5For-of25.ts]
2+
var a = [1, 2, 3];
3+
for (var v of a) {
4+
v;
5+
a;
6+
}
7+
8+
//// [ES5For-of25.js]
9+
var a = [1, 2, 3];
10+
for (var _i = 0; _i < a.length; _i++) {
11+
var v = a[_i];
12+
v;
13+
a;
14+
}

tests/baselines/reference/parserES5ForOfStatement10.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (const v of X) {
33
}
44

55
//// [parserES5ForOfStatement10.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var v = _a[_i];
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var v = X[_i];
88
}

tests/baselines/reference/parserES5ForOfStatement11.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (const [a, b] of X) {
33
}
44

55
//// [parserES5ForOfStatement11.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var _b = _a[_i], a = _b[0], b = _b[1];
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var _a = X[_i], a = _a[0], b = _a[1];
88
}

tests/baselines/reference/parserES5ForOfStatement12.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (const {a, b} of X) {
33
}
44

55
//// [parserES5ForOfStatement12.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var _b = _a[_i], a = _b.a, b = _b.b;
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var _a = X[_i], a = _a.a, b = _a.b;
88
}

tests/baselines/reference/parserES5ForOfStatement13.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (let {a, b} of X) {
33
}
44

55
//// [parserES5ForOfStatement13.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var _b = _a[_i], a = _b.a, b = _b.b;
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var _a = X[_i], a = _a.a, b = _a.b;
88
}

tests/baselines/reference/parserES5ForOfStatement14.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (let [a, b] of X) {
33
}
44

55
//// [parserES5ForOfStatement14.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var _b = _a[_i], a = _b[0], b = _b[1];
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var _a = X[_i], a = _a[0], b = _a[1];
88
}

tests/baselines/reference/parserES5ForOfStatement15.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (var [a, b] of X) {
33
}
44

55
//// [parserES5ForOfStatement15.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var _b = _a[_i], a = _b[0], b = _b[1];
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var _a = X[_i], a = _a[0], b = _a[1];
88
}

tests/baselines/reference/parserES5ForOfStatement16.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ for (var {a, b} of X) {
33
}
44

55
//// [parserES5ForOfStatement16.js]
6-
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7-
var _b = _a[_i], a = _b.a, b = _b.b;
6+
for (var _i = 0; _i < X.length; _i++) {
7+
var _a = X[_i], a = _a.a, b = _a.b;
88
}

0 commit comments

Comments
 (0)