o
    ÕjËÆ  ã                   @   sÚ  d dl Z e jeeeeeeeeeeeed ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	l	m
Z
mZ dd
lmZmZmZ G dd„ dejƒZeejƒZG dd„ dƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"ƒZG d#d$„ d$ƒZG d%d&„ d&ƒZ G d'd(„ d(e!ƒZ"G d)d*„ d*ƒZ#G d+d,„ d,ƒZ$G d-d.„ d.ƒZ%e j&d/ed0e'fd1d2„ƒZ(G d3d4„ d4e
ƒZ)G d5d6„ d6eƒZ*dS )7é    N)Ú
PyrexTypesÚ	ExprNodesÚNodesÚBuiltinÚOptionsÚTreeVisitorÚCythonTransformÚInternalErrorÚerrorÚwarningÚfake_rhs_exprÚTypedExprNodeé   )r   )r   )r   )r   )r   )r   r   )r
   r   r	   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )r   Nc                    s   t ƒ  |¡ || _|| _d S ©N)ÚsuperÚ__init__ÚtypeÚ_may_be_none)Úselfr   Úmay_be_noneÚpos©Ú	__class__© ú\/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/Cython/Compiler/FlowControl.pyr      s   
zTypedExprNode.__init__c                 C   s
   | j dkS ©NF)r   ©r   r   r   r   r      ó   
zTypedExprNode.may_be_none©NN)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r   r   r      s    r   c                   @   ó0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚControlBlocka¢  Control flow graph node. Sequence of assignments and name references.

       children  set of children nodes
       parents   set of parent nodes
       positions set of position markers

       stats     list of block statements
       gen       dict of assignments generated by this block
       bounded   set  of entries that are definitely bounded in this block

       Example:

        a = 1
        b = a + c # 'c' is already bounded or exception here

        stats = [Assignment(a), NameReference(a), NameReference(c),
                     Assignment(b)]
        gen = {Entry(a): Assignment(a), Entry(b): Assignment(b)}
        bounded = {Entry(a), Entry(c)}

    c                 C   sN   t ƒ | _t ƒ | _t ƒ | _g | _i | _t ƒ | _d| _d| _d| _	d| _
d| _d S ©Nr   )ÚsetÚchildrenÚparentsÚ	positionsÚstatsÚgenÚboundedÚi_inputÚi_outputÚi_genÚi_killÚi_stater   r   r   r   r   9   s   
zControlBlock.__init__c                 C   s   | j  o| j S r   )r*   r)   r   r   r   r   ÚemptyH   ó   zControlBlock.emptyc                 C   sH   | j D ]}|j | ¡ q| jD ]}|j  | ¡ q| j ¡  | j  ¡  dS )z'Detach block from parents and children.N)r'   r(   ÚremoveÚclear)r   ÚchildÚparentr   r   r   ÚdetachK   s   


zControlBlock.detachc                 C   s   | j  |¡ |j | ¡ d S r   )r'   Úaddr(   ©r   Úblockr   r   r   Ú	add_childT   s   zControlBlock.add_childN)r   r    r!   Ú__doc__r   r2   r8   r<   r   r   r   r   r$   "   s    	r$   c                   @   s   e Zd ZdZdd„ ZdS )Ú	ExitBlockzNon-empty exit point block.c                 C   ó   dS r   r   r   r   r   r   r2   \   ó   zExitBlock.emptyN)r   r    r!   r=   r2   r   r   r   r   r>   Y   s    r>   c                   @   ó   e Zd Zdd„ ZdS )ÚAssignmentListc                 C   s
   g | _ d S r   )r*   r   r   r   r   r   a   r   zAssignmentList.__init__N©r   r    r!   r   r   r   r   r   rB   `   ó    rB   c                   @   s†   e Zd ZdZdd„ Zddd„Zddd„Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚControlFlowaÈ  Control-flow graph.

       entry_point ControlBlock entry point for this graph
       exit_point  ControlBlock normal exit point
       block       ControlBlock current block
       blocks      set    children nodes
       entries     set    tracked entries
       loops       list   stack for loop descriptors
       exceptions  list   stack for exception descriptors
       in_try_block  int  track if we're in a try...except or try...finally block
    c                 C   sL   t ƒ | _t ƒ | _g | _g | _tƒ | _tƒ | _| j 	| j¡ | j| _
d| _d S r%   )r&   ÚblocksÚentriesÚloopsÚ
exceptionsr$   Úentry_pointr>   Ú
exit_pointr9   r;   Úin_try_blockr   r   r   r   r   r   s   
zControlFlow.__init__Nc                 C   s$   t ƒ }| j |¡ |r| |¡ |S )zoCreate floating block linked to `parent` if given.

           NOTE: Block is NOT added to self.blocks
        )r$   rF   r9   r<   ©r   r7   r;   r   r   r   Únewblock~   s
   
zControlFlow.newblockc                 C   s@   t ƒ }| j |¡ |r| |¡ n	| jr| j |¡ || _| jS )z|Create block children block linked to current or `parent` if given.

           NOTE: Block is added to self.blocks
        )r$   rF   r9   r<   r;   rM   r   r   r   Ú	nextblock‰   s   zControlFlow.nextblockc                 C   s.   |j rdS |jp|jp|jp|jp|jp|jS r   )Zis_anonymousÚis_localÚis_pyclass_attrÚis_argÚfrom_closureÚ
in_closureÚerror_on_uninitialized©r   Úentryr   r   r   Ú
is_tracked—   s   ÿÿþzControlFlow.is_trackedc                 C   sB   |j r|jr|jjs|jjs|jjs|jjs|jjr|jsdS dS ©NTF)	rP   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cython_lock_typeZis_cpp_classZis_cpp_optionalrV   r   r   r   Úis_statically_assignedž   s   ÿþýüûûz"ControlFlow.is_statically_assignedc                 C   s&   | j r| j j |jdd… ¡ dS dS )z0Mark position, will be used to draw graph nodes.Né   )r;   r)   r9   r   ©r   Únoder   r   r   Úmark_position©   s   ÿzControlFlow.mark_positionc                 C   sR   | j r%|  |¡r't||||d}| j j |¡ || j j|< | j |¡ d S d S d S )N©Ú	rhs_scope)r;   rX   ÚNameAssignmentr*   Úappendr+   rG   r9   )r   ÚlhsÚrhsrW   r`   Ú
assignmentr   r   r   Úmark_assignment®   s   üzControlFlow.mark_assignmentc                 C   sN   | j r#|  |¡r%t|||ƒ}| j j |¡ || j j|< | j |¡ d S d S d S r   )r;   rX   ÚArgumentr*   rb   r+   rG   r9   )r   rc   rd   rW   re   r   r   r   Úmark_argumentµ   s   üzControlFlow.mark_argumentc                 C   sL   | j r"|  |¡r$t||ƒ}| j j |¡ t| j j|< | j |¡ d S d S d S r   )	r;   rX   ÚNameDeletionr*   rb   ÚUninitializedr+   rG   r9   )r   r]   rW   re   r   r   r   Úmark_deletion¼   s   
üzControlFlow.mark_deletionc                 C   s<   | j r|  |¡r| j j t||ƒ¡ | j |¡ d S d S d S r   )r;   rX   r*   rb   ÚNameReferencerG   r9   ©r   r]   rW   r   r   r   Úmark_referenceÃ   s   ùzControlFlow.mark_referencec                 C   sÆ   | j h}tƒ }|r#| ¡ }| |¡ |jD ]}||vr | |¡ q|s	| j| }|D ]}| ¡  q*| | j ¡ |D ] }| ¡ rY|j	D ]}|jD ]}| 
|¡ qGqB| ¡  | |¡ q9|  j|8  _dS )z%Delete unreachable and orphan blocks.N)rJ   r&   Úpopr9   r'   rF   r8   r4   r2   r(   r<   )r   ÚqueueÚvisitedÚrootr6   Zunreachabler;   r7   r   r   r   Ú	normalizeÍ   s0   


€û



ÿ
€zControlFlow.normalizec                 C   sP  i | _ d}| jD ]}tƒ }| |_|_|| j |< |dK }q| jD ]'}|jD ]!}t|tƒrF||_| j |j	 }|j 
|¡ | j|O  _|dK }q%q | jD ]C}|j ¡ D ]&\}}| j | }|tu rh| j|jO  _n| j|jO  _| j|jO  _qR|j|_|jD ]}| j| j | jO  _q€qK| j  ¡ D ]}| j j|jO  _q”| jj| j_dS )z+Set initial state, map assignments to bits.r   N)ÚassmtsrG   rB   ÚmaskÚbitrF   r*   Ú
isinstancera   rW   rb   r+   Úitemsrj   r/   r0   r.   r,   ÚvaluesrJ   )r   rv   rW   rt   r;   Ústatr   r   r   Ú
initializeé   s>   





€ú


ÿzControlFlow.initializec                 C   st   t ƒ }| j| }||j@ r(|  |¡r| t|ƒ¡ n|jr#| t¡ n| t¡ |j	D ]}||j@ r7| |¡ q+|S r   )
r&   rt   rv   rZ   r9   ÚStaticAssignmentrS   ÚUnknownrj   r*   )r   ÚistaterW   Úretrt   Úassmtr   r   r   Úmap_one  s   






€zControlFlow.map_onec                 C   sj   d}|r3d}| j D ]%}d}|jD ]}||jO }q||j @ |jB }||jkr(d}||_||_q	|sdS dS )z(Per-block reaching definitions analysis.TFr   N)rF   r(   r.   r0   r/   r-   )r   Zdirtyr;   r-   r7   r.   r   r   r   Úreaching_definitions   s   


öz ControlFlow.reaching_definitionsr   )r   r    r!   r=   r   rN   rO   rX   rZ   r^   rf   rh   rk   rn   rs   r{   r   r‚   r   r   r   r   rE   e   s     



&rE   c                   @   rA   )Ú	LoopDescrc                 C   s   || _ || _g | _d S r   )Ú
next_blockÚ
loop_blockrI   )r   r„   r…   r   r   r   r   4  ó   
zLoopDescr.__init__NrC   r   r   r   r   rƒ   3  rD   rƒ   c                   @   s   e Zd ZdZddd„ZdS )ÚExceptionDescrzßException handling helper.

    entry_point   ControlBlock Exception handling entry point
    finally_enter ControlBlock Normal finally clause entry point
    finally_exit  ControlBlock Normal finally clause exit point
    Nc                 C   s   || _ || _|| _d S r   )rJ   Úfinally_enterÚfinally_exit)r   rJ   rˆ   r‰   r   r   r   r   B  r†   zExceptionDescr.__init__r   )r   r    r!   r=   r   r   r   r   r   r‡   :  s    r‡   c                   @   s:   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZdS )ra   Nc                 C   sP   |j d u r	tƒ |_ || _|| _|| _|j| _tƒ | _d| _d| _d | _	|| _
d S r   )Úcf_stater&   rc   rd   rW   r   ÚrefsrR   Úis_deletionÚinferred_typer`   )r   rc   rd   rW   r`   r   r   r   r   I  s   

zNameAssignment.__init__c                 C   ó   d| j j| jf S ©Nz%s(entry=%r)©r   r   rW   r   r   r   r   Ú__repr__X  ó   zNameAssignment.__repr__c                 C   s   | j  | jp	| jj¡| _| jS r   )rd   Ú
infer_typer`   rW   Úscoper   r   r   r   r   r“   [  s   zNameAssignment.infer_typec                 C   s   | j  | jp	| jj¡S r   )rd   Útype_dependenciesr`   rW   r”   r   r   r   r   r•   _  ó   z NameAssignment.type_dependenciesc                 C   s   | j jjs	| j jS | jS r   )rW   r   Úis_unspecifiedr   r   r   r   r   r   b  s   
zNameAssignment.typer   )	r   r    r!   r   r‘   r“   r•   Úpropertyr   r   r   r   r   ra   H  s    
ra   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )r|   z7Initialised at declaration time, e.g. stack allocation.c                    s8   |j jsd}nd }t|j ||jd}tƒ  |||¡ d S )NF©r   r   )r   Úis_pyobjectr   r   r   r   )r   rW   r   rc   r   r   r   r   k  s   
ÿzStaticAssignment.__init__c                 C   s   | j jS r   )rW   r   r   r   r   r   r“   t  ó   zStaticAssignment.infer_typec                 C   r?   )Nr   r   r   r   r   r   r•   w  r@   z"StaticAssignment.type_dependencies)r   r    r!   r=   r   r“   r•   r"   r   r   r   r   r|   i  s
    	r|   c                   @   rA   )rg   c                 C   s   t  | |||¡ d| _d S ©NT)ra   r   rR   )r   rc   rd   rW   r   r   r   r   |  ó   
zArgument.__init__NrC   r   r   r   r   rg   {  rD   rg   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ri   c                 C   s   t  | |||¡ d| _d S rœ   )ra   r   rŒ   )r   rc   rW   r   r   r   r   ‚  r   zNameDeletion.__init__c                 C   s4   | j  | jj¡}|js| | jj¡rtjS || _|S r   )	rd   r“   rW   r”   rš   Zcan_coerce_to_pyobjectr   Úpy_object_typer   )r   r   r   r   r   r“   †  s   ÿzNameDeletion.infer_typeN)r   r    r!   r   r“   r   r   r   r   ri     s    ri   c                   @   ó   e Zd ZdZdS )rj   zDefinitely not initialised yet.N©r   r    r!   r=   r   r   r   r   rj     ó    rj   c                   @   r    )r}   z7Coming from outer closure, might be initialised or not.Nr¡   r   r   r   r   r}   “  r¢   r}   c                   @   rž   )rl   c                 C   s*   |j d u r	tƒ |_ || _|| _|j| _d S r   )rŠ   r&   r]   rW   r   rm   r   r   r   r   ˜  s
   
zNameReference.__init__c                 C   rŽ   r   r   r   r   r   r   r‘   Ÿ  r’   zNameReference.__repr__N)r   r    r!   r   r‘   r   r   r   r   rl   —  s    rl   c                       s0   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚControlFlowStateFc                    sj   t |v r| t ¡ d| _|sd| _nt|v r| t¡ d| _n	t|ƒdkr(d| _tƒ  dd„ |D ƒ¡ d S )NTr   c                 S   s   g | ]	}|j tur|‘qS r   )rd   r   )Ú.0Úir   r   r   Ú
<listcomp>¼  s    z-ControlFlowState.__init__.<locals>.<listcomp>)	rj   ÚdiscardÚcf_maybe_nullÚ
cf_is_nullr}   ÚlenÚ	is_singler   r   )r   Ústater   r   r   r   ®  s   
€
ÿzControlFlowState.__init__c                 C   s   | d S r%   r   r   r   r   r   Úone¾  r›   zControlFlowState.one)	r   r    r!   r¨   r©   r«   r   r­   r"   r   r   r   r   r£   £  s    r£   c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	dS )Ú	GVContextzGraphviz subgraph object.c                 C   s   i | _ d| _g | _i | _d S r%   )ÚblockidsÚnextidr'   Úsourcesr   r   r   r   r   Å  s   
zGVContext.__init__c                 C   s   | j  |¡ d S r   )r'   rb   )r   r6   r   r   r   r9   Ë  r3   zGVContext.addc                 C   s2   || j vrd| j | j |< |  jd7  _| j | S )Nzblock%dr   )r¯   r°   r:   r   r   r   ÚnodeidÎ  s   

zGVContext.nodeidc                 C   st   |j sdS t|j ƒ}t|j ƒ}|d }|| jvr!t| ¡ ƒ| j|< | j| }d dd„ ||d d |d … D ƒ¡S )NÚ r   ú\nc                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)r¤   Úlr   r   r   r¦   Ý  s    z-GVContext.extract_sources.<locals>.<listcomp>r   )r)   ÚminÚmaxr±   ÚlistÚ	get_linesÚjoin)r   r;   ÚstartÚstopZsrcdescrÚlinesr   r   r   Úextract_sourcesÔ  s   



(zGVContext.extract_sourcesFc                 C   s@   |  d| ¡ |  d¡ | jD ]	}| || |¡ q|  d¡ dS )zRender graphviz dot graphzdigraph %s {
z node [shape=box];
z}
N)Úwriter'   Úrender)r   ÚfpÚnameÚannotate_defsr6   r   r   r   rÁ   ß  s
   

zGVContext.renderc                 C   s   |  dd¡  dd¡S )Nú"z\"Ú
r´   )Úreplace)r   Útextr   r   r   Úescapeç  s   zGVContext.escapeN©F)
r   r    r!   r=   r   r9   r²   r¿   rÁ   rÉ   r   r   r   r   r®   Â  s    
r®   c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )	ÚGVzGraphviz DOT renderer.c                 C   s   || _ || _d S r   )rÃ   Úflow)r   rÃ   rÌ   r   r   r   r   î  ó   
zGV.__init__Fc           	   	   C   s  |  d| j ¡ | jjD ]R}| |¡}|rI|jD ]0}t|tƒr3|d|jj|j	r)dnd|j
d f 7 }qt|tƒrH|jrH|d|jj|j
d f 7 }q|sMd}| |¡}|  d|| |¡f ¡ q| jjD ]}| |¡}|jD ]}|  d	|| |¡f ¡ qmqc|  d
¡ d S )Nz subgraph %s {
z
 %s [%s %s]ZdeletionZ
definitionr   z
 %s [reference %s]r2   z  %s [label="%s"];
z  %s -> %s;
z }
)rÀ   rÃ   rÌ   rF   r¿   r*   rw   ra   rW   rŒ   r   rl   r²   rÉ   r'   )	r   rÂ   ÚctxrÄ   r;   Úlabelrz   Úpidr6   r   r   r   rÁ   ò  s.   



ÿ
€


ÿz	GV.renderNrÊ   )r   r    r!   r=   r   rÁ   r   r   r   r   rË   ë  s    rË   c                   @   r#   )ÚMessageCollectionz/Collect error/warnings messages first then sortc                 C   s   t ƒ | _d S r   )r&   Úmessagesr   r   r   r   r     s   zMessageCollection.__init__c                 C   ó   | j  |d|f¡ d S rœ   ©rÒ   r9   ©r   r   Úmessager   r   r   r
     r–   zMessageCollection.errorc                 C   rÓ   r   rÔ   rÕ   r   r   r   r     r–   zMessageCollection.warningc                 C   s6   t | jƒD ]\}}}|rt||ƒ qt||dƒ qd S ©Nr[   )ÚsortedrÒ   r
   r   )r   r   Úis_errorrÖ   r   r   r   Úreport  s
   üzMessageCollection.reportN)r   r    r!   r=   r   r
   r   rÚ   r   r   r   r   rÑ   	  s    rÑ   rÌ   Úcompiler_directivesc                 C   sî  |   ¡  |  ¡  tƒ }i }tƒ }| jD ]~}|j}|jD ]u}| j|j }|  ||j¡}	t	|t
ƒrb|jj |	¡ | |j¡ ||j @ }|jrK||jO }n||jO }| |¡ |jtura|jj |¡ qt	|tƒr|j||j< |jj |¡ |jj |	¡ |	 t¡ |	 t¡ |	D ]}
|
j |¡ q‡qq|d }|d }|d }|d }tƒ }|D ](}t|jv rÀd|_t|jƒdkr¼d|_ q§d|_ q§t|jv rÉd|_q§d|_ d|_q§| !¡ D ]‹\}}t|jv rOd|_|j"sõt|jƒdkrõ|j#|j$j%vrõd|_ |j&s|j"s|j's|j(j)rqÔ|j r7|j*s7|j+s!t,j+r,|j(j-s!|j(j.r,| /|j0d|j# ¡ qÔ| 1|j0d|j# ¡ qÔ|rNd	|j# }|j*rG|d
7 }| 1|j0|¡ qÔt|jv rYd|_qÔd|_ d|_qÔ|D ]8}
|
js™|
jj's™|
jj*s™|
jjr•|r•|
j2rŠ| 1|
j0d|
jj# ¡ n| 1|
j0d|
jj# ¡ d|
j_3qb| j4D ]:}|js×|j's×|j#dkrÔ|j# 5d¡sÔ|j2rÇ|rÆ| 1|j0d|j# ¡ n|rÔ| 1|j0d|j# ¡ d|_3qž| 6¡  |D ]	}t7|jƒ|_qß|D ]	}t7|jƒ|_qëd S )Nzwarn.maybe_uninitializedzwarn.unused_resultzwarn.unusedzwarn.unused_argTr   Fz0local variable '%s' referenced before assignmentz9local variable '%s' might be referenced before assignmentz% (maybe initialized inside a closure)zUnused argument value '%s'zUnused result in '%s'Ú_ZunusedzUnused argument '%s'zUnused entry '%s')8r{   r‚   r&   rF   r-   r*   rt   rW   r   rw   ra   rc   rŠ   Úupdater9   ru   rŒ   rv   rd   r   Zcf_assignmentsrb   rl   r]   Zcf_referencesr§   rj   r}   r‹   rÑ   r¨   rª   r©   rx   rS   rÃ   r”   Zscope_predefined_namesZ
allow_nullrQ   r   rÙ   rT   rU   r   rš   r—   r
   r   r   rR   Zcf_usedrG   Ú
startswithrÚ   r£   )rÌ   rÛ   ÚassignmentsZ
referencesZassmt_nodesr;   r1   rz   Zi_assmtsr¬   r€   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argrÒ   r]   rW   Úmsgr   r   r   Úcheck_definitions  s   





€


€è

ÿÿÿþþÿþÿþ
þ€ÿ
ÿ
ÿ€
ÿ
ÿ€
ÿ€ÿrá   c                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚAssignmentCollectorc                    s   t ƒ  ¡  g | _d S r   )r   r   rß   r   r   r   r   r   ©  s   

zAssignmentCollector.__init__c                 C   s   |   | d d ¡ d S r   )Z_visitchildrenr   r   r   r   Ú
visit_Node­  r’   zAssignmentCollector.visit_Nodec                 C   s   | j  |j|jf¡ d S r   )rß   rb   rc   rd   r\   r   r   r   Úvisit_SingleAssignmentNode°  s   z.AssignmentCollector.visit_SingleAssignmentNodec                 C   s"   |j D ]}| j ||jf¡ qd S r   )Úlhs_listrß   rb   rd   ©r   r]   rc   r   r   r   Úvisit_CascadedAssignmentNode³  s   
ÿz0AssignmentCollector.visit_CascadedAssignmentNode)r   r    r!   r   rã   rä   rç   r"   r   r   r   r   râ   ¨  s
    râ   c                   @   s˜  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdddd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zded:d;„Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3dS )fÚControlFlowAnalysisc                 C   s8   || j kr| jS t| jƒD ]\}}||u r|  S qJ ‚r   )ÚenvrÌ   ÚreversedÚstack)r   ré   ÚerÌ   r   r   r   Úfind_in_stackº  s   
ÿz!ControlFlowAnalysis.find_in_stackc                 C   sÊ   | j d }|r
tƒ nd | _ddlm} |ƒ | _tƒ | _d| _|j	| _
tƒ | _g | _ttjdd| _|  |¡ t| j| j ƒ |rc| j d }t|dƒ}| jj|d	|d
 W d   ƒ |S 1 s^w   Y  |S )Núcontrol_flow.dot_outputr   )ÚConstantFoldingFT©r   zcontrol_flow.dot_annotate_defsÚwÚmodule)rÄ   )Úcurrent_directivesr®   Úgv_ctxZOptimizerï   Úconstant_folderr&   Ú
reductionsÚin_inplace_assignmentr”   ré   rE   rÌ   rë   r   r   rŸ   Úobject_exprÚvisitchildrenrá   ÚopenrÁ   )r   r]   Z
dot_outputrï   rÄ   rÂ   r   r   r   Úvisit_ModuleNodeÂ  s(   



ÿþz$ControlFlowAnalysis.visit_ModuleNodec                 C   sŠ  |j D ]
}|jr|  |¡ q|  |d¡ | j | j| jf¡ |j| _tƒ | _|jj	 
¡ D ]}| j |¡r;| jj	 |¡ q,|  |¡ | j ¡  |j D ]}|  |¡ qI|jrd| j |jttjdd|jj¡ |jrw| j |jttjdd|jj¡ |  |j¡ |jr‡|  |jj¡ | jjr”| jj | jj¡ | j ¡  t| j| j ƒ | jj! | jj"¡ | j#d urº| j# t$|jj%| jƒ¡ | j &¡ \| _| _|S )N)Z
decoratorsFrð   )'ÚargsÚdefaultrù   rë   rb   ré   rÌ   Zlocal_scoperE   rG   ry   rX   r9   r^   rO   Ú_visitZstar_argrh   r   r   Z
tuple_typerW   Zstarstar_argÚ	dict_typeÚbodyZis_generatorZgbodyr;   r<   rK   rs   rá   ró   rF   rJ   rô   rË   rÃ   ro   ©r   r]   ÚargrW   r   r   r   Úvisit_FuncDefNodeÛ  sT   

€€



ÿý
ÿý

z%ControlFlowAnalysis.visit_FuncDefNodec                 C   s   d|_ |  |¡S rœ   )Úusedr  r\   r   r   r   Úvisit_DefNode  rÍ   z!ControlFlowAnalysis.visit_DefNodec                 C   ó   |S r   r   r\   r   r   r   Úvisit_GeneratorBodyDefNode  r@   z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec                 C   r  r   r   r\   r   r   r   Úvisit_CTypeDefNode  r@   z&ControlFlowAnalysis.visit_CTypeDefNodeNc           	      C   s2  | j jsd S | j jr| j jd }| j j |j¡ | j  ¡  |s"| j}|jrI|jd ur.|j}n| j	 
|j¡}|d u r;d S | j j||||pE| j	d n5|jryt|jƒD ]&\}}|jrbttjd|jd}n|| ju rj|}n| |¡}| j|||d qQn|  |¡ | j jr—| j jd }| j j |j¡ | j  ¡  d S d S )Néÿÿÿÿr_   Fr™   )rÌ   r;   rI   r<   rJ   rO   rø   Úis_namerW   ré   ÚlookuprÃ   rf   Úis_sequence_constructorÚ	enumeraterü   Z
is_starredr   r   Z	list_typer   Zinferable_item_noderþ   )	r   rc   rd   r`   Z	exc_descrrW   r¥   r  Z	item_noder   r   r   rf     s<   



ø

ýz#ControlFlowAnalysis.mark_assignmentc                 C   s   | j d r| j |¡ dS dS )z'Mark position if DOT output is enabled.rî   N)ró   rÌ   r^   r\   r   r   r   r^   ;  s   
ÿz!ControlFlowAnalysis.mark_positionc                 C   s0   |j D ]\}}|dkr|  |¡ q|  |¡ |S )NÚ*)rx   rf   rù   )r   r]   rÃ   Útargetr   r   r   Úvisit_FromImportStatNode@  s   
€
z,ControlFlowAnalysis.visit_FromImportStatNodec                 C   s   t dt|ƒ ƒ‚)NzUnhandled assignment node %s)r	   r   r\   r   r   r   Úvisit_AssignmentNodeG  r3   z(ControlFlowAnalysis.visit_AssignmentNodec                 C   s    |   |j¡ |  |j|j¡ |S r   )rþ   rd   rf   rc   r\   r   r   r   rä   J  s   z.ControlFlowAnalysis.visit_SingleAssignmentNodec                 C   s*   |   |j¡ |jD ]	}|  ||j¡ q	|S r   )rþ   rd   rå   rf   ræ   r   r   r   rç   O  s   
z0ControlFlowAnalysis.visit_CascadedAssignmentNodec                 C   sJ   t ƒ }| |¡ |jD ]	\}}|  |¡ q|jD ]
\}}|  ||¡ q|S r   )râ   rù   rß   rþ   rf   )r   r]   Ú	collectorrc   rd   r   r   r   Úvisit_ParallelAssignmentNodeU  s   
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec                 C   s2   d| _ |  |¡ d| _ |  |j|  | ¡ ¡¡ |S rY   )r÷   rù   rf   rc   rõ   Zcreate_binop_noder\   r   r   r   Úvisit_InPlaceAssignmentNode^  s
   
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec                 C   sr   |j D ]3}|jr1|jp| j |j¡}|js|jr!t|j	d|j ƒ |j
s)|  |¡ | j ||¡ q|  |¡ q|S )Nz7can not delete variable '%s' referenced in nested scope)rü   r
  rW   ré   r  rÃ   rT   rS   r
   r   Zignore_nonexistingrþ   rÌ   rk   r  r   r   r   Úvisit_DelStatNodee  s   
ÿÿ
z%ControlFlowAnalysis.visit_DelStatNodec                 C   s6   | j  |j¡}|r|j }| j |t|j|ƒ|¡ |S r   )ré   r  rÃ   Znot_nonerÌ   rh   r   r   )r   r]   rW   r   r   r   r   Úvisit_CArgDeclNodet  s   ÿz&ControlFlowAnalysis.visit_CArgDeclNodec                 C   sN   | j jr%|jp| j |j¡}|r%| j  ||¡ || jv r%| js%t	|j
dƒ |S )Nz+Cannot read reduction variable in loop body)rÌ   r;   rW   ré   r  rÃ   rn   rö   r÷   r
   r   rm   r   r   r   Úvisit_NameNode|  s   ÿz"ControlFlowAnalysis.visit_NameNodec                 C   s6   | j jr|jD ]}|  |¡ | j jsd|_ |S q|S rœ   )rÌ   r;   r*   rþ   Zis_terminator)r   r]   rz   r   r   r   Úvisit_StatListNodeˆ  s   

ýz&ControlFlowAnalysis.visit_StatListNodec                 C   s   |   |¡ |  |¡ |S r   )rù   r^   r\   r   r   r   rã   ‘  s   

zControlFlowAnalysis.visit_Nodec                 C   r  r   r   r\   r   r   r   Úvisit_SizeofVarNode–  r@   z'ControlFlowAnalysis.visit_SizeofVarNodec                 C   r  r   r   r\   r   r   r   Úvisit_TypeidNode™  r@   z$ControlFlowAnalysis.visit_TypeidNodec                 C   sÂ   | j  ¡ }| j j}|jD ]$}| j  |¡}|  |j¡ | j  ¡  |  |j¡ | j jr0| j j |¡ q|j	rM| j j|d |  |j	¡ | j jrL| j j |¡ n| |¡ |j
r[|| j _|S d | j _|S ©N©r7   )rÌ   rN   r;   Z
if_clausesrO   rþ   Ú	conditionr   r<   Úelse_clauser(   )r   r]   r„   r7   Úclauser   r   r   Úvisit_IfStatNodeœ  s,   


€€
ÿz$ControlFlowAnalysis.visit_IfStatNodec                 C   sˆ   |   |¡ | j ¡ }| jj}| j |¡}|  |j¡ | j ¡  |  |j¡ | jjr0| jj |¡ | |¡ |j	r>|| j_|S d| j_|S )z@Essentially an if-condition that wraps a RaiseStatNode.
        N)
r^   rÌ   rN   r;   rO   rþ   r  Ú	exceptionr<   r(   ©r   r]   r„   r7   r   r   r   Úvisit_AssertStatNode¶  s   



ÿz(ControlFlowAnalysis.visit_AssertStatNodec                 C   sà   | j  ¡ }| j  ¡ }| j j t||ƒ¡ |jr|  |j¡ | j  ¡  |  |j¡ | j j 	¡  | j j
r@| j j
 |¡ | j j
 |¡ |jr\| j j|d |  |j¡ | j j
r[| j j
 |¡ n| |¡ |jrj|| j _
|S d | j _
|S r  )rÌ   rO   rN   rH   rb   rƒ   r  rþ   r   ro   r;   r<   r  r(   ©r   r]   Zcondition_blockr„   r   r   r   Úvisit_WhileStatNodeÊ  s.   


€
ÿz'ControlFlowAnalysis.visit_WhileStatNodec                 C   sä  d}|j j}|j}|j jp| j}t|tjƒrƒ|j}|j	d u rƒ|j
rƒ| |j¡}|r,|jrƒ|jdkr>t|jƒdkr>|jd }nE|jdkrƒt|jƒdkrƒ|jrƒt|jƒdkrƒ|jd }|j
rƒ| |¡}	|	jrƒ| j|jd tj|jdtjd|j jd	 |jd }|jd }t|tjƒrá|j}|j	d u rá|j
rá|jd
v rá| |j¡}|rá|jrá|jtju rád}|jd d… D ]}
| j||
|j jd	 q³t|jƒdkrá| j||  t |jd|jd |jd ¡¡|j jd	 |sð| j||j|j jd	 d S d S )NFrê   r   r   r  r[   ZPY_SSIZE_T_MAX)Úvaluer   r_   )ÚrangeÚxrangeTú+)ÚiteratorÚsequencer  Ú
expr_scoperé   rw   r   ZSimpleCallNodeÚfunctionr   r
  r  rÃ   Ú
is_builtinrª   rü   r  r“   Zis_builtin_typerf   ZIntNoder   r   Zc_py_ssize_t_typeZis_typer   r   Z
range_typerõ   Ú
binop_nodeÚitem)r   r]   Z
is_specialr+  r  ré   r-  rW   r*  Ziterator_typer  r   r   r   Úmark_forloop_targetè  s^   



ÿü


ýÿûùz'ControlFlowAnalysis.mark_forloop_targetc                 C   sx   |j }|jd d… D ]}|  ||¡ q
t|jƒdkr0|  ||  t |jd|jd |jd ¡¡¡ |js:|  |¡ d S d S )Nr[   r)  r   )r  rü   rf   rª   rõ   r   r/  r   )r   r]   r  r  r   r   r   Ú mark_parallel_forloop_assignment  s   
ýÿþz4ControlFlowAnalysis.mark_parallel_forloop_assignmentc                 C   s
   |   |¡S r   )Úvisit_ForInStatNoder\   r   r   r   Úvisit_AsyncForStatNode*  r   z*ControlFlowAnalysis.visit_AsyncForStatNodec                 C   s0  | j  ¡ }| j  ¡ }| j j t||ƒ¡ |  |j¡ | j  ¡  t|t	j
ƒr+|  |¡ n!t|t	jƒr:|  |j|j¡ nt|t	jƒrF|  |¡ nJ t|ƒƒ‚| j  ¡  |  |j¡ | j j ¡  | j jrh| j j |¡ |jr„| j j|d |  |j¡ | j jrƒ| j j |¡ n| |¡ |jr’|| j _|S d | j _|S )NFr  )rÌ   rO   rN   rH   rb   rƒ   rþ   r*  rw   r   ZForInStatNoder1  ZAsyncForStatNoderf   r  r0  ZParallelRangeNoder2  r   r   ro   r;   r<   r  r(   r$  r   r   r   r3  -  s:   



€
ÿz'ControlFlowAnalysis.visit_ForInStatNodec                 C   s.   |j D ]}|r|j|ur| j ||j¡ qd S r   )Úassigned_nodesrW   rÌ   rk   )r   r]   ÚexcludeÚprivate_noder   r   r   Ú_delete_privatesX  s
   
€þz$ControlFlowAnalysis._delete_privatesc                 C   sf   | j }t|jdƒr.t|ƒ| _ |jD ]}d|j_|j|j \}}|r(| j  |j¡ q|  	|¡}|| _ |S )NrW   T)
rö   Úhasattrr  r&   r5  rW   rU   rß   r9   r3  )r   r]   rö   r7  r   Z	reductionr   r   r   Úvisit_ParallelRangeNode]  s   

€
z+ControlFlowAnalysis.visit_ParallelRangeNodec                 C   s,   |j D ]}d|j_q|  |¡ |  |¡ |S rœ   )r5  rW   rU   rù   r8  )r   r]   r7  r   r   r   Úvisit_ParallelWithBlockNodep  s
   



z/ControlFlowAnalysis.visit_ParallelWithBlockNodec                 C   s8  | j  ¡ }| j  ¡ }| j j t||ƒ¡ |  |j¡ |  |j¡ |j	d ur+|  |j	¡ | j  ¡  |  
|j|j¡ |j	d urP|  
|j|  t |jd|j|j	¡¡¡ | j  ¡  |  |j¡ | j j ¡  | j jrl| j j |¡ |jrˆ| j j|d |  |j¡ | j jr‡| j j |¡ n| |¡ |jr–|| j _|S d | j _|S )Nr)  r  )rÌ   rO   rN   rH   rb   rƒ   rþ   Úbound1Úbound2Ústeprf   r  rõ   r   r/  r   r   ro   r;   r<   r  r(   r$  r   r   r   Úvisit_ForFromStatNodez  s<   




ÿ
€
ÿz)ControlFlowAnalysis.visit_ForFromStatNodec                 C   s   t dƒ‚)NzGeneric loops are not supported)r	   r\   r   r   r   Úvisit_LoopNodeŸ  r›   z"ControlFlowAnalysis.visit_LoopNodec                 C   s   |   |j|jj¡ |S r   )rf   rc   Z	with_nodeÚ
enter_callr\   r   r   r   Ú"visit_WithTargetAssignmentStatNode¢  s   z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec                 C   s(   |   |j¡ |   |j¡ |   |j¡ |S r   )rþ   ÚmanagerrA  r   r\   r   r   r   Úvisit_WithStatNode¦  s   z&ControlFlowAnalysis.visit_WithStatNodec                 C   s†  | j  ¡ }| j  ¡  | j  ¡ }| j j t|ƒ¡ | j  ¡  | j j |¡ | j  ¡  | j  jd7  _|  	|j
¡ | j  jd8  _| j j ¡  | j jrb|jrW| j  ¡  |  	|j¡ | j jrb| j j |¡ |jD ]@}|| j _|jrz|jD ]}|  	|¡ qqn	 | j j| j jd}| j  ¡  |jr”|  |j|j¡ |  	|j
¡ | j jr¥| j j |¡ qe| j jr´| | j jd j¡ |jr½|| j _|S d | j _|S )Nr   r  r	  )rÌ   rN   rI   rb   r‡   rO   r;   r<   rL   rþ   r   ro   r  Zexcept_clausesÚpatternr  rf   Ú	exc_valuerJ   r(   )r   r]   r„   rJ   r  rE  r   r   r   Úvisit_TryExceptStatNode¬  sN   







ÿ
€ÿz+ControlFlowAnalysis.visit_TryExceptStatNodec                 C   sV  | j  ¡ }| j  ¡ }|| j _|  |j¡ | j jr(| j jr(| j j | j jd j¡ | j  ¡ }|| j _|  |j	¡ | j j}t
|||ƒ}| j j |¡ | j jrV| j jd j |¡ || j _| |¡ | j  ¡  | j  jd7  _|  |j¡ | j  jd8  _| j j ¡  | j jr| j jd j ¡  | j jr©| j j |¡ |r¥| j j|d| j _|S d | j _|S )Nr	  r   r  )rÌ   rO   rN   r;   rþ   Zfinally_except_clauserI   r<   rJ   Zfinally_clauser‡   rb   rH   rL   r   ro   )r   r]   Z
body_blockrJ   rˆ   r‰   Údescrr   r   r   Úvisit_TryFinallyStatNodeß  s<   




ÿz,ControlFlowAnalysis.visit_TryFinallyStatNodec                 C   sN   |   |¡ |  |¡ | jjr| jj | jjd j¡ d | j_| jjr%d|_|S )Nr	  T)r^   rù   rÌ   rI   r;   r<   rJ   rL   r\   r   r   r   Úvisit_RaiseStatNode  s   

z'ControlFlowAnalysis.visit_RaiseStatNodec                 C   s6   |   |¡ | jjr| jj | jjd j¡ d | j_|S ©Nr	  )r^   rÌ   rI   r;   r<   rJ   r\   r   r   r   Úvisit_ReraiseStatNode  s
   
z)ControlFlowAnalysis.visit_ReraiseStatNodec                 C   s¨   |   |¡ |  |¡ t| jjd d d… ƒ}|D ])}|jr@| jj |j¡ |jr>| jj	}|D ]
}|jr7|j} nq-|j |¡  nq| jjrN| jj | jj	¡ d | j_|S rK  )
r^   rù   ÚiterrÌ   rI   rˆ   r;   r<   r‰   rK   )r   r]   Zouter_exception_handlersÚhandlerrK   Znext_handlerr   r   r   Úvisit_ReturnStatNode  s(   

þöz(ControlFlowAnalysis.visit_ReturnStatNodec                 C   ó‚   | j js|S | j jd }|  |¡ |jd d d… D ]}|jr2| j j |j¡ |jr0|j |j¡  n	q| j j |j¡ d | j _|S rK  )	rÌ   rH   r^   rI   rˆ   r;   r<   r‰   r„   ©r   r]   Úloopr!  r   r   r   Úvisit_BreakStatNode.  ó   
üz'ControlFlowAnalysis.visit_BreakStatNodec                 C   rP  rK  )	rÌ   rH   r^   rI   rˆ   r;   r<   r‰   r…   rQ  r   r   r   Úvisit_ContinueStatNode?  rT  z*ControlFlowAnalysis.visit_ContinueStatNodec                 C   sH   |j r| j | j| jf¡ |j | _|  |j¡ |j r"| j ¡ \| _}|S r   )r,  rë   rb   ré   rÌ   rþ   rR  ro   ©r   r]   rÜ   r   r   r   Úvisit_ComprehensionNodeP  s   z+ControlFlowAnalysis.visit_ComprehensionNodec                 C   sp   t |tjtjfƒsJ |ƒ‚|jr%| j | j| jf¡ |  	|j¡| _|j| _|  
|¡ |jr6| j ¡ \| _| _|S r   )rw   r   ZIteratorNodeZAsyncIteratorNoder,  rë   rb   ré   rÌ   rí   rù   ro   r\   r   r   r   Úvisit_ScopedExprNodeZ  s   
z(ControlFlowAnalysis.visit_ScopedExprNodec                 C   s˜   |   |d¡ | j |j|j| j |jj¡¡ | j 	| j| jf¡ |j
| _| j ¡  |jr7| j |jt|jj¡ |   |d¡ | j ¡  | j ¡ \| _}|S )N)ÚdictÚ	metaclassZmkwÚbasesZclass_result)r   )rù   rÌ   rf   r  Zclassobjré   r  rÃ   rë   rb   r”   rO   Zdoc_noder   rW   ro   rV  r   r   r   Úvisit_PyClassDefNodeg  s   ÿ

z(ControlFlowAnalysis.visit_PyClassDefNodec                 C   s,   | j  |j| jf¡ |  |¡ | j  ¡  |S r   )rë   rb   r”   rÌ   rù   ro   r\   r   r   r   Úvisit_CClassDefNodev  s   

z'ControlFlowAnalysis.visit_CClassDefNodec                 C   s$   |j jr|  |j t¡ |  |¡ |S r   )Úoperandr
  rf   r   rù   r\   r   r   r   Úvisit_AmpersandNode}  s   
z'ControlFlowAnalysis.visit_AmpersandNodec                 C   s„   t |jƒdks	J ‚| j ¡ }| jj}|  |j¡ | j ¡  |  |j¡ | jjr.| jj 	|¡ | 	|¡ |j
r<|| j_|S d | j_|S r×   )rª   ÚsubexprsrÌ   rN   r;   rþ   Zoperand1rO   Zoperand2r<   r(   r"  r   r   r   Úvisit_BoolBinopNode„  s   


ÿz'ControlFlowAnalysis.visit_BoolBinopNodec                 C   sª   t |jƒdks	J ‚|  |j¡ | jj}| j ¡ }| j ¡  |  |j¡ | jjr.| jj 	|¡ | jj|d |  |j
¡ | jjrF| jj 	|¡ |jrO|| j_|S d | j_|S )Né   r  )rª   r`  rþ   ÚtestrÌ   r;   rN   rO   Ztrue_valr<   Z	false_valr(   )r   r]   r7   r„   r   r   r   Úvisit_CondExprNodeš  s"   

ÿz&ControlFlowAnalysis.visit_CondExprNoder   r   )4r   r    r!   rí   rû   r  r  r  r  rf   r^   r  r  rä   rç   r  r  r  r  r  r  rã   r  r  r   r#  r%  r1  r2  r4  r3  r8  r:  r;  r?  r@  rB  rD  rG  rI  rJ  rL  rO  rS  rU  rW  rX  r\  r]  r_  ra  rd  r   r   r   r   rè   ¸  sd    2
$		4
+
%3'

rè   )+ÚcythonZdeclareÚobjectr³   r   r   r   r   r   ZVisitorr   r   ZErrorsr
   r   r	   ZExprNoder   Zunspecified_typer   r$   r>   rB   rE   rƒ   r‡   ra   r|   rg   ri   rj   r}   rl   r¹   r£   r®   rË   rÑ   ZcfuncrY  rá   râ   rè   r   r   r   r   Ú<module>   sL   ý
7 O!) 