Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(es/compat): Fix finally handling of generator #7215

Merged
merged 18 commits into from
Apr 6, 2023
Merged

Conversation

kdy1
Copy link
Member

@kdy1 kdy1 commented Apr 5, 2023

@kdy1 kdy1 added this to the Planned milestone Apr 5, 2023
@kdy1 kdy1 self-assigned this Apr 5, 2023
@kdy1
Copy link
Member Author

kdy1 commented Apr 5, 2023

Expected output:

"use strict";

function generator() {
    return __generator(this, function (_a) {
        switch (_a.label) {
            case 0:
                _a.trys.push([0, , 4, 6]);
                _a.label = 1;
            case 1:
                if (!true) return [3 /*break*/, 3];
                return [4 /*yield*/, "foo"];
            case 2:
                _a.sent();
                return [3 /*break*/, 1];
            case 3: return [3 /*break*/, 6];
            case 4: return [4 /*yield*/, "bar"];
            case 5:
                _a.sent();
                return [7 /*endfinally*/];
            case 6: return [2 /*return*/];
        }
    });
}
function test() {
    var gen = generator();
    console.log(gen.next().value);
    console.log(gen.next().value);
    console.log(gen.next().value);
    console.log(gen.next().value);
}
test();

Output of swc:

function generator() {
    return __generator(this, function(_state) {
        switch(_state.label){
            case 0:
                _state.trys.push([
                    0,
                    ,
                    3,
                    5
                ]);
                if (!true) return [
                    3,
                    2
                ];
                return [
                    4,
                    "foo"
                ];
            case 1:
                _state.sent();
                return [
                    3,
                    0
                ];
            case 2:
                return [
                    3,
                    5
                ];
            case 3:
                return [
                    4,
                    "bar"
                ];
            case 4:
                _state.sent();
                return [
                    7
                ];
            case 5:
                return [
                    2
                ];
        }
    });
}

@kdy1
Copy link
Member Author

kdy1 commented Apr 6, 2023

Investigation:

label_numbers is different.

  • Length of tsc: 7
  • Length of swc: 6

try_enter_label

swc:

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 0
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 0

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 0
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 1

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 0
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 2

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 0
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 3

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 1
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 4

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 1
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 5

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 2
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 6

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 3
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 7

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 4
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 8

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 4
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 9

[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] &self.label_number = 5
[crates/swc_ecma_transforms_compat/src/es2015/generator.rs:3052] op_index = 10

tsc:

labelNumber 0 operationIndex 0
labelNumber 0 operationIndex 1
labelNumber 1 operationIndex 2
labelNumber 1 operationIndex 3
labelNumber 2 operationIndex 4
labelNumber 2 operationIndex 5
labelNumber 3 operationIndex 6
labelNumber 4 operationIndex 7
labelNumber 5 operationIndex 8
labelNumber 5 operationIndex 9
labelNumber 6 operationIndex 10
labelNumbers.length 7

Copy link
Member Author

@kdy1 kdy1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

swc-bump:

  • swc_ecma_transforms_compat

@kdy1 kdy1 marked this pull request as ready for review April 6, 2023 05:55
kodiakhq[bot]
kodiakhq bot previously approved these changes Apr 6, 2023
kodiakhq[bot]
kodiakhq bot previously approved these changes Apr 6, 2023
Copy link
Collaborator

@swc-bot swc-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review comment generated by auto-rebase script

kodiakhq[bot]
kodiakhq bot previously approved these changes Apr 6, 2023
Copy link
Collaborator

@swc-bot swc-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review comment generated by auto-rebase script

@kdy1 kdy1 merged commit f5c62fb into swc-project:main Apr 6, 2023
@kdy1 kdy1 deleted the yield branch April 6, 2023 09:37
@kdy1 kdy1 modified the milestones: Planned, v1.3.47 Apr 10, 2023
@swc-project swc-project locked as resolved and limited conversation to collaborators May 10, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Development

Successfully merging this pull request may close these issues.

Incorrect yield and try-finally behaviour
2 participants