a
    b                     @   s  d dl mZ d dlZejeeeeeeeeeeeed ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	l
mZmZ dd
lm
Z
 ddlmZmZ ddlmZmZmZ ddlmZ G dd dejZeeddZeeZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZ G d d! d!e Z!G d"d# d#e Z"G d$d% d%e Z#G d&d' d'eZ$G d(d) d)eZ%G d*d+ d+eZ&G d,d- d-e'Z(G d.d/ d/eZ)G d0d1 d1eZ*G d2d3 d3eZ+d4d5 Z,G d6d7 d7eZ-G d8d9 d9eZ.dS ):    )absolute_importN)
PyrexTypes	ExprNodesNodesBuiltinInternalErrorerrorwarningpy_object_typeunspecified_typeobject_exprfake_rhs_exprTypedExprNode   )r   )r   )r   )Options)r
   r   )r   )TreeVisitorCythonTransform)r   r	   r   )ConstantFoldingc                       s&   e Zd Zd fdd	Zdd Z  ZS )r   Nc                    s    t t| | || _|| _d S N)superr   __init__type_may_be_none)selfr   may_be_nonepos	__class__ k/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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_stater!   r   r   r   r   ;   s    zControlBlock.__init__c                 C   s   | j  o| j S r   )r-   r,   r!   r   r   r   emptyJ   s    zControlBlock.emptyc                 C   sH   | j D ]}|j|  q| jD ]}|j |  q| j  | j   dS )z'Detach block from parents and children.N)r*   r+   removeclear)r   childparentr   r   r   detachM   s    


zControlBlock.detachc                 C   s   | j | |j|  d S r   )r*   addr+   r   blockr   r   r   	add_childV   s    zControlBlock.add_childN)r"   r#   r$   __doc__r   r5   r:   r>   r   r   r   r   r'   $   s
   	r'   c                   @   s   e Zd ZdZdd ZdS )	ExitBlockzNon-empty exit point block.c                 C   s   dS r    r   r!   r   r   r   r5   ^   s    zExitBlock.emptyN)r"   r#   r$   r?   r5   r   r   r   r   r@   [   s   r@   c                   @   s   e Zd Zdd ZdS )AssignmentListc                 C   s
   g | _ d S r   )r-   r!   r   r   r   r   c   s    zAssignmentList.__init__Nr"   r#   r$   r   r   r   r   r   rA   b   s   rA   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 r   )r)   blocksentriesloops
exceptionsr'   entry_pointr@   
exit_pointr;   r=   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'   rD   r;   r>   r   r9   r=   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'   rD   r;   r>   r=   rJ   r   r   r   	nextblock   s    zControlFlow.nextblockc                 C   s.   |j r
dS |jp,|jp,|jp,|jp,|jp,|jS r    )Zis_anonymousis_localis_pyclass_attris_argfrom_closure
in_closureerror_on_uninitializedr   entryr   r   r   
is_tracked   s    zControlFlow.is_trackedc                 C   s4   |j r0|jr0|jjs,|jjs,|jjs,|jjr0dS dS NTF)rM   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cpp_classrS   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   )r=   r,   r;   r   r   noder   r   r   mark_position   s    zControlFlow.mark_positionc                 C   sF   | j rB| |rBt|||}| j j| || j j|< | j| d S r   )r=   rU   NameAssignmentr-   appendr.   rE   r;   r   lhsrhsrT   
assignmentr   r   r   mark_assignment   s
    zControlFlow.mark_assignmentc                 C   sF   | j rB| |rBt|||}| j j| || j j|< | j| d S r   )r=   rU   Argumentr-   r]   r.   rE   r;   r^   r   r   r   mark_argument   s
    zControlFlow.mark_argumentc                 C   sD   | j r@| |r@t||}| j j| t| j j|< | j| d S r   )	r=   rU   NameDeletionr-   r]   Uninitializedr.   rE   r;   )r   rZ   rT   ra   r   r   r   mark_deletion   s
    
zControlFlow.mark_deletionc                 C   s4   | j r0| |r0| j jt|| | j| d S r   )r=   rU   r-   r]   NameReferencerE   r;   r   rZ   rT   r   r   r   mark_reference   s    zControlFlow.mark_referencec                 C   s   t | jg}t  }|rH| }|| |jD ]}||vr.|| q.q| j| }|D ]}|  qV|| j |D ]@}| rt|j	D ]}|jD ]}|
| qq|  || qt|  j|8  _dS )z%Delete unreachable and orphan blocks.N)r)   rH   popr;   r*   rD   r:   r6   r5   r+   r>   )r   queuevisitedrootr8   Zunreachabler=   r9   r   r   r   	normalize   s(    





zControlFlow.normalizec                 C   sT  i | _ d}| jD ](}t }| |_|_|| j |< |dK }q| jD ]N}|jD ]B}t|trJ||_| j |j	 }|j
| | j|O  _|dK }qJq@| jD ]}|j D ]L\}}| j | }|tu r| j|jO  _n| j|jO  _| j|jO  _q|j|_|jD ]}| j| j | jO  _q q| j  D ]}| j j|jO  _q*| jj| j_dS )z+Set initial state, map assignments to bits.r   N)assmtsrE   rA   maskbitrD   r-   
isinstancer\   rT   r]   r.   itemsrf   r2   r3   r1   r/   valuesrH   )r   rr   rT   rp   r=   statr   r   r   
initialize   s8    








zControlFlow.initializec                 C   st   t  }| j| }||j@ rP| |r4|t| n|jrF|t n
|t |j	D ]}||j@ rV|| qV|S r   )
r)   rp   rr   rW   r;   StaticAssignmentrP   Unknownrf   r-   )r   ZistaterT   retrp   assmtr   r   r   map_one  s    





zControlFlow.map_onec                 C   sd   d}|r`d}| j D ]J}d}|jD ]}||jO }q ||j @ |jB }||jkrPd}||_||_qqdS )z(Per-block reaching definitions analysis.TFr   N)rD   r+   r1   r3   r2   r0   )r   Zdirtyr=   r0   r9   r1   r   r   r   reaching_definitions  s    


z ControlFlow.reaching_definitions)N)N)r"   r#   r$   r?   r   rK   rL   rU   rW   r[   rb   rd   rg   rj   ro   rw   r|   r}   r   r   r   r   rC   g   s   



$rC   c                   @   s   e Zd Zdd ZdS )	LoopDescrc                 C   s   || _ || _g | _d S r   )
next_block
loop_blockrG   )r   r   r   r   r   r   r   '  s    zLoopDescr.__init__NrB   r   r   r   r   r~   &  s   r~   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 r   )rH   finally_enterfinally_exit)r   rH   r   r   r   r   r   r   5  s    zExceptionDescr.__init__)NN)r"   r#   r$   r?   r   r   r   r   r   r   -  s   r   c                   @   s8   e Zd Zdd Zdd Zdd Zdd Zed	d
 ZdS )r\   c                 C   sJ   |j d u rt |_ || _|| _|| _|j| _t | _d| _d| _d | _	d S r    )
cf_stater)   r_   r`   rT   r   refsrO   is_deletioninferred_typer   r_   r`   rT   r   r   r   r   <  s    
zNameAssignment.__init__c                 C   s   d| j j| jf S Nz%s(entry=%r)r   r"   rT   r!   r   r   r   __repr__H  s    zNameAssignment.__repr__c                 C   s   | j | jj| _| jS r   )r`   
infer_typerT   scoper   r!   r   r   r   r   K  s    zNameAssignment.infer_typec                 C   s   | j | jjS r   )r`   type_dependenciesrT   r   r!   r   r   r   r   O  s    z NameAssignment.type_dependenciesc                 C   s   | j jjs| j jS | jS r   )rT   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   r\   ;  s   r\   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )rx   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   rx   r   )r   rT   r   r_   r   r   r   r   [  s    
zStaticAssignment.__init__c                 C   s   | j jS r   )rT   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$   r?   r   r   r   r%   r   r   r   r   rx   Y  s   	rx   c                   @   s   e Zd Zdd ZdS )rc   c                 C   s   t | ||| d| _d S NT)r\   r   rO   r   r   r   r   r   l  s    zArgument.__init__NrB   r   r   r   r   rc   k  s   rc   c                   @   s   e Zd Zdd Zdd ZdS )re   c                 C   s   t | ||| d| _d S r   )r\   r   r   )r   r_   rT   r   r   r   r   r  s    zNameDeletion.__init__c                 C   s2   | j | jj}|js(|| jjr(tS || _|S r   )r`   r   rT   r   r   Z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   re   q  s   re   c                   @   s   e Zd ZdZdS )rf   zDefinitely not initialised yet.Nr"   r#   r$   r?   r   r   r   r   rf     s   rf   c                   @   s   e Zd ZdZdS )ry   z7Coming from outer closure, might be initialised or not.Nr   r   r   r   r   ry     s   ry   c                   @   s   e Zd Zdd Zdd ZdS )rh   c                 C   s*   |j d u rt |_ || _|| _|j| _d S r   )r   r)   rZ   rT   r   ri   r   r   r   r     s
    
zNameReference.__init__c                 C   s   d| j j| jf S r   r   r!   r   r   r   r     s    zNameReference.__repr__N)r"   r#   r$   r   r   r   r   r   r   rh     s   rh   c                       s0   e Zd ZdZdZdZ fddZdd Z  ZS )ControlFlowStateFc                    sn   t |v r$|t  d| _|sPd| _n,t|v r>|t d| _nt|dkrPd| _tt| 	dd |D  d S )NTr   c                 S   s   g | ]}|j tur|qS r   )r`   r   ).0ir   r   r   
<listcomp>      z-ControlFlowState.__init__.<locals>.<listcomp>)
rf   discardcf_maybe_null
cf_is_nullry   len	is_singler   r   r   )r   stater   r   r   r     s    


zControlFlowState.__init__c                 C   s   | d S r(   r   r!   r   r   r   one  s    zControlFlowState.one)	r"   r#   r$   r   r   r   r   r   r%   r   r   r   r   r     s
   r   c                   @   sB   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dS )	GVContextzGraphviz subgraph object.c                 C   s   i | _ d| _g | _i | _d S r(   )blockidsnextidr*   sourcesr!   r   r   r   r     s    zGVContext.__init__c                 C   s   | j | d S r   )r*   r]   )r   r8   r   r   r   r;     s    zGVContext.addc                 C   s2   || j vr(d| j | j |< |  jd7  _| j | S )Nzblock%dr   )r   r   r<   r   r   r   nodeid  s    
zGVContext.nodeidc                 C   st   |j s
dS t|j }t|j }|d }|| jvrBt| | j|< | j| }ddd ||d d |d  D S )N r   \nc                 S   s   g | ]}|  qS r   )strip)r   lr   r   r   r     r   z-GVContext.extract_sources.<locals>.<listcomp>r   )r,   minmaxr   list	get_linesjoin)r   r=   startstopZsrcdescrlinesr   r   r   extract_sources  s    



zGVContext.extract_sourcesFc                 C   s@   | d|  | d | jD ]}||| | q| d dS )zRender graphviz dot graphzdigraph %s {
z node [shape=box];
z}
N)writer*   render)r   fpnameannotate_defsr8   r   r   r   r     s
    

zGVContext.renderc                 C   s   | dd ddS )N"z\"
r   )replace)r   textr   r   r   escape  s    zGVContext.escapeN)F)
r"   r#   r$   r?   r   r;   r   r   r   r   r   r   r   r   r     s   
r   c                   @   s"   e Zd ZdZdd ZdddZdS )	GVzGraphviz DOT renderer.c                 C   s   || _ || _d S r   )r   flow)r   r   r   r   r   r   r     s    zGV.__init__Fc           	   	   C   s  | d| j  | jjD ]}||}|r|jD ]`}t|trf|d|jj|j	rRdnd|j
d f 7 }q0t|tr0|jr0|d|jj|j
d f 7 }q0|sd}||}| d|||f  q| jjD ]2}||}|jD ]}| d	|||f  qq| d
 d S )Nz subgraph %s {
z
 %s [%s %s]ZdeletionZ
definitionr   z
 %s [reference %s]r5   z  %s [label="%s"];
z  %s -> %s;
z }
)r   r   r   rD   r   r-   rs   r\   rT   r   r   rh   r   r   r*   )	r   r   ctxr   r=   labelrv   pidr8   r   r   r   r     s*    







z	GV.renderN)F)r"   r#   r$   r?   r   r   r   r   r   r   r     s   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )MessageCollectionz/Collect error/warnings messages first then sortc                 C   s   t  | _d S r   )r)   messagesr!   r   r   r   r     s    zMessageCollection.__init__c                 C   s   | j |d|f d S r   r   r;   r   r   messager   r   r   r     s    zMessageCollection.errorc                 C   s   | j |d|f d S r    r   r   r   r   r   r	     s    zMessageCollection.warningc                 C   s6   t | jD ]&\}}}|r$t|| q
t||d q
d S )NrX   )sortedr   r   r	   )r   r   is_errorr   r   r   r   report  s    zMessageCollection.reportN)r"   r#   r$   r?   r   r   r	   r   r   r   r   r   r     s
   r   c                 C   s  |    |   t }i }t }| jD  ]}|j}|jD ]}| j|j }| ||j}	t	|t
r|jj|	 ||j ||j @ }|jr||jO }n
||jO }|| |jtur|jj| q8t	|tr8|j||j< |jj| |jj|	 |	t |	t |	D ]}
|
j| qq8q&|d }|d }|d }|d }t }|D ]X}t|jv rd|_t|jdkrd|_ nd|_ n t|jv rd|_nd|_ d|_qR|! D ]\}}t|jv rd|_|j"st|jdkrd|_ |j#s|j"s|j$s|j%j&rnr|j rh|j's<t(j'rR|j%j)s<|j%j*rR|+|j,d|j-  n|.|j,d|j-  n|r|.|j,d	|j-  n t|jv rd|_nd|_ d|_q|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| j2D ]t}|js$|j$s$|j-dkr|j-3ds|j0rv|r|.|j,d|j-  n|r|.|j,d|j-  d|_1q$|4  |D ]}t5|j|_q|D ]}t5|j|_qd 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')6rw   r}   r)   rD   r0   r-   rp   rT   r|   rs   r\   r_   r   updater;   rq   r   rr   r`   r   Zcf_assignmentsr]   rh   rZ   Zcf_referencesr   rf   ry   r   r   r   r   r   rt   rP   Z
allow_nullrN   r   r   rR   r   r   r   r   r   r   r	   rQ   rO   Zcf_usedrE   
startswithr   r   )r   Zcompiler_directivesassignmentsZ
referencesZassmt_nodesr=   r4   rv   Zi_assmtsr   r{   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr   rZ   rT   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 r   )r   r   r   r   r!   r   r   r   r     s    zAssignmentCollector.__init__c                 C   s   |  | d  d S r   )Z_visitchildrenr!   r   r   r   
visit_Node  s    zAssignmentCollector.visit_Nodec                 C   s   | j |j|jf d S r   )r   r]   r_   r`   rY   r   r   r   visit_SingleAssignmentNode  s    z.AssignmentCollector.visit_SingleAssignmentNodec                 C   s"   |j D ]}| j||jf qd S r   )lhs_listr   r]   r`   r   rZ   r_   r   r   r   visit_CascadedAssignmentNode  s    
z0AssignmentCollector.visit_CascadedAssignmentNode)r"   r#   r$   r   r   r   r   r%   r   r   r   r   r     s   r   c                   @   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 |  n
|  0 |S )NFcontrol_flow.dot_outputzcontrol_flow.dot_annotate_defswtmodule)r   )r   gv_ctxr   constant_folderr)   
reductionsin_inplace_assignment	env_stackr   envstackrC   r   visitchildrenr   current_directivesopenr   close)r   rZ   Z
dot_outputr   r   r   r   r   visit_ModuleNode  s$    



z$ControlFlowAnalysis.visit_ModuleNodec                 C   s  |j D ]}|jr| | q| |d | j| j |j| _| j| j t	 | _|jj
 D ]}| j|r`| jj
| q`| | | j  |j D ]}| | q|jr| j|jttjdd|jj |jr| j|jttjdd|jj | |j |jr| |jj | jjr4| jj| jj | j  t | j| j! | jj"| jj# | j$t%|jj&| j | j' | _| j' | _|S )N)Z
decoratorsFr&   )(argsdefaultr   r   r]   r   Zlocal_scoper   r   rC   rE   ru   rU   r;   r[   rL   _visitZstar_argrd   r   r   Z
tuple_typerT   Zstarstar_arg	dict_typebodyZis_generatorZgbodyr=   r>   rI   ro   r   r   rD   rH   r   r   r   rk   r   rZ   argrT   r   r   r   visit_FuncDefNode  sR    







z%ControlFlowAnalysis.visit_FuncDefNodec                 C   s   d|_ | |S r   )usedr   rY   r   r   r   visit_DefNode  s    z!ControlFlowAnalysis.visit_DefNodec                 C   s   |S r   r   rY   r   r   r   visit_GeneratorBodyDefNode  s    z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec                 C   s   |S r   r   rY   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 urZ|j}n| j	
|j}|d u rtd S | j ||| nL|jrt|jD ].\}}|r|jrd }n
||}| || qn
| | | j jr| j jd }| j j|j | j   d S N)r   r=   rG   r>   rH   rL   r   is_namerT   r   lookupr   rb   is_sequence_constructor	enumerater   Z
is_starredZinferable_item_noder   )r   r_   r`   Z	exc_descrrT   r   r   Z	item_noder   r   r   rb     s4    





z#ControlFlowAnalysis.mark_assignmentc                 C   s   | j d r| j| dS )z'Mark position if DOT output is enabled.r   N)r   r   r[   rY   r   r   r   r[     s    
z!ControlFlowAnalysis.mark_positionc                 C   s0   |j D ]\}}|dkr| | q| | |S )N*)rt   rb   r   )r   rZ   r   targetr   r   r   visit_FromImportStatNode!  s
    
z,ControlFlowAnalysis.visit_FromImportStatNodec                 C   s   t dd S )NzUnhandled assignment noder   rY   r   r   r   visit_AssignmentNode(  s    z(ControlFlowAnalysis.visit_AssignmentNodec                 C   s    |  |j | |j|j |S r   )r   r`   rb   r_   rY   r   r   r   r   +  s    z.ControlFlowAnalysis.visit_SingleAssignmentNodec                 C   s*   |  |j |jD ]}| ||j q|S r   )r   r`   r   rb   r   r   r   r   r   0  s    
z0ControlFlowAnalysis.visit_CascadedAssignmentNodec                 C   sJ   t  }|| |jD ]\}}| | q|jD ]\}}| || q0|S r   )r   r   r   r   rb   )r   rZ   	collectorr_   r`   r   r   r   visit_ParallelAssignmentNode6  s    
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec                 C   s2   d| _ | | d| _ | |j| |  |S rV   )r   r   rb   r_   r   Zcreate_binop_noderY   r   r   r   visit_InPlaceAssignmentNode?  s
    
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec                 C   sr   |j D ]f}|jrb|jp"| j|j}|js0|jrBt|j	d|j  |j
sR| | | j|| q| | q|S )Nz7can not delete variable '%s' referenced in nested scope)r   r   rT   r   r   r   rQ   rP   r   r   Zignore_nonexistingr   r   rg   r   r   r   r   visit_DelStatNodeF  s    

z%ControlFlowAnalysis.visit_DelStatNodec                 C   s6   | j |j}|r2|j }| j|t|j|| |S r   )r   r   r   Znot_noner   rd   r   r   )r   rZ   rT   r   r   r   r   visit_CArgDeclNodeU  s    z&ControlFlowAnalysis.visit_CArgDeclNodec                 C   sN   | j jrJ|jp| j|j}|rJ| j || || jv rJ| jsJt	|j
d |S )Nz+Cannot read reduction variable in loop body)r   r=   rT   r   r   r   rj   r   r   r   r   ri   r   r   r   visit_NameNode]  s    z"ControlFlowAnalysis.visit_NameNodec                 C   s4   | j jr0|jD ] }| | | j jsd|_ q0q|S r   )r   r=   r-   r   Zis_terminator)r   rZ   rv   r   r   r   visit_StatListNodei  s    

z&ControlFlowAnalysis.visit_StatListNodec                 C   s   |  | | | |S r   )r   r[   rY   r   r   r   r   r  s    

zControlFlowAnalysis.visit_Nodec                 C   s   |S r   r   rY   r   r   r   visit_SizeofVarNodew  s    z'ControlFlowAnalysis.visit_SizeofVarNodec                 C   s   |S r   r   rY   r   r   r   visit_TypeidNodez  s    z$ControlFlowAnalysis.visit_TypeidNodec                 C   s   | j  }| j j}|jD ]H}| j |}| |j | j   | |j | j jr| j j| q|j	r| j j|d | |j	 | j jr| j j| n
|| |j
r|| j _nd | j _|S Nr9   )r   rK   r=   Z
if_clausesrL   r   	conditionr   r>   else_clauser+   )r   rZ   r   r9   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 r  )r   rL   rK   rF   r]   r~   r  r   r   rk   r=   r>   r  r+   r   rZ   Zcondition_blockr   r   r   r   visit_WhileStatNode  s*    




z'ControlFlowAnalysis.visit_WhileStatNodec           
      C   s  d}|j j}|j}t|tjr|j}|jd u r|jr| j	
|j}|rL|jr|jdkrpt|jdkrp|jd }n|jdkrt|jdkr|jrt|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 u r|jr| j	
|j}|r8|jr|jd	v rd
}|jd d D ]}	| ||	 qVt|jdkr| || t|jd|jd |jd  |s| ||j d S )NFreversedr   r   r   rX   ZPY_SSIZE_T_MAX)valuer   )rangexrangeT+)iteratorsequencer   rs   r   ZSimpleCallNodefunctionr   r   r   r   r   
is_builtinr   r   r   r   Zis_builtin_typerb   ZIntNoder   r   Zc_py_ssize_t_typer   
binop_nodeitem)
r   rZ   Z
is_specialr  r   r  rT   r  Ziterator_typer   r   r   r   mark_forloop_target  sV    





z'ControlFlowAnalysis.mark_forloop_targetc                 C   s
   |  |S r   )visit_ForInStatNoderY   r   r   r   visit_AsyncForStatNode  s    z*ControlFlowAnalysis.visit_AsyncForStatNodec                 C   s:  | j  }| j  }| j jt|| | |j | j   t|t	j
rV| | n*t|t	jrt| |j|j n| |j t|t	jr| j||jjd | j   | |j | j j  | j jr| j j| |jr| j j|d | |j | j jr| j j| n
|| |jr.|| j _nd | j _|S )N)excluder  )r   rL   rK   rF   r]   r~   r   r  rs   r   ZForInStatNoder  ZAsyncForStatNoderb   r   r  ZParallelRangeNode_delete_privatesrT   r   rk   r=   r>   r  r+   r
  r   r   r   r    s6    






z'ControlFlowAnalysis.visit_ForInStatNodec                 C   s.   |j D ]"}|r|j|ur| j||j qd S r   )assigned_nodesrT   r   rg   )r   rZ   r  private_noder   r   r   r    s    
z$ControlFlowAnalysis._delete_privatesc                 C   sf   | j }t|jdr\t|| _ |jD ].}d|j_|j|j \}}|r"| j |j q"| 	|}|| _ |S )NrT   T)
r   hasattrr   r)   r  rT   rR   r   r;   r  )r   rZ   r   r  r   Z	reductionr   r   r   visit_ParallelRangeNode  s    


z+ControlFlowAnalysis.visit_ParallelRangeNodec                 C   s6   |j D ]}d|j_q| | | | | | |S r   )r  rT   rR   r  r   )r   rZ   r  r   r   r   visit_ParallelWithBlockNode.  s    




z/ControlFlowAnalysis.visit_ParallelWithBlockNodec                 C   s<  | j  }| j  }| j jt|| | |j | |j |j	d urV| |j	 | j   | 
|j|j |j	d ur| 
|j| t|jd|j|j	 | j   | |j | j j  | j jr| j j| |jr| j j|d | |j | j jr| j j| n
|| |jr0|| j _nd | j _|S )Nr  r  )r   rL   rK   rF   r]   r~   r   Zbound1Zbound2steprb   r   r   r   r  r   r   rk   r=   r>   r  r+   r
  r   r   r   visit_ForFromStatNode8  s8    








z)ControlFlowAnalysis.visit_ForFromStatNodec                 C   s   t dd S )NzGeneric loops are not supportedr   rY   r   r   r   visit_LoopNode]  s    z"ControlFlowAnalysis.visit_LoopNodec                 C   s   |  |j|jj |S r   )rb   r_   Z	with_node
enter_callrY   r   r   r   "visit_WithTargetAssignmentStatNode`  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec                 C   s(   |  |j |  |j |  |j |S r   )r   managerr$  r   rY   r   r   r   visit_WithStatNoded  s    z&ControlFlowAnalysis.visit_WithStatNodec                 C   sd  | 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| |jD ]|}|| j _|jr|jD ]}| | qn | j j| j jd}| j   |jr| |j | |j	 | j jr| j j| q| j jrF|| j jd j |jrX|| j _nd | j _|S )Nr  r   )r   rK   rG   r]   r   rL   r=   r>   r   r   rk   r  Zexcept_clausespatternr   rb   rH   r+   )r   rZ   r   rH   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   r  )r   rL   rK   r=   r   Zfinally_except_clauserG   r>   rH   Zfinally_clauser   r]   rF   r   rk   )r   rZ   Z
body_blockrH   r   r   descrr   r   r   visit_TryFinallyStatNode  s6    





z,ControlFlowAnalysis.visit_TryFinallyStatNodec                 C   s@   |  | | | | jjr4| jj| jjd j d | j_|S r   )r[   r   r   rG   r=   r>   rH   rY   r   r   r   visit_RaiseStatNode  s    

z'ControlFlowAnalysis.visit_RaiseStatNodec                 C   s6   |  | | jjr*| jj| jjd j d | j_|S r   )r[   r   rG   r=   r>   rH   rY   r   r   r   visit_ReraiseStatNode  s
    
z)ControlFlowAnalysis.visit_ReraiseStatNodec                 C   s   |  | | | t| jjd d d }|D ]R}|jr.| jj|j |jr|| jj	}|D ]}|jrZ|j} qpqZ|j|  qq.| jjr| jj| jj	 d | j_|S r   )
r[   r   iterr   rG   r   r=   r>   r   rI   )r   rZ   Zouter_exception_handlershandlerrI   Znext_handlerr   r   r   visit_ReturnStatNode  s$    

z(ControlFlowAnalysis.visit_ReturnStatNodec                 C   s   | j js|S | j jd }| | |jd d d D ]2}|jr2| j j|j |jr`|j|j  qvq2| j j|j d | j _|S r   )	r   rF   r[   rG   r   r=   r>   r   r   r   rZ   loop	exceptionr   r   r   visit_BreakStatNode  s    
z'ControlFlowAnalysis.visit_BreakStatNodec                 C   s   | j js|S | j jd }| | |jd d d D ]2}|jr2| j j|j |jr`|j|j  qvq2| j j|j d | j _|S r   )	r   rF   r[   rG   r   r=   r>   r   r   r1  r   r   r   visit_ContinueStatNode  s    
z*ControlFlowAnalysis.visit_ContinueStatNodec                 C   s>   |j r| j| j |j | _| |j |j r:| j | _|S r   )
expr_scoper   r]   r   r   r2  rk   rY   r   r   r   visit_ComprehensionNode  s    z+ControlFlowAnalysis.visit_ComprehensionNodec                 C   s<   |j r| j| j |j | _| | |j r8| j | _|S r   )r6  r   r]   r   r   rk   rY   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   rb   r   Zclassobjr   r   r   r   r]   r   rL   rk   rY   r   r   r   visit_PyClassDefNode  s    

z(ControlFlowAnalysis.visit_PyClassDefNodec                 C   s$   |j jr| |j t | | |S r   )operandr   rb   r   r   rY   r   r   r   visit_AmpersandNode(  s    
z'ControlFlowAnalysis.visit_AmpersandNode)N)N).r"   r#   r$   r   r   r   r   r   rb   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-  r0  r4  r5  r7  r8  r<  r>  r   r   r   r   r     sV   3
!		2,

%1%
	r   )/
__future__r   ZcythonZdeclareobjectr   r   r   r   r   r   r
   r   ZVisitorr   r   ZErrorsr   r	   r   ZOptimizer   ZExprNoder   r   r   r'   r@   rA   rC   r~   r   r\   rx   rc   re   rf   ry   rh   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sP   

7 @) 