(
self,
stmt: IfStmt,
uop: CodeSection,
storage: Storage,
inst: Instruction | None,
)
| 634 | |
| 635 | |
| 636 | def emit_IfStmt( |
| 637 | self, |
| 638 | stmt: IfStmt, |
| 639 | uop: CodeSection, |
| 640 | storage: Storage, |
| 641 | inst: Instruction | None, |
| 642 | ) -> tuple[bool, Token | None, Storage]: |
| 643 | self.out.emit(stmt.if_) |
| 644 | for tkn in stmt.condition: |
| 645 | self.out.emit(tkn) |
| 646 | if_storage = storage.copy() |
| 647 | rbrace: Token | None = stmt.if_ |
| 648 | try: |
| 649 | reachable, rbrace, if_storage = self._emit_stmt(stmt.body, uop, if_storage, inst) |
| 650 | if stmt.else_ is not None: |
| 651 | assert rbrace is not None |
| 652 | self.out.emit(rbrace) |
| 653 | self.out.emit(stmt.else_) |
| 654 | if stmt.else_body is not None: |
| 655 | else_reachable, rbrace, else_storage = self._emit_stmt(stmt.else_body, uop, storage, inst) |
| 656 | if not reachable: |
| 657 | reachable, storage = else_reachable, else_storage |
| 658 | elif not else_reachable: |
| 659 | # Discard the else storage |
| 660 | storage = if_storage |
| 661 | else: |
| 662 | #Both reachable |
| 663 | else_storage.merge(if_storage, self.out) |
| 664 | storage = else_storage |
| 665 | else: |
| 666 | if reachable: |
| 667 | if_storage.merge(storage, self.out) |
| 668 | storage = if_storage |
| 669 | else: |
| 670 | # Discard the if storage |
| 671 | reachable = True |
| 672 | return reachable, rbrace, storage |
| 673 | except StackError as ex: |
| 674 | assert rbrace is not None |
| 675 | raise analysis_error(ex.args[0], rbrace) from None |
| 676 | |
| 677 | def emit_BlockStmt( |
| 678 | self, |
nothing calls this directly
no test coverage detected