Skip to content

Commit 2dece39

Browse files
committed
Fix over agressive async delegation
1 parent 53c1caa commit 2dece39

9 files changed

+170
-143
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,19 @@ namespace ts {
126126
function visitYieldExpression(node: YieldExpression) {
127127
if (enclosingFunctionFlags & FunctionFlags.Async && enclosingFunctionFlags & FunctionFlags.Generator) {
128128
const expression = visitNode(node.expression, visitor, isExpression);
129-
return updateYield(
129+
const delegator = node.asteriskToken && updateYield(
130130
node,
131131
node.asteriskToken,
132-
node.asteriskToken
133-
? createAsyncDelegatorHelper(context, expression, expression)
134-
: createArrayLiteral(
135-
expression
136-
? [createLiteral("yield"), expression]
137-
: [createLiteral("yield")]
138-
)
132+
createAsyncDelegatorHelper(context, expression, expression)
133+
);
134+
return updateYield(
135+
node,
136+
/*asteriskToken*/ undefined,
137+
createArrayLiteral(
138+
delegator ? [createLiteral("await"), delegator] :
139+
expression ? [createLiteral("yield"), expression] :
140+
[createLiteral("yield")]
141+
)
139142
);
140143
}
141144
return visitEachChild(node, visitor, context);
@@ -922,9 +925,9 @@ namespace ts {
922925
scoped: false,
923926
text: `
924927
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
925-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
926-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
927-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
928+
var i, f;
929+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
930+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
928931
};
929932
`
930933
};

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ class C3 {
124124
}
125125
//// [C4.js]
126126
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
127-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
128-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
129-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
127+
var i, f;
128+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
129+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
130130
};
131131
var __asyncValues = (this && this.__asyncIterator) || function (o) {
132132
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -149,7 +149,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
149149
class C4 {
150150
f() {
151151
return __asyncGenerator(this, arguments, function* f_1() {
152-
const x = yield* __asyncDelegator([1]);
152+
const x = yield ["await", yield* __asyncDelegator([1])];
153153
});
154154
}
155155
}
@@ -168,9 +168,9 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
168168
function settle(f, v) { c = void 0, f(v), next(); }
169169
};
170170
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
171-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
172-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
173-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
171+
var i, f;
172+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
173+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
174174
};
175175
var __asyncValues = (this && this.__asyncIterator) || function (o) {
176176
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -180,7 +180,7 @@ var __asyncValues = (this && this.__asyncIterator) || function (o) {
180180
class C5 {
181181
f() {
182182
return __asyncGenerator(this, arguments, function* f_1() {
183-
const x = yield* __asyncDelegator((function () { return __asyncGenerator(this, arguments, function* () { yield ["yield", 1]; }); })());
183+
const x = yield ["await", yield* __asyncDelegator((function () { return __asyncGenerator(this, arguments, function* () { yield ["yield", 1]; }); })())];
184184
});
185185
}
186186
}

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

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
260260
}
261261
};
262262
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
263-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
264-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
265-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
263+
var i, f;
264+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
265+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
266266
};
267267
var __asyncValues = (this && this.__asyncIterator) || function (o) {
268268
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -297,12 +297,15 @@ var C4 = (function () {
297297
}
298298
C4.prototype.f = function () {
299299
return __asyncGenerator(this, arguments, function f_1() {
300-
var x;
301-
return __generator(this, function (_a) {
302-
switch (_a.label) {
303-
case 0: return [5 /*yield**/, __values(__asyncDelegator([1]))];
304-
case 1:
305-
x = _a.sent();
300+
var x, _a;
301+
return __generator(this, function (_b) {
302+
switch (_b.label) {
303+
case 0:
304+
_a = ["await"];
305+
return [5 /*yield**/, __values(__asyncDelegator([1]))];
306+
case 1: return [4 /*yield*/, _a.concat([_b.sent()])];
307+
case 2:
308+
x = _b.sent();
306309
return [2 /*return*/];
307310
}
308311
});
@@ -352,9 +355,9 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
352355
function settle(f, v) { c = void 0, f(v), next(); }
353356
};
354357
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
355-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
356-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
357-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
358+
var i, f;
359+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
360+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
358361
};
359362
var __asyncValues = (this && this.__asyncIterator) || function (o) {
360363
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -376,19 +379,22 @@ var C5 = (function () {
376379
}
377380
C5.prototype.f = function () {
378381
return __asyncGenerator(this, arguments, function f_1() {
379-
var x;
380-
return __generator(this, function (_a) {
381-
switch (_a.label) {
382-
case 0: return [5 /*yield**/, __values(__asyncDelegator((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
383-
switch (_a.label) {
384-
case 0: return [4 /*yield*/, ["yield", 1]];
385-
case 1:
386-
_a.sent();
387-
return [2 /*return*/];
388-
}
389-
}); }); })()))];
390-
case 1:
391-
x = _a.sent();
382+
var x, _a;
383+
return __generator(this, function (_b) {
384+
switch (_b.label) {
385+
case 0:
386+
_a = ["await"];
387+
return [5 /*yield**/, __values(__asyncDelegator((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
388+
switch (_a.label) {
389+
case 0: return [4 /*yield*/, ["yield", 1]];
390+
case 1:
391+
_a.sent();
392+
return [2 /*return*/];
393+
}
394+
}); }); })()))];
395+
case 1: return [4 /*yield*/, _a.concat([_b.sent()])];
396+
case 2:
397+
x = _b.sent();
392398
return [2 /*return*/];
393399
}
394400
});

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ function f3() {
8787
}
8888
//// [F4.js]
8989
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
90-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
91-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
92-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
90+
var i, f;
91+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
92+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
9393
};
9494
var __asyncValues = (this && this.__asyncIterator) || function (o) {
9595
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -111,7 +111,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
111111
};
112112
function f4() {
113113
return __asyncGenerator(this, arguments, function* f4_1() {
114-
const x = yield* __asyncDelegator([1]);
114+
const x = yield ["await", yield* __asyncDelegator([1])];
115115
});
116116
}
117117
//// [F5.js]
@@ -129,9 +129,9 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
129129
function settle(f, v) { c = void 0, f(v), next(); }
130130
};
131131
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
132-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
133-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
134-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
132+
var i, f;
133+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
134+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
135135
};
136136
var __asyncValues = (this && this.__asyncIterator) || function (o) {
137137
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -140,7 +140,7 @@ var __asyncValues = (this && this.__asyncIterator) || function (o) {
140140
};
141141
function f5() {
142142
return __asyncGenerator(this, arguments, function* f5_1() {
143-
const x = yield* __asyncDelegator((function () { return __asyncGenerator(this, arguments, function* () { yield ["yield", 1]; }); })());
143+
const x = yield ["await", yield* __asyncDelegator((function () { return __asyncGenerator(this, arguments, function* () { yield ["yield", 1]; }); })())];
144144
});
145145
}
146146
//// [F6.js]

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

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,9 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
214214
}
215215
};
216216
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
217-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
218-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
219-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
217+
var i, f;
218+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
219+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
220220
};
221221
var __asyncValues = (this && this.__asyncIterator) || function (o) {
222222
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -248,12 +248,15 @@ var __values = (this && this.__values) || function (o) {
248248
};
249249
function f4() {
250250
return __asyncGenerator(this, arguments, function f4_1() {
251-
var x;
252-
return __generator(this, function (_a) {
253-
switch (_a.label) {
254-
case 0: return [5 /*yield**/, __values(__asyncDelegator([1]))];
255-
case 1:
256-
x = _a.sent();
251+
var x, _a;
252+
return __generator(this, function (_b) {
253+
switch (_b.label) {
254+
case 0:
255+
_a = ["await"];
256+
return [5 /*yield**/, __values(__asyncDelegator([1]))];
257+
case 1: return [4 /*yield*/, _a.concat([_b.sent()])];
258+
case 2:
259+
x = _b.sent();
257260
return [2 /*return*/];
258261
}
259262
});
@@ -301,9 +304,9 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
301304
function settle(f, v) { c = void 0, f(v), next(); }
302305
};
303306
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
304-
var i = { next: verb("next"), "throw": verb("throw", function (e) { throw e; }), "return": verb("return", function (v) { return { value: v, done: true }; }) }, p;
305-
return o = __asyncValues(o), i[Symbol.iterator] = function () { return this; }, i;
306-
function verb(n, f) { return function (v) { return v = p && n === "throw" ? f(v) : p && v.done ? v : { value: p ? ["yield", v.value] : ["await", (o[n] || f).call(o, v)], done: false }, p = !p, v; }; }
307+
var i, f;
308+
return o = __asyncValues(o), i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.iterator] = function () { return this; }, i;
309+
function verb(n) { return o[n] && function (b) { return (f = !f) ? { value: ["await", new Promise(function(r) { r(o[n](b)); })], done: n === "return" } : b.done ? b : { value: ["yield", b.value], done: false }; }; }
307310
};
308311
var __asyncValues = (this && this.__asyncIterator) || function (o) {
309312
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
@@ -322,19 +325,22 @@ var __values = (this && this.__values) || function (o) {
322325
};
323326
function f5() {
324327
return __asyncGenerator(this, arguments, function f5_1() {
325-
var x;
326-
return __generator(this, function (_a) {
327-
switch (_a.label) {
328-
case 0: return [5 /*yield**/, __values(__asyncDelegator((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
329-
switch (_a.label) {
330-
case 0: return [4 /*yield*/, ["yield", 1]];
331-
case 1:
332-
_a.sent();
333-
return [2 /*return*/];
334-
}
335-
}); }); })()))];
336-
case 1:
337-
x = _a.sent();
328+
var x, _a;
329+
return __generator(this, function (_b) {
330+
switch (_b.label) {
331+
case 0:
332+
_a = ["await"];
333+
return [5 /*yield**/, __values(__asyncDelegator((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
334+
switch (_a.label) {
335+
case 0: return [4 /*yield*/, ["yield", 1]];
336+
case 1:
337+
_a.sent();
338+
return [2 /*return*/];
339+
}
340+
}); }); })()))];
341+
case 1: return [4 /*yield*/, _a.concat([_b.sent()])];
342+
case 2:
343+
x = _b.sent();
338344
return [2 /*return*/];
339345
}
340346
});

0 commit comments

Comments
 (0)