
    Aet-                     >   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  G d d	e	      Z
 G d
 de      Z G d de      Z G d de      Z G d d      Z G d dej                  e      ZeZ G d dej$                  e      Z G d dej                        Zy)    )absolute_import   )Nodes)	ExprNodes)Node)AtomicExprNode)
c_ptr_typec                   "    e Zd ZdZdZddZd Zy)
TempHandleNFc                 H    || _         ||j                  | _        y || _        y N)typeis_pyobjectneeds_cleanup)selfr   r   s      9lib/python3.12/site-packages/Cython/Compiler/UtilNodes.py__init__zTempHandle.__init__   s%    	 !%!1!1D!.D    c                 2    t        || | j                        S )N)handler   )TempRefNoder   )r   poss     r   refzTempHandle.ref   s    3t$))<<r   r   )__name__
__module____qualname__tempneeds_xdecrefr   r    r   r   r   r      s    DM/=r   r   c                   2    e Zd Zd Zd Zd Zd Zd ZddZy)	r   c                 P    | j                   | j                  j                   k(  sJ | S r   r   r   r   envs     r   analyse_typeszTempRefNode.analyse_types#        yyDKK,,,,r   c                 P    | j                   | j                  j                   k(  sJ | S r   r"   r#   s     r   analyse_target_typesz TempRefNode.analyse_target_types'   r&   r   c                      y r   r   r#   s     r   analyse_target_declarationz&TempRefNode.analyse_target_declaration+       r   c                 :    | j                   j                  }|d}|S )Nz<error>)r   r   )r   results     r   calculate_result_codez!TempRefNode.calculate_result_code.   s    !!>I6r   c                      y r   r   r   codes     r   generate_result_codez TempRefNode.generate_result_code3   r+   r   c                    | j                   j                  r?|j                  |       |j                  | j	                         | j                                |j                  | j	                         d|r|j	                         n|j                  | j                               d       |j                  |       |j                  |       y N = ;)
r   r   make_owned_referenceput_xdecrefr-   ctypeputln	result_asgenerate_post_assignment_code
free_tempsr   rhsr1   overloaded_assignments       r   generate_assignment_codez$TempRefNode.generate_assignment_code6   s    99  $$T*T[[]DJJL9

KKM1CJJLs}}TZZ\7RR
 	 	))$/tr   NF)	r   r   r   r%   r(   r*   r.   r2   rA   r   r   r   r   r      s     

r   r   c                   4    e Zd ZdZdgZd Zd Zd Zd Zd Z	y)	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                    | j                   D ]8  }|j                  j                  |j                  |j                        |_        : | j                  j                  |       | j                   D ]  }|j                  rY|j                  r'|j                  |j
                  |j                         n&|j                  |j
                  |j                         |j                  j                  |j
                          y )N
manage_ref)temps	funcstateallocate_tempr   r   r   rE   generate_execution_coder   put_xdecref_clearput_decref_clearrelease_temp)r   r1   r   s      r   rL   z&TempsBlockNode.generate_execution_codeU   s    jj 	>F..66(<(< 7 >FK	> 			))$/jj 	5F##''**6;;D))&++v{{CNN''4	5r   c                 :    | j                   j                  |       y r   rE   analyse_declarationsr#   s     r   rR   z#TempsBlockNode.analyse_declarationsb       		&&s+r   c                 F    | j                   j                  |      | _         | S r   rE   analyse_expressionsr#   s     r   rV   z"TempsBlockNode.analyse_expressionse       II11#6	r   c                 <    | j                   j                  ||       y r   )rE   generate_function_definitionsr   r$   r1   s      r   rY   z,TempsBlockNode.generate_function_definitionsi   s    		//T:r   c                 :    | j                   j                  |       y r   )rE   annotater0   s     r   r\   zTempsBlockNode.annotatel   s    		4 r   N)
r   r   r   __doc__child_attrsrL   rR   rV   rY   r\   r   r   r   rD   rD   C   s)     (K5,;!r   rD   c                   ~    e Zd Zg 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dZd Zd Zd Zy)ResultRefNodeFNc                     || _         d | _        || _        |.|j                  | _        t        |d      r|j                  | _        ||| _        ||| _        |rd| _        | j                  J y )Nr   T)
expressionr   may_hold_nonehasattrr   is_temp)r   rb   r   r   rc   re   s         r   r   zResultRefNode.__init__w   sq    $*!!~~DHz6*&OO	?DHDIDLxx###r   c                     | S r   r   r   s    r   
clone_nodezResultRefNode.clone_node   s    r   c                 R    | j                   r| j                   j                  |      S y)Nr   )rb   type_dependenciesr#   s     r   rj   zResultRefNode.type_dependencies   s!    ????44S99r   c                 N    || _         t        |d      r|j                  | _        y y )Nr   )rb   rd   r   )r   rb   s     r   update_expressionzResultRefNode.update_expression   s#    $:v&"DI 'r   c                     | j                   Q| j                   j                  s | j                   j                  |      | _         | j                   j                  | _        | S r   )rb   r   r%   r#   s     r   r%   zResultRefNode.analyse_types   sE    ??&??'' $ = =c Bdo,,DIr   c                     | j                   | j                   S | j                  G| j                  j                   | j                  j                   S | j                  j                  |      S J d       )Nz"cannot infer type of ResultRefNode)r   rb   
infer_typer#   s     r   ro   zResultRefNode.infer_type   s^    99 99??&##/+++??--c22:::r   c                 H    | j                   j                  sy| j                  S )NF)r   r   rc   rg   s    r   may_be_nonezResultRefNode.may_be_none   s    yy$$!!!r   c                     | j                   | j                   j                         S | j                  | j                  j                  S yNT)rb   rq   r   r   rg   s    r   _DISABLED_may_be_nonez#ResultRefNode._DISABLED_may_be_none   s>     ??&??..0099 99(((r   c                      yrs   r   rg   s    r   	is_simplezResultRefNode.is_simple   s    r   c                     	 | j                   S # t        $ r9 | j                  | j                  j                         | _         Y | j                   S w xY wr   )result_codeAttributeErrorrb   r-   rg   s    r   r-   zResultRefNode.result   sN    	<### 	<*#'??#9#9#; 	<s    4AAc                      y r   r   r0   s     r   generate_evaluation_codez&ResultRefNode.generate_evaluation_code   r+   r   c                      y r   r   r0   s     r   r2   z"ResultRefNode.generate_result_code   r+   r   c                      y r   r   r0   s     r   generate_disposal_codez$ResultRefNode.generate_disposal_code   r+   r   c                    | j                   j                  rK|j                  |       | j                  s.|j	                  | j                         | j                                |j                  | j                         d|r|j                         n|j                  | j                               d       |j                  |       |j                  |       y r4   )r   r   r7   lhs_of_first_assignment
put_decrefr-   r9   r:   r;   r<   r=   r>   s       r   rA   z&ResultRefNode.generate_assignment_code   s    99  $$T*//tzz|<

KKM1CJJLs}}TZZ\7RR
 	 	))$/tr   c                      y r   r   r#   s     r   allocate_tempszResultRefNode.allocate_temps   r+   r   c                      y r   r   r#   s     r   rO   zResultRefNode.release_temp   r+   r   c                      y r   r   r0   s     r   r=   zResultRefNode.free_temps   r+   r   )NNNTFrB   )r   r   r   subexprsr   r   rh   rj   rl   r%   ro   rq   rt   rv   r-   r{   r2   r~   rA   r   rO   r=   r   r   r   r`   r`   p   sd     H#$ (
;"
 
r   r`   c                       e Zd Zd Zd Zd Zy)LetNodeMixinc                 4    || _         |j                  | _        y r   )	lazy_temprb   temp_expression)r   r   s     r   set_temp_exprzLetNodeMixin.set_temp_expr   s    "(33r   c                    | j                   j                  |       | j                   j                  | _        | j                  j                  r$t        | j                  j                        | _        | j                   j                         | _        | j                  r | j                   j                         | _
        n| j                   j                  |       |j                  j                  | j                  d      | _
        |j                  | j                  d| j                   j                         d       | j                   j                  |       | j                   j!                  |       | j                  | j"                  _        y )NTrG   r5   r6   )r   r{   r   	temp_typeis_arrayr	   	base_typeresult_in_temp_result_in_tempr-   r   r7   rJ   rK   r:   r~   r=   r   rx   r0   s     r   setup_temp_exprzLetNodeMixin.setup_temp_expr   s   55d;--22>>""'(@(@ADN#33BBD,,335DI  55d;444 5 1DIJJTYY0D0D0K0K0MNO  77=  ++D1%)YY"r   c                 L   | j                   r7| j                  j                  |       | j                  j                  |       y | j                  j
                  r&|j                  | j                  | j                         |j                  j                  | j                         y r   )
r   r   r~   r=   r   r   rN   r   rJ   rO   r0   s     r   teardown_temp_exprzLetNodeMixin.teardown_temp_expr   sn      77=  ++D1~~))%%dii@NN''		2r   N)r   r   r   r   r   r   r   r   r   r   r      s    4/"3r   r   c                   D    e Zd ZddgZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zy)EvalWithTempExprNoder   subexpressionc                     | j                  |       |j                  | _        || _        | j                  j                  | _        y r   )r   r   r   r   )r   r   r   s      r   r   zEvalWithTempExprNode.__init__  s8    9% $$*&&++	r   c                 8    | j                   j                  |      S r   )r   ro   r#   s     r   ro   zEvalWithTempExprNode.infer_type  s    !!,,S11r   c                 6    | j                   j                         S r   )r   rq   rg   s    r   rq   z EvalWithTempExprNode.may_be_none  s    !!--//r   c                 6    | j                   j                         S r   )r   r-   rg   s    r   r-   zEvalWithTempExprNode.result  s    !!((**r   c                    | j                   j                  |      | _         | j                  j                  | j                          | j                  j                  |      | _        | j                  j
                  | _        | S r   )r   r%   r   rl   r   r   r#   s     r   r%   z"EvalWithTempExprNode.analyse_types  sd    #33AA#F(()=)=>!//==cB&&++	r   c                 :    | j                   j                  |       y r   )r   r=   r0   s     r   free_subexpr_tempsz'EvalWithTempExprNode.free_subexpr_temps  s    %%d+r   c                 :    | j                   j                  |       y r   )r   r~   r0   s     r   generate_subexpr_disposal_codez3EvalWithTempExprNode.generate_subexpr_disposal_code  s    11$7r   c                 ~    | j                  |       | j                  j                  |       | j                  |       y r   )r   r   r{   r   r0   s     r   r{   z-EvalWithTempExprNode.generate_evaluation_code!  s2    T"33D9%r   N)r   r   r   r   r   ro   rq   r-   r%   r   r   r{   r   r   r   r   r      s6     "?3H,20+,8&r   r   c                   2    e Zd ZddgZd Zd Zd Zd Zd Zy)	LetNoder   rE   c                 V    | j                  |       |j                  | _        || _        y r   )r   r   rE   )r   r   rE   s      r   r   zLetNode.__init__6  s"    9%88	r   c                 p    | j                   j                  |       | j                  j                  |       y r   )r   rR   rE   r#   s     r   rR   zLetNode.analyse_declarations;  s(    11#6		&&s+r   c                     | j                   j                  |      | _         | j                  j                  |      | _        | S r   )r   rV   rE   r#   s     r   rV   zLetNode.analyse_expressions?  s6    #33GGLII11#6	r   c                 ~    | j                  |       | j                  j                  |       | j                  |       y r   )r   rE   rL   r   r0   s     r   rL   zLetNode.generate_execution_codeD  s0    T"		))$/%r   c                 t    | j                   j                  ||       | j                  j                  ||       y r   )r   rY   rE   rZ   s      r   rY   z%LetNode.generate_function_definitionsI  s,    ::3E		//T:r   N)	r   r   r   r^   r   rR   rV   rL   rY   r   r   r   r   r   *  s'     %f-K
,
&
;r   r   c                   .    e Zd Zg ZdgZd Zd Zd Zd Zy)TempResultFromStatNoderE   c                 r    || _         |j                  | _        || _        |j                  | _        d| _        y )Nr   )
result_refr   rE   r   re   )r   r   rE   s      r   r   zTempResultFromStatNode.__init__W  s-    $88	OO	r   c                 :    | j                   j                  |       y r   rQ   r#   s     r   rR   z+TempResultFromStatNode.analyse_declarations^  rS   r   c                 F    | j                   j                  |      | _         | S r   rU   r#   s     r   r%   z$TempResultFromStatNode.analyse_typesa  rW   r   c                 x    | j                         | j                  _        | j                  j	                  |       y r   )r-   r   rx   rE   rL   r0   s     r   r2   z+TempResultFromStatNode.generate_result_codee  s&    &*kkm#		))$/r   N)	r   r   r   r   r^   r   rR   r%   r2   r   r   r   r   r   N  s$     H(K,0r   r   N)
__future__r    r   r   r   r   
PyrexTypesr	   objectr   r   rD   r`   r   ExprNoder   
LetRefNodeStatNoder   r   r   r   r   <module>r      s    '    % "= =!. !H*!T *!ZkN k\3 3@&&9--| &&R 
!;ennl !;H0Y// 0r   