Nonlocal control within try/finally.
| 155 | |
| 156 | |
| 157 | class TryFinallyNonlocalControl(NonlocalControl): |
| 158 | """Nonlocal control within try/finally.""" |
| 159 | |
| 160 | def __init__(self, target: BasicBlock) -> None: |
| 161 | self.target = target |
| 162 | self.ret_reg: None | Register | AssignmentTarget = None |
| 163 | |
| 164 | def gen_break(self, builder: IRBuilder, line: int) -> None: |
| 165 | builder.error("break inside try/finally block is unimplemented", line) |
| 166 | |
| 167 | def gen_continue(self, builder: IRBuilder, line: int) -> None: |
| 168 | builder.error("continue inside try/finally block is unimplemented", line) |
| 169 | |
| 170 | def gen_return(self, builder: IRBuilder, value: Value, line: int) -> None: |
| 171 | if self.ret_reg is None: |
| 172 | if builder.fn_info.is_generator: |
| 173 | self.ret_reg = builder.make_spill_target(builder.ret_types[-1]) |
| 174 | else: |
| 175 | self.ret_reg = Register(builder.ret_types[-1]) |
| 176 | # assert needed because of apparent mypy bug... it loses track of the union |
| 177 | # and infers the type as object |
| 178 | assert isinstance(self.ret_reg, (Register, AssignmentTarget)), self.ret_reg |
| 179 | builder.assign(self.ret_reg, value, line) |
| 180 | |
| 181 | builder.add(Goto(self.target)) |
| 182 | |
| 183 | |
| 184 | class ExceptNonlocalControl(CleanupNonlocalControl): |
no outgoing calls
no test coverage detected
searching dependent graphs…