
    X-Ph4                       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          ZGddZH G d deI          ZJddZKddZLe?jM        e=jM        eEjM        e>jM        eBjM        eDjM        eFjM        eCjM        hZNddZO G 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                  &    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rF   rH   selfrF   rH   s      V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/analysis/ircheck.py__init__zFnError.__init__K   s    			    otherobjectboolc                l    t          |t                    o| j        |j        k    o| j        |j        k    S rM   )
isinstancerE   rF   rH   )rP   rT   s     rQ   __eq__zFnError.__eq__O   s2    ug&&b4;%,+Fb49X]XbKb	
rS   c                (    d| j          d| j         dS )NzFnError(source=z, desc=)rN   )rP   s    rQ   __repr__zFnError.__repr__T   s    AAATYAAAArS   N)rF   rG   rH   rI   rJ   rK   )rT   rU   rJ   rV   )rJ   rI   )__name__
__module____qualname__rR   rY   r\    rS   rQ   rE   rE   J   sV           
 
 
 

B B B B B BrS   rE   fnr   rJ   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 terminatedrN   Nz%Block has operations after control opzFunc has a duplicate op)setblocks
terminatedappendrE   opsrX   r   addextendcheck_op_sources_valid	OpCheckeraccepterrors)ra   ro   op_setblockop
op_checkers         rQ   check_func_irrt   X   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!!!!	" rS   c                      e Zd ZdS )IrCheckExceptionN)r]   r^   r_   r`   rS   rQ   rv   rv   w   s        DrS   rv   rK   c           
         t          |           }|r=t          dd                    t          | d |D                                 z             d S )Nz'Internal error: Generated invalid IR: 

c                *    g | ]}|j         |j        fS r`   rN   ).0es     rQ   
<listcomp>z(assert_func_ir_valid.<locals>.<listcomp>   s!    (L(L(L!(AF);(L(L(LrS   )rt   rv   joinr4   )ra   ro   s     rQ   assert_func_ir_validr~   {   sd    2F 
6iiB(L(LV(L(L(LMMNNO
 
 	

 
rS   c                v   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                    rt	          |t                    r>||vr9|                    t!          |dt#          |          j                              kt	          |t                    r0||vr,|                    t!          |d|j                             Ȍ|S )Nz#Invalid op reference to op of type rN   z!Invalid op reference to register )re   rf   updateri   rX   r   rj   destr   srcr)   arg_regssourcesr   r%   rh   rE   typer]   name)ra   ro   	valid_opsvalid_registersrq   rr   rF   s          rQ   rl   rl      s   FI%(UUO , ,###) 	, 	,B"j)) ,##BG,,,,B,, ,BFH1M1M ,##BF+++		, 2;'''  ) 	 	B**,,  fg.. ++ Y..#')%b4PV<<K`%b%b      11 _44#')0cTZT_0c0c    	( MrS   r   r8   r   rV   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                    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 rM   can_coerce_to)rz   dr   s     rQ   	<genexpr>z can_coerce_to.<locals>.<genexpr>   s-      ==Q=a((======rS   c              3  8   K   | ]}t          |          V  d S rM   r   )rz   sr   s     rQ   r   z can_coerce_to.<locals>.<genexpr>   s-      AA!}Q--AAAAAArS   FT)
rX   r9   anyitemsr7   r   disjoint_typessizer6   r>   )r   r   s   ``rQ   r   r      s    
 $ >====$*======$
## c:&& 	)x>))di>.I.Ix49,,8ty((c9%% 	.'---c6"" 	B AAAAsyAAAAAAu4rS   c                     e Zd ZdjdZdkd
ZdldZdmdZdndZdodZdodZ	dpdZ
dqdZdrdZdsd Zdtd"Zdud$Zdvd&Zdwd)Zdxd+Zdyd,Zdzd.Zd{d0Zd|d2Zd}d4Zd~d6Zdd8Zdd:Zdd<Zdd>Zdd@ZddBZddDZddFZ ddHZ!ddJZ"ddLZ#ddNZ$ddPZ%ddRZ&ddTZ'ddVZ(ddXZ)ddZZ*dd\Z+dd^Z,dd`Z-ddbZ.dddZ/ddfZ0ddhZ1diS )rm   	parent_fnr   rJ   rK   c                "    || _         g | _        d S rM   )r   ro   )rP   r   s     rQ   rR   zOpChecker.__init__   s    "%'rS   rF   r%   rH   rI   c                X    | j                             t          ||                     d S )NrN   )ro   rh   rE   rO   s      rQ   failzOpChecker.fail   s+    7&t<<<=====rS   rr   r   c                    |                                 D ]/}|| j        j        vr|                     |d|j                    0d S )Nz"Invalid control operation target: rN   )targetsr   rf   r   label)rP   rr   targets      rQ   check_control_op_targetsz"OpChecker.check_control_op_targets   sY    jjll 	_ 	_FT^222		*]v|*]*]	^^^	_ 	_rS   r   r8   r   c                x    t          ||          s)|                     |d|j         d|j                    d S d S )NzCannot coerce source type z to dest type rN   r   r   r   )rP   rr   r   r   s       rQ   check_type_coercionzOpChecker.check_type_coercion   s_    S$'' 	II `SX ` `UYU^ ` `      	 	rS   tr   c                    t          ||          rt          ||          s)|                     ||j         d|j         d           d S d S )Nz and z are not compatiblerN   r   )rP   rr   r   r   s       rQ   check_compatibilityzOpChecker.check_compatibility   sd    Q"" 	S-1*=*= 	SIIR&Q&Qaf&Q&Q&QIRRRRR	S 	SrS   vr3   c                p    t          |j                  s!|                     |d|j         d           d S d S )NzFloat expected (actual type is r[   r=   r   r   rP   rr   r   s      rQ   expect_floatzOpChecker.expect_float   sI    "16** 	GIIbEAFEEEFFFFF	G 	GrS   c                ^    t          |j                  r|                     |d           d S d S )NzFloat not expectedr   r   s      rQ   expect_non_floatzOpChecker.expect_non_float   s9    qv&& 	0IIb./////	0 	0rS   r   c                0    |                      |           d S rM   r   rP   rr   s     rQ   
visit_gotozOpChecker.visit_goto       %%b)))))rS   r   c                0    |                      |           d S rM   r   r   s     rQ   visit_branchzOpChecker.visit_branch   r   rS   r*   c                p    |                      ||j        j        | j        j        j        j                   d S rM   )r   valuer   r   declsigret_typer   s     rQ   visit_returnzOpChecker.visit_return   s/      RX]DN4G4K4TUUUUUrS   r2   c                    d S rM   r`   r   s     rQ   visit_unreachablezOpChecker.visit_unreachable   s	     	rS   r   c                \    |                      ||j        j        |j        j                   d S rM   )r   r   r   r   r   s     rQ   visit_assignzOpChecker.visit_assign   s(      RV["',?????rS   r   c                    |j         D ]N}t          |j        j        t                    sJ |                     ||j        |j        j        j                   Od S rM   )r   rX   r   r   r5   r   	item_type)rP   rr   r   s      rQ   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rS   r   c                    d S rM   r`   r   s     rQ   visit_load_error_valuez OpChecker.visit_load_error_value  s	     	rS   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: r[   )rX   rI   bytesrV   intfloatcomplextupler   r    check_tuple_items_valid_literals)rP   rr   r   xs       rQ   r   z*OpChecker.check_tuple_items_valid_literals  s     	= 	=A}ZCc5RY[`3a%b%b}		"SaSSSTTT!U## =55b!<<<		= 	=rS   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: r[   )rX   rI   r   rV   r   r   r   r   r   r   r   )rP   rr   r   r   s       rQ   $check_frozenset_items_valid_literalsz.OpChecker.check_frozenset_items_valid_literals  s     	Y 	YAyJq3tS%*QRRyAu%% Y55b!<<<<		"WTRSWWWWWXXXX	Y 	YrS   c                   d }|j         d}nt          |j         t                    r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   rX   r   rI   r   rV   r   r   r   r   	frozensetr   r   r   r   )rP   rr   expected_types      rQ   visit_load_literalzOpChecker.visit_load_literal  s   8-MM#&& 	D*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ArS   r   c                    d S rM   r`   r   s     rQ   visit_get_attrzOpChecker.visit_get_attr>      rS   r+   c                    d S rM   r`   r   s     rQ   visit_set_attrzOpChecker.visit_set_attrB  r   rS   r#   c                    d S rM   r`   r   s     rQ   visit_load_staticzOpChecker.visit_load_staticG      rS   r   c                    d S rM   r`   r   s     rQ   visit_init_staticzOpChecker.visit_init_staticJ  r   rS   r.   c                    d S rM   r`   r   s     rQ   visit_tuple_getzOpChecker.visit_tuple_getM  r   rS   r/   c                    d S rM   r`   r   s     rQ   visit_tuple_setzOpChecker.visit_tuple_setQ  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_inc_refzOpChecker.visit_inc_refU  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_dec_refzOpChecker.visit_dec_refY  r   rS   r   c                    t          |j        |j        j        j                  D ]&\  }}|                     ||j        |j                   'd S rM   )zipargsra   r   r   r   )rP   rr   	arg_valuearg_runtimes       rQ   
visit_callzOpChecker.visit_call]  sX     '*"'259>&B&B 	K 	K"I{$$R9IJJJJ	K 	KrS   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   )rP   rr   r   
decl_indexr   r   s         rQ   visit_method_callzOpChecker.visit_method_callc  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rS   r   c                    d S rM   r`   r   s     rQ   
visit_castzOpChecker.visit_castr  r   rS   r
   c                    d S rM   r`   r   s     rQ   	visit_boxzOpChecker.visit_boxu  r   rS   r1   c                    d S rM   r`   r   s     rQ   visit_unboxzOpChecker.visit_unboxx  r   rS   r(   c                    d S rM   r`   r   s     rQ   visit_raise_standard_errorz$OpChecker.visit_raise_standard_error{  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_call_czOpChecker.visit_call_c~  r   rS   r'   c                    d S rM   r`   r   s     rQ   visit_primitive_opzOpChecker.visit_primitive_op  r   rS   r-   c                    d S rM   r`   r   s     rQ   visit_truncatezOpChecker.visit_truncate  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_extendzOpChecker.visit_extend  r   rS   r    c                    d S rM   r`   r   s     rQ   visit_load_globalzOpChecker.visit_load_global  r   rS   r   c                r    |                      ||j                   |                      ||j                   d S rM   )r   lhsrhsr   s     rQ   visit_int_opzOpChecker.visit_int_op  s8    b"&)))b"&)))))rS   r   c                    |                      ||j        j        |j        j                   |                     ||j                   |                     ||j                   d S rM   )r   r  r   r  r   r   s     rQ   visit_comparison_opzOpChecker.visit_comparison_op  sX      RV["&+>>>b"&)))b"&)))))rS   r   c                r    |                      ||j                   |                      ||j                   d S rM   r   r  r  r   s     rQ   visit_float_opzOpChecker.visit_float_op  8    "bf%%%"bf%%%%%rS   r   c                <    |                      ||j                   d S rM   )r   r   r   s     rQ   visit_float_negzOpChecker.visit_float_neg  s     "bf%%%%%rS   r   c                r    |                      ||j                   |                      ||j                   d S rM   r  r   s     rQ   visit_float_comparison_opz#OpChecker.visit_float_comparison_op  r  rS   r"   c                    d S rM   r`   r   s     rQ   visit_load_memzOpChecker.visit_load_mem  r   rS   r,   c                    d S rM   r`   r   s     rQ   visit_set_memzOpChecker.visit_set_mem  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_get_element_ptrzOpChecker.visit_get_element_ptr  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_load_addresszOpChecker.visit_load_address  r   rS   r   c                    d S rM   r`   r   s     rQ   visit_keep_alivezOpChecker.visit_keep_alive  r   rS   r0   c                    d S rM   r`   r   s     rQ   visit_unborrowzOpChecker.visit_unborrow  r   rS   N)r   r   rJ   rK   )rF   r%   rH   rI   rJ   rK   )rr   r   rJ   rK   )rr   r%   r   r8   r   r8   rJ   rK   )rr   r%   r   r8   r   r8   rJ   rK   )rr   r%   r   r3   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r*   rJ   rK   )rr   r2   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r!   r   r   rJ   rK   )rr   r!   r   r   rJ   rK   )rr   r!   rJ   rK   )rr   r   rJ   rK   )rr   r+   rJ   rK   )rr   r#   rJ   rK   )rr   r   rJ   rK   )rr   r.   rJ   rK   )rr   r/   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r$   rJ   rK   )rr   r   rJ   rK   )rr   r
   rJ   rK   )rr   r1   rJ   rK   )rr   r(   rJ   rK   )rr   r   rJ   rK   )rr   r'   rJ   rK   )rr   r-   rJ   rK   )rr   r   rJ   rK   )rr   r    rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r"   rJ   rK   )rr   r,   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r   rJ   rK   )rr   r0   rJ   rK   )2r]   r^   r_   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   r   r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r`   rS   rQ   rm   rm      s       ( ( ( (> > > >_ _ _ _
   S S S SG G G G0 0 0 0* * * ** * * *V V V V   
@ @ @ @K K K K
   = = = =Y Y Y Y       D      
                  K K K KK K K K                           * * * ** * * *
& & & && & & && & & &                    rS   rm   N)ra   r   rJ   rb   )ra   r   rJ   rK   )r   r8   r   r8   rJ   rV   )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/   r0   r1   r2   r3   mypyc.ir.pprintr4   mypyc.ir.rtypesr5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rE   rt   	Exceptionrv   r~   rl   r   r   r   rm   r`   rS   rQ   <module>r'     s   F F " " " " " " 6 6 6 6 6 6 6 6/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /` ( ' ' ' ' '                                 &B B B B B B B B   >	 	 	 	 	y 	 	 	
 
 
 
% % % %R 	   2` ` ` ` `	$ ` ` ` ` `rS   