B
    Í‹d³  ã               @   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__© úh/work/yifan.wang/ringdown/master-ringdown-env/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   ÚqueueÚ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   rd   rJ   rb   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#   rb   rd   rL   r5   ÚStaticAssignmentrG   ÚUnknownrY   r'   )r   ÚistaterJ   Úretrb   Ú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\   ra   ri   ro   rp   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   rr   rs   r   r   r   r   '  s    zLoopDescr.__init__N)r   r   r    r   r   r   r   r   rq   &  s   rq   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@   ru   rv   r   r   r   r   5  s    zExceptionDescr.__init__)NN)r   r   r    r8   r   r   r   r   r   rt   -  s   rt   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   Úscoperz   )r   r   r   r   r|   K  s    zNameAssignment.infer_typec             C   s   | j  | jj¡S )N)rS   Útype_dependenciesrJ   r}   )r   r   r   r   r~   O  s    z NameAssignment.type_dependenciesc             C   s   | j jjs| j jS | jS )N)rJ   r   Úis_unspecifiedrz   )r   r   r   r   r   R  s    
zNameAssignment.typeN)	r   r   r    r   r{   r|   r~   Ú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 )rj   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   rj   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   r|   d  s    zStaticAssignment.infer_typec             C   s   dS )Nr   r   )r   r   r   r   r~   g  s    z"StaticAssignment.type_dependencies)r   r   r    r8   r   r|   r~   r!   r   r   )r   r   rj   Y  s   	rj   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   ry   )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   r|   rJ   r}   r   Zcan_coerce_to_pyobjectr
   rz   )r   rz   r   r   r   r|   v  s    zNameDeletion.infer_typeN)r   r   r    r   r|   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 )rk   z7Coming from outer closure, might be initialised or not.N)r   r   r    r8   r   r   r   r   rk   ƒ  s   rk   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)rw   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   r{     s    zNameReference.__repr__N)r   r   r    r   r{   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_nullrk   Ú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'   re   rP   rJ   ry   r   r[   r‘   r§   r$   )	r   r    Úctxr¢   r6   Úlabelrh   Ú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')6ri   rp   r#   r<   r*   r'   rb   rJ   ro   re   rP   rR   rw   Úupdater5   rc   ry   rd   rS   r   Zcf_assignmentsrQ   r[   rN   Zcf_referencesr†   rY   rk   rx   r­   r‡   r‰   rˆ   rf   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.   rh   Zi_assmtsr‹   rn   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               @   sh  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdXd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d0d1„ Zd2d3„ ZdYd4d5„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+dTdU„ Z,dVdW„ Z-dS )ZÚ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_defsÚwtÚmodule)r¢   )r   Úgv_ctxr   Úconstant_folderr#   Ú
reductionsÚin_inplace_assignmentÚ	env_stackr}   Ú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=   rg   rK   r5   rO   rC   Ú_visitZstar_argrW   r   r   Z
tuple_typerJ   Zstarstar_argÚ	dict_typeÚbodyZis_generatorZgbodyr6   r7   rA   ra   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)Ú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Ú*)rf   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   Ú	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   rh   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   |S )Nr   )r   rN   r   r   r   Úvisit_SizeofVarNodew  s    z'ControlFlowAnalysis.visit_SizeofVarNodec             C   s   |S )Nr   )r   rN   r   r   r   Úvisit_TypeidNodez  s    z$ControlFlowAnalysis.visit_TypeidNodec             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   rr   r3   Úclauser   r   r   Úvisit_IfStatNode}  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   rq   ré   rÎ   rÐ   r]   r6   r7   rê   r%   )r   rN   Úcondition_blockrr   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   )ÚrangeÚxrangeTú+)ÚiteratorÚsequencerÝ   re   r   ZSimpleCallNodeÚfunctionr   rØ   rÅ   rÙ   r¡   Ú
is_builtinr‰   rÌ   rÚ   r|   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   rq   rÎ   rô   re   r   ZForInStatNoderú   ZAsyncForStatNoderU   rÝ   rù   ZParallelRangeNodeÚ_delete_privatesrJ   rÐ   r]   r6   r7   rê   r%   )r   rN   rí   rr   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   rq   rÎ   Úbound1Úbound2ÚsteprU   rÝ   rÁ   r   rø   r   rÐ   r]   r6   r7   rê   r%   )r   rN   rí   rr   r   r   r   Úvisit_ForFromStatNode8  s6    








z)ControlFlowAnalysis.visit_ForFromStatNodec             C   s   t dƒ‚d S )NzGeneric loops are not supported)r   )r   rN   r   r   r   Úvisit_LoopNode]  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_WithTargetAssignmentStatNode`  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec             C   s(   |   |j¡ |   |j¡ |   |j¡ |S )N)rÎ   Úmanagerr	  rÐ   )r   rN   r   r   r   Úvisit_WithStatNoded  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   rt   rC   r6   r7   rÎ   rÐ   r]   rê   Zexcept_clausesÚpatternrÝ   rU   r@   r%   )r   rN   rr   r@   rë   r  r   r   r   Úvisit_TryExceptStatNodej  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_clausert   rQ   r>   rÐ   r]   )r   rN   Z
body_blockr@   ru   rv   Ú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¬   |   |¡ |  |¡ t| jjd d d… ƒ}xt|D ]R}|jr0| jj |j¡ |jr€| jj	}x|D ]}|jr^|j}P q^W |j |¡ P q0W | jjr | jj | jj	¡ d | j_|S )Nr×   )
rO   rÇ   Úiterr©   r?   ru   r6   r7   rv   rA   )r   rN   Zouter_exception_handlersÚhandlerrA   Znext_handlerr   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?   ru   r6   r7   rv   rr   )r   rN   ÚloopÚ	exceptionr   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?   ru   r6   r7   rv   rs   )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   r}   rC   r]   )r   rN   r   r   r   Úvisit_PyClassDefNode  s    

z(ControlFlowAnalysis.visit_PyClassDefNodec             C   s$   |j jr|  |j t¡ |  |¡ |S )N)Ú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   r   r½   ¢  sV   3
!		2,

%1%
	r½   )/Ú
__future__r   Ú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;   rq   rt   rP   rj   rV   rX   rY   rk   r[   r—   r‚   r   r¨   r­   r·   r¸   r½   r   r   r   r   Ú<module>   sN   

7 @) 