mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-17 00:34:47 -05:00
Use global Iterator.prototype for down-level generators (#59514)
This commit is contained in:
@@ -836,7 +836,7 @@ const asyncGeneratorHelper: UnscopedEmitHelper = {
|
||||
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
||||
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
||||
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
||||
return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
||||
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
||||
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
||||
function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
|
||||
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
||||
@@ -1102,8 +1102,8 @@ const generatorHelper: UnscopedEmitHelper = {
|
||||
priority: 6,
|
||||
text: `
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
||||
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
|
||||
@@ -83,4 +83,26 @@ describe("unittests:: evaluation:: asyncGeneratorEvaluation", () => {
|
||||
{ done: true, value: 2 },
|
||||
]);
|
||||
});
|
||||
it("Supports global `AsyncIterator.prototype` if present", () => {
|
||||
class AsyncIterator {}
|
||||
const { gen } = evaluator.evaluateTypeScript(
|
||||
`
|
||||
export async function * gen() {}
|
||||
`,
|
||||
{ target: ts.ScriptTarget.ES5 },
|
||||
{ AsyncIterator },
|
||||
);
|
||||
const g = gen();
|
||||
assert.instanceOf(g, AsyncIterator);
|
||||
});
|
||||
it("Ignores global `AsyncIterator.prototype` if missing", () => {
|
||||
const { gen } = evaluator.evaluateTypeScript(
|
||||
`
|
||||
export async function * gen() {}
|
||||
`,
|
||||
{ target: ts.ScriptTarget.ES5 },
|
||||
{ AsyncIterator: undefined },
|
||||
);
|
||||
gen();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -39,4 +39,26 @@ describe("unittests:: evaluation:: generatorEvaluation", () => {
|
||||
assert.deepEqual(g.next(), { value: undefined, done: true });
|
||||
assert.deepEqual(output, []);
|
||||
});
|
||||
it("Supports global `Iterator.prototype` if present", () => {
|
||||
class Iterator {}
|
||||
const { gen } = evaluator.evaluateTypeScript(
|
||||
`
|
||||
export function * gen() {}
|
||||
`,
|
||||
{ target: ts.ScriptTarget.ES5 },
|
||||
{ Iterator },
|
||||
);
|
||||
const g = gen();
|
||||
assert.instanceOf(g, Iterator);
|
||||
});
|
||||
it("Ignores global `Iterator.prototype` if missing", () => {
|
||||
const { gen } = evaluator.evaluateTypeScript(
|
||||
`
|
||||
export function * gen() {}
|
||||
`,
|
||||
{ target: ts.ScriptTarget.ES5 },
|
||||
{ Iterator: undefined },
|
||||
);
|
||||
gen();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user