| 104 | } |
| 105 | |
| 106 | class Emitter: |
| 107 | out: CWriter |
| 108 | labels: dict[str, Label] |
| 109 | _replacers: dict[str, ReplacementFunctionType] |
| 110 | cannot_escape: bool |
| 111 | jump_prefix: str |
| 112 | |
| 113 | def __init__(self, out: CWriter, labels: dict[str, Label], cannot_escape: bool = False, jump_prefix: str = ""): |
| 114 | self._replacers = { |
| 115 | "EXIT_IF": self.exit_if, |
| 116 | "AT_END_EXIT_IF": self.exit_if_after, |
| 117 | "DEOPT_IF": self.deopt_if, |
| 118 | "HANDLE_PENDING_AND_DEOPT_IF": self.periodic_if, |
| 119 | "ERROR_IF": self.error_if, |
| 120 | "ERROR_NO_POP": self.error_no_pop, |
| 121 | "DECREF_INPUTS": self.decref_inputs, |
| 122 | "DEAD": self.kill, |
| 123 | "INPUTS_DEAD": self.kill_inputs, |
| 124 | "SYNC_SP": self.sync_sp, |
| 125 | "SAVE_STACK": self.save_stack, |
| 126 | "RELOAD_STACK": self.reload_stack, |
| 127 | "PyStackRef_CLOSE_SPECIALIZED": self.stackref_close_specialized, |
| 128 | "PyStackRef_AsPyObjectSteal": self.stackref_steal, |
| 129 | "DISPATCH": self.dispatch, |
| 130 | "INSTRUCTION_SIZE": self.instruction_size, |
| 131 | "stack_pointer": self.stack_pointer, |
| 132 | "Py_UNREACHABLE": self.unreachable, |
| 133 | "TIER1_TO_TIER2": self.tier1_to_tier2, |
| 134 | "TIER2_TO_TIER2": self.tier2_to_tier2, |
| 135 | "GOTO_TIER_ONE": self.goto_tier_one |
| 136 | } |
| 137 | self.out = out |
| 138 | self.labels = labels |
| 139 | self.cannot_escape = cannot_escape |
| 140 | self.jump_prefix = jump_prefix |
| 141 | |
| 142 | def dispatch( |
| 143 | self, |
| 144 | tkn: Token, |
| 145 | tkn_iter: TokenIterator, |
| 146 | uop: CodeSection, |
| 147 | storage: Storage, |
| 148 | inst: Instruction | None, |
| 149 | ) -> bool: |
| 150 | if storage.spilled: |
| 151 | raise analysis_error("stack_pointer needs reloading before dispatch", tkn) |
| 152 | storage.stack.flush(self.out) |
| 153 | self.emit(tkn) |
| 154 | return False |
| 155 | |
| 156 | def unreachable( |
| 157 | self, |
| 158 | tkn: Token, |
| 159 | tkn_iter: TokenIterator, |
| 160 | uop: CodeSection, |
| 161 | storage: Storage, |
| 162 | inst: Instruction | None, |
| 163 | ) -> bool: |
no outgoing calls
no test coverage detected
searching dependent graphs…