Skip to content

Commit 49c0dbb

Browse files
liuxingbaoyunicolo-ribaudo
authored andcommitted
Fix iterator compatibility of regeneratorValues (#17335)
fix
1 parent d23a1bd commit 49c0dbb

13 files changed

Lines changed: 72 additions & 12 deletions

File tree

packages/babel-helpers/src/helpers-generated.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,10 +1269,10 @@ const helpers: Record<string, Helper> = {
12691269
internal: false,
12701270
},
12711271
),
1272-
// size: 396, gzip size: 264
1272+
// size: 397, gzip size: 264
12731273
regeneratorValues: helper(
12741274
"7.18.0",
1275-
'function _regeneratorValues(e){if(null!=e){var r=e["function"==typeof Symbol&&Symbol.iterator||"@iterator"];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var t=-1,n=function r(){for(;++t<e.length;)if({}.hasOwnProperty.call(e,t))return r.value=e[t],r.done=!1,r;return r.value=void 0,r.done=!0,r};return n.next=n}}throw new TypeError(typeof e+" is not iterable")}',
1275+
'function _regeneratorValues(e){if(null!=e){var r=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var t=-1,n=function r(){for(;++t<e.length;)if({}.hasOwnProperty.call(e,t))return r.value=e[t],r.done=!1,r;return r.value=void 0,r.done=!0,r};return n.next=n}}throw new TypeError(typeof e+" is not iterable")}',
12761276
{
12771277
globals: ["Symbol", "isNaN", "TypeError"],
12781278
locals: { _regeneratorValues: ["body.0.id"] },

packages/babel-helpers/src/helpers/regeneratorValues.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default function _regeneratorValues(iterable: any) {
66
if (iterable != null) {
77
var iteratorMethod =
88
iterable[
9-
(typeof Symbol === "function" && Symbol.iterator) || "@iterator"
9+
(typeof Symbol === "function" && Symbol.iterator) || "@@iterator"
1010
];
1111
if (iteratorMethod) {
1212
return iteratorMethod.call(iterable);

packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/13801-babel-7/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function _tryCatch(t, r, e) { try { return { e: 0, v: t.call(r, e) }; } catch (t
55
function _awaitAsyncGenerator(e) { return new _OverloadYield(e, 0); }
66
function _OverloadYield(e, d) { this.v = e, this.k = d; }
77
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = Object.prototype, n = r.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.toStringTag || "@@toStringTag"; function u(r, n, o, i) { var a = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(a.prototype); return _regeneratorDefine(u, "_invoke", function (r, n, o) { var i, a, u, f = 0, p = o || [], y = !1, d = { p: 0, n: 0, v: e, a: l, f: l.bind(e, 4), d: function (t, r) { return i = _regeneratorValues(t), a = 0, u = e, d.n = r, c; } }; function l(r, n) { for (a = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], l = d.p, G = i[2]; r > 3 ? (o = G === n) && (a = i[4] || 3, u = i[5] === e ? i[3] : i[5], i[4] = 3, i[5] = e) : i[0] <= l && ((o = r < 2 && l < i[1]) ? (a = 0, d.v = n, d.n = i[1]) : l < G && (o = r < 3 || i[0] > n || n > G) && (i[4] = r, i[5] = n, d.n = G, a = 0)); } if (o || r > 1) return c; throw y = !0, n; } return function (o, p, G) { if (2 === f) throw TypeError("Generator is already running"); for (y && 1 === p && l(p, G), a = p, u = G; !y || (t = e);) { i || (a ? a < 3 ? (a > 1 && (d.n = -1), l(a, u)) : d.n = u : d.v = u); try { if (i) { if (a || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, a < 2 && (a = 0); } else 1 === a && (t = i.return) && t.call(i), a < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), a = 1); i = e; } else if (f = 2, t = (y = d.n < 0) ? u : r.call(n, d), f = y ? 3 : 1, t !== c) break; } catch (t) { f = 3, i = e, a = 1, u = t; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var c = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var f = {}; _regeneratorDefine(f, i, function () { return this; }); var p = Object.getPrototypeOf, y = p && p(p(_regeneratorValues([]))); y && y !== r && n.call(y, i) && (f = y); var d = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(f); function l(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, a, "GeneratorFunction")), e.prototype = Object.create(d), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(d, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, a, "GeneratorFunction"), _regeneratorDefineIM(d), _regeneratorDefine(d, a, "Generator"), _regeneratorDefine(d, i, function () { return this; }), _regeneratorDefine(d, "toString", function () { return "[object Generator]"; }), (_regenerator = function () { return { w: u, m: l }; })(); }
8-
function _regeneratorValues(e) { if (null != e) { var r = e["function" == typeof Symbol && Symbol.iterator || "@iterator"]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var t = -1, n = function r() { for (; ++t < e.length;) if ({}.hasOwnProperty.call(e, t)) return r.value = e[t], r.done = !1, r; return r.value = void 0, r.done = !0, r; }; return n.next = n; } } throw new TypeError(typeof e + " is not iterable"); }
8+
function _regeneratorValues(e) { if (null != e) { var r = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var t = -1, n = function r() { for (; ++t < e.length;) if ({}.hasOwnProperty.call(e, t)) return r.value = e[t], r.done = !1, r; return r.value = void 0, r.done = !0, r; }; return n.next = n; } } throw new TypeError(typeof e + " is not iterable"); }
99
function _regeneratorDefineIM(e) { function n(n, t) { _regeneratorDefine(e, n, function (e) { return this._invoke(n, t, e); }); } n("next", 0), n("throw", 1), n("return", 2); }
1010
function _regeneratorDefine(e, r, n, t) { _regeneratorDefine = function (e, r, n, t) { return Object.defineProperty(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }); }; try { _regeneratorDefine({}, ""); } catch (e) { _regeneratorDefine = function (e, r, n) { return e[r] = n; }; } return _regeneratorDefine(e, r, n, t); }
1111
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }

packages/babel-plugin-transform-async-generator-functions/test/fixtures/regression/13801/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
22
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
33
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = Object.prototype, n = r.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.toStringTag || "@@toStringTag"; function u(r, n, o, i) { var a = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(a.prototype); return _regeneratorDefine(u, "_invoke", function (r, n, o) { var i, a, u, f = 0, p = o || [], y = !1, d = { p: 0, n: 0, v: e, a: l, f: l.bind(e, 4), d: function (t, r) { return i = _regeneratorValues(t), a = 0, u = e, d.n = r, c; } }; function l(r, n) { for (a = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], l = d.p, G = i[2]; r > 3 ? (o = G === n) && (a = i[4] || 3, u = i[5] === e ? i[3] : i[5], i[4] = 3, i[5] = e) : i[0] <= l && ((o = r < 2 && l < i[1]) ? (a = 0, d.v = n, d.n = i[1]) : l < G && (o = r < 3 || i[0] > n || n > G) && (i[4] = r, i[5] = n, d.n = G, a = 0)); } if (o || r > 1) return c; throw y = !0, n; } return function (o, p, G) { if (2 === f) throw TypeError("Generator is already running"); for (y && 1 === p && l(p, G), a = p, u = G; !y || (t = e);) { i || (a ? a < 3 ? (a > 1 && (d.n = -1), l(a, u)) : d.n = u : d.v = u); try { if (i) { if (a || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, a < 2 && (a = 0); } else 1 === a && (t = i.return) && t.call(i), a < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), a = 1); i = e; } else if (f = 2, t = (y = d.n < 0) ? u : r.call(n, d), f = y ? 3 : 1, t !== c) break; } catch (t) { f = 3, i = e, a = 1, u = t; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var c = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var f = {}; _regeneratorDefine(f, i, function () { return this; }); var p = Object.getPrototypeOf, y = p && p(p(_regeneratorValues([]))); y && y !== r && n.call(y, i) && (f = y); var d = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(f); function l(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, a, "GeneratorFunction")), e.prototype = Object.create(d), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(d, "constructor", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine(GeneratorFunctionPrototype, a, "GeneratorFunction"), _regeneratorDefineIM(d), _regeneratorDefine(d, a, "Generator"), _regeneratorDefine(d, i, function () { return this; }), _regeneratorDefine(d, "toString", function () { return "[object Generator]"; }), (_regenerator = function () { return { w: u, m: l }; })(); }
4-
function _regeneratorValues(e) { if (null != e) { var r = e["function" == typeof Symbol && Symbol.iterator || "@iterator"]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var t = -1, n = function r() { for (; ++t < e.length;) if ({}.hasOwnProperty.call(e, t)) return r.value = e[t], r.done = !1, r; return r.value = void 0, r.done = !0, r; }; return n.next = n; } } throw new TypeError(typeof e + " is not iterable"); }
4+
function _regeneratorValues(e) { if (null != e) { var r = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var t = -1, n = function r() { for (; ++t < e.length;) if ({}.hasOwnProperty.call(e, t)) return r.value = e[t], r.done = !1, r; return r.value = void 0, r.done = !0, r; }; return n.next = n; } } throw new TypeError(typeof e + " is not iterable"); }
55
function _regeneratorAsyncIterator(t, e) { function r(n, o, i, f) { var a = _tryCatch(t[n], t, o); if (!a.e) { var c = a.v, u = c.value; return u && u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { r("next", t, i, f); }, function (t) { r("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return r("throw", t, i, f); }); } f(a.v); } var n; this.next || (_regeneratorDefineIM(_regeneratorAsyncIterator.prototype), _regeneratorDefine(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, n) { r(t, i, e, n); }); } return n = n ? n.then(f, f) : f(); }, !0); }
66
function _regeneratorDefineIM(e) { function n(n, t) { _regeneratorDefine(e, n, function (e) { return this._invoke(n, t, e); }); } n("next", 0), n("throw", 1), n("return", 2); }
77
function _tryCatch(t, r, e) { try { return { e: 0, v: t.call(r, e) }; } catch (t) { return { e: 1, v: t }; } }

packages/babel-plugin-transform-regenerator/test/fixtures/misc/no-external-helpers/output.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
eval("Symbol = undefined");
2+
3+
var assert = require("assert");
4+
var shared = require("./shared.js");
5+
var Symbol = shared.Symbol;
6+
var check = shared.check;
7+
8+
describe("@@iterator", function() {
9+
it("is defined on Generator.prototype and returns this", function() {
10+
function *gen(){}
11+
var iterator = gen();
12+
assert.ok(!iterator.hasOwnProperty(Symbol.iterator));
13+
assert.ok(!Object.getPrototypeOf(iterator).hasOwnProperty(Symbol.iterator));
14+
assert.ok(Object.getPrototypeOf(Object.getPrototypeOf(
15+
Object.getPrototypeOf(iterator)
16+
)).hasOwnProperty(Symbol.iterator));
17+
assert.strictEqual(iterator[Symbol.iterator](), iterator);
18+
});
19+
});
20+
21+
describe("delegate yield", function() {
22+
it("should support any iterable argument", function() {
23+
function *gen() {
24+
yield 0;
25+
yield* [
26+
yield "one",
27+
yield "two",
28+
yield "three"
29+
];
30+
yield 5;
31+
}
32+
33+
check(gen(), [0, "one", "two", "three", 2, 3, 4, 5]);
34+
35+
function *string() {
36+
return yield* "asdf";
37+
}
38+
39+
check(string(), ["a", "s", "d", "f"]);
40+
41+
function *iterable() {
42+
return yield* {
43+
[Symbol.iterator]: function* () {
44+
yield 1;
45+
yield 2;
46+
yield 3;
47+
}
48+
}
49+
}
50+
51+
check(iterable(), [1, 2, 3]);
52+
});
53+
});

packages/babel-plugin-transform-regenerator/test/regenerator.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ enqueue(convertWithRegeneratorPluginOnly, [
221221
"./regenerator-fixtures/tmp/class.regenerator.js",
222222
]);
223223

224+
enqueue(convertWithRegeneratorPluginOnly, [
225+
"./regenerator-fixtures/tests.no-symbol.js",
226+
"./regenerator-fixtures/tmp/no-symbol.es5.js",
227+
]);
228+
224229
Error.stackTraceLimit = 1000;
225230

226231
/**
@@ -384,3 +389,5 @@ enqueue("mocha", [
384389
]);
385390

386391
enqueue("mocha", ["./regenerator-fixtures/frozen-intrinsics.js"]);
392+
393+
enqueue("mocha", ["./regenerator-fixtures/tmp/no-symbol.es5.js"]);

0 commit comments

Comments
 (0)