o
    2g4                     @  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/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF G dd dZGdddZHG dd deIZJd ddZKdddZLe?jMe=jMeEjMe>jMeBjMeDjMeFjMeCjMhZNd!ddZOG dd de'd ZPd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PrimitiveOp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rD   rF   selfrD   rF    rN   N/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/analysis/ircheck.py__init__K      
zFnError.__init__otherobjectboolc                 C  s"   t |to| j|jko| j|jkS rJ   )
isinstancerC   rD   rF   )rM   rR   rN   rN   rO   __eq__O   s    zFnError.__eq__c                 C  s   d| j  d| j dS )NzFnError(source=z, desc=)rK   )rM   rN   rN   rO   __repr__T   s   zFnError.__repr__N)rD   rE   rF   rG   rH   rI   )rR   rS   rH   rT   )rH   rG   )__name__
__module____qualname__rP   rV   rX   rN   rN   rN   rO   rC   J   s    

rC   fnr   rH   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 terminatedrK   Nz%Block has operations after control opzFunc has a duplicate op)setblocks
terminatedappendrC   opsrU   r   addextendcheck_op_sources_valid	OpCheckeraccepterrors)r\   ri   op_setblockop
op_checkerrN   rN   rO   check_func_irX   s.   



rn   c                   @  s   e Zd ZdS )IrCheckExceptionN)rY   rZ   r[   rN   rN   rN   rO   ro   w   s    ro   rI   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 rN   rK   ).0erN   rN   rO   
<listcomp>   s    z(assert_func_ir_valid.<locals>.<listcomp>)rn   ro   joinr3   )r\   ri   rN   rN   rO   assert_func_ir_valid{   s   ru   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 rK   z!Invalid op reference to register )r_   r`   updaterc   rU   r   rd   destr   srcr(   arg_regssourcesr   r$   rb   rC   typerY   name)r\   ri   	valid_opsvalid_registersrk   rl   rD   rN   rN   rO   rf      sL   







rf   rx   r7   rw   rT   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 rJ   can_coerce_to)rq   d)rx   rN   rO   	<genexpr>       z can_coerce_to.<locals>.<genexpr>c                 3  s    | ]}t | V  qd S rJ   r   )rq   s)rw   rN   rO   r      r   FT)
rU   r8   anyitemsr6   r|   disjoint_typessizer5   r=   )rx   rw   rN   )rw   rx   rO   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Z0dddZ1dS )rg   	parent_fnr   rH   rI   c                 C  s   || _ g | _d S rJ   )r   ri   )rM   r   rN   rN   rO   rP      rQ   zOpChecker.__init__rD   r$   rF   rG   c                 C  s   | j t||d d S )NrK   )ri   rb   rC   rL   rN   rN   rO   fail   s   zOpChecker.failrl   r   c                 C  s4   |  D ]}|| jjvr| j|d|j d qd S )Nz"Invalid control operation target: rK   )targetsr   r`   r   label)rM   rl   targetrN   rN   rO   check_control_op_targets   s
   z"OpChecker.check_control_op_targetsrx   r7   rw   c                 C  s0   t ||s| j|d|j d|j d d S d S )NzCannot coerce source type z to dest type rK   r   r   r|   )rM   rl   rx   rw   rN   rN   rO   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 compatiblerK   r   )rM   rl   r   r   rN   rN   rO   check_compatibility   s   "zOpChecker.check_compatibilityvr2   c                 C  s(   t |js| |d|j d d S d S )NzFloat expected (actual type is rW   r<   r{   r   rM   rl   r   rN   rN   rO   expect_float   s   
zOpChecker.expect_floatc                 C  s   t |jr| |d d S d S )NzFloat not expectedr   r   rN   rN   rO   expect_non_float   s   
zOpChecker.expect_non_floatr   c                 C     |  | d S rJ   r   rM   rl   rN   rN   rO   
visit_goto      zOpChecker.visit_gotor
   c                 C  r   rJ   r   r   rN   rN   rO   visit_branch   r   zOpChecker.visit_branchr)   c                 C  s   |  ||jj| jjjj d S rJ   )r   valuer{   r   declsigret_typer   rN   rN   rO   visit_return   s   zOpChecker.visit_returnr1   c                 C     d S rJ   rN   r   rN   rN   rO   visit_unreachable   s   zOpChecker.visit_unreachabler   c                 C  s   |  ||jj|jj d S rJ   )r   rx   r{   rw   r   rN   rN   rO   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 rJ   )rx   rU   rw   r{   r4   r   	item_type)rM   rl   rx   rN   rN   rO   visit_assign_multi  s   
zOpChecker.visit_assign_multir   c                 C  r   rJ   rN   r   rN   rN   rO   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: rW   )rU   rG   bytesrT   intfloatcomplextupler   r{    check_tuple_items_valid_literals)rM   rl   r   xrN   rN   rO   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: rW   )rU   rG   r   rT   r   r   r   r   r   r   r{   )rM   rl   r   r   rN   rN   rO   $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   rU   r   rG   r   rT   r   r   r   r   	frozensetr   r{   r|   r   )rM   rl   expected_typerN   rN   rO   visit_load_literal  s@   
zOpChecker.visit_load_literalr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_get_attr>     zOpChecker.visit_get_attrr*   c                 C  r   rJ   rN   r   rN   rN   rO   visit_set_attrB  r   zOpChecker.visit_set_attrr"   c                 C  r   rJ   rN   r   rN   rN   rO   visit_load_staticG     zOpChecker.visit_load_staticr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_init_staticJ  r   zOpChecker.visit_init_staticr-   c                 C  r   rJ   rN   r   rN   rN   rO   visit_tuple_getM  r   zOpChecker.visit_tuple_getr.   c                 C  r   rJ   rN   r   rN   rN   rO   visit_tuple_setQ  r   zOpChecker.visit_tuple_setr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_inc_refU  r   zOpChecker.visit_inc_refr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_dec_refY  r   zOpChecker.visit_dec_refr   c                 C  s2   t |j|jjjD ]\}}| ||j|j q	d S rJ   )zipargsr\   r   r   r{   )rM   rl   	arg_valuearg_runtimerN   rN   rO   
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   r{   )rM   rl   r   
decl_indexr   r   rN   rN   rO   visit_method_callc  s   
 zOpChecker.visit_method_callr   c                 C  r   rJ   rN   r   rN   rN   rO   
visit_castr  r   zOpChecker.visit_castr	   c                 C  r   rJ   rN   r   rN   rN   rO   	visit_boxu  r   zOpChecker.visit_boxr0   c                 C  r   rJ   rN   r   rN   rN   rO   visit_unboxx  r   zOpChecker.visit_unboxr'   c                 C  r   rJ   rN   r   rN   rN   rO   visit_raise_standard_error{  r   z$OpChecker.visit_raise_standard_errorr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_call_c~  r   zOpChecker.visit_call_cr&   c                 C  r   rJ   rN   r   rN   rN   rO   visit_primitive_op  r   zOpChecker.visit_primitive_opr,   c                 C  r   rJ   rN   r   rN   rN   rO   visit_truncate  r   zOpChecker.visit_truncater   c                 C  r   rJ   rN   r   rN   rN   rO   visit_extend  r   zOpChecker.visit_extendr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_load_global  r   zOpChecker.visit_load_globalr   c                 C      |  ||j |  ||j d S rJ   )r   lhsrhsr   rN   rN   rO   visit_int_op     zOpChecker.visit_int_opr   c                 C  s6   |  ||jj|jj | ||j | ||j d S rJ   )r   r   r{   r   r   r   rN   rN   rO   visit_comparison_op  s   zOpChecker.visit_comparison_opr   c                 C  r   rJ   r   r   r   r   rN   rN   rO   visit_float_op  r   zOpChecker.visit_float_opr   c                 C  s   |  ||j d S rJ   )r   rx   r   rN   rN   rO   visit_float_neg  s   zOpChecker.visit_float_negr   c                 C  r   rJ   r   r   rN   rN   rO   visit_float_comparison_op  r   z#OpChecker.visit_float_comparison_opr!   c                 C  r   rJ   rN   r   rN   rN   rO   visit_load_mem  r   zOpChecker.visit_load_memr+   c                 C  r   rJ   rN   r   rN   rN   rO   visit_set_mem  r   zOpChecker.visit_set_memr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_get_element_ptr  r   zOpChecker.visit_get_element_ptrr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_load_address  r   zOpChecker.visit_load_addressr   c                 C  r   rJ   rN   r   rN   rN   rO   visit_keep_alive  r   zOpChecker.visit_keep_aliver/   c                 C  r   rJ   rN   r   rN   rN   rO   visit_unborrow  r   zOpChecker.visit_unborrowN)r   r   rH   rI   )rD   r$   rF   rG   rH   rI   )rl   r   rH   rI   )rl   r$   rx   r7   rw   r7   rH   rI   )rl   r$   r   r7   r   r7   rH   rI   )rl   r$   r   r2   rH   rI   )rl   r   rH   rI   )rl   r
   rH   rI   )rl   r)   rH   rI   )rl   r1   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r    r   r   rH   rI   )rl   r    r   r   rH   rI   )rl   r    rH   rI   )rl   r   rH   rI   )rl   r*   rH   rI   )rl   r"   rH   rI   )rl   r   rH   rI   )rl   r-   rH   rI   )rl   r.   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r#   rH   rI   )rl   r   rH   rI   )rl   r	   rH   rI   )rl   r0   rH   rI   )rl   r'   rH   rI   )rl   r   rH   rI   )rl   r&   rH   rI   )rl   r,   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r!   rH   rI   )rl   r+   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r   rH   rI   )rl   r/   rH   rI   )2rY   rZ   r[   rP   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   r   rN   rN   rN   rO   rg      s`    
















	
"



























rg   N)r\   r   rH   r]   )r\   r   rH   rI   )rx   r7   rw   r7   rH   rT   )Q__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   r2   mypyc.ir.pprintr3   mypyc.ir.rtypesr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rn   	Exceptionro   ru   rf   r|   r   r   rg   rN   rN   rN   rO   <module>   s,    0D


	)
