Do not create a temp for RHS if it's an identifier

This commit is contained in:
Jason Freeman
2015-03-04 19:35:10 -08:00
parent 4bb0587dd4
commit 905f35091f
22 changed files with 85 additions and 41 deletions
+16 -7
View File
@@ -3523,17 +3523,26 @@ module ts {
// Do not call create recordTempDeclaration because we are declaring the temps
// right here. Recording means they will be declared later.
// In the case where the user wrote an identifier as the RHS, like this:
//
// for (var v of arr) { }
//
// we don't want to emit a temporary variable for the RHS, just use it directly.
var rhsIsIdentifier = node.expression.kind === SyntaxKind.Identifier;
var counter = createTempVariable(node, /*forLoopVariable*/ true);
var rhsReference = createTempVariable(node, /*forLoopVariable*/ false);
var rhsReference = rhsIsIdentifier ? <Identifier>node.expression : createTempVariable(node, /*forLoopVariable*/ false);
// _i = 0,
// _i = 0
emit(counter);
write(" = 0, ");
write(" = 0");
// _a = expr;
emit(rhsReference);
write(" = ");
emit(node.expression);
if (!rhsIsIdentifier) {
// , _a = expr
write(", ");
emit(rhsReference);
write(" = ");
emit(node.expression);
}
write("; ");
// _i < _a.length;
+12
View File
@@ -0,0 +1,12 @@
//// [ES5For-of24.ts]
var a = [1, 2, 3];
for (var v of a) {
let a = 0;
}
//// [ES5For-of24.js]
var a = [1, 2, 3];
for (var _i = 0; _i < a.length; _i++) {
var v = a[_i];
var _a = 0;
}
+14
View File
@@ -0,0 +1,14 @@
//// [ES5For-of25.ts]
var a = [1, 2, 3];
for (var v of a) {
v;
a;
}
//// [ES5For-of25.js]
var a = [1, 2, 3];
for (var _i = 0; _i < a.length; _i++) {
var v = a[_i];
v;
a;
}
@@ -3,6 +3,6 @@ for (const v of X) {
}
//// [parserES5ForOfStatement10.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var v = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var v = X[_i];
}
@@ -3,6 +3,6 @@ for (const [a, b] of X) {
}
//// [parserES5ForOfStatement11.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i], a = _b[0], b = _b[1];
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i], a = _a[0], b = _a[1];
}
@@ -3,6 +3,6 @@ for (const {a, b} of X) {
}
//// [parserES5ForOfStatement12.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i], a = _b.a, b = _b.b;
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i], a = _a.a, b = _a.b;
}
@@ -3,6 +3,6 @@ for (let {a, b} of X) {
}
//// [parserES5ForOfStatement13.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i], a = _b.a, b = _b.b;
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i], a = _a.a, b = _a.b;
}
@@ -3,6 +3,6 @@ for (let [a, b] of X) {
}
//// [parserES5ForOfStatement14.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i], a = _b[0], b = _b[1];
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i], a = _a[0], b = _a[1];
}
@@ -3,6 +3,6 @@ for (var [a, b] of X) {
}
//// [parserES5ForOfStatement15.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i], a = _b[0], b = _b[1];
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i], a = _a[0], b = _a[1];
}
@@ -3,6 +3,6 @@ for (var {a, b} of X) {
}
//// [parserES5ForOfStatement16.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i], a = _b.a, b = _b.b;
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i], a = _a.a, b = _a.b;
}
@@ -2,6 +2,6 @@
for (var of of of) { }
//// [parserES5ForOfStatement18.js]
for (var _i = 0, _a = of; _i < _a.length; _i++) {
var of = _a[_i];
for (var _i = 0; _i < of.length; _i++) {
var of = of[_i];
}
@@ -3,6 +3,6 @@ for (var of X) {
}
//// [parserES5ForOfStatement2.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var _b = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var _a = X[_i];
}
@@ -2,6 +2,6 @@
for (var of of) { }
//// [parserES5ForOfStatement21.js]
for (var _i = 0, _a = of; _i < _a.length; _i++) {
var _b = _a[_i];
for (var _i = 0; _i < of.length; _i++) {
var _a = of[_i];
}
@@ -3,6 +3,6 @@ for (var a, b of X) {
}
//// [parserES5ForOfStatement3.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var a = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var a = X[_i];
}
@@ -3,6 +3,6 @@ for (var a = 1 of X) {
}
//// [parserES5ForOfStatement4.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var a = 1 = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var a = 1 = X[_i];
}
@@ -3,6 +3,6 @@ for (var a: number of X) {
}
//// [parserES5ForOfStatement5.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var a = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var a = X[_i];
}
@@ -3,6 +3,6 @@ for (var a = 1, b = 2 of X) {
}
//// [parserES5ForOfStatement6.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var a = 1 = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var a = 1 = X[_i];
}
@@ -3,6 +3,6 @@ for (var a: number = 1, b: string = "" of X) {
}
//// [parserES5ForOfStatement7.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var a = 1 = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var a = 1 = X[_i];
}
@@ -3,6 +3,6 @@ for (var v of X) {
}
//// [parserES5ForOfStatement8.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var v = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var v = X[_i];
}
@@ -3,6 +3,6 @@ for (let v of X) {
}
//// [parserES5ForOfStatement9.js]
for (var _i = 0, _a = X; _i < _a.length; _i++) {
var v = _a[_i];
for (var _i = 0; _i < X.length; _i++) {
var v = X[_i];
}
@@ -0,0 +1,4 @@
var a = [1, 2, 3];
for (var v of a) {
let a = 0;
}
@@ -0,0 +1,5 @@
var a = [1, 2, 3];
for (var v of a) {
v;
a;
}