
    hiaC                       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+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> d8dZ?d9dZ@d:dZAd;d ZBd<d!ZCd<d"ZDd=d%ZEd>d,ZFd?d.ZGd@d/ZHdAd1ZIdAd2ZJdAd3ZKd@d4ZLd@d5ZMd<d6ZNd7S )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GeneratorClass)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)
r3   r4   genargs_blocksret_typer<   func_irfunc_regs
             g/var/www/html/Pagina-Ingenieria-Requisitos/venv/lib/python3.11/site-packages/mypyc/irbuild/generator.pygen_generator_funcrJ   ?   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#   rH   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.
    )rF   r9   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	symtablesrA   add_methods_to_generator_classis_coroutiner!   )
r3   r<   rH   	top_levelrT   symtablerC   rD   rE   rF   s
             rI   gen_generator_func_bodyrd   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@@@@@rK   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<   rT   r@   r   rR   irctorrZ   r=   r   r   r
   rU   callable_classcurr_env_regr   )r3   rT   generator_regzerori   s        rI   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rK   r   c                   | j         }t          | j        j        t                    sJ | j        j                    |j        | j        j                 }| j                                        r|| j        _        n&t          | j        j                  |j	        t          <   |g|_        | j                            |           t          |          | j        _        |S N)mapperrV   r<   rT   r   fdef_to_generatorr=   	env_classr   
attributesr   mroclassesappendr$   rR   )r3   rn   generator_class_irs      rI   r;   r;      s    ^Fgo+W55LLw7LLLL1'/2GH::<< \$6!!7@AZ7[7[%m401O-...&45G&H&HGO#rK   c                    |                      t          | j        j        j                             t                      }| j        j        j                            |           |                     |           d S rm   )	r@   r   r<   rR   switch_blockr   continuation_blocksrt   activate_block)r3   blocks     rI   rX   rX      sc    KKW_4ABBCCCLLEO#7>>uEEE5!!!!!rK   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<   rR   rT   rZ   ry   rw   	enumeraterx   r   	binary_opnext_label_regr   add_bool_branchr@   r   STOP_ITERATIONr   )r3   clsrZ   label
true_blockfalse_block
comparisons          rI   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rK   rZ   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<   rR   exc_regsr   translate_is_opnone_objectr   ry   call_cr0   r@   r   goto_and_activate)	r3   rZ   r   exc_typeexc_valexc_tberror_blockok_blockr   s	            rI   rY   rY      s     /
)C<### #Hgv ,,K||H((73F3F3H3H(TXYYJJX>>>;'''NN-'6/JDQQQKKh'''''rK   arg_regslist[Register]rE   list[BasicBlock]ra   boolc                    t          | |||          }t          | ||           t          | ||           t          | |           t	          | ||           t          | |           |rt          | |           d S d S rm   )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)r3   r<   r   rE   ra   helper_fn_decls         rI   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 7rK   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)rR   rf   method_declsr-   r   rT   rZ   namemethods	functionsrt   rp   env_user_function)r3   r   rE   r<   r   helper_fn_irs         rI   r   r      s     ,/<=RSN&'-*<W]M_  L AMG&'<=\****6G'rK   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_methodrR   rf   r   r@   r   selfr3   r<   s     rI   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   rR   rf   r   r   r@   r   r   r   r   rT   rZ   r   )r3   r<   r   none_regresults        rI   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   rR   rf   r   add_argumentr   r@   r   r   readr   r   rT   rZ   r   )r3   r<   r   r   r   r   s         rI   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 rm    r   s   rI   <lambda>z.add_throw_to_generator_class.<locals>.<lambda>;  s    H rK   c                      S rm   r   r   s   rI   r   z.add_throw_to_generator_class.<locals>.<lambda><  s    8 rK   r   N)r   rR   rf   r   r   r   r   assign_if_nullr<   rT   rZ   r@   r   r   r   r   r   r   )r3   r<   r   typvaltbr   r   s          @rI   r   r   0  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   rO   zbuiltins.StopIterationzgenerator ignored GeneratorExitN)$r   rR   rf   r   r   r3   push_error_handlerr   load_module_attr_by_fullnamerT   rZ   r@   r   r   r   gotopop_error_handlerry   r   r.   nonlocal_controlrt   r,   r   r/   r   BOOLr2   r   r   r1   r   r   popr   RUNTIME_ERROR)r3   r<   except_block
else_blockgenerator_exitold_excstop_iteration
exceptionsmatchesmatch_blocknon_match_blocks              rI   r   r   P  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     rI   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_ptrrO   F)reassignalways_defined)localbaser   r:   N)r<   rT   rR   add_self_to_envrf   	add_localr   r   r   r   send_arg_regstop_iter_value_regr   rZ   self_regr=   ri   r)   r_   add_var_to_env_classr
   r   next_label_targetr%   r	   r~   )	r3   rT   r   self_targetr   r   r   exc_argstop_iter_value_args	            rI   rQ   rQ     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rK   N)r3   r    r4   r5   r6   r7   )r3   r    r<   r#   rH   rL   r6   rM   )r3   r    r6   r   )r3   r    r6   r   )r3   r    r6   rM   )r3   r    rZ   r   r6   rM   )r3   r    r<   r#   r   r   rE   r   ra   r   r6   rM   )
r3   r    r   r   rE   r   r<   r#   r6   r   )r3   r    r<   r#   r6   rM   )r3   r    r<   r#   r   r   r6   rM   )O__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#   r$   mypyc.irbuild.env_classr%   r&   r'   r(   r)   r*   r+   mypyc.irbuild.nonlocalcontrolr,   mypyc.irbuild.preparer-   mypyc.primitives.exc_opsr.   r/   r0   r1   r2   rJ   rd   r>   r;   rX   r^   rY   r`   r   r   r   r   r   r   r   rQ   r   rK   rI   <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rK   