3
PO[                 @   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| j| || _|| _d S )N)superr   __init__type_may_be_none)selfr   may_be_nonepos)	__class__ k/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/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j|  qW x| jD ]}|j j|  q$W | jj  | 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| |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 | 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j| |r |j| |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j| |r"|j| n| jr4| j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)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)rE   is_variabler   is_struct_or_union
is_complexis_arrayis_cpp_class)r   rK   r   r   r   is_statically_assigned   s    z"ControlFlow.is_statically_assignedc             C   s"   | j r| j 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| j|rBt|||}| j jj| || j j|< | jj| d S )N)r6   rL   NameAssignmentr'   appendr(   r=   r5   )r   lhsrhsrK   
assignmentr   r   r   mark_assignment   s
    zControlFlow.mark_assignmentc             C   sF   | j rB| j|rBt|||}| j jj| || j j|< | jj| d S )N)r6   rL   Argumentr'   rW   r(   r=   r5   )r   rX   rY   rK   rZ   r   r   r   mark_argument   s
    zControlFlow.mark_argumentc             C   sD   | j r@| j|r@t||}| j jj| t| j j|< | jj| d S )N)	r6   rL   NameDeletionr'   rW   Uninitializedr(   r=   r5   )r   rT   rK   rZ   r   r   r   mark_deletion   s
    
zControlFlow.mark_deletionc             C   s4   | j r0| j|r0| j jjt|| | jj| d S )N)r6   rL   r'   rW   NameReferencer=   r5   )r   rT   rK   r   r   r   mark_reference   s    zControlFlow.mark_referencec             C   s   t | jg}t  }x<|rN|j }|j| x |jD ]}||kr2|j| q2W qW | j| }x|D ]}|j  q`W |j| j xP|D ]H}|j rx(|j	D ]}x|jD ]}|j
| qW qW |j  |j| qW |  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
| | j|O  _|dK }qRW qFW x| jD ]}xZ|jj D ]L\}}| j | }|tkr| j|jO  _n| j|jO  _| j|jO  _qW |j|_x&|jD ]}| j| j | jO  _qW qW x&| j 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'   
isinstancerV   rK   rW   r(   itemsr_   r,   r-   r+   r)   valuesr@   )r   rj   rK   rh   r6   statr   r   r   
initialize   s8    


 zControlFlow.initializec             C   sx   t  }| j| }||j@ rP| j|r4|jt| n|jrF|jt n
|jt x"|j	D ]}||j@ rX|j| qXW |S )N)
r#   rh   rj   rR   r5   StaticAssignmentrH   Unknownr_   r'   )r   ZistaterK   retrh   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   rL   rR   rU   r[   r]   r`   rb   rg   ro   rt   ru   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   rw   rx   r   r   r   r   '  s    zLoopDescr.__init__N)r   r   r    r   r   r   r   r   rv   &  s   rv   c               @   s   e Zd ZdZdddZdS )ExceptionDescrzException 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@   rz   r{   r   r   r   r   5  s    zExceptionDescr.__init__)NN)r   r   r    r8   r   r   r   r   r   ry   -  s   ry   c               @   s8   e Zd Zdd Zdd Zdd Zdd Zed	d
 ZdS )rV   c             C   sJ   |j d krt |_ || _|| _|| _|j| _t | _d| _d| _d | _	d S )NF)
cf_stater#   rX   rY   rK   r   refsrG   is_deletioninferred_type)r   rX   rY   rK   r   r   r   r   <  s    
zNameAssignment.__init__c             C   s   d| j j| jf S )Nz%s(entry=%r))r   r   rK   )r   r   r   r   __repr__H  s    zNameAssignment.__repr__c             C   s   | j j| jj| _| jS )N)rY   
infer_typerK   scoper   )r   r   r   r   r   K  s    zNameAssignment.infer_typec             C   s   | j j| jjS )N)rY   type_dependenciesrK   r   )r   r   r   r   r   O  s    z NameAssignment.type_dependenciesc             C   s   | j jjs| j jS | jS )N)rK   r   is_unspecifiedr   )r   r   r   r   r   R  s    
zNameAssignment.typeN)	r   r   r    r   r   r   r   propertyr   r   r   r   r   rV   ;  s
   rV   c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )rp   z7Initialised at declaration time, e.g. stack allocation.c                s<   |j jsd}nd }t|j ||jd}tt| j||| d S )NF)r   r   )r   is_pyobjectr   r   r   rp   r   )r   rK   r   rX   )r   r   r   r   [  s    zStaticAssignment.__init__c             C   s   | j jS )N)rK   r   )r   r   r   r   r   d  s    zStaticAssignment.infer_typec             C   s   f S )Nr   )r   r   r   r   r   g  s    z"StaticAssignment.type_dependencies)r   r   r    r8   r   r   r   r!   r   r   )r   r   rp   Y  s   	rp   c               @   s   e Zd Zdd ZdS )r\   c             C   s   t j| ||| d| _d S )NT)rV   r   rG   )r   rX   rY   rK   r   r   r   r   l  s    zArgument.__init__N)r   r   r    r   r   r   r   r   r\   k  s   r\   c               @   s   e Zd Zdd Zdd ZdS )r^   c             C   s   t j| ||| d| _d S )NT)rV   r   r~   )r   rX   rK   r   r   r   r   r  s    zNameDeletion.__init__c             C   s4   | j j| jj}|j r*|j| jjr*tS || _|S )N)rY   r   rK   r   r   can_coerce_to_pyobjectr
   r   )r   r   r   r   r   r   v  s    zNameDeletion.infer_typeN)r   r   r    r   r   r   r   r   r   r^   q  s   r^   c               @   s   e Zd ZdZdS )r_   zDefinitely not initialised yet.N)r   r   r    r8   r   r   r   r   r_     s   r_   c               @   s   e Zd ZdZdS )rq   z7Coming from outer closure, might be initialised or not.N)r   r   r    r8   r   r   r   r   rq     s   rq   c               @   s   e Zd Zdd Zdd ZdS )ra   c             C   s*   |j d krt |_ || _|| _|j| _d S )N)r|   r#   rT   rK   r   )r   rT   rK   r   r   r   r     s
    
zNameReference.__init__c             C   s   d| j j| jf S )Nz%s(entry=%r))r   r   rK   )r   r   r   r   r     s    zNameReference.__repr__N)r   r   r    r   r   r   r   r   r   ra     s   ra   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$|jt  d| _|sPd| _n,t|kr>|jt d| _nt|dkrPd| _tt| j	dd |D  d S )NTr   c             S   s   g | ]}|j tk	r|qS r   )rY   r   ).0ir   r   r   
<listcomp>  s    z-ControlFlowState.__init__.<locals>.<listcomp>)
r_   discardcf_maybe_null
cf_is_nullrq   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 j| d S )N)r$   rW   )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|< | j| }djdd ||d d |d  D S )N r   z\nc             S   s   g | ]}|j  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   |j d|  |j d x| jD ]}|j|| | q W |j 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   |j ddj 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  |j d| j  x| jjD ]}|j|}|rxj|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 |sd}|j|}|j d||j|f  qW xB| jjD ]6}|j|}x&|jD ]}|j d	||j|f  qW qW |j d
 d S )Nz subgraph %s {
z
 %s [%s %s]Zdeletion
definitionr   z
 %s [reference %s]r/   z  %s [label="%s"];
z  %s -> %s;
z }
)r   r   r   r<   r   r'   rk   rV   rK   r~   r   ra   r   r   r$   )	r   r   ctxr   r6   labelrn   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 j|d|f d S )NT)r   r5   )r   r   messager   r   r   r     s    zMessageCollection.errorc             C   s   | j 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 )NrS   )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  | j   | j  t }i }t }x| jD ]}|j}x|jD ]}| j|j }| j||j}	t	|t
r|jjj|	 |j|j ||j @ }|jr||jO }n
||jO }|j| |jtk	r|jjj| q>t	|tr>|j||j< |jjj| |jjj|	 |	jt |	jt x|	D ]}
|
jj| qW q>W q*W |d }|d }|d }|d }t }x`|D ]X}t|jkrd|_t|jdkrd|_ nd|_ n t|jkrd|_nd|_ d|_qbW x |j! D ]\}}t|jkrd|_|j" rt|jdkrd|_ |j#s|j"s|j$s|j%j&r(nr|j r|j'sTt(j'rj|j%j)sT|j%j*rj|j+|j,d|j-  n|j.|j,d|j-  n|r|j.|j,d	|j-  n t|jkrd|_nd|_ d|_qW x~|D ]v}
|
j r|
jj$ r|
jj/ r|
jjr4|r4|
j0r|j.|
j,d
|
jj-  n|j.|
j,d|
jj-  d|
j_1qW x| j2D ]z}|j rJ|j$ rJ|j-dkr|j-j3d r|j0r|r|j.|j,d|j-  n|r|j.|j,d|j-  d|_1qJW |j4  x|D ]}t5|j|_qW x|D ]}t5|j|_qW 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'_unusedzUnused argument '%s'zUnused entry '%s')6ro   ru   r#   r<   r*   r'   rh   rK   rt   rk   rV   rX   r|   updater5   ri   r~   rj   rY   r   cf_assignmentsrW   ra   rT   cf_referencesr   r_   rq   r}   r   r   r   r   rl   rH   
allow_nullrF   r   r   rJ   r   r   r   r   r   r   r	   rI   rG   cf_usedr=   
startswithr   r   )r   compiler_directivesassignmentsZ
referencesZassmt_nodesr6   r.   rn   Zi_assmtsr   rs   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr   rT   rK   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| j  g | _d S )N)r   r   r   r   )r   )r   r   r   r     s    zAssignmentCollector.__init__c             C   s   | j | d  d S )N)_visitchildren)r   r   r   r   
visit_Node  s    zAssignmentCollector.visit_Nodec             C   s   | j j|j|jf d S )N)r   rW   rX   rY   )r   rT   r   r   r   visit_SingleAssignmentNode  s    z.AssignmentCollector.visit_SingleAssignmentNodec             C   s&   x |j D ]}| jj||jf qW d S )N)lhs_listr   rW   rY   )r   rT   rX   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 | _| j| t| j| j | jd }|r| jd }t|d}z| jj|d|d W d |j  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   rT   Z
dot_outputr   r   r   r   r   visit_ModuleNode  s$    




z$ControlFlowAnalysis.visit_ModuleNodec             C   s  x|j D ]}|jr| j| qW | j|d | jj| j |j| _| jj| j t	 | _x.|jj
j D ]}| jj|rf| jj
j| qfW | j| | jj  x|j D ]}| j| qW |jr| jj|jttjdd|jj |jr| jj|jttjdd|jj | j|j |jr&| j|jj | jjrB| jjj| jj | jj  t | j| j! | jj"j| jj# | j$jt%|jj&| j | jj' | _| jj' | _|S )N
decoratorsF)r   )r   )(argsdefaultr   r   rW   r   local_scoper   r   r;   r=   rm   rL   r5   rU   rC   _visitstar_argr]   r   r   
tuple_typerK   starstar_arg	dict_typebodyis_generatorgbodyr6   r7   rA   rg   r   r   r<   r@   r   r   r   rc   )r   rT   argrK   r   r   r   visit_FuncDefNode  sJ    







z%ControlFlowAnalysis.visit_FuncDefNodec             C   s   d|_ | j|S )NT)usedr   )r   rT   r   r   r   visit_DefNode  s    z!ControlFlowAnalysis.visit_DefNodec             C   s   |S )Nr   )r   rT   r   r   r   visit_GeneratorBodyDefNode  s    z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec             C   s   |S )Nr   )r   rT   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 | j j  |sBt}|jr|jd k	rZ|j}n| j	j
|j}|d krtd S | j j||| nR|jrxJt|jD ]0\}}| s|jrd }n
|j|}| j|| qW n
| j| | j jr| j jd }| j jj|j | j j  d S )Nr   r   )r   r6   r?   r7   r@   rC   r   is_namerK   r   lookupr   r[   is_sequence_constructor	enumerater   
is_starredinferable_item_noder   )r   rX   rY   Z	exc_descrrK   r   r   Z	item_noder   r   r   r[     s4    




z#ControlFlowAnalysis.mark_assignmentc             C   s   | j d r| jj| dS )z'Mark position if DOT output is enabled.zcontrol_flow.dot_outputN)r   r   rU   )r   rT   r   r   r   rU     s    
z!ControlFlowAnalysis.mark_positionc             C   s4   x$|j D ]\}}|dkr| j| qW | j| |S )N*)rl   r[   r   )r   rT   r   targetr   r   r   visit_FromImportStatNode!  s
    
z,ControlFlowAnalysis.visit_FromImportStatNodec             C   s   t dd S )NzUnhandled assignment node)r   )r   rT   r   r   r   visit_AssignmentNode(  s    z(ControlFlowAnalysis.visit_AssignmentNodec             C   s    | j |j | j|j|j |S )N)r   rY   r[   rX   )r   rT   r   r   r   r   +  s    z.ControlFlowAnalysis.visit_SingleAssignmentNodec             C   s.   | j |j x|jD ]}| j||j qW |S )N)r   rY   r   r[   )r   rT   rX   r   r   r   r   0  s    z0ControlFlowAnalysis.visit_CascadedAssignmentNodec             C   sR   t  }|j| x|jD ]\}}| j| qW x|jD ]\}}| j|| q6W |S )N)r   r   r   r   r[   )r   rT   	collectorrX   rY   r   r   r   visit_ParallelAssignmentNode6  s    
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec             C   s2   d| _ | j| d| _ | j|j| j|j  |S )NTF)r   r   r[   rX   r   create_binop_node)r   rT   r   r   r   visit_InPlaceAssignmentNode?  s
    
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec             C   sv   xp|j D ]f}|jrd|jp$| jj|j}|js2|jrDt|j	d|j  |j
sT| j| | jj|| q| j| qW |S )Nz7can not delete variable '%s' referenced in nested scope)r   r   rK   r   r   r   rI   rH   r   r   ignore_nonexistingr   r   r`   )r   rT   r   rK   r   r   r   visit_DelStatNodeF  s    

z%ControlFlowAnalysis.visit_DelStatNodec             C   s6   | j j|j}|r2|j }| jj|t|j|| |S )N)r   r   r   not_noner   r]   r   r   )r   rT   rK   r   r   r   r   visit_CArgDeclNodeU  s    z&ControlFlowAnalysis.visit_CArgDeclNodec             C   sP   | j jrL|jp| jj|j}|rL| j j|| || jkrL| j rLt	|j
d |S )Nz+Cannot read reduction variable in loop body)r   r6   rK   r   r   r   rb   r   r   r   r   )r   rT   rK   r   r   r   visit_NameNode]  s    z"ControlFlowAnalysis.visit_NameNodec             C   s6   | j jr2x(|jD ]}| j| | j jsd|_P qW |S )NT)r   r6   r'   r   is_terminator)r   rT   rn   r   r   r   visit_StatListNodei  s    
z&ControlFlowAnalysis.visit_StatListNodec             C   s   | j | | j| |S )N)r   rU   )r   rT   r   r   r   r   r  s    

zControlFlowAnalysis.visit_Nodec             C   s   | j j }| j j}xR|jD ]H}| j j|}| j|j | j j  | j|j | j jr| j jj| qW |j	r| j j|d | j|j	 | j jr| j jj| n
|j| |j
r|| j _nd | j _|S )N)r3   )r   rB   r6   
if_clausesrC   r   	conditionr   r7   else_clauser%   )r   rT   rw   r3   clauser   r   r   visit_IfStatNodew  s&    



z$ControlFlowAnalysis.visit_IfStatNodec             C   s   | j j }| j j }| j jjt|| |jr:| j|j | j j  | j|j | j jj	  | j j
r| j j
j| | j j
j| |jr| j j|d | j|j | j j
r| j j
j| n
|j| |jr|| j _
nd | j _
|S )N)r3   )r   rC   rB   r>   rW   rv   r  r   r   rc   r6   r7   r  r%   )r   rT   condition_blockrw   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
|j}| sN|jr|jdkrrt|jdkrr|jd }n|jdkrt|jdkr|jrt|jdkr|jd }|jr|j| j	}|jr| j|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
|j}| s<|jr|jdkrd}x$|jd d D ]}	| j||	 q\W t|jdkr| j|| jtj|jd|jd |jd  |s| j||j d S )NFreversedr   r   r   rS   PY_SSIZE_T_MAX)valuer   rangexrangeT+)r  r  )iteratorsequencer   rk   r   SimpleCallNodefunctionr   r   r   r   r   
is_builtinr   r   r   r   is_builtin_typer[   IntNoder   r   c_py_ssize_t_typer   
binop_nodeitem)
r   rT   
is_specialr  r   r  rK   r  iterator_typer   r   r   r   mark_forloop_target  sN    




z'ControlFlowAnalysis.mark_forloop_targetc             C   s
   | j |S )N)visit_ForInStatNode)r   rT   r   r   r   visit_AsyncForStatNode  s    z*ControlFlowAnalysis.visit_AsyncForStatNodec             C   s:  | j j }| j j }| j jjt|| | j|j | j j  t|t	j
rV| j| n*t|t	jrt| j|j|j n| j|j t|t	jr| j||jjd | j j  | j|j | j jj  | j jr| j jj| |jr| j j|d | j|j | j jr| j jj| n
|j| |jr.|| j _nd | j _|S )N)exclude)r3   )r   rC   rB   r>   rW   rv   r   r  rk   r   ForInStatNoder  AsyncForStatNoder[   r   r  ParallelRangeNode_delete_privatesrK   r   rc   r6   r7   r  r%   )r   rT   r  rw   r   r   r   r    s6    






z'ControlFlowAnalysis.visit_ForInStatNodec             C   s4   x.|j D ]$}| s|j|k	r| jj||j qW d S )N)assigned_nodesrK   r   r`   )r   rT   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|j q$W | j	|}|| _ |S )NrK   T)
r   hasattrr   r#   r#  rK   rJ   r   r5   r  )r   rT   r   r$  r   Z	reductionr   r   r   visit_ParallelRangeNode  s    

z+ControlFlowAnalysis.visit_ParallelRangeNodec             C   s:   x|j D ]}d|j_qW | j| | j| | j| |S )NT)r#  rK   rJ   r"  r   )r   rT   r$  r   r   r   visit_ParallelWithBlockNode(  s    


z/ControlFlowAnalysis.visit_ParallelWithBlockNodec             C   s<  | j j }| j j }| j jjt|| | j|j | j|j |j	d k	rV| j|j	 | j j  | j
|j|j |j	d k	r| j
|j| jtj|jd|j|j	 | j j  | j|j | j jj  | j jr| j jj| |jr| j j|d | j|j | j jr| j jj| n
|j| |jr0|| j _nd | j _|S )Nr  )r3   )r   rC   rB   r>   rW   rv   r   bound1bound2stepr[   r   r   r   r  r   r   rc   r6   r7   r  r%   )r   rT   r  rw   r   r   r   visit_ForFromStatNode2  s6    








z)ControlFlowAnalysis.visit_ForFromStatNodec             C   s   t dd S )NzGeneric loops are not supported)r   )r   rT   r   r   r   visit_LoopNodeW  s    z"ControlFlowAnalysis.visit_LoopNodec             C   s   | j |j|jj |S )N)r[   rX   	with_node
enter_call)r   rT   r   r   r   "visit_WithTargetAssignmentStatNodeZ  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec             C   s(   | j |j | j |j | j |j |S )N)r   managerr.  r   )r   rT   r   r   r   visit_WithStatNode^  s    z&ControlFlowAnalysis.visit_WithStatNodec             C   sl  | j j }| j j  | j j }| j jjt| | j j  | j jj| | j j  | j|j	 | j jj
  | j jr|jr| j j  | j|j | j jr| j jj| x|jD ]}|| j _|jrx|jD ]}| j| qW n | j j| j jd}| j j  |jr
| j|j | j|j	 | j jr| j jj| qW | j jrN|j| j jd j |jr`|| j _nd | j _|S )N)r3   r   r   )r   rB   r?   rW   ry   rC   r6   r7   r   r   rc   r  except_clausespatternr   r[   r@   r%   )r   rT   rw   r@   r  r3  r   r   r   visit_TryExceptStatNoded  sB    








z+ControlFlowAnalysis.visit_TryExceptStatNodec             C   s:  | j j }| j j }|| j _| j|j | j jrP| j jrP| j jj| j jd j | j j }|| j _| j|j	 | j j}t
|||}| j jj| | j jr| j jd jj| || j _|j| | j j  | j|j | j jj  | j j r| j jd jj  | j jr6| j jj| |r.| j j|d| j _nd | j _|S )Nr   )r3   r   r   r   )r   rC   rB   r6   r   finally_except_clauser?   r7   r@   finally_clausery   rW   r>   r   rc   )r   rT   Z
body_blockr@   rz   r{   descrr   r   r   visit_TryFinallyStatNode  s6    






z,ControlFlowAnalysis.visit_TryFinallyStatNodec             C   s@   | j | | j| | jjr4| jjj| jjd j d | j_|S )Nr   r   )rU   r   r   r?   r6   r7   r@   )r   rT   r   r   r   visit_RaiseStatNode  s    

z'ControlFlowAnalysis.visit_RaiseStatNodec             C   s6   | j | | jjr*| jjj| jjd j d | j_|S )Nr   r   )rU   r   r?   r6   r7   r@   )r   rT   r   r   r   visit_ReraiseStatNode  s
    
z)ControlFlowAnalysis.visit_ReraiseStatNodec             C   s   | j | | j| xb| jjd d d D ]2}|jr(| jjj|j |jrX|jj| jj P q(W | jjrx| jjj| jj d | j_|S )Nr   r   )	rU   r   r   r?   rz   r6   r7   r{   rA   )r   rT   	exceptionr   r   r   visit_ReturnStatNode  s    

z(ControlFlowAnalysis.visit_ReturnStatNodec             C   s   | j js|S | j jd }| j| xT|jd d d D ]0}|jr4| j jj|j |jrb|jj|j P q4W | j jj|j d | j _|S )Nr   r   r   )	r   r>   rU   r?   rz   r6   r7   r{   rw   )r   rT   loopr;  r   r   r   visit_BreakStatNode  s    
z'ControlFlowAnalysis.visit_BreakStatNodec             C   s   | j js|S | j jd }| j| xT|jd d d D ]0}|jr4| j jj|j |jrb|jj|j P q4W | j jj|j d | j _|S )Nr   r   r   )	r   r>   rU   r?   rz   r6   r7   r{   rx   )r   rT   r=  r;  r   r   r   visit_ContinueStatNode  s    
z*ControlFlowAnalysis.visit_ContinueStatNodec             C   s>   |j r| jj| j |j | _| j|j |j r:| jj | _|S )N)
expr_scoper   rW   r   r   r=  rc   )r   rT   r   r   r   visit_ComprehensionNode  s    z+ControlFlowAnalysis.visit_ComprehensionNodec             C   s<   |j r| jj| j |j | _| j| |j r8| jj | _|S )N)r@  r   rW   r   r   rc   )r   rT   r   r   r   visit_ScopedExprNode  s    
z(ControlFlowAnalysis.visit_ScopedExprNodec             C   sp   | j |d | jj|j|j| jj|j | jj	| j |j
| _| jj  | j |d | jj  | jj | _|S )	Ndict	metaclassmkwbasesclass_resultr   )rC  rD  rE  rF  rG  )r   )r   r   r[   r   classobjr   r   r   r   rW   r   rC   rc   )r   rT   r   r   r   visit_PyClassDefNode  s    

z(ControlFlowAnalysis.visit_PyClassDefNodec             C   s$   |j jr| j|j t | j| |S )N)operandr   r[   r   r   )r   rT   r   r   r   visit_AmpersandNode  s    
z'ControlFlowAnalysis.visit_AmpersandNode)N)N),r   r   r    r   r   r   r   r   r[   rU   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r  r  r"  r&  r'  r+  r,  r/  r1  r4  r8  r9  r:  r<  r>  r?  rA  rB  rI  rK  r   r   r   r   r     sR   3
!		2,

%1&
	r   )/
__future__r   cythondeclareobjectr   r   r   r   r   r   r
   r   Visitorr   r   Errorsr   r	   r   ZOptimizer   ExprNoder   r   r   r"   r9   r:   r;   rv   ry   rV   rp   r\   r^   r_   rq   ra   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sN   

7 @) 