targets.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from __future__ import annotations
  2. from mypyc.ir.ops import Register, Value
  3. from mypyc.ir.rtypes import RInstance, RType, object_rprimitive
  4. class AssignmentTarget:
  5. """Abstract base class for assignment targets during IR building."""
  6. type: RType = object_rprimitive
  7. class AssignmentTargetRegister(AssignmentTarget):
  8. """Register as an assignment target.
  9. This is used for local variables and some temporaries.
  10. """
  11. def __init__(self, register: Register) -> None:
  12. self.register = register
  13. self.type = register.type
  14. class AssignmentTargetIndex(AssignmentTarget):
  15. """base[index] as assignment target"""
  16. def __init__(self, base: Value, index: Value) -> None:
  17. self.base = base
  18. self.index = index
  19. # TODO: object_rprimitive won't be right for user-defined classes. Store the
  20. # lvalue type in mypy and use a better type to avoid unneeded boxing.
  21. self.type = object_rprimitive
  22. class AssignmentTargetAttr(AssignmentTarget):
  23. """obj.attr as assignment target"""
  24. def __init__(self, obj: Value, attr: str, can_borrow: bool = False) -> None:
  25. self.obj = obj
  26. self.attr = attr
  27. self.can_borrow = can_borrow
  28. if isinstance(obj.type, RInstance) and obj.type.class_ir.has_attr(attr):
  29. # Native attribute reference
  30. self.obj_type: RType = obj.type
  31. self.type = obj.type.attr_type(attr)
  32. else:
  33. # Python attribute reference
  34. self.obj_type = object_rprimitive
  35. self.type = object_rprimitive
  36. class AssignmentTargetTuple(AssignmentTarget):
  37. """x, ..., y as assignment target"""
  38. def __init__(self, items: list[AssignmentTarget], star_idx: int | None = None) -> None:
  39. self.items = items
  40. self.star_idx = star_idx