
    *e4                       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          ZFddZG G d deH          ZIddZJddZKe>jL        e<jL        eDjL        e=jL        eAjL        eCjL        eEjL        eBjL        hZMddZN G 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                  &    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rE   rG   selfrE   rG   s      6lib/python3.11/site-packages/mypyc/analysis/ircheck.py__init__zFnError.__init__I   s    			    otherobjectboolc                l    t          |t                    o| j        |j        k    o| j        |j        k    S rL   )
isinstancerD   rE   rG   )rO   rS   s     rP   __eq__zFnError.__eq__M   s2    ug&&b4;%,+Fb49X]XbKb	
rR   c                (    d| j          d| j         dS )NzFnError(source=z, desc=)rM   )rO   s    rP   __repr__zFnError.__repr__R   s    AAATYAAAArR   N)rE   rF   rG   rH   rI   rJ   )rS   rT   rI   rU   )rI   rH   )__name__
__module____qualname__rQ   rX   r[    rR   rP   rD   rD   H   sV           
 
 
 

B B B B B BrR   rD   fnr   rI   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 terminatedrM   Nz%Block has operations after control opzFunc has a duplicate op)setblocks
terminatedappendrD   opsrW   r   addextendcheck_op_sources_valid	OpCheckeraccepterrors)r`   rn   op_setblockop
op_checkers         rP   check_func_irrs   V   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!!!!	" rR   c                      e Zd ZdS )IrCheckExceptionN)r\   r]   r^   r_   rR   rP   ru   ru   u   s        DrR   ru   rJ   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_   rM   ).0es     rP   
<listcomp>z(assert_func_ir_valid.<locals>.<listcomp>~   s!    (L(L(L!(AF);(L(L(LrR   )rs   ru   joinr3   )r`   rn   s     rP   assert_func_ir_validr}   y   sd    2F 
6iiB(L(LV(L(L(LMMNNO
 
 	

 
rR   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 rM   z!Invalid op reference to register )rd   re   updaterh   rW   r   ri   destr   srcr(   arg_regssourcesr   r%   rg   rD   typer\   name)r`   rn   	valid_opsvalid_registersrp   rq   rE   s          rP   rk   rk      s   FI%(UUO , ,###) 	, 	,B"j)) ,##BG,,,,B,, ,BFH1M1M ,##BF+++		, 2;'''  ) 	 	B**,,  fg.. ++ Y..#')%b4PV<<K`%b%b      11 _44#')0cTZT_0c0c    	( MrR   r   r7   r   rU   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 rL   can_coerce_to)ry   dr   s     rP   	<genexpr>z can_coerce_to.<locals>.<genexpr>   s-      ==Q=a((======rR   c              3  8   K   | ]}t          |          V  d S rL   r   )ry   sr   s     rP   r   z can_coerce_to.<locals>.<genexpr>   s-      AA!}Q--AAAAAArR   FT)
rW   r8   anyitemsr6   r   disjoint_typessizer5   r=   )r   r   s   ``rP   r   r      s    
 $ >====$*======$
## c:&& 	)x>))di>.I.Ix49,,8ty((c9%% 	.'---c6"" 	B AAAAsyAAAAAAu4rR   c                  ~   e Zd ZdhdZdid
ZdjdZdkdZdldZdmdZdmdZ	dndZ
dodZdpdZdqd Zdrd"Zdsd$Zdtd&Zdud)Zdvd+Zdwd,Zdxd.Zdyd0Zdzd2Zd{d4Zd|d6Zd}d8Zd~d:Zdd<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Z0dgS )rl   	parent_fnr   rI   rJ   c                "    || _         g | _        d S rL   )r   rn   )rO   r   s     rP   rQ   zOpChecker.__init__   s    "%'rR   rE   r%   rG   rH   c                X    | j                             t          ||                     d S )NrM   )rn   rg   rD   rN   s      rP   failzOpChecker.fail   s+    7&t<<<=====rR   rq   r   c                    |                                 D ]/}|| j        j        vr|                     |d|j                    0d S )Nz"Invalid control operation target: rM   )targetsr   re   r   label)rO   rq   targets      rP   check_control_op_targetsz"OpChecker.check_control_op_targets   sY    jjll 	_ 	_FT^222		*]v|*]*]	^^^	_ 	_rR   r   r7   r   c                x    t          ||          s)|                     |d|j         d|j                    d S d S )NzCannot coerce source type z to dest type rM   r   r   r   )rO   rq   r   r   s       rP   check_type_coercionzOpChecker.check_type_coercion   s_    S$'' 	II `SX ` `UYU^ ` `      	 	rR   tr   c                    t          ||          rt          ||          s)|                     ||j         d|j         d           d S d S )Nz and z are not compatiblerM   r   )rO   rq   r   r   s       rP   check_compatibilityzOpChecker.check_compatibility   sd    Q"" 	S-1*=*= 	SIIR&Q&Qaf&Q&Q&QIRRRRR	S 	SrR   vr2   c                p    t          |j                  s!|                     |d|j         d           d S d S )NzFloat expected (actual type is rZ   r<   r   r   rO   rq   r   s      rP   expect_floatzOpChecker.expect_float   sI    "16** 	GIIbEAFEEEFFFFF	G 	GrR   c                ^    t          |j                  r|                     |d           d S d S )NzFloat not expectedr   r   s      rP   expect_non_floatzOpChecker.expect_non_float   s9    qv&& 	0IIb./////	0 	0rR   r   c                0    |                      |           d S rL   r   rO   rq   s     rP   
visit_gotozOpChecker.visit_goto       %%b)))))rR   r   c                0    |                      |           d S rL   r   r   s     rP   visit_branchzOpChecker.visit_branch   r   rR   r)   c                p    |                      ||j        j        | j        j        j        j                   d S rL   )r   valuer   r   declsigret_typer   s     rP   visit_returnzOpChecker.visit_return   s/      RX]DN4G4K4TUUUUUrR   r1   c                    d S rL   r_   r   s     rP   visit_unreachablezOpChecker.visit_unreachable   s	     	rR   r   c                \    |                      ||j        j        |j        j                   d S rL   )r   r   r   r   r   s     rP   visit_assignzOpChecker.visit_assign   s(      RV["',?????rR   r   c                    |j         D ]N}t          |j        j        t                    sJ |                     ||j        |j        j        j                   Od S rL   )r   rW   r   r   r4   r   	item_type)rO   rq   r   s      rP   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rR   r   c                    d S rL   r_   r   s     rP   visit_load_error_valuez OpChecker.visit_load_error_value  s	     	rR   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: rZ   )rW   rH   bytesrU   intfloatcomplextupler   r    check_tuple_items_valid_literals)rO   rq   r   xs       rP   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!<<<		= 	=rR   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: rZ   )rW   rH   r   rU   r   r   r   r   r   r   r   )rO   rq   r   r   s       rP   $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rR   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   rW   r   rH   r   rU   r   r   r   r   	frozensetr   r   r   r   )rO   rq   expected_types      rP   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ArR   r   c                    d S rL   r_   r   s     rP   visit_get_attrzOpChecker.visit_get_attr<      rR   r*   c                    d S rL   r_   r   s     rP   visit_set_attrzOpChecker.visit_set_attr@  r   rR   r#   c                    d S rL   r_   r   s     rP   visit_load_staticzOpChecker.visit_load_staticE      rR   r   c                    d S rL   r_   r   s     rP   visit_init_staticzOpChecker.visit_init_staticH  r   rR   r-   c                    d S rL   r_   r   s     rP   visit_tuple_getzOpChecker.visit_tuple_getK  r   rR   r.   c                    d S rL   r_   r   s     rP   visit_tuple_setzOpChecker.visit_tuple_setO  r   rR   r   c                    d S rL   r_   r   s     rP   visit_inc_refzOpChecker.visit_inc_refS  r   rR   r   c                    d S rL   r_   r   s     rP   visit_dec_refzOpChecker.visit_dec_refW  r   rR   r   c                    t          |j        |j        j        j                  D ]&\  }}|                     ||j        |j                   'd S rL   )zipargsr`   r   r   r   )rO   rq   	arg_valuearg_runtimes       rP   
visit_callzOpChecker.visit_call[  sX     '*"'259>&B&B 	K 	K"I{$$R9IJJJJ	K 	KrR   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   )rO   rq   r   
decl_indexr   r   s         rP   visit_method_callzOpChecker.visit_method_calla  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rR   r   c                    d S rL   r_   r   s     rP   
visit_castzOpChecker.visit_castp  r   rR   r
   c                    d S rL   r_   r   s     rP   	visit_boxzOpChecker.visit_boxs  r   rR   r0   c                    d S rL   r_   r   s     rP   visit_unboxzOpChecker.visit_unboxv  r   rR   r'   c                    d S rL   r_   r   s     rP   visit_raise_standard_errorz$OpChecker.visit_raise_standard_errory  r   rR   r   c                    d S rL   r_   r   s     rP   visit_call_czOpChecker.visit_call_c|  r   rR   r,   c                    d S rL   r_   r   s     rP   visit_truncatezOpChecker.visit_truncate  r   rR   r   c                    d S rL   r_   r   s     rP   visit_extendzOpChecker.visit_extend  r   rR   r    c                    d S rL   r_   r   s     rP   visit_load_globalzOpChecker.visit_load_global  r   rR   r   c                r    |                      ||j                   |                      ||j                   d S rL   )r   lhsrhsr   s     rP   visit_int_opzOpChecker.visit_int_op  s8    b"&)))b"&)))))rR   r   c                    |                      ||j        j        |j        j                   |                     ||j                   |                     ||j                   d S rL   )r   r  r   r  r   r   s     rP   visit_comparison_opzOpChecker.visit_comparison_op  sX      RV["&+>>>b"&)))b"&)))))rR   r   c                r    |                      ||j                   |                      ||j                   d S rL   r   r  r  r   s     rP   visit_float_opzOpChecker.visit_float_op  8    "bf%%%"bf%%%%%rR   r   c                <    |                      ||j                   d S rL   )r   r   r   s     rP   visit_float_negzOpChecker.visit_float_neg  s     "bf%%%%%rR   r   c                r    |                      ||j                   |                      ||j                   d S rL   r
  r   s     rP   visit_float_comparison_opz#OpChecker.visit_float_comparison_op  r  rR   r"   c                    d S rL   r_   r   s     rP   visit_load_memzOpChecker.visit_load_mem  r   rR   r+   c                    d S rL   r_   r   s     rP   visit_set_memzOpChecker.visit_set_mem  r   rR   r   c                    d S rL   r_   r   s     rP   visit_get_element_ptrzOpChecker.visit_get_element_ptr  r   rR   r   c                    d S rL   r_   r   s     rP   visit_load_addresszOpChecker.visit_load_address  r   rR   r   c                    d S rL   r_   r   s     rP   visit_keep_alivezOpChecker.visit_keep_alive  r   rR   r/   c                    d S rL   r_   r   s     rP   visit_unborrowzOpChecker.visit_unborrow  r   rR   N)r   r   rI   rJ   )rE   r%   rG   rH   rI   rJ   )rq   r   rI   rJ   )rq   r%   r   r7   r   r7   rI   rJ   )rq   r%   r   r7   r   r7   rI   rJ   )rq   r%   r   r2   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r)   rI   rJ   )rq   r1   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r!   r   r   rI   rJ   )rq   r!   r   r   rI   rJ   )rq   r!   rI   rJ   )rq   r   rI   rJ   )rq   r*   rI   rJ   )rq   r#   rI   rJ   )rq   r   rI   rJ   )rq   r-   rI   rJ   )rq   r.   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r$   rI   rJ   )rq   r   rI   rJ   )rq   r
   rI   rJ   )rq   r0   rI   rJ   )rq   r'   rI   rJ   )rq   r   rI   rJ   )rq   r,   rI   rJ   )rq   r   rI   rJ   )rq   r    rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r"   rI   rJ   )rq   r+   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r   rI   rJ   )rq   r/   rI   rJ   )1r\   r]   r^   rQ   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_   rR   rP   rl   rl      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                        * * * ** * * *
& & & && & & && & & &                    rR   rl   N)r`   r   rI   ra   )r`   r   rI   rJ   )r   r7   r   r7   rI   rU   )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/   r0   r1   r2   mypyc.ir.pprintr3   mypyc.ir.rtypesr4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rD   rs   	Exceptionru   r}   rk   r   r   r   rl   r_   rR   rP   <module>r$     s   F F " " " " " " 6 6 6 6 6 6 6 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .^ ( ' ' ' ' '                                 &B B B B B B B B   >	 	 	 	 	y 	 	 	
 
 
 
% % % %R 	   2] ] ] ] ]	$ ] ] ] ] ]rR   