U
    ,d                     @   sV  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZ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mZ d dlmZmZ d dl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# d d
l$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2Z2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8dd Z9dd Z:dd Z;d d! Z<d"d# Z=d$d% Z>e? Z@d&d' ZAe#jBZCG d(d) d)e(ZDG d*d+ d+e(ZEG d,d- d-eEZFG d.d/ d/eEZGd0d1 ZHd2d3 ZIG d4d5 d5e'e(ZJd6d7 ZKd8d9 ZLG d:d; d;e'e(ZMG d<d= d=eEZNG d>d? d?e(ZOePd@krRe2Q  dS )A    N)find_setupwithswith_lifting)bypass_contextcall_contextobjmode_context)FunctionIdentityByteCode)Interpreter)typingerrorscpu)
cpu_target)
compile_irDEFAULT_FLAGS)njittypeofobjmodetypes)overload)
MemoryLeakTestCasecaptured_stdoutskip_unless_scipy
linux_onlystrace_supportedstrace)	PYVERSION)jitclassc                 C   s*   t | }t|d}t|}||}|S )N)func_id)r   from_functionr   r	   Z	interpret)funcr   ZbcZinterpZfunc_ir r!   @/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_withlifting.pyget_func_ir   s
    


r#   c                	   C   s2   t d t t d t  W 5 Q R X t d d S )NABCprintr   br!   r!   r!   r"   lift1%   s
    r*   c               	   C   s   d} t d|  d} t t d|  | d7 } t  W 5 Q R X | d7 } t t d|  t  | d7 } W 5 Q R X | d7 } t d|  d S )N   r$   r%   d   r&   
   Dr'   xr!   r!   r"   lift2-   s    


r1   c               
   C   s   d} d}t d| | tB t d t  | d7 } t t d |d7 }t  W 5 Q R X W 5 Q R X | d7 } |d7 }t d| | d S )Nr+   r,   r$   r%   r&   i r.   r'   r0   yr!   r!   r"   lift3>   s    r4   c                  C   s   d} t d|  | d7 } tP t d t  | d7 } tdD ]*}t t d t  | |7 } W 5 Q R X q:W 5 Q R X t  t d t  | r| d9 } W 5 Q R X | d7 } t d|  d S )	Nr   r$   r-   r%   r+   r&   r.   E)r(   r   r)   ranger0   ir!   r!   r"   lift4O   s&    
r9   c                   C   s   t d d S )Nr$   r(   r!   r!   r!   r"   lift5e   s    r;   c               	   C   s4   d} t d|  t | d7 } W 5 Q R X t d|  | S )Nr+   r$   r%   r(   r   r/   r!   r!   r"   	liftcall1i   s    

r=   c               	   C   sV   d} t d|  t | d7 } W 5 Q R X t d|  t | d7 } W 5 Q R X t d|  | S )Nr+   r$   r%   r-   r&   r<   r/   r!   r!   r"   	liftcall2r   s    


r>   c               	   C   sl   d} t d|  t | dkr$| d7 } W 5 Q R X t d|  t tdD ]}| |7 } qFW 5 Q R X t d|  | S )Nr+   r$   r   r%   r-   r&   )r(   r   r6   r7   r!   r!   r"   	liftcall3~   s    


r?   c                
   C   s$   t  t  W 5 Q R X W 5 Q R X d S N)r   r!   r!   r!   r"   	liftcall4   s    rA   c               
   C   sH   t dD ]:} t, t|  | dkr8td W 5 Q R   qDW 5 Q R X q| S )Nr-      r$   )r6   r   r(   )r8   r!   r!   r"   	liftcall5   s    rC   c                	   C   s   t  W 5 Q R X d S r@   )Zundefined_global_varr!   r!   r!   r"   lift_undefiend   s    rD   c                	   C   s   t  W 5 Q R X d S r@   )bogus_contextmanagerr!   r!   r!   r"   lift_invalid   s    rF   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestWithFindingc                 C   s(   t |}tt|d }| || d S Nr   )r#   lenr   assertEqual)selfr    expect_countthe_irctr!   r!   r"   check_num_of_with   s    z!TestWithFinding.check_num_of_withc                 C   s   | j tdd d S Nr+   rL   )rO   r*   rK   r!   r!   r"   
test_lift1   s    zTestWithFinding.test_lift1c                 C   s   | j tdd d S N   rQ   )rO   r1   rR   r!   r!   r"   
test_lift2   s    zTestWithFinding.test_lift2c                 C   s   | j tdd d S rP   )rO   r4   rR   r!   r!   r"   
test_lift3   s    zTestWithFinding.test_lift3c                 C   s   | j tdd d S rT   )rO   r9   rR   r!   r!   r"   
test_lift4   s    zTestWithFinding.test_lift4c                 C   s   | j tdd d S )Nr   rQ   )rO   r;   rR   r!   r!   r"   
test_lift5   s    zTestWithFinding.test_lift5N)	__name__
__module____qualname__rO   rS   rV   rW   rX   rY   r!   r!   r!   r"   rG      s   rG   c                       s.   e Zd Z fddZdd Zd	ddZ  ZS )
BaseTestWithLiftingc                    s0   t t|   t | _t| j| _t	| _
d S r@   )superr]   setUpr
   Context	typingctxr   Z
CPUContext	targetctxr   flagsrR   	__class__r!   r"   r_      s    
zBaseTestWithLifting.setUpc           	   	   C   sl   t |}t|| j| j| ji d\}}| t|| | |}t }|	  W 5 Q R X | |
 | d S Nlocals)r#   r   ra   rb   rc   rJ   rI   r   r   Zentry_pointgetvalue)	rK   r    rL   expected_stdoutrM   Znew_irZ	extractedZcresoutr!   r!   r"   check_extracted_with   s       

z(BaseTestWithLifting.check_extracted_withr!   Nc              
   C   sL   | j }| j}| j}t||$ t||||||i dW  5 Q R  S Q R X d S rf   )ra   rb   rc   r   Znested_contextr   )rK   rM   argsreturn_typera   rb   rc   r!   r!   r"   r      s    
  zBaseTestWithLifting.compile_ir)r!   N)rZ   r[   r\   r_   rl   r   __classcell__r!   r!   rd   r"   r]      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 )TestLiftByPassc                 C   s   | j tddd d S )Nr+   zA
C
rL   rj   )rl   r*   rR   r!   r!   r"   rS      s    zTestLiftByPass.test_lift1c                 C   s   | j tddd d S )NrU   zA 1
D 3
rq   )rl   r1   rR   r!   r!   r"   rV      s    zTestLiftByPass.test_lift2c                 C   s   | j tddd d S )Nr+   zA 1 100
D 2 101
rq   )rl   r4   rR   r!   r!   r"   rW      s    zTestLiftByPass.test_lift3c                 C   s   | j tddd d S )NrU   z	A 0
E 11
rq   )rl   r9   rR   r!   r!   r"   rX      s    zTestLiftByPass.test_lift4c                 C   s   | j tddd d S )Nr   zA
rq   )rl   r;   rR   r!   r!   r"   rY      s    zTestLiftByPass.test_lift5N)rZ   r[   r\   rS   rV   rW   rX   rY   r!   r!   r!   r"   rp      s
   rp   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Ze	e
dkddd ZdS )TestLiftCallc              	   C   sP   t |}t }|  W 5 Q R X t }|  W 5 Q R X | | |  dS )z2Ensure same semantic with non-jitted code
        N)r   r   rJ   ri   )rK   r    Zjittedgotexpectr!   r!   r"   check_same_semantic   s    z TestLiftCall.check_same_semanticc                 C   s   | j tddd | t d S )Nr+   zA 1
B 2
rq   )rl   r=   ru   rR   r!   r!   r"   test_liftcall1  s    zTestLiftCall.test_liftcall1c                 C   s   | j tddd | t d S )NrU   zA 1
B 2
C 12
rq   )rl   r>   ru   rR   r!   r!   r"   test_liftcall2  s    zTestLiftCall.test_liftcall2c                 C   s   | j tddd | t d S )NrU   zA 1
B 2
C 47
rq   )rl   r?   ru   rR   r!   r!   r"   test_liftcall3  s    zTestLiftCall.test_liftcall3c              	   C   sN   t jt jt jt jf}| |}tt  W 5 Q R X d}| |t	|j
 d S )Nz2compiler re-entrant to the same function signature)r   TypingErrorZNumbaRuntimeErrorZNumbaValueErrorCompilerErrorassertRaisesr   rA   assertInstr	exception)rK   acceptraisesmsgr!   r!   r"   test_liftcall4  s     zTestLiftCall.test_liftcall4      zunsupported on py3.8 and beforec                 C   s   | j tddd | t d S )Nr+   z0
1
2
3
4
5
A
rq   )rl   rC   ru   rR   r!   r!   r"   test_liftcall5   s    zTestLiftCall.test_liftcall5N)rZ   r[   r\   ru   rv   rw   rx   r   unittestZskipIfr   r   r!   r!   r!   r"   rr      s   
rr   c                    s    fdd}|S )Nc              	      s>   |  tj} | f|| W 5 Q R X | dt|j d S )NzDoes not support list typer{   r   ry   r|   r}   r~   rK   rm   kwargsr   fnr!   r"   core)  s
    z+expected_failure_for_list_arg.<locals>.corer!   r   r   r!   r   r"   expected_failure_for_list_arg(  s    r   c                    s    fdd}|S )Nc              	      s>   |  tj} | f|| W 5 Q R X | dt|j d S )NzDoes not support function typer   r   r   r!   r"   r   2  s
    z/expected_failure_for_function_arg.<locals>.corer!   r   r!   r   r"   !expected_failure_for_function_arg1  s    r   c                   @   s  e Z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
edd Zdd Zedd Zdd Zedd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zed'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zejd3d4 Ze d5d6 Z!d7d8 Z"e#d9d: Z$d;d< Z%ejd=d> Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOdP Z/dQdR Z0dSdT Z1dUdV Z2dWdX Z3e4dYdZ Z5d[d\ Z6d]d^ Z7d_d` Z8dadb Z9dcdd Z:deS )fTestLiftObjc                 C   s   t dtj d S Nerrorwarningssimplefilterr   ZNumbaWarningrR   r!   r!   r"   r_   <  s    zTestLiftObj.setUpc                 C   s   t   d S r@   r   resetwarningsrR   r!   r!   r"   tearDown?  s    zTestLiftObj.tearDownc              	   G   s   t |}t |}t|}t }|| }| }W 5 Q R X |ttt| t }|| }	| }
W 5 Q R X | 	||
 | 
||	 d S r@   )copydeepcopyr   r   ri   compiletuplemapr   rJ   assertPreciseEqual)rK   pyfuncrm   Zpy_argsZc_argsZcfuncstreamZ
expect_resZ
expect_outZgot_resZgot_outr!   r!   r"   assert_equal_return_and_stdoutB  s    

z*TestLiftObj.assert_equal_return_and_stdoutc                    s<   dd   fdd} fdd}|  |d |  |d d S )Nc                 S   s   t dd| d i d S )Nzival =ivalrU   r:   r   r!   r!   r"   barU  s    z0TestLiftObj.test_lift_objmode_basic.<locals>.barc              	      s(   | d7 } t   |  W 5 Q R X | d S Nr+   r   r   r   r!   r"   fooX  s    z0TestLiftObj.test_lift_objmode_basic.<locals>.fooc              	      s*   | d7 } t j  |  W 5 Q R X | d S r   numbar   r   r   r!   r"   foo_nonglobal^  s    z:TestLiftObj.test_lift_objmode_basic.<locals>.foo_nonglobal{   r   )rK   r   r   r!   r   r"   test_lift_objmode_basicT  s
    z#TestLiftObj.test_lift_objmode_basicc                    s(   dd   fdd}d}|  || d S )Nc                 S   s   t d| d i | d9 } d S )NarrrU   r:   )r   r!   r!   r"   r   h  s    z3TestLiftObj.test_lift_objmode_array_in.<locals>.barc              	      s2   t | t j}t  | W 5 Q R X |d S r   )nparangeastypeint64r   )nelemr   r   r!   r"   r   m  s    z3TestLiftObj.test_lift_objmode_array_in.<locals>.foor-   r   )rK   r   r   r!   r   r"   test_lift_objmode_array_ing  s    z&TestLiftObj.test_lift_objmode_array_inc                    s(   dd   fdd}d}|  || d S )Nc                 S   s   t |  d S r@   r:   r3   r!   r!   r"   r   x  s    z<TestLiftObj.test_lift_objmode_define_new_unused.<locals>.barc              	      s0   t    d|  }t|} | W 5 Q R X | S NrU   )r   r   r   )r0   r3   ar   r!   r"   r   {  s
    
z<TestLiftObj.test_lift_objmode_define_new_unused.<locals>.foor   r   rK   r   argr!   r   r"   #test_lift_objmode_define_new_unusedw  s    z/TestLiftObj.test_lift_objmode_define_new_unusedc                    s@   dd   fdd} fdd}d}|  || |  || d S )Nc                 S   s   t |  d|  S r   r:   r/   r!   r!   r"   inverse  s    z<TestLiftObj.test_lift_objmode_return_simple.<locals>.inversec              	      s&   t dd  | }W 5 Q R X | |fS Nfloat64r   r   r2   r   r!   r"   r     s    z8TestLiftObj.test_lift_objmode_return_simple.<locals>.fooc              	      s(   t jdd  | }W 5 Q R X | |fS r   r   r2   r   r!   r"   r     s    zBTestLiftObj.test_lift_objmode_return_simple.<locals>.foo_nonglobalr   r   )rK   r   r   r   r!   r   r"   test_lift_objmode_return_simple  s    z+TestLiftObj.test_lift_objmode_return_simplec                    s6   dd   fdd}t jddt jd}| || d S )Nc                 S   s   t |  d|  S r   r:   r/   r!   r!   r"   r     s    z;TestLiftObj.test_lift_objmode_return_array.<locals>.inversec              	      s6   t ddd  | }t|d }W 5 Q R X | ||fS )N
float64[:]r   )r3   zr   )r   intr0   r3   r   r   r!   r"   r     s    z7TestLiftObj.test_lift_objmode_return_array.<locals>.foor+   r-   Zdtype)r   r   r   r   r   r!   r   r"   test_lift_objmode_return_array  s    z*TestLiftObj.test_lift_objmode_return_arrayc                 C   s"   dd }dddg}|  || d S )Nc              	   S   sX   t dd@ t|  d| d< t|  dddg|  }tdd	 |D }W 5 Q R X | |fS )
Nr   r      r   r+   rU   r   c                 S   s   g | ]}d | qS )r+   r!   ).0r8   r!   r!   r"   
<listcomp>  s     zITestLiftObj.test_lift_objmode_using_list.<locals>.foo.<locals>.<listcomp>)r   r(   r   asarrayr2   r!   r!   r"   r     s    z5TestLiftObj.test_lift_objmode_using_list.<locals>.foor+   rU   r   r   r   r!   r!   r"   test_lift_objmode_using_list  s    	
z(TestLiftObj.test_lift_objmode_using_listc                 C   s   dd }d}|  || d S )Nc              	   S   sj   t | D ]} q| r| d7 } tdd< t|  | d8 } t|  t | D ]}| |7 } t|  qFW 5 Q R X | S )Nr+   intpr/   )r6   r   r(   r7   r!   r!   r"   r     s    z4TestLiftObj.test_lift_objmode_var_redef.<locals>.foor   r   r   r!   r!   r"   test_lift_objmode_var_redef  s    z'TestLiftObj.test_lift_objmode_var_redefc                 C   s    dd }|  |dddgd d S )Nc              	   S   sL   || d< t   t|  W 5 Q R X t   d| | d< t|  W 5 Q R X | S r   r   r(   r0   r   r!   r!   r"   r     s    z=TestLiftObj.test_case01_mutate_list_ahead_of_ctx.<locals>.foor+   rU   r      r   rK   r   r!   r!   r"   $test_case01_mutate_list_ahead_of_ctx  s    z0TestLiftObj.test_case01_mutate_list_ahead_of_ctxc                 C   s*   dd }t dddg}| ||d d S )Nc              	   S   sL   || d< t   t|  W 5 Q R X t   d| | d< t|  W 5 Q R X | S r   r   r   r!   r!   r"   r     s    z>TestLiftObj.test_case02_mutate_array_ahead_of_ctx.<locals>.foor+   rU   r   r   r   arrayr   rK   r   r0   r!   r!   r"   %test_case02_mutate_array_ahead_of_ctx  s    z1TestLiftObj.test_case02_mutate_array_ahead_of_ctxc                 C   s   dd }|  |d d S )Nc              	   S   s>   t dd dddg}W 5 Q R X t   d|d< W 5 Q R X |S NzList(int64)r   r+   rU   r   r-   r   r2   r!   r!   r"   r     s
    z6TestLiftObj.test_case03_create_and_mutate.<locals>.foor+   r   r   r!   r!   r"   test_case03_create_and_mutate  s    z)TestLiftObj.test_case03_create_and_mutatec              	   C   sV   dd }t dddg}t|}| tj}|| W 5 Q R X | dt|j d S )Nc              	   S   s"   t dd t|  W 5 Q R X | S )Nr   kr   r/   r!   r!   r"   r     s    z=TestLiftObj.test_case04_bogus_variable_type_info.<locals>.foor+   rU   r   z1Invalid type annotation on non-outgoing variables)	r   r   r   r{   r   ry   r|   r}   r~   rK   r   r0   cfoor   r!   r!   r"   $test_case04_bogus_variable_type_info  s    z0TestLiftObj.test_case04_bogus_variable_type_infoc              	   C   sT   dd }t dddg}t|}| t}||}W 5 Q R X | dt|j d S )Nc              	   S   s"   t dd | d }W 5 Q R X |S )Nr   r   y              ?r   r   r!   r!   r"   r     s    z4TestLiftObj.test_case05_bogus_type_info.<locals>.foor+   rU   r   zXcan't unbox array from PyObject into native value.  The object maybe of a different type)r   r   r   r{   	TypeErrorr|   r}   r~   )rK   r   r0   r   r   rs   r!   r!   r"   test_case05_bogus_type_info  s    z'TestLiftObj.test_case05_bogus_type_infoc              	   C   sF   dd }|  tj}t|d W 5 Q R X d}| t|j| d S )Nc              
   S   s0   t    t   t|  W 5 Q R X W 5 Q R X | S r@   r   r/   r!   r!   r"   r     s    z3TestLiftObj.test_case06_double_objmode.<locals>.foor   z@During: resolving callee type: type\(ObjModeLiftedWith\(<.*>\)\))r{   r   ry   r   assertRegexr}   r~   )rK   r   r   patr!   r!   r"   test_case06_double_objmode  s
    	z&TestLiftObj.test_case06_double_objmodec              	   C   sf   dd }t dddg}t|}| tj}|| W 5 Q R X t|j}| d| | d| d S )Nc              	   S   s(   t   d| i}d}W 5 Q R X | ||fS )Nr   r   r   )r0   tur!   r!   r"   r   +  s    z6TestLiftObj.test_case07_mystery_key_error.<locals>.foor+   rU   r   z;Missing type annotation on outgoing variable(s): ['t', 'u']z9Example code: with objmode(t='<add_type_as_string_here>'))	r   r   r   r{   r   ry   r}   r~   r|   )rK   r   r0   r   r   Zexstrr!   r!   r"   test_case07_mystery_key_error)  s    
z)TestLiftObj.test_case07_mystery_key_errorc              	      s^   t    fdd}tdddg}t|}| t}|| W 5 Q R X | t|jd d S )Nc              
      sL   t t| D ]:}t * t|}| | }| |< t d  W 5 Q R X q| S )N2)r6   rI   r   r}   r(   )r0   r8   r   vdr!   r"   r   C  s    z8TestLiftObj.test_case08_raise_from_external.<locals>.foor+   rU   r   z'2')	dictr   r   r   r{   KeyErrorrJ   r}   r~   r   r!   r   r"   test_case08_raise_from_external>  s    	z+TestLiftObj.test_case08_raise_from_externalc              	   C   sV   dd }t dddg}t|}| tj}|| W 5 Q R X | dt|j d S )Nc              	   S   s   t   t W 5 Q R X | S r@   )r   
ValueErrorr/   r!   r!   r"   r   S  s    z3TestLiftObj.test_case09_explicit_raise.<locals>.foor+   rU   r   zBunsupported control flow due to raise statements inside with block)	r   r   r   r{   r   rz   r|   r}   r~   r   r!   r!   r"   test_case09_explicit_raiseR  s    z&TestLiftObj.test_case09_explicit_raisec                 C   s(   dd }t dddg}| || d S )Nc              	   S   s>   t dd dddg}W 5 Q R X t   d|d< W 5 Q R X |S r   r   r2   r!   r!   r"   r   e  s
    z;TestLiftObj.test_case10_mutate_across_contexts.<locals>.foor+   rU   r   r   r   r!   r!   r"   "test_case10_mutate_across_contextsb  s    z.TestLiftObj.test_case10_mutate_across_contextsc                 C   s(   dd }t dddg}| || d S )Nc              	   S   sH   t dd tjdddgdd}W 5 Q R X t   d|d< W 5 Q R X |S )	Nint64[:]r   r+   rU   r   r   r   r-   )r   r   r   r2   r!   r!   r"   r   q  s
    zATestLiftObj.test_case10_mutate_array_across_contexts.<locals>.foor+   rU   r   r   r   r!   r!   r"   (test_case10_mutate_array_across_contextso  s    z4TestLiftObj.test_case10_mutate_array_across_contextsc              	   C   sT   dd }t dddg}t|}| t}|| W 5 Q R X | dt|j d S )Nc              	   S   s   t   dd }W 5 Q R X | S )Nc                 S   s   | d S r   r!   r   r!   r!   r"   r     s    zLTestLiftObj.test_case11_define_function_in_context.<locals>.foo.<locals>.barr   r0   r   r!   r!   r"   r   ~  s    z?TestLiftObj.test_case11_define_function_in_context.<locals>.foor+   rU   r   z global name 'bar' is not defined)r   r   r   r{   	NameErrorr|   r}   r~   r   r!   r!   r"   &test_case11_define_function_in_context|  s    z2TestLiftObj.test_case11_define_function_in_contextc                    s4   dd   fdd}t dddg}| || d S )Nc                 S   s   | d S r   r!   r   r!   r!   r"   r     s    z>TestLiftObj.test_case12_njit_inside_a_objmode_ctx.<locals>.barc              	      s0   t dd t | d}W 5 Q R X | | S )Nr   r   r   )r   r   r   r2   r   r!   r"   r     s    z>TestLiftObj.test_case12_njit_inside_a_objmode_ctx.<locals>.foor+   rU   r   r   r   r!   r   r"   %test_case12_njit_inside_a_objmode_ctx  s    z1TestLiftObj.test_case12_njit_inside_a_objmode_ctxc              	   C   sr   dd }t jdddgdd}tjdd	 }td
t | ||d W 5 Q R X |D ]}| j|j	ddd qRd S )Nc              	   S   s:   |r*t dd | d d}W 5 Q R X n| d }| | S )Nr   r   r+   r   rU   )r   r   )r0   Zwobjr3   r!   r!   r"   r     s
    z:TestLiftObj.test_case13_branch_to_objmode_ctx.<locals>.foor+   rU   r   r   r   T)recordalwayszdataflow.pyz"there were warnings in dataflow.py)r   )
r   r   r   catch_warningsr   RuntimeWarningr   assertFalsefilenameendswith)rK   r   r0   wZeachr!   r!   r"   !test_case13_branch_to_objmode_ctx  s    	z-TestLiftObj.test_case13_branch_to_objmode_ctxc              	   C   s   dd }t dkr\| tj"}t|}|tdddg W 5 Q R X d}| |t|j	 n.|tdddg}tj
tdddg| d S )	Nc              
   S   s.   t dd | d7 } | W  5 Q R  S Q R X d S )Nr   r/   r+   r   r/   r!   r!   r"   r     s    zCTestLiftObj.test_case14_return_direct_from_objmode_ctx.<locals>.foor   r+   rU   r   Dunsupported control flow: due to return statements inside with blockr   )r   r{   r   rz   r   r   r   r|   r}   r~   ZtestingZassert_array_equal)rK   r   r   r   r   resultr!   r!   r"   *test_case14_return_direct_from_objmode_ctx  s    z6TestLiftObj.test_case14_return_direct_from_objmode_ctxc                 C   s(   dd }t dddg}| || d S )Nc                    s   d  fdd}|| d S )Nr-   c              
      s2   t dd t|  |   W  5 Q R  S Q R X d S )Nr   r/   r   r/   jr!   r"   r     s    zHTestLiftObj.test_case15_close_over_objmode_ctx.<locals>.foo.<locals>.barrU   r!   r   r!   r  r"   r     s    z;TestLiftObj.test_case15_close_over_objmode_ctx.<locals>.foor+   rU   r   r   r   r!   r!   r"   "test_case15_close_over_objmode_ctx  s    z.TestLiftObj.test_case15_close_over_objmode_ctxc                    s8   ddl m   fdd}tdddg}| || d S )Nr   )sparsec              	      s:   t dd& t|   | }t|d }W 5 Q R X |S )Nr   r   )r   r   )r   r(   Z
csr_matrixr   r   )r0   Zspxr   spr!   r"   r     s
    
z>TestLiftObj.test_case16_scipy_call_in_objmode_ctx.<locals>.foor+   rU   r   )Zscipyr  r   r   r   r   r!   r  r"   %test_case16_scipy_call_in_objmode_ctx  s    	z1TestLiftObj.test_case16_scipy_call_in_objmode_ctxc                    s6   dd l   fddtdddg}| | d S )Nr   c              	      s    t     W 5 Q R X d S r@   )r   disr/   r  r   r!   r"   r     s    z7TestLiftObj.test_case17_print_own_bytecode.<locals>.foor+   rU   r   )r  r   r   r   )rK   r0   r!   r  r"   test_case17_print_own_bytecode  s    z*TestLiftObj.test_case17_print_own_bytecodec                 C   s6   dd }t dddg}tdd }| ||| d S )Nc              	   S   s"   t   | |d  W 5 Q R X d S rH   r   )r    r0   r!   r!   r"   r     s    zCTestLiftObj.test_case18_njitfunc_passed_to_objmode_ctx.<locals>.foor+   rU   r   c                 S   s   | d S )NrB   r!   r   r!   r!   r"   <lambda>      zHTestLiftObj.test_case18_njitfunc_passed_to_objmode_ctx.<locals>.<lambda>)r   r   r   r   )rK   r   r0   r   r!   r!   r"   *test_case18_njitfunc_passed_to_objmode_ctx  s    z6TestLiftObj.test_case18_njitfunc_passed_to_objmode_ctxc              	      sn    fdd |  tjtjf"}t }|tdddg W 5 Q R X tdkrTd}nd}| |t	|j
 d S )	Nc              	      s8   t   | dkrW 5 Q R  dS W 5 Q R X  | d }|S )Nr      r+   r   )r0   retr   r!   r"   r     s
    z.TestLiftObj.test_case19_recursion.<locals>.foor+   rU   r   )r   r  r  zUntyped global name 'foo')r{   r   ry   rz   r   r   r   r   r|   r}   r~   )rK   r   r   r   r!   r  r"   test_case19_recursion  s    z!TestLiftObj.test_case19_recursionc                 C   s(   dd }t dddg}| || d S )Nc              	   S   sB   t jd t j }tdd t j }W 5 Q R X | | | S Nr   r   r   r   randomseedZrandr   r   r!   r!   r"   r   	  s
    
z1TestLiftObj.test_case20_rng_works_ok.<locals>.foor+   rU   r   r   r   r!   r!   r"   test_case20_rng_works_ok  s    z$TestLiftObj.test_case20_rng_works_okc                 C   s(   dd }t dddg}| || d S )Nc              	   S   sN   t jd t j }tdd t jd t j }W 5 Q R X | | | S r  r  r   r!   r!   r"   r     s    
z6TestLiftObj.test_case21_rng_seed_works_ok.<locals>.foor+   rU   r   r   r   r!   r!   r"   test_case21_rng_seed_works_ok  s    	z)TestLiftObj.test_case21_rng_seed_works_okc                    s:   dd  t  fdd}| | |  | tt d S )Nc                 S   s   t tt|  S r@   )r   r   listreversedtolistr/   r!   r!   r"   r   #  s    z'TestLiftObj.test_example01.<locals>.barc               	      s0   t d} tdd |  |  }W 5 Q R X |S )NrB   zintp[:]r   )r   r   r   r2   r   r!   r"   r   &  s    
z'TestLiftObj.test_example01.<locals>.foo)r   r   py_funcZassertIsr   r   r   r!   r   r"   test_example01!  s
    zTestLiftObj.test_example01c                    s<   dd  t  dd }tj fdd}| | d d S )Nc                 S   s   d S r@   r!   )sr!   r!   r"   r   2  s    z1TestLiftObj.test_objmode_in_overload.<locals>.fooc                 S   s   dd }|S )Nc              	   S   s"   t dd | d }W 5 Q R X |S )Nr   rk   r   r   )r   rk   r!   r!   r"   impl7  s    zHTestLiftObj.test_objmode_in_overload.<locals>.foo_overload.<locals>.implr!   )r   r#  r!   r!   r"   foo_overload5  s    z:TestLiftObj.test_objmode_in_overload.<locals>.foo_overloadc                      s    dS r   r!   r!   r  r!   r"   f=  s    z/TestLiftObj.test_objmode_in_overload.<locals>.fr   )r   r   r   rJ   )rK   r$  r%  r!   r  r"   test_objmode_in_overload1  s    
z$TestLiftObj.test_objmode_in_overloadc                 C   s.   t dd }| }| |t | |d d S )Nc               	   S   s   t td
 d} W 5 Q R X | S Nval皙(@)r   gv_typer(  r!   r!   r"   
global_varD  s    z8TestLiftObj.test_objmode_gv_variable.<locals>.global_var   )r   assertIsInstancer   rJ   )rK   r,  r  r!   r!   r"   test_objmode_gv_variableC  s
    
z$TestLiftObj.test_objmode_gv_variablec              	   C   s0   t dd }| tjd |  W 5 Q R X d S )Nc               	   S   s   t td
 d} W 5 Q R X | S )Nr(  r   )r   Zgv_type2r(  r!   r!   r"   r,  P  s    z>TestLiftObj.test_objmode_gv_variable_error.<locals>.global_varzIError handling objmode argument 'val'. Global 'gv_type2' is not defined\.r   assertRaisesRegexr   rz   )rK   r,  r!   r!   r"   test_objmode_gv_variable_errorO  s    
z*TestLiftObj.test_objmode_gv_variable_errorc              
   C   sd   t dd }t dd }||fD ]>}| jt|d$ | }| |t | |d W 5 Q R X q d S )Nc               	   S   s    t tjd
 d} W 5 Q R X | S r'  )r   r   r   r(  r!   r!   r"   modattr1^  s    z6TestLiftObj.test_objmode_gv_mod_attr.<locals>.modattr1c               	   S   s"   t tjjd
 d} W 5 Q R X | S r'  )r   r   r   r   r(  r!   r!   r"   modattr2d  s    z6TestLiftObj.test_objmode_gv_mod_attr.<locals>.modattr2r   r-  )r   ZsubTestr}   r.  r   rJ   )rK   r3  r4  r   r  r!   r!   r"   test_objmode_gv_mod_attr]  s    

z$TestLiftObj.test_objmode_gv_mod_attrc              	   C   s0   t dd }| tjd |  W 5 Q R X d S )Nc               	   S   s    t tjd
 d} W 5 Q R X | S r'  )r   r   THIS_DOES_NOT_EXISTr(  r!   r!   r"   moderrorr  s    z<TestLiftObj.test_objmode_gv_mod_attr_error.<locals>.moderrorzQError handling objmode argument 'val'. Getattr cannot be resolved at compile-timer0  rK   r7  r!   r!   r"   test_objmode_gv_mod_attr_errorq  s    
z*TestLiftObj.test_objmode_gv_mod_attr_errorc              	   C   s0   t dd }| tjd |  W 5 Q R X d S )Nc               	   S   s0   t tjtjtjd d} d}d}W 5 Q R X tS )NZv1Zv2Zv3r*  )r   r   r   r6  float32r)  r:  r!   r!   r"   r7    s    
zETestLiftObj.test_objmode_gv_mod_attr_error_multiple.<locals>.moderrorzPError handling objmode argument 'v2'. Getattr cannot be resolved at compile-timer0  r8  r!   r!   r"   'test_objmode_gv_mod_attr_error_multiple~  s    
z3TestLiftObj.test_objmode_gv_mod_attr_error_multiplec                    sH   dd  t  dd }t fdd}| | tdtj d S )Nc                   S   s   d S r@   r!   r!   r!   r!   r"   r     s    z>TestLiftObj.test_objmode_closure_type_in_overload.<locals>.fooc                     s   t jd d    fdd} | S )Nc               	      s,   t  d tdtj} W 5 Q R X | S Nr!  r-   r   r   r   r   r   r!  	shrubberyr!   r"   r#    s    zUTestLiftObj.test_objmode_closure_type_in_overload.<locals>.foo_overload.<locals>.implr   r   r#  r!   r?  r"   r$    s    zGTestLiftObj.test_objmode_closure_type_in_overload.<locals>.foo_overloadc                      s     S r@   r!   r!   r  r!   r"   r     s    z>TestLiftObj.test_objmode_closure_type_in_overload.<locals>.barr-   )r   r   r   r   r   r   r   rK   r$  r   r!   r  r"   %test_objmode_closure_type_in_overload  s    
z1TestLiftObj.test_objmode_closure_type_in_overloadc              	      sL   dd  t  dd }t fdd}| tjd |  W 5 Q R X d S )Nc                   S   s   d S r@   r!   r!   r!   r!   r"   r     s    zDTestLiftObj.test_objmode_closure_type_in_overload_error.<locals>.fooc                     s    t jd d    fdd}  | S )Nc               	      s,   t  d tdtj} W 5 Q R X | S r=  r>  r!  r?  r!   r"   r#    s    z[TestLiftObj.test_objmode_closure_type_in_overload_error.<locals>.foo_overload.<locals>.implrA  rB  r!   r?  r"   r$    s    zMTestLiftObj.test_objmode_closure_type_in_overload_error.<locals>.foo_overloadc                      s     S r@   r!   r!   r  r!   r"   r     s    zDTestLiftObj.test_objmode_closure_type_in_overload_error.<locals>.barzIError handling objmode argument 'out'. Freevar 'shrubbery' is not defined)r   r   r1  r   ry   rC  r!   r  r"   +test_objmode_closure_type_in_overload_error  s    
z7TestLiftObj.test_objmode_closure_type_in_overload_errorc              	   C   s0   t dd }| tjd |  W 5 Q R X d S )Nc               	   S   s   t dd
 d} W 5 Q R X tS )NrU   )badr+   )r   r)  r!  r!   r!   r"   r7    s    z6TestLiftObj.test_objmode_invalid_use.<locals>.moderrorzError handling objmode argument 'bad'. The value must be a compile-time constant either as a non-local variable or a getattr expression that refers to a Numba type.r0  r8  r!   r!   r"   test_objmode_invalid_use  s    
z$TestLiftObj.test_objmode_invalid_usec                    s`   t jd d   t fdd}| \}}}| |d | |d | |tdtj d S )Nc               	      s>   t dt d  d} | }tdtj}W 5 Q R X | ||fS )Nr   t1t2t3    :(ArB   )r   r+  r   r   r   int32rH  Zarray_tyr!   r"   r     s
    z5TestLiftObj.test_objmode_multi_type_args.<locals>.foorL  i  rB   )r   rM  r   r   r   r   r   )rK   r   rI  rJ  rK  r!   rN  r"   test_objmode_multi_type_args  s    
z(TestLiftObj.test_objmode_multi_type_argsc                    s   dt jfdt jd d  fg}t|G dd dt d} |dd t fdd	}tfd
d}| }| |  | |	ddd t
jdt
jdd }| |j| d S )Nvaluer   c                   @   s4   e Zd Zdd Zedd Zdd Zedd Zd	S )
z.TestLiftObj.test_objmode_jitclass.<locals>.Bagc                 S   s   || _ tj|tjd| _d S )Nr   )rP  r   zerosr;  r   )rK   rP  r!   r!   r"   __init__  s    z7TestLiftObj.test_objmode_jitclass.<locals>.Bag.__init__c                 S   s   | j jS r@   )r   sizerR   r!   r!   r"   rS    s    z3TestLiftObj.test_objmode_jitclass.<locals>.Bag.sizec                 S   s(   t | jD ]}| j|  |7  < q
| jS r@   )r6   rS  r   )rK   r)  r8   r!   r!   r"   	increment  s    z8TestLiftObj.test_objmode_jitclass.<locals>.Bag.incrementc                 S   s   | | S r@   r!   r2   r!   r!   r"   add  s    z2TestLiftObj.test_objmode_jitclass.<locals>.Bag.addN)	rZ   r[   r\   rR  propertyrS  rT  staticmethodrU  r!   r!   r!   r"   Bag  s   
rX     c                   S   s   d S r@   r!   r!   r!   r!   r"   r     s    z.TestLiftObj.test_objmode_jitclass.<locals>.fooc                     s   j   fdd} | S )Nc               	      s,   t d  d} | d W 5 Q R X | S )Nr!  r   r   )r   rT  r!  )rX  r@  r!   r"   r#    s    zETestLiftObj.test_objmode_jitclass.<locals>.foo_overload.<locals>.impl)Z_numba_type_rB  )rX  mybagr?  r"   r$    s    z7TestLiftObj.test_objmode_jitclass.<locals>.foo_overloadc                      s     S r@   r!   r!   r  r!   r"   r     s    z.TestLiftObj.test_objmode_jitclass.<locals>.barrU   r   rB   r   r   )r   rM  r;  r   objectr   r   r.  rJ   rU  r   rQ  r   r   )rK   specnr$  r   r   Z	exp_arrayr!   )rX  r   rZ  r"   test_objmode_jitclass  s"    	z!TestLiftObj.test_objmode_jitclassc              	   C   s"   t dd | d }W 5 Q R X |S Nr   outputr-   r"  r0   ra  r!   r!   r"   case_objmode_cache  s    zTestLiftObj.case_objmode_cachec              	      sV   t dddddg t fdd}| tj}|  W 5 Q R X | t|jd d S )	Nr+   rU   r   r   rB   c               	      s(   t  d dddddg} W 5 Q R X | S )Nr!  r+   rU   r   r   rB   r"  r!  Zret_typer!   r"   test2  s    z6TestLiftObj.test_objmode_reflected_list.<locals>.test2zObjmode context failed. Argument 'out' is declared as an unsupported type: reflected list\(int(32|64)\)<iv=None>. Reflected types are not supported.r   r   r{   r   rz   r   r}   r~   rK   re  r   r!   rd  r"   test_objmode_reflected_list  s    z'TestLiftObj.test_objmode_reflected_listc              	      sV   t dddddh t fdd}| tj}|  W 5 Q R X | t|jd d S )	Nr+   rU   r   r   rB   c               	      s(   t  d dddddh} W 5 Q R X | S )Nr  r+   rU   r   r   rB   r"  ri  rd  r!   r"   re  +  s    z5TestLiftObj.test_objmode_reflected_set.<locals>.test2zObjmode context failed. Argument 'result' is declared as an unsupported type: reflected set\(int(32|64)\). Reflected types are not supported.rf  rg  r!   rd  r"   test_objmode_reflected_set)  s    z&TestLiftObj.test_objmode_reflected_setc              	      sR   t t jt j t fdd}| t}|  W 5 Q R X | dt|j	 d S )Nc               	      s$   t  d ddd} W 5 Q R X | S )Nresr+   rU   )r$   r%   r"  rk  rd  r!   r"   test4=  s    z2TestLiftObj.test_objmode_typed_dict.<locals>.test4zFcan't unbox a <class 'dict'> as a <class 'numba.typed.typeddict.Dict'>)
r   ZDictTypeZunicode_typer   r   r{   r   r|   r}   r~   rK   rm  r   r!   rd  r"   test_objmode_typed_dict;  s    z#TestLiftObj.test_objmode_typed_dictc              	      sN   t t j t fdd}| t}|  W 5 Q R X | t|jd d S )Nc               	      s"   t  d ddg} W 5 Q R X | S )Nrk  r+   rU   r"  rk  rd  r!   r"   rm  M  s    z2TestLiftObj.test_objmode_typed_list.<locals>.test4zLcan't unbox a <class 'list'> as a (<class ')?numba.typed.typedlist.List('>)?)	r   ZListTyper   r   r{   r   r   r}   r~   rn  r!   rd  r"   test_objmode_typed_listK  s    z#TestLiftObj.test_objmode_typed_listc                 C   sB   t dd }tdtjd}||}||}| || d S )Nc              	   S   s&   t jdd | d}W 5 Q R X |S )Nz
int64[::1]r   r   )r   r   viewr2   r!   r!   r"   r   `  s    z1TestLiftObj.test_objmode_use_of_view.<locals>.foor+   r   )r   r   Zonesr   rq  r  r   )rK   r   r   expectedrs   r!   r!   r"   test_objmode_use_of_view]  s    

z$TestLiftObj.test_objmode_use_of_viewN);rZ   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   ZexpectedFailurer  r   r
  r  r   r  r  r  r  r  r&  r/  r2  r5  r9  r<  rD  rE  rG  rO  r^  rW  rc  rh  rj  ro  rp  rs  r!   r!   r!   r"   r   :  sv   


	


	
	
4
r   c                 C   s   | d S Nr-   r!   r/   r!   r!   r"   case_inner_pyfuncl  s    ru  c              	   C   s"   t dd t| }W 5 Q R X |S Nr   r`  )r   ru  rb  r!   r!   r"   rc  p  s    rc  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestLiftObjCachingc                 C   s   t dtj d S r   r   rR   r!   r!   r"   r_   y  s    zTestLiftObjCaching.setUpc                 C   s   t   d S r@   r   rR   r!   r!   r"   r   |  s    zTestLiftObjCaching.tearDownc                 C   sX   t dd|}| |dd t dd|}| |j | |dd | |j d S )NT)cacher   r*  )r   rJ   r   Z_cache_hits
assertTrue)rK   r  firstsecondr!   r!   r"   check  s    zTestLiftObjCaching.checkc                 C   s   dd }|  | d S )Nc              	   S   s"   t dd | d }W 5 Q R X |S r_  r"  rb  r!   r!   r"   r     s    z=TestLiftObjCaching.test_objmode_caching_basic.<locals>.pyfuncr|  rK   r   r!   r!   r"   test_objmode_caching_basic  s    z-TestLiftObjCaching.test_objmode_caching_basicc                    s"   dd   fdd}|  | d S )Nc                 S   s   | d S rt  r!   r/   r!   r!   r"   other_pyfunc  s    zNTestLiftObjCaching.test_objmode_caching_call_closure_bad.<locals>.other_pyfuncc              	      s"   t dd  | }W 5 Q R X |S rv  r"  rb  r  r!   r"   r     s    zHTestLiftObjCaching.test_objmode_caching_call_closure_bad.<locals>.pyfuncr}  r~  r!   r  r"   %test_objmode_caching_call_closure_bad  s    z8TestLiftObjCaching.test_objmode_caching_call_closure_badc                 C   s   |  t d S r@   )r|  rc  rR   r!   r!   r"   &test_objmode_caching_call_closure_good  s    z9TestLiftObjCaching.test_objmode_caching_call_closure_goodN)	rZ   r[   r\   r_   r   r|  r  r  r  r!   r!   r!   r"   rw  v  s   	rw  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestBogusContextc              	   C   sN   t t}| tj}t|| j| j| ji d W 5 Q R X | 	dt
|j d S )Nrg   z*Undefined variable used as context manager)r#   rD   r{   r   rz   r   ra   rb   rc   r|   r}   r~   rK   rM   r   r!   r!   r"   test_undefined_global  s        z&TestBogusContext.test_undefined_globalc              	   C   sN   t t}| tj}t|| j| j| ji d W 5 Q R X | 	dt
|j d S )Nrg   z"Unsupported context manager in use)r#   rF   r{   r   rz   r   ra   rb   rc   r|   r}   r~   r  r!   r!   r"   test_invalid  s        zTestBogusContext.test_invalidc              	   C   sH   t dd }| tj}|  W 5 Q R X t|j}d}| || d S )Nc               	   S   s   t d} W 5 Q R X d S )N )openr%  r!   r!   r"   r     s    
z;TestBogusContext.test_with_as_fails_gracefully.<locals>.foozGThe 'with (context manager) as (variable):' construct is not supported.)r   r{   r   ZUnsupportedErrorr}   r~   r|   )rK   r   r   Zexcstrr   r!   r!   r"   test_with_as_fails_gracefully  s    

z.TestBogusContext.test_with_as_fails_gracefullyN)rZ   r[   r\   r  r  r  r!   r!   r!   r"   r    s   r  c                   @   s"   e Zd ZdZeejdd ZdS )TestMiscFc                 C   s:   t  s| d dd }dddg}t||}| | d S )Nzstrace support missingc                  S   s   t ddd } d S )Nzvoid()c                	   S   s   t   W 5 Q R X d S r@   r   r!   r!   r!   r"   r%    s    
zFTestMisc.test_no_fork_in_compilation.<locals>.force_compile.<locals>.f)r   r  r!   r!   r"   force_compile  s    z;TestMisc.test_no_fork_in_compilation.<locals>.force_compileforkcloneexecve)r   ZskipTestr   r   )rK   r  ZsyscallsZstrace_datar!   r!   r"   test_no_fork_in_compilation  s    	


z$TestMisc.test_no_fork_in_compilationN)rZ   r[   r\   Z_numba_parallel_test_r   r   Zrun_test_in_subprocessr  r!   r!   r!   r"   r    s   r  __main__)Rr   ossignal
subprocesssystempfile	threadingr   Znumpyr   r   Znumba.core.transformsr   r   Znumba.core.withcontextsr   r   r   Znumba.core.bytecoder   r   Znumba.core.interpreterr	   Z
numba.corer
   r   r   Znumba.core.registryr   Znumba.core.compilerr   r   r   r   r   r   Znumba.core.extendingr   Znumba.tests.supportr   r   r   r   r   r   r   Znumba.core.utilsr   Znumba.experimentalr   r   r#   r*   r1   r4   r9   r;   r=   r>   r?   rA   rC   rD   r[  rE   rF   r   r+  rG   r]   rp   rr   r   r   r   ru  rc  rw  r  r  rZ   mainr!   r!   r!   r"   <module>   sr   $	
0		      8)( 
