
    Ae                        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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ej,                        Z eed      Z ee      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d  d!e       Z! G d" d#e       Z" G d$ d%e       Z# G d& d'e      Z$ G d( d)e      Z% G d* d+e      Z& G d, d-e'      Z( G d. d/e      Z) G d0 d1e      Z* G d2 d3e      Z+d4 Z, G d5 d6e      Z- G d7 d8e      Z.y)9    )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                   &     e Zd Zd fd	Zd Z xZS )r   c                 H    t         t        |   |       || _        || _        y N)superr   __init__type_may_be_none)selfr   may_be_nonepos	__class__s       ;lib/python3.12/site-packages/Cython/Compiler/FlowControl.pyr   zTypedExprNode.__init__   s!    mT+C0	'    c                      | j                   dk7  S NF)r   r   s    r    r   zTypedExprNode.may_be_none   s      E))r!   NN)__name__
__module____qualname__r   r   __classcell__r   s   @r    r   r      s    (
*r!   r   Tr   c                   (    e Zd ZdZd Zd Zd Zd Zy)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                     t               | _        t               | _        t               | _        g | _        i | _        t               | _        d| _        d| _        d| _	        d| _
        d| _        y Nr   )setchildrenparents	positionsstatsgenboundedi_inputi_outputi_geni_killi_stater$   s    r    r   zControlBlock.__init__;   sW    u
u
r!   c                 :    | j                    xr | j                   S r   )r4   r3   r$   s    r    emptyzControlBlock.emptyJ   s    JJ5t~~#56r!   c                    | j                   D ]  }|j                  j                  |         | j                  D ]  }|j                   j                  |         | j                  j                          | j                   j                          y)z'Detach block from parents and children.N)r1   r2   removeclear)r   childparents      r    detachzControlBlock.detachM   sl    ]] 	'EMM  &	'll 	)FOO""4(	)r!   c                 p    | j                   j                  |       |j                  j                  |        y r   )r1   addr2   r   blocks     r    	add_childzControlBlock.add_childV   s&    % $r!   N)r&   r'   r(   __doc__r   r=   rC   rH    r!   r    r-   r-   $   s    ,7 r!   r-   c                       e Zd ZdZd Zy)	ExitBlockzNon-empty exit point block.c                      yr#   rJ   r$   s    r    r=   zExitBlock.empty^   s    r!   N)r&   r'   r(   rI   r=   rJ   r!   r    rL   rL   [   s
    %r!   rL   c                       e Zd Zd Zy)AssignmentListc                     g | _         y r   )r4   r$   s    r    r   zAssignmentList.__init__c   s	    
r!   Nr&   r'   r(   r   rJ   r!   r    rO   rO   b   s    r!   rO   c                   h    e Zd ZdZd ZddZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zy)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                    t               | _        t               | _        g | _        g | _        t               | _        t               | _        | j                  j                  | j                         | j                  | _
        y r   )r0   blocksentriesloops
exceptionsr-   entry_pointrL   
exit_pointrE   rG   r$   s    r    r   zControlFlow.__init__s   sV    eu
'>#+(%%
r!   Nc                 v    t               }| j                  j                  |       |r|j                  |       |S )zoCreate floating block linked to `parent` if given.

           NOTE: Block is NOT added to self.blocks
        )r-   rU   rE   rH   r   rB   rG   s      r    newblockzControlFlow.newblock~   s1    
 U#r!   c                     t               }| j                  j                  |       |r|j                  |       n'| j                  r| j                  j                  |       || _        | j                  S )z|Create block children block linked to current or `parent` if given.

           NOTE: Block is added to self.blocks
        )r-   rU   rE   rH   rG   r\   s      r    	nextblockzControlFlow.nextblock   sV    
 U#ZZJJ  '
zzr!   c                     |j                   ry|j                  xsD |j                  xs6 |j                  xs( |j                  xs |j
                  xs |j                  S r#   )is_anonymousis_localis_pyclass_attris_argfrom_closure
in_closureerror_on_uninitializedr   entrys     r    
is_trackedzControlFlow.is_tracked   s\     -%"7"7 -5<< -""-&+&6&6-,,	.r!   c                     |j                   re|j                  rY|j                  j                  sB|j                  j                  s,|j                  j
                  s|j                  j                  ryyNTF)rb   is_variabler   is_struct_or_union
is_complexis_arrayis_cpp_classrh   s     r    is_statically_assignedz"ControlFlow.is_statically_assigned   sK    NNu00..&&$$((r!   c                     | j                   r3| j                   j                  j                  |j                  dd        yy)z0Mark position, will be used to draw graph nodes.N   )rG   r3   rE   r   r   nodes     r    mark_positionzControlFlow.mark_position   s0    ::JJ  $$TXXbq\2 r!   c                    | j                   ry| j                  |      rgt        |||      }| j                   j                  j	                  |       || j                   j
                  |<   | j                  j                  |       y y y r   )rG   rj   NameAssignmentr4   appendr5   rV   rE   r   lhsrhsri   
assignments        r    mark_assignmentzControlFlow.mark_assignment   se    ::$//%0'S%8JJJ##J/$.DJJNN5!LLU#	 1:r!   c                    | j                   ry| j                  |      rgt        |||      }| j                   j                  j	                  |       || j                   j
                  |<   | j                  j                  |       y y y r   )rG   rj   Argumentr4   rz   r5   rV   rE   r{   s        r    mark_argumentzControlFlow.mark_argument   se    ::$//%0!#sE2JJJ##J/$.DJJNN5!LLU#	 1:r!   c                    | j                   r|| j                  |      rjt        ||      }| j                   j                  j	                  |       t
        | j                   j                  |<   | j                  j                  |       y y y r   )	rG   rj   NameDeletionr4   rz   Uninitializedr5   rV   rE   )r   rv   ri   r~   s       r    mark_deletionzControlFlow.mark_deletion   sc    ::$//%0%dE2JJJ##J/$1DJJNN5!LLU#	 1:r!   c                     | j                   r]| j                  |      rK| j                   j                  j                  t	        ||             | j
                  j                  |       y y y r   )rG   rj   r4   rz   NameReferencerV   rE   r   rv   ri   s      r    mark_referencezControlFlow.mark_reference   sN    ::$//%0JJ##M$$>? LLU# 1:r!   c                 b   t        | j                  g      }t               }|rK|j                         }|j                  |       |j                  D ]  }||vs|j                  |        |rK| j
                  |z
  }|D ]  }|j                           |j                  | j                         |D ]g  }|j                         s|j                  D ]$  }|j                  D ]  }|j                  |        & |j                          |j                  |       i | xj
                  |z  c_        y)z%Delete unreachable and orphan blocks.N)r0   rY   poprE   r1   rU   rC   r?   r=   r2   rH   )r   queuevisitedrootrA   unreachablerG   rB   s           r    	normalizezControlFlow.normalize   s   T%%&'%99;DKK %'IIe$%  kkG+  	ELLN	t''( 	'E{{}#mm 0F!& 0((/00 &	' 	{"r!   c                 f   i | _         d}| j                  D ].  }t               }|x|_        |_        || j                   |<   |dz  }0 | j
                  D ]y  }|j                  D ]h  }t        |t              s||_        | j                   |j                     }|j                  j                  |       |xj                  |z  c_        |dz  }j { | j
                  D ]  }|j                  j                         D ]z  \  }}| j                   |   }|t        u r |xj                  |j                  z  c_        n|xj                  |j                  z  c_        |xj                  |j                  z  c_        | |j                  |_        |j"                  D ].  }|xj                  | j                   |   j                  z  c_        0  | j                   j%                         D ]+  }| j&                  xj                  |j                  z  c_        - | j&                  j                  | j&                  _        y)z+Set initial state, map assignments to bits.r   N)assmtsrV   rO   maskbitrU   r4   
isinstancery   ri   rz   r5   itemsr   r9   r:   r8   r6   valuesrY   )r   r   ri   r   rG   stats         r    
initializezControlFlow.initialize   s   \\ 	E#%F'**FK&*!'DKKAIC		 [[ 	E dN3"DH![[4FLL''-KK3&KAIC	 [[ 
	7E$yy0 ,tU+=(KK6::-KKK488+K+, #[[EN 7E 2 6 667
	7 kk((* 	1F""fjj0"	1$($4$4$:$:!r!   c                    t               }| j                  |   }||j                  z  rc| j                  |      r|j	                  t        |             n7|j                  r|j	                  t               n|j	                  t               |j                  D ]#  }||j                  z  s|j	                  |       % |S r   )
r0   r   r   rr   rE   StaticAssignmentre   Unknownr   r4   )r   istateri   retr   assmts         r    map_onezControlFlow.map_one  s    eU#FJJ**51(/0## &\\ 	E		!	 
r!   c                     d}|rud}| j                   D ]`  }d}|j                  D ]  }||j                  z  } ||j                   z  |j                  z  }||j                  k7  rd}||_        ||_        b |rtyy)z(Per-block reaching definitions analysis.TFr   N)rU   r2   r8   r:   r9   r7   )r   dirtyrG   r7   rB   r8   s         r    reaching_definitionsz ControlFlow.reaching_definitions  s    E *#mm /Fv.G/#u||m3u{{Bu~~- E '!)* r!   r   )r&   r'   r(   rI   r   r]   r_   rj   rr   rw   r   r   r   r   r   r   r   r   rJ   r!   r    rS   rS   g   sN    		&	.3
$$$$#.";H*r!   rS   c                       e Zd Zd Zy)	LoopDescrc                 .    || _         || _        g | _        y r   )
next_block
loop_blockrX   )r   r   r   s      r    r   zLoopDescr.__init__'  s    $$r!   NrQ   rJ   r!   r    r   r   &  s    r!   r   c                       e Zd ZdZddZy)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                 .    || _         || _        || _        y r   )rY   finally_enterfinally_exit)r   rY   r   r   s       r    r   zExceptionDescr.__init__5  s    &*(r!   r%   )r&   r'   r(   rI   r   rJ   r!   r    r   r   -  s    )r!   r   c                   4    e Zd Zd Zd Zd Zd Zed        Zy)ry   c                     |j                   t               |_         || _        || _        || _        |j
                  | _        t               | _        d| _        d| _        d | _	        y r#   )
cf_stater0   r|   r}   ri   r   refsrd   is_deletioninferred_typer   r|   r}   ri   s       r    r   zNameAssignment.__init__<  sU    <<5CL
77E	 !r!   c                 N    | j                   j                  d| j                  dS Nz(entry=)r   r&   ri   r$   s    r    __repr__zNameAssignment.__repr__H      !%!8!8$**EEr!   c                     | j                   j                  | j                  j                        | _        | j                  S r   )r}   
infer_typeri   scoper   r$   s    r    r   zNameAssignment.infer_typeK  s/    !XX001A1AB!!!r!   c                 `    | j                   j                  | j                  j                        S r   )r}   type_dependenciesri   r   r$   s    r    r   z NameAssignment.type_dependenciesO  s!    xx))$***:*:;;r!   c                     | j                   j                  j                  s| j                   j                  S | j                  S r   )ri   r   is_unspecifiedr   r$   s    r    r   zNameAssignment.typeR  s-    zz--::??"!!!r!   N)	r&   r'   r(   r   r   r   r   propertyr   rJ   r!   r    ry   ry   ;  s+    
"F"< " "r!   ry   c                   .     e Zd ZdZ fdZd Zd Z xZS )r   z7Initialised at declaration time, e.g. stack allocation.c                     |j                   j                  sd}nd }t        |j                   ||j                        }t        t
        |   |||       y )NF)r   r   )r   is_pyobjectr   r   r   r   r   )r   ri   r   r|   r   s       r    r   zStaticAssignment.__init__[  sH    zz%%KKJJKUYY@.sC?r!   c                 .    | j                   j                  S r   )ri   r   r$   s    r    r   zStaticAssignment.infer_typed  s    zzr!   c                      y)NrJ   rJ   r$   s    r    r   z"StaticAssignment.type_dependenciesg  s    r!   )r&   r'   r(   rI   r   r   r   r)   r*   s   @r    r   r   Y  s    A@r!   r   c                       e Zd Zd Zy)r   c                 B    t         j                  | |||       d| _        y NT)ry   r   rd   r   s       r    r   zArgument.__init__l  s    c36r!   NrQ   rJ   r!   r    r   r   k  s    r!   r   c                       e Zd Zd Zd Zy)r   c                 B    t         j                  | |||       d| _        y r   )ry   r   r   )r   r|   ri   s      r    r   zNameDeletion.__init__r  s    c36r!   c                     | j                   j                  | j                  j                        }|j                  s+|j                  | j                  j                        rt        S || _        |S r   )r}   r   ri   r   r   can_coerce_to_pyobjectr   r   )r   r   s     r    r   zNameDeletion.infer_typev  sU    ++DJJ,<,<=))001A1AB!!*r!   N)r&   r'   r(   r   r   rJ   r!   r    r   r   q  s     r!   r   c                       e Zd ZdZy)r   zDefinitely not initialised yet.Nr&   r'   r(   rI   rJ   r!   r    r   r     s    )r!   r   c                       e Zd ZdZy)r   z7Coming from outer closure, might be initialised or not.Nr   rJ   r!   r    r   r     s    Ar!   r   c                       e Zd Zd Zd Zy)r   c                 x    |j                   t               |_         || _        || _        |j                  | _        y r   )r   r0   rv   ri   r   r   s      r    r   zNameReference.__init__  s.    == EDM	
88r!   c                 N    | j                   j                  d| j                  dS r   r   r$   s    r    r   zNameReference.__repr__  r   r!   N)r&   r'   r(   r   r   rJ   r!   r    r   r     s    Fr!   r   c                   0     e Zd ZdZdZdZ fdZd Z xZS )ControlFlowStateFc                 H   t         |v r&|j                  t                d| _        |sBd| _        n:t        |v r|j                  t               d| _        nt        |      dk(  rd| _        t        t        | '  |D cg c]  }|j                  t        us| c}       y c c}w )NTr   )r   discardcf_maybe_null
cf_is_nullr   len	is_singler   r   r   r}   r   )r   stateir   s      r    r   zControlFlowState.__init__  s    E!MM-(!%D"&MM'"!%D5zQ!%.<1m!;Q<	><s   ;BBc                     | d   S r/   rJ   r$   s    r    onezControlFlowState.one  s    Awr!   )	r&   r'   r(   r   r   r   r   r   r)   r*   s   @r    r   r     s     MJI> r!   r   c                   6    e Zd ZdZd Zd Zd Zd Zd	dZd Z	y)
	GVContextzGraphviz subgraph object.c                 <    i | _         d| _        g | _        i | _        y r/   )blockidsnextidr1   sourcesr$   s    r    r   zGVContext.__init__  s    r!   c                 :    | j                   j                  |       y r   )r1   rz   )r   rA   s     r    rE   zGVContext.add  s    U#r!   c                     || j                   vr1d| j                  z  | j                   |<   | xj                  dz  c_        | j                   |   S )Nzblock%dr   )r   r   rF   s     r    nodeidzGVContext.nodeid  sB    %#,t{{#:DMM% KK1K}}U##r!   c                 |   |j                   syt        |j                         }t        |j                         }|d   }|| j                  vr&t	        |j                               | j                  |<   | j                  |   }dj                  ||d   dz
  |d    D cg c]  }|j                          c}      S c c}w )N r   \nr   )r3   minmaxr   list	get_linesjoinstrip)r   rG   startstopsrcdescrlinesls          r    extract_sourceszGVContext.extract_sources  s    EOO$5??#84<<'%)(*<*<*>%?DLL"X&zzeE!HqLa.IJ1779JKKJs   B9c                     |j                  d|z         |j                  d       | j                  D ]  }|j                  || |        |j                  d       y)zRender graphviz dot graphzdigraph %s {
z node [shape=box];
z}
N)writer1   render)r   fpnameannotate_defsrA   s        r    r   zGVContext.render  sO    
!D()
'(]] 	2ELLT=1	2
r!   c                 F    |j                  dd      j                  dd      S )N"z\"
r   )replace)r   texts     r    escapezGVContext.escape  s     ||C'//e<<r!   NF)
r&   r'   r(   rI   r   rE   r   r   r   r  rJ   r!   r    r   r     s$    #$$	L=r!   r   c                       e Zd ZdZd ZddZy)GVzGraphviz DOT renderer.c                      || _         || _        y r   )r   flow)r   r   r
  s      r    r   zGV.__init__  s    		r!   c           
      T   |j                  d| j                  z         | j                  j                  D ]  }|j	                  |      }|r|j
                  D ]  }t        |t              r?|d|j                  j                  d|j                  rdndd|j                  d   dz  }Rt        |t              sc|j                  sp|d|j                  j                  d	|j                  d   dz  } |sd
}|j                  |      }|j                  d|d|j                  |      d        | j                  j                  D ]K  }|j                  |      }|j                  D ])  }|j                  d|d|j                  |      d       + M |j                  d       y )Nz subgraph %s {
z
 z [deletion
definition r   ]z [reference r=   z  z	 [label="z"];
z -> z;
z }
)r   r   r
  rU   r   r4   r   ry   ri   r   r   r   r   r  r1   )	r   r   ctxr   rG   labelr   pidrA   s	            r    r   z	GV.render  so   
#dii/0YY%% 	HE''.E!KK ]D!$7 JJOO4;K;KZQ]-]_c_g_ghi_j"l l#D-8::!tzzPTPXPXYZP[%\\E] **U#CHHsCJJu4EFG	H YY%% 	EE**U#C ECE1BCDE	E 	r!   Nr  )r&   r'   r(   rI   r   r   rJ   r!   r    r  r    s     r!   r  c                   (    e Zd ZdZd Zd Zd Zd Zy)MessageCollectionz/Collect error/warnings messages first then sortc                 "    t               | _        y r   )r0   messagesr$   s    r    r   zMessageCollection.__init__  s    r!   c                 @    | j                   j                  |d|f       y r   r  rE   r   r   messages      r    r	   zMessageCollection.error  s    3g./r!   c                 @    | j                   j                  |d|f       y r#   r  r  s      r    r
   zMessageCollection.warning  s    3w/0r!   c                 x    t        | j                        D ]"  \  }}}|rt        ||       t        ||d       $ y )Nrt   )sortedr  r	   r
   )r   r   is_errorr  s       r    reportzMessageCollection.report  s:    &,T]]&; 	)"C7c7#Wa(		)r!   N)r&   r'   r(   rI   r   r	   r
   r  rJ   r!   r    r  r    s    901)r!   r  c                    | j                          | j                          t               }i }t               }| j                  D ]  }|j                  }|j
                  D ]  }| j                  |j                     }| j                  ||j                        }	t        |t              r|j                  j                  j                  |	       |j                  |j                         ||j                   z  }|j                   r||j"                  z  }n||j"                  z  }|j                  |       |j$                  t&        us|j                  j(                  j+                  |       t        |t,              s!|j                  ||j.                  <   |j                  j0                  j+                  |       |j.                  j                  j                  |	       |	j3                  t4               |	j3                  t6               |	D ]  }
|
j8                  j                  |          |d   }|d   }|d   }|d   }t;               }|D ]k  }t4        |j                  v r/d|_        t?        |j                        dk(  rd|_         <d|_         Dt6        |j                  v rd|_        ^d|_         d|_        m |jC                         D ]  \  }}t4        |j                  v rFd|_        |jD                  st?        |j                        dk(  rd|_         |jF                  s.|jD                  s"|jH                  s|jJ                  jL                  r|j@                  r|jN                  s<tP        jN                  rW|jJ                  jR                  s|jJ                  jT                  r+|jW                  |jX                  d|jZ                  z         |j]                  |jX                  d|jZ                  z         1|s5|j]                  |jX                  d	|jZ                  z         `t6        |j                  v r	d|_        {d|_         d|_         |D ]  }
|
j8                  r|
j                  jH                  r'|
j                  j^                  r>|
j                  j0                  ru|rs|
j`                  r4|j]                  |
jX                  d
|
j                  jZ                  z         n3|j]                  |
jX                  d|
j                  jZ                  z         d|
j                  _1         | jd                  D ]  }|j0                  r|jH                  r|jZ                  dk7  r~|jZ                  jg                  d      sc|j`                  r,|rU|j]                  |jX                  d|jZ                  z         n+|r)|j]                  |jX                  d|jZ                  z         d|_1         |ji                          |D ]  }tk        |j                        |_         |D ]  }tk        |j                        |_         y )Nzwarn.maybe_uninitializedzwarn.unused_resultzwarn.unusedzwarn.unused_argTr   Fz0local variable '%s' referenced before assignmentz9local variable '%s' might be referenced before assignmentzUnused argument value '%s'zUnused result in '%s'_unusedzUnused argument '%s'zUnused entry '%s')6r   r   r0   rU   r7   r4   r   ri   r   r   ry   r|   r   updaterE   r   r   r   r}   r   cf_assignmentsrz   r   rv   cf_referencesr   r   r   r   r  r   r   r   r   re   
allow_nullrc   r   r  rg   r   r   r   r	   r   r   r
   rf   rd   cf_usedrV   
startswithr  r   )r
  compiler_directivesassignments
referencesassmt_nodesrG   r;   r   i_assmtsr   r   warn_maybe_uninitializedwarn_unused_resultwarn_unusedwarn_unused_argr  rv   ri   s                     r    check_definitionsr2    s   OO %KJ%K )--KK 	)D{{4::.HLL$**5E$/!!((/)!X]]N2##x||+Gtxx'G%88=0JJ--44T:D-0(,


499%

((//5		""))%0 m,g&" )EJJNN4()/	)):  33MN,-AB%m4K)*;<O "H  'DMM)!%D4==!Q&"&"'%!%D#DO!&D' "'') "'eDMM)!%D%%#dmm*<*A"&5#5#5,,

0C0C//66

..%**2K2KNNJ**%&
 $$J**%& *  HHOjj!" %
 "&D#DO!&DE"'J  
&

5;;#>#>KK**{{((-?<<$$UYY0L%*[[%5%516 7 $$UYY0G%*[[%5%516 7 %EII
&  "##--zzS )>)>x)H<<& ((4J).54 5 # ((4G).54 5!EM" OO 8(78 8(78r!   c                   0     e Zd Z fdZd Zd Zd Z xZS )AssignmentCollectorc                 8    t         t        |           g | _        y r   )r   r4  r   r*  )r   r   s    r    r   zAssignmentCollector.__init__  s    !413r!   c                 (    | j                  | d        y r   )_visitchildrenr$   s    r    
visit_NodezAssignmentCollector.visit_Node  s    D$'r!   c                 f    | j                   j                  |j                  |j                  f       y r   )r*  rz   r|   r}   ru   s     r    visit_SingleAssignmentNodez.AssignmentCollector.visit_SingleAssignmentNode  s#    488 45r!   c                 t    |j                   D ])  }| j                  j                  ||j                  f       + y r   )lhs_listr*  rz   r}   r   rv   r|   s      r    visit_CascadedAssignmentNodez0AssignmentCollector.visit_CascadedAssignmentNode  s1    == 	5C##S$((O4	5r!   )r&   r'   r(   r   r8  r:  r>  r)   r*   s   @r    r4  r4    s    (65r!   r4  c                      e Zd Zd Zd Zd Zd Zd Zd-dZd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd-dZd Zd Zd Zd Z d  Z!d! Z"d" Z#d# Z$d$ Z%d% Z&d& Z'd' Z(d( Z)d) Z*d* Z+d+ Z,d, Z-y).ControlFlowAnalysisc                    t               | _        t               | _        t	               | _        d| _        g | _        |j                  | _	        g | _
        t               | _        | j                  |       t        | j                  | j                         | j                  d   }|rL| j                  d   }t!        |d      }	 | j                  j#                  |d|       |j%                          |S |S # |j%                          w xY w)NFcontrol_flow.dot_outputzcontrol_flow.dot_annotate_defswtmodule)r   )r   gv_ctxr   constant_folderr0   
reductionsin_inplace_assignment	env_stackr   envstackrS   r
  visitchildrenr2  current_directivesopenr   close)r   rv   
dot_outputr   r   s        r    visit_ModuleNodez$ControlFlowAnalysis.visit_ModuleNode  s    k.0 %%*"::
M	4 $))T%<%<=,,-FG
 334TUMj$'B""2x}"M
t 
s   C3 3Dc                 h   |j                   D ]   }|j                  s| j                  |       " | j                  |d       | j                  j	                  | j
                         |j                  | _        | j                  j	                  | j                         t               | _        |j                  j                  j                         D ]C  }| j                  j                  |      s| j                  j                  j                  |       E | j                  |       | j                  j                          |j                   D ]  }| j!                  |        |j"                  rT| j                  j%                  |j"                  t'        t(        j*                  d      |j"                  j,                         |j.                  rT| j                  j%                  |j.                  t'        t(        j0                  d      |j.                  j,                         | j!                  |j2                         |j4                  r%| j!                  |j6                  j2                         | j                  j8                  r9| j                  j8                  j;                  | j                  j<                         | j                  j?                          tA        | j                  | jB                         | j                  jD                  j                  | j                  jF                         | jH                  j                  tK        |j                  jL                  | j                               | j                  jO                         | _        | j                  jO                         | _        |S )N)
decoratorsFr+   )(argsdefaultrL  rI  rz   rJ  local_scoperK  r
  rS   rV   r   rj   rE   rw   r_   _visitstar_argr   r   r   
tuple_typeri   starstar_arg	dict_typebodyis_generatorgbodyrG   rH   rZ   r   r2  rM  rU   rY   rE  r  r   r   r   rv   argri   s       r    visit_FuncDefNodez%ControlFlowAnalysis.visit_FuncDefNode  s   99 	(C{{""3'	( 	41dhh'##

$))$M	 %%--446 	-Eyy##E*		!!%%e,	- 	4 		99 	CKK	==II##DMM$1'2D2D>C%E$(MM$7$79 II##D$5$5$1'2C2C>C%E$($5$5$;$;= 	DIIKK

( 99??IIOO%%dii&:&:; 			$))T%<%<=		TYY2234++00$))<=JJNN$	>>%%'r!   c                 2    d|_         | j                  |      S r   )usedra  ru   s     r    visit_DefNodez!ControlFlowAnalysis.visit_DefNode  s    	%%d++r!   c                     |S r   rJ   ru   s     r    visit_GeneratorBodyDefNodez.ControlFlowAnalysis.visit_GeneratorBodyDefNode      r!   c                     |S r   rJ   ru   s     r    visit_CTypeDefNodez&ControlFlowAnalysis.visit_CTypeDefNode  rg  r!   Nc                    | j                   j                  sy | j                   j                  rb| j                   j                  d   }| j                   j                  j                  |j                         | j                   j                          |st        }|j                  r_|j                  |j                  }n%| j                  j                  |j                        }|y | j                   j                  |||       no|j                  rRt        |j                        D ]9  \  }}|r|j                   rd }n|j#                  |      }| j                  ||       ; n| j%                  |       | j                   j                  rc| j                   j                  d   }| j                   j                  j                  |j                         | j                   j                          y y N)r
  rG   rX   rH   rY   r_   r   is_nameri   rJ  lookupr   r   is_sequence_constructor	enumeraterT  
is_starredinferable_item_noderW  )r   r|   r}   	exc_descrri   r   r`  	item_nodes           r    r   z#ControlFlowAnalysis.mark_assignment  sf   yy99		,,R0IIIOO%%i&;&;<II!C;;yy$		1}II%%c36((#CHH- 53cnn $I # 7 7 :I$$S)45 KK99		,,R0IIIOO%%i&;&;<II!  r!   c                 Z    | j                   d   r| j                  j                  |       yy)z'Mark position if DOT output is enabled.rB  N)rM  r
  rw   ru   s     r    rw   z!ControlFlowAnalysis.mark_position  s(    ""#<=II##D) >r!   c                 ~    |j                   D ]  \  }}|dk7  s| j                  |        | j                  |       |S )N*)r   r   rL  )r   rv   r   targets       r    visit_FromImportStatNodez,ControlFlowAnalysis.visit_FromImportStatNode!  sC     JJ 	-LD&s{$$V,	- 	4 r!   c                     t        d      )NzUnhandled assignment noder   ru   s     r    visit_AssignmentNodez(ControlFlowAnalysis.visit_AssignmentNode(  s    788r!   c                     | j                  |j                         | j                  |j                  |j                         |S r   )rW  r}   r   r|   ru   s     r    r:  z.ControlFlowAnalysis.visit_SingleAssignmentNode+  s/    DHHTXXtxx0r!   c                     | j                  |j                         |j                  D ]  }| j                  ||j                           |S r   )rW  r}   r<  r   r=  s      r    r>  z0ControlFlowAnalysis.visit_CascadedAssignmentNode0  s>    DHH== 	0C  dhh/	0r!   c                     t               }|j                  |       |j                  D ]  \  }}| j                  |        |j                  D ]  \  }}| j	                  ||        |S r   )r4  rL  r*  rW  r   )r   rv   	collectorr|   r}   s        r    visit_ParallelAssignmentNodez0ControlFlowAnalysis.visit_ParallelAssignmentNode6  sk    ')	%!-- 	HCKK	!-- 	+HC  c*	+r!   c                     d| _         | j                  |       d| _         | j                  |j                  | j	                  |j                                      |S rl   )rH  rL  r   r|   rF  create_binop_noderu   s     r    visit_InPlaceAssignmentNodez/ControlFlowAnalysis.visit_InPlaceAssignmentNode?  sM    %)"4 %*"TXXt';';D<R<R<T'UVr!   c                    |j                   D ]  }|j                  r|j                  xs% | j                  j	                  |j
                        }|j                  s|j                  r#t        |j                  d|j
                  z         |j                  s| j                  |       | j                  j                  ||       | j                  |        |S )Nz7can not delete variable '%s' referenced in nested scope)rT  rm  ri   rJ  rn  r   rf   re   r	   r   ignore_nonexistingrW  r
  r   r_  s       r    visit_DelStatNodez%ControlFlowAnalysis.visit_DelStatNodeF  s    99 	!C{{		>TXX__SXX%>##u'9'9#''79>DE ..KK$		''U3C 	! r!   c                     | j                   j                  |j                        }|r>|j                   }| j                  j                  |t        |j                  |      |       |S r   )rJ  rn  r   not_noner
  r   r   r   )r   rv   ri   r   s       r    visit_CArgDeclNodez&ControlFlowAnalysis.visit_CArgDeclNodeU  sQ    		*"mm+KII##mEJJ<eEr!   c                 4   | j                   j                  r|j                  xs% | j                  j	                  |j
                        }|rL| j                   j                  ||       || j                  v r"| j                  st        |j                  d       |S )Nz+Cannot read reduction variable in loop body)r
  rG   ri   rJ  rn  r   r   rG  rH  r	   r   r   s      r    visit_NameNodez"ControlFlowAnalysis.visit_NameNode]  sp    99??JJ<$((//$))"<E		((u5DOO+D4N4N$((GI r!   c                     | j                   j                  rB|j                  D ]3  }| j                  |       | j                   j                  r+d|_         |S  |S r   )r
  rG   r4   rW  is_terminator)r   rv   r   s      r    visit_StatListNodez&ControlFlowAnalysis.visit_StatListNodei  sN    99??

 D!yy)-D&
 r!   c                 J    | j                  |       | j                  |       |S r   )rL  rw   ru   s     r    r8  zControlFlowAnalysis.visit_Noder  s#    4 4 r!   c                     |S r   rJ   ru   s     r    visit_SizeofVarNodez'ControlFlowAnalysis.visit_SizeofVarNodew  rg  r!   c                     |S r   rJ   ru   s     r    visit_TypeidNodez$ControlFlowAnalysis.visit_TypeidNodez  rg  r!   c                 V   | j                   j                         }| j                   j                  }|j                  D ]  }| j                   j	                  |      }| j                  |j                         | j                   j	                          | j                  |j                         | j                   j                  s| j                   j                  j                  |        |j                  rs| j                   j	                  |       | j                  |j                         | j                   j                  r7| j                   j                  j                  |       n|j                  |       |j                  r|| j                   _        |S d | j                   _        |S NrB   )r
  r]   rG   
if_clausesr_   rW  	conditionr\  rH   else_clauser2   )r   rv   r   rB   clauses        r    visit_IfStatNodez$ControlFlowAnalysis.visit_IfStatNode}  s)   YY'')
oo 	6FYY((0FKK(()II!KK$yy		))*5	6 IIv.KK(()yy		))*5Z((DIIO  #DIIOr!   c                    | j                   j                         }| j                   j                         }| j                   j                  j	                  t        ||             |j                  r| j                  |j                         | j                   j                          | j                  |j                         | j                   j                  j                          | j                   j                  rJ| j                   j                  j                  |       | j                   j                  j                  |       |j                  rs| j                   j                  |       | j                  |j                         | j                   j                  r7| j                   j                  j                  |       n|j                  |       |j                  r|| j                   _
        |S d | j                   _
        |S r  )r
  r_   r]   rW   rz   r   r  rW  r\  r   rG   rH   r  r2   r   rv   condition_blockr   s       r    visit_WhileStatNodez'ControlFlowAnalysis.visit_WhileStatNode  sQ   ))--/YY'')
		y_EF>>KK'		DII		99??IIOO%%o6IIOO%%j1II7KK(()yy		))*5%%j1(DIIO  #DIIOr!   c                    d}|j                   j                  }|j                  }t        |t        j
                        r|j                  }|j                  p|j                  rc| j                  j                  |j                        }|r|j                  r/|j                  dk(  r(t        |j                        dk(  r|j                  d   }n|j                  dk(  rt        |j                        dk(  r|j                  rt        |j                        dk(  r|j                  d   }|j                  r|j!                  | j                        }|j"                  rk| j%                  |j                  d   t	        j&                  |j(                  dt*        j,                               |j                  d   }|j                  d   }t        |t        j
                        r |j                  }|j                  |j                  r| j                  j                  |j                        }|r|j                  r|j                  d	v rd
}|j                  d d D ]  }	| j%                  ||	        t        |j                        dkD  r[| j%                  || j/                  t	        j0                  |j(                  d|j                  d   |j                  d                      |s| j%                  ||j2                         y y )NFreversedr   r   rp  rt   PY_SSIZE_T_MAX)valuer   )rangexrangeT+)iteratorsequencerx  r   r   SimpleCallNodefunctionr   rm  rJ  rn  r   
is_builtinr   rT  ro  r   is_builtin_typer   IntNoder   r   c_py_ssize_t_typerF  
binop_nodeitem)
r   rv   
is_specialr  rx  r  ri   r  iterator_typer`  s
             r    mark_forloop_targetz'ControlFlowAnalysis.mark_forloop_target  sd   
==))h	 8 89((H}}$)9)96 0 0}}
2s8==7IQ7N#+==#3!+5#hmm:LPQ:Q!99c&++>NRS>S'/}}Q'7H'//080C0CDHH0M#0#@#@$($8$8(.A(1(9(9&**L\?I?[?[)]%^ .4[[^F/7}}Q/?Hh	 8 89((H}}$)9)96 0 0}}(;;%)
#+==!#4 >C 00=>x}}-1 009M9M ) 4 4TXX585=]]15E5=]]15E!G:H I    3 r!   c                 $    | j                  |      S r   )visit_ForInStatNoderu   s     r    visit_AsyncForStatNodez*ControlFlowAnalysis.visit_AsyncForStatNode  s    ''--r!   c                 p   | j                   j                         }| j                   j                         }| j                   j                  j	                  t        ||             | j                  |j                         | j                   j                          t        |t        j                        r| j                  |       n\t        |t        j                        r'| j                  |j                  |j                         n| j                  |j                         t        |t        j                         r'| j#                  ||j                  j$                         | j                   j                          | j                  |j&                         | j                   j                  j)                          | j                   j*                  r%| j                   j*                  j-                  |       |j.                  rs| j                   j                  |       | j                  |j.                         | j                   j*                  r7| j                   j*                  j-                  |       n|j-                  |       |j0                  r|| j                   _        |S d | j                   _        |S )N)excluder  )r
  r_   r]   rW   rz   r   rW  r  r   r   ForInStatNoder  AsyncForStatNoder   rx  r  ParallelRangeNode_delete_privatesri   r\  r   rG   rH   r  r2   r  s       r    r  z'ControlFlowAnalysis.visit_ForInStatNode  s   ))--/YY'')
		y_EFDMM"		dE//0$$T*e445  dii8  - dE334!!$0A0A!B		DII		 99??IIOO%%o6II7KK(()yy		))*5%%j1(DIIO  #DIIOr!   c                     |j                   D ]9  }|r|j                  |us| j                  j                  ||j                         ; y r   )assigned_nodesri   r
  r   )r   rv   r  private_nodes       r    r  z$ControlFlowAnalysis._delete_privates  sC     // 	JLl00?		''l6H6HI	Jr!   c                 f   | j                   }t        |j                  d      rt        |      | _         |j                  D ]W  }d|j
                  _        |j                  |j
                     \  }}|s3| j                   j                  |j
                         Y | j                  |      }|| _         |S )Nri   T)
rG  hasattrrx  r0   r  ri   rg   r*  rE   r  )r   rv   rG  r  r   	reductions         r    visit_ParallelRangeNodez+ControlFlowAnalysis.visit_ParallelRangeNode  s    __
 4;;(!*oDO $ 3 3 <<@""9!%!1!1,2D2D!EYOO''(:(:;	< ++D1D$r!   c                     |j                   D ]  }d|j                  _         | j                  |       | j	                  |       | j                  |       |S r   )r  ri   rg   r  rL  )r   rv   r  s      r    visit_ParallelWithBlockNodez/ControlFlowAnalysis.visit_ParallelWithBlockNode.  sV     // 	=L8<L5	= 	d#4 d#r!   c                    | j                   j                         }| j                   j                         }| j                   j                  j	                  t        ||             | j                  |j                         | j                  |j                         |j                  | j                  |j                         | j                   j                          | j                  |j                  |j                         |j                  _| j                  |j                  | j                  t        j                  |j                  d|j                  |j                                     | j                   j                          | j                  |j                          | j                   j                  j#                          | j                   j$                  r%| j                   j$                  j'                  |       |j(                  rs| j                   j                  |       | j                  |j(                         | j                   j$                  r7| j                   j$                  j'                  |       n|j'                  |       |j*                  r|| j                   _        |S d | j                   _        |S )Nr  r  )r
  r_   r]   rW   rz   r   rW  bound1bound2stepr   rx  rF  r   r  r   r\  r   rG   rH   r  r2   r  s       r    visit_ForFromStatNodez)ControlFlowAnalysis.visit_ForFromStatNode8  s   ))--/YY'')
		y_EFDKK DKK 99 KK		"		T[[$++699   d.B.B$$TXXsDKKK/M N 			DII		99??IIOO%%o6II7KK(()yy		))*5%%j1(DIIO  #DIIOr!   c                     t        d      )NzGeneric loops are not supportedr{  ru   s     r    visit_LoopNodez"ControlFlowAnalysis.visit_LoopNode]  s    =>>r!   c                 f    | j                  |j                  |j                  j                         |S r   )r   r|   	with_node
enter_callru   s     r    "visit_WithTargetAssignmentStatNodez6ControlFlowAnalysis.visit_WithTargetAssignmentStatNode`  s%    TXXt~~'@'@Ar!   c                     | j                  |j                         | j                  |j                         | j                  |j                         |S r   )rW  managerr  r\  ru   s     r    visit_WithStatNodez&ControlFlowAnalysis.visit_WithStatNoded  s7    DLL!DOO$DIIr!   c                 z   | j                   j                         }| j                   j                          | j                   j                         }| j                   j                  j                  t	        |             | j                   j                          | j                   j                  j                  |       | j                   j                          | j                  |j                         | j                   j                  j                          | j                   j                  r||j                  r5| j                   j                          | j                  |j                         | j                   j                  r%| j                   j                  j                  |       |j                  D ]  }|| j                   _        |j                  r#|j                  D ]  }| j                  |        n	 | j                   j                  | j                   j                        }| j                   j                          |j                  r| j                  |j                         | j                  |j                         | j                   j                  s| j                   j                  j                  |        | j                   j                  r2|j                  | j                   j                  d   j                          |j"                  r|| j                   _        |S d | j                   _        |S )Nr  rl  )r
  r]   rX   rz   r   r_   rG   rH   rW  r\  r   r  except_clausespatternrx  r   rY   r2   )r   rv   r   rY   r  r  s         r    visit_TryExceptStatNodez+ControlFlowAnalysis.visit_TryExceptStatNodej  s-   YY'')
		ii((*		##N;$?@		 			!!+.		DII		  " 99??		##%D,,-yy		))*5)) 	6F)DIIO~~%~~ )GKK() )),,DIIOO,DKII!}}$$V]]3KK$yy		))*5	6  99!!$))"6"6r":"F"FG(DIIO  #DIIOr!   c                    | j                   j                         }| j                   j                         }|| j                   _        | j	                  |j
                         | j                   j                  r\| j                   j                  rF| j                   j                  j                  | j                   j                  d   j                         | j                   j                         }|| j                   _        | j	                  |j                         | j                   j                  }t        |||      }| j                   j                  j                  |       | j                   j                  r2| j                   j                  d   j                  j                  |       || j                   _        |j                  |       | j                   j                          | j	                  |j                         | j                   j                  j                          | j                   j                  r1| j                   j                  d   j                  j                          | j                   j                  re| j                   j                  j                  |       |r-| j                   j                  |      | j                   _        |S d | j                   _        |S )Nrl  r  )r
  r_   r]   rG   rW  finally_except_clauserX   rH   rY   finally_clauser   rz   rW   r\  r   )r   rv   
body_blockrY   r   r   descrs          r    visit_TryFinallyStatNodez,ControlFlowAnalysis.visit_TryFinallyStatNode  s   YY((*
 ii((*%		D../99??tyy33IIOO%%dii&:&:2&>&J&JK 		**,'		D''(yy{M<H		##E*99??IIOOB**11%8$		[)		DII		  "99??IIOOB**..099??IIOO%%m4"&))"5"5\"5"J		  #'		r!   c                 $   | j                  |       | j                  |       | j                  j                  rF| j                  j                  j                  | j                  j                  d   j                         d | j                  _        |S rk  )rw   rL  r
  rX   rG   rH   rY   ru   s     r    visit_RaiseStatNodez'ControlFlowAnalysis.visit_RaiseStatNode  sf    4 4 99IIOO%%dii&:&:2&>&J&JK		r!   c                    | j                  |       | j                  j                  rF| j                  j                  j	                  | j                  j                  d   j
                         d | j                  _        |S rk  )rw   r
  rX   rG   rH   rY   ru   s     r    visit_ReraiseStatNodez)ControlFlowAnalysis.visit_ReraiseStatNode  sX    4 99IIOO%%dii&:&:2&>&J&JK		r!   c                    | j                  |       | j                  |       t        | j                  j                  d d d         }|D ]  }|j
                  s| j                  j                  j                  |j
                         |j                  rR| j                  j                  }|D ]  }|j
                  s|j
                  } n |j                  j                  |        nP | j                  j                  r9| j                  j                  j                  | j                  j                         d | j                  _        |S rk  )
rw   rL  iterr
  rX   r   rG   rH   r   rZ   )r   rv   outer_exception_handlershandlerrZ   next_handlers         r    visit_ReturnStatNodez(ControlFlowAnalysis.visit_ReturnStatNode  s   4 4 #'		(<(<TrT(B#C / 	@G$$		))'*?*?@''!%!5!5J(@ "'55)5)C)CJ!" ((22:>	@ yy		))$))*>*>?		r!   c                    | j                   j                  s|S | j                   j                  d   }| j                  |       |j                  d d d   D ]p  }|j                  s| j                   j
                  j                  |j                         |j                  r%|j                  j                  |j                          n0 | j                   j
                  j                  |j                         d | j                   _        |S rk  )	r
  rW   rw   rX   r   rG   rH   r   r   r   rv   loop	exceptions       r    visit_BreakStatNodez'ControlFlowAnalysis.visit_BreakStatNode      yyKyyr"4 2. 	7I&&		)))*A*AB))**44T__E	7 IIOO%%doo6		r!   c                    | j                   j                  s|S | j                   j                  d   }| j                  |       |j                  d d d   D ]p  }|j                  s| j                   j
                  j                  |j                         |j                  r%|j                  j                  |j                          n0 | j                   j
                  j                  |j                         d | j                   _        |S rk  )	r
  rW   rw   rX   r   rG   rH   r   r   r  s       r    visit_ContinueStatNodez*ControlFlowAnalysis.visit_ContinueStatNode  r  r!   c                    |j                   r6| j                  j                  | j                         |j                   | _        | j	                  |j
                         |j                   r| j                  j                         | _        |S r   )
expr_scoperI  rz   rJ  rW  r  r   ru   s     r    visit_ComprehensionNodez+ControlFlowAnalysis.visit_ComprehensionNode  sZ    ??NN!!$((+DHDII??~~))+DHr!   c                    |j                   r6| j                  j                  | j                         |j                   | _        | j	                  |       |j                   r| j                  j                         | _        |S r   )r  rI  rz   rJ  rL  r   ru   s     r    visit_ScopedExprNodez(ControlFlowAnalysis.visit_ScopedExprNode  sX    ??NN!!$((+DH4 ??~~))+DHr!   c                    | j                  |d       | j                  j                  |j                  |j                  | j
                  j                  |j                               | j                  j                  | j
                         |j                  | _        | j                  j                          | j                  |d       | j                  j                          | j                  j                         | _        |S )N)dict	metaclassmkwbasesclass_result)r\  )rL  r
  r   rx  classobjrJ  rn  r   rI  rz   r   r_   r   ru   s     r    visit_PyClassDefNodez(ControlFlowAnalysis.visit_PyClassDefNode  s    4 "B 	C		!!$++t}}"&((//$))"<	>dhh'::		4+		>>%%'r!   c                     |j                   j                  r | j                  |j                   t               | j	                  |       |S r   )operandrm  r   r   rL  ru   s     r    visit_AmpersandNodez'ControlFlowAnalysis.visit_AmpersandNode(  s6    <<  }=4 r!   r   ).r&   r'   r(   rQ  ra  rd  rf  ri  r   rw   ry  r|  r:  r>  r  r  r  r  r  r  r8  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   rJ   r!   r    r@  r@    s    41f,"B*
9


4<04d.*XJ
&#J?/b#J.""r!   r@  )/
__future__r   cythondeclareobjectr   r   r   r   r   r   r   r   Visitorr   r   Errorsr	   r
   r   Optimizer   ExprNoder   r   r   r-   rL   rO   rS   r   r   ry   r   r   r   r   r   r   r   r   r   r  r  r2  r4  r@  rJ   r!   r    <module>r	     sv   &  &F&V66$v!vO
     8  1 1 1 %*I&& * N=./4 6 4 n V 
|*& |*~ )V )"V "<~ $~ > *F *Bf B	FF 	Ft >&= &=R <) )&C8L5+ 5 K
/ K
r!   