Skip to content

Commit f5281d6

Browse files
committed
Fix async generator rejection handling
1 parent dfef2fa commit f5281d6

14 files changed

+229
-159
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,7 @@ namespace ts {
924924
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
925925
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
926926
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
927-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
927+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
928928
function fulfill(value) { resume("next", value); }
929929
function reject(value) { resume("throw", value); }
930930
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -956,7 +956,7 @@ namespace ts {
956956
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
957957
var i, p;
958958
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
959-
function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; }; }
959+
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; }
960960
};`
961961
};
962962

@@ -979,8 +979,10 @@ namespace ts {
979979
text: `
980980
var __asyncValues = (this && this.__asyncValues) || function (o) {
981981
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
982-
var m = o[Symbol.asyncIterator];
983-
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
982+
var m = o[Symbol.asyncIterator], i;
983+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
984+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
985+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
984986
};`
985987
};
986988

src/harness/compilerRunner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class CompilerBaselineRunner extends RunnerBase {
7373
});
7474
});
7575
}
76-
describe(`${this.testSuiteName} tests for ${fileName}}`, () => {
76+
describe(`${this.testSuiteName} tests for ${fileName}`, () => {
7777
this.runSuite(fileName, test);
7878
});
7979
}

tests/baselines/reference/asyncImportNestedYield.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
3838
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
3939
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
4040
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
41-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
41+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
4242
function fulfill(value) { resume("next", value); }
4343
function reject(value) { resume("throw", value); }
4444
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
6868
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
6969
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
7070
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
71-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
71+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
7272
function fulfill(value) { resume("next", value); }
7373
function reject(value) { resume("throw", value); }
7474
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -87,7 +87,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
8787
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
8888
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
8989
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
90-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
90+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
9191
function fulfill(value) { resume("next", value); }
9292
function reject(value) { resume("throw", value); }
9393
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -107,7 +107,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
107107
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
108108
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
109109
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
110-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
110+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
111111
function fulfill(value) { resume("next", value); }
112112
function reject(value) { resume("throw", value); }
113113
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -122,22 +122,24 @@ class C3 {
122122
//// [C4.js]
123123
var __asyncValues = (this && this.__asyncValues) || function (o) {
124124
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
125-
var m = o[Symbol.asyncIterator];
126-
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
125+
var m = o[Symbol.asyncIterator], i;
126+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
127+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
128+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
127129
};
128130
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
129131
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
130132
var i, p;
131133
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
132-
function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; }; }
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; }
133135
};
134136
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
135137
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
136138
var g = generator.apply(thisArg, _arguments || []), i, q = [];
137139
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
138140
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
139141
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
140-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
142+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
141143
function fulfill(value) { resume("next", value); }
142144
function reject(value) { resume("throw", value); }
143145
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -157,20 +159,22 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
157159
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
158160
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
159161
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
160-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
162+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
161163
function fulfill(value) { resume("next", value); }
162164
function reject(value) { resume("throw", value); }
163165
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
164166
};
165167
var __asyncValues = (this && this.__asyncValues) || function (o) {
166168
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
167-
var m = o[Symbol.asyncIterator];
168-
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
169+
var m = o[Symbol.asyncIterator], i;
170+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
171+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
172+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
169173
};
170174
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
171175
var i, p;
172176
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
173-
function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; }; }
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; }
174178
};
175179
class C5 {
176180
f() {
@@ -187,7 +191,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
187191
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
188192
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
189193
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
190-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
194+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
191195
function fulfill(value) { resume("next", value); }
192196
function reject(value) { resume("throw", value); }
193197
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -207,7 +211,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
207211
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
208212
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
209213
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
210-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
214+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
211215
function fulfill(value) { resume("next", value); }
212216
function reject(value) { resume("throw", value); }
213217
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -227,7 +231,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
227231
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
228232
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
229233
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
230-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
234+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
231235
function fulfill(value) { resume("next", value); }
232236
function reject(value) { resume("throw", value); }
233237
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
@@ -249,7 +253,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
249253
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
250254
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
251255
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
252-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
256+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
253257
function fulfill(value) { resume("next", value); }
254258
function reject(value) { resume("throw", value); }
255259
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }

0 commit comments

Comments
 (0)