
    *e                       U d dl mZ d dlmZmZ d dlmZmZ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/m0Z0m1Z1 d dl2m3Z3 eed         ed         f         Z4 e5             e5            fZ6de7d<   dhdhfZ8de7d	<    G d
 de%e4                   Z9ddZ:dS )    )annotations)SetTuple)CFGMAYBE_ANALYSISAnalysisResultrun_analysis)'AssignAssignMulti
BasicBlockBoxBranchCallCallCCastComparisonOpExtendFloatComparisonOpFloatNegFloatOpGetAttrGetElementPtrGoto
InitStaticIntOp	KeepAliveLoadAddressLoadErrorValue
LoadGlobalLoadLiteralLoadMem
LoadStatic
MethodCall	OpVisitorRaiseStandardErrorRegister
RegisterOpReturnSetAttrSetMemTruncateTupleGetTupleSetUnborrowUnboxUnreachable)	RInstanceN
GenAndKillCLEANDIRTYc                  :   e Zd ZdZdRdZdSd
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d`d$Zdad&Zdbd(Zdcd*Zddd,Zded.Zdfd0Zdgd2Zdhd4Zdid6Zdjd8Zdkd:Zdld<Zdmd>Zdnd@Z dodBZ!dpdDZ"dqdFZ#drdHZ$dsdJZ%dtdLZ&dudNZ'dvdPZ(dQS )wSelfLeakedVisitora  Analyze whether 'self' may be seen by arbitrary code in '__init__'.

    More formally, the set is not empty if along some path from IR entry point
    arbitrary code could have been executed that has access to 'self'.

    (We don't consider access via 'gc.get_objects()'.)
    self_regr&   returnNonec                    || _         d S Nr7   )selfr7   s     8lib/python3.11/site-packages/mypyc/analysis/selfleaks.py__init__zSelfLeakedVisitor.__init__@   s         opr   r2   c                    t           S r;   r3   r=   rA   s     r>   
visit_gotozSelfLeakedVisitor.visit_gotoC       r@   r   c                    t           S r;   rC   rD   s     r>   visit_branchzSelfLeakedVisitor.visit_branchF   rF   r@   r(   c                    t           S r;   )r4   rD   s     r>   visit_returnzSelfLeakedVisitor.visit_returnI   s	     r@   r0   c                    t           S r;   rC   rD   s     r>   visit_unreachablez#SelfLeakedVisitor.visit_unreachableN   rF   r@   r
   c                V    |j         | j        u s|j        | j        u rt          S t          S r;   )srcr7   destr4   r3   rD   s     r>   visit_assignzSelfLeakedVisitor.visit_assignQ   s)    6T]""bg&>&>Lr@   r   c                    t           S r;   rC   rD   s     r>   visit_assign_multiz$SelfLeakedVisitor.visit_assign_multiV   rF   r@   r*   c                    t           S r;   rC   rD   s     r>   visit_set_memzSelfLeakedVisitor.visit_set_memY   rF   r@   r   c                    |j         }|j        rS|j        dk    rH|j         j        j        d         j        }t          |t                    sJ |j        }|j	        st          S |                     |          S )Nr?   r   )fn
class_namenamesigargstype
isinstancer1   class_irinit_self_leakr3   check_register_op)r=   rA   rV   	self_typecls        r>   
visit_callzSelfLeakedVisitor.visit_call\   st    U= 	RW
22	q).Ii33333#B$ %%b)))r@   r#   c                ,    |                      |          S r;   r_   rD   s     r>   visit_method_callz#SelfLeakedVisitor.visit_method_callf       %%b)))r@   r   c                    t           S r;   rC   rD   s     r>   visit_load_error_valuez(SelfLeakedVisitor.visit_load_error_valuei   rF   r@   r    c                    t           S r;   rC   rD   s     r>   visit_load_literalz$SelfLeakedVisitor.visit_load_literall   rF   r@   r   c                    |j         j        }|                    |j                  r|                     |          S t
          S r;   
class_typer]   
get_methodattrr_   r3   r=   rA   ra   s      r>   visit_get_attrz SelfLeakedVisitor.visit_get_attro   ;    ]#==!! 	.))"---r@   r)   c                    |j         j        }|                    |j                  r|                     |          S t
          S r;   rl   rp   s      r>   visit_set_attrz SelfLeakedVisitor.visit_set_attrv   rr   r@   r"   c                    t           S r;   rC   rD   s     r>   visit_load_staticz#SelfLeakedVisitor.visit_load_static}   rF   r@   r   c                ,    |                      |          S r;   rd   rD   s     r>   visit_init_staticz#SelfLeakedVisitor.visit_init_static   rf   r@   r,   c                    t           S r;   rC   rD   s     r>   visit_tuple_getz!SelfLeakedVisitor.visit_tuple_get   rF   r@   r-   c                ,    |                      |          S r;   rd   rD   s     r>   visit_tuple_setz!SelfLeakedVisitor.visit_tuple_set   rf   r@   r   c                ,    |                      |          S r;   rd   rD   s     r>   	visit_boxzSelfLeakedVisitor.visit_box   rf   r@   r/   c                ,    |                      |          S r;   rd   rD   s     r>   visit_unboxzSelfLeakedVisitor.visit_unbox   rf   r@   r   c                ,    |                      |          S r;   rd   rD   s     r>   
visit_castzSelfLeakedVisitor.visit_cast   rf   r@   r%   c                    t           S r;   rC   rD   s     r>   visit_raise_standard_errorz,SelfLeakedVisitor.visit_raise_standard_error   rF   r@   r   c                ,    |                      |          S r;   rd   rD   s     r>   visit_call_czSelfLeakedVisitor.visit_call_c   rf   r@   r+   c                    t           S r;   rC   rD   s     r>   visit_truncatez SelfLeakedVisitor.visit_truncate   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_extendzSelfLeakedVisitor.visit_extend   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_load_globalz#SelfLeakedVisitor.visit_load_global   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_int_opzSelfLeakedVisitor.visit_int_op   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_comparison_opz%SelfLeakedVisitor.visit_comparison_op   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_float_opz SelfLeakedVisitor.visit_float_op   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_float_negz!SelfLeakedVisitor.visit_float_neg   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_float_comparison_opz+SelfLeakedVisitor.visit_float_comparison_op   rF   r@   r!   c                    t           S r;   rC   rD   s     r>   visit_load_memz SelfLeakedVisitor.visit_load_mem   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_get_element_ptrz'SelfLeakedVisitor.visit_get_element_ptr   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_load_addressz$SelfLeakedVisitor.visit_load_address   rF   r@   r   c                    t           S r;   rC   rD   s     r>   visit_keep_alivez"SelfLeakedVisitor.visit_keep_alive   rF   r@   r.   c                    t           S r;   rC   rD   s     r>   visit_unborrowz SelfLeakedVisitor.visit_unborrow   rF   r@   r'   c                z     t           fd|                                D                       rt          S t          S )Nc              3  *   K   | ]}|j         u V  d S r;   r<   ).0rN   r=   s     r>   	<genexpr>z6SelfLeakedVisitor.check_register_op.<locals>.<genexpr>   s*      <<sdm#<<<<<<r@   )anysourcesr4   r3   rD   s   ` r>   r_   z#SelfLeakedVisitor.check_register_op   s:    <<<<rzz||<<<<< 	Lr@   N)r7   r&   r8   r9   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r(   r8   r2   )rA   r0   r8   r2   )rA   r
   r8   r2   )rA   r   r8   r2   )rA   r*   r8   r2   )rA   r   r8   r2   )rA   r#   r8   r2   )rA   r   r8   r2   )rA   r    r8   r2   )rA   r   r8   r2   )rA   r)   r8   r2   )rA   r"   r8   r2   )rA   r   r8   r2   )rA   r,   r8   r2   )rA   r-   r8   r2   )rA   r   r8   r2   )rA   r/   r8   r2   )rA   r   r8   r2   )rA   r%   r8   r2   )rA   r   r8   r2   )rA   r+   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r!   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r   r8   r2   )rA   r.   r8   r2   )rA   r'   r8   r2   ))__name__
__module____qualname____doc__r?   rE   rH   rJ   rL   rP   rR   rT   rb   re   rh   rj   rq   rt   rv   rx   rz   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r_    r@   r>   r6   r6   7   s        ! ! ! !         
      
      * * * ** * * *               * * * *   * * * ** * * ** * * ** * * *   * * * *                                            r@   r6   blockslist[BasicBlock]r7   r&   cfgr   r8   AnalysisResult[None]c                h    t          | |t          |          t                      dt                    S )NF)r   r   gen_and_killinitialbackwardkind)r	   r6   setr   )r   r7   r   s      r>   analyze_self_leaksr      s9     &x00   r@   )r   r   r7   r&   r   r   r8   r   );
__future__r   typingr   r   mypyc.analysis.dataflowr   r   r   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/   r0   mypyc.ir.rtypesr1   r2   r   r3   __annotations__r4   r6   r   r   r@   r>   <module>r      s   " " " " " " "         U U U U U U U U U U U U( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (R & % % % % %3t9c$i'(
SUUCCEEN " " " "VdV$ $ $ $ $K K K K K	*- K K K\
 
 
 
 
 
r@   