
    X-Ph0                    d   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 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UnreachableValue)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      ]/var/www/html/test/jupyter/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_return1   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_break9   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_return?   s     F5MM"""""r"   Nr)   r*   )r+   r,   r-   r.   r    r$   r(   r   r"   r   r0   r0   6   sV        II. . . .1 1 1 1# # # # # #r"   r0   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   )r7   r8   r9   )r   r7   r8   r9   s       r   __init__zLoopNonlocalControl.__init__F   s!     
,&r"   r   r   r   r   c                T    |                     t          | j                             d S r   )r4   r	   r9   r   s      r   r    zLoopNonlocalControl.gen_breakM   s%    D)**+++++r"   c                T    |                     t          | j                             d S r   )r4   r	   r8   r   s      r   r$   z LoopNonlocalControl.gen_continueP   s%    D,--.....r"   r%   r   c                >    | j                             |||           d S r   )r7   r(   r'   s       r   r(   zLoopNonlocalControl.gen_returnS   s"    
gud33333r"   N)r7   r   r8   r   r9   r   r   r   r)   r*   r+   r,   r-   r.   r;   r    r$   r(   r   r"   r   r6   r6   C   sj        ))' ' ' ', , , ,/ / / /4 4 4 4 4 4r"   r6   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        t	          d          |           |j                            d            |                    t                                 |	                    t          |gt                     |                    t                                 |j                                         d S N)assignfn_infogenerator_classnext_label_targetr
   r   push_error_handlergoto_and_activater   call_cr   r   r4   r   pop_error_handlerr'   s       r   r(   z#GeneratorNonlocalControl.gen_returnZ   s     	w6H'RT++W[\\\ 	**4000!!*,,/// 	/%:NOOOKMM"""))+++++r"   Nr*   )r+   r,   r-   r.   r(   r   r"   r   rA   rA   W   s.        NN, , , , , ,r"   rA   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.r7   r   r   r   c                    || _         d S r   )r7   )r   r7   s     r   r;   zCleanupNonlocalControl.__init__w   s    


r"   r   r   r   r   c                    d S r   r   r   s      r   gen_cleanupz"CleanupNonlocalControl.gen_cleanupz   s    BE#r"   c                h    |                      ||           | j                            ||           d S r   )rQ   r7   r    r   s      r   r    z CleanupNonlocalControl.gen_break}   s6    $'''
Wd+++++r"   c                h    |                      ||           | j                            ||           d S r   )rQ   r7   r$   r   s      r   r$   z#CleanupNonlocalControl.gen_continue   s6    $'''
.....r"   r%   r   c                j    |                      ||           | j                            |||           d S r   )rQ   r7   r(   r'   s       r   r(   z!CleanupNonlocalControl.gen_return   s8    $'''
gud33333r"   N)r7   r   r   r   r)   r*   )
r+   r,   r-   r.   r;   r   rQ   r    r$   r(   r   r"   r   rN   rN   t   s        @@    EEE ^E, , , ,/ / / /4 4 4 4 4 4r"   rN   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   )rW   ret_reg)r   rW   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 unimplementedr[   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         ||           |	                    t          | j                             d S rC   )rY   rF   is_generatormake_spill_target	ret_typesr   
isinstancer   rE   r4   r	   rW   r'   s       r   r(   z$TryFinallyNonlocalControl.gen_return   s    <+ ?&889J29NOO'(9"(=>> $,3C(DEEEEEt|UD111D%%&&&&&r"   N)rW   r   r   r   r)   r*   r?   r   r"   r   rV   rV      sv        ..@ @ @ @O O O OR R R R' ' ' ' ' 'r"   rV   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.
    r7   r   savedValue | AssignmentTargetr   r   c                X    t                                          |           || _        d S r   superr;   re   r   r7   re   	__class__s      r   r;   zExceptNonlocalControl.__init__   &    


r"   r   r   r   r   c                p    |                     t          |                    | j                  g|           d S r   )rK   r   readre   r   s      r   rQ   z!ExceptNonlocalControl.gen_cleanup   s0    *W\\$*-E-E,FMMMMMr"   )r7   r   re   rf   r   r   r)   r+   r,   r-   r.   r;   rQ   __classcell__rk   s   @r   rd   rd      sc              N N N N N N N Nr"   rd   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.
    r7   r   re   r   r   r   c                X    t                                          |           || _        d S r   rh   rj   s      r   r;   zFinallyNonlocalControl.__init__   rl   r"   r   r   r   r   c                >   t                      t                      }}|                    t          | j        ||t          j                             |                    |           |                    t          | j        g|           |                    |           d S r   )	r   r4   r   re   IS_ERRORactivate_blockrK   r   rJ   )r   r   r   rW   cleanups        r   rQ   z"FinallyNonlocalControl.gen_cleanup   s    $,,
F4:vwHHIIIw'''*TZL$???!!&)))))r"   )r7   r   re   r   r   r   r)   ro   rq   s   @r   rs   rs      s[              * * * * * * * *r"   rs   N) r.   
__future__r   abcr   typingr   mypyc.ir.opsr   r   r   r	   r
   r   r   r   r   mypyc.irbuild.targetsr   mypyc.primitives.exc_opsr   r   mypyc.irbuild.builderr   r   r0   r6   rA   rN   rV   rd   rs   r   r"   r   <module>r      s^   
 # " " " " "                  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 3 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"   