3
h                 @   s  d dl mZ d dlZejeeeeeeeeeeeed ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZmZ ddlmZmZmZ G dd dejZee
jZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZG d"d# d#eZ G d$d% d%eZ!G d&d' d'eZ"G d(d) d)e#Z$G d*d+ d+eZ%G d,d- d-eZ&G d.d/ d/eZ'd0d1 Z(G d2d3 d3eZ)G d4d5 d5eZ*dS )6    )absolute_importN)
PyrexTypes	ExprNodesNodesBuiltinOptionsTreeVisitorCythonTransformInternalErrorerrorwarningfake_rhs_exprTypedExprNode   )r   )r   )r   )r   )r   )r   r	   )r   r   r
   c                   s&   e Zd Zd fdd	Zdd Z  ZS )r   Nc                s    t t| j| || _|| _d S )N)superr   __init__type_may_be_none)selfr   may_be_nonepos)	__class__ m/var/www/html/CrowdFlow/Picklecon/ble_analysis_env/lib/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   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )ControlBlocka  Control flow graph node. Sequence of assignments and name references.

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

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

       Example:

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

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

    c             C   sN   t  | _t  | _t  | _g | _i | _t  | _d| _d| _d| _	d| _
d| _d S )Nr   )setchildrenparents	positionsstatsgenboundedi_inputi_outputi_geni_killi_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+   r0   r3   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   r4   r+   r   r   r   r   r5   [   s   r5   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   r6   b   s   r6   c               @   s   e Zd ZdZdd ZdddZd ddZd	d
 Zdd Zdd Z	d!ddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )"ControlFlowa  Control-flow graph.

       entry_point ControlBlock entry point for this graph
       exit_point  ControlBlock normal exit point
       block       ControlBlock current block
       blocks      set    children nodes
       entries     set    tracked entries
       loops       list   stack for loop descriptors
       exceptions  list   stack for exception descriptors
       in_try_block  int  track if we're in a try...except or try...finally block
    c             C   sL   t  | _t  | _g | _g | _t | _t | _| jj	| j | j| _
d| _d S )Nr   )r   blocksentriesloops
exceptionsr   entry_pointr5   
exit_pointr1   r2   in_try_block)r   r   r   r   r   t   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   r8   r1   r3   )r   r/   r2   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   r8   r1   r3   r2   )r   r/   r2   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   s<   |j r8|jr8|jjs4|jjs4|jjs4|jjr8|j r8dS dS )NTF)rA   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cpp_classZis_cpp_optional)r   rG   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   )r2   r"   r1   r   )r   noder   r   r   mark_position   s    zControlFlow.mark_positionc             C   sJ   | j rF| j|rFt||||d}| j jj| || j j|< | jj| d S )N)	rhs_scope)r2   rH   NameAssignmentr#   appendr$   r9   r1   )r   lhsrhsrG   rM   
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)r2   rH   Argumentr#   rO   r$   r9   r1   )r   rP   rQ   rG   rR   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)	r2   rH   NameDeletionr#   rO   Uninitializedr$   r9   r1   )r   rK   rG   rR   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)r2   rH   r#   rO   NameReferencer9   r1   )r   rK   rG   r   r   r   mark_reference   s    zControlFlow.mark_referencec             C   s   | j h}t }x<|rJ|j }|j| x |jD ]}||kr.|j| q.W qW | j| }x|D ]}|j  q\W |j| j  xP|D ]H}|j r~x(|j	D ]}x|jD ]}|j
| qW qW |j  |j| q~W |  j|8  _dS )z%Delete unreachable and orphan blocks.N)r<   r   popr1   r    r8   r0   r,   r+   r!   r3   )r   queuevisitedrootr.   Zunreachabler2   r/   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)assmtsr9   r6   maskbitr8   r#   
isinstancerN   rG   rO   r$   itemsrW   r(   r)   r'   r%   valuesr<   )r   rb   rG   r`   r2   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   r`   rb   rI   r1   StaticAssignmentrD   UnknownrW   r#   )r   ZistaterG   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)r8   r!   r'   r)   r(   r&   )r   Zdirtyr2   r&   r/   r'   r   r   r   reaching_definitions  s    
z ControlFlow.reaching_definitions)N)N)N)r   r   r   r4   r   r?   r@   rH   rI   rL   rS   rU   rX   rZ   r_   rg   rl   rm   r   r   r   r   r7   g   s   




$r7   c               @   s   e Zd Zdd ZdS )	LoopDescrc             C   s   || _ || _g | _d S )N)
next_block
loop_blockr;   )r   ro   rp   r   r   r   r   )  s    zLoopDescr.__init__N)r   r   r   r   r   r   r   r   rn   (  s   rn   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<   rr   rs   r   r   r   r   7  s    zExceptionDescr.__init__)NN)r   r   r   r4   r   r   r   r   r   rq   /  s   rq   c               @   s:   e Zd ZdddZdd Zdd Zdd	 Zed
d ZdS )rN   Nc             C   sP   |j d krt |_ || _|| _|| _|j| _t | _d| _d| _d | _	|| _
d S )NF)cf_stater   rP   rQ   rG   r   refsrC   is_deletioninferred_typerM   )r   rP   rQ   rG   rM   r   r   r   r   >  s    
zNameAssignment.__init__c             C   s   d| j j| jf S )Nz%s(entry=%r))r   r   rG   )r   r   r   r   __repr__L  s    zNameAssignment.__repr__c             C   s   | j j| jp| jj| _| jS )N)rQ   
infer_typerM   rG   scoperw   )r   r   r   r   ry   O  s    zNameAssignment.infer_typec             C   s   | j j| jp| jjS )N)rQ   type_dependenciesrM   rG   rz   )r   r   r   r   r{   S  s    z NameAssignment.type_dependenciesc             C   s   | j jjs| j jS | jS )N)rG   r   is_unspecifiedrw   )r   r   r   r   r   V  s    
zNameAssignment.type)N)	r   r   r   r   rx   ry   r{   propertyr   r   r   r   r   rN   =  s
   
rN   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| j||| d S )NF)r   r   )r   is_pyobjectr   r   r   rh   r   )r   rG   r   rP   )r   r   r   r   _  s    zStaticAssignment.__init__c             C   s   | j jS )N)rG   r   )r   r   r   r   ry   h  s    zStaticAssignment.infer_typec             C   s   f S )Nr   )r   r   r   r   r{   k  s    z"StaticAssignment.type_dependencies)r   r   r   r4   r   ry   r{   r   r   r   )r   r   rh   ]  s   	rh   c               @   s   e Zd Zdd ZdS )rT   c             C   s   t j| ||| d| _d S )NT)rN   r   rC   )r   rP   rQ   rG   r   r   r   r   p  s    zArgument.__init__N)r   r   r   r   r   r   r   r   rT   o  s   rT   c               @   s   e Zd Zdd Zdd ZdS )rV   c             C   s   t j| ||| d| _d S )NT)rN   r   rv   )r   rP   rG   r   r   r   r   v  s    zNameDeletion.__init__c             C   s6   | j j| jj}|j r,|j| jjr,tjS || _|S )N)	rQ   ry   rG   rz   r~   Zcan_coerce_to_pyobjectr   py_object_typerw   )r   rw   r   r   r   ry   z  s    zNameDeletion.infer_typeN)r   r   r   r   ry   r   r   r   r   rV   u  s   rV   c               @   s   e Zd ZdZdS )rW   zDefinitely not initialised yet.N)r   r   r   r4   r   r   r   r   rW     s   rW   c               @   s   e Zd ZdZdS )ri   z7Coming from outer closure, might be initialised or not.N)r   r   r   r4   r   r   r   r   ri     s   ri   c               @   s   e Zd Zdd Zdd ZdS )rY   c             C   s*   |j d krt |_ || _|| _|j| _d S )N)rt   r   rK   rG   r   )r   rK   rG   r   r   r   r     s
    
zNameReference.__init__c             C   s   d| j j| jf S )Nz%s(entry=%r))r   r   rG   )r   r   r   r   rx     s    zNameReference.__repr__N)r   r   r   r   rx   r   r   r   r   rY     s   rY   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   )rQ   r   ).0ir   r   r   
<listcomp>  s    z-ControlFlowState.__init__.<locals>.<listcomp>)
rW   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 j| d S )N)r    rO   )r   r.   r   r   r   r1     s    zGVContext.addc             C   s2   || j kr(d| j | j |< |  jd7  _| j | S )Nzblock%dr   )r   r   )r   r2   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   r2   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_defsr.   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   r4   r   r1   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deletionZ
definitionr   z
 %s [reference %s]r+   z  %s [label="%s"];
z  %s -> %s;
z }
)r   r   r   r8   r   r#   rc   rN   rG   rv   r   rY   r   r   r    )	r   r   ctxr   r2   labelrf   pidr.   r   r   r   r     s(    

$


 z	GV.renderN)F)r   r   r   r4   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   r1   )r   r   messager   r   r   r     s    zMessageCollection.errorc             C   s   | j j|d|f d S )NF)r   r1   )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 )NrJ   )sortedr   r   r   )r   r   is_errorr   r   r   r   report  s    zMessageCollection.reportN)r   r   r   r4   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 x0|j! D ]"\}}t|jkrd|_|j" rt|jdkr|j#|j$j%krd|_ |j&s|j"s|j's|j(j)r:n|j r|j* r|j+spt,j+r|j(j-sp|j(j.r|j/|j0d|j#  n|j1|j0d|j#  n.|rd	|j# }|j*r|d
7 }|j1|j0| n t|jkrd|_nd|_ d|_qW x~|D ]v}
|
j r|
jj' r|
jj* r|
jjrd|rd|
j2rN|j1|
j0d|
jj#  n|j1|
j0d|
jj#  d|
j_3qW x| j4D ]z}|j rz|j' rz|j#dkr|j#j5d r|j2r|r|j1|j0d|j#  n|r|j1|j0d|j#  d|_3qzW |j6  x|D ]}t7|j|_qW x|D ]}t7|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% (maybe initialized inside a closure)zUnused argument value '%s'zUnused result in '%s'_ZunusedzUnused argument '%s'zUnused entry '%s')8rg   rm   r   r8   r&   r#   r`   rG   rl   rc   rN   rP   rt   updater1   ra   rv   rb   rQ   r   Zcf_assignmentsrO   rY   rK   Zcf_referencesr   rW   ri   ru   r   r   r   r   rd   rD   r   rz   Zscope_predefined_namesZ
allow_nullrB   r   r   rE   rF   r   r~   r|   r   r   r   rC   Zcf_usedr9   
startswithr   r   )r   Zcompiler_directivesassignmentsZ
referencesZassmt_nodesr2   r*   rf   Zi_assmtsr   rk   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr   rK   rG   msgr   r   r   check_definitions  s    



















r   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	AssignmentCollectorc                s   t t| j  g | _d S )N)r   r   r   r   )r   )r   r   r   r     s    zAssignmentCollector.__init__c             C   s   | j | d d  d S )N)Z_visitchildren)r   r   r   r   
visit_Node  s    zAssignmentCollector.visit_Nodec             C   s   | j j|j|jf d S )N)r   rO   rP   rQ   )r   rK   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   rO   rQ   )r   rK   rP   r   r   r   visit_CascadedAssignmentNode  s    z0AssignmentCollector.visit_CascadedAssignmentNode)r   r   r   r   r   r   r   r   r   r   )r   r   r     s   r   c               @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdbddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zdcd8d9Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dS )dControlFlowAnalysisc             C   s@   || j kr| jS x"t| jD ]\}}||kr|S qW ds<td S )NF)envr   reversedstackAssertionError)r   r   er   r   r   r   find_in_stack  s    
z!ControlFlowAnalysis.find_in_stackc             C   s   | j d }|rt nd | _ddlm} | | _t | _d| _|j	| _
t | _g | _ttjdd| _| j| t| j| j  |r| j d }t|d}| jj|d	|d
 W d Q R X |S )Nzcontrol_flow.dot_outputr   )ConstantFoldingFT)r   zcontrol_flow.dot_annotate_defswtmodule)r   )current_directivesr   gv_ctxZOptimizer   constant_folderr   
reductionsin_inplace_assignmentrz   r   r7   r   r   r   r   r   object_exprvisitchildrenr   openr   )r   rK   Z
dot_outputr   r   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f |j| _t | _x.|jj	j
 D ]}| jj|r^| jj	j| q^W | 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r8| jjj| jj | jj  t| j| j  | jj!j| jj" | j#d k	r| j#jt$|jj%| j | jj& \| _| _|S )N
decoratorsF)r   )r   )'argsdefaultr   r   rO   r   r   Zlocal_scoper7   r9   re   rH   r1   rL   r@   _visitZstar_argrU   r   r   Z
tuple_typerG   Zstarstar_arg	dict_typebodyZis_generatorZgbodyr2   r3   r=   r_   r   r   r8   r<   r   r   r   r[   )r   rK   argrG   r   r   r   visit_FuncDefNode  sH    







z%ControlFlowAnalysis.visit_FuncDefNodec             C   s   d|_ | j|S )NT)usedr   )r   rK   r   r   r   visit_DefNode  s    z!ControlFlowAnalysis.visit_DefNodec             C   s   |S )Nr   )r   rK   r   r   r   visit_GeneratorBodyDefNode  s    z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec             C   s   |S )Nr   )r   rK   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  |sD| j}|jr|jd k	r\|j}n| j	j
|j}|d krvd S | j j||||d nj|jrxbt|jD ]H\}}|jrttjd|jd}n|| jkr|}n
|j|}| j|| qW n
| j| | j jr&| j jd }| j jj|j | j j  d S )Nr   )rM   F)r   r   r   )r   r2   r;   r3   r<   r@   r   is_namerG   r   lookupr   rS   is_sequence_constructor	enumerater   Z
is_starredr   r   Z	list_typer   Zinferable_item_noder   )	r   rP   rQ   rM   Z	exc_descrrG   r   r   Z	item_noder   r   r   rS     s8    





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   rL   )r   rK   r   r   r   rL   ,  s    
z!ControlFlowAnalysis.mark_positionc             C   s4   x$|j D ]\}}|dkr| j| qW | j| |S )N*)rd   rS   r   )r   rK   r   targetr   r   r   visit_FromImportStatNode1  s
    
z,ControlFlowAnalysis.visit_FromImportStatNodec             C   s   t dt| d S )NzUnhandled assignment node %s)r
   r   )r   rK   r   r   r   visit_AssignmentNode8  s    z(ControlFlowAnalysis.visit_AssignmentNodec             C   s    | j |j | j|j|j |S )N)r   rQ   rS   rP   )r   rK   r   r   r   r   ;  s    z.ControlFlowAnalysis.visit_SingleAssignmentNodec             C   s.   | j |j x|jD ]}| j||j qW |S )N)r   rQ   r   rS   )r   rK   rP   r   r   r   r   @  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   rS   )r   rK   	collectorrP   rQ   r   r   r   visit_ParallelAssignmentNodeF  s    
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec             C   s2   d| _ | j| d| _ | j|j| j|j  |S )NTF)r   r   rS   rP   r   Zcreate_binop_node)r   rK   r   r   r   visit_InPlaceAssignmentNodeO  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   rG   r   r   r   rE   rD   r   r   Zignore_nonexistingr   r   rX   )r   rK   r   rG   r   r   r   visit_DelStatNodeV  s    

z%ControlFlowAnalysis.visit_DelStatNodec             C   s6   | j j|j}|r2|j }| jj|t|j|| |S )N)r   r   r   Znot_noner   rU   r   r   )r   rK   rG   r   r   r   r   visit_CArgDeclNodee  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   r2   rG   r   r   r   rZ   r   r   r   r   )r   rK   rG   r   r   r   visit_NameNodem  s    z"ControlFlowAnalysis.visit_NameNodec             C   s6   | j jr2x(|jD ]}| j| | j jsd|_P qW |S )NT)r   r2   r#   r   Zis_terminator)r   rK   rf   r   r   r   visit_StatListNodey  s    
z&ControlFlowAnalysis.visit_StatListNodec             C   s   | j | | j| |S )N)r   rL   )r   rK   r   r   r   r     s    

zControlFlowAnalysis.visit_Nodec             C   s   |S )Nr   )r   rK   r   r   r   visit_SizeofVarNode  s    z'ControlFlowAnalysis.visit_SizeofVarNodec             C   s   |S )Nr   )r   rK   r   r   r   visit_TypeidNode  s    z$ControlFlowAnalysis.visit_TypeidNodec             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)r/   )r   r?   r2   Z
if_clausesr@   r   	conditionr   r3   else_clauser!   )r   rK   ro   r/   clauser   r   r   visit_IfStatNode  s&    



z$ControlFlowAnalysis.visit_IfStatNodec             C   s   | j | | jj }| jj}| jj|}| j|j | jj  | j|j | jjr`| jjj| |j| |j	rz|| j_nd| j_|S )z@Essentially an if-condition that wraps a RaiseStatNode.
        N)
rL   r   r?   r2   r@   r   r   	exceptionr3   r!   )r   rK   ro   r/   r   r   r   visit_AssertStatNode  s    




z(ControlFlowAnalysis.visit_AssertStatNodec             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)r/   )r   r@   r?   r:   rO   rn   r   r   r   r[   r2   r3   r   r!   )r   rK   condition_blockro   r   r   r   visit_WhileStatNode  s*    




z'ControlFlowAnalysis.visit_WhileStatNodec          	   C   s  d}|j j}|j}|j jp| j}t|tjr|j}|j	d koB|j
r|j|j}| s`|jr|jdkrt|jdkr|jd }n|jdkot|jdkr|jot|jdkr|jd }|j
r|j|}	|	jr| j|jd tj|jdtjd|j jd	 |jd }|jd }t|tjr|j}|j	d kr|j
r|j|j}| sZ|jr|jdkrd}x,|jd d D ]}
| j||
|j jd	 qzW t|jdkr| j|| jtj|jd|jd |jd |j jd	 |s| j||j|j jd	 d S )NFr   r   r   r   rJ   ZPY_SSIZE_T_MAX)valuer   )rM   rangexrangeT+)r   r   )iteratorsequencer   
expr_scoper   rc   r   ZSimpleCallNodefunctionr   r   r   r   
is_builtinr   r   r   ry   Zis_builtin_typerS   ZIntNoder   r   Zc_py_ssize_t_typer   
binop_nodeitem)r   rK   Z
is_specialr   r   r   r   rG   r   Ziterator_typer   r   r   r   mark_forloop_target  sT    





z'ControlFlowAnalysis.mark_forloop_targetc             C   s
   | j |S )N)visit_ForInStatNode)r   rK   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)r/   )r   r@   r?   r:   rO   rn   r   r   rc   r   ZForInStatNoder   ZAsyncForStatNoderS   r   r   ZParallelRangeNode_delete_privatesrG   r   r[   r2   r3   r   r!   )r   rK   r   ro   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_nodesrG   r   rX   )r   rK   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 )NrG   T)
r   hasattrr   r   r  rG   rF   r   r1   r  )r   rK   r   r  r   	reductionr   r   r   visit_ParallelRangeNodeB  s    

z+ControlFlowAnalysis.visit_ParallelRangeNodec             C   s:   x|j D ]}d|j_qW | j| | j| | j| |S )NT)r  rG   rF   r  r   )r   rK   r  r   r   r   visit_ParallelWithBlockNodeU  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   )r/   )r   r@   r?   r:   rO   rn   r   Zbound1Zbound2steprS   r   r   r   r   r   r   r[   r2   r3   r   r!   )r   rK   r   ro   r   r   r   visit_ForFromStatNode_  s6    








z)ControlFlowAnalysis.visit_ForFromStatNodec             C   s   t dd S )NzGeneric loops are not supported)r
   )r   rK   r   r   r   visit_LoopNode  s    z"ControlFlowAnalysis.visit_LoopNodec             C   s   | j |j|jj |S )N)rS   rP   Z	with_node
enter_call)r   rK   r   r   r   "visit_WithTargetAssignmentStatNode  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec             C   s(   | j |j | j |j | j |j |S )N)r   managerr  r   )r   rK   r   r   r   visit_WithStatNode  s    z&ControlFlowAnalysis.visit_WithStatNodec             C   s  | j j }| j j  | j j }| j jjt| | j j  | j jj| | j j  | j  jd7  _| j	|j
 | j  jd8  _| 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 )Nr   )r/   r   )r   r?   r;   rO   rq   r@   r2   r3   r>   r   r   r[   r   Zexcept_clausespatternr   rS   r<   r!   )r   rK   ro   r<   r   r  r   r   r   visit_TryExceptStatNode  sF    








z+ControlFlowAnalysis.visit_TryExceptStatNodec             C   sZ  | 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d7  _| j|j | j  jd8  _| j jj  | j jr| j jd jj  | j jrV| j jj| |rN| j j|d| j _nd | j _|S )Nr   )r/   r   r   r   )r   r@   r?   r2   r   Zfinally_except_clauser;   r3   r<   Zfinally_clauserq   rO   r:   r>   r   r[   )r   rK   Z
body_blockr<   rr   rs   descrr   r   r   visit_TryFinallyStatNode  s:    






z,ControlFlowAnalysis.visit_TryFinallyStatNodec             C   sN   | j | | j| | jjr4| jjj| jjd j d | j_| jjrJd|_|S )Nr   Tr   )rL   r   r   r;   r2   r3   r<   r>   )r   rK   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   )rL   r   r;   r2   r3   r<   )r   rK   r   r   r   visit_ReraiseStatNode  s
    
z)ControlFlowAnalysis.visit_ReraiseStatNodec             C   s   | j | | j| t| jjd d d }xt|D ]R}|jr0| jjj|j |jr| jj	}x|D ]}|jr^|j}P q^W |jj| P q0W | jjr| jjj| jj	 d | j_|S )Nr   r   )
rL   r   iterr   r;   rr   r2   r3   rs   r=   )r   rK   Zouter_exception_handlershandlerr=   Znext_handlerr   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:   rL   r;   rr   r2   r3   rs   ro   )r   rK   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:   rL   r;   rr   r2   r3   rs   rp   )r   rK   r  r   r   r   r   visit_ContinueStatNode$  s    
z*ControlFlowAnalysis.visit_ContinueStatNodec             C   sH   |j r"| jj| j| jf |j | _| j|j |j rD| jj \| _}|S )N)r   r   rO   r   r   r   r  r[   )r   rK   r   r   r   r   visit_ComprehensionNode5  s    z+ControlFlowAnalysis.visit_ComprehensionNodec             C   sp   t |tjtjfst||jrJ| jj| j| j	f | j
|j| _	|j| _| j| |jrl| jj \| _| _	|S )N)rc   r   ZIteratorNodeZAsyncIteratorNoder   r   r   rO   r   r   r   r   r[   )r   rK   r   r   r   visit_ScopedExprNode?  s    
z(ControlFlowAnalysis.visit_ScopedExprNodec             C   s   | j |d | jj|j|j| jj|jj | jj	| j| jf |j
| _| jj  |jrn| jj|jt|jj | j |d | jj  | jj \| _}|S )	Ndict	metaclassmkwbasesclass_resultr   )r   r!  r"  r#  r$  )r   )r   r   rS   r   Zclassobjr   r   r   r   rO   rz   r@   Zdoc_noder   rG   r[   )r   rK   r   r   r   r   visit_PyClassDefNodeL  s    

z(ControlFlowAnalysis.visit_PyClassDefNodec             C   s,   | j j|j| jf | j| | j j  |S )N)r   rO   rz   r   r   r[   )r   rK   r   r   r   visit_CClassDefNode[  s    

z'ControlFlowAnalysis.visit_CClassDefNodec             C   s$   |j jr| j|j t | j| |S )N)operandr   rS   r   r   )r   rK   r   r   r   visit_AmpersandNodeb  s    
z'ControlFlowAnalysis.visit_AmpersandNodec             C   s   t |jdkst| jj }| jj}| j|j | jj  | j|j	 | jjr\| jjj
| |j
| |jrv|| j_nd | j_|S )NrJ   )r   subexprsr   r   r?   r2   r   Zoperand1r@   Zoperand2r3   r!   )r   rK   ro   r/   r   r   r   visit_BoolBinopNodei  s    



z'ControlFlowAnalysis.visit_BoolBinopNodec             C   s   t |jdkst| j|j | jj}| jj }| jj  | j|j	 | jjr\| jjj
| | jj|d | j|j | jjr| jjj
| |jr|| j_nd | j_|S )N   )r/   )r   r)  r   r   testr   r2   r?   r@   Ztrue_valr3   Z	false_valr!   )r   rK   r/   ro   r   r   r   visit_CondExprNode  s     


z&ControlFlowAnalysis.visit_CondExprNode)NN)N)3r   r   r   r   r   r   r   r   r   rS   rL   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   r   r   r   r     s`   2
$		5,

%3'

r   )+
__future__r   ZcythonZdeclareobjectr   r   r   r   r   r   ZVisitorr   r	   ZErrorsr   r   r
   ZExprNoder   Zunspecified_typer   r   r5   r6   r7   rn   rq   rN   rh   rT   rV   rW   ri   rY   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sH   

7 B ) 
