
    hiW                    t   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ erdd	lmZ  G d
 d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d de          Z! G d de          Z"dS )zHelpers for dealing with nonlocal control such as 'break' and 'return'.

Model how these behave differently in different contexts.
    )annotations)abstractmethod)TYPE_CHECKING)
NO_TRACEBACK_LINE_NO
BasicBlockBranchGotoIntegerRegisterReturnSetMemUnreachableValue)object_rprimitive)AssignmentTarget)restore_exc_info_opset_stop_iteration_value)	IRBuilderc                  Z    e Zd ZdZedd            Zedd	            Zedd            ZdS )NonlocalControla  ABC representing a stack frame of constructs that modify nonlocal control flow.

    The nonlocal control flow constructs are break, continue, and
    return, and their behavior is modified by a number of other
    constructs.  The most obvious is loop, which override where break
    and continue jump to, but also `except` (which needs to clear
    exc_info when left) and (eventually) finally blocks (which need to
    ensure that the finally block is always executed when leaving the
    try/except blocks).
    builderr   lineintreturnNonec                    d S N selfr   r   s      m/var/www/html/Pagina-Ingenieria-Requisitos/venv/lib/python3.11/site-packages/mypyc/irbuild/nonlocalcontrol.py	gen_breakzNonlocalControl.gen_break+           c                    d S r   r   r   s      r!   gen_continuezNonlocalControl.gen_continue/   r#   r$   valuer   c                    d S r   r   r    r   r'   r   s       r!   
gen_returnzNonlocalControl.gen_return3   r#   r$   Nr   r   r   r   r   r   r   r   r'   r   r   r   r   r   )__name__
__module____qualname____doc__r   r"   r&   r*   r   r$   r!   r   r      s~        	 	    ^    ^    ^  r$   r   c                  *    e Zd ZdZddZdd	ZddZdS )BaseNonlocalControlz?Default nonlocal control outside any statements that affect it.r   r   r   r   r   r   c                    J d            )NFzbreak outside of loopr   r   s      r!   r"   zBaseNonlocalControl.gen_break;   s    -----r$   c                    J d            )NFzcontinue outside of loopr   r   s      r!   r&   z BaseNonlocalControl.gen_continue>   s    00000r$   r'   r   c                J    |                     t          |                     d S r   )addr   r)   s       r!   r*   zBaseNonlocalControl.gen_returnA   s     F5MM"""""r$   Nr+   r,   )r-   r.   r/   r0   r"   r&   r*   r   r$   r!   r2   r2   8   sV        II. . . .1 1 1 1# # # # # #r$   r2   c                  2    e Zd ZdZdd	ZddZddZddZdS )LoopNonlocalControlzNonlocal control within a loop.outerr   continue_blockr   break_blockr   r   c                0    || _         || _        || _        d S r   )r9   r:   r;   )r    r9   r:   r;   s       r!   __init__zLoopNonlocalControl.__init__H   s!     
,&r$   r   r   r   r   c                T    |                     t          | j                             d S r   )r6   r	   r;   r   s      r!   r"   zLoopNonlocalControl.gen_breakO   s%    D)**+++++r$   c                T    |                     t          | j                             d S r   )r6   r	   r:   r   s      r!   r&   z LoopNonlocalControl.gen_continueR   s%    D,--.....r$   r'   r   c                >    | j                             |||           d S r   )r9   r*   r)   s       r!   r*   zLoopNonlocalControl.gen_returnU   s"    
gud33333r$   N)r9   r   r:   r   r;   r   r   r   r+   r,   r-   r.   r/   r0   r=   r"   r&   r*   r   r$   r!   r8   r8   E   sj        ))' ' ' ', , , ,/ / / /4 4 4 4 4 4r$   r8   c                      e Zd ZdZdd
ZdS )GeneratorNonlocalControlzDDefault nonlocal control in a generator function outside statements.r   r   r'   r   r   r   r   r   c                j   |                     |j        j        j        t	          d          |           |j                            d            |                    t                                 t                      t                      }}|j        j        j	        }|J |
                    t          |||t          j                             |                    |           |                    t          |gt                      |
                    t#                                 |j                                         |                    |           |
                    t'          t(          ||                     |
                    t+          t	          dt(                                         d S )Nr   )assignfn_infogenerator_classnext_label_targetr
   r   push_error_handlergoto_and_activater   stop_iter_value_regr6   r   IS_ERRORactivate_blockcall_cr   r   r   pop_error_handlerr   r   r   )r    r   r'   r   truefalsestop_iter_regs          r!   r*   z#GeneratorNonlocalControl.gen_return\   sb    	w6H'RT++W[\\\ 	**4000!!*,,/// !llJLLe7K(((F=$vGGHHHt$$$ 	/%:NOOOKMM"""))+++u%%% 	F,mUCCDDDF71&78899:::::r$   Nr,   )r-   r.   r/   r0   r*   r   r$   r!   rC   rC   Y   s.        NN(; (; (; (; (; (;r$   rC   c                  J    e Zd ZdZddZedd            ZddZddZddZ	dS )CleanupNonlocalControlz6Abstract nonlocal control that runs some cleanup code.r9   r   r   r   c                    || _         d S r   )r9   )r    r9   s     r!   r=   zCleanupNonlocalControl.__init__   s    


r$   r   r   r   r   c                    d S r   r   r   s      r!   gen_cleanupz"CleanupNonlocalControl.gen_cleanup   s    BE#r$   c                h    |                      ||           | j                            ||           d S r   )rX   r9   r"   r   s      r!   r"   z CleanupNonlocalControl.gen_break   s6    $'''
Wd+++++r$   c                h    |                      ||           | j                            ||           d S r   )rX   r9   r&   r   s      r!   r&   z#CleanupNonlocalControl.gen_continue   s6    $'''
.....r$   r'   r   c                j    |                      ||           | j                            |||           d S r   )rX   r9   r*   r)   s       r!   r*   z!CleanupNonlocalControl.gen_return   s8    $'''
gud33333r$   N)r9   r   r   r   r+   r,   )
r-   r.   r/   r0   r=   r   rX   r"   r&   r*   r   r$   r!   rU   rU      s        @@    EEE ^E, , , ,/ / / /4 4 4 4 4 4r$   rU   c                  2    e Zd ZdZddZddZddZddZdS )TryFinallyNonlocalControlz$Nonlocal control within try/finally.targetr   r   r   c                "    || _         d | _        d S r   )r^   ret_reg)r    r^   s     r!   r=   z"TryFinallyNonlocalControl.__init__   s    ;?r$   r   r   r   r   c                2    |                     d|           d S )Nz/break inside try/finally block is unimplementederrorr   s      r!   r"   z#TryFinallyNonlocalControl.gen_break   s    GNNNNNr$   c                2    |                     d|           d S )Nz2continue inside try/finally block is unimplementedrb   r   s      r!   r&   z&TryFinallyNonlocalControl.gen_continue   s    JDQQQQQr$   r'   r   c                   | j         Q|j        j        r&|                    |j        d                   | _         nt          |j        d                   | _         t          | j         t
          t          f          sJ | j                     |                    | j         ||           |	                    t          | j                             d S )NrE   )r`   rG   is_generatormake_spill_target	ret_typesr   
isinstancer   rF   r6   r	   r^   r)   s       r!   r*   z$TryFinallyNonlocalControl.gen_return   s    <+ ?&889J29NOO'(9"(=>> $,3C(DEESSt|SSSt|UD111D%%&&&&&r$   N)r^   r   r   r   r+   r,   rA   r   r$   r!   r]   r]      sv        ..@ @ @ @O O O OR R R R' ' ' ' ' 'r$   r]   c                  ,     e Zd ZdZd fdZddZ xZS )ExceptNonlocalControlzNonlocal control for except blocks.

    Just makes sure that sys.exc_info always gets restored when we leave.
    This is super annoying.
    r9   r   savedValue | AssignmentTargetr   r   c                X    t                                          |           || _        d S r   superr=   rl   r    r9   rl   	__class__s      r!   r=   zExceptNonlocalControl.__init__   &    


r$   r   r   r   r   c                p    |                     t          |                    | j                  g|           d S r   )rO   r   readrl   r   s      r!   rX   z!ExceptNonlocalControl.gen_cleanup   s0    *W\\$*-E-E,FMMMMMr$   )r9   r   rl   rm   r   r   r+   r-   r.   r/   r0   r=   rX   __classcell__rr   s   @r!   rk   rk      sc              N N N N N N N Nr$   rk   c                  ,     e Zd ZdZd fdZddZ xZS )FinallyNonlocalControlzNonlocal control for finally blocks.

    Just makes sure that sys.exc_info always gets restored when we
    leave and the return register is decrefed if it isn't null.
    r9   r   rl   r   r   r   c                X    t                                          |           || _        d S r   ro   rq   s      r!   r=   zFinallyNonlocalControl.__init__   rs   r$   r   r   r   r   c                >   t                      t                      }}|                    t          | j        ||t          j                             |                    |           |                    t          | j        g|           |                    |           d S r   )	r   r6   r   rl   rM   rN   rO   r   rK   )r    r   r   r^   cleanups        r!   rX   z"FinallyNonlocalControl.gen_cleanup   s    $,,
F4:vwHHIIIw'''*TZL$???!!&)))))r$   )r9   r   rl   r   r   r   r+   rv   rx   s   @r!   rz   rz      s[              * * * * * * * *r$   rz   N)#r0   
__future__r   abcr   typingr   mypyc.ir.opsr   r   r   r	   r
   r   r   r   r   r   mypyc.ir.rtypesr   mypyc.irbuild.targetsr   mypyc.primitives.exc_opsr   r   mypyc.irbuild.builderr   r   r2   r8   rC   rU   r]   rk   rz   r   r$   r!   <module>r      s{   
 # " " " " "                                          . - - - - - 2 2 2 2 2 2 R R R R R R R R 0//////       2
# 
# 
# 
# 
#/ 
# 
# 
#4 4 4 4 4/ 4 4 4(+; +; +; +; +;2 +; +; +;\4 4 4 4 4_ 4 4 4,' ' ' ' ' ' ' '6N N N N N2 N N N* * * * *3 * * * * *r$   