o
    2g{                     @  sH  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/m0Z0m1Z1m2Z2 d dl3m4Z4 eed ed f Z5e6 e6 fZ7de8d< dhdhfZ9de8d	< G d
d de%e5 Z:d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PrimitiveOpRaiseStandardErrorRegister
RegisterOpReturnSetAttrSetMemTruncateTupleGetTupleSetUnborrowUnboxUnreachable)	RInstanceN
GenAndKillCLEANDIRTYc                   @  s  e Zd Z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&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(ddwdxZ)dyS )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r6   )selfr6    r<   P/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/analysis/selfleaks.py__init__A      
zSelfLeakedVisitor.__init__opr   r2   c                 C     t S r9   r3   r;   r@   r<   r<   r=   
visit_gotoD      zSelfLeakedVisitor.visit_gotor   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_branchG   rE   zSelfLeakedVisitor.visit_branchr(   c                 C  rA   r9   )r4   rC   r<   r<   r=   visit_returnJ   s   zSelfLeakedVisitor.visit_returnr0   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_unreachableO   rE   z#SelfLeakedVisitor.visit_unreachabler	   c                 C  s    |j | ju s|j| ju rtS tS r9   )srcr6   destr4   r3   rC   r<   r<   r=   visit_assignR   s   zSelfLeakedVisitor.visit_assignr
   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_assign_multiW   rE   z$SelfLeakedVisitor.visit_assign_multir*   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_set_memZ   rE   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
isinstancer1   class_irinit_self_leakr3   check_register_op)r;   r@   rN   	self_typeclr<   r<   r=   
visit_call]   s   
zSelfLeakedVisitor.visit_callr"   c                 C  
   |  |S r9   rW   rC   r<   r<   r=   visit_method_callg   r?   z#SelfLeakedVisitor.visit_method_callr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_load_error_valuej   rE   z(SelfLeakedVisitor.visit_load_error_valuer   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_load_literalm   rE   z$SelfLeakedVisitor.visit_load_literalr   c                 C  "   |j j}||jr| |S tS r9   
class_typerU   
get_methodattrrW   r3   r;   r@   rY   r<   r<   r=   visit_get_attrp      
z SelfLeakedVisitor.visit_get_attrr)   c                 C  r`   r9   ra   re   r<   r<   r=   visit_set_attrw   rg   z SelfLeakedVisitor.visit_set_attrr!   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_load_static~   rE   z#SelfLeakedVisitor.visit_load_staticr   c                 C  r[   r9   r\   rC   r<   r<   r=   visit_init_static   r?   z#SelfLeakedVisitor.visit_init_staticr,   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_tuple_get   rE   z!SelfLeakedVisitor.visit_tuple_getr-   c                 C  r[   r9   r\   rC   r<   r<   r=   visit_tuple_set   r?   z!SelfLeakedVisitor.visit_tuple_setr   c                 C  r[   r9   r\   rC   r<   r<   r=   	visit_box   r?   zSelfLeakedVisitor.visit_boxr/   c                 C  r[   r9   r\   rC   r<   r<   r=   visit_unbox   r?   zSelfLeakedVisitor.visit_unboxr   c                 C  r[   r9   r\   rC   r<   r<   r=   
visit_cast   r?   zSelfLeakedVisitor.visit_castr%   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_raise_standard_error   rE   z,SelfLeakedVisitor.visit_raise_standard_errorr   c                 C  r[   r9   r\   rC   r<   r<   r=   visit_call_c   r?   zSelfLeakedVisitor.visit_call_cr$   c                 C  r[   r9   r\   rC   r<   r<   r=   visit_primitive_op   r?   z$SelfLeakedVisitor.visit_primitive_opr+   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_truncate   rE   z SelfLeakedVisitor.visit_truncater   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_extend   rE   zSelfLeakedVisitor.visit_extendr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_load_global   rE   z#SelfLeakedVisitor.visit_load_globalr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_int_op   rE   zSelfLeakedVisitor.visit_int_opr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_comparison_op   rE   z%SelfLeakedVisitor.visit_comparison_opr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_float_op   rE   z SelfLeakedVisitor.visit_float_opr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_float_neg   rE   z!SelfLeakedVisitor.visit_float_negr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_float_comparison_op   rE   z+SelfLeakedVisitor.visit_float_comparison_opr    c                 C  rA   r9   rB   rC   r<   r<   r=   visit_load_mem   rE   z SelfLeakedVisitor.visit_load_memr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_get_element_ptr   rE   z'SelfLeakedVisitor.visit_get_element_ptrr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_load_address   rE   z$SelfLeakedVisitor.visit_load_addressr   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_keep_alive   rE   z"SelfLeakedVisitor.visit_keep_aliver.   c                 C  rA   r9   rB   rC   r<   r<   r=   visit_unborrow   rE   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 r9   r:   ).0rI   r;   r<   r=   	<genexpr>   s    z6SelfLeakedVisitor.check_register_op.<locals>.<genexpr>)anysourcesr4   r3   rC   r<   r   r=   rW      s   z#SelfLeakedVisitor.check_register_opN)r6   r&   r7   r8   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r(   r7   r2   )r@   r0   r7   r2   )r@   r	   r7   r2   )r@   r
   r7   r2   )r@   r*   r7   r2   )r@   r   r7   r2   )r@   r"   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r)   r7   r2   )r@   r!   r7   r2   )r@   r   r7   r2   )r@   r,   r7   r2   )r@   r-   r7   r2   )r@   r   r7   r2   )r@   r/   r7   r2   )r@   r   r7   r2   )r@   r%   r7   r2   )r@   r   r7   r2   )r@   r$   r7   r2   )r@   r+   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r    r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r   r7   r2   )r@   r.   r7   r2   )r@   r'   r7   r2   )*__name__
__module____qualname____doc__r>   rD   rF   rG   rH   rK   rL   rM   rZ   r]   r^   r_   rf   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   rW   r<   r<   r<   r=   r5   8   sP    











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