and_not_check.py 602 B

1234567891011121314151617
  1. # Copyright (c) 2020, 2025 Rocky Bernstein
  2. def and_not_check(self, lhs, n, rule, ast, tokens: list, first: int, last: int) -> bool:
  3. jmp = ast[1]
  4. if jmp.kind.startswith("jmp_"):
  5. if last == n:
  6. return True
  7. jmp_target = jmp[0].attr
  8. if tokens[first].off2int() <= jmp_target < tokens[last].off2int():
  9. return True
  10. if rule == ("and_not", ("expr", "jmp_false", "expr", "POP_JUMP_IF_TRUE")):
  11. jmp2_target = ast[3].attr
  12. return jmp_target != jmp2_target
  13. return jmp_target != tokens[last].off2int()
  14. return False