| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- from __future__ import annotations
- from mypyc.ir.ops import Register, Value
- from mypyc.ir.rtypes import RInstance, RType, object_rprimitive
- class AssignmentTarget:
- """Abstract base class for assignment targets during IR building."""
- type: RType = object_rprimitive
- class AssignmentTargetRegister(AssignmentTarget):
- """Register as an assignment target.
- This is used for local variables and some temporaries.
- """
- def __init__(self, register: Register) -> None:
- self.register = register
- self.type = register.type
- class AssignmentTargetIndex(AssignmentTarget):
- """base[index] as assignment target"""
- def __init__(self, base: Value, index: Value) -> None:
- self.base = base
- self.index = index
- # TODO: object_rprimitive won't be right for user-defined classes. Store the
- # lvalue type in mypy and use a better type to avoid unneeded boxing.
- self.type = object_rprimitive
- class AssignmentTargetAttr(AssignmentTarget):
- """obj.attr as assignment target"""
- def __init__(self, obj: Value, attr: str, can_borrow: bool = False) -> None:
- self.obj = obj
- self.attr = attr
- self.can_borrow = can_borrow
- if isinstance(obj.type, RInstance) and obj.type.class_ir.has_attr(attr):
- # Native attribute reference
- self.obj_type: RType = obj.type
- self.type = obj.type.attr_type(attr)
- else:
- # Python attribute reference
- self.obj_type = object_rprimitive
- self.type = object_rprimitive
- class AssignmentTargetTuple(AssignmentTarget):
- """x, ..., y as assignment target"""
- def __init__(self, items: list[AssignmentTarget], star_idx: int | None = None) -> None:
- self.items = items
- self.star_idx = star_idx
|