o
    8ήcF                     @   s  d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZ e Zde_e Zde_e Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zd@ddZdd Zdd  Z d!d" Z!d#d$ Z"d%d& Z#d'd( Z$d)d* Z%d+d, Z&d-d. Z'd/d0 Z(G d1d2 d2eeZ)d3d4 Z*d5d6 Z+G d7d8 d8eeZ,G d9d: d:eZ-G d;d< d<eeZ.G d=d> d>e Z/e0d?kre1  dS dS )A    N)compile_isolatedFlags)jitnjit)types)TestCaseMemoryLeakMixin)test_factoryTc                        fdd}|S )Nc                    s   d} | D ]}||7 }q|S )Ng         )xresygen_funcr   B/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_generators.pyconsumer   s   
zmake_consumer.<locals>.consumerr   )r   r   r   r   r   make_consumer      r   c                 c   s    t | D ]}|V  qd S Nrange)r   ir   r   r   gen1   s   r   c                 c   s4    t | D ]}|V  t ddD ]}|| V  qqd S )N      r   )r   r   jr   r   r   gen2$   s   r   c                 c   s     | V  | d V  | d V  d S )Ng      ?              ?r   r   r   r   r   gen3+   s   
r    c                 c   s$    t dD ]
}|V  || V  qd S )Nr   r   )r   r   zr   r   r   r   gen42   s
   r"   c                   c   s    d S r   r   r   r   r   r   gen5:   s   r#   c                 c   s     | d }	 |d }|| V  q)Nr   T   r   )abr   r   r   r   r   gen6B   s   
r'   c                 c   s     t | jD ]}| | V  qd S r   r   sizearrr   r   r   r   gen7J   s   r,   r   r$   Fc                 c   s.    | }| V  |r|V  |r| | V  d S d S r   r   )r   r   r&   bbr   r   r   gen8Q   s   r.   c                 c   s    t   | V  d S r   )objectr   r   r   r   genobjZ      
r0   c                 C   s   dd | D S )Nc                 s   s    | ]}|d  V  qdS )r$   Nr   ).0r   r   r   r   	<genexpr>`   s    z(return_generator_expr.<locals>.<genexpr>r   r   r   r   r   return_generator_expr_      r4   c                 c       t | D ]}|V  qd S r   )npndindex)shapeindr   r   r   gen_ndindexc      r;   c                 c   s    | j D ]}|V  qd S r   )flat)r+   valr   r   r   gen_flath   s   
r?   c                 c   r6   r   )r7   ndenumerate)r+   tupr   r   r   gen_ndenumeratem   r<   rB   c                   c   s    dV  d S )NTr   r   r   r   r   gen_boolr      
rC   c                   c   s    d V  dV  d S )Nr   r   r   r   r   r   gen_unification_errorv   r1   rE   c                  c   s    d} dV  	 | V } q)Nr   r   r   )r   r   r   r   'gen_optional_and_type_unification_error{   s   rF   c                   c   s    dV  dV  d S )N)r   r$   )r      r   r   r   r   r   gen_changing_tuple_type   s   
rH   c                   c   s    dV  dV  dV  d S )Nr   g      @y        33333P@r   r   r   r   r   gen_changing_number_type   s   
rI   c                   @   s  e Zd Zdd ZefddZdd Zdd Zefd	d
Zdd Z	dd Z
efddZdd Zdd ZefddZdd Zdd Zdd Zdd Zefdd Zd!d" Zd#d$ Zefd%d&Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zefd1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"efd?d@Z#dAdB Z$dCdD Z%efdEdFZ&dGdH Z'dIdJ Z(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.dWS )XTestGeneratorsc                 C   st   |  t|t| dd |D }dd |D }|  || | t t| W d    d S 1 s3w   Y  d S )Nc                 S      g | ]}|qS r   r   r2   r   r   r   r   
<listcomp>       z2TestGenerators.check_generator.<locals>.<listcomp>c                 S   rK   r   r   rL   r   r   r   rM      rN   )assertEqualnextassertRaisesStopIteration)selfpygencgenexpectedgotr   r   r   check_generator   s   
"zTestGenerators.check_generatorc                 C   8   t }t|tjf|d}|d}|d}| || d S Nflags   )r   r   r   int32entry_pointrX   rS   r\   pyfunccrrT   rU   r   r   r   
check_gen1   
   
zTestGenerators.check_gen1c                 C      |    d S r   )rc   rS   r   r   r   	test_gen1      zTestGenerators.test_gen1c                 C      | j td d S Nr[   )rc   forceobj_flagsrf   r   r   r   test_gen1_objmode      z TestGenerators.test_gen1_objmodec                 C   rY   rZ   )r   r   r   r^   r_   rX   r`   r   r   r   
check_gen2   rd   zTestGenerators.check_gen2c                 C   re   r   )rn   rf   r   r   r   	test_gen2   rh   zTestGenerators.test_gen2c                 C   ri   rj   )rn   rk   rf   r   r   r   test_gen2_objmode   rm   z TestGenerators.test_gen2_objmodec                 C   rY   rZ   )r    r   r   r^   r_   rX   r`   r   r   r   
check_gen3   rd   zTestGenerators.check_gen3c                 C   re   r   )rq   rf   r   r   r   	test_gen3   rh   zTestGenerators.test_gen3c                 C   ri   rj   )rq   rk   rf   r   r   r   test_gen3_objmode   rm   z TestGenerators.test_gen3_objmodec                 C   sD   t }t|tjfd |d}|ddd}|ddd}| || d S )Nr   r[            )r"   r   r   r^   r_   rX   r`   r   r   r   
check_gen4   s
   zTestGenerators.check_gen4c                 C   re   r   )rw   rf   r   r   r   	test_gen4   rh   zTestGenerators.test_gen4c                 C   ri   rj   )rw   rk   rf   r   r   r   test_gen4_objmode   rm   z TestGenerators.test_gen4_objmodec                 C   sH   |   }ttd W d    n1 sw   Y  | dt|j d S )Nr   z2Cannot type generator: it does not yield any value)assertTypingErrorr   r#   assertInstr	exception)rS   cmr   r   r   	test_gen5   s   
zTestGenerators.test_gen5c                 C   s^   t tdtd}| }| t|g  | t t| W d    d S 1 s(w   Y  d S Nr   r[   )	r   r#   rk   r_   rO   listrQ   rR   rP   )rS   rb   rU   r   r   r   test_gen5_objmode   s   
"z TestGenerators.test_gen5_objmodec                 C   s\   t }t|tjfd |d}|dd}g }tdD ]	}|t| q| |dgd  d S )Nr$   r[   rt   ru   r      )	r'   r   r   r^   r_   r   appendrP   rO   )rS   r\   ra   rb   rU   lr   r   r   r   
check_gen6   s   zTestGenerators.check_gen6c                 C   re   r   )r   rf   r   r   r   	test_gen6   rh   zTestGenerators.test_gen6c                 C   ri   rj   )r   rk   rf   r   r   r   test_gen6_objmode   rm   z TestGenerators.test_gen6_objmodec                 C   sT   t }t|ttjddf|d}tddd}|| }||}| 	|| d S )Nr   Cr[   
   rv   )
r,   r   r   Arrayfloat64r7   linspacecopyr_   rX   )rS   r\   ra   rb   r+   rT   rU   r   r   r   
check_gen7   s   
zTestGenerators.check_gen7c                 C   re   r   )r   rf   r   r   r   	test_gen7   rh   zTestGenerators.test_gen7c                 C   ri   rj   )r   rk   rf   r   r   r   test_gen7_objmode   rm   z TestGenerators.test_gen7_objmodec                    sR   t tdi |  fdd}|dd |d |dd |dd	d
 d S )Nc                     s$    | i | | i | d S r   )rX   )argskwargscfuncra   rS   r   r   check   s   z(TestGenerators.check_gen8.<locals>.checkr$   r   rG   rt   )r   ru   T)r   r&   r   )r.   r   )rS   jit_argsr   r   r   r   
check_gen8   s   

zTestGenerators.check_gen8c                 C      | j dd d S )NTnopythonr   rf   r   r   r   	test_gen8  rm   zTestGenerators.test_gen8c                 C   r   )NT)forceobjr   rf   r   r   r   test_gen8_objmode
  rm   z TestGenerators.test_gen8_objmodec                 C   s0   t }t|d|d}| }| }| || d S r   )rC   r   r_   rX   r`   r   r   r   
check_gen9  s
   zTestGenerators.check_gen9c                 C   ri   rj   )r   no_pyobj_flagsrf   r   r   r   	test_gen9  rm   zTestGenerators.test_gen9c                 C   ri   rj   )r   rk   rf   r   r   r   test_gen9_objmode  rm   z TestGenerators.test_gen9_objmodec                 C   sH   t dd|}t ddt|}t|}|d}|d}| || d S )NTr   rt   )r   r   assertPreciseEqual)rS   r   rU   r   ra   rV   rW   r   r   r   check_consume_generator  s   z&TestGenerators.check_consume_generatorc                 C      |  t d S r   )r   r   rf   r   r   r   test_consume_gen1"  r5   z TestGenerators.test_consume_gen1c                 C   r   r   )r   r   rf   r   r   r   test_consume_gen2%  r5   z TestGenerators.test_consume_gen2c                 C   r   r   )r   r    rf   r   r   r   test_consume_gen3(  r5   z TestGenerators.test_consume_gen3c                 C   sD   t }t|ttjdf|d}d}||}||}| || d S )Nr$   r[   r$   r   )r;   r   r   UniTupleintpr_   rX   )rS   r\   ra   rb   r9   rT   rU   r   r   r   check_ndindex-  s   
zTestGenerators.check_ndindexc                 C   re   r   )r   rf   r   r   r   test_ndindex6  rh   zTestGenerators.test_ndindexc                 C   ri   rj   )r   rk   rf   r   r   r   test_ndindex_objmode9  rm   z#TestGenerators.test_ndindex_objmodec                 C   s   t |ttjddf|d}tjdtjdd}| |||| t |ttjddf|d}|j	}| |||| d S )Nr$   r   r[   ru   dtyper   A)
r   r   r   r^   r7   arangereshaperX   r_   T)rS   ra   r\   rb   r+   r   r   r   check_np_flat<  s   zTestGenerators.check_np_flatc                 C   r   r   )r   r?   rf   r   r   r   test_np_flatF  r5   zTestGenerators.test_np_flatc                 C      | j ttd d S rj   )r   r?   rk   rf   r   r   r   test_np_flat_objmodeI     z#TestGenerators.test_np_flat_objmodec                 C   r   r   )r   rB   rf   r   r   r   test_ndenumerateL  r5   zTestGenerators.test_ndenumeratec                 C   r   rj   )r   rB   rk   rf   r   r   r   test_ndenumerate_objmodeO  r   z'TestGenerators.test_ndenumerate_objmodec                 C   sT   t }|  }t|dtd W d    n1 sw   Y  d}| |t|j d S )Nr   r[   zACan't unify yield type from the following types: complex128, none)rE   rz   r   r   r{   r|   r}   rS   ra   emsgr   r   r   test_type_unification_errorR  s   
z*TestGenerators.test_type_unification_errorc                 C   s\   t }|  }t|dtd W d    n1 sw   Y  d}| |tjj t|j	 d S )Nr   r[   zHCan't unify yield type from the following types: complex128, int%s, none)
rF   rz   r   r   r{   r   r   bitwidthr|   r}   r   r   r   r   .test_optional_expansion_type_unification_error[  s   
z=TestGenerators.test_optional_expansion_type_unification_errorc                 C   ,   t }t| }tt| }| || d S r   )rH   r   r   rO   rS   ra   rV   rW   r   r   r   test_changing_tuple_typed     
z'TestGenerators.test_changing_tuple_typec                 C   r   r   )rI   r   r   rO   r   r   r   r   test_changing_number_typek  r   z(TestGenerators.test_changing_number_typeN)/__name__
__module____qualname__rX   r   rc   rg   rl   rn   ro   rp   rq   rr   rs   rw   rx   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ      sX    
			
		rJ   c                 c   s    | D ]}|V  qd S r   r   )aryelemr   r   r   nrt_gen0s  s   r   c                 c   s&    t | |D ]
\}}|V  |V  qd S r   )zip)ary1ary2e1e2r   r   r   nrt_gen1x  s
   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestNrtArrayGenc                 C   sr   t }tdd|}td}| }t||}t||}tj|| | || | t	
|t	
| d S )NTr   r   )r   r   r7   r   r   r   testingassert_equalrO   sysgetrefcount)rS   rT   rU   py_aryc_arypy_resc_resr   r   r   test_nrt_gen0  s   
zTestNrtArrayGen.test_nrt_gen0c           	      C   s   t }tdd|}td}|d }| }| }t|||}t|||}tj|| tj|| | || | t	
|t	
| | t	
|t	
| d S )NTr   r   d   )r   r   r7   r   r   r   r   r   rO   r   r   )	rS   rT   rU   py_ary1py_ary2c_ary1c_ary2r   r   r   r   r   test_nrt_gen1  s"   
zTestNrtArrayGen.test_nrt_gen1c                 C   s   |    |   dS )a2  
        Issue #1163 is observed when two generator with NRT object arguments
        is ran in sequence.  The first one does a invalid free and corrupts
        the NRT memory subsystem.  The second generator is likely to segfault
        due to corrupted NRT data structure (an invalid MemInfo).
        N)r   r   rf   r   r   r   test_combine_gen0_gen1  s   z&TestNrtArrayGen.test_combine_gen0_gen1c           	      C   s   t }tdd|}td}| }||}||}t|}t|}| t t|}W d   n1 s6w   Y  | t t|}W d   n1 sOw   Y  ~~tj	|| | 
|| | 
t|t| dS )z/
        Test cleanup on StopIteration
        Tr   r   N)r   r   r7   r   r   rP   rQ   rR   r   r   rO   r   r   )	rS   rT   rU   r   r   py_iterc_iterr   r   r   r   r   test_nrt_gen0_stop_iteration  s*   


z,TestNrtArrayGen.test_nrt_gen0_stop_iterationc                 C   sb   t }tdd|}td}| }||}||}~~tj|| | t	|t	| dS )zj
        Test cleanup for a initialized but never iterated (never call next())
        generator.
        Tr   r   N)
r   r   r7   r   r   r   r   rO   r   r   )rS   rT   rU   r   r   r   r   r   r   r   test_nrt_gen0_no_iter  s   
z%TestNrtArrayGen.test_nrt_gen0_no_iterN)r   r   r   r   r   r   r   r   r   r   r   r   r   ~  s    
r   c                   @   s*   e Zd Zdd Zejdd Zdd ZdS )TestNrtNestedGenc           
      C   s   dd }dd }t d}| }|||\}}tdd|tdd|}||\}}	| || | || | |	| t j|| | t	
|t	
| d S )Nc                 s   s    t | jD ]}| V  qd S r   r(   r*   r   r   r   gen0  r<   z2TestNrtNestedGen.test_nrt_nested_gen.<locals>.gen0c                    r
   )Nc                    s(   t | } | D ]}|| }q	|| fS r   )r7   
zeros_like)r+   outr   r   r   r   r     s   

zCTestNrtNestedGen.test_nrt_nested_gen.<locals>.factory.<locals>.gen1r   r   r   r   r   r   factory  r   z5TestNrtNestedGen.test_nrt_nested_gen.<locals>.factoryr   Tr   )r7   r   r   r   assertIsNotassertIsr   r   rO   r   r   )
rS   r   r   py_arrc_arrr   py_oldc_genr   c_oldr   r   r   test_nrt_nested_gen  s   
	z$TestNrtNestedGen.test_nrt_nested_genc                 C   s   dd }dd }t d}| }|||}tdd|tdd|}||}| || | || | || | t|t| d S )Nc                 s   s    | V  d S r   r   )r+   r   r   r   r     rD   z8TestNrtNestedGen.test_nrt_nested_gen_refct.<locals>.gen0c                    r
   )Nc                    s    | D ]}|  S d S r   r   )r+   r   r   r   r   r     s   zITestNrtNestedGen.test_nrt_nested_gen_refct.<locals>.factory.<locals>.gen1r   r   r   r   r   r     s   z;TestNrtNestedGen.test_nrt_nested_gen_refct.<locals>.factoryr   Tr   )	r7   r   r   r   r   r   rO   r   r   )rS   r   r   r   r   r   r   r   r   r   r   test_nrt_nested_gen_refct  s   
z*TestNrtNestedGen.test_nrt_nested_gen_refctc                 C   sL   dd fdd}| }|t dd}t|d}t|d}| || dS )	z/
        Test nesting three generators
        c                 S   s   | S r   r   r   r   r   r   <lambda>*  s    z?TestNrtNestedGen.test_nrt_nested_nopython_gen.<locals>.<lambda>c                    s0   | dd | fdd |  fdd}|S )Nc                 s   s.    t |D ]}| | V  | |  |7  < qd S r   r   )r%   nr   r   r   r   foo+  s
   
zKTestNrtNestedGen.test_nrt_nested_nopython_gen.<locals>.factory.<locals>.fooc                 3   sD    t | } || D ]}|d V  qt|jD ]}|| V  qd S )Nr$   )r7   r   r   r)   )r   r%   r   )r   r   r   bar1  s   
zKTestNrtNestedGen.test_nrt_nested_nopython_gen.<locals>.factory.<locals>.barc                 3   s     | D ]}|| V  qd S r   r   )r   r   )r   r   r   cat9  s   zKTestNrtNestedGen.test_nrt_nested_nopython_gen.<locals>.factory.<locals>.catr   )decorr   r   )r   r   r   r   *  s   
z>TestNrtNestedGen.test_nrt_nested_nopython_gen.<locals>.factoryTr   r   N)r   r   rO   )rS   r   py_genr   r   r   r   r   r   test_nrt_nested_nopython_gen%  s   z-TestNrtNestedGen.test_nrt_nested_nopython_genN)r   r   r   r   unittestexpectedFailurer   r   r   r   r   r   r     s
    $
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestGeneratorWithNRTc                 C   s`   t dddd }t|d}| t|d td}d|dd< |D ]	}tj|| q$dS )	z9
        Missing environment for returning array
        Tr   c                 s   s0    t | D ]}td}d|d d < |V  qd S )Nr      )r   r7   empty)r   r   vecr   r   r   random_directionsO  s   
z?TestGeneratorWithNRT.test_issue_1254.<locals>.random_directionsrt   r   r  N)r   r   rO   lenr7   r  r   r   )rS   r  outputsexpectrW   r   r   r   test_issue_1254J  s   

z$TestGeneratorWithNRT.test_issue_1254c                    s   dd t dd tddd}t ddd}| || fdd	}t dd fd
d}d}dd|f}||}||}tj|| dS )zM
        Double-free for locally allocated, non escaping NRT objects
        c                 s   s(    t | ||}|d V  |d V  d S )Nr   r   )r7   r   )rminrmaxnrr%   r   r   r   r   c  s   
z4TestGeneratorWithNRT.test_issue_1265.<locals>.py_genTr   r$   r   c                    @   | \}}}t j|t jd}t |||D ]\}}|||< q|S Nr   r7   r  
complex128	enumerater   r  r  r  pointsr   c)r   r   r   	py_drivero  s
   

z7TestGeneratorWithNRT.test_issue_1265.<locals>.py_driverc                    r  r  r  r  )r   r   r   c_driverw  s
   

z6TestGeneratorWithNRT.test_issue_1265.<locals>.c_driverN)r   r   rO   r7   r   r   )rS   r   r   r  r  r   patchesr   )r   r   r   test_issue_1265^  s   
z$TestGeneratorWithNRT.test_issue_1265c                    sF   dt fdd t  fddt fdd}| |  dS )	z-
        Incorrect return data model
        l   >[= c                   3   s     V  d S r   r   r   )magicr   r   	generator  s   
z7TestGeneratorWithNRT.test_issue_1808.<locals>.generatorc                      s     S r   r   r   )r  r   r   get_generator  s   z;TestGeneratorWithNRT.test_issue_1808.<locals>.get_generatorc                     s   d}   D ]}| |7 } q| S )Nr   r   )r   r   )r  r   r   main  s   

z2TestGeneratorWithNRT.test_issue_1808.<locals>.mainN)r   rO   )rS   r   r   )r  r  r  r   test_issue_1808  s   z$TestGeneratorWithNRT.test_issue_1808N)r   r   r   r  r  r!  r   r   r   r   r  I  s    +r  c                	   @   s<   e Zd Zejdejejejgejejddd gddZ	dS )TestGeneratorModelNr   F)r   
yield_type	arg_typesstate_typeshas_finalizer)
r   r   r   r   	Generatorr^   int64float32r   fe_typer   r   r   r   r"    s    


r"  __main__)r   r$   F)2r   numpyr7   r  numba.core.compilerr   r   numbar   r   
numba.corer   numba.tests.supportr   r   numba.core.datamodel.testingr	   enable_pyobj_flagsenable_pyobjectrk   force_pyobjectr   r   r   r   r    r"   r#   r'   r,   r.   r0   r4   r;   r?   rB   rC   rE   rF   rH   rI   rJ   r   r   r   r   r  r"  r   r   r   r   r   r   <module>   sV    

	 dibY