From d66ba6a03fb57d75c4765ed880ecad6634215c6a Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sat, 12 Apr 2025 19:39:46 +0800 Subject: [PATCH 1/5] fix(es/helpers): Sync tslib `_ts_generator` implementation --- crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js b/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js index c06c31b8926d..f2200b52e1d9 100644 --- a/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js +++ b/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js @@ -4,7 +4,7 @@ function _ts_generator(thisArg, body) { function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while (_) try { + while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { From 27001b3224724415e87ce7694926c668c02c0845 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sat, 12 Apr 2025 19:58:21 +0800 Subject: [PATCH 2/5] fix: Use global Iterator.prototype for down-level generators - microsoft/TypeScript#59514 --- crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js b/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js index f2200b52e1d9..01f63af2c35c 100644 --- a/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js +++ b/crates/swc_ecma_transforms_base/src/helpers/_ts_generator.js @@ -1,6 +1,6 @@ function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; + var f, y, t, _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, 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."); From 263706cf076c651c5828987bb0a9a6d29c89336b Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sat, 12 Apr 2025 20:03:58 +0800 Subject: [PATCH 3/5] chore: update test cases --- .../tests/pass/issue-1328/case1/output/entry.js | 12 ++++-------- .../tests/pass/regenerator/1/output/entry.js | 12 ++++-------- .../core/__tests__/transform/preset-env_test.mjs | 12 ++++-------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js b/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js index ab7ec169fc52..9ee070f806ca 100644 --- a/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js +++ b/crates/swc_node_bundler/tests/pass/issue-1328/case1/output/entry.js @@ -28,7 +28,7 @@ function _async_to_generator(fn) { }; } function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { + var f, y, t, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; @@ -36,12 +36,8 @@ function _ts_generator(thisArg, body) { }, trys: [], ops: [] - }; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + }, 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) { @@ -54,7 +50,7 @@ function _ts_generator(thisArg, body) { } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while(_)try { + while(g && (g = 0, op[0] && (_ = 0)), _)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2, diff --git a/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js b/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js index 55e9794ac9a9..3bd3d52f583d 100644 --- a/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js +++ b/crates/swc_node_bundler/tests/pass/regenerator/1/output/entry.js @@ -28,7 +28,7 @@ function _async_to_generator(fn) { }; } function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { + var f, y, t, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; @@ -36,12 +36,8 @@ function _ts_generator(thisArg, body) { }, trys: [], ops: [] - }; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + }, 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) { @@ -54,7 +50,7 @@ function _ts_generator(thisArg, body) { } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while(_)try { + while(g && (g = 0, op[0] && (_ = 0)), _)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2, diff --git a/packages/core/__tests__/transform/preset-env_test.mjs b/packages/core/__tests__/transform/preset-env_test.mjs index 36f6cf70d5ee..e89959fbc61d 100644 --- a/packages/core/__tests__/transform/preset-env_test.mjs +++ b/packages/core/__tests__/transform/preset-env_test.mjs @@ -57,7 +57,7 @@ it("should respect custom transform option", async () => { }; } function _ts_generator(thisArg, body) { - var f, y, t, g, _ = { + var f, y, t, _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; @@ -65,12 +65,8 @@ it("should respect custom transform option", async () => { }, trys: [], ops: [] - }; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + }, 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) { @@ -83,7 +79,7 @@ it("should respect custom transform option", async () => { } function step(op) { if (f) throw new TypeError("Generator is already executing."); - while(_)try { + while(g && (g = 0, op[0] && (_ = 0)), _)try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [ op[0] & 2, From dd49ac073fd6b9df32b392a527ecb9220e5c26e3 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sat, 12 Apr 2025 20:15:05 +0800 Subject: [PATCH 4/5] chore: update test case --- crates/swc/tests/stacktrace/issue-622/output/stacks.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/swc/tests/stacktrace/issue-622/output/stacks.txt b/crates/swc/tests/stacktrace/issue-622/output/stacks.txt index 0634117dc752..8fe95a0ac08a 100644 --- a/crates/swc/tests/stacktrace/issue-622/output/stacks.txt +++ b/crates/swc/tests/stacktrace/issue-622/output/stacks.txt @@ -5,8 +5,8 @@ $DIR/tests/stacktrace/issue-622/input/index.js:3 ReferenceError: call is not defined at ($DIR/tests/stacktrace/issue-622/input/index.js:3:9) - at step ($DIR/tests/stacktrace/issue-622/input/_exec.js:109:23) - at Object.next ($DIR/tests/stacktrace/issue-622/input/_exec.js:50:20) + at step ($DIR/tests/stacktrace/issue-622/input/_exec.js:105:23) + at Object.next ($DIR/tests/stacktrace/issue-622/input/_exec.js:46:20) at asyncGeneratorStep ($DIR/tests/stacktrace/issue-622/input/_exec.js:4:28) at _next ($DIR/tests/stacktrace/issue-622/input/_exec.js:22:17) at $DIR/tests/stacktrace/issue-622/input/_exec.js:27:13 From 3cc48f192a6ba4878c20377ab4e3ffd3a91d91a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sat, 12 Apr 2025 21:23:53 +0900 Subject: [PATCH 5/5] Create silly-seas-enjoy.md --- .changeset/silly-seas-enjoy.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/silly-seas-enjoy.md diff --git a/.changeset/silly-seas-enjoy.md b/.changeset/silly-seas-enjoy.md new file mode 100644 index 000000000000..507bb0c172a2 --- /dev/null +++ b/.changeset/silly-seas-enjoy.md @@ -0,0 +1,6 @@ +--- +swc_core: minor +swc_ecma_transforms_base: minor +--- + +fix(es/helpers): Sync tslib `_ts_generator` implementation