
    miB                       d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZmZ ddlmZ ddlmZ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mZmZmZm Z  dd	l!m"Z"m#Z#m$Z$m%Z% dd
l&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z= d8dZ>d9dZ?d:dZ@d;d ZAd<d!ZBd<d"ZCd=d%ZDd>d,ZEd?d.ZFd@d/ZGdAd1ZHdAd2ZIdAd3ZJd@d4ZKd@d5ZLd<d6ZMd7S )Ba  Generate IR for generator functions.

A generator function is represented by a class that implements the
generator protocol and keeps track of the generator state, including
local variables.

The top-level logic for dealing with generator functions is in
mypyc.irbuild.function.
    )annotations)Callable)ARG_OPTFuncDefVar)ENV_ATTR_NAMEGENERATOR_ATTRIBUTE_PREFIXNEXT_LABEL_ATTR_NAME)ClassIR)FuncDeclFuncIR)NO_TRACEBACK_LINE_NO
BasicBlockBranchCallGotoInteger
MethodCallRaiseStandardErrorRegisterReturnSetAttrTupleSetUnreachableValue)	RInstanceint32_rprimitiveobject_pointer_rprimitiveobject_rprimitive)	IRBuildercalculate_arg_defaultsgen_arg_defaults)FuncInfo)add_args_to_envadd_vars_to_envfinalize_env_classload_env_registersload_outer_envload_outer_envssetup_func_for_recursive_call)ExceptNonlocalControl)GENERATOR_HELPER_NAME)error_catch_opexc_matches_opraise_exception_with_tb_opreraise_exception_oprestore_exc_info_opbuilderr    gen_func_irSCallable[[list[Register], list[BasicBlock], FuncInfo], tuple[FuncIR, Value | None]]returntuple[FuncIR, Value | None]c                   t          |            t          | t                     t          |            | j                                        r2t          |           }|| j        _        t          | t                     n%t          | t                     t          |           }| 	                    t          |                     |                                 \  }}}}} ||||          \  }}	||	fS )zAGenerate IR for generator function that returns generator object.prefix)setup_generator_classr'   r	   r"   fn_info#can_merge_generator_and_env_classesinstantiate_generator_class_curr_env_regr&   addr   leave)
r2   r3   genargs_blocksret_typer;   func_irfunc_regs
             o/var/www/html/bestrading.cuttalo.com/scripts/kaggle-env/lib/python3.11/site-packages/mypyc/irbuild/generator.pygen_generator_funcrI   ?   s     '"""w'ABBBBW::<< 3)'22(+%7+EFFFFF7+EFFFF)'22KKs)0&D!VXw#D&'::GXH    r;   r#   rG   Value | NoneNonec                   |                      |t                     t          |            t          | | j        j                   |                                 }|j        }| j        j        r@t          |t                    r+|r)|j        r"t          | || j        j        t                     t          |            t          | |j                   t#          | t                     |                     |j                   |                                  t+          |            | j        d         }|                                 \  }}}}	}t1          | ||||j                   t5          | |||           dS )a  Generate IR based on the body of a generator function.

    Add "__next__", "__iter__" and other generator methods to the generator
    class that implements the function (each function gets a separate class).

    Return the symbol table for the body.
    )rE   r8   N)enterr   setup_env_for_generator_classr)   r;   generator_classtop_level_fn_infofitem	is_nested
isinstancer   add_nested_funcs_to_envr*   r	   !create_switch_for_generator_class-add_raise_exception_blocks_to_generator_classliner%   acceptbodymaybe_add_implicit_return#populate_switch_for_generator_class	symtablesr@   add_methods_to_generator_classis_coroutiner!   )
r2   r;   rG   	top_levelrS   symtablerB   rC   rD   rE   s
             rH   gen_generator_func_bodyrc   W   sz    MM'$5M666!'***GW_<===))++IME!
ug&&
 
 -	
 	&UGO;D^	
 	
 	
 	
 &g...1'5:FFFG$>????NN5:%%''''000  $H)0&D!VXw"7GT65CUVVV 7GXx@@@@@rJ   r   c                v   | j         j        }|                     t          | j         j        j        j        g |j                            }| j                                         r?t          d          }|                     t          |t          ||j                             n| j         j        r| j         j        j        }n| j         j        }|                     t          |t          ||j                             t          d          }|                     t          |t          ||j                             |S )Nr   )r;   rS   r?   r   rQ   irctorrY   r<   r   r   r
   rT   callable_classcurr_env_regr   )r2   rS   generator_regzerorh   s        rH   r=   r=      s   O!EKKW_%D%G%LbRWR\ ] ]^^M::<< SqzzGM+?uzRRSSSS ?$ 	8"?9FLL"?7L 	GM=,
SSTTT qzzGL*>ejQQRRRrJ   r   c                t   | j         }t          | j        j        t                    sJ | j        j                    |j        | j        j                 }| j                                        r|| j        _        n&t          | j        j                  |j	        t          <   | j                            |           |S N)mapperrU   r;   rS   r   fdef_to_generatorr<   	env_classr   
attributesr   classesappend)r2   rm   generator_class_irs      rH   r:   r:      s    ^Fgo+W55LLw7LLLL1'/2GH::<< \$6!!7@AZ7[7[%m4O-...rJ   c                    |                      t          | j        j        j                             t                      }| j        j        j                            |           |                     |           d S rl   )	r?   r   r;   rQ   switch_blockr   continuation_blocksrr   activate_block)r2   blocks     rH   rW   rW      sc    KKW_4ABBCCCLLEO#7>>uEEE5!!!!!rJ   c                   | j         j        }| j         j        j        }|                     |j                   t          |j                  D ]i\  }}t                      }| 	                    |j
        t          |          d|          }|                     |||           |                     |           j|                     t          t          j        d |                     |                     t!                                 d S )Nz==)r;   rQ   rS   rY   rw   ru   	enumeraterv   r   	binary_opnext_label_regr   add_bool_branchr?   r   STOP_ITERATIONr   )r2   clsrY   label
true_blockfalse_block
comparisons          rH   r]   r]      s    
/
)C? %D3+,,,&s'>?? , ,z ll&&s'975>>4QUVV

JDDD{++++KK"#5#DdDQQRRRKKrJ   rY   intc                   | j         j        }|j        J |j        \  }}}t                      }t                      }|                     ||                                 d|          }|                     |||           |                     |           |                     t          |||g|           | 
                    t                                 |                     |           dS )zAdd error handling blocks to a generator class.

    Generates blocks to check if error flags are set while calling the
    helper method for generator functions, and raises an exception if
    those flags are set.
    Nzis not)r;   rQ   exc_regsr   translate_is_opnone_objectr}   rw   call_cr/   r?   r   goto_and_activate)	r2   rY   r   exc_typeexc_valexc_tberror_blockok_blockr   s	            rH   rX   rX      s     /
)C<### #Hgv ,,K||H((73F3F3H3H(TXYYJJX>>>;'''NN-'6/JDQQQKKh'''''rJ   arg_regslist[Register]rD   list[BasicBlock]r`   boolc                    t          | |||          }t          | ||           t          | ||           t          | |           t	          | ||           t          | |           |rt          | |           d S d S rl   )add_helper_to_generator_classadd_next_to_generator_classadd_send_to_generator_classadd_iter_to_generator_classadd_throw_to_generator_classadd_close_to_generator_classadd_await_to_generator_class)r2   r;   r   rD   r`   helper_fn_decls         rH   r_   r_      s     37HfgVVN.AAA.AAA111 '>BBB '222 7$Wg666667 7rJ   r   c                   |j         j        j        t                   }t	          ||||j        j        |j        j                  }||j         j        j        t          <   | j	        
                    |           ||j        _        |S )zRGenerates a helper method for a generator class, called by '__next__' and 'throw'.)traceback_name)rQ   re   method_declsr,   r   rS   rY   namemethods	functionsrr   ro   env_user_function)r2   r   rD   r;   r   helper_fn_irs         rH   r   r      s     ,/<=RSN&'-*<W]M_  L AMG&'<=\****6G'rJ   c                    |                      |j        j        dt          |          5  |                     t          |                                                      ddd           dS # 1 swxY w Y   dS )z6Generates the '__iter__' method for a generator class.__iter__Nenter_methodrQ   re   r   r?   r   selfr2   r;   s     rH   r   r      s    			g58*FWY`	a	a , ,F7<<>>**+++, , , , , , , , , , , , , , , , , ,   5A**A.1A.fn_declc                   |                      |j        j        dt          |          5  |                                 }|                     t          ||                                 ||||t          dt                    g|j
        j                            }|                     t          |                     ddd           dS # 1 swxY w Y   dS )z6Generates the '__next__' method for a generator class.__next__r   N)r   rQ   re   r   r   r?   r   r   r   r   rS   rY   r   )r2   r;   r   none_regresults        rH   r   r     s
   			g58*FWY`	a	a $ $&&((LLNNA899 " 
 
 	F6NN####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   BCC	C	c                    |                      |j        j        dt          |          5  |                     dt                    }|                                 }|                     t          ||                                 |||| 	                    |          t          dt                    g|j        j                            }|                     t          |                     ddd           dS # 1 swxY w Y   dS )z2Generates the 'send' method for a generator class.sendargr   N)r   rQ   re   r   add_argumentr   r?   r   r   readr   r   rS   rY   r   )r2   r;   r   r   r   r   s         rH   r   r     s,   			g58&BSU\	]	] $ $""5*;<<&&((LLNNLL%%A899 " 
 
 	F6NN###%$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   B>C33C7:C7c                v   |                      |j        j        dt          |          5  |                     dt                    }|                     dt          t
                    }|                     dt          t
                    }|                                 |                     |fd| j        j	        j
                   |                     |fd| j        j	        j
                   |                     t          ||                                 |                     |          |                     |          |                     |          t          dt                     g|j	        j
                            }|                     t#          |                     ddd           dS # 1 swxY w Y   dS )	z3Generates the 'throw' method for a generator class.throwtypevalue	tracebackc                      S rl    r   s   rH   <lambda>z.add_throw_to_generator_class.<locals>.<lambda>9  s    H rJ   c                      S rl   r   r   s   rH   r   z.add_throw_to_generator_class.<locals>.<lambda>:  s    8 rJ   r   N)r   rQ   re   r   r   r   r   assign_if_nullr;   rS   rY   r?   r   r   r   r   r   r   )r2   r;   r   typvaltbr   r   s          @rH   r   r   .  s   			g58'CTV]	^	^ $ $""6+<==""7,=wGG!!+/@'JJ
 &&((s$4$4$4$4go6K6PQQQr#3#3#3#3W_5J5OPPP LLNNLL%%LL%%LL$$A899 " 
 
 	F6NN###7$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   E8F..F25F2c                   |                      |j        j        dt          |          5  t	                      t	                      }}| j                            |           |                     t	                                 |                     d|j	        j
                  }|                     t          |                                 d||                                 |                                 g                     |                     |           | j                                         |                     |           |                     t&          g |j	        j
                  }| j                            t-          | j        d         |                     |                     d|j	        j
                  }|                     t/          ||g|j	        j
                            }|                     t0          |g|j	        j
                  }t	                      t	                      }
}	|                     t3          ||	|
t2          j                             |                     |	           |                     t6          |                     |          g|j	        j
                   |                     t;          |                                                      |                     |
           |                     t<          g t>                     |                     tA                                 | j        !                                 |                     |           |                     tE          tD          j#        d|j	        j
                             |                     tA                                 ddd           dS # 1 swxY w Y   dS )z7Generates the '__close__' method for a generator class.closezbuiltins.GeneratorExitr   rN   zbuiltins.StopIterationzgenerator ignored GeneratorExitN)$r   rQ   re   r   r   r2   push_error_handlerr   load_module_attr_by_fullnamerS   rY   r?   r   r   r   gotopop_error_handlerrw   r   r-   nonlocal_controlrr   r+   r   r.   r   BOOLr1   r   r   r0   r   r   popr   RUNTIME_ERROR)r2   r;   except_block
else_blockgenerator_exitold_excstop_iteration
exceptionsmatchesmatch_blocknon_match_blocks              rH   r   r   N  su   			g58'CTV]	^	^ 1# 1##-<<j**<888!!*,,/// ==$gm&8
 
 	!4!4!6!68K8K8M8MN 	
 	
 	
 	Z   ))+++|,,,..W]5GHH ''!'":2">HH	
 	
 	
 !==$gm&8
 
 [[>>*JGML^!_!_``
..*w}?QRR'1||Z\\_F7K&+NNOOO{+++*W\\'-B-B,CW]EWXXXF7..0011222///+R1EFFFKMM""" $$&&&z***"01" 	
 	
 	
 	KMM"""c1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1# 1#s   NOOOc                    |                      |j        j        dt          |          5  |                     t          |                                                      ddd           dS # 1 swxY w Y   dS )z7Generates the '__await__' method for a generator class.	__await__Nr   r   s     rH   r   r     s    			g58+GXZa	b	b , ,F7<<>>**+++, , , , , , , , , , , , , , , , , ,r   c                   | j         j        }| j         j        }|                     |j                  }|                     t          d          t          d          }|                     t          d          t          d          }|                     t          d          t          d          }|                     t          d          t          d          }|                     t          d          t          d          }|||f|_	        ||_
        ||_        |                     ||j                  |_        | j                                         r|j        |_        n&t#          | |j        | j        d                   |_        |                     t          t(                    t*          |d	d
          |_        t/          | d	|d	t0                     |                     |j        |j                  |_        dS )z0Populates the environment for a generator class.r   T)is_argr   r   r   stop_iter_ptrrN   F)reassignalways_defined)localbaser   r9   N)r;   rS   rQ   add_self_to_envre   	add_localr   r   r   r   send_arg_regstop_iter_value_regr   rY   self_regr<   rh   r(   r^   add_var_to_env_classr
   r   next_label_targetr$   r	   r|   )	r2   rS   r   self_targetr   r   r   exc_argstop_iter_value_args	            rH   rP   rP     s   O!E
/
)C))#&11K   V.? MMHG.?MMGs;//1B4PPFE

,=dKKG "++O7 ,   gv.CLC1C<<UZ88CL::<< X<)'3<ARSUAVWW
 $88 !!#3S5Y] 9  C u3?Y   
 !c&;UZHHCrJ   N)r2   r    r3   r4   r5   r6   )r2   r    r;   r#   rG   rK   r5   rL   )r2   r    r5   r   )r2   r    r5   r   )r2   r    r5   rL   )r2   r    rY   r   r5   rL   )r2   r    r;   r#   r   r   rD   r   r`   r   r5   rL   )
r2   r    r   r   rD   r   r;   r#   r5   r   )r2   r    r;   r#   r5   rL   )r2   r    r;   r#   r   r   r5   rL   )N__doc__
__future__r   typingr   
mypy.nodesr   r   r   mypyc.commonr   r	   r
   mypyc.ir.class_irr   mypyc.ir.func_irr   r   mypyc.ir.opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   mypyc.ir.rtypesr   r   r   r   mypyc.irbuild.builderr    r!   r"   mypyc.irbuild.contextr#   mypyc.irbuild.env_classr$   r%   r&   r'   r(   r)   r*   mypyc.irbuild.nonlocalcontrolr+   mypyc.irbuild.preparer,   mypyc.primitives.exc_opsr-   r.   r/   r0   r1   rI   rc   r=   r:   rW   r]   rX   r_   r   r   r   r   r   r   r   rP   r   rJ   rH   <module>r      s    # " " " " "       , , , , , , , , , , X X X X X X X X X X % % % % % % - - - - - - - -                                            V U U U U U U U U U * * * * * *                  @ ? ? ? ? ? 7 7 7 7 7 7                0+A +A +A +A\   8
 
 
 
" " " "   ( ( ( (.7 7 7 7"   , , , ,$ $ $ $,$ $ $ $.$ $ $ $@3# 3# 3# 3#l, , , ,+I +I +I +I +I +IrJ   