| 63 | |
| 64 | |
| 65 | class Tier2Emitter(Emitter): |
| 66 | |
| 67 | def __init__(self, out: CWriter, labels: dict[str, Label], exit_cache_depth: int): |
| 68 | super().__init__(out, labels) |
| 69 | self._replacers["oparg"] = self.oparg |
| 70 | self._replacers["IP_OFFSET_OF"] = self.ip_offset_of |
| 71 | self.exit_cache_depth = exit_cache_depth |
| 72 | |
| 73 | def goto_error(self, offset: int, storage: Storage) -> str: |
| 74 | # To do: Add jump targets for popping values. |
| 75 | if offset != 0: |
| 76 | storage.copy().flush(self.out) |
| 77 | else: |
| 78 | storage.stack.copy().flush(self.out) |
| 79 | self.emit("SET_CURRENT_CACHED_VALUES(0);\n") |
| 80 | return "JUMP_TO_ERROR();" |
| 81 | |
| 82 | def exit_if( |
| 83 | self, |
| 84 | tkn: Token, |
| 85 | tkn_iter: TokenIterator, |
| 86 | uop: CodeSection, |
| 87 | storage: Storage, |
| 88 | inst: Instruction | None, |
| 89 | ) -> bool: |
| 90 | self.out.emit_at("if ", tkn) |
| 91 | lparen = next(tkn_iter) |
| 92 | self.emit(lparen) |
| 93 | first_tkn = tkn_iter.peek() |
| 94 | emit_to(self.out, tkn_iter, "RPAREN") |
| 95 | next(tkn_iter) # Semi colon |
| 96 | self.emit(") {\n") |
| 97 | self.emit("UOP_STAT_INC(uopcode, miss);\n") |
| 98 | storage = storage.copy() |
| 99 | self.cache_items(storage.stack, self.exit_cache_depth, False) |
| 100 | storage.stack.flush(self.out) |
| 101 | self.emit("JUMP_TO_JUMP_TARGET();\n") |
| 102 | self.emit("}\n") |
| 103 | return not always_true(first_tkn) |
| 104 | |
| 105 | periodic_if = deopt_if = exit_if |
| 106 | |
| 107 | def oparg( |
| 108 | self, |
| 109 | tkn: Token, |
| 110 | tkn_iter: TokenIterator, |
| 111 | uop: CodeSection, |
| 112 | storage: Storage, |
| 113 | inst: Instruction | None, |
| 114 | ) -> bool: |
| 115 | if not uop.name.endswith("_0") and not uop.name.endswith("_1"): |
| 116 | self.emit(tkn) |
| 117 | return True |
| 118 | amp = next(tkn_iter) |
| 119 | if amp.text != "&": |
| 120 | self.emit(tkn) |
| 121 | self.emit(amp) |
| 122 | return True |
no outgoing calls
no test coverage detected
searching dependent graphs…