From 905f35091f7bb442a90ea0f7edb530bfef1cf54e Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 4 Mar 2015 16:06:37 -0800 Subject: [PATCH] Do not create a temp for RHS if it's an identifier --- src/compiler/emitter.ts | 23 +++++++++++++------ tests/baselines/reference/ES5For-of24.js | 12 ++++++++++ tests/baselines/reference/ES5For-of25.js | 14 +++++++++++ .../reference/parserES5ForOfStatement10.js | 4 ++-- .../reference/parserES5ForOfStatement11.js | 4 ++-- .../reference/parserES5ForOfStatement12.js | 4 ++-- .../reference/parserES5ForOfStatement13.js | 4 ++-- .../reference/parserES5ForOfStatement14.js | 4 ++-- .../reference/parserES5ForOfStatement15.js | 4 ++-- .../reference/parserES5ForOfStatement16.js | 4 ++-- .../reference/parserES5ForOfStatement18.js | 4 ++-- .../reference/parserES5ForOfStatement2.js | 4 ++-- .../reference/parserES5ForOfStatement21.js | 4 ++-- .../reference/parserES5ForOfStatement3.js | 4 ++-- .../reference/parserES5ForOfStatement4.js | 4 ++-- .../reference/parserES5ForOfStatement5.js | 4 ++-- .../reference/parserES5ForOfStatement6.js | 4 ++-- .../reference/parserES5ForOfStatement7.js | 4 ++-- .../reference/parserES5ForOfStatement8.js | 4 ++-- .../reference/parserES5ForOfStatement9.js | 4 ++-- .../for-ofStatements/ES5For-of24.ts | 4 ++++ .../for-ofStatements/ES5For-of25.ts | 5 ++++ 22 files changed, 85 insertions(+), 41 deletions(-) create mode 100644 tests/baselines/reference/ES5For-of24.js create mode 100644 tests/baselines/reference/ES5For-of25.js create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 693391a19ba..98a04a1d6d6 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -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 ? 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; diff --git a/tests/baselines/reference/ES5For-of24.js b/tests/baselines/reference/ES5For-of24.js new file mode 100644 index 00000000000..d5489016523 --- /dev/null +++ b/tests/baselines/reference/ES5For-of24.js @@ -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; +} diff --git a/tests/baselines/reference/ES5For-of25.js b/tests/baselines/reference/ES5For-of25.js new file mode 100644 index 00000000000..5e52f7cad5d --- /dev/null +++ b/tests/baselines/reference/ES5For-of25.js @@ -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; +} diff --git a/tests/baselines/reference/parserES5ForOfStatement10.js b/tests/baselines/reference/parserES5ForOfStatement10.js index e3e339b0972..cac70523022 100644 --- a/tests/baselines/reference/parserES5ForOfStatement10.js +++ b/tests/baselines/reference/parserES5ForOfStatement10.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement11.js b/tests/baselines/reference/parserES5ForOfStatement11.js index 0cde774a4dd..40e4ca68d6b 100644 --- a/tests/baselines/reference/parserES5ForOfStatement11.js +++ b/tests/baselines/reference/parserES5ForOfStatement11.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement12.js b/tests/baselines/reference/parserES5ForOfStatement12.js index 1826005c09a..f877ebdb757 100644 --- a/tests/baselines/reference/parserES5ForOfStatement12.js +++ b/tests/baselines/reference/parserES5ForOfStatement12.js @@ -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; } diff --git a/tests/baselines/reference/parserES5ForOfStatement13.js b/tests/baselines/reference/parserES5ForOfStatement13.js index 5d1c725ee21..45199480518 100644 --- a/tests/baselines/reference/parserES5ForOfStatement13.js +++ b/tests/baselines/reference/parserES5ForOfStatement13.js @@ -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; } diff --git a/tests/baselines/reference/parserES5ForOfStatement14.js b/tests/baselines/reference/parserES5ForOfStatement14.js index 9edbf845174..d05fdb96e57 100644 --- a/tests/baselines/reference/parserES5ForOfStatement14.js +++ b/tests/baselines/reference/parserES5ForOfStatement14.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement15.js b/tests/baselines/reference/parserES5ForOfStatement15.js index 39c0ddd879b..0af74961145 100644 --- a/tests/baselines/reference/parserES5ForOfStatement15.js +++ b/tests/baselines/reference/parserES5ForOfStatement15.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement16.js b/tests/baselines/reference/parserES5ForOfStatement16.js index 956ce126390..1e7c6e005a8 100644 --- a/tests/baselines/reference/parserES5ForOfStatement16.js +++ b/tests/baselines/reference/parserES5ForOfStatement16.js @@ -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; } diff --git a/tests/baselines/reference/parserES5ForOfStatement18.js b/tests/baselines/reference/parserES5ForOfStatement18.js index 02aa0b59422..905ba9c1d1e 100644 --- a/tests/baselines/reference/parserES5ForOfStatement18.js +++ b/tests/baselines/reference/parserES5ForOfStatement18.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement2.js b/tests/baselines/reference/parserES5ForOfStatement2.js index 1666cbdf7ae..287602dfb9c 100644 --- a/tests/baselines/reference/parserES5ForOfStatement2.js +++ b/tests/baselines/reference/parserES5ForOfStatement2.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement21.js b/tests/baselines/reference/parserES5ForOfStatement21.js index 26ea78e3089..dcdffbc3cf0 100644 --- a/tests/baselines/reference/parserES5ForOfStatement21.js +++ b/tests/baselines/reference/parserES5ForOfStatement21.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement3.js b/tests/baselines/reference/parserES5ForOfStatement3.js index 8e4e5b9e426..a99e96a23b8 100644 --- a/tests/baselines/reference/parserES5ForOfStatement3.js +++ b/tests/baselines/reference/parserES5ForOfStatement3.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement4.js b/tests/baselines/reference/parserES5ForOfStatement4.js index 751753da14b..f1558005f20 100644 --- a/tests/baselines/reference/parserES5ForOfStatement4.js +++ b/tests/baselines/reference/parserES5ForOfStatement4.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement5.js b/tests/baselines/reference/parserES5ForOfStatement5.js index fe0471f4d4f..328b2fba0a7 100644 --- a/tests/baselines/reference/parserES5ForOfStatement5.js +++ b/tests/baselines/reference/parserES5ForOfStatement5.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement6.js b/tests/baselines/reference/parserES5ForOfStatement6.js index 2e01da0a0c4..15747b93ba9 100644 --- a/tests/baselines/reference/parserES5ForOfStatement6.js +++ b/tests/baselines/reference/parserES5ForOfStatement6.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement7.js b/tests/baselines/reference/parserES5ForOfStatement7.js index 845bec0e2cc..29e4de8787f 100644 --- a/tests/baselines/reference/parserES5ForOfStatement7.js +++ b/tests/baselines/reference/parserES5ForOfStatement7.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement8.js b/tests/baselines/reference/parserES5ForOfStatement8.js index bd20d375502..5c449fc6433 100644 --- a/tests/baselines/reference/parserES5ForOfStatement8.js +++ b/tests/baselines/reference/parserES5ForOfStatement8.js @@ -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]; } diff --git a/tests/baselines/reference/parserES5ForOfStatement9.js b/tests/baselines/reference/parserES5ForOfStatement9.js index 3da36ecdd5b..6b63d58a88a 100644 --- a/tests/baselines/reference/parserES5ForOfStatement9.js +++ b/tests/baselines/reference/parserES5ForOfStatement9.js @@ -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]; } diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts new file mode 100644 index 00000000000..7e025183f5f --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts @@ -0,0 +1,4 @@ +var a = [1, 2, 3]; +for (var v of a) { + let a = 0; +} \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts new file mode 100644 index 00000000000..5cf7efe8d65 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts @@ -0,0 +1,5 @@ +var a = [1, 2, 3]; +for (var v of a) { + v; + a; +} \ No newline at end of file