o
    7f4                     @  s  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
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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE G dd dZFdddZGG dd deHZId ddZJdddZKe>jLe<jLeDjLe=jLeAjLeCjLeEjLeBjLhZMd!ddZNG dd de'd ZOdS )"z@Utilities for checking that internal ir is valid and consistent.    )annotations)FUNC_STATICMETHODFuncIR)-AssignAssignMulti
BaseAssign
BasicBlockBoxBranchCallCallCCastComparisonOp	ControlOpDecRefExtend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)format_func)RArray	RInstance
RPrimitiveRTypeRUnionbytes_rprimitivedict_rprimitiveint_rprimitiveis_float_rprimitiveis_object_rprimitivelist_rprimitiverange_rprimitiveset_rprimitivestr_rprimitivetuple_rprimitivec                   @  s*   e Zd ZdddZdddZdddZdS )FnErrorsourceOp | BasicBlockdescstrreturnNonec                 C  s   || _ || _d S NrC   rE   selfrC   rE    rM   O/home/ertert/spirit/venv/lib/python3.10/site-packages/mypyc/analysis/ircheck.py__init__J      
zFnError.__init__otherobjectboolc                 C  s"   t |to| j|jko| j|jkS rI   )
isinstancerB   rC   rE   )rL   rQ   rM   rM   rN   __eq__N   s    zFnError.__eq__c                 C  s   d| j  d| j dS )NzFnError(source=z, desc=)rJ   )rL   rM   rM   rN   __repr__S   s   zFnError.__repr__N)rC   rD   rE   rF   rG   rH   )rQ   rR   rG   rS   )rG   rF   )__name__
__module____qualname__rO   rU   rW   rM   rM   rM   rN   rB   I   s    

rB   fnr   rG   list[FnError]c                 C  s   g }t  }| jD ]@}|js|t|jr|jd n|dd |jdd D ]"}t|tr5|t|dd ||v rB|t|dd || q%q|	t
|  |rT|S t| }| jD ]}|jD ]}|| q`q[|jS )zNApplies validations to a given function ir and returns a list of errors found.zBlock not terminatedrJ   Nz%Block has operations after control opzFunc has a duplicate op)setblocks
terminatedappendrB   opsrT   r   addextendcheck_op_sources_valid	OpCheckeraccepterrors)r[   rh   op_setblockop
op_checkerrM   rM   rN   check_func_irW   s.   



rm   c                   @  s   e Zd ZdS )IrCheckExceptionN)rX   rY   rZ   rM   rM   rM   rN   rn   v   s    rn   rH   c                 C  s2   t | }|rtddt| dd |D  d S )Nz'Internal error: Generated invalid IR: 

c                 S  s   g | ]}|j |jfqS rM   rJ   ).0erM   rM   rN   
<listcomp>   s    z(assert_func_ir_valid.<locals>.<listcomp>)rm   rn   joinr2   )r[   rh   rM   rM   rN   assert_func_ir_validz   s   rt   c              
   C  s  g }t  }t  }| jD ]+}||j |jD ]}t|tr$||j qt|tr5t|j	t
r5||j	 qq|| j | jD ]D}|jD ]>}| D ]7}t|trSqKt|trl||vrk|t|dt|j d qKt|t
r||vr|t|d|jd qKqEq@|S )Nz#Invalid op reference to op of type rJ   z!Invalid op reference to register )r^   r_   updaterb   rT   r   rc   destr   srcr'   arg_regssourcesr   r$   ra   rB   typerX   name)r[   rh   	valid_opsvalid_registersrj   rk   rC   rM   rM   rN   re      sL   







re   rw   r6   rv   rS   c                   s   t  trtfdd jD S t  trMt tr1jtv r+ jtv r+j jkS j jkS t tr:t	 S t trKt fddjD S dS dS )z]Check if src can be assigned to dest_rtype.

    Currently okay to have false positives.
    c                 3  s    | ]}t  |V  qd S rI   can_coerce_to)rp   d)rw   rM   rN   	<genexpr>       z can_coerce_to.<locals>.<genexpr>c                 3  s    | ]}t | V  qd S rI   r~   )rp   s)rv   rM   rN   r      r   FT)
rT   r7   anyitemsr5   r{   disjoint_typessizer4   r<   )rw   rv   rM   )rv   rw   rN   r      s   




r   c                   @  s  e Z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dd'd(Zdd*d+Zdd-d.Zdd0d1Zdd3d4Zdd7d8Zdd:d;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Z*dddZ+dddZ,dddZ-dddZ.dddZ/dddZ0dS )rf   	parent_fnr   rG   rH   c                 C  s   || _ g | _d S rI   )r   rh   )rL   r   rM   rM   rN   rO      rP   zOpChecker.__init__rC   r$   rE   rF   c                 C  s   | j t||d d S )NrJ   )rh   ra   rB   rK   rM   rM   rN   fail   s   zOpChecker.failrk   r   c                 C  s4   |  D ]}|| jjvr| j|d|j d qd S )Nz"Invalid control operation target: rJ   )targetsr   r_   r   label)rL   rk   targetrM   rM   rN   check_control_op_targets   s
   z"OpChecker.check_control_op_targetsrw   r6   rv   c                 C  s0   t ||s| j|d|j d|j d d S d S )NzCannot coerce source type z to dest type rJ   r   r   r{   )rL   rk   rw   rv   rM   rM   rN   check_type_coercion   s
   

zOpChecker.check_type_coerciontr   c                 C  s:   t ||r
t ||s| j||j d|j dd d S d S )Nz and z are not compatiblerJ   r   )rL   rk   r   r   rM   rM   rN   check_compatibility   s   "zOpChecker.check_compatibilityvr1   c                 C  s(   t |js| |d|j d d S d S )NzFloat expected (actual type is rV   r;   rz   r   rL   rk   r   rM   rM   rN   expect_float   s   
zOpChecker.expect_floatc                 C  s   t |jr| |d d S d S )NzFloat not expectedr   r   rM   rM   rN   expect_non_float   s   
zOpChecker.expect_non_floatr   c                 C     |  | d S rI   r   rL   rk   rM   rM   rN   
visit_goto      zOpChecker.visit_gotor
   c                 C  r   rI   r   r   rM   rM   rN   visit_branch   r   zOpChecker.visit_branchr(   c                 C  s   |  ||jj| jjjj d S rI   )r   valuerz   r   declsigret_typer   rM   rM   rN   visit_return   s   zOpChecker.visit_returnr0   c                 C     d S rI   rM   r   rM   rM   rN   visit_unreachable   s   zOpChecker.visit_unreachabler   c                 C  s   |  ||jj|jj d S rI   )r   rw   rz   rv   r   rM   rM   rN   visit_assign   s   zOpChecker.visit_assignr   c                 C  s8   |j D ]}t|jjtsJ | ||j|jjj qd S rI   )rw   rT   rv   rz   r3   r   	item_type)rL   rk   rw   rM   rM   rN   visit_assign_multi   s   
zOpChecker.visit_assign_multir   c                 C  r   rI   rM   r   rM   rM   rN   visit_load_error_value  s   z OpChecker.visit_load_error_valuer    tuple[object, ...]c              
   C  s\   |D ])}|d ur t |tttttttfs | |dt	| d t |tr+| 
|| qd S )Nz(Invalid type for item of tuple literal: rV   )rT   rF   bytesrS   intfloatcomplextupler   rz    check_tuple_items_valid_literals)rL   rk   r   xrM   rM   rN   r     s    
z*OpChecker.check_tuple_items_valid_literalsfrozenset[object]c              	   C  s^   |D ]*}|d u st |ttttttfrqt |tr | || q| 	|dt
| d qd S )Nz,Invalid type for item of frozenset literal: rV   )rT   rF   r   rS   r   r   r   r   r   r   rz   )rL   rk   r   r   rM   rM   rN   $check_frozenset_items_valid_literals  s   
z.OpChecker.check_frozenset_items_valid_literalsc                 C  s  d }|j d u r
d}nUt|j trd}nLt|j trd}nCt|j tr%d}n:t|j tr.d}n1t|j tr7d}n(t|j tr@d}nt|j trPd}| 	||j  nt|j t
r_d}| ||j  |d usgJ d|jj|dfvr| |d	| d
|jj  d S d S )Nzbuiltins.objectzbuiltins.intzbuiltins.strzbuiltins.byteszbuiltins.floatzbuiltins.tuplezbuiltins.setz#Missed a case for LoadLiteral checkz/Invalid literal value for type: value has type z, but op has type )r   rT   r   rF   r   rS   r   r   r   r   	frozensetr   rz   r{   r   )rL   rk   expected_typerM   rM   rN   visit_load_literal  s@   
zOpChecker.visit_load_literalr   c                 C  r   rI   rM   r   rM   rM   rN   visit_get_attr=     zOpChecker.visit_get_attrr)   c                 C  r   rI   rM   r   rM   rM   rN   visit_set_attrA  r   zOpChecker.visit_set_attrr"   c                 C  r   rI   rM   r   rM   rM   rN   visit_load_staticF     zOpChecker.visit_load_staticr   c                 C  r   rI   rM   r   rM   rM   rN   visit_init_staticI  r   zOpChecker.visit_init_staticr,   c                 C  r   rI   rM   r   rM   rM   rN   visit_tuple_getL  r   zOpChecker.visit_tuple_getr-   c                 C  r   rI   rM   r   rM   rM   rN   visit_tuple_setP  r   zOpChecker.visit_tuple_setr   c                 C  r   rI   rM   r   rM   rM   rN   visit_inc_refT  r   zOpChecker.visit_inc_refr   c                 C  r   rI   rM   r   rM   rM   rN   visit_dec_refX  r   zOpChecker.visit_dec_refr   c                 C  s2   t |j|jjjD ]\}}| ||j|j q	d S rI   )zipargsr[   r   r   rz   )rL   rk   	arg_valuearg_runtimerM   rM   rN   
visit_call\  s   zOpChecker.visit_callr#   c                 C  s   |j j|j}|jtkrd}nd}t|j| t|jjkr%| 	|d t
|j|jj|d  D ]\}}| ||j|j q1d S )Nr      z)Incorrect number of args for method call.)receiver_typeclass_irmethod_declmethodkindr   lenr   r   r   r   r   rz   )rL   rk   r   
decl_indexr   r   rM   rM   rN   visit_method_callb  s   
 zOpChecker.visit_method_callr   c                 C  r   rI   rM   r   rM   rM   rN   
visit_castq  r   zOpChecker.visit_castr	   c                 C  r   rI   rM   r   rM   rM   rN   	visit_boxt  r   zOpChecker.visit_boxr/   c                 C  r   rI   rM   r   rM   rM   rN   visit_unboxw  r   zOpChecker.visit_unboxr&   c                 C  r   rI   rM   r   rM   rM   rN   visit_raise_standard_errorz  r   z$OpChecker.visit_raise_standard_errorr   c                 C  r   rI   rM   r   rM   rM   rN   visit_call_c}  r   zOpChecker.visit_call_cr+   c                 C  r   rI   rM   r   rM   rM   rN   visit_truncate  r   zOpChecker.visit_truncater   c                 C  r   rI   rM   r   rM   rM   rN   visit_extend  r   zOpChecker.visit_extendr   c                 C  r   rI   rM   r   rM   rM   rN   visit_load_global  r   zOpChecker.visit_load_globalr   c                 C      |  ||j |  ||j d S rI   )r   lhsrhsr   rM   rM   rN   visit_int_op     zOpChecker.visit_int_opr   c                 C  s6   |  ||jj|jj | ||j | ||j d S rI   )r   r   rz   r   r   r   rM   rM   rN   visit_comparison_op  s   zOpChecker.visit_comparison_opr   c                 C  r   rI   r   r   r   r   rM   rM   rN   visit_float_op  r   zOpChecker.visit_float_opr   c                 C  s   |  ||j d S rI   )r   rw   r   rM   rM   rN   visit_float_neg  s   zOpChecker.visit_float_negr   c                 C  r   rI   r   r   rM   rM   rN   visit_float_comparison_op  r   z#OpChecker.visit_float_comparison_opr!   c                 C  r   rI   rM   r   rM   rM   rN   visit_load_mem  r   zOpChecker.visit_load_memr*   c                 C  r   rI   rM   r   rM   rM   rN   visit_set_mem  r   zOpChecker.visit_set_memr   c                 C  r   rI   rM   r   rM   rM   rN   visit_get_element_ptr  r   zOpChecker.visit_get_element_ptrr   c                 C  r   rI   rM   r   rM   rM   rN   visit_load_address  r   zOpChecker.visit_load_addressr   c                 C  r   rI   rM   r   rM   rM   rN   visit_keep_alive  r   zOpChecker.visit_keep_aliver.   c                 C  r   rI   rM   r   rM   rM   rN   visit_unborrow  r   zOpChecker.visit_unborrowN)r   r   rG   rH   )rC   r$   rE   rF   rG   rH   )rk   r   rG   rH   )rk   r$   rw   r6   rv   r6   rG   rH   )rk   r$   r   r6   r   r6   rG   rH   )rk   r$   r   r1   rG   rH   )rk   r   rG   rH   )rk   r
   rG   rH   )rk   r(   rG   rH   )rk   r0   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r    r   r   rG   rH   )rk   r    r   r   rG   rH   )rk   r    rG   rH   )rk   r   rG   rH   )rk   r)   rG   rH   )rk   r"   rG   rH   )rk   r   rG   rH   )rk   r,   rG   rH   )rk   r-   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r#   rG   rH   )rk   r   rG   rH   )rk   r	   rG   rH   )rk   r/   rG   rH   )rk   r&   rG   rH   )rk   r   rG   rH   )rk   r+   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r!   rG   rH   )rk   r*   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r   rG   rH   )rk   r.   rG   rH   )1rX   rY   rZ   rO   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   r   r   r   r   r   r   r   r   r   r   rM   rM   rM   rN   rf      s^    
















	
"


























rf   N)r[   r   rG   r\   )r[   r   rG   rH   )rw   r6   rv   r6   rG   rS   )P__doc__
__future__r   mypyc.ir.func_irr   r   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(   r)   r*   r+   r,   r-   r.   r/   r0   r1   mypyc.ir.pprintr2   mypyc.ir.rtypesr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rm   	Exceptionrn   rt   re   r{   r   r   rf   rM   rM   rM   rN   <module>   s,    /D


	)
