[RETURN_VALUE] = 1,
[YIELD_VALUE] = 1,
[LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN] = 1,
+ [INSTRUMENTED_FOR_ITER] = 1,
[RETURN_GENERATOR] = 1,
[BINARY_OP_SUBSCR_GETITEM] = 1,
[INSTRUMENTED_RETURN_VALUE] = 1,
[SEND] = 1,
[SEND_GEN] = 1,
[INSTRUMENTED_YIELD_VALUE] = 1,
+ [INSTRUMENTED_END_ASYNC_FOR] = 1,
+ [END_ASYNC_FOR] = 1,
[LOAD_ATTR_PROPERTY] = 1,
[FOR_ITER_GEN] = 1,
[CALL] = 1,
no_save_ip=no_save_ip,
tier=tier_variable(op),
needs_prev=variable_used(op, "prev_instr"),
- needs_guard_ip=variable_used(op, "TIER2_STORE_IP") or variable_used(op, "LLTRACE_RESUME_FRAME") or variable_used(op, "DISPATCH_INLINED"),
+ needs_guard_ip=(unpredictable_jump and "replaced" not in op.annotations) or variable_used(op, "LLTRACE_RESUME_FRAME") or variable_used(op, "DISPATCH_INLINED"),
unpredictable_jump=unpredictable_jump,
)
def __init__(self, out: CWriter, labels: dict[str, Label]):
super().__init__(out, labels)
self._replacers["oparg"] = self.oparg
- self._replacers["JUMPBY"] = self.jumpby
- self._replacers["DISPATCH"] = self.dispatch
def goto_error(self, offset: int, storage: Storage) -> str:
# To do: Add jump targets for popping values.
self.out.emit_at(uop.name[-1], tkn)
return True
- def jumpby(
- self,
- tkn: Token,
- tkn_iter: TokenIterator,
- uop: CodeSection,
- storage: Storage,
- inst: Instruction | None,
- ) -> bool:
- if storage.spilled:
- raise analysis_error("stack_pointer needs reloading before dispatch", tkn)
- storage.stack.flush(self.out)
- self.emit("TIER2_STORE_IP")
- emit_to(self.out, tkn_iter, "SEMI")
- self.emit(";\n")
- return True
-
- def dispatch(
- self,
- tkn: Token,
- tkn_iter: TokenIterator,
- uop: CodeSection,
- storage: Storage,
- inst: Instruction | None,
- ) -> bool:
- if storage.spilled:
- raise analysis_error("stack_pointer needs reloading before dispatch", tkn)
- storage.stack.flush(self.out)
- self.emit("break;\n")
- next(tkn_iter)
- next(tkn_iter)
- next(tkn_iter)
- return False
-
def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
locals: dict[str, Local] = {}