mirror of
https://github.com/oxc-project/oxc.git
synced 2026-09-14 19:36:11 +08:00
869ac200a4
## Summary Correct the CFG generated for `for` statements whose update expression spans multiple basic blocks, such as conditional or logical expressions. This addresses the malformed CFG underlying #23789. ## Problem `update_graph_ix` identifies the entry of the update expression. After visiting the expression, `cfg.current_node_ix` identifies its exit block. Previously, the loop backedge to the test originated from the update entry. This allowed control flow to bypass the update expression and left its exit block disconnected. ### Before ```mermaid flowchart LR Test["Loop test"] -->|truthy| Body["Loop body"] Test -->|falsy| After["After loop"] Body -->|backedge| Entry["Update entry"] Entry --> Update["Update expression blocks"] Update --> Exit["Update exit"] Entry -->|backedge| Test ``` ### After ```mermaid flowchart LR Test["Loop test"] -->|truthy| Body["Loop body"] Test -->|falsy| After["After loop"] Body -->|backedge| Entry["Update entry"] Entry --> Update["Update expression blocks"] Update --> Exit["Update exit"] Exit -->|backedge| Test ``` ## Implementation Record `cfg.current_node_ix` after visiting the update expression as `after_update_graph_ix`. The backedge to the loop test now originates from that exit block. The loop body backedge and `continue` target still point to `update_graph_ix`, ensuring the complete update expression runs before the next test. A dedicated CFG fixture covers a conditional update expression: ```js forward ? index++ : index-- ```