U
    {h\0                     @   s   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 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ejeZeZG dd dejeZG dd dejZG dd deZdS )   )Nodes)	ExprNodes)Node)AtomicExprNode)
c_ptr_type
c_int_typec                   @   s&   e Zd ZdZdZdddZdd ZdS )
TempHandleNFc                 C   s"   || _ |d kr|j| _n|| _d S N)typeis_pyobjectneeds_cleanup)selfr
   r    r   =/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/UtilNodes.py__init__   s    
zTempHandle.__init__c                 C   s   t || | jdS )N)handler
   )TempRefNoder
   )r   posr   r   r   ref   s    zTempHandle.ref)N)__name__
__module____qualname__tempneeds_xdecrefr   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dZdS )r   c                 C   s   | j | jj kst| S r	   r
   r   AssertionErrorr   envr   r   r   analyse_types"   s    zTempRefNode.analyse_typesc                 C   s   | j | jj kst| S r	   r   r   r   r   r   analyse_target_types&   s    z TempRefNode.analyse_target_typesc                 C   s   d S r	   r   r   r   r   r   analyse_target_declaration*   s    z&TempRefNode.analyse_target_declarationc                 C   s   | j j}|d krd}|S )Nz<error>)r   r   )r   resultr   r   r   calculate_result_code-   s     z!TempRefNode.calculate_result_codec                 C   s   d S r	   r   r   coder   r   r   generate_result_code2   s    z TempRefNode.generate_result_codeFc                 C   sj   | j jr&|| ||  |   |d|  |r>| n||  f  || |	| d S N%s = %s;)
r
   r   make_owned_referenceZput_xdecrefr!   ctypeputln	result_asgenerate_post_assignment_code
free_tempsr   rhsr$   Zoverloaded_assignmentr   r   r   generate_assignment_code5   s    

z$TempRefNode.generate_assignment_codeN)F)	r   r   r   r   r   r    r"   r%   r0   r   r   r   r   r      s   r   c                   @   s>   e Zd ZdZdgZdd Zdd Zdd Zd	d
 Zdd Z	dS )TempsBlockNodea_  
    Creates a block which allocates temporary variables.
    This is used by transforms to output constructs that need
    to make use of a temporary variable. Simply pass the types
    of the needed temporaries to the constructor.

    The variables can be referred to using a TempRefNode
    (which can be constructed by calling get_ref_node).
    bodyc                 C   sz   | j D ]}|jj|j|jd|_q| j| | j D ]@}|jrf|jrV|	|j|j n|
|j|j |j|j q4d S )NZ
manage_ref)Ztemps	funcstateallocate_tempr
   r   r   r2   generate_execution_coder   Zput_xdecref_clearput_decref_clearrelease_temp)r   r$   r   r   r   r   r6   T   s    
 

z&TempsBlockNode.generate_execution_codec                 C   s   | j | d S r	   r2   analyse_declarationsr   r   r   r   r:   a   s    z#TempsBlockNode.analyse_declarationsc                 C   s   | j || _ | S r	   r2   analyse_expressionsr   r   r   r   r<   d   s    z"TempsBlockNode.analyse_expressionsc                 C   s   | j || d S r	   r2   generate_function_definitionsr   r   r$   r   r   r   r>   h   s    z,TempsBlockNode.generate_function_definitionsc                 C   s   | j | d S r	   )r2   annotater#   r   r   r   r@   k   s    zTempsBlockNode.annotateN)
r   r   r   __doc__child_attrsr6   r:   r<   r>   r@   r   r   r   r   r1   B   s   r1   c                   @   s   e Zd Zg ZdZd(ddZdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd)d d!Zd"d# Zd$d% Zd&d' ZdS )*ResultRefNodeFNTc                 C   sh   || _ d | _|| _|d k	r0|j| _t|dd | _|d k	r>|| _|d k	rL|| _|rVd| _| jd k	sdtd S )Nr
   T)
expressionr   may_hold_nonegetattrr
   is_tempr   )r   rD   r   r
   rE   rG   r   r   r   r   v   s    zResultRefNode.__init__c                 C   s   | S r	   r   r   r   r   r   
clone_node   s    zResultRefNode.clone_nodec                 C   s   | j r| j |S dS d S )Nr   )rD   type_dependenciesr   r   r   r   rJ      s    zResultRefNode.type_dependenciesc                 C   s    || _ t|dd }|r|| _d S )Nr
   )rD   rF   r
   )r   rD   r
   r   r   r   update_expression   s    zResultRefNode.update_expressionc                 C   s   d S r	   r   r   r   r   r   r       s    z(ResultRefNode.analyse_target_declarationc                 C   s.   | j d k	r*| j js | j || _ | j j| _| S r	   )rD   r
   r   r   r   r   r   r      s
    

zResultRefNode.analyse_typesc                 C   sJ   | j d k	r| j S | jd k	r:| jj d k	r.| jj S | j|S dsFtdd S )NFz"cannot infer type of ResultRefNode)r
   rD   
infer_typer   r   r   r   r   rL      s    

zResultRefNode.infer_typec                 C   s   | j jsdS | jS )NF)r
   r   rE   rH   r   r   r   may_be_none   s    zResultRefNode.may_be_nonec                 C   s*   | j d k	r| j  S | jd k	r&| jjS dS NT)rD   rM   r
   r   rH   r   r   r   _DISABLED_may_be_none   s
    


z#ResultRefNode._DISABLED_may_be_nonec                 C   s   dS rN   r   rH   r   r   r   	is_simple   s    zResultRefNode.is_simplec                 C   s:   z| j W S  tk
r2   | jd k	r.| j | _ Y nX | j S r	   )result_codeAttributeErrorrD   r!   rH   r   r   r   r!      s    
zResultRefNode.resultc                 C   s   d S r	   r   r#   r   r   r   generate_evaluation_code   s    z&ResultRefNode.generate_evaluation_codec                 C   s   d S r	   r   r#   r   r   r   r%      s    z"ResultRefNode.generate_result_codec                 C   s   d S r	   r   r#   r   r   r   generate_disposal_code   s    z$ResultRefNode.generate_disposal_codec                 C   sp   | j jr,|| | js,||  |   |d|  |rD| n||  f  |	| |
| d S r&   )r
   r   r(   lhs_of_first_assignmentZ
put_decrefr!   r)   r*   r+   r,   r-   r.   r   r   r   r0      s    

z&ResultRefNode.generate_assignment_codec                 C   s   d S r	   r   r   r   r   r   allocate_temps   s    zResultRefNode.allocate_tempsc                 C   s   d S r	   r   r   r   r   r   r8      s    zResultRefNode.release_tempc                 C   s   d S r	   r   r#   r   r   r   r-      s    zResultRefNode.free_temps)NNNTF)F)r   r   r   subexprsrU   r   rI   rJ   rK   r    r   rL   rM   rO   rP   r!   rS   r%   rT   r0   rV   r8   r-   r   r   r   r   rC   o   s(   
		
rC   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )LetNodeMixinc                 C   s   || _ |j| _d S r	   )	lazy_temprD   temp_expression)r   rY   r   r   r   set_temp_expr   s    zLetNodeMixin.set_temp_exprc                 C   s   | j | | j j| _| jjr,t| jj| _| j  | _| jrL| j 	 | _
nh| jjrb| j | n| j | |jj| jdd| _
|d| j
| j 	 f  | j | | j | | j
| j_d S )NTr3   r'   )rZ   rS   r
   	temp_typeZis_arrayr   Z	base_typeZresult_in_temp_result_in_tempr!   r   Zis_memoryviewsliceZmake_owned_memoryviewslicer(   r4   r5   r*   rT   r-   rY   rQ   r#   r   r   r   setup_temp_expr   s$    
 zLetNodeMixin.setup_temp_exprc                 C   sJ   | j r | j| | j| n&| jjr8|| j| j |j	| j d S r	   )
r]   rZ   rT   r-   r\   Zneeds_refcountingr7   r   r4   r8   r#   r   r   r   teardown_temp_expr   s    zLetNodeMixin.teardown_temp_exprN)r   r   r   r[   r^   r_   r   r   r   r   rX      s   rX   c                   @   sT   e Zd ZddgZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )EvalWithTempExprNoderZ   subexpressionc                 C   s&   |  | |j| _|| _| jj| _d S r	   )r[   r   ra   r
   )r   rY   ra   r   r   r   r   	  s    
zEvalWithTempExprNode.__init__c                 C   s   | j |S r	   )ra   rL   r   r   r   r   rL     s    zEvalWithTempExprNode.infer_typec                 C   s
   | j  S r	   )ra   rM   rH   r   r   r   rM     s    z EvalWithTempExprNode.may_be_nonec                 C   s
   | j  S r	   )ra   r!   rH   r   r   r   r!     s    zEvalWithTempExprNode.resultc                 C   s8   | j || _ | j| j  | j|| _| jj| _| S r	   )rZ   r   rY   rK   ra   r
   r   r   r   r   r     s
    
z"EvalWithTempExprNode.analyse_typesc                 C   s   | j | d S r	   )ra   r-   r#   r   r   r   free_subexpr_temps   s    z'EvalWithTempExprNode.free_subexpr_tempsc                 C   s   | j | d S r	   )ra   rT   r#   r   r   r   generate_subexpr_disposal_code#  s    z3EvalWithTempExprNode.generate_subexpr_disposal_codec                 C   s$   |  | | j| | | d S r	   )r^   ra   rS   r_   r#   r   r   r   rS   &  s    
z-EvalWithTempExprNode.generate_evaluation_codeN)r   r   r   rW   r   rL   rM   r!   r   rb   rc   rS   r   r   r   r   r`     s   r`   c                   @   s<   e Zd ZddgZdd Zdd Zdd Zd	d
 Zdd ZdS )LetNoderZ   r2   c                 C   s   |  | |j| _|| _d S r	   )r[   r   r2   )r   rY   r2   r   r   r   r   ;  s    
zLetNode.__init__c                 C   s   | j | | j| d S r	   )rZ   r:   r2   r   r   r   r   r:   @  s    zLetNode.analyse_declarationsc                 C   s    | j || _ | j|| _| S r	   )rZ   r<   r2   r   r   r   r   r<   D  s    zLetNode.analyse_expressionsc                 C   s$   |  | | j| | | d S r	   )r^   r2   r6   r_   r#   r   r   r   r6   I  s    
zLetNode.generate_execution_codec                 C   s    | j || | j|| d S r	   )rZ   r>   r2   r?   r   r   r   r>   N  s    z%LetNode.generate_function_definitionsN)	r   r   r   rB   r   r:   r<   r6   r>   r   r   r   r   rd   /  s   
rd   c                   @   sF   e Zd Zg ZdgZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dS )TempResultFromStatNoder2   c                 C   s&   || _ |j| _|| _|j| _d| _d S )Nr   )
result_refr   r2   r
   rG   )r   rf   r2   r   r   r   r   \  s
    zTempResultFromStatNode.__init__c                 C   s   | j | d S r	   r9   r   r   r   r   r:   c  s    z+TempResultFromStatNode.analyse_declarationsc                 C   s   | j || _ | S r	   r;   r   r   r   r   r   f  s    z$TempResultFromStatNode.analyse_typesc                 C   s
   | j  S r	   )rf   rM   rH   r   r   r   rM   j  s    z"TempResultFromStatNode.may_be_nonec                 C   s   |   | j_| j| d S r	   )r!   rf   rQ   r2   r6   r#   r   r   r   r%   m  s    z+TempResultFromStatNode.generate_result_codec                 C   s   | j || d S r	   r=   r?   r   r   r   r>   q  s    z4TempResultFromStatNode.generate_function_definitionsN)r   r   r   rW   rB   r   r:   r   rM   r%   r>   r   r   r   r   re   S  s   re   c                   @   s,   e Zd ZdZeZdd Zdd Zdd ZdS )	HasNoGilNodez\
    Simple node that evaluates to
    * 0 if gil
    * 1 if nogil
    * 2 if maybe gil
    c                 C   s   | S r	   r   r   r   r   r   r   ~  s    zHasNoGilNode.analyse_typesc                 C   s   d S r	   r   r#   r   r   r   r%     s    z!HasNoGilNode.generate_result_codec                 C   s   t t| jS r	   )strintZin_nogil_contextrH   r   r   r   r"     s    z"HasNoGilNode.calculate_result_codeN)	r   r   r   rA   r   r
   r   r%   r"   r   r   r   r   rg   u  s
   rg   N) r   r   r   r   Z
PyrexTypesr   r   r   r   r1   rC   rX   ZExprNoder`   Z
LetRefNodeZStatNoderd   re   rg   r   r   r   r   <module>   s   $-q#)$"