o
    f޾                     @   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__ W/var/www/html/mig_web/myenv/lib/python3.10/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   )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)rR   is_variabler   is_struct_or_union
is_complexis_arrayis_cpp_classis_cpp_optionalrX   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<   rZ   NameAssignmentr+   appendr,   rH   r:   )r   lhsrhsrY   rh   
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<   rZ   Argumentr+   rj   r,   rH   r:   )r   rk   rl   rY   rm   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<   rZ   NameDeletionr+   rj   Uninitializedr,   rH   r:   )r   re   rY   rm   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<   rZ   r+   rj   NameReferencerH   r:   r   re   rY   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   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+   
isinstanceri   rY   rj   r,   itemsrr   r0   r1   r/   r-   valuesrK   )r   r   rY   r}   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'   r}   r   rb   r:   StaticAssignmentrU   Unknownrr   r+   )r   istaterY   retr}   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   dirtyr<   r.   r8   r/   r   r   r   reaching_definitions  s   


z ControlFlow.reaching_definitionsr   )r    r!   r"   r>   r   rO   rP   rZ   rb   rf   rn   rp   rs   rv   r|   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 )ri   Nc                 C   sP   |j d u r	t |_ || _|| _|| _|j| _t | _d| _d| _d | _	|| _
d S r   )cf_stater'   rk   rl   rY   r   refsrT   is_deletioninferred_typerh   )r   rk   rl   rY   rh   r   r   r   r   >  s   

zNameAssignment.__init__c                 C      d| j j| jf S Nz%s(entry=%r)r   r    rY   r   r   r   r   __repr__L     zNameAssignment.__repr__c                 C   s   | j | jp	| jj| _| jS r   )rl   
infer_typerh   rY   scoper   r   r   r   r   r   O  s   zNameAssignment.infer_typec                 C   s   | j | jp	| jjS r   )rl   type_dependenciesrh   rY   r   r   r   r   r   r   S     z NameAssignment.type_dependenciesc                 C   s   | j jjs	| j jS | jS r   )rY   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   ri   =  s    
ri   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   rY   r   rk   r   r   r   r   _  s   
zStaticAssignment.__init__c                 C   s   | j jS r   )rY   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   )ro   c                 C   s   t | ||| d| _d S NT)ri   r   rT   )r   rk   rl   rY   r   r   r   r   p     
zArgument.__init__NrD   r   r   r   r   ro   o  rE   ro   c                   @      e Zd Zdd Zdd ZdS )rq   c                 C   s   t | ||| d| _d S r   )ri   r   r   )r   rk   rY   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   )	rl   r   rY   r   r   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   rq   u  s    rq   c                   @      e Zd ZdZdS )rr   zDefinitely not initialised yet.Nr    r!   r"   r>   r   r   r   r   rr         rr   c                   @   r   )r   z7Coming from outer closure, might be initialised or not.Nr   r   r   r   r   r     r   r   c                   @   r   )rt   c                 C   s*   |j d u r	t |_ || _|| _|j| _d S r   )r   r'   re   rY   r   ru   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   rt     s    rt   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   )rl   r   ).0ir   r   r   
<listcomp>  s    z-ControlFlowState.__init__.<locals>.<listcomp>)
rr   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(   rj   )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stop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]deletion
definitionr   z
 %s [reference %s]r3   z  %s [label="%s"];
z  %s -> %s;
z }
)r   r   r   rG   r   r+   r   ri   rY   r   r   rt   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 )Nrc   )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'_unusedzUnused argument '%s'zUnused entry '%s')8r   r   r'   rG   r.   r+   r}   rY   r   r   ri   rk   r   updater:   r~   r   r   rl   r   cf_assignmentsrj   rt   re   cf_referencesr   rr   r   r   r   r   r   r   r   rU   r   r   scope_predefined_names
allow_nullrS   r   r   rV   rW   r   r   r   r   r   r   rT   cf_usedrH   
startswithr   r   )r   compiler_directivesassignments
referencesassmt_nodesr<   r2   r   i_assmtsr   r   warn_maybe_uninitializedwarn_unused_resultwarn_unusedwarn_unused_argr   re   rY   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   )_visitchildrenr   r   r   r   
visit_Node  r   zAssignmentCollector.visit_Nodec                 C   s   | j |j|jf d S r   )r   rj   rk   rl   rd   r   r   r   visit_SingleAssignmentNode  s   z.AssignmentCollector.visit_SingleAssignmentNodec                 C   s"   |j D ]}| j||jf qd S r   )lhs_listr   rj   rl   r   re   rk   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_ctxOptimizer
  constant_folderr'   
reductionsin_inplace_assignmentr   r  rF   r   r  r   r   r   object_exprvisitchildrenr   openr   )r   re   
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)
decoratorsFr  )'argsdefaultr  r  rj   r  r   local_scoperF   rH   r   rZ   r:   rf   rP   _visitstar_argrp   r   r   
tuple_typerY   starstar_arg	dict_typebodyis_generatorgbodyr<   r=   rL   r|   r   r  rG   rK   r  r   r   rw   r   re   argrY   r   r   r   visit_FuncDefNode  sT   








z%ControlFlowAnalysis.visit_FuncDefNodec                 C   s   d|_ | |S r   )usedr'  rd   r   r   r   visit_DefNode  r   z!ControlFlowAnalysis.visit_DefNodec                 C      |S r   r   rd   r   r   r   visit_GeneratorBodyDefNode  rA   z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec                 C   r*  r   r   rd   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 )Nrg   Fr   )r   r<   rJ   r=   rK   rP   r  is_namerY   r  lookupr   rn   is_sequence_constructor	enumerater  
is_starredr   r   	list_typer   inferable_item_noder  )	r   rk   rl   rh   	exc_descrrY   r   r&  	item_noder   r   r   rn     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   rf   rd   r   r   r   rf   ,  s   
z!ControlFlowAnalysis.mark_positionc                 C   s0   |j D ]\}}|dkr| | q| | |S )N*)r   rn   r  )r   re   r   targetr   r   r   visit_FromImportStatNode1  s   

z,ControlFlowAnalysis.visit_FromImportStatNodec                 C   s   t dt| )NzUnhandled assignment node %s)r
   r   rd   r   r   r   visit_AssignmentNode8  r4   z(ControlFlowAnalysis.visit_AssignmentNodec                 C   s    |  |j | |j|j |S r   )r  rl   rn   rk   rd   r   r   r   r   ;  s   z.ControlFlowAnalysis.visit_SingleAssignmentNodec                 C   s*   |  |j |jD ]	}| ||j q	|S r   )r  rl   r   rn   r  r   r   r   r  @  s   
z0ControlFlowAnalysis.visit_CascadedAssignmentNodec                 C   sJ   t  }|| |jD ]	\}}| | q|jD ]
\}}| || q|S r   )r   r  r   r  rn   )r   re   	collectorrk   rl   r   r   r   visit_ParallelAssignmentNodeF  s   
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec                 C   s2   d| _ | | d| _ | |j| |  |S r[   )r  r  rn   rk   r  create_binop_noderd   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.  rY   r  r/  r   rV   rU   r   r   ignore_nonexistingr  r   rs   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   not_noner   rp   r   r   )r   re   rY   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<   rY   r  r/  r   rv   r  r  r   r   ru   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  is_terminator)r   re   r   r   r   r   visit_StatListNodey  s   

z&ControlFlowAnalysis.visit_StatListNodec                 C   s   |  | | | |S r   )r  rf   rd   r   r   r   r     s   

zControlFlowAnalysis.visit_Nodec                 C   r*  r   r   rd   r   r   r   visit_SizeofVarNode  rA   z'ControlFlowAnalysis.visit_SizeofVarNodec                 C   r*  r   r   rd   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<   
if_clausesrP   r  	conditionr"  r=   else_clauser)   )r   re   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)
rf   r   rO   r<   rP   r  rK  	exceptionr=   r)   )r   re   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 rH  )r   rP   rO   rI   rj   r   rK  r  r"  rw   r<   r=   rL  r)   r   re   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   r1  rc   PY_SSIZE_T_MAX)valuer   rg   )rangexrangeT+)iteratorsequencer8  
expr_scoper  r   r   SimpleCallNodefunctionr   r.  r/  r   
is_builtinr   r  r0  r   is_builtin_typern   IntNoder   r   c_py_ssize_t_typer  
binop_nodeitem)r   re   
is_specialrZ  r8  r  r]  rY   rY  iterator_typer&  r   r   r   mark_forloop_target  s`   








z'ControlFlowAnalysis.mark_forloop_targetc                 C   s
   |  |S r   )visit_ForInStatNoderd   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)excluderI  )r   rP   rO   rI   rj   r   r  rY  r   r   ForInStatNoderf  AsyncForStatNodern   r8  rc  ParallelRangeNode_delete_privatesrY   r"  rw   r<   r=   rL  r)   rQ  r   r   r   rg    s:   




z'ControlFlowAnalysis.visit_ForInStatNodec                 C   s.   |j D ]}|r|j|ur| j||j qd S r   )assigned_nodesrY   r   rs   )r   re   ri  private_noder   r   r   rm  =  s
   
z$ControlFlowAnalysis._delete_privatesc                 C   sf   | j }t|jdr.t|| _ |jD ]}d|j_|j|j \}}|r(| j |j q| 	|}|| _ |S )NrY   T)
r  hasattrr8  r'   rn  rY   rW   r   r:   rg  )r   re   r  ro  r   	reductionr   r   r   visit_ParallelRangeNodeB  s   


z+ControlFlowAnalysis.visit_ParallelRangeNodec                 C   s6   |j D ]}d|j_q| | | | | | |S r   )rn  rY   rW   rm  r  )r   re   ro  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 )NrX  rI  )r   rP   rO   rI   rj   r   r  bound1bound2steprn   r8  r  r   rb  r   r"  rw   r<   r=   rL  r)   rQ  r   r   r   visit_ForFromStatNode_  s<   






z)ControlFlowAnalysis.visit_ForFromStatNodec                 C   s   t d)NzGeneric loops are not supported)r
   rd   r   r   r   visit_LoopNode  r   z"ControlFlowAnalysis.visit_LoopNodec                 C   s   |  |j|jj |S r   )rn   rk   	with_node
enter_callrd   r   r   r   "visit_WithTargetAssignmentStatNode  s   z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec                 C   s(   |  |j |  |j |  |j |S r   )r  managerrz  r"  rd   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   rI  r-  )r   rO   rJ   rj   r   rP   r<   r=   rM   r  r"  rw   rL  except_clausespatternr8  rn   rK   r)   )r   re   r   rK   rM  r  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   rI  )r   rP   rO   r<   r  finally_except_clauserJ   r=   rK   finally_clauser   rj   rI   rM   r"  rw   )r   re   
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)rf   r  r   rJ   r<   r=   rK   rM   rd   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-  )rf   r   rJ   r<   r=   rK   rd   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 r  )
rf   r  iterr   rJ   r   r<   r=   r   rL   )r   re   outer_exception_handlershandlerrL   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 r  )	r   rI   rf   rJ   r   r<   r=   r   r   r   re   looprO  r   r   r   visit_BreakStatNode     
z'ControlFlowAnalysis.visit_BreakStatNodec                 C   r  r  )	r   rI   rf   rJ   r   r<   r=   r   r   r  r   r   r   visit_ContinueStatNode$  r  z*ControlFlowAnalysis.visit_ContinueStatNodec                 C   sH   |j r| j| j| jf |j | _| |j |j r"| j \| _}|S r   )r[  r  rj   r  r   r  r  rw   r   re   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   )r   r   IteratorNodeAsyncIteratorNoder[  r  rj   r  r   r  r  rw   rd   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	metaclassmkwbasesclass_result)r"  )r  r   rn   r8  classobjr  r/  r   r  rj   r   rP   doc_noder   rY   rw   r  r   r   r   visit_PyClassDefNodeL  s   

z(ControlFlowAnalysis.visit_PyClassDefNodec                 C   s,   | j |j| jf | | | j   |S r   )r  rj   r   r   r  rw   rd   r   r   r   visit_CClassDefNode[  s   

z'ControlFlowAnalysis.visit_CClassDefNodec                 C   s$   |j jr| |j t | | |S r   )operandr.  rn   r   r  rd   r   r   r   visit_AmpersandNodeb  s   
z'ControlFlowAnalysis.visit_AmpersandNoder   r   )1r    r!   r"   r  r  r'  r)  r+  r,  rn   rf   r9  r:  r   r  r<  r>  r@  rB  rC  rE  r   rF  rG  rN  rP  rS  rf  rh  rg  rm  rr  rs  rw  rx  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   cythondeclareobjectr   r   r   r   r   r   Visitorr   r	   Errorsr   r   r
   ExprNoder   unspecified_typer   r%   r?   rC   rF   r   r   ri   r   ro   rq   rr   r   rt   r   r   r   r   r   r   r   r  r   r   r   r   <module>   sL   
7 B ) 
