
    i=                    h   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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP  G d d          ZQd dZR G d deS          ZTd!dZUd dZVeEjW        eCjW        eOjW        eDjW        eKjW        eNjW        ePjW        eMjW        h eXe<          z  ZYd"dZZd#dZ[d$dZ\ G d de)d                   Z]dS )%z@Utilities for checking that internal ir is valid and consistent.    )annotations)FUNC_STATICMETHODFuncIR)2AssignAssignMulti
BaseAssign
BasicBlockBoxBranchCallCallCCastComparisonOp	ControlOpDecRefExtendFloatFloatComparisonOpFloatNegFloatOpGetAttr
GetElementGetElementPtrGotoIncRef
InitStaticIntegerIntOp	KeepAliveLoadAddressLoadErrorValue
LoadGlobalLoadLiteralLoadMem
LoadStatic
MethodCallOp	OpVisitorPrimitiveOpRaiseStandardErrorRegisterReturnSetAttr
SetElementSetMemTruncateTupleGetTupleSetUnborrowUnboxUndefUnreachableValue)format_func)KNOWN_NATIVE_TYPESRArray	RInstance
RPrimitiveRTypeRUnionRVecbytes_rprimitivedict_rprimitiveint_rprimitiveis_c_py_ssize_t_rprimitiveis_fixed_width_rtypeis_float_rprimitiveis_object_rprimitiveis_pointer_rprimitivelist_rprimitivepointer_rprimitiverange_rprimitiveset_rprimitivestr_rprimitivetuple_rprimitivec                  &    e Zd ZddZddZddZdS )FnErrorsourceOp | BasicBlockdescstrreturnNonec                "    || _         || _        d S NrP   rR   selfrP   rR   s      U/root/projects/qq-shell/venv/lib64/python3.11/site-packages/mypyc/analysis/ircheck.py__init__zFnError.__init__U   s    			    otherobjectboolc                l    t          |t                    o| j        |j        k    o| j        |j        k    S rW   )
isinstancerO   rP   rR   )rZ   r^   s     r[   __eq__zFnError.__eq__Y   s2    ug&&b4;%,+Fb49X]XbKb	
r]   c                (    d| j          d| j         dS )NzFnError(source=z, desc=)rX   )rZ   s    r[   __repr__zFnError.__repr__^   s    AAATYAAAAr]   N)rP   rQ   rR   rS   rT   rU   )r^   r_   rT   r`   )rT   rS   )__name__
__module____qualname__r\   rc   rf    r]   r[   rO   rO   T   sV           
 
 
 

B B B B B Br]   rO   fnr   rT   list[FnError]c                   g }t                      }| j        D ]}|j        s8|                    t	          |j        r|j        d         n|d                     |j        dd         D ]x}t          |t                    r$|                    t	          |d                     ||v r$|                    t	          |d                     |                    |           y|	                    t          |                      |r|S t          |           }| j        D ]!}|j        D ]}|                    |           "|j        S )zNApplies validations to a given function ir and returns a list of errors found.zBlock not terminatedrX   Nz%Block has operations after control opzFunc has a duplicate op)setblocks
terminatedappendrO   opsrb   r   addextendcheck_op_sources_valid	OpCheckeraccepterrors)rk   ry   op_setblockop
op_checkers         r[   check_func_irr~   b   sm   FUUF   	MM	Duy}}uKabbb   )CRC. 	 	B"i(( `gR6]^^^___V||gR6OPPPQQQJJrNNNN	 MM(,,--- 2J " ") 	" 	"BIIj!!!!	" r]   c                      e Zd ZdS )IrCheckExceptionN)rg   rh   ri   rj   r]   r[   r   r      s        Dr]   r   rU   c           
         t          |           }|r=t          dd                    t          | d |D                                 z             d S )Nz'Internal error: Generated invalid IR: 

c                *    g | ]}|j         |j        fS rj   rX   ).0es     r[   
<listcomp>z(assert_func_ir_valid.<locals>.<listcomp>   s!    (L(L(L!(AF);(L(L(Lr]   )r~   r   joinr8   )rk   ry   s     r[   assert_func_ir_validr      sd    2F 
6iiB(L(LV(L(L(LMMNNO
 
 	

 
r]   c                   g }t                      }t                      }| j        D ]}|                    |j                   |j        D ]{}t	          |t
                    r|                    |j                   2t	          |t                    r4t	          |j	        t                    r|                    |j	                   ||                    | j                   | j        D ]}|j        D ]}|                                D ]}t	          |t          t          t          f          r%t	          |t                     r>||vr9|                    t%          |dt'          |          j                              xt	          |t                    r0||vr,|                    t%          |d|j                             Ռ|S )Nz#Invalid op reference to op of type rX   z!Invalid op reference to register )ro   rp   updaters   rb   r   rt   destr    srcr+   arg_regssourcesr   r   r5   r'   rr   rO   typerg   name)rk   ry   	valid_opsvalid_registersr{   r|   rP   s          r[   rv   rv      s   FI%(UUO , ,###) 	, 	,B"j)) ,##BG,,,,B,, ,BFH1M1M ,##BF+++		, 2;'''  ) 	 	B**,,  fwu&=>> ++ Y..#')%b4PV<<K`%b%b      11 _44#')0cTZT_0c0c    	( Mr]   r   r=   r   r`   c                    t          t                    r t           fdj        D                       S t          t                    rt           t                    r< j        t          v rj        t          v r j        j        k    S  j        j        k    S t           t          t          f          rt                    S t           t                    r t          f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  8   K   | ]}t          |          V  d S rW   can_coerce_to)r   dr   s     r[   	<genexpr>z can_coerce_to.<locals>.<genexpr>   s-      ==Q=a((======r]   c              3  8   K   | ]}t          |          V  d S rW   r   )r   sr   s     r[   r   z can_coerce_to.<locals>.<genexpr>   s-      AA!}Q--AAAAAAr]   FT)rb   r>   anyitemsr<   r   disjoint_typessizer;   r?   rF   )r   r   s   ``r[   r   r      s   
 $ >====$*======$
## c:&& 	)x>))di>.I.Ix49,,8ty((cIt,-- 	.'---c6"" 	B AAAAsyAAAAAAu4r]   rtypec                    t          |           st          |           sdS t          | t                    sJ | j        t
          j        k    S )zCCheck if rtype is a valid displacement type for pointer arithmetic.F)rD   rC   rb   r<   r   rI   )r   s    r[   is_valid_ptr_displacement_typer      sN     '' +Ee+L+L ueZ(((((:+000r]   r|   r   c                   | j         t          j        t          j        fvrdS t	          | j                  sdS | j        j        }| j        j        }t	          |          rt          |          S t	          |          rt          |          S dS )zVCheck if op is add/subtract targeting pointer_rprimitive and integer of the same size.F)	r|   r   ADDSUBrG   r   lhsrhsr   )r|   leftrights      r[   is_pointer_arithmeticr      s    	uUY	***u )) u6;DFKET"" 5-e444U## 4-d3335r]   c                     e Zd ZdodZdpd
ZdqdZdrdZdsdZdtdZdtdZ	dtdZ
dudZdvdZdwdZdxd!Zdyd#Zdzd%Zd{d'Zd|d*Zd}d,Zd~d-Zdd/Zdd1Zdd3Zdd5Zdd7Zdd9Zdd;Zdd=Zdd?ZddAZddCZddEZ ddGZ!ddIZ"ddKZ#ddMZ$ddOZ%ddQZ&ddSZ'ddUZ(ddWZ)ddYZ*dd[Z+dd]Z,dd_Z-ddaZ.ddcZ/ddeZ0ddgZ1ddiZ2ddkZ3ddmZ4dnS )rw   	parent_fnr   rT   rU   c                "    || _         g | _        d S rW   )r   ry   )rZ   r   s     r[   r\   zOpChecker.__init__   s    "%'r]   rP   r'   rR   rS   c                X    | j                             t          ||                     d S )NrX   )ry   rr   rO   rY   s      r[   failzOpChecker.fail   s+    7&t<<<=====r]   r|   r   c                    |                                 D ]/}|| j        j        vr|                     |d|j                    0d S )Nz"Invalid control operation target: rX   )targetsr   rp   r   label)rZ   r|   targets      r[   check_control_op_targetsz"OpChecker.check_control_op_targets   sY    jjll 	_ 	_FT^222		*]v|*]*]	^^^	_ 	_r]   r   r=   r   c                x    t          ||          s)|                     |d|j         d|j                    d S d S )NzCannot coerce source type z to dest type rX   r   r   r   )rZ   r|   r   r   s       r[   check_type_coercionzOpChecker.check_type_coercion   s_    S$'' 	II `SX ` `UYU^ ` `      	 	r]   tr   c                    t          ||          rt          ||          s)|                     ||j         d|j         d           d S d S )Nz and z are not compatiblerX   r   )rZ   r|   r   r   s       r[   check_compatibilityzOpChecker.check_compatibility  sd    Q"" 	S-1*=*= 	SIIR&Q&Qaf&Q&Q&QIRRRRR	S 	Sr]   vr7   c                p    t          |j                  s!|                     |d|j         d           d S d S )NzFloat expected (actual type is re   rE   r   r   rZ   r|   r   s      r[   expect_floatzOpChecker.expect_float	  sI    "16** 	GIIbEAFEEEFFFFF	G 	Gr]   c                ^    t          |j                  r|                     |d           d S d S )NzFloat not expectedr   r   s      r[   expect_non_floatzOpChecker.expect_non_float  s9    qv&& 	0IIb./////	0 	0r]   c                    t          |j        t                    s2|                     |dt          |j                  j                    d S d S )NzRPrimitive expected, got )rb   r   r<   r   rg   r   s      r[   expect_primitive_typezOpChecker.expect_primitive_type  sQ    !&*-- 	OIIbMd16ll6KMMNNNNN	O 	Or]   r   c                0    |                      |           d S rW   r   rZ   r|   s     r[   
visit_gotozOpChecker.visit_goto      %%b)))))r]   r   c                0    |                      |           d S rW   r   r   s     r[   visit_branchzOpChecker.visit_branch  r   r]   r,   c                p    |                      ||j        j        | j        j        j        j                   d S rW   )r   valuer   r   declsigret_typer   s     r[   visit_returnzOpChecker.visit_return  s/      RX]DN4G4K4TUUUUUr]   r6   c                    d S rW   rj   r   s     r[   visit_unreachablezOpChecker.visit_unreachable  s	     	r]   r   c                \    |                      ||j        j        |j        j                   d S rW   )r   r   r   r   r   s     r[   visit_assignzOpChecker.visit_assign#  s(      RV["',?????r]   r   c                    |j         D ]N}t          |j        j        t                    sJ |                     ||j        |j        j        j                   Od S rW   )r   rb   r   r   r:   r   	item_type)rZ   r|   r   s      r[   visit_assign_multizOpChecker.visit_assign_multi&  s_    6 	K 	KCbglF33333$$R27<3IJJJJ	K 	Kr]   r!   c                    d S rW   rj   r   s     r[   visit_load_error_valuez OpChecker.visit_load_error_value+  s	     	r]   r#   tuple[object, ...]c                ,   |D ]}|at          |t          t          t          t          t
          t          t          f          s'|                     |dt          |           d           t          |t                    r| 
                    ||           d S )Nz(Invalid type for item of tuple literal: re   )rb   rS   bytesr`   intfloatcomplextupler   r    check_tuple_items_valid_literals)rZ   r|   r   xs       r[   r   z*OpChecker.check_tuple_items_valid_literals1  s     	= 	=A}ZCc5RY[`3a%b%b}		"SaSSSTTT!U## =55b!<<<		= 	=r]   frozenset[object]c           
     $   |D ]}|4t          |t          t          t          t          t
          t          f          r9t          |t                    r|                     ||           e| 	                    |dt          |           d           d S )Nz,Invalid type for item of frozenset literal: re   )rb   rS   r   r`   r   r   r   r   r   r   r   )rZ   r|   r   r   s       r[   $check_frozenset_items_valid_literalsz.OpChecker.check_frozenset_items_valid_literals8  s     	Y 	YAyJq3tS%*QRRyAu%% Y55b!<<<<		"WTRSWWWWWXXXX	Y 	Yr]   c                   d }|j         d}n t          |j         t                    rd}nt          |j         t                    rd}nt          |j         t                    rd}nt          |j         t
                    rd}nt          |j         t                    rd}not          |j         t                    rd}|                     ||j                    n7t          |j         t                    rd}| 
                    ||j                    |
J 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   rb   r   rS   r   r   r   r   r   	frozensetr   r   r   r   )rZ   r|   expected_types      r[   visit_load_literalzOpChecker.visit_load_literalA  s   8-MM#&& 	D*MM#&& 	D*MM%(( 	D,MM%(( 	D,MM'** 		D-MM%(( 	D,M11"bh????),, 	D +M55b"(CCC((*O(((7</@AAAIIH%H H9;H H     BAr]   r   c                    d S rW   rj   r   s     r[   visit_get_attrzOpChecker.visit_get_attra      r]   r-   c                    d S rW   rj   r   s     r[   visit_set_attrzOpChecker.visit_set_attre  r   r]   r%   c                    d S rW   rj   r   s     r[   visit_load_staticzOpChecker.visit_load_staticj      r]   r   c                    d S rW   rj   r   s     r[   visit_init_staticzOpChecker.visit_init_staticm  r   r]   r1   c                    d S rW   rj   r   s     r[   visit_tuple_getzOpChecker.visit_tuple_getp  r   r]   r2   c                    d S rW   rj   r   s     r[   visit_tuple_setzOpChecker.visit_tuple_sett  r   r]   r   c                    d S rW   rj   r   s     r[   visit_inc_refzOpChecker.visit_inc_refx  r   r]   r   c                    d S rW   rj   r   s     r[   visit_dec_refzOpChecker.visit_dec_ref|  r   r]   r   c                    t          |j        |j        j        j                  D ]&\  }}|                     ||j        |j                   'd S rW   )zipargsrk   r   r   r   )rZ   r|   	arg_valuearg_runtimes       r[   
visit_callzOpChecker.visit_call  sX     '*"'259>&B&B 	K 	K"I{$$R9IJJJJ	K 	Kr]   r&   c                   |j         j                            |j                  }|j        t
          k    rd}nd}t          |j                  |z   t          |j        j                  k    r| 	                    |d           t          |j        |j        j        |d                    D ]&\  }}|                     ||j        |j                   'd S )Nr      z)Incorrect number of args for method call.)receiver_typeclass_irmethod_declmethodkindr   lenr   r   r   r   r   r   )rZ   r|   r  
decl_indexr   r   s         r[   visit_method_callzOpChecker.visit_method_call  s    &/;;BIFF000JJJrw<<*$KO,@(A(AAAIIbEFFF '*"';?3G
3T&U&U 	K 	K"I{$$R9IJJJJ	K 	Kr]   r   c                    d S rW   rj   r   s     r[   
visit_castzOpChecker.visit_cast  r   r]   r
   c                    d S rW   rj   r   s     r[   	visit_boxzOpChecker.visit_box  r   r]   r4   c                    d S rW   rj   r   s     r[   visit_unboxzOpChecker.visit_unbox  r   r]   r*   c                    d S rW   rj   r   s     r[   visit_raise_standard_errorz$OpChecker.visit_raise_standard_error  r   r]   r   c                    d S rW   rj   r   s     r[   visit_call_czOpChecker.visit_call_c  r   r]   r)   c                    d S rW   rj   r   s     r[   visit_primitive_opzOpChecker.visit_primitive_op  r   r]   r0   c                    d S rW   rj   r   s     r[   visit_truncatezOpChecker.visit_truncate  r   r]   r   c                    d S rW   rj   r   s     r[   visit_extendzOpChecker.visit_extend  r   r]   r"   c                    d S rW   rj   r   s     r[   visit_load_globalzOpChecker.visit_load_global  r   r]   r   c                D   |                      ||j                   |                      ||j                   |                     ||j                   |                     ||j                   |j        j        }|j        j        }|j        |j                 }t          |t                    rjt          |t                    rW|j	        |j	        k    rI|dv s|dvrE|j
        |j
        k    r7t          |          s$|                     |d| d|            d S d S d S d S d S d S d S )N)+-*/%)z<<z>>'Operand types have incompatible signs: , )r   r   r   r   r   op_strr|   rb   r<   	is_signedr   r   r   )rZ   r|   r   r   r%  s        r[   visit_int_opzOpChecker.visit_int_op  sQ   ""2rv...""2rv...b"&)))b"&)))v{25!tZ((
	U5*--
	U %/11333,..49
3J3J)"-- 4K IIbSDSSESSTTTTT
	U 
	U 
	U 
	U 21 4K3J..3J3Jr]   r   c                   |                      ||j        j        |j        j                   |                     ||j                   |                     ||j                   |j        j        }|j        j        }t          |t                    rCt          |t                    r0|j        |j        k    r"|                     |d| d|            d S d S d S d S )Nr#  r$  )	r   r   r   r   r   rb   r<   r&  r   )rZ   r|   r   r   s       r[   visit_comparison_opzOpChecker.visit_comparison_op  s      RV["&+>>>b"&)))b"&)))v{tZ((	U5*--	U %/11IIbSDSSESSTTTTT	U 	U 	U 	U 21r]   r   c                r    |                      ||j                   |                      ||j                   d S rW   r   r   r   r   s     r[   visit_float_opzOpChecker.visit_float_op  8    "bf%%%"bf%%%%%r]   r   c                <    |                      ||j                   d S rW   )r   r   r   s     r[   visit_float_negzOpChecker.visit_float_neg  s     "bf%%%%%r]   r   c                r    |                      ||j                   |                      ||j                   d S rW   r+  r   s     r[   visit_float_comparison_opz#OpChecker.visit_float_comparison_op  r-  r]   r$   c                    d S rW   rj   r   s     r[   visit_load_memzOpChecker.visit_load_mem  r   r]   r/   c                    d S rW   rj   r   s     r[   visit_set_memzOpChecker.visit_set_mem  r   r]   r   c                    d S rW   rj   r   s     r[   visit_get_elementzOpChecker.visit_get_element  r   r]   r   c                    d S rW   rj   r   s     r[   visit_get_element_ptrzOpChecker.visit_get_element_ptr  r   r]   r.   c                    d S rW   rj   r   s     r[   visit_set_elementzOpChecker.visit_set_element  r   r]   r    c                    d S rW   rj   r   s     r[   visit_load_addresszOpChecker.visit_load_address  r   r]   r   c                    d S rW   rj   r   s     r[   visit_keep_alivezOpChecker.visit_keep_alive  r   r]   r3   c                    d S rW   rj   r   s     r[   visit_unborrowzOpChecker.visit_unborrow  r   r]   N)r   r   rT   rU   )rP   r'   rR   rS   rT   rU   )r|   r   rT   rU   )r|   r'   r   r=   r   r=   rT   rU   )r|   r'   r   r=   r   r=   rT   rU   )r|   r'   r   r7   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r,   rT   rU   )r|   r6   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r!   rT   rU   )r|   r#   r   r   rT   rU   )r|   r#   r   r   rT   rU   )r|   r#   rT   rU   )r|   r   rT   rU   )r|   r-   rT   rU   )r|   r%   rT   rU   )r|   r   rT   rU   )r|   r1   rT   rU   )r|   r2   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r&   rT   rU   )r|   r   rT   rU   )r|   r
   rT   rU   )r|   r4   rT   rU   )r|   r*   rT   rU   )r|   r   rT   rU   )r|   r)   rT   rU   )r|   r0   rT   rU   )r|   r   rT   rU   )r|   r"   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r$   rT   rU   )r|   r/   rT   rU   )r|   r   rT   rU   )r|   r   rT   rU   )r|   r.   rT   rU   )r|   r    rT   rU   )r|   r   rT   rU   )r|   r3   rT   rU   )5rg   rh   ri   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/  r1  r3  r5  r7  r9  r;  r=  r?  rA  rj   r]   r[   rw   rw      s-       ( ( ( (> > > >_ _ _ _
   S S S SG G G G0 0 0 0O O O O* * * ** * * *V V V V   
@ @ @ @K K K K
   = = = =Y Y Y Y   @      
                  K K K KK K K K                           U U U U(U U U U& & & && & & && & & &                          r]   rw   N)rk   r   rT   rl   )rk   r   rT   rU   )r   r=   r   r=   rT   r`   )r   r=   rT   r`   )r|   r   rT   r`   )^__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/   r0   r1   r2   r3   r4   r5   r6   r7   mypyc.ir.pprintr8   mypyc.ir.rtypesr9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rO   r~   	Exceptionr   r   rv   r   ro   r   r   r   r   rw   rj   r]   r[   <module>rI     s   F F " " " " " " 6 6 6 6 6 6 6 63 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3h ( ' ' ' ' '                                             2B B B B B B B B   >	 	 	 	 	y 	 	 	
 
 
 
% % % %R 	 C	   21 1 1 1   @ @ @ @ @	$ @ @ @ @ @r]   