U
    ,d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 )A    N)compile_isolatedFlags)jitnjit)types)TestCaseMemoryLeakMixin)test_factoryTc                    s    fdd}|S )Nc                    s   d} | D ]}||7 }q|S )Ng         )xresygen_funcr
   ?/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_generators.pyconsumer   s    
zmake_consumer.<locals>.consumerr
   )r   r   r
   r   r   make_consumer   s    r   c                 c   s   t | D ]
}|V  qd S Nrange)r   ir
   r
   r   gen1   s    r   c                 c   s2   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d S )Nr      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 r   r
   )r   r   r$   Zbbr
   r
   r   gen8Q   s    r+   c                 c   s   t   | V  d S r   )objectr   r
   r
   r   genobjZ   s    r-   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_   s    r0   c                 c   s   t | D ]
}|V  q
d S r   )npZndindex)shapeindr
   r
   r   gen_ndindexc   s    r4   c                 c   s   | j D ]
}|V  qd S r   )Zflat)r)   valr
   r
   r   gen_flath   s    
r6   c                 c   s   t | D ]
}|V  q
d S r   )r1   Zndenumerate)r)   tupr
   r
   r   gen_ndenumeratem   s    r8   c                   c   s
   dV  d S )NTr
   r
   r
   r
   r   gen_boolr   s    r9   c                   c   s   d V  dV  d S )Nr   r
   r
   r
   r
   r   gen_unification_errorv   s    r:   c                  c   s   d} dV  | V } q
d S )Nr   r   r
   )r   r
   r
   r   'gen_optional_and_type_unification_error{   s    r;   c                   c   s   dV  dV  d S )N)r   r"   )r      r
   r
   r
   r
   r   gen_changing_tuple_type   s    r=   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    r>   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   s^   |  t|t| dd |D }dd |D }|  || | t t| W 5 Q R X d S )Nc                 S   s   g | ]}|qS r
   r
   r.   r   r
   r
   r   
<listcomp>   s     z2TestGenerators.check_generator.<locals>.<listcomp>c                 S   s   g | ]}|qS r
   r
   r@   r
   r
   r   rA      s     )assertEqualnextassertRaisesStopIteration)selfpygencgenexpectedgotr
   r
   r   check_generator   s    zTestGenerators.check_generatorc                 C   s8   t }t|tjf|d}|d}|d}| || d S Nflags   )r   r   r   int32entry_pointrK   rF   rN   pyfunccrrG   rH   r
   r
   r   
check_gen1   s
    
zTestGenerators.check_gen1c                 C   s   |    d S r   )rU   rF   r
   r
   r   	test_gen1   s    zTestGenerators.test_gen1c                 C   s   | j td d S NrM   )rU   forceobj_flagsrV   r
   r
   r   test_gen1_objmode   s    z TestGenerators.test_gen1_objmodec                 C   s8   t }t|tjf|d}|d}|d}| || d S rL   )r   r   r   rP   rQ   rK   rR   r
   r
   r   
check_gen2   s
    
zTestGenerators.check_gen2c                 C   s   |    d S r   )r[   rV   r
   r
   r   	test_gen2   s    zTestGenerators.test_gen2c                 C   s   | j td d S rX   )r[   rY   rV   r
   r
   r   test_gen2_objmode   s    z TestGenerators.test_gen2_objmodec                 C   s8   t }t|tjf|d}|d}|d}| || d S rL   )r   r   r   rP   rQ   rK   rR   r
   r
   r   
check_gen3   s
    
zTestGenerators.check_gen3c                 C   s   |    d S r   )r^   rV   r
   r
   r   	test_gen3   s    zTestGenerators.test_gen3c                 C   s   | j td d S rX   )r^   rY   rV   r
   r
   r   test_gen3_objmode   s    z TestGenerators.test_gen3_objmodec                 C   sD   t }t|tjfd |d}|ddd}|ddd}| || d S )Nr   rM            )r    r   r   rP   rQ   rK   rR   r
   r
   r   
check_gen4   s
    zTestGenerators.check_gen4c                 C   s   |    d S r   )rd   rV   r
   r
   r   	test_gen4   s    zTestGenerators.test_gen4c                 C   s   | j td d S rX   )rd   rY   rV   r
   r
   r   test_gen4_objmode   s    z TestGenerators.test_gen4_objmodec              	   C   s4   |   }ttd W 5 Q R X | dt|j d S )Nr
   z2Cannot type generator: it does not yield any value)assertTypingErrorr   r!   assertInstr	exception)rF   cmr
   r
   r   	test_gen5   s
    
zTestGenerators.test_gen5c              	   C   sH   t tdtd}| }| t|g  | t t| W 5 Q R X d S Nr
   rM   )	r   r!   rY   rQ   rB   listrD   rE   rC   )rF   rT   rH   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| q2| |dgd  d S )Nr"   rM   ra   rb   r      )	r%   r   r   rP   rQ   r   appendrC   rB   )rF   rN   rS   rT   rH   lr   r
   r
   r   
check_gen6   s    zTestGenerators.check_gen6c                 C   s   |    d S r   )rs   rV   r
   r
   r   	test_gen6   s    zTestGenerators.test_gen6c                 C   s   | j td d S rX   )rs   rY   rV   r
   r
   r   test_gen6_objmode   s    z TestGenerators.test_gen6_objmodec                 C   sT   t }t|ttjddf|d}tddd}|| }||}| 	|| d S )Nr   CrM   
   rc   )
r*   r   r   ArrayZfloat64r1   linspacecopyrQ   rK   )rF   rN   rS   rT   r)   rG   rH   r
   r
   r   
check_gen7   s    
zTestGenerators.check_gen7c                 C   s   |    d S r   )r{   rV   r
   r
   r   	test_gen7   s    zTestGenerators.test_gen7c                 C   s   | j td d S rX   )r{   rY   rV   r
   r
   r   test_gen7_objmode   s    z TestGenerators.test_gen7_objmodec                    sN   t tf |  fdd}|dd |d |dd |dd	d
 d S )Nc                     s    | | | | d S r   )rK   )argskwargscfuncrS   rF   r
   r   check   s    z(TestGenerators.check_gen8.<locals>.checkr"   r   r<   ra   )r   rb   T)r   r$   )r+   r   )rF   Zjit_argsr   r
   r   r   
check_gen8   s    

zTestGenerators.check_gen8c                 C   s   | j dd d S )NTZnopythonr   rV   r
   r
   r   	test_gen8  s    zTestGenerators.test_gen8c                 C   s   | j dd d S )NT)Zforceobjr   rV   r
   r
   r   test_gen8_objmode
  s    z TestGenerators.test_gen8_objmodec                 C   s0   t }t|d|d}| }| }| || d S rm   )r9   r   rQ   rK   rR   r
   r
   r   
check_gen9  s
    zTestGenerators.check_gen9c                 C   s   | j td d S rX   )r   no_pyobj_flagsrV   r
   r
   r   	test_gen9  s    zTestGenerators.test_gen9c                 C   s   | j td d S rX   )r   rY   rV   r
   r
   r   test_gen9_objmode  s    z TestGenerators.test_gen9_objmodec                 C   sH   t dd|}t ddt|}t|}|d}|d}| || d S )NTr   ra   )r   r   ZassertPreciseEqual)rF   r   rH   r   rS   rI   rJ   r
   r
   r   check_consume_generator  s    z&TestGenerators.check_consume_generatorc                 C   s   |  t d S r   )r   r   rV   r
   r
   r   test_consume_gen1"  s    z TestGenerators.test_consume_gen1c                 C   s   |  t d S r   )r   r   rV   r
   r
   r   test_consume_gen2%  s    z TestGenerators.test_consume_gen2c                 C   s   |  t d S r   )r   r   rV   r
   r
   r   test_consume_gen3(  s    z TestGenerators.test_consume_gen3c                 C   sD   t }t|ttjdf|d}d}||}||}| || d S )Nr"   rM   r"   r   )r4   r   r   ZUniTupleintprQ   rK   )rF   rN   rS   rT   r2   rG   rH   r
   r
   r   check_ndindex-  s    
zTestGenerators.check_ndindexc                 C   s   |    d S r   )r   rV   r
   r
   r   test_ndindex6  s    zTestGenerators.test_ndindexc                 C   s   | j td d S rX   )r   rY   rV   r
   r
   r   test_ndindex_objmode9  s    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"   rv   rM   rb   Zdtyper   A)
r   r   rx   rP   r1   arangeZreshaperK   rQ   T)rF   rS   rN   rT   r)   r
   r
   r   check_np_flat<  s    zTestGenerators.check_np_flatc                 C   s   |  t d S r   )r   r6   rV   r
   r
   r   test_np_flatF  s    zTestGenerators.test_np_flatc                 C   s   | j ttd d S rX   )r   r6   rY   rV   r
   r
   r   test_np_flat_objmodeI  s    z#TestGenerators.test_np_flat_objmodec                 C   s   |  t d S r   )r   r8   rV   r
   r
   r   test_ndenumerateL  s    zTestGenerators.test_ndenumeratec                 C   s   | j ttd d S rX   )r   r8   rY   rV   r
   r
   r   test_ndenumerate_objmodeO  s    z'TestGenerators.test_ndenumerate_objmodec              	   C   s@   t }|  }t|dtd W 5 Q R X d}| |t|j d S )Nr
   rM   zACan't unify yield type from the following types: complex128, none)r:   rg   r   r   rh   ri   rj   rF   rS   emsgr
   r
   r   test_type_unification_errorR  s
    
z*TestGenerators.test_type_unification_errorc              	   C   sH   t }|  }t|dtd W 5 Q R X d}| |tjj t|j	 d S )Nr
   rM   zHCan't unify yield type from the following types: complex128, int%s, none)
r;   rg   r   r   rh   r   r   Zbitwidthri   rj   r   r
   r
   r   .test_optional_expansion_type_unification_error[  s
    
z=TestGenerators.test_optional_expansion_type_unification_errorc                 C   s,   t }t| }tt| }| || d S r   )r=   rn   r   rB   rF   rS   rI   rJ   r
   r
   r   test_changing_tuple_typed  s    
z'TestGenerators.test_changing_tuple_typec                 C   s,   t }t| }tt| }| || d S r   )r>   rn   r   rB   r   r
   r
   r   test_changing_number_typek  s    
z(TestGenerators.test_changing_number_typeN)/__name__
__module____qualname__rK   r   rU   rW   rZ   r[   r\   r]   r^   r_   r`   rd   re   rf   rl   ro   rs   rt   ru   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?      sV   
			
		r?   c                 c   s   | D ]
}|V  qd S r   r
   )Zaryelemr
   r
   r   nrt_gen0s  s    r   c                 c   s$   t | |D ]\}}|V  |V  q
d S r   )zip)Zary1Z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   rw   )r   r   r1   r   rz   rn   testingassert_equalrB   sysgetrefcount)rF   rG   rH   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   rw   d   )r   r   r1   r   rz   rn   r   r   rB   r   r   )	rF   rG   rH   Zpy_ary1Zpy_ary2Zc_ary1Z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   rV   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 5 Q R X | t t|}W 5 Q R X ~~tj	|| | 
|| | 
t|t| dS )z/
        Test cleanup on StopIteration
        Tr   r   N)r   r   r1   r   rz   rC   rD   rE   r   r   rB   r   r   )	rF   rG   rH   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   r1   r   rz   r   r   rB   r   r   )rF   rG   rH   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  s    z2TestNrtNestedGen.test_nrt_nested_gen.<locals>.gen0c                    s    fdd}|S )Nc                    s(   t | } | D ]}|| }q|| fS r   )r1   Z
zeros_like)r)   outr   r   r
   r   r     s    

zCTestNrtNestedGen.test_nrt_nested_gen.<locals>.factory.<locals>.gen1r
   r   r   r
   r   r   factory  s    z5TestNrtNestedGen.test_nrt_nested_gen.<locals>.factoryrw   Tr   )r1   r   rz   r   assertIsNotassertIsr   r   rB   r   r   )
rF   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     s    z8TestNrtNestedGen.test_nrt_nested_gen_refct.<locals>.gen0c                    s    fdd}|S )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>.factoryrw   Tr   )	r1   r   rz   r   r   r   rB   r   r   )rF   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>*      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   sB   t | } || D ]}|d V  qt|jD ]}|| V  q.d S )Nr"   )r1   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
   )Zdecorr   r
   )r   r   r   r   *  s    
z>TestNrtNestedGen.test_nrt_nested_nopython_gen.<locals>.factoryTr   rw   N)r   rn   rB   )rF   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   unittestZ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|| qHdS )	z9
        Missing environment for returning array
        Tr   c                 s   s.   t | D ] }td}d|d d < |V  qd S )Nr      )r   r1   empty)r   r   Zvecr
   r
   r   random_directionsO  s    
z?TestGeneratorWithNRT.test_issue_1254.<locals>.random_directionsra   r   r   N)r   rn   rB   lenr1   r   r   r   )rF   r   outputsexpectrJ   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   )r1   ry   )rminrmaxnrr#   r
   r
   r   r   c  s    
z4TestGeneratorWithNRT.test_issue_1265.<locals>.py_genTr   r"   r   c                    s@   | \}}}t j|t jd}t |||D ]\}}|||< q*|S Nr   r1   r   Z
complex128	enumerater~   r   r   r   Zpointsr   c)r   r
   r   	py_drivero  s
    

z7TestGeneratorWithNRT.test_issue_1265.<locals>.py_driverc                    s@   | \}}}t j|t jd}t |||D ]\}}|||< q*|S r   r   r   )r   r
   r   c_driverw  s
    

z6TestGeneratorWithNRT.test_issue_1265.<locals>.c_driverN)r   rn   rB   r1   r   r   )rF   r   r   r   r   r   Z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   rB   )rF   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   Z
yield_typeZ	arg_typesZstate_typesZhas_finalizer)
r   r   r   r   	GeneratorrP   Zint64Zfloat32r   Zfe_typer
   r
   r
   r   r     s
   

r   __main__)r   r"   F)2r   Znumpyr1   r   Znumba.core.compilerr   r   Znumbar   r   Z
numba.corer   Znumba.tests.supportr   r   Znumba.core.datamodel.testingr	   Zenable_pyobj_flagsZenable_pyobjectrY   Zforce_pyobjectr   r   r   r   r   r    r!   r%   r*   r+   r-   r0   r4   r6   r8   r9   r:   r;   r=   r>   r?   r   r   r   r   r   r   r   r   r
   r
   r
   r   <module>   sR   

	 dibY
