usse/funda-scraper/venv/lib/python3.10/site-packages/mypyc/irbuild/targets.py

60 lines
1.8 KiB
Python
Raw Normal View History

2023-02-20 22:38:24 +00:00
from typing import List, Optional
from mypyc.ir.ops import Value, Register
from mypyc.ir.rtypes import RType, RInstance, 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: Optional[int] = None) -> None:
self.items = items
self.star_idx = star_idx