U
    {±ËhòÆ  ã                   @   sØ  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ƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"ƒZG d#d$„ d$ƒZG d%d&„ d&ƒZ G d'd(„ d(e!ƒZ"G d)d*„ d*ƒZ#G d+d,„ d,ƒZ$G d-d.„ d.ƒZ%e j&ee'd/œd0d1„ƒZ(G d2d3„ d3e
ƒZ)G d4d5„ d5eƒZ*dS )6é    N)Ú
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 ƒ  |¡ || _|| _d S ©N)ÚsuperÚ__init__ÚtypeÚ_may_be_none)Úselfr   Úmay_be_noneÚpos©Ú	__class__© ú?/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/FlowControl.pyr      s    zTypedExprNode.__init__c                 C   s
   | j dkS ©NF)r   ©r   r   r   r   r      s    zTypedExprNode.may_be_none)NN)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r   r   r      s   r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚControlBlocka¢  Control flow graph node. Sequence of assignments and name references.

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

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

       Example:

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

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

    c                 C   sN   t ƒ | _t ƒ | _t ƒ | _g | _i | _t ƒ | _d| _d| _d| _	d| _
d| _d S ©Nr   )ÚsetÚchildrenÚparentsÚ	positionsÚstatsÚgenÚboundedÚi_inputÚi_outputÚi_genÚi_killÚi_stater   r   r   r   r   9   s    zControlBlock.__init__c                 C   s   | j  o| j S r   )r'   r&   r   r   r   r   ÚemptyH   s    zControlBlock.emptyc                 C   sH   | j D ]}|j | ¡ q| jD ]}|j  | ¡ q| j ¡  | j  ¡  dS )z'Detach block from parents and children.N)r$   r%   ÚremoveÚclear)r   ÚchildÚparentr   r   r   ÚdetachK   s    


zControlBlock.detachc                 C   s   | j  |¡ |j | ¡ d S r   )r$   Úaddr%   ©r   Úblockr   r   r   Ú	add_childT   s    zControlBlock.add_childN)r   r   r   Ú__doc__r   r/   r4   r8   r   r   r   r   r!   "   s
   	r!   c                   @   s   e Zd ZdZdd„ ZdS )Ú	ExitBlockzNon-empty exit point block.c                 C   s   dS r   r   r   r   r   r   r/   \   s    zExitBlock.emptyN)r   r   r   r9   r/   r   r   r   r   r:   Y   s   r:   c                   @   s   e Zd Zdd„ ZdS )ÚAssignmentListc                 C   s
   g | _ d S r   )r'   r   r   r   r   r   a   s    zAssignmentList.__init__N©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 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_pointr5   r7   Úin_try_blockr   r   r   r   r   r   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!   r>   r5   r8   ©r   r3   r7   r   r   r   Únewblock~   s
    
zControlFlow.newblockc                 C   s@   t ƒ }| j |¡ |r"| |¡ n| jr4| j |¡ || _| jS )z|Create block children block linked to current or `parent` if given.

           NOTE: Block is added to self.blocks
        )r!   r>   r5   r8   r7   rE   r   r   r   Ú	nextblock‰   s    zControlFlow.nextblockc                 C   s.   |j r
dS |jp,|jp,|jp,|jp,|jp,|jS r   )Zis_anonymousÚis_localÚis_pyclass_attrÚis_argÚfrom_closureÚ
in_closureÚerror_on_uninitialized©r   Úentryr   r   r   Ú
is_tracked—   s    ÿÿþzControlFlow.is_trackedc                 C   sB   |j r>|jr>|jjs:|jjs:|jjs:|jjs:|jjr>|js>dS dS ©NTF)	rH   Zis_variabler   Zis_struct_or_unionZ
is_complexZis_arrayZis_cython_lock_typeZis_cpp_classZis_cpp_optionalrN   r   r   r   Úis_statically_assignedž   s    ÿþýüûûz"ControlFlow.is_statically_assignedc                 C   s"   | j r| j j |jdd… ¡ dS )z0Mark position, will be used to draw graph nodes.Né   )r7   r&   r5   r   ©r   Únoder   r   r   Úmark_position©   s    zControlFlow.mark_positionc                 C   sJ   | j rF|  |¡rFt||||d}| j j |¡ || j j|< | j |¡ d S )N©Ú	rhs_scope)r7   rP   ÚNameAssignmentr'   Úappendr(   r?   r5   )r   ÚlhsÚrhsrO   rX   Ú
assignmentr   r   r   Úmark_assignment®   s
    zControlFlow.mark_assignmentc                 C   sF   | j rB|  |¡rBt|||ƒ}| j j |¡ || j j|< | j |¡ d S r   )r7   rP   ÚArgumentr'   rZ   r(   r?   r5   )r   r[   r\   rO   r]   r   r   r   Úmark_argumentµ   s
    zControlFlow.mark_argumentc                 C   sD   | j r@|  |¡r@t||ƒ}| j j |¡ t| j j|< | j |¡ d S r   )	r7   rP   ÚNameDeletionr'   rZ   ÚUninitializedr(   r?   r5   )r   rU   rO   r]   r   r   r   Úmark_deletion¼   s
    
zControlFlow.mark_deletionc                 C   s4   | j r0|  |¡r0| j j t||ƒ¡ | j |¡ d S r   )r7   rP   r'   rZ   ÚNameReferencer?   r5   ©r   rU   rO   r   r   r   Úmark_referenceÃ   s    zControlFlow.mark_referencec                 C   sÄ   | j h}tƒ }|rD| ¡ }| |¡ |jD ]}||kr*| |¡ q*q| j| }|D ]}| ¡  qR| | j ¡ |D ]@}| ¡ rp|j	D ]}|jD ]}| 
|¡ qŒq‚| ¡  | |¡ qp|  j|8  _dS )z%Delete unreachable and orphan blocks.N)rB   r#   Úpopr5   r$   r>   r4   r0   r/   r%   r8   )r   ÚqueueÚvisitedÚrootr2   Zunreachabler7   r3   r   r   r   Ú	normalizeÍ   s(    





zControlFlow.normalizec                 C   sT  i | _ d}| jD ](}tƒ }| |_|_|| j |< |dK }q| jD ]N}|jD ]B}t|tƒrJ||_| j |j	 }|j 
|¡ | j|O  _|dK }qJq@| jD ]ˆ}|j ¡ D ]L\}}| j | }|tkrÐ| j|jO  _n| j|jO  _| j|jO  _q¤|j|_|jD ]}| j| j | jO  _q q–| j  ¡ D ]}| j j|jO  _q*| jj| j_dS )z+Set initial state, map assignments to bits.r   N)Úassmtsr?   r;   ÚmaskÚbitr>   r'   Ú
isinstancerY   rO   rZ   r(   Úitemsrb   r,   r-   r+   r)   ÚvaluesrB   )r   rn   rO   rl   r7   Ústatr   r   r   Ú
initializeé   s8    








zControlFlow.initializec                 C   st   t ƒ }| j| }||j@ rP|  |¡r4| t|ƒ¡ n|jrF| t¡ n
| t¡ |j	D ]}||j@ rV| |¡ qV|S r   )
r#   rl   rn   rR   r5   ÚStaticAssignmentrK   ÚUnknownrb   r'   )r   ZistaterO   Úretrl   Úassmtr   r   r   Úmap_one  s    





zControlFlow.map_onec                 C   sd   d}|r`d}| j D ]J}d}|jD ]}||jO }q ||j @ |jB }||jkrPd}||_||_qqdS )z(Per-block reaching definitions analysis.TFr   N)r>   r%   r+   r-   r,   r*   )r   Zdirtyr7   r*   r3   r+   r   r   r   Úreaching_definitions   s    


z ControlFlow.reaching_definitions)N)N)N)r   r   r   r9   r   rF   rG   rP   rR   rV   r^   r`   rc   rf   rk   rs   rx   ry   r   r   r   r   r=   e   s   



&r=   c                   @   s   e Zd Zdd„ ZdS )Ú	LoopDescrc                 C   s   || _ || _g | _d S r   )Ú
next_blockÚ
loop_blockrA   )r   r{   r|   r   r   r   r   4  s    zLoopDescr.__init__Nr<   r   r   r   r   rz   3  s   rz   c                   @   s   e Zd ZdZddd„ZdS )ÚExceptionDescrzßException 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   )rB   Úfinally_enterÚfinally_exit)r   rB   r~   r   r   r   r   r   B  s    zExceptionDescr.__init__)NN)r   r   r   r9   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 )rY   Nc                 C   sP   |j d krtƒ |_ || _|| _|| _|j| _tƒ | _d| _d| _d | _	|| _
d S r   )Úcf_stater#   r[   r\   rO   r   ÚrefsrJ   Úis_deletionÚinferred_typerX   )r   r[   r\   rO   rX   r   r   r   r   I  s    
zNameAssignment.__init__c                 C   s   d| j j| jf S ©Nz%s(entry=%r)©r   r   rO   r   r   r   r   Ú__repr__W  s    zNameAssignment.__repr__c                 C   s   | j  | jp| jj¡| _| jS r   )r\   Ú
infer_typerX   rO   Úscoperƒ   r   r   r   r   r‡   Z  s    zNameAssignment.infer_typec                 C   s   | j  | jp| jj¡S r   )r\   Útype_dependenciesrX   rO   rˆ   r   r   r   r   r‰   ^  s    z NameAssignment.type_dependenciesc                 C   s   | j jjs| j jS | jS r   )rO   r   Úis_unspecifiedrƒ   r   r   r   r   r   a  s    
zNameAssignment.type)N)	r   r   r   r   r†   r‡   r‰   Úpropertyr   r   r   r   r   rY   H  s   
rY   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )rt   z7Initialised at declaration time, e.g. stack allocation.c                    s8   |j jsd}nd }t|j ||jd}tƒ  |||¡ d S )NF©r   r   )r   Úis_pyobjectr   r   r   r   )r   rO   r   r[   r   r   r   r   j  s      ÿzStaticAssignment.__init__c                 C   s   | j jS r   )rO   r   r   r   r   r   r‡   s  s    zStaticAssignment.infer_typec                 C   s   dS )Nr   r   r   r   r   r   r‰   v  s    z"StaticAssignment.type_dependencies)r   r   r   r9   r   r‡   r‰   r    r   r   r   r   rt   h  s   	rt   c                   @   s   e Zd Zdd„ ZdS )r_   c                 C   s   t  | |||¡ d| _d S ©NT)rY   r   rJ   )r   r[   r\   rO   r   r   r   r   {  s    zArgument.__init__Nr<   r   r   r   r   r_   z  s   r_   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ra   c                 C   s   t  | |||¡ d| _d S rŽ   )rY   r   r‚   )r   r[   rO   r   r   r   r     s    zNameDeletion.__init__c                 C   s4   | j  | jj¡}|js*| | jj¡r*tjS || _|S r   )	r\   r‡   rO   rˆ   r   Zcan_coerce_to_pyobjectr   Úpy_object_typerƒ   )r   rƒ   r   r   r   r‡   …  s    ÿzNameDeletion.infer_typeN)r   r   r   r   r‡   r   r   r   r   ra   €  s   ra   c                   @   s   e Zd ZdZdS )rb   zDefinitely not initialised yet.N©r   r   r   r9   r   r   r   r   rb   Ž  s   rb   c                   @   s   e Zd ZdZdS )ru   z7Coming from outer closure, might be initialised or not.Nr   r   r   r   r   ru   ’  s   ru   c                   @   s   e Zd Zdd„ Zdd„ ZdS )rd   c                 C   s*   |j d krtƒ |_ || _|| _|j| _d S r   )r€   r#   rU   rO   r   re   r   r   r   r   —  s
    
zNameReference.__init__c                 C   s   d| j j| jf S r„   r…   r   r   r   r   r†   ž  s    zNameReference.__repr__N)r   r   r   r   r†   r   r   r   r   rd   –  s   rd   c                       s0   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚControlFlowStateFc                    sj   t |kr$| t ¡ d| _|sPd| _n,t|kr>| t¡ d| _nt|ƒdkrPd| _tƒ  dd„ |D ƒ¡ d S )NTr   c                 S   s   g | ]}|j tk	r|‘qS r   )r\   r   )Ú.0Úir   r   r   Ú
<listcomp>»  s     
 z-ControlFlowState.__init__.<locals>.<listcomp>)	rb   ÚdiscardÚcf_maybe_nullÚ
cf_is_nullru   ÚlenÚ	is_singler   r   )r   Ústater   r   r   r   ­  s    

ÿzControlFlowState.__init__c                 C   s   | d S r"   r   r   r   r   r   Úone½  s    zControlFlowState.one)	r   r   r   r–   r—   r™   r   r›   r    r   r   r   r   r‘   ¢  s
   r‘   c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	dS )Ú	GVContextzGraphviz subgraph object.c                 C   s   i | _ d| _g | _i | _d S r"   )ÚblockidsÚnextidr$   Úsourcesr   r   r   r   r   Ä  s    zGVContext.__init__c                 C   s   | j  |¡ d S r   )r$   rZ   )r   r2   r   r   r   r5   Ê  s    zGVContext.addc                 C   s2   || j kr(d| j | j |< |  jd7  _| j | S )Nzblock%dr   )r   rž   r6   r   r   r   ÚnodeidÍ  s    
zGVContext.nodeidc                 C   st   |j s
dS t|j ƒ}t|j ƒ}|d }|| jkrBt| ¡ ƒ| j|< | j| }d dd„ ||d d |d … D ƒ¡S )NÚ r   ú\nc                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)r’   Úlr   r   r   r”   Ü  s     z-GVContext.extract_sources.<locals>.<listcomp>r   )r&   ÚminÚmaxrŸ   ÚlistÚ	get_linesÚjoin)r   r7   ÚstartÚstopZsrcdescrÚlinesr   r   r   Úextract_sourcesÓ  s    



zGVContext.extract_sourcesFc                 C   s@   |  d| ¡ |  d¡ | jD ]}| || |¡ q|  d¡ dS )zRender graphviz dot graphzdigraph %s {
z node [shape=box];
z}
N)Úwriter$   Úrender)r   ÚfpÚnameÚannotate_defsr2   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   r9   r   r5   r    r­   r¯   r·   r   r   r   r   rœ   Á  s   
rœ   c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )	ÚGVzGraphviz DOT renderer.c                 C   s   || _ || _d S r   )r±   Úflow)r   r±   r¹   r   r   r   r   í  s    zGV.__init__Fc           	   	   C   s  |  d| j ¡ | jjD ]¤}| |¡}|r’|jD ]`}t|tƒrf|d|jj|j	rRdnd|j
d f 7 }q0t|tƒr0|jr0|d|jj|j
d f 7 }q0|sšd}| |¡}|  d|| |¡f ¡ q| jjD ]2}| |¡}|jD ]}|  d	|| |¡f ¡ qÚqÆ|  d
¡ d S )Nz subgraph %s {
z
 %s [%s %s]ZdeletionZ
definitionr   z
 %s [reference %s]r/   z  %s [label="%s"];
z  %s -> %s;
z }
)r®   r±   r¹   r>   r­   r'   ro   rY   rO   r‚   r   rd   r    r·   r$   )	r   r°   Úctxr²   r7   Úlabelrr   Úpidr2   r   r   r   r¯   ñ  s.    


  ÿ




z	GV.renderN)F)r   r   r   r9   r   r¯   r   r   r   r   r¸   ê  s   r¸   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚMessageCollectionz/Collect error/warnings messages first then sortc                 C   s   t ƒ | _d S r   )r#   Úmessagesr   r   r   r   r   
  s    zMessageCollection.__init__c                 C   s   | j  |d|f¡ d S rŽ   ©r¾   r5   ©r   r   Úmessager   r   r   r
     s    zMessageCollection.errorc                 C   s   | j  |d|f¡ d S r   r¿   rÀ   r   r   r   r     s    zMessageCollection.warningc                 C   s6   t | jƒD ]&\}}}|r$t||ƒ q
t||dƒ q
d S ©NrS   )Úsortedr¾   r
   r   )r   r   Úis_errorrÁ   r   r   r   Úreport  s    zMessageCollection.reportN)r   r   r   r9   r   r
   r   rÅ   r   r   r   r   r½     s
   r½   )r¹   Úcompiler_directivesc                 C   s  |   ¡  |  ¡  tƒ }i }tƒ }| jD  ]þ}|j}|jD ]ì}| j|j }|  ||j¡}	t	|t
ƒrÆ|jj |	¡ | |j¡ ||j @ }|jr˜||jO }n
||jO }| |¡ |jtk	rÄ|jj |¡ q8t	|tƒr8|j||j< |jj |¡ |jj |	¡ |	 t¡ |	 t¡ |	D ]}
|
j |¡ qq8q&|d }|d }|d }|d }tƒ }|D ]X}t|jkrˆd|_t|jƒdkr€d|_ nd|_ n t|jkrœd|_nd|_ d|_qR| !¡ D ]\}}t|jkr²d|_|j"sþt|jƒdkrþ|j#|j$j%krþd|_ |j&s°|j"s°|j's°|j(j)r"nŽ|j r‚|j*s‚|j+sVt,j+rl|j(j-sV|j(j.rl| /|j0d|j# ¡ n| 1|j0d|j# ¡ n.|rÒd	|j# }|j*r¢|d
7 }| 1|j0|¡ n t|jkrÆd|_nd|_ d|_q´|D ]p}
|
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qÚ| j4D ]t}|jsR|j'sR|j#dkr¾|j# 5d¡s¾|j2r¤|r¾| 1|j0d|j# ¡ n|r¾| 1|j0d|j# ¡ d|_3qR| 6¡  |D ]}t7|jƒ|_qÔ|D ]}t7|jƒ|_qìd S )Nzwarn.maybe_uninitializedzwarn.unused_resultzwarn.unusedzwarn.unused_argTr   Fz0local variable '%s' referenced before assignmentz9local variable '%s' might be referenced before assignmentz% (maybe initialized inside a closure)zUnused argument value '%s'zUnused result in '%s'Ú_ZunusedzUnused argument '%s'zUnused entry '%s')8rs   ry   r#   r>   r*   r'   rl   rO   rx   ro   rY   r[   r€   Úupdater5   rm   r‚   rn   r\   r   Zcf_assignmentsrZ   rd   rU   Zcf_referencesr•   rb   ru   r   r½   r–   r˜   r—   rp   rK   r±   rˆ   Zscope_predefined_namesZ
allow_nullrI   r   rÄ   rL   rM   r   r   rŠ   r
   r   r   rJ   Zcf_usedr?   Ú
startswithrÅ   r‘   )r¹   rÆ   ÚassignmentsZ
referencesZassmt_nodesr7   r.   rr   Zi_assmtsrš   rw   Zwarn_maybe_uninitializedZwarn_unused_resultZwarn_unusedZwarn_unused_argr¾   rU   rO   Ú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 ƒ  ¡  g | _d S r   )r   r   rÊ   r   r   r   r   r   ¨  s    
zAssignmentCollector.__init__c                 C   s   |   | d d ¡ d S r   )Z_visitchildrenr   r   r   r   Ú
visit_Node¬  s    zAssignmentCollector.visit_Nodec                 C   s   | j  |j|jf¡ d S r   )rÊ   rZ   r[   r\   rT   r   r   r   Úvisit_SingleAssignmentNode¯  s    z.AssignmentCollector.visit_SingleAssignmentNodec                 C   s"   |j D ]}| j ||jf¡ qd S r   )Úlhs_listrÊ   rZ   r\   ©r   rU   r[   r   r   r   Úvisit_CascadedAssignmentNode²  s    
z0AssignmentCollector.visit_CascadedAssignmentNode)r   r   r   r   rÎ   rÏ   rÒ   r    r   r   r   r   rÍ   §  s   rÍ   c                   @   s˜  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zddd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d8d9„ Zded:d;„Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3dS )fÚControlFlowAnalysisc                 C   s@   || j kr| jS t| jƒD ]\}}||kr|  S qds<t‚d S r   )Úenvr¹   ÚreversedÚstackÚAssertionError)r   rÔ   Úer¹   r   r   r   Úfind_in_stack¹  s    

z!ControlFlowAnalysis.find_in_stackc              	   C   s´   | j d }|rtƒ nd | _ddlm} |ƒ | _tƒ | _d| _|j	| _
tƒ | _g | _ttjdd| _|  |¡ t| j| j ƒ |r°| j d }t|dƒ}| jj|d	|d
 W 5 Q R X |S )Núcontrol_flow.dot_outputr   )ÚConstantFoldingFT©r   zcontrol_flow.dot_annotate_defsÚwÚmodule)r²   )Úcurrent_directivesrœ   Úgv_ctxZOptimizerÛ   Úconstant_folderr#   Ú
reductionsÚin_inplace_assignmentrˆ   rÔ   r=   r¹   rÖ   r   r   r   Úobject_exprÚvisitchildrenrÌ   Úopenr¯   )r   rU   Z
dot_outputrÛ   r²   r°   r   r   r   Úvisit_ModuleNodeÁ  s"    


z$ControlFlowAnalysis.visit_ModuleNodec                 C   s  |j D ]}|jr|  |¡ q|  |d¡ | j | j| jf¡ |j| _tƒ | _|jj	 
¡ D ]}| j |¡rX| jj	 |¡ qX|  |¡ | j ¡  |j D ]}|  |¡ q’|jrÈ| j |jttjdd|jj¡ |jrî| j |jttjdd|jj¡ |  |j¡ |jr|  |jj¡ | jjr,| jj | jj¡ | j ¡  t| j| j ƒ | jj! | jj"¡ | j#d k	rz| j# t$|jj%| jƒ¡ | j &¡ \| _| _|S )N)Z
decoratorsFrÜ   )'ÚargsÚdefaultrå   rÖ   rZ   rÔ   r¹   Zlocal_scoper=   r?   rq   rP   r5   rV   rG   Ú_visitZstar_argr`   r   r   Z
tuple_typerO   Zstarstar_argÚ	dict_typeÚbodyZis_generatorZgbodyr7   r8   rC   rk   rÌ   rß   r>   rB   rà   r¸   r±   rg   ©r   rU   ÚargrO   r   r   r   Úvisit_FuncDefNodeÚ  sP    




ÿý
ÿý

z%ControlFlowAnalysis.visit_FuncDefNodec                 C   s   d|_ |  |¡S rŽ   )Úusedrï   rT   r   r   r   Úvisit_DefNode  s    z!ControlFlowAnalysis.visit_DefNodec                 C   s   |S r   r   rT   r   r   r   Úvisit_GeneratorBodyDefNode  s    z.ControlFlowAnalysis.visit_GeneratorBodyDefNodec                 C   s   |S r   r   rT   r   r   r   Úvisit_CTypeDefNode  s    z&ControlFlowAnalysis.visit_CTypeDefNodeNc           	      C   s*  | j jsd S | j jr:| j jd }| j j |j¡ | j  ¡  |sD| j}|jrŒ|jd k	r\|j}n| j	 
|j¡}|d krvd S | j j||||d nj|jrìt|jƒD ]L\}}|jr¾ttjd|jd}n|| jkrÎ|}n
| |¡}| j|||d qœn
|  |¡ | j jr&| j jd }| j j |j¡ | j  ¡  d S )NéÿÿÿÿrW   FrŒ   )r¹   r7   rA   r8   rB   rG   rä   Úis_namerO   rÔ   Úlookupr±   r^   Úis_sequence_constructorÚ	enumeraterè   Z
is_starredr   r   Z	list_typer   Zinferable_item_noderê   )	r   r[   r\   rX   Z	exc_descrrO   r“   rî   Z	item_noder   r   r   r^     s8    





z#ControlFlowAnalysis.mark_assignmentc                 C   s   | j d r| j |¡ dS )z'Mark position if DOT output is enabled.rÚ   N)rß   r¹   rV   rT   r   r   r   rV   :  s    
z!ControlFlowAnalysis.mark_positionc                 C   s0   |j D ]\}}|dkr|  |¡ q|  |¡ |S )NÚ*)rp   r^   rå   )r   rU   r±   Útargetr   r   r   Úvisit_FromImportStatNode?  s
    
z,ControlFlowAnalysis.visit_FromImportStatNodec                 C   s   t dt|ƒ ƒ‚d S )NzUnhandled assignment node %s)r	   r   rT   r   r   r   Úvisit_AssignmentNodeF  s    z(ControlFlowAnalysis.visit_AssignmentNodec                 C   s    |   |j¡ |  |j|j¡ |S r   )rê   r\   r^   r[   rT   r   r   r   rÏ   I  s    z.ControlFlowAnalysis.visit_SingleAssignmentNodec                 C   s*   |   |j¡ |jD ]}|  ||j¡ q|S r   )rê   r\   rÐ   r^   rÑ   r   r   r   rÒ   N  s    
z0ControlFlowAnalysis.visit_CascadedAssignmentNodec                 C   sJ   t ƒ }| |¡ |jD ]\}}|  |¡ q|jD ]\}}|  ||¡ q0|S r   )rÍ   rå   rÊ   rê   r^   )r   rU   Ú	collectorr[   r\   r   r   r   Úvisit_ParallelAssignmentNodeT  s    
z0ControlFlowAnalysis.visit_ParallelAssignmentNodec                 C   s2   d| _ |  |¡ d| _ |  |j|  | ¡ ¡¡ |S rQ   )rã   rå   r^   r[   rá   Zcreate_binop_noderT   r   r   r   Úvisit_InPlaceAssignmentNode]  s
    
z/ControlFlowAnalysis.visit_InPlaceAssignmentNodec                 C   sr   |j D ]f}|jrb|jp"| j |j¡}|js0|jrBt|j	d|j ƒ |j
sR|  |¡ | j ||¡ q|  |¡ q|S )Nz7can not delete variable '%s' referenced in nested scope)rè   rõ   rO   rÔ   rö   r±   rL   rK   r
   r   Zignore_nonexistingrê   r¹   rc   rí   r   r   r   Úvisit_DelStatNoded  s    
ÿÿ
z%ControlFlowAnalysis.visit_DelStatNodec                 C   s6   | j  |j¡}|r2|j }| j |t|j|ƒ|¡ |S r   )rÔ   rö   r±   Znot_noner¹   r`   r   r   )r   rU   rO   r   r   r   r   Úvisit_CArgDeclNodes  s     
 ÿz&ControlFlowAnalysis.visit_CArgDeclNodec                 C   sN   | j jrJ|jp| j |j¡}|rJ| j  ||¡ || jkrJ| jsJt	|j
dƒ |S )Nz+Cannot read reduction variable in loop body)r¹   r7   rO   rÔ   rö   r±   rf   râ   rã   r
   r   re   r   r   r   Úvisit_NameNode{  s    ÿz"ControlFlowAnalysis.visit_NameNodec                 C   s4   | j jr0|jD ] }|  |¡ | j jsd|_ q0q|S rŽ   )r¹   r7   r'   rê   Zis_terminator)r   rU   rr   r   r   r   Úvisit_StatListNode‡  s    

z&ControlFlowAnalysis.visit_StatListNodec                 C   s   |   |¡ |  |¡ |S r   )rå   rV   rT   r   r   r   rÎ     s    

zControlFlowAnalysis.visit_Nodec                 C   s   |S r   r   rT   r   r   r   Úvisit_SizeofVarNode•  s    z'ControlFlowAnalysis.visit_SizeofVarNodec                 C   s   |S r   r   rT   r   r   r   Úvisit_TypeidNode˜  s    z$ControlFlowAnalysis.visit_TypeidNodec                 C   sÀ   | j  ¡ }| j j}|jD ]H}| j  |¡}|  |j¡ | j  ¡  |  |j¡ | j jr| j j |¡ q|j	rš| j j|d |  |j	¡ | j jr¤| j j |¡ n
| |¡ |j
r´|| j _nd | j _|S ©N©r3   )r¹   rF   r7   Z
if_clausesrG   rê   Ú	conditionrì   r8   Úelse_clauser%   )r   rU   r{   r3   Úclauser   r   r   Úvisit_IfStatNode›  s&    




z$ControlFlowAnalysis.visit_IfStatNodec                 C   s†   |   |¡ | j ¡ }| jj}| j |¡}|  |j¡ | j ¡  |  |j¡ | jjr`| jj |¡ | |¡ |j	rz|| j_nd| j_|S )z@Essentially an if-condition that wraps a RaiseStatNode.
        N)
rV   r¹   rF   r7   rG   rê   r  Ú	exceptionr8   r%   ©r   rU   r{   r3   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rÒ|| j _
nd | j _
|S r  )r¹   rG   rF   r@   rZ   rz   r  rê   rì   rg   r7   r8   r	  r%   ©r   rU   Zcondition_blockr{   r   r   r   Úvisit_WhileStatNodeÉ  s*    




z'ControlFlowAnalysis.visit_WhileStatNodec                 C   sú  d}|j j}|j}|j jp| j}t|tjƒr|j}|j	d kr|j
r| |j¡}|r`|jr|jdkr„t|jƒdkr„|jd }n–|jdkrt|jƒdkr|jrt|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 krÚ|j
rÚ| |j¡}|r\|jrÚ|jd
krÚd}|jd d… D ]}
| j||
|j jd	 qzt|jƒdkrÚ| j||  t |jd|jd |jd ¡¡|j jd	 |sö| j||j|j jd	 d S )NFrÕ   r   r   rø   rS   ZPY_SSIZE_T_MAX)Úvaluer   rW   )ÚrangeÚxrangeTú+)ÚiteratorÚsequencerú   Ú
expr_scoperÔ   ro   r   ZSimpleCallNodeÚfunctionr   rõ   rö   r±   Ú
is_builtinr˜   rè   r÷   r‡   Zis_builtin_typer^   ZIntNoder   r   Zc_py_ssize_t_typerá   Ú
binop_nodeÚitem)r   rU   Z
is_specialr  rú   rÔ   r  rO   r  Ziterator_typerî   r   r   r   Úmark_forloop_targetç  s^    


ÿü


ýÿûz'ControlFlowAnalysis.mark_forloop_targetc                 C   st   |j }|jd d… D ]}|  ||¡ qt|jƒdkr`|  ||  t |jd|jd |jd ¡¡¡ |jsp|  |¡ d S )NrS   r  r   )rú   rè   r^   r˜   rá   r   r  r   )r   rU   rú   rî   r   r   r   Ú mark_parallel_forloop_assignment  s    
ýÿz4ControlFlowAnalysis.mark_parallel_forloop_assignmentc                 C   s
   |   |¡S r   )Úvisit_ForInStatNoderT   r   r   r   Úvisit_AsyncForStatNode*  s    z*ControlFlowAnalysis.visit_AsyncForStatNodec                 C   sV  | j  ¡ }| j  ¡ }| j j t||ƒ¡ |  |j¡ | j  ¡  t|t	j
ƒrV|  |¡ nFt|t	jƒrt|  |j|j¡ n(t|t	jƒrŒ|  |¡ ndsœtt|ƒƒ‚t|t	jƒrº| j||jjd | j  ¡  |  |j¡ | j j ¡  | j jrò| j j |¡ |jr.| j j|d |  |j¡ | j jr8| j j |¡ n
| |¡ |jrJ|| j _nd | j _|S )NF)Úexcluder  )r¹   rG   rF   r@   rZ   rz   rê   r  ro   r   ZForInStatNoder  ZAsyncForStatNoder^   rú   r  ZParallelRangeNoder  r×   r   Ú_delete_privatesrO   rì   rg   r7   r8   r	  r%   r  r   r   r   r  -  s:    






z'ControlFlowAnalysis.visit_ForInStatNodec                 C   s.   |j D ]"}|r|j|k	r| j ||j¡ qd S r   )Úassigned_nodesrO   r¹   rc   )r   rU   r   Úprivate_noder   r   r   r!  [  s    
z$ControlFlowAnalysis._delete_privatesc                 C   sf   | j }t|jdƒr\t|ƒ| _ |jD ].}d|j_|j|j \}}|r"| j  |j¡ q"|  	|¡}|| _ |S )NrO   T)
râ   Úhasattrrú   r#   r"  rO   rM   rÊ   r5   r  )r   rU   râ   r#  r   Z	reductionr   r   r   Úvisit_ParallelRangeNode`  s    


z+ControlFlowAnalysis.visit_ParallelRangeNodec                 C   s6   |j D ]}d|j_q|  |¡ |  |¡ |  |¡ |S rŽ   )r"  rO   rM   r!  rå   )r   rU   r#  r   r   r   Úvisit_ParallelWithBlockNodes  s    




z/ControlFlowAnalysis.visit_ParallelWithBlockNodec                 C   s<  | j  ¡ }| j  ¡ }| j j t||ƒ¡ |  |j¡ |  |j¡ |j	d k	rV|  |j	¡ | j  ¡  |  
|j|j¡ |j	d k	r |  
|j|  t |jd|j|j	¡¡¡ | j  ¡  |  |j¡ | j j ¡  | j jrØ| j j |¡ |jr| j j|d |  |j¡ | j jr| j j |¡ n
| |¡ |jr0|| j _nd | j _|S )Nr  r  )r¹   rG   rF   r@   rZ   rz   rê   Zbound1Zbound2Ústepr^   rú   rá   r   r  r   rì   rg   r7   r8   r	  r%   r  r   r   r   Úvisit_ForFromStatNode}  s8    




ÿ



z)ControlFlowAnalysis.visit_ForFromStatNodec                 C   s   t dƒ‚d S )NzGeneric loops are not supported)r	   rT   r   r   r   Úvisit_LoopNode¢  s    z"ControlFlowAnalysis.visit_LoopNodec                 C   s   |   |j|jj¡ |S r   )r^   r[   Z	with_nodeÚ
enter_callrT   r   r   r   Ú"visit_WithTargetAssignmentStatNode¥  s    z6ControlFlowAnalysis.visit_WithTargetAssignmentStatNodec                 C   s(   |   |j¡ |   |j¡ |   |j¡ |S r   )rê   Úmanagerr*  rì   rT   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rÄ|jr®| j  ¡  |  	|j¡ | j jrÄ| j j |¡ |jD ]|}|| j _|jrô|jD ]}|  	|¡ qân | j j| j jd}| j  ¡  |jr$|  |j¡ |  	|j
¡ | j jrÊ| j j |¡ qÊ| j jrf| | j jd j¡ |jrx|| j _nd | j _|S )Nr   r  rô   )r¹   rF   rA   rZ   r}   rG   r7   r8   rD   rê   rì   rg   r	  Zexcept_clausesÚpatternrú   r^   rB   r%   )r   rU   r{   rB   r
  r.  r   r   r   Úvisit_TryExceptStatNode¯  sF    










z+ControlFlowAnalysis.visit_TryExceptStatNodec                 C   sZ  | j  ¡ }| j  ¡ }|| j _|  |j¡ | j jrP| j jrP| j j | j jd j¡ | j  ¡ }|| j _|  |j	¡ | j j}t
|||ƒ}| j j |¡ | j jr¬| j jd j |¡ || j _| |¡ | j  ¡  | j  jd7  _|  |j¡ | j  jd8  _| j j ¡  | j jr| j jd j ¡  | j jrV| j j |¡ |rN| j j|d| j _nd | j _|S )Nrô   r   r  )r¹   rG   rF   r7   rê   Zfinally_except_clauserA   r8   rB   Zfinally_clauser}   rZ   r@   rD   rì   rg   )r   rU   Z
body_blockrB   r~   r   Údescrr   r   r   Úvisit_TryFinallyStatNodeâ  s:    






z,ControlFlowAnalysis.visit_TryFinallyStatNodec                 C   sN   |   |¡ |  |¡ | jjr4| jj | jjd j¡ d | j_| jjrJd|_|S )Nrô   T)rV   rå   r¹   rA   r7   r8   rB   rD   rT   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ô   )rV   r¹   rA   r7   r8   rB   rT   r   r   r   Úvisit_ReraiseStatNode  s
    
z)ControlFlowAnalysis.visit_ReraiseStatNodec                 C   s¨   |   |¡ |  |¡ t| jjd d d… ƒ}|D ]R}|jr.| jj |j¡ |jr|| jj	}|D ]}|jrZ|j} qpqZ|j |¡  qœq.| jjrœ| jj | jj	¡ d | j_|S r3  )
rV   rå   Úiterr¹   rA   r~   r7   r8   r   rC   )r   rU   Zouter_exception_handlersÚhandlerrC   Znext_handlerr   r   r   Úvisit_ReturnStatNode  s$    

z(ControlFlowAnalysis.visit_ReturnStatNodec                 C   s‚   | j js|S | j jd }|  |¡ |jd d d… D ]2}|jr2| j j |j¡ |jr`|j |j¡  qvq2| j j |j¡ d | j _|S r3  )	r¹   r@   rV   rA   r~   r7   r8   r   r{   ©r   rU   Úloopr  r   r   r   Úvisit_BreakStatNode1  s    
z'ControlFlowAnalysis.visit_BreakStatNodec                 C   s‚   | j js|S | j jd }|  |¡ |jd d d… D ]2}|jr2| j j |j¡ |jr`|j |j¡  qvq2| j j |j¡ d | j _|S r3  )	r¹   r@   rV   rA   r~   r7   r8   r   r|   r8  r   r   r   Úvisit_ContinueStatNodeB  s    
z*ControlFlowAnalysis.visit_ContinueStatNodec                 C   sH   |j r"| j | j| jf¡ |j | _|  |j¡ |j rD| j ¡ \| _}|S r   )r  rÖ   rZ   rÔ   r¹   rê   r9  rg   ©r   rU   rÇ   r   r   r   Úvisit_ComprehensionNodeS  s    z+ControlFlowAnalysis.visit_ComprehensionNodec                 C   sp   t |tjtjfƒst|ƒ‚|jrJ| j | j| j	f¡ |  
|j¡| _	|j| _|  |¡ |jrl| j ¡ \| _| _	|S r   )ro   r   ZIteratorNodeZAsyncIteratorNoder×   r  rÖ   rZ   rÔ   r¹   rÙ   rå   rg   rT   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rn| j |jt|jj¡ |   |d¡ | j ¡  | j ¡ \| _}|S )N)ÚdictÚ	metaclassZmkwÚbasesZclass_result)rì   )rå   r¹   r^   rú   ZclassobjrÔ   rö   r±   rÖ   rZ   rˆ   rG   Zdoc_noder   rO   rg   r<  r   r   r   Úvisit_PyClassDefNodej  s    ÿ

z(ControlFlowAnalysis.visit_PyClassDefNodec                 C   s,   | j  |j| jf¡ |  |¡ | j  ¡  |S r   )rÖ   rZ   rˆ   r¹   rå   rg   rT   r   r   r   Úvisit_CClassDefNodey  s    

z'ControlFlowAnalysis.visit_CClassDefNodec                 C   s$   |j jr|  |j t¡ |  |¡ |S r   )Zoperandrõ   r^   r   rå   rT   r   r   r   Úvisit_AmpersandNode€  s    
z'ControlFlowAnalysis.visit_AmpersandNodec                 C   s‚   t |jƒdkst‚| j ¡ }| jj}|  |j¡ | j ¡  |  |j	¡ | jjr\| jj 
|¡ | 
|¡ |jrv|| j_nd | j_|S rÂ   )r˜   Úsubexprsr×   r¹   rF   r7   rê   Zoperand1rG   Zoperand2r8   r%   r  r   r   r   Úvisit_BoolBinopNode‡  s    



z'ControlFlowAnalysis.visit_BoolBinopNodec                 C   s¨   t |jƒdkst‚|  |j¡ | jj}| j ¡ }| j ¡  |  |j	¡ | jjr\| jj 
|¡ | jj|d |  |j¡ | jjrŒ| jj 
|¡ |jrœ|| j_nd | j_|S )Né   r  )r˜   rE  r×   rê   Útestr¹   r7   rF   rG   Ztrue_valr8   Z	false_valr%   )r   rU   r3   r{   r   r   r   Úvisit_CondExprNode  s     


z&ControlFlowAnalysis.visit_CondExprNode)NN)N)4r   r   r   rÙ   rç   rï   rñ   rò   ró   r^   rV   rû   rü   rÏ   rÒ   rþ   rÿ   r   r  r  r  rÎ   r  r  r  r  r  r  r  r  r  r!  r%  r&  r(  r)  r+  r-  r/  r1  r2  r4  r7  r:  r;  r=  r>  rB  rC  rD  rF  rI  r   r   r   r   rÓ   ·  sb   2
$		5.

%3'

rÓ   )+ZcythonZdeclareÚobjectr¡   r   r   r   r   r   ZVisitorr   r   ZErrorsr
   r   r	   ZExprNoder   Zunspecified_typer   r!   r:   r;   r=   rz   r}   rY   rt   r_   ra   rb   ru   rd   r§   r‘   rœ   r¸   r½   Zcfuncr?  rÌ   rÍ   rÓ   r   r   r   r   Ú<module>   sT        ý
7 O ) 