o
    tBh,                     @  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. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? G dd dZ@dddZAG dd deBZCd ddZDdddZEe9jFe7jFe>jFe8jFe;jFe=jFe?jFe<jFhZGd!ddZHG dd de$d ZId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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UnboxUnreachable)format_func)RArray	RInstance
RPrimitiveRTypeRUnionbytes_rprimitivedict_rprimitiveint_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r=   r?   selfr=   r?    rG   m/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/mypyc/analysis/ircheck.py__init__C      
zFnError.__init__otherobjectboolc                 C  s"   t |to| j|jko| j|jkS rC   )
isinstancer<   r=   r?   )rF   rK   rG   rG   rH   __eq__G   s    zFnError.__eq__c                 C  s   d| j  d| j dS )NzFnError(source=z, desc=)rD   )rF   rG   rG   rH   __repr__L   s   zFnError.__repr__N)r=   r>   r?   r@   rA   rB   )rK   rL   rA   rM   )rA   r@   )__name__
__module____qualname__rI   rO   rQ   rG   rG   rG   rH   r<   B   s    

r<   fnr   rA   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 terminatedrD   Nz%Block has operations after control opzFunc has a duplicate op)setblocks
terminatedappendr<   opsrN   r   addextendcheck_op_sources_valid	OpCheckeraccepterrors)rU   rb   op_setblockop
op_checkerrG   rG   rH   check_func_irP   s.   



rg   c                   @  s   e Zd ZdS )IrCheckExceptionN)rR   rS   rT   rG   rG   rG   rH   rh   o   s    rh   rB   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 rG   rD   ).0erG   rG   rH   
<listcomp>x   s    z(assert_func_ir_valid.<locals>.<listcomp>)rg   rh   joinr-   )rU   rb   rG   rG   rH   assert_func_ir_valids   s   rn   c              
   C  s   g }t  }t  }| jD ]}||j |dd |jD  q|| j | jD ]D}|jD ]>}| D ]7}t|tr;q3t|trT||vrS|	t
|dt|j d q3t|trj||vrj|	t
|d|j d q3q-q(|S )Nc                 S  s   g | ]
}t |tr|jqS rG   )rN   r   dest)rj   re   rG   rG   rH   rl      s    z*check_op_sources_valid.<locals>.<listcomp>z#Invalid op reference to op of type rD   z!Invalid op reference to register )rX   rY   updater\   arg_regssourcesrN   r   r!   r[   r<   typerR   r$   name)rU   rb   	valid_opsvalid_registersrd   re   r=   rG   rG   rH   r_   |   s@   





r_   srcr1   ro   rM   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 rC   can_coerce_to)rj   d)rw   rG   rH   	<genexpr>       z can_coerce_to.<locals>.<genexpr>c                 3  s    | ]}t | V  qd S rC   rx   )rj   s)ro   rG   rH   r{      r|   FT)
rN   r2   anyitemsr0   rt   disjoint_typessizer/   r6   )rw   ro   rG   )ro   rw   rH   ry      s   




ry   c                   @  s  e Zd Zd~ddZdd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dd6d7Zdd9d: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(d}S )r`   	parent_fnr   rA   rB   c                 C  s   || _ g | _d S rC   )r   rb   )rF   r   rG   rG   rH   rI      rJ   zOpChecker.__init__r=   r!   r?   r@   c                 C  s   | j t||d d S )NrD   )rb   r[   r<   rE   rG   rG   rH   fail   s   zOpChecker.failre   r   c                 C  s4   |  D ]}|| jjvr| j|d|j d qd S )Nz"Invalid control operation target: rD   )targetsr   rY   r   label)rF   re   targetrG   rG   rH   check_control_op_targets   s
   z"OpChecker.check_control_op_targetsrw   r1   ro   c                 C  s0   t ||s| j|d|j d|j d d S d S )NzCannot coerce source type z to dest type rD   )ry   r   rt   )rF   re   rw   ro   rG   rG   rH   check_type_coercion   s
   

zOpChecker.check_type_coercionr   c                 C     |  | d S rC   r   rF   re   rG   rG   rH   
visit_goto      zOpChecker.visit_gotor
   c                 C  r   rC   r   r   rG   rG   rH   visit_branch   r   zOpChecker.visit_branchr%   c                 C  s   |  ||jj| jjjj d S rC   )r   valuers   r   declsigret_typer   rG   rG   rH   visit_return   s   zOpChecker.visit_returnr,   c                 C     d S rC   rG   r   rG   rG   rH   visit_unreachable   s   zOpChecker.visit_unreachabler   c                 C  s   |  ||jj|jj d S rC   )r   rw   rs   ro   r   rG   rG   rH   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 rC   )rw   rN   ro   rs   r.   r   	item_type)rF   re   rw   rG   rG   rH   visit_assign_multi   s   
zOpChecker.visit_assign_multir   c                 C  r   rC   rG   r   rG   rG   rH   visit_load_error_value   s   z OpChecker.visit_load_error_valuer   t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: rP   )rN   r@   bytesrM   intfloatcomplextupler   rs    check_tuple_items_valid_literals)rF   re   r   xrG   rG   rH   r      s    
z*OpChecker.check_tuple_items_valid_literalsc                 C  s   d }|j d u r
d}nEt|j trd}n<t|j trd}n3t|j tr%d}n*t|j tr.d}n!t|j tr7d}nt|j tr@d}nt|j trOd}| 	||j  |d usWJ d|j
j|dfvro| |d| d	|j
j  d S d S )
Nzbuiltins.objectzbuiltins.intzbuiltins.strzbuiltins.byteszbuiltins.floatzbuiltins.tuplez#Missed a case for LoadLiteral checkz/Invalid literal value for type: value has type z, but op has type )r   rN   r   r@   r   rM   r   r   r   r   rs   rt   r   )rF   re   expected_typerG   rG   rH   visit_load_literal   s:   
zOpChecker.visit_load_literalr   c                 C  r   rC   rG   r   rG   rG   rH   visit_get_attr     zOpChecker.visit_get_attrr&   c                 C  r   rC   rG   r   rG   rG   rH   visit_set_attr  r   zOpChecker.visit_set_attrr   c                 C  r   rC   rG   r   rG   rG   rH   visit_load_static!     zOpChecker.visit_load_staticr   c                 C  r   rC   rG   r   rG   rG   rH   visit_init_static$  r   zOpChecker.visit_init_staticr)   c                 C  r   rC   rG   r   rG   rG   rH   visit_tuple_get'  r   zOpChecker.visit_tuple_getr*   c                 C  r   rC   rG   r   rG   rG   rH   visit_tuple_set+  r   zOpChecker.visit_tuple_setr   c                 C  r   rC   rG   r   rG   rG   rH   visit_inc_ref/  r   zOpChecker.visit_inc_refr   c                 C  r   rC   rG   r   rG   rG   rH   visit_dec_ref3  r   zOpChecker.visit_dec_refr   c                 C  s2   t |j|jjjD ]\}}| ||j|j q	d S rC   )zipargsrU   r   r   rs   )rF   re   	arg_valuearg_runtimerG   rG   rH   
visit_call7  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   rs   )rF   re   r   
decl_indexr   r   rG   rG   rH   visit_method_call=  s   
 zOpChecker.visit_method_callr   c                 C  r   rC   rG   r   rG   rG   rH   
visit_castL  r   zOpChecker.visit_castr	   c                 C  r   rC   rG   r   rG   rG   rH   	visit_boxO  r   zOpChecker.visit_boxr+   c                 C  r   rC   rG   r   rG   rG   rH   visit_unboxR  r   zOpChecker.visit_unboxr#   c                 C  r   rC   rG   r   rG   rG   rH   visit_raise_standard_errorU  r   z$OpChecker.visit_raise_standard_errorr   c                 C  r   rC   rG   r   rG   rG   rH   visit_call_cX  r   zOpChecker.visit_call_cr(   c                 C  r   rC   rG   r   rG   rG   rH   visit_truncate[  r   zOpChecker.visit_truncater   c                 C  r   rC   rG   r   rG   rG   rH   visit_extend^  r   zOpChecker.visit_extendr   c                 C  r   rC   rG   r   rG   rG   rH   visit_load_globala  r   zOpChecker.visit_load_globalr   c                 C  r   rC   rG   r   rG   rG   rH   visit_int_opd  r   zOpChecker.visit_int_opr   c                 C  r   rC   rG   r   rG   rG   rH   visit_comparison_opg  r   zOpChecker.visit_comparison_opr   c                 C  r   rC   rG   r   rG   rG   rH   visit_load_memj  r   zOpChecker.visit_load_memr'   c                 C  r   rC   rG   r   rG   rG   rH   visit_set_memm  r   zOpChecker.visit_set_memr   c                 C  r   rC   rG   r   rG   rG   rH   visit_get_element_ptrp  r   zOpChecker.visit_get_element_ptrr   c                 C  r   rC   rG   r   rG   rG   rH   visit_load_addresss  r   zOpChecker.visit_load_addressr   c                 C  r   rC   rG   r   rG   rG   rH   visit_keep_alivev  r   zOpChecker.visit_keep_aliveN)r   r   rA   rB   )r=   r!   r?   r@   rA   rB   )re   r   rA   rB   )re   r!   rw   r1   ro   r1   rA   rB   )re   r   rA   rB   )re   r
   rA   rB   )re   r%   rA   rB   )re   r,   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   r   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r&   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r)   rA   rB   )re   r*   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r    rA   rB   )re   r   rA   rB   )re   r	   rA   rB   )re   r+   rA   rB   )re   r#   rA   rB   )re   r   rA   rB   )re   r(   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r'   rA   rB   )re   r   rA   rB   )re   r   rA   rB   )re   r   rA   rB   ))rR   rS   rT   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   rG   rG   rG   rH   r`      sN    




































r`   N)rU   r   rA   rV   )rU   r   rA   rB   )rw   r1   ro   r1   rA   rM   )J__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,   mypyc.ir.pprintr-   mypyc.ir.rtypesr.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   rg   	Exceptionrh   rn   r_   rt   r   ry   r`   rG   rG   rG   rH   <module>   s,    *@


	%
