o
    2gF                     @  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?m@Z@ dd	lAmBZBmCZCmDZD e	ee2f ZEG d
d de3eF ZGd)ddZHd*ddZId+d,ddZJd-d"d#ZKd.d&d'ZLd(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PrimitiveOp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Z0dddZ1dS )IRPrettyPrintVisitorz(Internal visitor that pretty-prints ops.namesdict[Value, str]returnNonec                 C  s
   || _ d S N)r?   )selfr?    rE   G/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/ir/pprint.py__init__D   s   
zIRPrettyPrintVisitor.__init__opr   strc                 C     |  d|jS )Nzgoto %l)formatlabelrD   rH   rE   rE   rF   
visit_gotoJ      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 rR   z (error at %s:%d)zif z goto %lz else goto %l :: )rS   rH   negatedrK   valuetraceback_entrytruefalse)rD   rH   fmttypcondtbrE   rE   rF   visit_branchO   s   

z!IRPrettyPrintVisitor.visit_branchr1   c                 C  rJ   )Nz	return %r)rK   rV   rM   rE   rE   rF   visit_return]   rO   z!IRPrettyPrintVisitor.visit_returnr9   c                 C  s   dS )NunreachablerE   rM   rE   rE   rF   visit_unreachable`   s   z&IRPrettyPrintVisitor.visit_unreachabler   c                 C  s   |  d|j|jS )Nz%r = %r)rK   destsrcrM   rE   rE   rF   visit_assignc   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 rP   NrK   .0vrD   rE   rF   	<genexpr>g       z:IRPrettyPrintVisitor.visit_assign_multi.<locals>.<genexpr>)rK   rb   joinrc   rM   rE   rl   rF   visit_assign_multif   s   &z'IRPrettyPrintVisitor.visit_assign_multir&   c                 C     |  d||jS )Nz%r = <error> :: %s)rK   typerM   rE   rE   rF   visit_load_error_valuei      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 )
NrR   zobject c                 S  s   g | ]}t |qS rE   )repr)rj   irE   rE   rF   
<listcomp>{   s    z;IRPrettyPrintVisitor.visit_load_literal.<locals>.<listcomp>)keyzfrozenset({re   z})z	%r = %s%s)	
isinstancerV   intru   	frozensetsortedrI   ro   rK   )rD   rH   prefixrvalueformatted_itemsrE   rE   rF   visit_load_literall   s   
z'IRPrettyPrintVisitor.visit_load_literalr   c                 C     |  d|| ||j|jS )Nz%r = %s%r.%s)rK   borrow_prefixobjattrrM   rE   rE   rF   visit_get_attr      z#IRPrettyPrintVisitor.visit_get_attrr,   c                 C  s   |j rdS dS )Nzborrow rR   )is_borrowedrM   rE   rE   rF   r      s   z"IRPrettyPrintVisitor.borrow_prefixr2   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   rK   r   r   rc   rM   rE   rE   rF   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  ()rR   .z%r = %s :: %s%s)annru   
identifiermodule_namerK   	namespace)rD   rH   r   namerE   rE   rF   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   rK   rV   r   rD   rH   r   rE   rE   rF   visit_init_static   s   
z&IRPrettyPrintVisitor.visit_init_staticr5   c                 C  r   )Nz%r = %s%r[%d])rK   r   rc   indexrM   rE   rE   rF   visit_tuple_get   r   z$IRPrettyPrintVisitor.visit_tuple_getr6   c                   s(   d  fdd|jD } d||S )Nre   c                 3  rf   rg   rh   )rj   itemrl   rE   rF   rm      rn   z7IRPrettyPrintVisitor.visit_tuple_set.<locals>.<genexpr>z	%r = (%s))ro   itemsrK   )rD   rH   item_strrE   rl   rF   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 %rrT   )rK   rc   r<   rr   r=   r   r   rD   rH   srE   rE   rF   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xrR   rT   )rK   is_xdecrc   r<   rr   r=   r   r   r   rE   rE   rF   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 )Nre   c                 3  rf   rg   rh   rj   argrl   rE   rF   rm      rn   z2IRPrettyPrintVisitor.visit_call.<locals>.<genexpr>(r   %r = )ro   argsfn	shortnameis_voidrK   )rD   rH   r   r   r   rE   rl   rF   
visit_call   s   zIRPrettyPrintVisitor.visit_callr+   c                   sH   d  fdd|jD } d|j|j|}|js" d|| }|S )Nre   c                 3  rf   rg   rh   r   rl   rE   rF   rm      rn   z9IRPrettyPrintVisitor.visit_method_call.<locals>.<genexpr>z	%r.%s(%s)r   )ro   r   rK   r   methodr   )rD   rH   r   r   rE   rl   rF   visit_method_call   s
   z&IRPrettyPrintVisitor.visit_method_callr   c                 C  r   )Nz%r = %scast(%s, %r))rK   r   rr   rc   rM   rE   rE   rF   
visit_cast   r   zIRPrettyPrintVisitor.visit_castr   c                 C  s   |  d||jj|jS )Nz%r = box(%s, %r)rK   rc   rr   rM   rE   rE   rF   	visit_box      zIRPrettyPrintVisitor.visit_boxr8   c                 C     |  d||j|jS )Nz%r = unbox(%s, %r))rK   rr   rc   rM   rE   rE   rF   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)rV   ry   rI   rK   
class_nameru   r:   rM   rE   rE   rF   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 )Nre   c                 3  rf   rg   rh   r   rl   rE   rF   rm      rn   z4IRPrettyPrintVisitor.visit_call_c.<locals>.<genexpr>z%s(%s)z%r = %s(%s))ro   r   r   rK   function_name)rD   rH   args_strrE   rl   rF   visit_call_c   s   z!IRPrettyPrintVisitor.visit_call_cr.   c                 C  s   g }d}d}t |jjD ]*}|r!|| d|j|  |d7 }q|js&J || d|j|  |d7 }qd|}|jrH| d|jj	|S | d||jj	|S )Nr   rP      re   z%s %sz
%r = %s %s)
zipdesc	arg_typesappendrK   r   	type_argsro   r   r   )rD   rH   r   	arg_indextype_arg_indexarg_typer   rE   rE   rF   visit_primitive_op   s   



z'IRPrettyPrintVisitor.visit_primitive_opr4   c                 C     |  d||j|j|jS )Nz%r = truncate %r: %t to %t)rK   rc   src_typerr   rM   rE   rE   rF   visit_truncate      z#IRPrettyPrintVisitor.visit_truncater   c                 C  s*   |j rd}nd}| d|||j|j|jS )Nz signedrR   z%r = extend%s %r: %t to %t)signedrK   rc   r   rr   )rD   rH   extrarE   rE   rF   visit_extend   s   z!IRPrettyPrintVisitor.visit_extendr'   c                 C  s.   |j rdt|j  dnd}| d||j|S )Nr   r   rR   z%r = load_global %s :: static%s)r   ru   rK   r   )rD   rH   r   rE   rE   rF   visit_load_global   s   z&IRPrettyPrintVisitor.visit_load_globalr#   c                 C     |  d||jtj|j |jS Nz%r = %r %s %r)rK   lhsr#   op_strrH   rhsrM   rE   rE   rF   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 :: unsignedrR   z%r = %r %s %r%s)rH   r   SLTSGTSLESGEULTUGTULEUGErK   r   r   r   )rD   rH   sign_formatrE   rE   rF   visit_comparison_op  s   z(IRPrettyPrintVisitor.visit_comparison_opr   c                 C  r   r   )rK   r   r   r   rH   r   rM   rE   rE   rF   visit_float_op  r   z#IRPrettyPrintVisitor.visit_float_opr   c                 C  rq   )Nz%r = -%rrK   rc   rM   rE   rE   rF   visit_float_neg  rt   z$IRPrettyPrintVisitor.visit_float_negr   c                 C  s   |  d||j|j|j |jS r   )rK   r   r   rH   r   rM   rE   rE   rF   visit_float_comparison_op  r   z.IRPrettyPrintVisitor.visit_float_comparison_opr)   c                 C  r   )Nz%r = load_mem %r :: %t*r   rM   rE   rE   rF   visit_load_mem  r   z#IRPrettyPrintVisitor.visit_load_memr3   c                 C  s   |  d|j|j|jS )Nzset_mem %r, %r :: %t*)rK   rb   rc   	dest_typerM   rE   rE   rF   visit_set_mem  r   z"IRPrettyPrintVisitor.visit_set_memr   c                 C  r   )Nz %r = get_element_ptr %r %s :: %t)rK   rc   fieldr   rM   rE   rE   rF   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)ry   rc   r0   rK   r*   r   r   r   r   rE   rE   rF   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 rR   zkeep_alive {}{}re   c                 3  rf   rg   rh   ri   rl   rE   rF   rm   /  rn   z8IRPrettyPrintVisitor.visit_keep_alive.<locals>.<genexpr>)stealrK   ro   rc   )rD   rH   r   rE   rl   rF   visit_keep_alive)  s    z%IRPrettyPrintVisitor.visit_keep_aliver7   c                 C  rq   )Nz%r = unborrow %rr   rM   rE   rE   rF   visit_unborrow2  rt   z#IRPrettyPrintVisitor.visit_unborrowrZ   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   rdz%dfz%flzL%str   zInvalid format sequence %   rR   )listlenfindr   popry   r:   r"   rI   rV   r   ru   r?   r   rL   r;   r   
ValueErrorro   )	rD   rZ   r   resultrv   arglistntypespecr   rE   rE   rF   rK   7  sF   




'zIRPrettyPrintVisitor.formatN)r?   r@   rA   rB   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r1   rA   rI   )rH   r9   rA   rI   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r&   rA   rI   )rH   r(   rA   rI   )rH   r   rA   rI   )rH   r,   rA   rI   )rH   r2   rA   rI   )rH   r*   rA   rI   )rH   r!   rA   rI   )rH   r5   rA   rI   )rH   r6   rA   rI   )rH   r    rA   rI   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r+   rA   rI   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r8   rA   rI   )rH   r/   rA   rI   )rH   r   rA   rI   )rH   r.   rA   rI   )rH   r4   rA   rI   )rH   r   rA   rI   )rH   r'   rA   rI   )rH   r#   rA   rI   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r   rA   rI   )rH   r)   rA   rI   )rH   r3   rA   rI   )rH   r   rA   rI   )rH   r%   rA   rI   )rH   r$   rA   rI   )rH   r7   rA   rI   )rZ   rI   r   r   rA   rI   )2__name__
__module____qualname____doc__rG   rN   r   BOOLIS_ERRORrS   __annotations__r^   r_   ra   rd   rp   rs   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   rK   rE   rE   rE   rF   r>   A   sX   
 












	






	



















	r>   func_irr	   r?   r@   rA   	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{} :: {}re   )r
   arg_regsblocksr   rr   r   rK   ro   )r   r?   r   rv   regsi0grouprE   rE   rF   format_registersp  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.rR   c                 s  s    | ]}d |j  V  qdS )zL%dN)rL   )rj   brE   rE   rF   rm     s    z format_blocks.<locals>.<genexpr>z (handler for {})re   zL%d:%sz  ERR: r   N    z    [MISSING BLOCK EXIT OPCODE])	enumeraterL   error_handler
setdefaultr   r>   r|   rK   ro   opsry   r   r   getacceptr   r1   r9   )r  r?   r	  rv   blockhandler_mapr  visitorlineshandler_msglabelserrorr  rH   linerE   rE   rF   format_blocks  sJ   

r  rE   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   rR   zdef {}{}({}):re   c                 s  s    | ]}|j V  qd S rC   )r   r   rE   rE   rF   rm     s    zformat_func.<locals>.<genexpr>r  )r   r   rK   r   ro   r   generate_names_for_irr  r  r  r   r   r  extend)
r   r  r  
cls_prefixr?   r  r	  sourcer  coderE   rE   rF   format_func  s    
r$  modulesr   c                 C  s:   g }|   D ]}|jD ]}|t| |d qq|S )NrR   )values	functionsr   r$  r   )r%  r  moduler   rE   rE   rF   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   ry   r   r   rb   r   r   r0   r"   r   )r   r  r?   
used_names
temp_indexr   r  rH   r&  r"  rV   r   r   	candidaterE   rE   rF   r    sT   



&r  N)r   r	   r?   r@   rA   r  )r  r  r?   r@   r	  r
  rA   r  )rE   )r   r	   r  r  rA   r  )r%  r   rA   r  )r   r*  r  r  rA   r@   )Mr   
__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   r:   mypyc.ir.rtypesr;   r<   r=   ErrorSourcerI   r>   r  r  r$  r)  r  rE   rE   rE   rF   <module>   s$    1  
1
3
	