o
    7f                     @  sD  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 Z4e5 e5 fZ6de7d< dhdhfZ8de7d	< G d
d de%e4 Z9dd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                   @  s  e Zd ZdZdwddZdxddZdyddZdzddZd{ddZd|ddZ	d}ddZ
d~ddZdd d!Zdd#d$Zdd&d'Zdd)d*Zdd,d-Zdd/d0Zdd2d3Zdd5d6Zdd8d9Zdd;d<Zdd>d?ZddAdBZddDdEZddGdHZddJdKZddMdNZddPdQZddSdTZddVdWZddYdZZdd\d]Z dd_d`Z!ddbdcZ"ddedfZ#ddhdiZ$ddkdlZ%ddndoZ&ddqdrZ'ddtduZ(dvS )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                 C  s
   || _ d S Nr5   )selfr5    r;   Q/home/ertert/spirit/venv/lib/python3.10/site-packages/mypyc/analysis/selfleaks.py__init__@      
zSelfLeakedVisitor.__init__opr   r1   c                 C     t S r8   r2   r:   r?   r;   r;   r<   
visit_gotoC      zSelfLeakedVisitor.visit_gotor   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_branchF   rD   zSelfLeakedVisitor.visit_branchr'   c                 C  r@   r8   )r3   rB   r;   r;   r<   visit_returnI   s   zSelfLeakedVisitor.visit_returnr/   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_unreachableN   rD   z#SelfLeakedVisitor.visit_unreachabler	   c                 C  s    |j | ju s|j| ju rtS tS r8   )srcr5   destr3   r2   rB   r;   r;   r<   visit_assignQ   s   zSelfLeakedVisitor.visit_assignr
   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_assign_multiV   rD   z$SelfLeakedVisitor.visit_assign_multir)   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_set_memY   rD   zSelfLeakedVisitor.visit_set_memr   c                 C  sN   |j }|jr"|jdkr"|j jjd j}t|tsJ |j}|j	s"t
S | |S )Nr=   r   )fn
class_namenamesigargstype
isinstancer0   class_irinit_self_leakr2   check_register_op)r:   r?   rM   	self_typeclr;   r;   r<   
visit_call\   s   
zSelfLeakedVisitor.visit_callr"   c                 C  
   |  |S r8   rV   rB   r;   r;   r<   visit_method_callf   r>   z#SelfLeakedVisitor.visit_method_callr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_load_error_valuei   rD   z(SelfLeakedVisitor.visit_load_error_valuer   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_load_literall   rD   z$SelfLeakedVisitor.visit_load_literalr   c                 C  "   |j j}||jr| |S tS r8   
class_typerT   
get_methodattrrV   r2   r:   r?   rX   r;   r;   r<   visit_get_attro      
z SelfLeakedVisitor.visit_get_attrr(   c                 C  r_   r8   r`   rd   r;   r;   r<   visit_set_attrv   rf   z SelfLeakedVisitor.visit_set_attrr!   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_load_static}   rD   z#SelfLeakedVisitor.visit_load_staticr   c                 C  rZ   r8   r[   rB   r;   r;   r<   visit_init_static   r>   z#SelfLeakedVisitor.visit_init_staticr+   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_tuple_get   rD   z!SelfLeakedVisitor.visit_tuple_getr,   c                 C  rZ   r8   r[   rB   r;   r;   r<   visit_tuple_set   r>   z!SelfLeakedVisitor.visit_tuple_setr   c                 C  rZ   r8   r[   rB   r;   r;   r<   	visit_box   r>   zSelfLeakedVisitor.visit_boxr.   c                 C  rZ   r8   r[   rB   r;   r;   r<   visit_unbox   r>   zSelfLeakedVisitor.visit_unboxr   c                 C  rZ   r8   r[   rB   r;   r;   r<   
visit_cast   r>   zSelfLeakedVisitor.visit_castr$   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_raise_standard_error   rD   z,SelfLeakedVisitor.visit_raise_standard_errorr   c                 C  rZ   r8   r[   rB   r;   r;   r<   visit_call_c   r>   zSelfLeakedVisitor.visit_call_cr*   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_truncate   rD   z SelfLeakedVisitor.visit_truncater   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_extend   rD   zSelfLeakedVisitor.visit_extendr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_load_global   rD   z#SelfLeakedVisitor.visit_load_globalr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_int_op   rD   zSelfLeakedVisitor.visit_int_opr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_comparison_op   rD   z%SelfLeakedVisitor.visit_comparison_opr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_float_op   rD   z SelfLeakedVisitor.visit_float_opr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_float_neg   rD   z!SelfLeakedVisitor.visit_float_negr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_float_comparison_op   rD   z+SelfLeakedVisitor.visit_float_comparison_opr    c                 C  r@   r8   rA   rB   r;   r;   r<   visit_load_mem   rD   z SelfLeakedVisitor.visit_load_memr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_get_element_ptr   rD   z'SelfLeakedVisitor.visit_get_element_ptrr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_load_address   rD   z$SelfLeakedVisitor.visit_load_addressr   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_keep_alive   rD   z"SelfLeakedVisitor.visit_keep_aliver-   c                 C  r@   r8   rA   rB   r;   r;   r<   visit_unborrow   rD   z SelfLeakedVisitor.visit_unborrowr&   c                   s"   t  fdd| D rtS tS )Nc                 3  s    | ]}| j u V  qd S r8   r9   ).0rH   r:   r;   r<   	<genexpr>   s    z6SelfLeakedVisitor.check_register_op.<locals>.<genexpr>)anysourcesr3   r2   rB   r;   r   r<   rV      s   z#SelfLeakedVisitor.check_register_opN)r5   r%   r6   r7   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r'   r6   r1   )r?   r/   r6   r1   )r?   r	   r6   r1   )r?   r
   r6   r1   )r?   r)   r6   r1   )r?   r   r6   r1   )r?   r"   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r(   r6   r1   )r?   r!   r6   r1   )r?   r   r6   r1   )r?   r+   r6   r1   )r?   r,   r6   r1   )r?   r   r6   r1   )r?   r.   r6   r1   )r?   r   r6   r1   )r?   r$   r6   r1   )r?   r   r6   r1   )r?   r*   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r    r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r   r6   r1   )r?   r-   r6   r1   )r?   r&   r6   r1   ))__name__
__module____qualname____doc__r=   rC   rE   rF   rG   rJ   rK   rL   rY   r\   r]   r^   re   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   rV   r;   r;   r;   r<   r4   7   sN    




































r4   blockslist[BasicBlock]r5   r%   cfgr   r6   AnalysisResult[None]c                 C  s   t | |t|t dtdS )NF)r   r   gen_and_killinitialbackwardkind)r   r4   setr   )r   r5   r   r;   r;   r<   analyze_self_leaks   s   r   )r   r   r5   r%   r   r   r6   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.   r/   mypyc.ir.rtypesr0   r1   r   r2   __annotations__r3   r4   r   r;   r;   r;   r<   <module>   s    ) 