Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
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
|