| 233 | |
| 234 | |
| 235 | class PatchVisitor(OpVisitor[None]): |
| 236 | def __init__( |
| 237 | self, op_map: dict[Value, Value | None], block_map: dict[BasicBlock, BasicBlock] |
| 238 | ) -> None: |
| 239 | self.op_map: Final = op_map |
| 240 | self.block_map: Final = block_map |
| 241 | |
| 242 | def fix_op(self, op: Value) -> Value: |
| 243 | new = self.op_map.get(op, op) |
| 244 | assert new is not None, "use of removed op" |
| 245 | return new |
| 246 | |
| 247 | def fix_block(self, block: BasicBlock) -> BasicBlock: |
| 248 | return self.block_map.get(block, block) |
| 249 | |
| 250 | def visit_goto(self, op: Goto) -> None: |
| 251 | op.label = self.fix_block(op.label) |
| 252 | |
| 253 | def visit_branch(self, op: Branch) -> None: |
| 254 | op.value = self.fix_op(op.value) |
| 255 | op.true = self.fix_block(op.true) |
| 256 | op.false = self.fix_block(op.false) |
| 257 | |
| 258 | def visit_return(self, op: Return) -> None: |
| 259 | op.value = self.fix_op(op.value) |
| 260 | |
| 261 | def visit_unreachable(self, op: Unreachable) -> None: |
| 262 | pass |
| 263 | |
| 264 | def visit_assign(self, op: Assign) -> None: |
| 265 | op.src = self.fix_op(op.src) |
| 266 | |
| 267 | def visit_assign_multi(self, op: AssignMulti) -> None: |
| 268 | op.src = [self.fix_op(s) for s in op.src] |
| 269 | |
| 270 | def visit_load_error_value(self, op: LoadErrorValue) -> None: |
| 271 | pass |
| 272 | |
| 273 | def visit_load_literal(self, op: LoadLiteral) -> None: |
| 274 | pass |
| 275 | |
| 276 | def visit_get_attr(self, op: GetAttr) -> None: |
| 277 | op.obj = self.fix_op(op.obj) |
| 278 | |
| 279 | def visit_set_attr(self, op: SetAttr) -> None: |
| 280 | op.obj = self.fix_op(op.obj) |
| 281 | op.src = self.fix_op(op.src) |
| 282 | |
| 283 | def visit_load_static(self, op: LoadStatic) -> None: |
| 284 | pass |
| 285 | |
| 286 | def visit_init_static(self, op: InitStatic) -> None: |
| 287 | op.value = self.fix_op(op.value) |
| 288 | |
| 289 | def visit_tuple_get(self, op: TupleGet) -> None: |
| 290 | op.src = self.fix_op(op.src) |
| 291 | |
| 292 | def visit_tuple_set(self, op: TupleSet) -> None: |
no outgoing calls
no test coverage detected
searching dependent graphs…