U
    †µ“eÞ¾  ã                   @   sî  d dl mZ 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eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG d d!„ d!eƒZG d"d#„ d#eƒZ G d$d%„ d%eƒZ!G d&d'„ d'eƒZ"G d(d)„ d)e#ƒZ$G d*d+„ d+eƒZ%G d,d-„ d-eƒZ&G d.d/„ d/eƒZ'd0d1„ Z(G d2d3„ d3eƒZ)G d4d5„ d5eƒZ*dS )6é    )Úabsolute_importN)Ú
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 t| ƒ |¡ || _|| _d S ©N)Úsuperr   Ú__init__ÚtypeÚ_may_be_none)Úselfr   Úmay_be_noneÚpos©Ú	__class__© ú?/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Compiler/FlowControl.pyr      s    zTypedExprNode.__init__c                 C   s
   | j dkS ©NF)r   ©r   r   r   r   r      s    zTypedExprNode.may_be_none)NN)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r   r   r      s   r   c                   @   s0   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   ;   s    zControlBlock.__init__c                 C   s   | j  o| j S r   )r(   r'   r   r   r   r   ÚemptyJ   s    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   ÚdetachM   s    


zControlBlock.detachc                 C   s   | j  |¡ |j | ¡ d S r   )r%   Úaddr&   ©r   Úblockr   r   r   Ú	add_childV   s    zControlBlock.add_childN)r   r   r    Ú__doc__r   r0   r5   r9   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   s   dS r   r   r   r   r   r   r0   ^   s    zExitBlock.emptyN)r   r   r    r:   r0   r   r   r   r   r;   [   s   r;   c                   @   s   e Zd Zdd„ ZdS )ÚAssignmentListc                 C   s
   g | _ d S r   )r(   r   r   r   r   r   c   s    zAssignmentList.__init__N©r   r   r    r   r   r   r   r   r<   b   s   r<   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_pointr6   r8   Úin_try_blockr   r   r   r   r   t   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"   r?   r6   r9   ©r   r4   r8   r   r   r   Únewblock€   s
    
zControlFlow.newblockc                 C   s@   t ƒ }| j |¡ |r"| |¡ n| jr4| j |¡ || _| jS )z|Create block children block linked to current or `parent` if given.

           NOTE: Block is added to self.blocks
        )r"   r?   r6   r9   r8   rF   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   s:   |j r6|jr6|jjs2|jjs2|jjs2|jjr6|js6dS dS ©NTF)rI   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cpp_classZis_cpp_optionalrO   r   r   r   Úis_statically_assigned    s    ÿþýüüz"ControlFlow.is_statically_assignedc                 C   s"   | j r| j j |jdd… ¡ dS )z0Mark position, will be used to draw graph nodes.Né   )r8   r'   r6   r   ©r   Únoder   r   r   Úmark_positionª   s    zControlFlow.mark_positionc                 C   sJ   | j rF|  |¡rFt||||d}| j j |¡ || j j|< | j |¡ d S )N©Ú	rhs_scope)r8   rQ   ÚNameAssignmentr(   Úappendr)   r@   r6   )r   ÚlhsÚrhsrP   rY   Ú
assignmentr   r   r   Úmark_assignment¯   s
    zControlFlow.mark_assignmentc                 C   sF   | j rB|  |¡rBt|||ƒ}| j j |¡ || j j|< | j |¡ d S r   )r8   rQ   ÚArgumentr(   r[   r)   r@   r6   )r   r\   r]   rP   r^   r   r   r   Úmark_argument¶   s
    zControlFlow.mark_argumentc                 C   sD   | j r@|  |¡r@t||ƒ}| j j |¡ t| j j|< | j |¡ d S r   )	r8   rQ   ÚNameDeletionr(   r[   ÚUninitializedr)   r@   r6   )r   rV   rP   r^   r   r   r   Úmark_deletion½   s
    
zControlFlow.mark_deletionc                 C   s4   | j r0|  |¡r0| j j t||ƒ¡ | j |¡ d S r   )r8   rQ   r(   r[   ÚNameReferencer@   r6   ©r   rV   rP   r   r   r   Úmark_referenceÄ   s    zControlFlow.mark_referencec                 C   sÄ   | j h}tƒ }|rD| ¡ }| |¡ |jD ]}||kr*| |¡ q*q| j| }|D ]}| ¡  qR| | j ¡ |D ]@}| ¡ rp|j	D ]}|jD ]}| 
|¡ qŒq‚| ¡  | |¡ qp|  j|8  _dS )z%Delete unreachable and orphan blocks.N)rC   r$   Úpopr6   r%   r?   r5   r1   r0   r&   r9   )r   ÚqueueÚvisitedÚrootr3   Zunreachabler8   r4   r   r   r   Ú	normalizeÎ   s(    





zControlFlow.normalizec                 C   sT  i | _ d}| jD ](}tƒ }| |_|_|| j |< |dK }q| jD ]N}|jD ]B}t|tƒrJ||_| j |j	 }|j 
|¡ | j|O  _|dK }qJq@| jD ]ˆ}|j ¡ D ]L\}}| j | }|tkrÐ| j|jO  _n| j|jO  _| j|jO  _q¤|j|_|jD ]}| j| j | jO  _q q–| j  ¡ D ]}| j j|jO  _q*| jj| j_dS )z+Set initial state, map assignments to bits.r   N)Úassmtsr@   r<   ÚmaskÚbitr?   r(   Ú
isinstancerZ   rP   r[   r)   Úitemsrc   r-   r.   r,   r*   ÚvaluesrC   )r   ro   rP   rm   r8   Ústatr   r   r   Ú
initializeå   s8    








zControlFlow.initializec                 C   st   t ƒ }| j| }||j@ rP|  |¡r4| t|ƒ¡ n|jrF| t¡ n
| t¡ |j	D ]}||j@ rV| |¡ qV|S r   )
r$   rm   ro   rS   r6   ÚStaticAssignmentrL   ÚUnknownrc   r(   )r   ZistaterP   Úretrm   Úassmtr   r   r   Úmap_one	  s    





zControlFlow.map_onec                 C   sd   d}|r`d}| j D ]J}d}|jD ]}||jO }q ||j @ |jB }||jkrPd}||_||_qqdS )z(Per-block reaching definitions analysis.TFr   N)r?   r&   r,   r.   r-   r+   )r   Zdirtyr8   r+   r4   r,   r   r   r   Úreaching_definitions  s    


z ControlFlow.reaching_definitions)N)N)N)r   r   r    r:   r   rG   rH   rQ   rS   rW   r_   ra   rd   rg   rl   rt   ry   rz   r   r   r   r   r>   g   s   




$r>   c                   @   s   e Zd Zdd„ ZdS )Ú	LoopDescrc                 C   s   || _ || _g | _d S r   )Ú
next_blockÚ
loop_blockrB   )r   r|   r}   r   r   r   r   )  s    zLoopDescr.__init__Nr=   r   r   r   r   r{   (  s   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   )rC   Úfinally_enterÚfinally_exit)r   rC   r   r€   r   r   r   r   7  s    zExceptionDescr.__init__)NN)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 )rZ   Nc                 C   sP   |j d krtƒ |_ || _|| _|| _|j| _tƒ | _d| _d| _d | _	|| _
d S r   )Úcf_stater$   r\   r]   rP   r   ÚrefsrK   Úis_deletionÚinferred_typerY   )r   r\   r]   rP   rY   r   r   r   r   >  s    
zNameAssignment.__init__c                 C   s   d| j j| jf S ©Nz%s(entry=%r)©r   r   rP   r   r   r   r   Ú__repr__L  s    zNameAssignment.__repr__c                 C   s   | j  | jp| jj¡| _| jS r   )r]   Ú
infer_typerY   rP   Úscoper„   r   r   r   r   rˆ   O  s    zNameAssignment.infer_typec                 C   s   | j  | jp| jj¡S r   )r]   Útype_dependenciesrY   rP   r‰   r   r   r   r   rŠ   S  s    z NameAssignment.type_dependenciesc                 C   s   | j jjs| j jS | jS r   )rP   r   Úis_unspecifiedr„   r   r   r   r   r   V  s    
zNameAssignment.type)N)	r   r   r    r   r‡   rˆ   rŠ   Úpropertyr   r   r   r   r   rZ   =  s   
rZ   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ru   z7Initialised at declaration time, e.g. stack allocation.c                    s<   |j jsd}nd }t|j ||jd}tt| ƒ |||¡ d S )NF©r   r   )r   Úis_pyobjectr   r   r   ru   r   )r   rP   r   r\   r   r   r   r   _  s      ÿzStaticAssignment.__init__c                 C   s   | j jS r   )rP   r   r   r   r   r   rˆ   h  s    zStaticAssignment.infer_typec                 C   s   dS )Nr   r   r   r   r   r   rŠ   k  s    z"StaticAssignment.type_dependencies)r   r   r    r:   r   rˆ   rŠ   r!   r   r   r   r   ru   ]  s   	ru   c                   @   s   e Zd Zdd„ ZdS )r`   c                 C   s   t  | |||¡ d| _d S ©NT)rZ   r   rK   )r   r\   r]   rP   r   r   r   r   p  s    zArgument.__init__Nr=   r   r   r   r   r`   o  s   r`   c                   @   s   e Zd Zdd„ Zdd„ ZdS )rb   c                 C   s   t  | |||¡ d| _d S r   )rZ   r   rƒ   )r   r\   rP   r   r   r   r   v  s    zNameDeletion.__init__c                 C   s4   | j  | jj¡}|js*| | jj¡r*tjS || _|S r   )	r]   rˆ   rP   r‰   rŽ   Zcan_coerce_to_pyobjectr   Úpy_object_typer„   )r   r„   r   r   r   rˆ   z  s    ÿzNameDeletion.infer_typeN)r   r   r    r   rˆ   r   r   r   r   rb   u  s   rb   c                   @   s   e Zd ZdZdS )rc   zDefinitely not initialised yet.N©r   r   r    r:   r   r   r   r   rc   ƒ  s   rc   c                   @   s   e Zd ZdZdS )rv   z7Coming from outer closure, might be initialised or not.Nr‘   r   r   r   r   rv   ‡  s   rv   c                   @   s   e Zd Zdd„ Zdd„ ZdS )re   c                 C   s*   |j d krtƒ |_ || _|| _|j| _d S r   )r   r$   rV   rP   r   rf   r   r   r   r   Œ  s
    
zNameReference.__init__c                 C   s   d| j j| jf S r…   r†   r   r   r   r   r‡   “  s    zNameReference.__repr__N)r   r   r    r   r‡   r   r   r   r   re   ‹  s   re   c                       s0   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚControlFlowStateFc                    sn   t |kr$| t ¡ d| _|sPd| _n,t|kr>| t¡ d| _nt|ƒdkrPd| _tt| ƒ 	dd„ |D ƒ¡ d S )NTr   c                 S   s   g | ]}|j tk	r|‘qS r   )r]   r   )Ú.0Úir   r   r   Ú
<listcomp>°  s     
 z-ControlFlowState.__init__.<locals>.<listcomp>)
rc   ÚdiscardÚcf_maybe_nullÚ
cf_is_nullrv   ÚlenÚ	is_singler   r’   r   )r   Ústater   r   r   r   ¢  s    


ÿzControlFlowState.__init__c                 C   s   | d S r#   r   r   r   r   r   Úone²  s    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%   r[   )r   r3   r   r   r   r6   ¿  s    zGVContext.addc                 C   s2   || j kr(d| j | j |< |  jd7  _| j | S )Nzblock%dr   )rž   rŸ   r7   r   r   r   ÚnodeidÂ  s    
zGVContext.nodeidc                 C   st   |j s
dS t|j ƒ}t|j ƒ}|d }|| jkrBt| ¡ ƒ| 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   r8   Ú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_defsr3   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   r6   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   â  s    zGV.__init__Fc           	   	   C   s  |  d| j ¡ | jjD ]¤}| |¡}|r’|jD ]`}t|tƒrf|d|jj|j	rRdnd|j
d f 7 }q0t|tƒr0|jr0|d|jj|j
d f 7 }q0|sšd}| |¡}|  d|| |¡f ¡ q| jjD ]2}| |¡}|jD ]}|  d	|| |¡f ¡ qÚqÆ|  d
¡ d S )Nz subgraph %s {
z
 %s [%s %s]ZdeletionZ
definitionr   z
 %s [reference %s]r0   z  %s [label="%s"];
z  %s -> %s;
z }
)r¯   r²   rº   r?   r®   r(   rp   rZ   rP   rƒ   r   re   r¡   r¸   r%   )	r   r±   Úctxr³   r8   Úlabelrs   Úpidr3   r   r   r   r°   æ  s.    


  ÿ




z	GV.renderN)F)r   r   r    r:   r   r°   r   r   r   r   r¹   ß  s   r¹   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú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   s   | j  |d|f¡ d S r   ©r¿   r6   ©r   r   Úmessager   r   r   r     s    zMessageCollection.errorc                 C   s   | j  |d|f¡ d S r   rÀ   rÁ   r   r   r   r     s    zMessageCollection.warningc                 C   s6   t | jƒD ]&\}}}|r$t||ƒ q
t||dƒ q
d S )NrT   )Ú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¾   c                 C   s  |   ¡  |  ¡  tƒ }i }tƒ }| jD  ]þ}|j}|jD ]ì}| j|j }|  ||j¡}	t	|t
ƒrÆ|jj |	¡ | |j¡ ||j @ }|jr˜||jO }n
||jO }| |¡ |jtk	rÄ|jj |¡ q8t	|tƒr8|j||j< |jj |¡ |jj |	¡ |	 t¡ |	 t¡ |	D ]}
|
j |¡ qq8q&|d }|d }|d }|d }tƒ }|D ]X}t|jkrˆd|_t|jƒdkr€d|_ nd|_ n t|jkrœd|_nd|_ d|_qR| !¡ D ]\}}t|jkr²d|_|j"sþt|jƒdkrþ|j#|j$j%krþd|_ |j&s°|j"s°|j's°|j(j)r"nŽ|j r‚|j*s‚|j+sVt,j+rl|j(j-sV|j(j.rl| /|j0d|j# ¡ n| 1|j0d|j# ¡ n.|rÒd	|j# }|j*r¢|d
7 }| 1|j0|¡ n t|jkrÆd|_nd|_ d|_q´|D ]p}
|
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qÚ| j4D ]t}|jsR|j'sR|j#dkr¾|j# 5d¡s¾|j2r¤|r¾| 1|j0d|j# ¡ n|r¾| 1|j0d|j# ¡ d|_3qR| 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')8rt   rz   r$   r?   r+   r(   rm   rP   ry   rp   rZ   r\   r   Úupdater6   rn   rƒ   ro   r]   r   Zcf_assignmentsr[   re   rV   Zcf_referencesr–   rc   rv   r‚   r¾   r—   r™   r˜   rq   rL   r²   r‰   Zscope_predefined_namesZ
allow_nullrJ   r   rÄ   rM   rN   r   rŽ   r‹   r   r   r   rK   Zcf_usedr@   Ú
startswithrÅ   r’   )rº   Zcompiler_directivesÚassignmentsZ
referencesZassmt_nodesr8   r/   rs   Zi_assmtsr›   rx   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr¿   rV   rP   Ú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 t| ƒ ¡  g | _d S r   )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ž  s    zAssignmentCollector.visit_Nodec                 C   s   | j  |j|jf¡ d S r   )rÉ   r[   r\   r]   rU   r   r   r   Úvisit_SingleAssignmentNode¡  s    z.AssignmentCollector.visit_SingleAssignmentNodec                 C   s"   |j D ]}| j ||jf¡ qd S r   )Úlhs_listrÉ   r[   r]   ©r   rV   r\   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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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d_d8d9„Zd: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S )`ÚControlFlowAnalysisc                 C   s@   || j kr| jS t| jƒD ]\}}||kr|  S qds<t‚d S r   )Úenvrº   ÚreversedÚstackÚAssertionError)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 ƒ |r°| j d }t|dƒ}| jj|d	|d
 W 5 Q R X |S )Núcontrol_flow.dot_outputr   )ÚConstantFoldingFT©r   zcontrol_flow.dot_annotate_defsÚwtÚmodule)r³   )Úcurrent_directivesr   Úgv_ctxZOptimizerÚ   Úconstant_folderr$   Ú
reductionsÚin_inplace_assignmentr‰   rÓ   r>   rº   rÕ   r   r   r   Úobject_exprÚvisitchildrenrË   Úopenr°   )r   rV   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 |¡rX| jj	 |¡ qX|  |¡ | j ¡  |j D ]}|  |¡ q’|jrÈ| j |jttjdd|jj¡ |jrî| 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 k	rz| j# t$|jj%| jƒ¡ | j &¡ \| _| _|S )N)Z
decoratorsFrÛ   )'ÚargsÚdefaulträ   rÕ   r[   rÓ   rº   Zlocal_scoper>   r@   rr   rQ   r6   rW   rH   Ú_visitZstar_argra   r   r   Z
tuple_typerP   Zstarstar_argÚ	dict_typeÚbodyZis_generatorZgbodyr8   r9   rD   rl   rË   rÞ   r?   rC   rß   r¹   r²   rh   ©r   rV   ÚargrP   r   r   r   Úvisit_FuncDefNodeÌ  sP    




ÿý
ÿý

z%ControlFlowAnalysis.visit_FuncDefNodec                 C   s   d|_ |  |¡S r   )Úusedrî   rU   r   r   r   Úvisit_DefNodeþ  s    z!ControlFlowAnalysis.visit_DefNodec                 C   s   |S r   r   rU   r   r   r   Úvisit_GeneratorBodyDefNode  s    z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec                 C   s   |S r   r   rU   r   r   r   Úvisit_CTypeDefNode  s    z&ControlFlowAnalysis.visit_CTypeDefNodeNc           	      C   s&  | j jsd S | j jr:| j jd }| j j |j¡ | j  ¡  |sD| j}|jrŒ|jd k	r\|j}n| j	 
|j¡}|d krvd S | j j||||d nf|jrèt|jƒD ]H\}}|jr¾ttjd|jd}n|| jkrÎ|}n
| |¡}|  ||¡ qœn
|  |¡ | j jr"| j jd }| j j |j¡ | j  ¡  d S )NéÿÿÿÿrX   Fr   )rº   r8   rB   r9   rC   rH   rã   Úis_namerP   rÓ   Úlookupr²   r_   Úis_sequence_constructorÚ	enumeraterç   Z
is_starredr   r   Z	list_typer   Zinferable_item_noderé   )	r   r\   r]   rY   Z	exc_descrrP   r”   rí   Z	item_noder   r   r   r_     s8    





z#ControlFlowAnalysis.mark_assignmentc                 C   s   | j d r| j |¡ dS )z'Mark position if DOT output is enabled.rÙ   N)rÞ   rº   rW   rU   r   r   r   rW   ,  s    
z!ControlFlowAnalysis.mark_positionc                 C   s0   |j D ]\}}|dkr|  |¡ q|  |¡ |S )NÚ*)rq   r_   rä   )r   rV   r²   Útargetr   r   r   Úvisit_FromImportStatNode1  s
    
z,ControlFlowAnalysis.visit_FromImportStatNodec                 C   s   t dt|ƒ ƒ‚d S )NzUnhandled assignment node %s)r
   r   rU   r   r   r   Úvisit_AssignmentNode8  s    z(ControlFlowAnalysis.visit_AssignmentNodec                 C   s    |   |j¡ |  |j|j¡ |S r   )ré   r]   r_   r\   rU   r   r   r   rÎ   ;  s    z.ControlFlowAnalysis.visit_SingleAssignmentNodec                 C   s*   |   |j¡ |jD ]}|  ||j¡ q|S r   )ré   r]   rÏ   r_   rÐ   r   r   r   rÑ   @  s    
z0ControlFlowAnalysis.visit_CascadedAssignmentNodec                 C   sJ   t ƒ }| |¡ |jD ]\}}|  |¡ q|jD ]\}}|  ||¡ q0|S r   )rÌ   rä   rÉ   ré   r_   )r   rV   Ú	collectorr\   r]   r   r   r   Úvisit_ParallelAssignmentNodeF  s    
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec                 C   s2   d| _ |  |¡ d| _ |  |j|  | ¡ ¡¡ |S rR   )râ   rä   r_   r\   rà   Zcreate_binop_noderU   r   r   r   Úvisit_InPlaceAssignmentNodeO  s
    
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec                 C   sr   |j D ]f}|jrb|jp"| j |j¡}|js0|jrBt|j	d|j ƒ |j
sR|  |¡ | j ||¡ q|  |¡ q|S )Nz7can not delete variable '%s' referenced in nested scope)rç   rô   rP   rÓ   rõ   r²   rM   rL   r   r   Zignore_nonexistingré   rº   rd   rì   r   r   r   Úvisit_DelStatNodeV  s    
ÿÿ
z%ControlFlowAnalysis.visit_DelStatNodec                 C   s6   | j  |j¡}|r2|j }| j |t|j|ƒ|¡ |S r   )rÓ   rõ   r²   Znot_nonerº   ra   r   r   )r   rV   rP   r   r   r   r   Úvisit_CArgDeclNodee  s     
 ÿz&ControlFlowAnalysis.visit_CArgDeclNodec                 C   sN   | j jrJ|jp| j |j¡}|rJ| j  ||¡ || jkrJ| jsJt	|j
dƒ |S )Nz+Cannot read reduction variable in loop body)rº   r8   rP   rÓ   rõ   r²   rg   rá   râ   r   r   rf   r   r   r   Úvisit_NameNodem  s    ÿz"ControlFlowAnalysis.visit_NameNodec                 C   s4   | j jr0|jD ] }|  |¡ | j jsd|_ q0q|S r   )rº   r8   r(   ré   Zis_terminator)r   rV   rs   r   r   r   Úvisit_StatListNodey  s    

z&ControlFlowAnalysis.visit_StatListNodec                 C   s   |   |¡ |  |¡ |S r   )rä   rW   rU   r   r   r   rÍ   ‚  s    

zControlFlowAnalysis.visit_Nodec                 C   s   |S r   r   rU   r   r   r   Úvisit_SizeofVarNode‡  s    z'ControlFlowAnalysis.visit_SizeofVarNodec                 C   s   |S r   r   rU   r   r   r   Úvisit_TypeidNodeŠ  s    z$ControlFlowAnalysis.visit_TypeidNodec                 C   sÀ   | j  ¡ }| j j}|jD ]H}| j  |¡}|  |j¡ | j  ¡  |  |j¡ | j jr| j j |¡ q|j	rš| j j|d |  |j	¡ | j jr¤| j j |¡ n
| |¡ |j
r´|| j _nd | j _|S ©N©r4   )rº   rG   r8   Z
if_clausesrH   ré   Ú	conditionrë   r9   Úelse_clauser&   )r   rV   r|   r4   Úclauser   r   r   Úvisit_IfStatNode  s&    




z$ControlFlowAnalysis.visit_IfStatNodec                 C   s†   |   |¡ | j ¡ }| jj}| j |¡}|  |j¡ | j ¡  |  |j¡ | jjr`| jj |¡ | |¡ |j	rz|| j_nd| j_|S )z@Essentially an if-condition that wraps a RaiseStatNode.
        N)
rW   rº   rG   r8   rH   ré   r  Ú	exceptionr9   r&   )r   rV   r|   r4   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rÒ|| j _
nd | j _
|S r  )rº   rH   rG   rA   r[   r{   r  ré   rë   rh   r8   r9   r  r&   ©r   rV   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 kr|j
r| |j¡}|r`|jr|jdkr„t|jƒdkr„|jd }n–|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 krÚ|j
rÚ| |j¡}|r\|jrÚ|jd
krÚd}|jd d… D ]}
| j||
|j jd	 qzt|jƒdkrÚ| j||  t |jd|jd |jd ¡¡|j jd	 |sö| j||j|j jd	 d S )NFrÔ   r   r   r÷   rT   ZPY_SSIZE_T_MAX)Úvaluer   rX   )ÚrangeÚxrangeTú+)ÚiteratorÚsequencerù   Ú
expr_scoperÓ   rp   r   ZSimpleCallNodeÚfunctionr   rô   rõ   r²   Ú
is_builtinr™   rç   rö   rˆ   Zis_builtin_typer_   ZIntNoder   r   Zc_py_ssize_t_typerà   Ú
binop_nodeÚitem)r   rV   Z
is_specialr  rù   rÓ   r  rP   r  Ziterator_typerí   r   r   r   Úmark_forloop_targetÙ  s^    


ÿü


ýÿûz'ControlFlowAnalysis.mark_forloop_targetc                 C   s
   |   |¡S r   )Úvisit_ForInStatNoderU   r   r   r   Úvisit_AsyncForStatNode  s    z*ControlFlowAnalysis.visit_AsyncForStatNodec                 C   s:  | j  ¡ }| j  ¡ }| j j t||ƒ¡ |  |j¡ | j  ¡  t|t	j
ƒrV|  |¡ n*t|t	jƒrt|  |j|j¡ n|  |j¡ t|t	jƒrž| j||jjd | j  ¡  |  |j¡ | j j ¡  | j jrÖ| j j |¡ |jr| j j|d |  |j¡ | j jr| j j |¡ n
| |¡ |jr.|| j _nd | j _|S )N)Úexcluder  )rº   rH   rG   rA   r[   r{   ré   r  rp   r   ZForInStatNoder  ZAsyncForStatNoder_   rù   r  ZParallelRangeNodeÚ_delete_privatesrP   rë   rh   r8   r9   r  r&   r  r   r   r   r    s6    






z'ControlFlowAnalysis.visit_ForInStatNodec                 C   s.   |j D ]"}|r|j|k	r| j ||j¡ qd S r   )Úassigned_nodesrP   rº   rd   )r   rV   r  Úprivate_noder   r   r   r  =  s    
z$ControlFlowAnalysis._delete_privatesc                 C   sf   | j }t|jdƒr\t|ƒ| _ |jD ].}d|j_|j|j \}}|r"| j  |j¡ q"|  	|¡}|| _ |S )NrP   T)
rá   Úhasattrrù   r$   r  rP   rN   rÉ   r6   r  )r   rV   rá   r   r   Z	reductionr   r   r   Úvisit_ParallelRangeNodeB  s    


z+ControlFlowAnalysis.visit_ParallelRangeNodec                 C   s6   |j D ]}d|j_q|  |¡ |  |¡ |  |¡ |S r   )r  rP   rN   r  rä   )r   rV   r   r   r   r   Úvisit_ParallelWithBlockNodeU  s    




z/ControlFlowAnalysis.visit_ParallelWithBlockNodec                 C   s<  | j  ¡ }| j  ¡ }| j j t||ƒ¡ |  |j¡ |  |j¡ |j	d k	rV|  |j	¡ | j  ¡  |  
|j|j¡ |j	d k	r |  
|j|  t |jd|j|j	¡¡¡ | j  ¡  |  |j¡ | j j ¡  | j jrØ| j j |¡ |jr| j j|d |  |j¡ | j jr| j j |¡ n
| |¡ |jr0|| j _nd | j _|S )Nr  r  )rº   rH   rG   rA   r[   r{   ré   Zbound1Zbound2Ústepr_   rù   rà   r   r  r   rë   rh   r8   r9   r  r&   r  r   r   r   Úvisit_ForFromStatNode_  s8    




ÿ



z)ControlFlowAnalysis.visit_ForFromStatNodec                 C   s   t dƒ‚d S )NzGeneric loops are not supported)r
   rU   r   r   r   Úvisit_LoopNode„  s    z"ControlFlowAnalysis.visit_LoopNodec                 C   s   |   |j|jj¡ |S r   )r_   r\   Z	with_nodeÚ
enter_callrU   r   r   r   Ú"visit_WithTargetAssignmentStatNode‡  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec                 C   s(   |   |j¡ |   |j¡ |   |j¡ |S r   )ré   Úmanagerr'  rë   rU   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rÄ|jr®| j  ¡  |  	|j¡ | j jrÄ| j j |¡ |jD ]|}|| j _|jrô|jD ]}|  	|¡ qân | j j| j jd}| j  ¡  |jr$|  |j¡ |  	|j
¡ | j jrÊ| j j |¡ qÊ| j jrf| | j jd j¡ |jrx|| j _nd | j _|S )Nr   r  ró   )rº   rG   rB   r[   r~   rH   r8   r9   rE   ré   rë   rh   r  Zexcept_clausesÚpatternrù   r_   rC   r&   )r   rV   r|   rC   r	  r+  r   r   r   Úvisit_TryExceptStatNode‘  sF    










z+ControlFlowAnalysis.visit_TryExceptStatNodec                 C   sZ  | j  ¡ }| j  ¡ }|| j _|  |j¡ | j jrP| j jrP| j j | j jd j¡ | j  ¡ }|| j _|  |j	¡ | j j}t
|||ƒ}| j j |¡ | j jr¬| 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rV| j j |¡ |rN| j j|d| j _nd | j _|S )Nró   r   r  )rº   rH   rG   r8   ré   Zfinally_except_clauserB   r9   rC   Zfinally_clauser~   r[   rA   rE   rë   rh   )r   rV   Z
body_blockrC   r   r€   Údescrr   r   r   Úvisit_TryFinallyStatNodeÄ  s:    






z,ControlFlowAnalysis.visit_TryFinallyStatNodec                 C   sN   |   |¡ |  |¡ | jjr4| jj | jjd j¡ d | j_| jjrJd|_|S )Nró   T)rW   rä   rº   rB   r8   r9   rC   rE   rU   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ó   )rW   rº   rB   r8   r9   rC   rU   r   r   r   Úvisit_ReraiseStatNodeõ  s
    
z)ControlFlowAnalysis.visit_ReraiseStatNodec                 C   s¨   |   |¡ |  |¡ t| jjd d d… ƒ}|D ]R}|jr.| jj |j¡ |jr|| jj	}|D ]}|jrZ|j} qpqZ|j |¡  qœq.| jjrœ| jj | jj	¡ d | j_|S r0  )
rW   rä   Úiterrº   rB   r   r8   r9   r€   rD   )r   rV   Zouter_exception_handlersÚhandlerrD   Znext_handlerr   r   r   Úvisit_ReturnStatNodeü  s$    

z(ControlFlowAnalysis.visit_ReturnStatNodec                 C   s‚   | j js|S | j jd }|  |¡ |jd d d… D ]2}|jr2| j j |j¡ |jr`|j |j¡  qvq2| j j |j¡ d | j _|S r0  )	rº   rA   rW   rB   r   r8   r9   r€   r|   ©r   rV   Úloopr  r   r   r   Úvisit_BreakStatNode  s    
z'ControlFlowAnalysis.visit_BreakStatNodec                 C   s‚   | j js|S | j jd }|  |¡ |jd d d… D ]2}|jr2| j j |j¡ |jr`|j |j¡  qvq2| j j |j¡ d | j _|S r0  )	rº   rA   rW   rB   r   r8   r9   r€   r}   r5  r   r   r   Úvisit_ContinueStatNode$  s    
z*ControlFlowAnalysis.visit_ContinueStatNodec                 C   sH   |j r"| j | j| jf¡ |j | _|  |j¡ |j rD| j ¡ \| _}|S r   )r  rÕ   r[   rÓ   rº   ré   r6  rh   ©r   rV   rÆ   r   r   r   Úvisit_ComprehensionNode5  s    z+ControlFlowAnalysis.visit_ComprehensionNodec                 C   sp   t |tjtjfƒst|ƒ‚|jrJ| j | j| j	f¡ |  
|j¡| _	|j| _|  |¡ |jrl| j ¡ \| _| _	|S r   )rp   r   ZIteratorNodeZAsyncIteratorNoderÖ   r  rÕ   r[   rÓ   rº   rØ   rä   rh   rU   r   r   r   Úvisit_ScopedExprNode?  s    
z(ControlFlowAnalysis.visit_ScopedExprNodec                 C   s˜   |   |d¡ | j |j|j| j |jj¡¡ | j 	| j| jf¡ |j
| _| j ¡  |jrn| j |jt|jj¡ |   |d¡ | j ¡  | j ¡ \| _}|S )N)ÚdictÚ	metaclassZmkwÚbasesZclass_result)rë   )rä   rº   r_   rù   ZclassobjrÓ   rõ   r²   rÕ   r[   r‰   rH   Zdoc_noder   rP   rh   r9  r   r   r   Úvisit_PyClassDefNodeL  s    ÿ

z(ControlFlowAnalysis.visit_PyClassDefNodec                 C   s,   | j  |j| jf¡ |  |¡ | j  ¡  |S r   )rÕ   r[   r‰   rº   rä   rh   rU   r   r   r   Úvisit_CClassDefNode[  s    

z'ControlFlowAnalysis.visit_CClassDefNodec                 C   s$   |j jr|  |j t¡ |  |¡ |S r   )Zoperandrô   r_   r   rä   rU   r   r   r   Úvisit_AmpersandNodeb  s    
z'ControlFlowAnalysis.visit_AmpersandNode)NN)N)1r   r   r    rØ   ræ   rî   rð   rñ   rò   r_   rW   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/  r1  r4  r7  r8  r:  r;  r?  r@  rA  r   r   r   r   rÒ   ©  s\   2
$		5,

%3'

rÒ   )+Ú
__future__r   ZcythonZdeclareÚobjectr¢   r   r   r   r   r   ZVisitorr   r	   ZErrorsr   r   r
   ZExprNoder   Zunspecified_typer   r"   r;   r<   r>   r{   r~   rZ   ru   r`   rb   rc   rv   re   r¨   r’   r   r¹   r¾   rË   rÌ   rÒ   r   r   r   r   Ú<module>   sT        ý
7 B ) 
