
    ڏDj1                     J   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      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 G d de      Zy)   )Nodes)	ExprNodes)Node)AtomicExprNode)
c_ptr_type
c_int_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      ]C:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\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_code2   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   rhsr0   overloaded_assignments       r   generate_assignment_codez$TempRefNode.generate_assignment_code5   s    99  $$T*T[[]DJJL9

KKM1CJJLs}}TZZ\7RR
 	 	))$/tr   NF)	r   r   r   r$   r'   r)   r-   r1   r@   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   rD   generate_execution_coder   put_xdecref_clearput_decref_clearrelease_temp)r   r0   r   s      r   rK   z&TempsBlockNode.generate_execution_codeT   s    jj 	>F..66(<(< 7 >FK	> 			))$/jj 	5F##''**6;;D))&++v{{CNN''4	5r   c                 :    | j                   j                  |       y r   rD   analyse_declarationsr"   s     r   rQ   z#TempsBlockNode.analyse_declarationsa       		&&s+r   c                 F    | j                   j                  |      | _         | S r   rD   analyse_expressionsr"   s     r   rU   z"TempsBlockNode.analyse_expressionsd       II11#6	r   c                 <    | j                   j                  ||       y r   rD   generate_function_definitionsr   r#   r0   s      r   rY   z,TempsBlockNode.generate_function_definitionsh       		//T:r   c                 :    | j                   j                  |       y r   )rD   annotater/   s     r   r]   zTempsBlockNode.annotatek   s    		4 r   N)
r   r   r   __doc__child_attrsrK   rQ   rU   rY   r]   r   r   r   rC   rC   B   s)     (K5,;!r   rC   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 ZddZd Zd Zd Zy)ResultRefNodeFNc                     || _         d | _        || _        |#|j                  | _        t        |dd       | _        ||| _        ||| _        |rd| _        | j                  J y )Nr   T)
expressionr   may_hold_nonegetattrr   is_temp)r   rc   r   r   rd   rf   s         r   r   zResultRefNode.__init__v   sl    $*!!~~DH
FD9DI?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   )rc   type_dependenciesr"   s     r   rk   zResultRefNode.type_dependencies   s!    ????44S99r   c                 @    || _         t        |dd       }|r|| _        y y )Nr   )rc   re   r   )r   rc   r   s      r   update_expressionzResultRefNode.update_expression   s&    $z640DI r   c                      y r   r   r"   s     r   r)   z(ResultRefNode.analyse_target_declaration   r*   r   c                     | j                   Q| j                   j                  s | j                   j                  |      | _         | j                   j                  | _        | S r   )rc   r   r$   r"   s     r   r$   zResultRefNode.analyse_types   sE    ??&??''"&//"?"?"D,,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   rc   
infer_typer"   s     r   rq   zResultRefNode.infer_type   s^    99 99??&##/+++??--c22:::r   c                 H    | j                   j                  sy| j                  S )NF)r   r   rd   rh   s    r   may_be_nonezResultRefNode.may_be_none   s    yy$$!!!r   c                     | j                   | j                   j                         S | j                  | j                  j                  S yNT)rc   rs   r   r   rh   s    r   _DISABLED_may_be_nonez#ResultRefNode._DISABLED_may_be_none   s>     ??&??..0099 99(((r   c                      yru   r   rh   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AttributeErrorrc   r,   rh   s    r   r,   zResultRefNode.result   sN    	<### 	<*#'??#9#9#; 	<s    4AAc                      y r   r   r/   s     r   generate_evaluation_codez&ResultRefNode.generate_evaluation_code   r*   r   c                      y r   r   r/   s     r   r1   z"ResultRefNode.generate_result_code   r*   r   c                      y r   r   r/   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 r3   )r   r   r6   lhs_of_first_assignment
put_decrefr,   r8   r9   r:   r;   r<   r=   s       r   r@   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   rN   zResultRefNode.release_temp   r*   r   c                      y r   r   r/   s     r   r<   zResultRefNode.free_temps   r*   r   )NNNTFrA   )r   r   r   subexprsr   r   ri   rk   rm   r)   r$   rq   rs   rv   rx   r,   r}   r1   r   r@   r   rN   r<   r   r   r   ra   ra   o   si     H#$;"
 
r   ra   c                       e Zd Zd Zd Zd Zy)LetNodeMixinc                 4    || _         |j                  | _        y r   )	lazy_temprc   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                  r| j                   j                  |       n| j                   j                  |       |j                  j                  | j                  d      | _
        |j!                  | j                  d| j                   j                         d       | j                   j#                  |       | j                   j%                  |       | j                  | j&                  _        y )NTrF   r4   r5   )r   r}   r   	temp_typeis_arrayr   	base_typeresult_in_temp_result_in_tempr,   r   is_memoryviewslicemake_owned_memoryviewslicer6   rI   rJ   r9   r   r<   r   rz   r/   s     r   setup_temp_exprzLetNodeMixin.setup_temp_expr   s7   55d;--22>>""'(@(@ADN#33BBD,,335DI~~00$$??E$$99$?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   needs_refcountingrM   r   rI   rN   r/   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   rq   r"   s     r   rq   zEvalWithTempExprNode.infer_type  s    !!,,S11r   c                 6    | j                   j                         S r   )r   rs   rh   s    r   rs   z EvalWithTempExprNode.may_be_none  s    !!--//r   c                 6    | j                   j                         S r   )r   r,   rh   s    r   r,   zEvalWithTempExprNode.result  s    !!((**r   c                    | j                   j                  |      | _         | j                  j                  | j                          | j                  j                  |      | _        | j                  j
                  | _        | S r   )r   r$   r   rm   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<   r/   s     r   free_subexpr_tempsz'EvalWithTempExprNode.free_subexpr_temps   s    %%d+r   c                 :    | j                   j                  |       y r   )r   r   r/   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   r/   s     r   r}   z-EvalWithTempExprNode.generate_evaluation_code&  s2    T"33D9%r   N)r   r   r   r   r   rq   rs   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   rD   c                 V    | j                  |       |j                  | _        || _        y r   )r   r   rD   )r   r   rD   s      r   r   zLetNode.__init__;  s"    9%88	r   c                 p    | j                   j                  |       | j                  j                  |       y r   )r   rQ   rD   r"   s     r   rQ   zLetNode.analyse_declarations@  s(    11#6		&&s+r   c                     | j                   j                  |      | _         | j                  j                  |      | _        | S r   )r   rU   rD   r"   s     r   rU   zLetNode.analyse_expressionsD  s6    #33GGLII11#6	r   c                 ~    | j                  |       | j                  j                  |       | j                  |       y r   )r   rD   rK   r   r/   s     r   rK   zLetNode.generate_execution_codeI  s0    T"		))$/%r   c                 t    | j                   j                  ||       | j                  j                  ||       y r   )r   rY   rD   rZ   s      r   rY   z%LetNode.generate_function_definitionsN  s,    ::3E		//T:r   N)	r   r   r   r_   r   rQ   rU   rK   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d Z	d Z
y)	TempResultFromStatNoderD   c                 r    || _         |j                  | _        || _        |j                  | _        d| _        y )Nr   )
result_refr   rD   r   rf   )r   r   rD   s      r   r   zTempResultFromStatNode.__init__\  s-    $88	OO	r   c                 :    | j                   j                  |       y r   rP   r"   s     r   rQ   z+TempResultFromStatNode.analyse_declarationsc  rR   r   c                 F    | j                   j                  |      | _         | S r   rT   r"   s     r   r$   z$TempResultFromStatNode.analyse_typesf  rV   r   c                 6    | j                   j                         S r   )r   rs   rh   s    r   rs   z"TempResultFromStatNode.may_be_nonej  s    **,,r   c                 x    | j                         | j                  _        | j                  j	                  |       y r   )r,   r   rz   rD   rK   r/   s     r   r1   z+TempResultFromStatNode.generate_result_codem  s&    &*kkm#		))$/r   c                 <    | j                   j                  ||       y r   rX   rZ   s      r   rY   z4TempResultFromStatNode.generate_function_definitionsq  r[   r   N)r   r   r   r   r_   r   rQ   r$   rs   r1   rY   r   r   r   r   r   S  s.     H(K,-0;r   r   c                   &    e Zd ZdZeZd Zd Zd Zy)HasNoGilNodez\
    Simple node that evaluates to
    * 0 if gil
    * 1 if nogil
    * 2 if maybe gil
    c                     | S r   r   r"   s     r   r$   zHasNoGilNode.analyse_types~  s    r   c                      y r   r   r/   s     r   r1   z!HasNoGilNode.generate_result_code  r*   r   c                 >    t        t        | j                              S r   )strintin_nogil_contextrh   s    r   r-   z"HasNoGilNode.calculate_result_code  s    3t,,-..r   N)	r   r   r   r^   r   r   r$   r1   r-   r   r   r   r   r   u  s     D/r   r   N) r   r   r   r   
PyrexTypesr   r   r
   r   rC   ra   r   ExprNoder   
LetRefNodeStatNoder   r   r   r   r   r   <module>r      s       % .= =!. !H*!T *!ZnN nb 3  3F&&9--| &&R 
!;ennl !;H;Y// ;D/> /r   