3
h0                 @   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 ddlmZm	Z	 G dd	 d	e
ZG d
d deZG dd deZG dd deZG dd d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 )    )absolute_import   )Nodes)	ExprNodes)Node)AtomicExprNode)
c_ptr_typec_bint_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   k/var/www/html/CrowdFlow/Picklecon/ble_analysis_env/lib/python3.6/site-packages/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 )N)r   r   AssertionError)r   envr   r   r   analyse_types#   s    zTempRefNode.analyse_typesc             C   s   | j | jj kst| S )N)r   r   r   )r   r   r   r   r   analyse_target_types'   s    z TempRefNode.analyse_target_typesc             C   s   d S )Nr   )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 )Nr   )r   coder   r   r   generate_result_code3   s    z TempRefNode.generate_result_codeFc             C   sj   | j jr&|j| |j| j | j  |jd| j |r>|j n|j| j f  |j| |j	| d S )Nz%s = %s;)
r   r   make_owned_referenceZput_xdecrefr    ctypeputln	result_asgenerate_post_assignment_code
free_temps)r   rhsr"   overloaded_assignmentr   r   r   generate_assignment_code6   s    
 
z$TempRefNode.generate_assignment_codeN)F)	r   r   r   r   r   r   r!   r#   r,   r   r   r   r   r      s   r   c               @   s>   e Zd ZdZd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   s   x$| j D ]}|jj|j|jd|_qW | jj| xJ| j D ]@}|jrl|jr\|j	|j|j n|j
|j|j |jj|j q:W d S )N)
manage_ref)Ztemps	funcstateallocate_tempr   r   r   r.   generate_execution_coder   Zput_xdecref_clearput_decref_clearrelease_temp)r   r"   r   r   r   r   r2   U   s    z&TempsBlockNode.generate_execution_codec             C   s   | j j| d S )N)r.   analyse_declarations)r   r   r   r   r   r5   b   s    z#TempsBlockNode.analyse_declarationsc             C   s   | j j|| _ | S )N)r.   analyse_expressions)r   r   r   r   r   r6   e   s    z"TempsBlockNode.analyse_expressionsc             C   s   | j j|| d S )N)r.   generate_function_definitions)r   r   r"   r   r   r   r7   i   s    z,TempsBlockNode.generate_function_definitionsc             C   s   | j j| d S )N)r.   annotate)r   r"   r   r   r   r8   l   s    zTempsBlockNode.annotateN)
r   r   r   __doc__child_attrsr2   r5   r6   r7   r8   r   r   r   r   r-   C   s   r-   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   r<   r   r   r=   r?   r   r   r   r   w   s    zResultRefNode.__init__c             C   s   | S )Nr   )r   r   r   r   
clone_node   s    zResultRefNode.clone_nodec             C   s   | j r| j j|S f S d S )N)r<   type_dependencies)r   r   r   r   r   rA      s    zResultRefNode.type_dependenciesc             C   s    || _ t|dd }|r|| _d S )Nr   )r<   r>   r   )r   r<   r   r   r   r   update_expression   s    zResultRefNode.update_expressionc             C   s   d S )Nr   )r   r   r   r   r   r      s    z(ResultRefNode.analyse_target_declarationc             C   s.   | j d k	r*| j js | j j|| _ | j j| _| S )N)r<   r   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j|S dsFtdd S )NFz"cannot infer type of ResultRefNode)r   r<   
infer_typer   )r   r   r   r   r   rC      s    

zResultRefNode.infer_typec             C   s   | j jsdS | jS )NF)r   r   r=   )r   r   r   r   may_be_none   s    zResultRefNode.may_be_nonec             C   s*   | j d k	r| j j S | jd k	r&| jjS dS )NT)r<   rD   r   r   )r   r   r   r   _DISABLED_may_be_none   s
    


z#ResultRefNode._DISABLED_may_be_nonec             C   s   dS )NTr   )r   r   r   r   	is_simple   s    zResultRefNode.is_simplec             C   s8   y| j S  tk
r0   | jd k	r,| jj | _ Y nX | j S )N)result_codeAttributeErrorr<   r    )r   r   r   r   r       s    
zResultRefNode.resultc             C   s   d S )Nr   )r   r"   r   r   r   generate_evaluation_code   s    z&ResultRefNode.generate_evaluation_codec             C   s   d S )Nr   )r   r"   r   r   r   r#      s    z"ResultRefNode.generate_result_codec             C   s   d S )Nr   )r   r"   r   r   r   generate_disposal_code   s    z$ResultRefNode.generate_disposal_codec             C   sp   | j jr,|j| | js,|j| j | j  |jd| j |rD|j n|j| j f  |j	| |j
| d S )Nz%s = %s;)r   r   r$   lhs_of_first_assignmentZ
put_decrefr    r%   r&   r'   r(   r)   )r   r*   r"   r+   r   r   r   r,      s    
 
z&ResultRefNode.generate_assignment_codec             C   s   d S )Nr   )r   r   r   r   r   allocate_temps   s    zResultRefNode.allocate_tempsc             C   s   d S )Nr   )r   r   r   r   r   r4      s    zResultRefNode.release_tempc             C   s   d S )Nr   )r   r"   r   r   r   r)      s    zResultRefNode.free_temps)NNNTF)F)r   r   r   subexprsrK   r   r@   rA   rB   r   r   rC   rD   rE   rF   r    rI   r#   rJ   r,   rL   r4   r)   r   r   r   r   r;   p   s(   
		
r;   c               @   s$   e Zd Zdd Zdd Zdd ZdS )LetNodeMixinc             C   s   || _ |j| _d S )N)	lazy_tempr<   temp_expression)r   rO   r   r   r   set_temp_expr   s    zLetNodeMixin.set_temp_exprc             C   s   | j j| | j j| _| jjr,t| jj| _| j j | _| jrL| j j	 | _
nh| jjrb| j j| n| j j| |jj| jdd| _
|jd| j
| j j	 f  | j j| | j j| | j
| j_d S )NT)r/   z%s = %s;)rP   rI   r   	temp_typeZis_arrayr   Z	base_typeZresult_in_temp_result_in_tempr    r   Zis_memoryviewsliceZmake_owned_memoryviewslicer$   r0   r1   r&   rJ   r)   rO   rG   )r   r"   r   r   r   setup_temp_expr   s     
zLetNodeMixin.setup_temp_exprc             C   sJ   | j r | jj| | jj| n&| jjr8|j| j| j |jj	| j d S )N)
rS   rP   rJ   r)   rR   Zneeds_refcountingr3   r   r0   r4   )r   r"   r   r   r   teardown_temp_expr   s    zLetNodeMixin.teardown_temp_exprN)r   r   r   rQ   rT   rU   r   r   r   r   rN      s   rN   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 )EvalWithTempExprNoderP   subexpressionc             C   s&   | j | |j| _|| _| jj| _d S )N)rQ   r   rW   r   )r   rO   rW   r   r   r   r   
  s    
zEvalWithTempExprNode.__init__c             C   s   | j j|S )N)rW   rC   )r   r   r   r   r   rC     s    zEvalWithTempExprNode.infer_typec             C   s
   | j j S )N)rW   rD   )r   r   r   r   rD     s    z EvalWithTempExprNode.may_be_nonec             C   s
   | j j S )N)rW   r    )r   r   r   r   r      s    zEvalWithTempExprNode.resultc             C   s8   | j j|| _ | jj| j  | jj|| _| jj| _| S )N)rP   r   rO   rB   rW   r   )r   r   r   r   r   r     s
    
z"EvalWithTempExprNode.analyse_typesc             C   s   | j j| d S )N)rW   r)   )r   r"   r   r   r   free_subexpr_temps!  s    z'EvalWithTempExprNode.free_subexpr_tempsc             C   s   | j j| d S )N)rW   rJ   )r   r"   r   r   r   generate_subexpr_disposal_code$  s    z3EvalWithTempExprNode.generate_subexpr_disposal_codec             C   s$   | j | | jj| | j| d S )N)rT   rW   rI   rU   )r   r"   r   r   r   rI   '  s    
z-EvalWithTempExprNode.generate_evaluation_codeN)r   r   r   rM   r   rC   rD   r    r   rX   rY   rI   r   r   r   r   rV     s   rV   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 )LetNoderP   r.   c             C   s   | j | |j| _|| _d S )N)rQ   r   r.   )r   rO   r.   r   r   r   r   <  s    
zLetNode.__init__c             C   s   | j j| | jj| d S )N)rP   r5   r.   )r   r   r   r   r   r5   A  s    zLetNode.analyse_declarationsc             C   s    | j j|| _ | jj|| _| S )N)rP   r6   r.   )r   r   r   r   r   r6   E  s    zLetNode.analyse_expressionsc             C   s$   | j | | jj| | j| d S )N)rT   r.   r2   rU   )r   r"   r   r   r   r2   J  s    
zLetNode.generate_execution_codec             C   s    | j j|| | jj|| d S )N)rP   r7   r.   )r   r   r"   r   r   r   r7   O  s    z%LetNode.generate_function_definitionsN)	r   r   r   r:   r   r5   r6   r2   r7   r   r   r   r   rZ   0  s   
rZ   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 )TempResultFromStatNoder.   c             C   s&   || _ |j| _|| _|j| _d| _d S )Nr   )
result_refr   r.   r   r?   )r   r\   r.   r   r   r   r   ]  s
    zTempResultFromStatNode.__init__c             C   s   | j j| d S )N)r.   r5   )r   r   r   r   r   r5   d  s    z+TempResultFromStatNode.analyse_declarationsc             C   s   | j j|| _ | S )N)r.   r6   )r   r   r   r   r   r   g  s    z$TempResultFromStatNode.analyse_typesc             C   s
   | j j S )N)r\   rD   )r   r   r   r   rD   k  s    z"TempResultFromStatNode.may_be_nonec             C   s   | j  | j_| jj| d S )N)r    r\   rG   r.   r2   )r   r"   r   r   r   r#   n  s    z+TempResultFromStatNode.generate_result_codec             C   s   | j j|| d S )N)r.   r7   )r   r   r"   r   r   r   r7   r  s    z4TempResultFromStatNode.generate_function_definitionsN)r   r   r   rM   r:   r   r5   r   rD   r#   r7   r   r   r   r   r[   T  s   r[   c               @   s,   e Zd ZdZeZdd Zdd Zdd ZdS )	
HasGilNodez`
    Simple node that evaluates to 0 or 1 depending on whether we're
    in a nogil context
    c             C   s   | S )Nr   )r   r   r   r   r   r   }  s    zHasGilNode.analyse_typesc             C   s   |j j| _d S )N)r0   Z	gil_ownedhas_gil)r   r"   r   r   r   r#     s    zHasGilNode.generate_result_codec             C   s   | j r
dS dS )N10)r^   )r   r   r   r   r!     s    z HasGilNode.calculate_result_codeN)	r   r   r   r9   r	   r   r   r#   r!   r   r   r   r   r]   v  s
   r]   N)
__future__r    r   r   r   r   Z
PyrexTypesr   r	   objectr
   r   r-   r;   rN   ZExprNoderV   Z
LetRefNodeZStatNoderZ   r[   r]   r   r   r   r   <module>   s   $-q#)$"