o
    7fD                     @  s  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? dd	l@mAZAmBZBmCZC e	ee2f ZDG d
d de3eE ZFd)ddZGd*ddZHd+d,ddZId-d"d#ZJd.d&d'ZKd(S )/z:Utilities for pretty-printing IR in a human-readable form.    )annotations)defaultdict)AnyFinalSequenceUnion)
short_name)FuncIRall_values_full)	ModuleIRs).	ERR_NEVERAssignAssignMulti
BasicBlockBoxBranchCallCallCCastComparisonOp	ControlOpDecRefExtendFloatFloatComparisonOpFloatNegFloatOpGetAttrGetElementPtrGotoIncRef
InitStaticIntegerIntOp	KeepAliveLoadAddressLoadErrorValue
LoadGlobalLoadLiteralLoadMem
LoadStatic
MethodCallOp	OpVisitorRaiseStandardErrorRegisterReturnSetAttrSetMemTruncateTupleGetTupleSetUnborrowUnboxUnreachableValue)RTypeis_bool_rprimitiveis_int_rprimitivec                   @  s  e Zd ZU dZdddZdddZejdejdiZ	de
d< dddZdddZdddZdddZdddZdd!d"Zdd$d%Zdd'd(Zdd*d+Zdd-d.Zdd0d1Zdd3d4Zdd6d7Zdd9d:Zdd<d=Zdd?d@ZddBdCZddEdFZddHdIZddKdLZddNdOZddQdRZ ddTdUZ!ddWdXZ"ddZd[Z#dd]d^Z$dd`daZ%ddcddZ&ddfdgZ'ddidjZ(ddldmZ)ddodpZ*ddrdsZ+ddudvZ,ddxdyZ-dd{d|Z.dd~dZ/dddZ0dS )IRPrettyPrintVisitorz(Internal visitor that pretty-prints ops.namesdict[Value, str]returnNonec                 C  s
   || _ d S N)r>   )selfr>    rD   H/home/ertert/spirit/venv/lib/python3.10/site-packages/mypyc/ir/pprint.py__init__C   s   
zIRPrettyPrintVisitor.__init__opr   strc                 C     |  d|jS )Nzgoto %l)formatlabelrC   rG   rD   rD   rE   
visit_gotoI      zIRPrettyPrintVisitor.visit_goto)%rbool)zis_error(%r) r   branch_op_namesr   c                 C  sx   | j |j \}}|jrd| }| ||j}d}|jr!d|j }d| d| d}|r3|d| 7 }| ||j|jS )Nznot rQ   z (error at %s:%d)zif z goto %lz else goto %l :: )rR   rG   negatedrJ   valuetraceback_entrytruefalse)rC   rG   fmttypcondtbrD   rD   rE   visit_branchN   s   

z!IRPrettyPrintVisitor.visit_branchr0   c                 C  rI   )Nz	return %r)rJ   rU   rL   rD   rD   rE   visit_return\   rN   z!IRPrettyPrintVisitor.visit_returnr8   c                 C  s   dS )NunreachablerD   rL   rD   rD   rE   visit_unreachable_   s   z&IRPrettyPrintVisitor.visit_unreachabler   c                 C  s   |  d|j|jS )Nz%r = %r)rJ   destsrcrL   rD   rD   rE   visit_assignb   s   z!IRPrettyPrintVisitor.visit_assignr   c              	     s&     d|jd fdd|jD S )Nz	%r = [%s], c                 3      | ]	}  d |V  qdS rO   NrJ   .0vrC   rD   rE   	<genexpr>f       z:IRPrettyPrintVisitor.visit_assign_multi.<locals>.<genexpr>)rJ   ra   joinrb   rL   rD   rk   rE   visit_assign_multie   s   &z'IRPrettyPrintVisitor.visit_assign_multir&   c                 C     |  d||jS )Nz%r = <error> :: %s)rJ   typerL   rD   rD   rE   visit_load_error_valueh      z+IRPrettyPrintVisitor.visit_load_error_valuer(   c                 C  sd   d}t |jtr
d}t|j}t |jtr*dd t|jtdD }dd| d }| d	|||S )
NrQ   zobject c                 S  s   g | ]}t |qS rD   )repr)ri   irD   rD   rE   
<listcomp>z   s    z;IRPrettyPrintVisitor.visit_load_literal.<locals>.<listcomp>)keyzfrozenset({rd   z})z	%r = %s%s)	
isinstancerU   intrt   	frozensetsortedrH   rn   rJ   )rC   rG   prefixrvalueformatted_itemsrD   rD   rE   visit_load_literalk   s   
z'IRPrettyPrintVisitor.visit_load_literalr   c                 C     |  d|| ||j|jS )Nz%r = %s%r.%s)rJ   borrow_prefixobjattrrL   rD   rD   rE   visit_get_attr~      z#IRPrettyPrintVisitor.visit_get_attrr,   c                 C  s   |j rdS dS )Nzborrow rQ   )is_borrowedrL   rD   rD   rE   r      s   z"IRPrettyPrintVisitor.borrow_prefixr1   c                 C  sL   |j r
|jtks
J |jtkr| d|j|j|jS | d|j|j|j|S )Nz
%r.%s = %rz%r.%s = %r; %r = is_error)is_init
error_kindr   rJ   r   r   rb   rL   rD   rD   rE   visit_set_attr   s
   
z#IRPrettyPrintVisitor.visit_set_attrr*   c                 C  sP   |j rdt|j  dnd}|j}|jd ur|j d| }| d|||j|S )N  ()rQ   .z%r = %s :: %s%s)annrt   
identifiermodule_namerJ   	namespace)rC   rG   r   namerD   rD   rE   visit_load_static   s
   
z&IRPrettyPrintVisitor.visit_load_staticr!   c                 C  s4   |j }|jd ur|j d| }| d||j|jS )Nr   z%s = %r :: %s)r   r   rJ   rU   r   rC   rG   r   rD   rD   rE   visit_init_static   s   
z&IRPrettyPrintVisitor.visit_init_staticr4   c                 C  r   )Nz%r = %s%r[%d])rJ   r   rb   indexrL   rD   rD   rE   visit_tuple_get   r   z$IRPrettyPrintVisitor.visit_tuple_getr5   c                   s(   d  fdd|jD } d||S )Nrd   c                 3  re   rf   rg   )ri   itemrk   rD   rE   rl      rm   z7IRPrettyPrintVisitor.visit_tuple_set.<locals>.<genexpr>z	%r = (%s))rn   itemsrJ   )rC   rG   item_strrD   rk   rE   visit_tuple_set   s   z$IRPrettyPrintVisitor.visit_tuple_setr    c                 C  sB   |  d|j}t|jjst|jjr|dt|jjj 7 }|S )Nz
inc_ref %rrS   )rJ   rb   r;   rq   r<   r   r   rC   rG   srD   rD   rE   visit_inc_ref   s   z"IRPrettyPrintVisitor.visit_inc_refr   c                 C  sN   |  d|jrdnd|j}t|jjst|jjr%|dt|jjj 7 }|S )Nz%sdec_ref %rxrQ   rS   )rJ   is_xdecrb   r;   rq   r<   r   r   r   rD   rD   rE   visit_dec_ref   s   z"IRPrettyPrintVisitor.visit_dec_refr   c                   sL   d  fdd|jD }|jj}| d| d}|js$ d|| }|S )Nrd   c                 3  re   rf   rg   ri   argrk   rD   rE   rl      rm   z2IRPrettyPrintVisitor.visit_call.<locals>.<genexpr>(r   %r = )rn   argsfn	shortnameis_voidrJ   )rC   rG   r   r   r   rD   rk   rE   
visit_call   s   zIRPrettyPrintVisitor.visit_callr+   c                   sH   d  fdd|jD } d|j|j|}|js" d|| }|S )Nrd   c                 3  re   rf   rg   r   rk   rD   rE   rl      rm   z9IRPrettyPrintVisitor.visit_method_call.<locals>.<genexpr>z	%r.%s(%s)r   )rn   r   rJ   r   methodr   )rC   rG   r   r   rD   rk   rE   visit_method_call   s
   z&IRPrettyPrintVisitor.visit_method_callr   c                 C  r   )Nz%r = %scast(%s, %r))rJ   r   rq   rb   rL   rD   rD   rE   
visit_cast   r   zIRPrettyPrintVisitor.visit_castr   c                 C  s   |  d||jj|jS )Nz%r = box(%s, %r)rJ   rb   rq   rL   rD   rD   rE   	visit_box      zIRPrettyPrintVisitor.visit_boxr7   c                 C     |  d||j|jS )Nz%r = unbox(%s, %r))rJ   rq   rb   rL   rD   rD   rE   visit_unbox      z IRPrettyPrintVisitor.visit_unboxr.   c                 C  sf   |j d ur+t|j tr| d||jt|j S t|j tr'| d||j|j S J d| d||jS )Nz%r = raise %s(%s)z%r = raise %s(%r)Fz&value type must be either str or Valuez%r = raise %s)rU   rx   rH   rJ   
class_namert   r9   rL   rD   rD   rE   visit_raise_standard_error   s   
z/IRPrettyPrintVisitor.visit_raise_standard_errorr   c                   sB   d  fdd|jD }|jr d|j|S  d||j|S )Nrd   c                 3  re   rf   rg   r   rk   rD   rE   rl      rm   z4IRPrettyPrintVisitor.visit_call_c.<locals>.<genexpr>z%s(%s)z%r = %s(%s))rn   r   r   rJ   function_name)rC   rG   args_strrD   rk   rE   visit_call_c   s   z!IRPrettyPrintVisitor.visit_call_cr3   c                 C     |  d||j|j|jS )Nz%r = truncate %r: %t to %t)rJ   rb   src_typerq   rL   rD   rD   rE   visit_truncate      z#IRPrettyPrintVisitor.visit_truncater   c                 C  s*   |j rd}nd}| d|||j|j|jS )Nz signedrQ   z%r = extend%s %r: %t to %t)signedrJ   rb   r   rq   )rC   rG   extrarD   rD   rE   visit_extend   s   z!IRPrettyPrintVisitor.visit_extendr'   c                 C  s.   |j rdt|j  dnd}| d||j|S )Nr   r   rQ   z%r = load_global %s :: static%s)r   rt   rJ   r   )rC   rG   r   rD   rD   rE   visit_load_global   s   z&IRPrettyPrintVisitor.visit_load_globalr#   c                 C     |  d||jtj|j |jS Nz%r = %r %s %r)rJ   lhsr#   op_strrG   rhsrL   rD   rD   rE   visit_int_op      z!IRPrettyPrintVisitor.visit_int_opr   c                 C  sd   |j tjtjtjtjfv rd}n|j tjtjtjtj	fv r d}nd}| 
d||jtj|j  |j|S )Nz
 :: signedz :: unsignedrQ   z%r = %r %s %r%s)rG   r   SLTSGTSLESGEULTUGTULEUGErJ   r   r   r   )rC   rG   sign_formatrD   rD   rE   visit_comparison_op   s   z(IRPrettyPrintVisitor.visit_comparison_opr   c                 C  r   r   )rJ   r   r   r   rG   r   rL   rD   rD   rE   visit_float_op   r   z#IRPrettyPrintVisitor.visit_float_opr   c                 C  rp   )Nz%r = -%rrJ   rb   rL   rD   rD   rE   visit_float_neg   rs   z$IRPrettyPrintVisitor.visit_float_negr   c                 C  s   |  d||j|j|j |jS r   )rJ   r   r   rG   r   rL   rD   rD   rE   visit_float_comparison_op   r   z.IRPrettyPrintVisitor.visit_float_comparison_opr)   c                 C  r   )Nz%r = load_mem %r :: %t*r   rL   rD   rD   rE   visit_load_mem  r   z#IRPrettyPrintVisitor.visit_load_memr2   c                 C  s   |  d|j|j|jS )Nzset_mem %r, %r :: %t*)rJ   ra   rb   	dest_typerL   rD   rD   rE   visit_set_mem  r   z"IRPrettyPrintVisitor.visit_set_memr   c                 C  r   )Nz %r = get_element_ptr %r %s :: %t)rJ   rb   fieldr   rL   rD   rD   rE   visit_get_element_ptr  r   z*IRPrettyPrintVisitor.visit_get_element_ptrr%   c                 C  sr   t |jtr| d||jS t |jtr1|jj}|jjd ur'|jj d| }| d|||jjS | d||jS )Nz%r = load_address %rr   z%r = load_address %s :: %sz%r = load_address %s)rx   rb   r/   rJ   r*   r   r   r   r   rD   rD   rE   visit_load_address
  s   z'IRPrettyPrintVisitor.visit_load_addressr$   c              
     s8   |j rd}nd} d|d fdd|jD S )Nzsteal rQ   zkeep_alive {}{}rd   c                 3  re   rf   rg   rh   rk   rD   rE   rl     rm   z8IRPrettyPrintVisitor.visit_keep_alive.<locals>.<genexpr>)stealrJ   rn   rb   )rC   rG   r   rD   rk   rE   visit_keep_alive  s    z%IRPrettyPrintVisitor.visit_keep_aliver6   c                 C  rp   )Nz%r = unborrow %rr   rL   rD   rD   rE   visit_unborrow  rs   z#IRPrettyPrintVisitor.visit_unborrowrY   r   r   c           	      G  s  g }d}t |}|t|k r|d|}|dk rt|}||||  |t|k r||d  }|d}|dkrft|tsAJ t|trO|t|j	 nht|t
r]|t|j	 nZ|| j|  nQ|dkrr|d|  nE|dkr~|d|  n9|d	krt|tsJ |d
|j  n%|dkrt|tsJ ||j n|dkr|t| ntd| |d }n|}|t|k sd|S )a2  Helper for formatting strings.

        These format sequences are supported in fmt:

          %s: arbitrary object converted to string using str()
          %r: name of IR value/register
          %d: int
          %f: float
          %l: BasicBlock (formatted as label 'Ln')
          %t: RType
        r   %   rdz%dfz%flzL%str   zInvalid format sequence %   rQ   )listlenfindappendpoprx   r9   r"   rH   rU   r   rt   r>   r   rK   r:   r   
ValueErrorrn   )	rC   rY   r   resultru   arglistntypespecr   rD   rD   rE   rJ   #  sF   




'zIRPrettyPrintVisitor.formatN)r>   r?   r@   rA   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r0   r@   rH   )rG   r8   r@   rH   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r&   r@   rH   )rG   r(   r@   rH   )rG   r   r@   rH   )rG   r,   r@   rH   )rG   r1   r@   rH   )rG   r*   r@   rH   )rG   r!   r@   rH   )rG   r4   r@   rH   )rG   r5   r@   rH   )rG   r    r@   rH   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r+   r@   rH   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r7   r@   rH   )rG   r.   r@   rH   )rG   r   r@   rH   )rG   r3   r@   rH   )rG   r   r@   rH   )rG   r'   r@   rH   )rG   r#   r@   rH   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r   r@   rH   )rG   r)   r@   rH   )rG   r2   r@   rH   )rG   r   r@   rH   )rG   r%   r@   rH   )rG   r$   r@   rH   )rG   r6   r@   rH   )rY   rH   r   r   r@   rH   )1__name__
__module____qualname____doc__rF   rM   r   BOOLIS_ERRORrR   __annotations__r]   r^   r`   rc   ro   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   rD   rD   rD   rE   r=   @   sV   
 












	






	


















	r=   func_irr	   r>   r?   r@   	list[str]c                 C  s   g }d}t | j| j}|t|k rh|}|||  g}|d t|k rO||d  j|| jkrO|d7 }||||   |d t|k rO||d  j|| jks.|d7 }|dd||| j |t|k s|S )Nr   r   z{} :: {}rd   )r
   arg_regsblocksr   rq   r   rJ   rn   )r   r>   r   ru   regsi0grouprD   rD   rE   format_registers\  s   ((r   r   list[BasicBlock]source_to_errordict[ErrorSource, list[str]]c                 C  s  t | D ]\}}||_qi }| D ]}|jr||jg | qt|}g }t | D ]\}}d}	||v rGtdd || D }
dd|
}	|d|j|	f  ||v rd|| D ]
}|d|  qY|j	}t
|d tr|d	 t| k r|d j| |d	  kr||d g s|d
d }|D ]!}d|| }|| ||v r|| D ]
}|d|  qqt
|j	d ttttfs|d q*|S )z<Format a list of IR basic blocks into a human-readable form.rQ   c                 s  s    | ]}d |j  V  qdS )zL%dN)rK   )ri   brD   rD   rE   rl     s    z format_blocks.<locals>.<genexpr>z (handler for {})rd   zL%d:%sz  ERR: r   N    z    [MISSING BLOCK EXIT OPCODE])	enumeraterK   error_handler
setdefaultr   r=   r{   rJ   rn   opsrx   r   r   getacceptr   r0   r8   )r   r>   r   ru   blockhandler_mapr  visitorlineshandler_msglabelserrorr  rG   linerD   rD   rE   format_blocksk  sJ   

r  rD   r   errors!Sequence[tuple[ErrorSource, str]]c           
   
   C  s   g }| j r
| j d nd}|d|| jddd | jD  t| j| j}t	| |D ]	}|d|  q,t
t}|D ]\}}|| | q<t| j||}	||	 |S )Nr   rQ   zdef {}{}({}):rd   c                 s  s    | ]}|j V  qd S rB   )r   r   rD   rD   rE   rl     s    zformat_func.<locals>.<genexpr>r  )r   r   rJ   r   rn   r   generate_names_for_irr   r   r   r   r   r  extend)
r   r  r  
cls_prefixr>   r  r   sourcer  coderD   rD   rE   format_func  s    
r  modulesr   c                 C  s:   g }|   D ]}|jD ]}|t| |d qq|S )NrQ   )values	functionsr  r  r   )r  r  moduler   rD   rD   rE   format_modules  s   
r   r   list[Register]c                 C  s<  i }t  }d}| D ]}|j||< ||j q	|D ]}|jD ]|}g }| D ]}	|	|vr1||	 q&t|ttfr@||j	 nt|t
sH|jrIq||vrR|| |D ]E}
|
|v r[qTt|
trg|
jrg|
j}nt|
ttfroqTd| }|d7 }||v rd}	 d||f }||vr|}n|d7 }q~|||
< || qTqq|S )zGenerate unique names for IR values.

    Give names such as 'r5' to temp values in IR which are useful when
    pretty-printing or generating C. Ensure generated names are unique.
    r   zr%dr   r   Tz%s_%d)setr   addr  sourcesr   rx   r   r   ra   r   r   r/   r"   r   )r   r   r>   
used_names
temp_indexr   r  rG   r  r  rU   r   r   	candidaterD   rD   rE   r    sT   



&r  N)r   r	   r>   r?   r@   r   )r   r   r>   r?   r   r  r@   r   )rD   )r   r	   r  r  r@   r   )r  r   r@   r   )r   r!  r   r   r@   r?   )Lr   
__future__r   collectionsr   typingr   r   r   r   mypyc.commonr   mypyc.ir.func_irr	   r
   mypyc.ir.module_irr   mypyc.ir.opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   mypyc.ir.rtypesr:   r;   r<   ErrorSourcerH   r=   r   r  r  r   r  rD   rD   rD   rE   <module>   s$    0  

3
	