o
    eE                     @   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| | || _|| _d S N)superr   __init__type_may_be_none)selfr   may_be_nonepos	__class__ KD:\Projects\ConvertPro\env\Lib\site-packages\Cython/Compiler/FlowControl.pyr      s   
zTypedExprNode.__init__c                 C   s
   | j dkS NF)r   r   r   r   r   r         
zTypedExprNode.may_be_noneNN)__name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s    r   c                   @   0   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_stater   r   r   r   r   ;   s   
zControlBlock.__init__c                 C   s   | j  o| j S r   )r+   r*   r   r   r   r   emptyJ      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   r3   r9   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      dS r   r   r   r   r   r   r3   ^      zExitBlock.emptyN)r    r!   r"   r>   r3   r   r   r   r   r?   [   s    r?   c                   @      e Zd Zdd ZdS )AssignmentListc                 C   s
   g | _ d S r   )r+   r   r   r   r   r   c   r   zAssignmentList.__init__Nr    r!   r"   r   r   r   r   r   rC   b       rC   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| _
d| _d S r&   )r'   blocksentriesloops
exceptionsr%   entry_pointr?   
exit_pointr:   r<   in_try_blockr   r   r   r   r   t   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%   rG   r:   r=   r   r8   r<   r   r   r   newblock   s
   
zControlFlow.newblockc                 C   s@   t  }| j| |r|| n	| jr| j| || _| jS )z|Create block children block linked to current or `parent` if given.

           NOTE: Block is added to self.blocks
        )r%   rG   r:   r=   r<   rN   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   s:   |j r|jr|jjs|jjs|jjs|jjr|jsdS dS NTF)rQ   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cpp_classZis_cpp_optionalrW   r   r   r   is_statically_assigned   s   z"ControlFlow.is_statically_assignedc                 C   s&   | j r| j j|jdd  dS 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   sR   | j r%| |r't||||d}| j j| || j j|< | j| d S d S d S )N	rhs_scope)r<   rY   NameAssignmentr+   appendr,   rH   r:   )r   lhsrhsrX   ra   
assignmentr   r   r   mark_assignment   s   zControlFlow.mark_assignmentc                 C   sN   | j r#| |r%t|||}| j j| || j j|< | j| d S d S d S r   )r<   rY   Argumentr+   rc   r,   rH   r:   )r   rd   re   rX   rf   r   r   r   mark_argument   s   zControlFlow.mark_argumentc                 C   sL   | j r"| |r$t||}| j j| t| j j|< | j| d S d S d S r   )	r<   rY   NameDeletionr+   rc   Uninitializedr,   rH   r:   )r   r^   rX   rf   r   r   r   mark_deletion   s   
zControlFlow.mark_deletionc                 C   s<   | j r| |r| j jt|| | j| d S d S d S r   )r<   rY   r+   rc   NameReferencerH   r:   r   r^   rX   r   r   r   mark_reference   s   zControlFlow.mark_referencec                 C   s   | j h}t }|r#| }|| |jD ]}||vr || q|s	| j| }|D ]}|  q*|| j  |D ] }| rY|j	D ]}|jD ]}|
| qGqB|  || q9|  j|8  _dS )z%Delete unreachable and orphan blocks.N)rK   r'   popr:   r(   rG   r9   r5   r3   r)   r=   )r   queuevisitedrootr7   Zunreachabler<   r8   r   r   r   	normalize   s0   







zControlFlow.normalizec                 C   sP  i | _ d}| jD ]}t }| |_|_|| j |< |dK }q| jD ]'}|jD ]!}t|trF||_| j |j	 }|j
| | j|O  _|dK }q%q | jD ]C}|j D ]&\}}| j | }|tu rh| j|jO  _n| j|jO  _| j|jO  _qR|j|_|jD ]}| j| j | jO  _qqK| j  D ]}| j j|jO  _q| jj| j_dS )z+Set initial state, map assignments to bits.r   N)assmtsrH   rC   maskbitrG   r+   
isinstancerb   rX   rc   r,   itemsrk   r0   r1   r/   r-   valuesrK   )r   rw   rX   ru   r<   statr   r   r   
initialize   s>   








zControlFlow.initializec                 C   st   t  }| j| }||j@ r(| |r|t| n|jr#|t n|t |j	D ]}||j@ r7|| q+|S r   )
r'   ru   rw   r[   r:   StaticAssignmentrT   Unknownrk   r+   )r   istaterX   retru   assmtr   r   r   map_one	  s   






zControlFlow.map_onec                 C   sj   d}|r3d}| j D ]%}d}|jD ]}||jO }q||j @ |jB }||jkr(d}||_||_q	|sdS dS )z(Per-block reaching definitions analysis.TFr   N)rG   r)   r/   r1   r0   r.   )r   Zdirtyr<   r.   r8   r/   r   r   r   reaching_definitions  s   


z ControlFlow.reaching_definitionsr   )r    r!   r"   r>   r   rO   rP   rY   r[   r_   rg   ri   rl   ro   rt   r|   r   r   r   r   r   r   rF   g   s     




$rF   c                   @   rB   )	LoopDescrc                 C   s   || _ || _g | _d S r   )
next_block
loop_blockrJ   )r   r   r   r   r   r   r   )     
zLoopDescr.__init__NrD   r   r   r   r   r   (  rE   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   )rK   finally_enterfinally_exit)r   rK   r   r   r   r   r   r   7  r   zExceptionDescr.__init__r   )r    r!   r"   r>   r   r   r   r   r   r   /  s    r   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 )rb   Nc                 C   sP   |j d u r	t |_ || _|| _|| _|j| _t | _d| _d| _d | _	|| _
d S r   )cf_stater'   rd   re   rX   r   refsrS   is_deletioninferred_typera   )r   rd   re   rX   ra   r   r   r   r   >  s   

zNameAssignment.__init__c                 C      d| j j| jf S Nz%s(entry=%r)r   r    rX   r   r   r   r   __repr__L     zNameAssignment.__repr__c                 C   s   | j | jp	| jj| _| jS r   )re   
infer_typera   rX   scoper   r   r   r   r   r   O  s   zNameAssignment.infer_typec                 C   s   | j | jp	| jjS r   )re   type_dependenciesra   rX   r   r   r   r   r   r   S     z NameAssignment.type_dependenciesc                 C   s   | j jjs	| j jS | jS r   )rX   r   is_unspecifiedr   r   r   r   r   r   V  s   
zNameAssignment.typer   )	r    r!   r"   r   r   r   r   propertyr   r   r   r   r   rb   =  s    
rb   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )r}   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   r}   r   )r   rX   r   rd   r   r   r   r   _  s   
zStaticAssignment.__init__c                 C   s   | j jS r   )rX   r   r   r   r   r   r   h     zStaticAssignment.infer_typec                 C   r@   )Nr   r   r   r   r   r   r   k  rA   z"StaticAssignment.type_dependencies)r    r!   r"   r>   r   r   r   r#   r   r   r   r   r}   ]  s
    	r}   c                   @   rB   )rh   c                 C   s   t | ||| d| _d S NT)rb   r   rS   )r   rd   re   rX   r   r   r   r   p     
zArgument.__init__NrD   r   r   r   r   rh   o  rE   rh   c                   @      e Zd Zdd Zdd ZdS )rj   c                 C   s   t | ||| d| _d S r   )rb   r   r   )r   rd   rX   r   r   r   r   v  r   zNameDeletion.__init__c                 C   s4   | j | jj}|js|| jjrtjS || _|S r   )	re   r   rX   r   r   Zcan_coerce_to_pyobjectr   py_object_typer   )r   r   r   r   r   r   z  s   zNameDeletion.infer_typeN)r    r!   r"   r   r   r   r   r   r   rj   u  s    rj   c                   @      e Zd ZdZdS )rk   zDefinitely not initialised yet.Nr    r!   r"   r>   r   r   r   r   rk         rk   c                   @   r   )r~   z7Coming from outer closure, might be initialised or not.Nr   r   r   r   r   r~     r   r~   c                   @   r   )rm   c                 C   s*   |j d u r	t |_ || _|| _|j| _d S r   )r   r'   r^   rX   r   rn   r   r   r   r     s
   
zNameReference.__init__c                 C   r   r   r   r   r   r   r   r     r   zNameReference.__repr__N)r    r!   r"   r   r   r   r   r   r   rm     s    rm   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| _|sd| _nt|v r|t d| _n	t|dkr(d| _tt| 	dd |D  d S )NTr   c                 S   s   g | ]	}|j tur|qS r   )re   r   ).0ir   r   r   
<listcomp>  s    z-ControlFlowState.__init__.<locals>.<listcomp>)
rk   discardcf_maybe_null
cf_is_nullr~   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  r   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(   rc   )r   r7   r   r   r   r:     r4   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r!t| | 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     s    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_defsr7   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        
zGV.__init__Fc           	   	   C   s  | d| j  | jjD ]R}||}|rI|jD ]0}t|tr3|d|jj|j	r)dnd|j
d f 7 }qt|trH|jrH|d|jj|j
d f 7 }q|sMd}||}| d|||f  q| jjD ]}||}|jD ]}| d	|||f  qmqc| d
 d S )Nz subgraph %s {
z
 %s [%s %s]ZdeletionZ
definitionr   z
 %s [reference %s]r3   z  %s [label="%s"];
z  %s -> %s;
z }
)r   r   r   rG   r   r+   rx   rb   rX   r   r   rm   r   r   r(   )	r   r   ctxr   r<   labelr{   pidr7   r   r   r   r     s.   







z	GV.renderNr   )r    r!   r"   r>   r   r   r   r   r   r   r     s    r   c                   @   r$   )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      | j |d|f d S r   r   r:   r   r   messager   r   r   r     r   zMessageCollection.errorc                 C   r   r   r   r   r   r   r   r     r   zMessageCollection.warningc                 C   s6   t | jD ]\}}}|rt|| qt||d qd S )Nr\   )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 ]u}| j|j }| ||j}	t	|t
rb|jj|	 ||j ||j @ }|jrK||jO }n||jO }|| |jtura|jj| qt	|tr|j||j< |jj| |jj|	 |	t |	t |	D ]}
|
j| qqq|d }|d }|d }|d }t }|D ](}t|jv rd|_t|jdkrd|_ qd|_ qt|jv rd|_qd|_ d|_q|! D ]\}}t|jv rOd|_|j"st|jdkr|j#|j$j%vrd|_ |j&s|j"s|j's|j(j)rq|j r7|j*s7|j+s!t,j+r,|j(j-s!|j(j.r,|/|j0d|j#  q|1|j0d|j#  q|rNd	|j# }|j*rG|d
7 }|1|j0| qt|jv rYd|_qd|_ d|_q|D ]8}
|
js|
jj's|
jj*s|
jjr|r|
j2r|1|
j0d|
jj#  n|1|
j0d|
jj#  d|
j_3qb| j4D ]:}|js|j's|j#dkr|j#5ds|j2r|r|1|j0d|j#  n|r|1|j0d|j#  d|_3q|6  |D ]	}t7|j|_q|D ]	}t7|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% (maybe initialized inside a closure)zUnused argument value '%s'zUnused result in '%s'_ZunusedzUnused argument '%s'zUnused entry '%s')8r|   r   r'   rG   r.   r+   ru   rX   r   rx   rb   rd   r   updater:   rv   r   rw   re   r   Zcf_assignmentsrc   rm   r^   Zcf_referencesr   rk   r~   r   r   r   r   r   ry   rT   r   r   Zscope_predefined_namesZ
allow_nullrR   r   r   rU   rV   r   r   r   r   r   r   rS   Zcf_usedrH   
startswithr   r   )r   Zcompiler_directivesassignmentsZ
referencesZassmt_nodesr<   r2   r{   Zi_assmtsr   r   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr   r^   rX   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|   g | _d S r   )r   r   r   r   r   r   r   r   r     s   
zAssignmentCollector.__init__c                 C   s   |  | d d  d S r   )Z_visitchildrenr   r   r   r   
visit_Node  r   zAssignmentCollector.visit_Nodec                 C   s   | j |j|jf d S r   )r   rc   rd   re   r]   r   r   r   visit_SingleAssignmentNode  s   z.AssignmentCollector.visit_SingleAssignmentNodec                 C   s"   |j D ]}| j||jf qd S r   )lhs_listr   rc   re   r   r^   rd   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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&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd_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-dXdY Z.dZd[ Z/d\d] Z0dS )`ControlFlowAnalysisc                 C   s8   || j kr| jS t| jD ]\}}||u r|  S qJ r   )envr   reversedstack)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| _| | t| j| j  |rc| j d }t|d}| jj|d	|d
 W d    |S 1 s^w   Y  |S )N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_assignmentr   r   rF   r   r   r   r   r   object_exprvisitchildrenr   openr   )r   r^   Z
dot_outputr   r   r   r   r   r   visit_ModuleNode  s(   



z$ControlFlowAnalysis.visit_ModuleNodec                 C   s  |j D ]
}|jr| | q| |d | j| j| jf |j| _t | _|jj	
 D ]}| j|r;| jj	| q,| | | j  |j D ]}| | qI|jrd| j|jttjdd|jj |jrw| j|jttjdd|jj | |j |jr| |jj | jjr| jj| jj | j  t| j| j  | jj!| jj" | j#d ur| j#t$|jj%| j | j& \| _| _|S )N)Z
decoratorsFr   )'argsdefaultr   r   rc   r   r   Zlocal_scoperF   rH   rz   rY   r:   r_   rP   _visitZstar_argri   r   r   Z
tuple_typerX   Zstarstar_arg	dict_typebodyZis_generatorZgbodyr<   r=   rL   rt   r   r   rG   rK   r   r   r   rp   r   r^   argrX   r   r   r   visit_FuncDefNode  sT   








z%ControlFlowAnalysis.visit_FuncDefNodec                 C   s   d|_ | |S r   )usedr  r]   r   r   r   visit_DefNode  r   z!ControlFlowAnalysis.visit_DefNodec                 C      |S r   r   r]   r   r   r   visit_GeneratorBodyDefNode  rA   z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec                 C   r  r   r   r]   r   r   r   visit_CTypeDefNode  rA   z&ControlFlowAnalysis.visit_CTypeDefNodeNc           	      C   s(  | j jsd S | j jr| j jd }| j j|j | j   |s"| j}|jrF|jd ur.|j}n| j	
|j}|d u r;d S | j j||||d n3|jrtt|jD ]$\}}|jr_ttjd|jd}n|| ju rg|}n||}| || qNn| | | j jr| j jd }| j j|j | j   d S d S )Nr`   Fr   )r   r<   rJ   r=   rK   rP   r   is_namerX   r   lookupr   rg   is_sequence_constructor	enumerater   Z
is_starredr   r   Z	list_typer   Zinferable_item_noder   )	r   rd   re   ra   Z	exc_descrrX   r   r  Z	item_noder   r   r   rg     s<   





z#ControlFlowAnalysis.mark_assignmentc                 C   s   | j d r| j| dS dS )z'Mark position if DOT output is enabled.r   N)r   r   r_   r]   r   r   r   r_   ,  s   
z!ControlFlowAnalysis.mark_positionc                 C   s0   |j D ]\}}|dkr| | q| | |S )N*)ry   rg   r   )r   r^   r   targetr   r   r   visit_FromImportStatNode1  s   

z,ControlFlowAnalysis.visit_FromImportStatNodec                 C   s   t dt| )NzUnhandled assignment node %s)r
   r   r]   r   r   r   visit_AssignmentNode8  r4   z(ControlFlowAnalysis.visit_AssignmentNodec                 C   s    |  |j | |j|j |S r   )r   re   rg   rd   r]   r   r   r   r   ;  s   z.ControlFlowAnalysis.visit_SingleAssignmentNodec                 C   s*   |  |j |jD ]	}| ||j q	|S r   )r   re   r   rg   r   r   r   r   r   @  s   
z0ControlFlowAnalysis.visit_CascadedAssignmentNodec                 C   sJ   t  }|| |jD ]	\}}| | q|jD ]
\}}| || q|S r   )r   r   r   r   rg   )r   r^   	collectorrd   re   r   r   r   visit_ParallelAssignmentNodeF  s   
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec                 C   s2   d| _ | | d| _ | |j| |  |S rZ   )r   r   rg   rd   r   Zcreate_binop_noder]   r   r   r   visit_InPlaceAssignmentNodeO  s
   
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec                 C   sr   |j D ]3}|jr1|jp| j|j}|js|jr!t|j	d|j  |j
s)| | | j|| q| | q|S )Nz7can not delete variable '%s' referenced in nested scope)r   r	  rX   r   r
  r   rU   rT   r   r   Zignore_nonexistingr   r   rl   r   r   r   r   visit_DelStatNodeV  s   

z%ControlFlowAnalysis.visit_DelStatNodec                 C   s6   | j |j}|r|j }| j|t|j|| |S r   )r   r
  r   Znot_noner   ri   r   r   )r   r^   rX   r   r   r   r   visit_CArgDeclNodee  s   z&ControlFlowAnalysis.visit_CArgDeclNodec                 C   sN   | j jr%|jp| j|j}|r%| j || || jv r%| js%t	|j
d |S )Nz+Cannot read reduction variable in loop body)r   r<   rX   r   r
  r   ro   r   r   r   r   rn   r   r   r   visit_NameNodem  s   z"ControlFlowAnalysis.visit_NameNodec                 C   s6   | j jr|jD ]}| | | j jsd|_ |S q|S r   )r   r<   r+   r   Zis_terminator)r   r^   r{   r   r   r   visit_StatListNodey  s   

z&ControlFlowAnalysis.visit_StatListNodec                 C   s   |  | | | |S r   )r   r_   r]   r   r   r   r     s   

zControlFlowAnalysis.visit_Nodec                 C   r  r   r   r]   r   r   r   visit_SizeofVarNode  rA   z'ControlFlowAnalysis.visit_SizeofVarNodec                 C   r  r   r   r]   r   r   r   visit_TypeidNode  rA   z$ControlFlowAnalysis.visit_TypeidNodec                 C   s   | j  }| j j}|jD ]$}| j |}| |j | j   | |j | j jr0| j j| q|j	rM| j j|d | |j	 | j jrL| j j| n|| |j
r[|| j _|S d | j _|S Nr8   )r   rO   r<   Z
if_clausesrP   r   	conditionr   r=   else_clauser)   )r   r^   r   r8   clauser   r   r   visit_IfStatNode  s,   



z$ControlFlowAnalysis.visit_IfStatNodec                 C   s   |  | | j }| jj}| j|}| |j | j  | |j | jjr0| jj| || |j	r>|| j_|S d| j_|S )z@Essentially an if-condition that wraps a RaiseStatNode.
        N)
r_   r   rO   r<   rP   r   r  	exceptionr=   r)   )r   r^   r   r8   r   r   r   visit_AssertStatNode  s   



z(ControlFlowAnalysis.visit_AssertStatNodec                 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rj|| j _
|S d | j _
|S r  )r   rP   rO   rI   rc   r   r  r   r   rp   r<   r=   r  r)   r   r^   Zcondition_blockr   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 u r|j
r||j}|r,|jr|jdkr>t|jdkr>|jd }nE|jdkrt|jdkr|jrt|jdkr|jd }|j
r||}	|	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 u r|j
r||j}|r|jr|jd
v rd}|jd d D ]}
| j||
|j jd	 qt|jdkr| j|| t|jd|jd |jd |j jd	 |s| j||j|j jd	 d S d S )NFr   r   r   r  r\   ZPY_SSIZE_T_MAX)valuer   r`   )rangexrangeT+)iteratorsequencer  
expr_scoper   rx   r   ZSimpleCallNodefunctionr   r	  r
  r   
is_builtinr   r   r  r   Zis_builtin_typerg   ZIntNoder   r   Zc_py_ssize_t_typer   
binop_nodeitem)r   r^   Z
is_specialr)  r  r   r+  rX   r(  Ziterator_typer  r   r   r   mark_forloop_target  s`   








z'ControlFlowAnalysis.mark_forloop_targetc                 C   s
   |  |S r   )visit_ForInStatNoder]   r   r   r   visit_AsyncForStatNode  r   z*ControlFlowAnalysis.visit_AsyncForStatNodec                 C   s6  | j  }| j  }| j jt|| | |j | j   t|t	j
r+| | nt|t	jr:| |j|j n| |j t|t	jrO| j||jjd | j   | |j | j j  | j jrk| j j| |jr| j j|d | |j | j jr| j j| n|| |jr|| j _|S d | j _|S )N)excluder  )r   rP   rO   rI   rc   r   r   r(  rx   r   ZForInStatNoder/  ZAsyncForStatNoderg   r  r.  ZParallelRangeNode_delete_privatesrX   r   rp   r<   r=   r  r)   r"  r   r   r   r0    s:   




z'ControlFlowAnalysis.visit_ForInStatNodec                 C   s.   |j D ]}|r|j|ur| j||j qd S r   )assigned_nodesrX   r   rl   )r   r^   r2  private_noder   r   r   r3  =  s
   
z$ControlFlowAnalysis._delete_privatesc                 C   sf   | j }t|jdr.t|| _ |jD ]}d|j_|j|j \}}|r(| j |j q| 	|}|| _ |S )NrX   T)
r   hasattrr  r'   r4  rX   rV   r   r:   r0  )r   r^   r   r5  r   Z	reductionr   r   r   visit_ParallelRangeNodeB  s   


z+ControlFlowAnalysis.visit_ParallelRangeNodec                 C   s6   |j D ]}d|j_q| | | | | | |S r   )r4  rX   rV   r3  r   )r   r^   r5  r   r   r   visit_ParallelWithBlockNodeU  s   




z/ControlFlowAnalysis.visit_ParallelWithBlockNodec                 C   s8  | j  }| j  }| j jt|| | |j | |j |j	d ur+| |j	 | j   | 
|j|j |j	d urP| 
|j| t|jd|j|j	 | j   | |j | j j  | j jrl| j j| |jr| j j|d | |j | j jr| j j| n|| |jr|| j _|S d | j _|S )Nr'  r  )r   rP   rO   rI   rc   r   r   bound1bound2steprg   r  r   r   r-  r   r   rp   r<   r=   r  r)   r"  r   r   r   visit_ForFromStatNode_  s<   






z)ControlFlowAnalysis.visit_ForFromStatNodec                 C   s   t d)NzGeneric loops are not supported)r
   r]   r   r   r   visit_LoopNode  r   z"ControlFlowAnalysis.visit_LoopNodec                 C   s   |  |j|jj |S r   )rg   rd   Z	with_node
enter_callr]   r   r   r   "visit_WithTargetAssignmentStatNode  s   z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec                 C   s(   |  |j |  |j |  |j |S r   )r   managerr>  r   r]   r   r   r   visit_WithStatNode  s   z&ControlFlowAnalysis.visit_WithStatNodec                 C   s  | j  }| j   | j  }| j jt| | j   | j j| | j   | j  jd7  _| 	|j
 | j  jd8  _| j j  | j jrb|jrW| j   | 	|j | j jrb| j j| |jD ]>}|| j _|jrz|jD ]}| 	| qqn	 | j j| j jd}| j   |jr| |j | 	|j
 | j jr| j j| qe| j jr|| j jd j |jr|| j _|S d | j _|S )Nr   r  r  )r   rO   rJ   rc   r   rP   r<   r=   rM   r   r   rp   r  Zexcept_clausespatternr  rg   rK   r)   )r   r^   r   rK   r  rB  r   r   r   visit_TryExceptStatNode  sN   








z+ControlFlowAnalysis.visit_TryExceptStatNodec                 C   sV  | j  }| j  }|| j _| |j | j jr(| j jr(| j j| j jd j | j  }|| j _| |j	 | j j}t
|||}| j j| | j jrV| j jd j| || j _|| | j   | j  jd7  _| |j | j  jd8  _| j j  | j jr| j jd j  | j jr| j j| |r| j j|d| j _|S d | j _|S )Nr  r   r  )r   rP   rO   r<   r   Zfinally_except_clauserJ   r=   rK   Zfinally_clauser   rc   rI   rM   r   rp   )r   r^   Z
body_blockrK   r   r   descrr   r   r   visit_TryFinallyStatNode  s<   




z,ControlFlowAnalysis.visit_TryFinallyStatNodec                 C   sN   |  | | | | jjr| jj| jjd j d | j_| jjr%d|_|S )Nr  T)r_   r   r   rJ   r<   r=   rK   rM   r]   r   r   r   visit_RaiseStatNode  s   

z'ControlFlowAnalysis.visit_RaiseStatNodec                 C   s6   |  | | jjr| jj| jjd j d | j_|S Nr  )r_   r   rJ   r<   r=   rK   r]   r   r   r   visit_ReraiseStatNode  s
   
z)ControlFlowAnalysis.visit_ReraiseStatNodec                 C   s   |  | | | t| jjd d d }|D ])}|jr@| jj|j |jr>| jj	}|D ]
}|jr7|j} nq-|j|  nq| jjrN| jj| jj	 d | j_|S rG  )
r_   r   iterr   rJ   r   r<   r=   r   rL   )r   r^   Zouter_exception_handlershandlerrL   Znext_handlerr   r   r   visit_ReturnStatNode  s(   

z(ControlFlowAnalysis.visit_ReturnStatNodec                 C      | j js|S | j jd }| | |jd d d D ]}|jr2| j j|j |jr0|j|j  n	q| j j|j d | j _|S rG  )	r   rI   r_   rJ   r   r<   r=   r   r   r   r^   loopr   r   r   r   visit_BreakStatNode     
z'ControlFlowAnalysis.visit_BreakStatNodec                 C   rL  rG  )	r   rI   r_   rJ   r   r<   r=   r   r   rM  r   r   r   visit_ContinueStatNode$  rP  z*ControlFlowAnalysis.visit_ContinueStatNodec                 C   sH   |j r| j| j| jf |j | _| |j |j r"| j \| _}|S r   )r*  r   rc   r   r   r   rN  rp   r   r^   r   r   r   r   visit_ComprehensionNode5  s   z+ControlFlowAnalysis.visit_ComprehensionNodec                 C   sp   t |tjtjfsJ ||jr%| j| j| jf | 	|j| _|j| _| 
| |jr6| j \| _| _|S r   )rx   r   ZIteratorNodeZAsyncIteratorNoder*  r   rc   r   r   r   r   rp   r]   r   r   r   visit_ScopedExprNode?  s   
z(ControlFlowAnalysis.visit_ScopedExprNodec                 C   s   |  |d | j|j|j| j|jj | j	| j| jf |j
| _| j  |jr7| j|jt|jj |  |d | j  | j \| _}|S )N)dict	metaclassZmkwbasesZclass_result)r   )r   r   rg   r  Zclassobjr   r
  r   r   rc   r   rP   Zdoc_noder   rX   rp   rR  r   r   r   visit_PyClassDefNodeL  s   

z(ControlFlowAnalysis.visit_PyClassDefNodec                 C   s,   | j |j| jf | | | j   |S r   )r   rc   r   r   r   rp   r]   r   r   r   visit_CClassDefNode[  s   

z'ControlFlowAnalysis.visit_CClassDefNodec                 C   s$   |j jr| |j t | | |S r   )operandr	  rg   r   r   r]   r   r   r   visit_AmpersandNodeb  s   
z'ControlFlowAnalysis.visit_AmpersandNoder   r   )1r    r!   r"   r   r   r  r  r  r  rg   r_   r  r  r   r   r  r  r  r  r  r  r   r  r  r  r!  r#  r/  r1  r0  r3  r7  r8  r<  r=  r?  rA  rC  rE  rF  rH  rK  rO  rQ  rS  rT  rX  rY  r[  r   r   r   r   r     s^    2
$		5
,
%3'

r   )+
__future__r   cythonZdeclareobjectr   r   r   r   r   r   ZVisitorr   r	   ZErrorsr   r   r
   ZExprNoder   Zunspecified_typer   r%   r?   rC   rF   r   r   rb   r}   rh   rj   rk   r~   rm   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sL   
7 B ) 
