B
    ž†\ª±  ã               @   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mZ dd
lm
Z
 ddlmZmZ ddlmZmZmZ ddlmZ G dd„ dejƒZeeddZe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 d0d1„ d1eƒZ*G d2d3„ d3eƒZ+d4d5„ Z,G d6d7„ d7eƒZ-G d8d9„ d9eƒZ.dS ):é    )Úabsolute_importN)Ú
PyrexTypesÚ	ExprNodesÚNodesÚBuiltinÚInternalErrorÚerrorÚwarningÚpy_object_typeÚunspecified_typeÚobject_exprÚfake_rhs_exprÚTypedExprNodeé   )r   )r   )r   )ÚOptions)r
   r   )r   )ÚTreeVisitorÚCythonTransform)r   r	   r   )ÚConstantFoldingc                   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__© ú:lib/python3.7/site-packages/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   T)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 = set([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_state)r   r   r   r   r   ;   s    zControlBlock.__init__c             C   s   | j  o| j S )N)r'   r&   )r   r   r   r   ÚemptyJ   s    zControlBlock.emptyc             C   sP   x| j D ]}|j | ¡ qW x| jD ]}|j  | ¡ q$W | 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 )N)r$   Úaddr%   )r   Úblockr   r   r   Ú	add_childV   s    zControlBlock.add_childN)r   r   r    Ú__doc__r   r/   r4   r7   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 )NFr   )r   r   r   r   r/   ^   s    zExitBlock.emptyN)r   r   r    r8   r/   r   r   r   r   r9   [   s   r9   c               @   s   e Zd Zdd„ ZdS )ÚAssignmentListc             C   s
   g | _ d S )N)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„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!ÚControlFlowav  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
    c             C   sF   t ƒ | _t ƒ | _g | _g | _tƒ | _tƒ | _| j 	| j¡ | j| _
d S )N)r#   ÚblocksÚentriesÚloopsÚ
exceptionsr"   Úentry_pointr9   Ú
exit_pointr5   r6   )r   r   r   r   r   s   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<   r5   r7   )r   r3   r6   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<   r5   r7   r6   )r   r3   r6   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 )NF)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   s4   |j r0|jr0|jjs,|jjs,|jjs,|jjr0dS dS )NTF)rD   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cpp_class)r   rJ   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é   )r6   r&   r5   r   )r   Únoder   r   r   Úmark_position¨   s    zControlFlow.mark_positionc             C   sF   | j rB|  |¡rBt|||ƒ}| j j |¡ || j j|< | j |¡ d S )N)r6   rK   ÚNameAssignmentr'   Úappendr(   r=   r5   )r   ÚlhsÚrhsrJ   Ú
assignmentr   r   r   Úmark_assignment­   s
    zControlFlow.mark_assignmentc             C   sF   | j rB|  |¡rBt|||ƒ}| j j |¡ || j j|< | j |¡ d S )N)r6   rK   ÚArgumentr'   rQ   r(   r=   r5   )r   rR   rS   rJ   rT   r   r   r   Úmark_argument´   s
    zControlFlow.mark_argumentc             C   sD   | j r@|  |¡r@t||ƒ}| j j |¡ t| j j|< | j |¡ d S )N)	r6   rK   ÚNameDeletionr'   rQ   ÚUninitializedr(   r=   r5   )r   rN   rJ   rT   r   r   r   Úmark_deletion»   s
    
zControlFlow.mark_deletionc             C   s4   | j r0|  |¡r0| j j t||ƒ¡ | j |¡ d S )N)r6   rK   r'   rQ   ÚNameReferencer=   r5   )r   rN   rJ   r   r   r   Úmark_referenceÂ   s    zControlFlow.mark_referencec             C   sà   t | jgƒ}t ƒ }x<|rN| ¡ }| |¡ x |jD ]}||kr2| |¡ q2W qW | j| }x|D ]}| ¡  q`W | | j¡ xP|D ]H}| ¡ r‚x(|j	D ]}x|jD ]}| 
|¡ q¢W q–W | ¡  | |¡ q‚W |  j|8  _dS )z%Delete unreachable and orphan blocks.N)r#   r@   Úpopr5   r$   r<   r4   r0   r/   r%   r7   )r   ZqueueZvisitedÚrootr2   Zunreachabler6   r3   r   r   r   Ú	normalizeÌ   s(    



zControlFlow.normalizec             C   sp  i | _ d}x2| jD ](}tƒ }| |_|_|| j |< |dK }qW x\| jD ]R}xL|jD ]B}t|tƒrR||_| j |j	 }|j 
|¡ | j|O  _|dK }qRW qFW xš| jD ]}xZ|j ¡ D ]L\}}| j | }|tkrà| j|jO  _n| j|jO  _| j|jO  _q´W |j|_x&|jD ]}| j| j | jO  _qW q¤W x&| j  ¡ D ]}| j j|jO  _qDW | jj| j_dS )z+Set initial state, map assignments to bits.r   N)Úassmtsr=   r:   ÚmaskÚbitr<   r'   Ú
isinstancerP   rJ   rQ   r(   ÚitemsrY   r,   r-   r+   r)   Úvaluesr@   )r   rb   rJ   r`   r6   Ústatr   r   r   Ú
initializeã   s8    


 zControlFlow.initializec             C   sx   t ƒ }| j| }||j@ rP|  |¡r4| t|ƒ¡ n|jrF| t¡ n
| t¡ x"|j	D ]}||j@ rX| |¡ qXW |S )N)
r#   r`   rb   rL   r5   ÚStaticAssignmentrG   ÚUnknownrY   r'   )r   ZistaterJ   Zretr`   Úassmtr   r   r   Úmap_one  s    




zControlFlow.map_onec             C   sp   d}xf|rjd}xX| j D ]N}d}x|jD ]}||jO }q&W ||j @ |jB }||jkrXd}||_||_qW qW dS )z(Per-block reaching definitions analysis.TFr   N)r<   r%   r+   r-   r,   r*   )r   Zdirtyr6   r*   r3   r+   r   r   r   Úreaching_definitions  s    
z ControlFlow.reaching_definitions)N)N)r   r   r    r8   r   rB   rC   rK   rL   rO   rU   rW   rZ   r\   r_   rg   rk   rl   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 )N)Ú
next_blockÚ
loop_blockr?   )r   rn   ro   r   r   r   r   '  s    zLoopDescr.__init__N)r   r   r    r   r   r   r   r   rm   &  s   rm   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 )N)r@   Úfinally_enterÚfinally_exit)r   r@   rq   rr   r   r   r   r   5  s    zExceptionDescr.__init__)NN)r   r   r    r8   r   r   r   r   r   rp   -  s   rp   c               @   s8   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZdS )rP   c             C   sJ   |j d krtƒ |_ || _|| _|| _|j| _tƒ | _d| _d| _d | _	d S )NF)
Úcf_stater#   rR   rS   rJ   r   ÚrefsrF   Úis_deletionÚinferred_type)r   rR   rS   rJ   r   r   r   r   <  s    
zNameAssignment.__init__c             C   s   d| j j| jf S )Nz%s(entry=%r))r   r   rJ   )r   r   r   r   Ú__repr__H  s    zNameAssignment.__repr__c             C   s   | j  | jj¡| _| jS )N)rS   Ú
infer_typerJ   Úscoperv   )r   r   r   r   rx   K  s    zNameAssignment.infer_typec             C   s   | j  | jj¡S )N)rS   Útype_dependenciesrJ   ry   )r   r   r   r   rz   O  s    z NameAssignment.type_dependenciesc             C   s   | j jjs| j jS | jS )N)rJ   r   Úis_unspecifiedrv   )r   r   r   r   r   R  s    
zNameAssignment.typeN)	r   r   r    r   rw   rx   rz   Úpropertyr   r   r   r   r   rP   ;  s
   rP   c                   s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )rh   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   rh   r   )r   rJ   r   rR   )r   r   r   r   [  s    zStaticAssignment.__init__c             C   s   | j jS )N)rJ   r   )r   r   r   r   rx   d  s    zStaticAssignment.infer_typec             C   s   dS )Nr   r   )r   r   r   r   rz   g  s    z"StaticAssignment.type_dependencies)r   r   r    r8   r   rx   rz   r!   r   r   )r   r   rh   Y  s   	rh   c               @   s   e Zd Zdd„ ZdS )rV   c             C   s   t  | |||¡ d| _d S )NT)rP   r   rF   )r   rR   rS   rJ   r   r   r   r   l  s    zArgument.__init__N)r   r   r    r   r   r   r   r   rV   k  s   rV   c               @   s   e Zd Zdd„ Zdd„ ZdS )rX   c             C   s   t  | |||¡ d| _d S )NT)rP   r   ru   )r   rR   rJ   r   r   r   r   r  s    zNameDeletion.__init__c             C   s2   | j  | jj¡}|js(| | jj¡r(tS || _|S )N)rS   rx   rJ   ry   r}   Zcan_coerce_to_pyobjectr
   rv   )r   rv   r   r   r   rx   v  s    zNameDeletion.infer_typeN)r   r   r    r   rx   r   r   r   r   rX   q  s   rX   c               @   s   e Zd ZdZdS )rY   zDefinitely not initialised yet.N)r   r   r    r8   r   r   r   r   rY     s   rY   c               @   s   e Zd ZdZdS )ri   z7Coming from outer closure, might be initialised or not.N)r   r   r    r8   r   r   r   r   ri   ƒ  s   ri   c               @   s   e Zd Zdd„ Zdd„ ZdS )r[   c             C   s*   |j d krtƒ |_ || _|| _|j| _d S )N)rs   r#   rN   rJ   r   )r   rN   rJ   r   r   r   r   ˆ  s
    
zNameReference.__init__c             C   s   d| j j| jf S )Nz%s(entry=%r))r   r   rJ   )r   r   r   r   rw     s    zNameReference.__repr__N)r   r   r    r   rw   r   r   r   r   r[   ‡  s   r[   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   )rS   r   )Ú.0Úir   r   r   ú
<listcomp>¬  s    z-ControlFlowState.__init__.<locals>.<listcomp>)
rY   ÚdiscardÚcf_maybe_nullÚ
cf_is_nullri   ÚlenÚ	is_singler   r~   r   )r   Ústate)r   r   r   r   ž  s    


zControlFlowState.__init__c             C   s   | d S )Nr   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 )Nr   )ÚblockidsÚnextidr$   Úsources)r   r   r   r   r   µ  s    zGVContext.__init__c             C   s   | j  |¡ d S )N)r$   rQ   )r   r2   r   r   r   r5   »  s    zGVContext.addc             C   s2   || j kr(d| j | j |< |  jd7  _| j | S )Nzblock%dr   )rŠ   r‹   )r   r6   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   z\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   r6   ÚstartÚstopZsrcdescrÚlinesr   r   r   Úextract_sourcesÄ  s    



zGVContext.extract_sourcesFc             C   sD   |  d| ¡ |  d¡ x| jD ]}| || |¡ q W |  d¡ dS )zRender graphviz dot graphzdigraph %s {
z node [shape=box];
z}
N)Úwriter$   Úrender)r   ÚfpÚnameÚannotate_defsr2   r   r   r   r›   Ï  s
    
zGVContext.renderc             C   s   |  dd¡  dd¡S )Nú"z\"Ú
z\n)Úreplace)r   Útextr   r   r   Úescape×  s    zGVContext.escapeN)F)
r   r   r    r8   r   r5   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 )N)r   Úflow)r   r   r¥   r   r   r   r   Þ  s    zGV.__init__Fc       	   	   C   s  |  d| j ¡ x´| jjD ]¨}| |¡}|r˜xj|jD ]`}t|tƒrj|d|jj|j	rVdnd|j
d f 7 }q4t|tƒr4|jr4|d|jj|j
d f 7 }q4W |s d}| |¡}|  d|| |¡f ¡ qW xB| jjD ]6}| |¡}x&|jD ]}|  d	|| |¡f ¡ qæW qÐW |  d
¡ d S )Nz subgraph %s {
z
 %s [%s %s]ZdeletionZ
definitionr   z
 %s [reference %s]r/   z  %s [label="%s"];
z  %s -> %s;
z }
)rš   r   r¥   r<   r™   r'   rc   rP   rJ   ru   r   r[   r   r£   r$   )	r   rœ   Zctxrž   r6   Zlabelrf   Úpidr2   r   r   r   r›   â  s(    

$


 z	GV.renderN)F)r   r   r    r8   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 )N)r#   Úmessages)r   r   r   r   r   û  s    zMessageCollection.__init__c             C   s   | j  |d|f¡ d S )NT)r¨   r5   )r   r   Úmessager   r   r   r   þ  s    zMessageCollection.errorc             C   s   | j  |d|f¡ d S )NF)r¨   r5   )r   r   r©   r   r   r   r	     s    zMessageCollection.warningc             C   s:   x4t | jƒD ]&\}}}|r&t||ƒ qt||dƒ qW d S )NrM   )Úsortedr¨   r   r	   )r   r   Úis_errorr©   r   r   r   Úreport  s    zMessageCollection.reportN)r   r   r    r8   r   r   r	   r¬   r   r   r   r   r§   ù  s
   r§   c             C   sü  |   ¡  |  ¡  tƒ }i }tƒ }x| jD ]}|j}xú|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 |¡ q>t	|tƒr>|j||j< |jj |¡ |jj |	¡ |	 t¡ |	 t¡ x|	D ]}
|
j |¡ qW q>W q*W |d }|d }|d }|d }tƒ }x`|D ]X}t|jkr˜d|_t|jƒdkrd|_ nd|_ n t|jkr¬d|_nd|_ d|_qbW xþ| !¡ D ]ò\}}t|jkr˜d|_|j"s t|jƒdkr d|_ |j#s–|j"s–|j$s–|j%j&r$nr|j r||j'sPt(j'rf|j%j)sP|j%j*rf| +|j,d|j- ¡ n| .|j,d|j- ¡ n|r¸| .|j,d	|j- ¡ n t|jkr¬d|_nd|_ d|_qÈW xx|D ]p}
|
jsÄ|
jj$sÄ|
jj/sÄ|
jjr*|r*|
j0r| .|
j,d
|
jj- ¡ n| .|
j,d|
jj- ¡ d|
j_1qÄW x~| j2D ]t}|js@|j$s@|j-dkr¬|j- 3d¡s¬|j0r’|r¬| .|j,d|j- ¡ n|r¬| .|j,d|j- ¡ d|_1q@W | 4¡  x|D ]}t5|jƒ|_qÆW x|D ]}t5|jƒ|_qâW 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Unused argument value '%s'zUnused result in '%s'Ú_ZunusedzUnused argument '%s'zUnused entry '%s')6rg   rl   r#   r<   r*   r'   r`   rJ   rk   rc   rP   rR   rs   Úupdater5   ra   ru   rb   rS   r   Zcf_assignmentsrQ   r[   rN   Zcf_referencesr‚   rY   ri   rt   r§   rƒ   r…   r„   rd   rG   Z
allow_nullrE   r   r«   rI   r   r}   r{   r   r   r   r	   rH   rF   Zcf_usedr=   Ú
startswithr¬   r~   )r¥   Zcompiler_directivesÚassignmentsZ
referencesZassmt_nodesr6   r.   rf   Zi_assmtsr‡   rj   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr¨   rN   rJ   r   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 )N)r   r²   r   r°   )r   )r   r   r   r   “  s    zAssignmentCollector.__init__c             C   s   |   | d ¡ d S )N)Z_visitchildren)r   r   r   r   Ú
visit_Node—  s    zAssignmentCollector.visit_Nodec             C   s   | j  |j|jf¡ d S )N)r°   rQ   rR   rS   )r   rN   r   r   r   Úvisit_SingleAssignmentNodeš  s    z.AssignmentCollector.visit_SingleAssignmentNodec             C   s&   x |j D ]}| j ||jf¡ qW d S )N)Úlhs_listr°   rQ   rS   )r   rN   rR   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               @   sX  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdTd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d.d/„ ZdUd0d1„Zd2d3„ Zd4d5„ Zd6d7„ Z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+dS )VÚControlFlowAnalysisc             C   sš   t ƒ | _tƒ | _tƒ | _d| _g | _|j| _	g | _
tƒ | _|  |¡ t| j| jƒ | jd }|r–| jd }t|dƒ}z| jj|d|d W d | ¡  X |S )NFzcontrol_flow.dot_outputzcontrol_flow.dot_annotate_defsZwtÚmodule)rž   )r‰   Úgv_ctxr   Úconstant_folderr#   Ú
reductionsÚin_inplace_assignmentÚ	env_stackry   ÚenvÚstackr;   r¥   Úvisitchildrenr±   Úcurrent_directivesÚopenr›   Úclose)r   rN   Z
dot_outputrž   rœ   r   r   r   Úvisit_ModuleNode¤  s$    




z$ControlFlowAnalysis.visit_ModuleNodec             C   s   x|j D ]}|jr|  |¡ qW |  |d¡ | j | j¡ |j| _| j | j¡ t	ƒ | _x.|jj
 ¡ D ]}| j |¡rf| jj
 |¡ qfW |  |¡ | j ¡  x|j D ]}|  |¡ q¤W |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rB| jj | jj¡ | j ¡  t | j| j!ƒ | jj" | jj#¡ | j$ t%|jj&| jƒ¡ | j '¡ | _| j '¡ | _|S )N)Z
decoratorsF)r   )(ÚargsÚdefaultrÀ   r½   rQ   r¾   Zlocal_scoper¿   r¥   r;   r=   re   rK   r5   rO   rC   Ú_visitZstar_argrW   r   r   Z
tuple_typerJ   Zstarstar_argZ	dict_typeÚbodyZis_generatorZgbodyr6   r7   rA   r_   r±   rÁ   r<   r@   r¹   r¤   r   r]   )r   rN   ÚargrJ   r   r   r   Úvisit_FuncDefNode¾  sJ    







z%ControlFlowAnalysis.visit_FuncDefNodec             C   s   d|_ |  |¡S )NT)ZusedrÊ   )r   rN   r   r   r   Úvisit_DefNodeñ  s    z!ControlFlowAnalysis.visit_DefNodec             C   s   |S )Nr   )r   rN   r   r   r   Úvisit_GeneratorBodyDefNodeõ  s    z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec             C   s   |S )Nr   )r   rN   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  ¡  |sBt}|jr†|jd k	rZ|j}n| j	 
|j¡}|d krtd S | j  |||¡ nP|jrÌxHt|jƒD ].\}}|rª|jr°d }n
| |¡}|  ||¡ q˜W n
|  |¡ | j jr| j jd }| j j |j¡ | j  ¡  d S )Néÿÿÿÿ)r¥   r6   r?   r7   r@   rC   r   Úis_namerJ   r¾   Úlookupr   rU   Úis_sequence_constructorÚ	enumeraterÅ   Z
is_starredZinferable_item_noderÇ   )r   rR   rS   Z	exc_descrrJ   r€   rÉ   Z	item_noder   r   r   rU   û  s4    





z#ControlFlowAnalysis.mark_assignmentc             C   s   | j d r| j |¡ dS )z'Mark position if DOT output is enabled.zcontrol_flow.dot_outputN)rÁ   r¥   rO   )r   rN   r   r   r   rO     s    
z!ControlFlowAnalysis.mark_positionc             C   s4   x$|j D ]\}}|dkr|  |¡ qW |  |¡ |S )NÚ*)rd   rU   rÀ   )r   rN   r   Útargetr   r   r   Úvisit_FromImportStatNode!  s
    
z,ControlFlowAnalysis.visit_FromImportStatNodec             C   s   t dƒ‚d S )NzUnhandled assignment node)r   )r   rN   r   r   r   Úvisit_AssignmentNode(  s    z(ControlFlowAnalysis.visit_AssignmentNodec             C   s    |   |j¡ |  |j|j¡ |S )N)rÇ   rS   rU   rR   )r   rN   r   r   r   r´   +  s    z.ControlFlowAnalysis.visit_SingleAssignmentNodec             C   s.   |   |j¡ x|jD ]}|  ||j¡ qW |S )N)rÇ   rS   rµ   rU   )r   rN   rR   r   r   r   r¶   0  s    z0ControlFlowAnalysis.visit_CascadedAssignmentNodec             C   sR   t ƒ }| |¡ x|jD ]\}}|  |¡ qW x|jD ]\}}|  ||¡ q6W |S )N)r²   rÀ   r°   rÇ   rU   )r   rN   Z	collectorrR   rS   r   r   r   Úvisit_ParallelAssignmentNode6  s    
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec             C   s2   d| _ |  |¡ d| _ |  |j|  | ¡ ¡¡ |S )NTF)r¼   rÀ   rU   rR   rº   Zcreate_binop_node)r   rN   r   r   r   Úvisit_InPlaceAssignmentNode?  s
    
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec             C   sv   xp|j D ]f}|jrd|jp$| j |j¡}|js2|jrDt|j	d|j ƒ |j
sT|  |¡ | j ||¡ q|  |¡ qW |S )Nz7can not delete variable '%s' referenced in nested scope)rÅ   rÏ   rJ   r¾   rÐ   r   rH   rG   r   r   Zignore_nonexistingrÇ   r¥   rZ   )r   rN   rÉ   rJ   r   r   r   Úvisit_DelStatNodeF  s    

z%ControlFlowAnalysis.visit_DelStatNodec             C   s6   | j  |j¡}|r2|j }| j |t|j|ƒ|¡ |S )N)r¾   rÐ   r   Znot_noner¥   rW   r   r   )r   rN   rJ   r   r   r   r   Úvisit_CArgDeclNodeU  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¥   r6   rJ   r¾   rÐ   r   r\   r»   r¼   r   r   )r   rN   rJ   r   r   r   Úvisit_NameNode]  s    z"ControlFlowAnalysis.visit_NameNodec             C   s6   | j jr2x(|jD ]}|  |¡ | j jsd|_P qW |S )NT)r¥   r6   r'   rÇ   Zis_terminator)r   rN   rf   r   r   r   Úvisit_StatListNodei  s    
z&ControlFlowAnalysis.visit_StatListNodec             C   s   |   |¡ |  |¡ |S )N)rÀ   rO   )r   rN   r   r   r   r³   r  s    

zControlFlowAnalysis.visit_Nodec             C   sÄ   | j  ¡ }| j j}xR|jD ]H}| j  |¡}|  |j¡ | j  ¡  |  |j¡ | j jr| j j |¡ qW |j	rž| j j|d |  |j	¡ | j jr¨| j j |¡ n
| |¡ |j
r¸|| j _nd | j _|S )N)r3   )r¥   rB   r6   Z
if_clausesrC   rÇ   Ú	conditionrÈ   r7   Úelse_clauser%   )r   rN   rn   r3   Úclauser   r   r   Úvisit_IfStatNodew  s&    



z$ControlFlowAnalysis.visit_IfStatNodec             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 )N)r3   )r¥   rC   rB   r>   rQ   rm   rÝ   rÇ   rÈ   r]   r6   r7   rÞ   r%   )r   rN   Úcondition_blockrn   r   r   r   Úvisit_WhileStatNode‘  s*    




z'ControlFlowAnalysis.visit_WhileStatNodec       
      C   sÂ  d}|j j}|j}t|tjƒrô|j}|jd krô|jrô| j	 
|j¡}|rL|jrô|jdkrpt|jƒdkrp|jd }n„|jdkrôt|jƒdkrô|jrôt|jƒdkrô|jd }|jrô| | j	¡}|jrô|  |jd tj|jdtjd¡ |jd }|jd }t|tjƒrª|j}|jd krª|jrª| j	 
|j¡}|r8|jrª|jd	krªd
}x$|jd d… D ]}	|  ||	¡ qXW t|jƒdkrª|  ||  t |jd|jd |jd ¡¡¡ |s¾|  ||j¡ d S )NFÚreversedr   r   rÒ   rM   ZPY_SSIZE_T_MAX)Úvaluer   )ÚrangeZxrangeTú+)ÚiteratorÚsequencerÔ   rc   r   ZSimpleCallNodeÚfunctionr   rÏ   r¾   rÐ   r   Ú
is_builtinr…   rÅ   rÑ   rx   Zis_builtin_typerU   ZIntNoder   r   Zc_py_ssize_t_typerº   Ú
binop_nodeÚitem)
r   rN   Z
is_specialrè   rÔ   ré   rJ   rç   Ziterator_typerÉ   r   r   r   Úmark_forloop_target¯  sN    





z'ControlFlowAnalysis.mark_forloop_targetc             C   s
   |   |¡S )N)Úvisit_ForInStatNode)r   rN   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)Úexclude)r3   )r¥   rC   rB   r>   rQ   rm   rÇ   rç   rc   r   ZForInStatNoderí   ZAsyncForStatNoderU   rÔ   rì   ZParallelRangeNodeÚ_delete_privatesrJ   rÈ   r]   r6   r7   rÞ   r%   )r   rN   rá   rn   r   r   r   rî   ä  s6    






z'ControlFlowAnalysis.visit_ForInStatNodec             C   s2   x,|j D ]"}|r|j|k	r| j ||j¡ qW d S )N)Úassigned_nodesrJ   r¥   rZ   )r   rN   rð   Úprivate_noder   r   r   rñ     s    z$ControlFlowAnalysis._delete_privatesc             C   sj   | j }t|jdƒr`t|ƒ| _ x8|jD ].}d|j_|j|j \}}|r$| j  |j¡ q$W |  	|¡}|| _ |S )NrJ   T)
r»   ÚhasattrrÔ   r#   rò   rJ   rI   r°   r5   rî   )r   rN   r»   ró   r   Z	reductionr   r   r   Úvisit_ParallelRangeNode  s    

z+ControlFlowAnalysis.visit_ParallelRangeNodec             C   s:   x|j D ]}d|j_qW |  |¡ |  |¡ |  |¡ |S )NT)rò   rJ   rI   rñ   rÀ   )r   rN   ró   r   r   r   Úvisit_ParallelWithBlockNode(  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æ   )r3   )r¥   rC   rB   r>   rQ   rm   rÇ   Zbound1Zbound2ÚsteprU   rÔ   rº   r   rë   r   rÈ   r]   r6   r7   rÞ   r%   )r   rN   rá   rn   r   r   r   Úvisit_ForFromStatNode2  s6    








z)ControlFlowAnalysis.visit_ForFromStatNodec             C   s   t dƒ‚d S )NzGeneric loops are not supported)r   )r   rN   r   r   r   Úvisit_LoopNodeW  s    z"ControlFlowAnalysis.visit_LoopNodec             C   s   |   |j|jj¡ |S )N)rU   rR   Z	with_nodeÚ
enter_call)r   rN   r   r   r   Ú"visit_WithTargetAssignmentStatNodeZ  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec             C   s(   |   |j¡ |   |j¡ |   |j¡ |S )N)rÇ   Zmanagerrú   rÈ   )r   rN   r   r   r   Úvisit_WithStatNode^  s    z&ControlFlowAnalysis.visit_WithStatNodec             C   sl  | j  ¡ }| j  ¡  | j  ¡ }| j j t|ƒ¡ | j  ¡  | j j |¡ | j  ¡  |  |j	¡ | j j 
¡  | j jr¤|jrŽ| j  ¡  |  |j¡ | j jr¤| j j |¡ xŠ|jD ]€}|| j _|jrÚx|jD ]}|  |¡ qÆW n | j j| j jd}| j  ¡  |jr
|  |j¡ |  |j	¡ | j jr¬| j j |¡ q¬W | j jrN| | j jd j¡ |jr`|| j _nd | j _|S )N)r3   rÎ   )r¥   rB   r?   rQ   rp   rC   r6   r7   rÇ   rÈ   r]   rÞ   Zexcept_clausesÚpatternrÔ   rU   r@   r%   )r   rN   rn   r@   rß   rý   r   r   r   Úvisit_TryExceptStatNoded  sB    








z+ControlFlowAnalysis.visit_TryExceptStatNodec             C   s8  | 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 j ¡  | j jrú| j jd j ¡  | j jr4| j j |¡ |r,| j j|d| j _nd | j _|S )NrÎ   )r3   )r¥   rC   rB   r6   rÇ   Zfinally_except_clauser?   r7   r@   Zfinally_clauserp   rQ   r>   rÈ   r]   )r   rN   Z
body_blockr@   rq   rr   Zdescrr   r   r   Úvisit_TryFinallyStatNode•  s6    





z,ControlFlowAnalysis.visit_TryFinallyStatNodec             C   s@   |   |¡ |  |¡ | jjr4| jj | jjd j¡ d | j_|S )NrÎ   )rO   rÀ   r¥   r?   r6   r7   r@   )r   rN   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Î   )rO   r¥   r?   r6   r7   r@   )r   rN   r   r   r   Úvisit_ReraiseStatNodeÃ  s
    
z)ControlFlowAnalysis.visit_ReraiseStatNodec             C   s„   |   |¡ |  |¡ xb| jjd d d… D ]2}|jr(| jj |j¡ |jrX|j | jj¡ P q(W | jjrx| jj | jj¡ d | j_|S )NrÎ   )	rO   rÀ   r¥   r?   rq   r6   r7   rr   rA   )r   rN   Ú	exceptionr   r   r   Úvisit_ReturnStatNodeÊ  s    

z(ControlFlowAnalysis.visit_ReturnStatNodec             C   s„   | j js|S | j jd }|  |¡ xT|jd d d… D ]0}|jr4| j j |j¡ |jrb|j |j¡ P q4W | j j |j¡ d | j _|S )NrÎ   )	r¥   r>   rO   r?   rq   r6   r7   rr   rn   )r   rN   Úloopr  r   r   r   Úvisit_BreakStatNodeÚ  s    
z'ControlFlowAnalysis.visit_BreakStatNodec             C   s„   | j js|S | j jd }|  |¡ xT|jd d d… D ]0}|jr4| j j |j¡ |jrb|j |j¡ P q4W | j j |j¡ d | j _|S )NrÎ   )	r¥   r>   rO   r?   rq   r6   r7   rr   ro   )r   rN   r  r  r   r   r   Úvisit_ContinueStatNodeë  s    
z*ControlFlowAnalysis.visit_ContinueStatNodec             C   s>   |j r| j | j¡ |j | _|  |j¡ |j r:| j ¡ | _|S )N)Ú
expr_scoper½   rQ   r¾   rÇ   r  r]   )r   rN   r   r   r   Úvisit_ComprehensionNodeü  s    z+ControlFlowAnalysis.visit_ComprehensionNodec             C   s<   |j r| j | j¡ |j | _|  |¡ |j r8| j ¡ | _|S )N)r  r½   rQ   r¾   rÀ   r]   )r   rN   r   r   r   Úvisit_ScopedExprNode  s    
z(ControlFlowAnalysis.visit_ScopedExprNodec             C   sp   |   |d¡ | j |j|j| j |j¡¡ | j 	| j¡ |j
| _| j ¡  |   |d¡ | j ¡  | j ¡ | _|S )N)ÚdictÚ	metaclassZmkwÚbasesZclass_result)rÈ   )rÀ   r¥   rU   rÔ   Zclassobjr¾   rÐ   r   r½   rQ   ry   rC   r]   )r   rN   r   r   r   Úvisit_PyClassDefNode  s    

z(ControlFlowAnalysis.visit_PyClassDefNodec             C   s$   |j jr|  |j t¡ |  |¡ |S )N)ZoperandrÏ   rU   r   rÀ   )r   rN   r   r   r   Úvisit_AmpersandNode  s    
z'ControlFlowAnalysis.visit_AmpersandNode)N)N),r   r   r    rÄ   rÊ   rË   rÌ   rÍ   rU   rO   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   r·   ¢  sR   3
!		2,

%1&
	r·   )/Z
__future__r   ZcythonZdeclareÚobjectrŽ   r   r   r   r   r   r
   r   ZVisitorr   r   ZErrorsr   r	   r   ZOptimizer   ZExprNoder   r   r   r"   r9   r:   r;   rm   rp   rP   rh   rV   rX   rY   ri   r[   r“   r~   r‰   r¤   r§   r±   r²   r·   r   r   r   r   Ú<module>   sN   

7 @) 