Skip to content

Commit dfc1242

Browse files
authored
Fix asyncDelegator reporting "done" too early (#51274)
* Fix asyncDelegator reporting done too early * Add unit test for yields inside finally block See #45400
1 parent 89ce16c commit dfc1242

10 files changed

+43
-17
lines changed

src/compiler/factory/emitHelpers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ export const asyncDelegator: UnscopedEmitHelper = {
541541
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
542542
var i, p;
543543
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
544-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
544+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
545545
};`
546546
};
547547

src/testRunner/unittests/evaluation/asyncGenerator.ts

+26
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,30 @@ describe("unittests:: evaluation:: asyncGeneratorEvaluation", () => {
3030
{ value: 0, done: true }
3131
]);
3232
});
33+
it("yields in finally block with async delegator (es2017)", async () => {
34+
const result = evaluator.evaluateTypeScript(`
35+
async function* g1() {
36+
try {
37+
yield 1;
38+
} finally {
39+
yield 2;
40+
}
41+
}
42+
async function* g2() {
43+
yield* g1();
44+
}
45+
export const output: any[] = [];
46+
export async function main() {
47+
const it = g2();
48+
output.push(await it.next());
49+
output.push(await it.return());
50+
output.push(await it.next());
51+
}`, { target: ts.ScriptTarget.ES2017 });
52+
await result.main();
53+
assert.deepEqual(result.output, [
54+
{ done: false, value: 1 },
55+
{ done: false, value: 2 },
56+
{ done: true, value: undefined }
57+
]);
58+
});
3359
});

tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
131131
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
132132
var i, p;
133133
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
134-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
134+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
135135
};
136136
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
137137
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -174,7 +174,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
174174
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
175175
var i, p;
176176
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
177-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
177+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
178178
};
179179
class C5 {
180180
f() {

tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
269269
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
270270
var i, p;
271271
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
272-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
272+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
273273
};
274274
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
275275
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -362,7 +362,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
362362
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
363363
var i, p;
364364
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
365-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
365+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
366366
};
367367
var __values = (this && this.__values) || function(o) {
368368
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;

tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
9494
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
9595
var i, p;
9696
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
97-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
97+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
9898
};
9999
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
100100
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -135,7 +135,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
135135
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
136136
var i, p;
137137
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
138-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
138+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
139139
};
140140
function f5() {
141141
return __asyncGenerator(this, arguments, function* f5_1() {

tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
223223
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
224224
var i, p;
225225
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
226-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
226+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
227227
};
228228
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
229229
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -311,7 +311,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
311311
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
312312
var i, p;
313313
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
314-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
314+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
315315
};
316316
var __values = (this && this.__values) || function(o) {
317317
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;

tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
9494
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
9595
var i, p;
9696
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
97-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
97+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
9898
};
9999
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
100100
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -135,7 +135,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
135135
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
136136
var i, p;
137137
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
138-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
138+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
139139
};
140140
const f5 = function () {
141141
return __asyncGenerator(this, arguments, function* () {

tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
223223
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
224224
var i, p;
225225
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
226-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
226+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
227227
};
228228
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
229229
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -311,7 +311,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
311311
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
312312
var i, p;
313313
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
314-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
314+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
315315
};
316316
var __values = (this && this.__values) || function(o) {
317317
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;

tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
114114
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
115115
var i, p;
116116
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
117-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
117+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
118118
};
119119
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
120120
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -157,7 +157,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
157157
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
158158
var i, p;
159159
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
160-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
160+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
161161
};
162162
const o5 = {
163163
f() {

tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ var __await = (this && this.__await) || function (v) { return this instanceof __
243243
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
244244
var i, p;
245245
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
246-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
246+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
247247
};
248248
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
249249
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -333,7 +333,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
333333
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
334334
var i, p;
335335
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
336-
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
336+
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
337337
};
338338
var __values = (this && this.__values) || function(o) {
339339
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;

0 commit comments

Comments
 (0)