o
    2g-                     @  s4  U d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZmZ ddlmZ G d	d
 d
Z G dd dZ!d(ddZ"dZ#de$d< dZ%de$d< dZ&de$d< G dd dZ'G dd dZ(e
dg e	g Z)de$d< d)d#d$Z*d)d%d&Z+d'S )*z)Intermediate representation of functions.    )annotations)FinalSequence)ARG_POSArgKindBlockFuncDef)BITMAP_BITSJsonDictbitmap_nameget_id_from_nameshort_id_from_name)AssignAssignMulti
BasicBlock	ControlOp	DeserMapsLoadAddressRegisterValue)RTypebitmap_rprimitivedeserialize_type)NameGeneratorc                   @  sP   e Zd ZdZedfdddZedddZdddZdddZ	e
d ddZdS )!
RuntimeArgzrDescription of a function argument in IR.

    Argument kind is one of ARG_* constants defined in mypy.nodes.
    Fnamestrtypr   kindr   pos_onlyboolreturnNonec                 C  s   || _ || _|| _|| _d S Nr   typer   r   )selfr   r   r   r    r'   H/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/ir/func_ir.py__init__   s   
zRuntimeArg.__init__c                 C  s
   | j  S r#   )r   is_optionalr&   r'   r'   r(   optional%      
zRuntimeArg.optionalc                 C  s   d | j| j| j| jS )Nz:RuntimeArg(name={}, type={}, optional={!r}, pos_only={!r}))formatr   r%   r,   r   r+   r'   r'   r(   __repr__)   s   zRuntimeArg.__repr__r
   c                 C  s    | j | j t| jj| jdS )Nr$   )r   r%   	serializeintr   valuer   r+   r'   r'   r(   r0   .   s
   
zRuntimeArg.serializedatactxr   c                 C  s(   t |d t|d |t|d |d S )Nr   r%   r   r   )r   r   r   clsr3   r4   r'   r'   r(   deserialize6   s   
zRuntimeArg.deserializeN)
r   r   r   r   r   r   r   r    r!   r"   )r!   r    r!   r   r!   r
   )r3   r
   r4   r   r!   r   )__name__
__module____qualname____doc__r   r)   propertyr,   r/   r0   classmethodr7   r'   r'   r'   r(   r      s    

r   c                   @  sP   e Zd ZdZddd	ZdddZdddZdddZdddZe	d ddZ
dS )!FuncSignaturezSignature of a function in IR.argsSequence[RuntimeArg]ret_typer   r!   r"   c                 C  sR   t || _|| _t| j| _| jr'dd t| jD }| jt t| | _d S d S )Nc                 S  s   g | ]}t t|td dqS )T)r   )r   r   r   ).0ir'   r'   r(   
<listcomp>L   s    z*FuncSignature.__init__.<locals>.<listcomp>)tuplerA   rC   num_bitmap_argsrangereversed)r&   rA   rC   extrar'   r'   r(   r)   E   s   
zFuncSignature.__init__tuple[RuntimeArg, ...]c                 C  s   | j r| jd| j   S | jS )z8Return arguments without any synthetic bitmap arguments.N)rH   rA   r+   r'   r'   r(   	real_argsR   s   zFuncSignature.real_argsc                 C  s6   | j rt| jd| j   | jS t| jdd  | jS )N   )rH   r@   rA   rC   r+   r'   r'   r(   	bound_sigX   s   zFuncSignature.bound_sigr   c                 C  s   d| j d| jdS )NzFuncSignature(args=z, ret=)rA   rC   r+   r'   r'   r(   r/   ^   s   zFuncSignature.__repr__r
   c                 C  s:   | j r| jd | j   }n| j}dd |D | j dS )Nc                 S  s   g | ]}|  qS r'   )r0   )rD   tr'   r'   r(   rF   f   s    z+FuncSignature.serialize.<locals>.<listcomp>rQ   )rH   rA   rC   r0   )r&   rA   r'   r'   r(   r0   a   s   zFuncSignature.serializer3   r4   r   c                   s&   t  fdd|d D t|d  S )Nc                   s   g | ]}t | qS r'   )r   r7   )rD   argr4   r'   r(   rF   k   s    z-FuncSignature.deserialize.<locals>.<listcomp>rA   rC   )r@   r   r5   r'   rT   r(   r7   h   s   zFuncSignature.deserializeN)rA   rB   rC   r   r!   r"   )r!   rL   r!   r@   r8   r9   )r3   r
   r4   r   r!   r@   )r:   r;   r<   r=   r)   rM   rO   r/   r0   r?   r7   r'   r'   r'   r(   r@   @   s    




r@   rA   rL   r!   r1   c                 C  s8   d}| D ]}|j jr|j r|d7 }q|td  t S )Nr   rN   )r%   error_overlapr   r*   r	   )rA   nrS   r'   r'   r(   rH   p   s   rH   r   FUNC_NORMALrN   FUNC_STATICMETHOD   FUNC_CLASSMETHODc                   @  s   e Zd ZdZedddfd0ddZed1ddZejd2ddZed3ddZ	e
d4ddZed3ddZed3ddZd5d"d#Zd6d%d&Ze
d7d(d)Zed8d-d.Zd/S )9FuncDeclzDeclaration of a function in IR (without body or implementation).

    A function can be a regular module-level function, a method, a
    static method, a class method, or a property getter/setter.
    Fr   r   
class_name
str | Nonemodule_namesigr@   r   r1   is_prop_setterr    is_prop_getterimplicitr!   r"   c	           	      C  sd   || _ || _|| _|| _|| _|| _|| _|d u rd | _n|tkr%|| _n| | _|| _	d | _
d S r#   )r   r]   r_   r`   r   ra   rb   rO   rY   rc   _line)	r&   r   r]   r_   r`   r   ra   rb   rc   r'   r'   r(   r)      s   

zFuncDecl.__init__c                 C  s   | j d usJ | j S r#   rd   r+   r'   r'   r(   line   s   zFuncDecl.linerf   c                 C  s
   || _ d S r#   re   )r&   rf   r'   r'   r(   rf      r-   c                 C  s    | j d usJ t| j| j| j S r#   )rf   r   r   fullnamer+   r'   r'   r(   id   s   zFuncDecl.idc                 C  s   | r| d | S |S N.r'   r]   r   r'   r'   r(   compute_shortname   s   zFuncDecl.compute_shortnamec                 C  s   t | j| jS r#   )r\   rl   r]   r   r+   r'   r'   r(   	shortname      zFuncDecl.shortnamec                 C  s   | j d | j S ri   )r_   rm   r+   r'   r'   r(   rg      rn   zFuncDecl.fullnamenamesr   c                 C  s    t | j| j| j}|| j|S r#   )r   r   rm   rd   private_namer_   )r&   ro   partial_namer'   r'   r(   cname   s   zFuncDecl.cnamer
   c              	   C  s*   | j | j| j| j | j| j| j| jdS )N)r   r]   r_   r`   r   ra   rb   rc   )	r   r]   r_   r`   r0   r   ra   rb   rc   r+   r'   r'   r(   r0      s   zFuncDecl.serializefunc_irc                 C  s@   | d }t |d |d }|d d | }t|d || d S )zCGet the id from the serialized FuncIR associated with this FuncDecldeclr]   r   r_   rj   rf   )r\   rl   r   )rs   rt   rm   rg   r'   r'   r(   get_id_from_json   s   zFuncDecl.get_id_from_jsonr3   r4   r   c              
   C  s>   t |d |d |d t|d ||d |d |d |d S )	Nr   r]   r_   r`   r   ra   rb   rc   )r\   r@   r7   r5   r'   r'   r(   r7      s   zFuncDecl.deserializeN)r   r   r]   r^   r_   r   r`   r@   r   r1   ra   r    rb   r    rc   r    r!   r"   r!   r1   )rf   r1   r!   r"   r8   )r]   r^   r   r   r!   r   ro   r   r!   r   r9   )rs   r
   r!   r   )r3   r
   r4   r   r!   r\   )r:   r;   r<   r=   rX   r)   r>   rf   setterrh   staticmethodrl   rm   rg   rr   r0   ru   r?   r7   r'   r'   r'   r(   r\   }   s2    "

r\   c                   @  s   e Zd ZdZ		d4d5ddZed6ddZed7ddZed8ddZed9ddZ	ed:ddZ
ed;d d!Zed;d"d#Zed;d$d%Zd<d(d)Zd;d*d+Zd=d-d.Zed>d2d3ZdS )?FuncIRzIntermediate representation of a function with contextual information.

    Unlike FuncDecl, this includes the IR of the body (basic blocks).
    Nrt   r\   arg_regslist[Register]blockslist[BasicBlock]rf   r1   traceback_namer^   r!   r"   c                 C  s$   || _ || _|| _|| j _|| _d S r#   )rt   r|   r~   rf   r   )r&   rt   r|   r~   rf   r   r'   r'   r(   r)      s
   	
zFuncIR.__init__c                 C     | j jS r#   )rt   rf   r+   r'   r'   r(   rf        zFuncIR.linerB   c                 C  
   | j jjS r#   )rt   r`   rA   r+   r'   r'   r(   rA     r-   zFuncIR.argsr   c                 C  r   r#   )rt   r`   rC   r+   r'   r'   r(   rC   	  r-   zFuncIR.ret_typec                 C  r   r#   )rt   r]   r+   r'   r'   r(   r]     r   zFuncIR.class_namer@   c                 C  r   r#   )rt   r`   r+   r'   r'   r(   r`     r   z
FuncIR.sigr   c                 C  r   r#   )rt   r   r+   r'   r'   r(   r     r   zFuncIR.namec                 C  r   r#   )rt   rg   r+   r'   r'   r(   rg     r   zFuncIR.fullnamec                 C  r   r#   )rt   rh   r+   r'   r'   r(   rh     r   z	FuncIR.idro   r   c                 C  s   | j |S r#   )rt   rr   )r&   ro   r'   r'   r(   rr   !  s   zFuncIR.cnamec                 C  s*   | j rd| j  d| j dS d| j dS )Nz<FuncIR rj   >rk   r+   r'   r'   r(   r/   $  s   zFuncIR.__repr__r
   c                 C  s   | j  | j| jdS )N)rt   rf   r   )rt   r0   rf   r   r+   r'   r'   r(   r0   *  s   zFuncIR.serializer3   r4   r   c                 C  s$   t t|d |g g |d |d S )Nrt   rf   r   )rz   r\   r7   r5   r'   r'   r(   r7   2  s   zFuncIR.deserialize)r{   N)rt   r\   r|   r}   r~   r   rf   r1   r   r^   r!   r"   rv   )r!   rB   )r!   r   )r!   r^   rU   r8   rw   r9   )r3   r
   r4   r   r!   rz   )r:   r;   r<   r=   r)   r>   rf   rA   rC   r]   r`   r   rg   rh   rr   r/   r0   r?   r7   r'   r'   r'   r(   rz      s4    



rz   z<INVALID_FUNC_DEF>INVALID_FUNC_DEFr}   r~   r   list[Value]c                 C  s   t | }t| }|D ]K}|jD ]E}t|tsTt|ttfr/|j|vr.||j |	|j q|j
r3qt|trOt|jtrO|j|vrO||j |	|j || qq
|S )zvReturn the set of all values that may be initialized in the blocks.

    This omits registers that are only read.
    )listsetops
isinstancer   r   r   destappendaddis_voidr   srcr   )rA   r~   valuesseen_registersblockopr'   r'   r(   
all_values<  s.   





r   c                 C  s   t | }t| }|D ]I}|jD ]C}| D ]}t|tr*||vr*|| || qt|tsRt|t	t
frI|j|vrH||j ||j q|jrMq|| qq
|S )z:Return set of all values that are initialized or accessed.)r   r   r   sourcesr   r   r   r   r   r   r   r   r   )rA   r~   r   r   r   r   sourcer'   r'   r(   all_values_full[  s*   





r   N)rA   rL   r!   r1   )rA   r}   r~   r   r!   r   ),r=   
__future__r   typingr   r   
mypy.nodesr   r   r   r   mypyc.commonr	   r
   r   r   r   mypyc.ir.opsr   r   r   r   r   r   r   r   mypyc.ir.rtypesr   r   r   mypyc.namegenr   r   r@   rH   rX   __annotations__rY   r[   r\   rz   r   r   r   r'   r'   r'   r(   <module>   s&    (
)
0jR
