
    0;ji`7                         d Z ddlZddlmZmZ ddlmZmZmZ ddl	m
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 )z"
Support for lowering generators.
    N)Constant	IRBuilder)typesconfigcgutils)FunctionDescriptorc                   B    e Zd ZdZdZed             Zed             ZdS )GeneratorDescriptorz9
    The descriptor for a generator's next function.
     c                     t          |t          j                  sJ |j        }dg}|f}|j        dz   }|j        dz   }	 | |j        |j        ||	|j        |j	        ||j
        ||j        ||d|j                  }
|
S )a  
        Build a GeneratorDescriptor for the generator returned by the
        function described by *fndesc*, with type *gentype*.

        The generator inherits the env_name from the *fndesc*.
        All emitted functions for the generator shares the same Env.
        genz.nextF)argtypesmanglerinlineenv_name)
isinstancer   	Generator
yield_typequalnameunique_namenativemodnamedoctypemap	calltypeskwsr   )clsfunc_irfndescgentyper   restypeargsr   r   r   selfs              O/root/voice-cloning/.venv/lib/python3.11/site-packages/numba/core/generators.pyfrom_generator_fndescz)GeneratorDescriptor.from_generator_fndesc   s     '5?33333$w:?W,(72s6=&.(K:v~w8Hh&/; ; ;     c                     d| j         z   S )zz
        The LLVM name of the generator's finalizer function
        (if <generator type>.has_finalizer is true).
        	finalize_)mangled_namer#   s    r$   llvm_finalizer_namez'GeneratorDescriptor.llvm_finalizer_name'   s     T...r&   N)	__name__
__module____qualname____doc__	__slots__classmethodr%   propertyr+   r   r&   r$   r
   r
      sY          I  [( / / X/ / /r&   r
   c                   d    e Zd ZdZd Zed             Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd ZdS )BaseGeneratorLowerz5
    Base support class for lowering generators.
    c                    |j         | _         |j        | _        |j        | _        |j        | _        || _        |j        | _        |                                 | _        t          
                    |j        | j        | j        | j         j                  | _        | j                             | j        j                  | _        i | _        d S N)contextr   libraryr   lowergenerator_infogeninfoget_generator_typer    r
   r%   r   gendescget_data_packerr   
arg_packerresume_blocksr#   r9   s     r$   __init__zBaseGeneratorLower.__init__5   s    }l}}
+..00*@@M4;dl6JL L ,66t{7KLLr&   c                     | j         j        S r6   )r9   	call_convr*   s    r$   rD   zBaseGeneratorLower.call_convE   s    z##r&   c                 0    t          j        ||dd          S )Nr      r   gep_inboundsr#   buildergenptrs      r$   get_args_ptrzBaseGeneratorLower.get_args_ptrI   s    #GVQ:::r&   c                 4    t          j        ||ddd          S )Nr   zgen.resume_indexnamerG   rI   s      r$   get_resume_index_ptrz'BaseGeneratorLower.get_resume_index_ptrL   s'    #GVQ);= = = 	=r&   c                 4    t          j        ||ddd          S )Nr      z	gen.staterN   rG   rI   s      r$   get_state_ptrz BaseGeneratorLower.get_state_ptrP   s'    #GVQ)46 6 6 	6r&   c                    |                     | j                   |j        }|j                            | j        | j        | j        g           |                                 |	                                 | j        
                    | j                  }| j                            t          j        d          }|j        d         }|j        d         }|                    d           | j        j        rFt#          | j        j        |j                  D ]&\  }}| j        j                            |||           '| j                            ||j                  }	t1          |d          }
t3          j        |||	|
g|          }|                     ||          }|                    d           | j                            ||           |                                 dS )z
        Lower the generator's initialization function (which will fill up
        the passed-by-reference generator structure).
        r   rF   rR   z# low_init_func increfNz# low_init_func before return)setup_functionr   rJ   r7   insert_generatorr    r=   r8   extract_function_arguments	pre_lowerget_return_typeget_constantr   int32elementsdebug_print
enable_nrtzipr   fnargsnrtincrefr?   as_datar   r   make_anonymous_structbox_generator_structrD   return_value
post_lower)r#   r9   rJ   rettyresume_indexargstystatestyargtyargvalargsval	statesval
gen_structretvals                r$   lower_init_funcz"BaseGeneratorLower.lower_init_funcT   s   
 	T[)))- 	&&t|T\(,~	7 	7 	7 	((*** ,,T\::|00a@@">!$2333<" 	@!$T[%95<!H!H @ @v ''???? /))'5<@@ Xt,,	274@'4=4?38: :

 **5*==9:::##GV444r&   c                 X   |                     | j                   |                    d                    | j        j                             | j        j        d         | j        k    sJ |j        }|j        }| j	        
                    |          \  }| j                            ||                     ||          |j                   |                     ||          | _        |                     ||          | _        |                    d          }|                                }|                    d          }|                    |           | j	                            |           |                    |           |j        |j                 x}| j        d<   |                    |                    | j                  |          }	| j                                        D ]\  }
}|	                    |
|           |                    |           |                    |           dS )z
        Lower the generator's next() function (which takes the
        passed-by-reference generator structure and returns the next
        yielded value).
        z# lower_next_func: {0}r   generator_prologuestop_iterationN)rU   r=   r]   formatr   r   r    rJ   functionrD   get_argumentsr?   	load_intorL   r`   rP   resume_index_ptrrS   gen_state_ptrappend_basic_blocklower_function_bodyposition_at_endreturn_stop_iterationblkmapfirstblkr@   switchloaditemsadd_casebranch)r#   r9   rJ   rw   rK   prologueentry_block_tail
stop_blockfirst_blockr   indexblocks               r$   lower_next_funcz"BaseGeneratorLower.lower_next_func   s    	T\***299$,:RSSTTT|$Q'4<7777-> ...x88!!'"&"3"3GV"D"D"',	0 	0 	0 !% 9 9'6 J J!//@@../CDD !4466 001ABB

+++,,W555 	))).3l5>.JJd(+ T-B C C *, , .4466 	* 	*LE5OOE5)))) 	 0111x     r&   c                    t           j                            t           j                                        | j                            | j                  g          }t          j        |j	        || j
        j                  }|                    d          }t          |          }| j                            | j                  }|                    |j        d         |          }|                     ||           dS )z2
        Lower the generator's finalizer.
        entryr   N)llvmliteirFunctionTypeVoidTyper7   get_value_typer    r   get_or_insert_functionmoduler=   r+   r|   r   bitcastr"   lower_finalize_func_body)r#   r9   fntyrw   entry_blockrJ   genptrtyrK   s           r$   lower_finalize_funcz&BaseGeneratorLower.lower_finalize_func   s     {''(<(<(>(>)-)D)DT\)R)R(SU U1L$ @B B11'::K((<..t|<<q!18<<%%gv66666r&   c                     t          | j        j        j        d          }|j                            || j                   | j                            |j                   dS )zY
        Emit a StopIteration at generator end and mark the generator exhausted.
        N)r   rz   typepointeerJ   storerD   r   )r#   r9   indexvals      r$   return_from_generatorz(BaseGeneratorLower.return_from_generator   sU     D16>CCHd&;<<<,,U];;;;;r&   c                     d|fz  }|j                             |          }|j                            |           || j        |<   d S )Nzgenerator_resume%d)rw   r|   rJ   r~   r@   )r#   r9   r   
block_namer   s        r$   create_resumption_blockz*BaseGeneratorLower.create_resumption_block   sL    )UH4
11*==%%e,,,$)5!!!r&   c                 ~    t           j        r0| j                            |d                    |                     d S d S )NzDEBUGJIT: {0})r   	DEBUG_JITr7   r]   rv   )r#   rJ   msgs      r$   r]   zBaseGeneratorLower.debug_print   sF     	KL$$Wo.D.DS.I.IJJJJJ	K 	Kr&   N)r,   r-   r.   r/   rB   r2   rD   rL   rP   rS   rr   r   r   r   r   r]   r   r&   r$   r4   r4   0   s                $ $ X$; ; ;= = =6 6 6/ / /b,! ,! ,!\7 7 7< < <* * *K K K K Kr&   r4   c                   $    e Zd ZdZd Zd Zd ZdS )GeneratorLowerz9
    Support class for lowering nopython generators.
    c                     | j         j        S r6   )r   r!   r*   s    r$   r<   z!GeneratorLower.get_generator_type   s    {""r&   c                     |S r6   r   )r#   r9   rp   s      r$   re   z#GeneratorLower.box_generator_struct   s    r&   c                 N   |                      |d           | j        j        rX|                     ||          }| j                            ||          D ]&\  }}| j        j                            |||           '|                      |d           |                                 dS )g
        Lower the body of the generator's finalizer: decref all live
        state variables.
        z# generator: finalizez# generator: finalize endN)	r]   r7   r^   rL   r?   r   ra   decrefret_void)r#   rJ   rK   args_ptrtyvals         r$   r   z'GeneratorLower.lower_finalize_func_body   s    
 	"9:::<" 	: ((&99H?//BB : :C ''S9999"=>>>r&   N)r,   r-   r.   r/   r<   re   r   r   r&   r$   r   r      sK         # # #      r&   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )PyGeneratorLowerz<
    Support class for lowering object mode generators.
    c           	          t          j        | j        j        j        t           j        t           j        f| j        j        z  t           j        ft          | j        j	                  z  d          S )zx
        Compute the actual generator type (the generator function's return
        type is simply "pyobject").
        T)gen_funcr   	arg_typesstate_typeshas_finalizer)
r   r   r   func_idfuncpyobject	arg_countlenr;   
state_varsr*   s    r$   r<   z#PyGeneratorLower.get_generator_type   s\    
 \).~~'$,*@@)C0G,H,HH   	r&   c                     t          j        |j        |          }|j                            || j        |j                  S )z>
        Box the raw *gen_struct* as a Python object.
        )r   alloca_once_valuerJ   pyapifrom_native_generatorr    envarg)r#   r9   rp   gen_ptrs       r$   re   z%PyGeneratorLower.box_generator_struct  s6     +EM:FF{00$,UUUr&   c                     |j                             t          | j        j        j        d          | j                   dS )zo
        NULL-initialize all generator state variables, to avoid spurious
        decref's on cleanup.
        N)rJ   r   r   r{   r   r   rA   s     r$   init_generator_statez%PyGeneratorLower.init_generator_state	  sC    
 	HT%7%<%DdKK .	0 	0 	0 	0 	0r&   c                    | j                             |          }|                     ||          }|                    |          }|                    d|t          |j        d                    }t          j        ||          5  | 	                    ||          }t          t          | j        j                            D ]\}t          j        ||d|          }	| j        j        |         }
| j                             ||
|	          }|                    |           ]	 ddd           n# 1 swxY w Y   |                                 dS )r   >r   N)r7   get_python_apirP   r   icmp_signedr   r   r   if_unlikelyrS   ranger   r    r   rH   unpack_valuer   r   )r#   rJ   rK   r   rz   ri   need_cleanupr{   state_index
state_slotr   r   s               r$   r   z)PyGeneratorLower.lower_finalize_func_body  s   
 ++G4444WfEE||$455
 **x(91==? ?  ,77 	" 	" ..w??M$S)A%B%BCC " "$1'=23[B B
\-k:l//ZHHS!!!!"	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	s   BD,,D03D0N)r,   r-   r.   r/   r<   re   r   r   r   r&   r$   r   r      s]           V V V0 0 0    r&   r   c                   $    e Zd ZdZd Zd Zd ZdS )
LowerYieldz>
    Support class for lowering a particular yield point.
    c                 (   | _         j        | _        j        | _        j        | _        | j        j        | _        | j        j        | _        | j        j        | _        || _        | j        j        | _        || _	        fd|D             | _
        d S )Nc                 N    g | ]!}j         j                            |          "S r   )r:   r   r   ).0vr9   s     r$   
<listcomp>z'LowerYield.__init__.<locals>.<listcomp>>  s=     !5 !5 !5%& "'!5!@!F!Fq!I!I !5 !5 !5r&   )r9   r7   rJ   genlowerr    r{   rz   ypinst	live_varslive_var_indices)r#   r9   yield_pointr   s    `  r$   rB   zLowerYield.__init__2  s    
}}},!]8 $ >GL	"!5 !5 !5 !5*3!5 !5 !5r&   c                    | j                             d           t          | j        | j                  D ]\  }}t          j        | j        | j        d|          }| j	        j
        |         }| j                             |          }| j                             ||           | j                             |          }| j        j        r&| j        j                            | j        ||           | j                            | j        |||           t'          | j        j        j        | j        j                  }| j                            || j                   | j                             d           d S )Nz# generator suspendr   z# generator suspend end)r9   r]   r_   r   r   r   rH   rJ   r{   r    r   typeof_alloca_varloadvarr7   r^   ra   rb   
pack_valuer   rz   r   r   r   r   r   )r#   r   rO   r   r   fetyper   r   s           r$   lower_yield_suspendzLowerYield.lower_yield_suspendA  sW   
4555!$T%:DN!K!K 	G 	GK -dlD<N./> >J)+6B
 Z&&t,,FJ""4000*$$T**C|& ? ''b#>>>L##DL"c:FFFFD16> IO- -8T%:;;;
899999r&   c                 D   | j                             | j        | j        j                   | j                            d           t          | j        | j                  D ]\  }}t          j
        | j        | j        d|          }| j        j        |         }| j                            | j        ||          }| j                            ||           | j        j        r&| j        j                            | j        ||           | j                            d           d S )Nz# generator resumer   z# generator resume end)r   r   r9   r   r   r]   r_   r   r   r   rH   rJ   r{   r    r   r7   r   storevarr^   ra   r   )r#   r   rO   r   r   r   s         r$   lower_yield_resumezLowerYield.lower_yield_resumeZ  s   --dj$)/JJJ
3444!$T%:DN!K!K 	? 	?K -dlD<N./> >J)+6B,++DL"jIICJT***|& ? ''b#>>>
788888r&   N)r,   r-   r.   r/   rB   r   r   r   r&   r$   r   r   -  sK         5 5 5: : :29 9 9 9 9r&   r   )r/   llvmlite.irr   r   r   
numba.corer   r   r   numba.core.funcdescr   r
   objectr4   r   r   r   r   r&   r$   <module>r      sW        + + + + + + + + - - - - - - - - - - 2 2 2 2 2 2!/ !/ !/ !/ !/, !/ !/ !/HbK bK bK bK bK bK bK bKH    '   8: : : : :) : : :z;9 ;9 ;9 ;9 ;9 ;9 ;9 ;9 ;9 ;9r&   