B
     \Z                 @   s
  d dl mZmZmZ d dlZd dlZd dlZd dlZd dlm	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 d d	lmZ d d
lmZ d dlmZmZ d dlm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z& yd dl'Z'W n e(k
r   dZ'Y nX dZ)e
*e'dke)Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3d d! Z4d"d# Z5d$d% Z6e7 Z8d&d' Z9G d(d) d)e%Z:G d*d+ d+e%Z;G d,d- d-e;Z<G d.d/ d/e;Z=d0d1 Z>d2d3 Z?G d4d5 d5e$e%Z@G d6d7 d7e;ZAeBd8kre
C  dS )9    )print_functiondivisionabsolute_importN)unittest_support)find_setupwithswith_lifting)bypass_contextcall_contextobjmode_context)FunctionIdentityByteCode)Interpreter)typingerrors)
cpu_target)cpu)
compile_irDEFAULT_FLAGS)njittypeofobjmode   )
MemoryLeakTestCasecaptured_stdoutzSciPy needed for testc             C   s*   t | }t|d}t|}||}|S )N)func_id)r   Zfrom_functionr   r   Z	interpret)funcr   ZbcZinterpZfunc_ir r   ;lib/python3.7/site-packages/numba/tests/test_withlifting.pyget_func_ir   s
    


r   c            	   C   s2   t d t t d t  W d 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 d Q R X | d7 } t t d|  t  | d7 } W d Q R X | d7 } t d|  d S )Nr   r    r!   d   r"   
   D)r#   r   r$   )xr   r   r   lift2.   s    


r*   c           
   C   s   d} d}t d| | tB t d t  | d7 } t t d |d7 }t  W d Q R X W d Q R X | d7 } |d7 }t d| | d S )Nr   r&   r    r!   r"   i r(   )r#   r   r$   )r)   yr   r   r   lift3?   s    r,   c              C   s   d} t d|  | d7 } tT t d t  | d7 } x6tdD ]*}t t d t  | |7 } W d Q R X q<W W d Q R X t  t d t  | r| d9 } W d Q R X | d7 } t d|  d S )	Nr   r    r'   r!   r   r"   r(   E)r#   r   r$   range)r)   ir   r   r   lift4P   s&    
 r0   c               C   s   t d d S )Nr    )r#   r   r   r   r   lift5f   s    r1   c           	   C   s4   d} t d|  t | d7 } W d Q R X t d|  | S )Nr   r    r!   )r#   r	   )r)   r   r   r   	liftcall1j   s    

r2   c           	   C   sV   d} t d|  t | d7 } W d Q R X t d|  t | d7 } W d Q R X t d|  | S )Nr   r    r!   r'   r"   )r#   r	   )r)   r   r   r   	liftcall2s   s    


r3   c           	   C   sp   d} t d|  t | dkr$| d7 } W d Q R X t d|  t  xtdD ]}| |7 } qHW W d Q R X t d|  | S )Nr   r    r   r!   r'   r"   )r#   r	   r.   )r)   r/   r   r   r   	liftcall3   s    


r4   c            
   C   s$   t  t  W d Q R X W d Q R X d S )N)r	   r   r   r   r   	liftcall4   s    r5   c            	   C   s   t  W d Q R X d S )N)Zundefined_global_varr   r   r   r   lift_undefiend   s    r6   c            	   C   s   t  W d Q R X d S )N)bogus_contextmanagerr   r   r   r   lift_invalid   s    r8   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|j}| || d S )N)r   lenr   ZblocksassertEqual)selfr   expect_countthe_irZctr   r   r   check_num_of_with   s    z!TestWithFinding.check_num_of_withc             C   s   | j tdd d S )Nr   )r=   )r?   r%   )r<   r   r   r   
test_lift1   s    zTestWithFinding.test_lift1c             C   s   | j tdd d S )N   )r=   )r?   r*   )r<   r   r   r   
test_lift2   s    zTestWithFinding.test_lift2c             C   s   | j tdd d S )Nr   )r=   )r?   r,   )r<   r   r   r   
test_lift3   s    zTestWithFinding.test_lift3c             C   s   | j tdd d S )NrA   )r=   )r?   r0   )r<   r   r   r   
test_lift4   s    zTestWithFinding.test_lift4c             C   s   | j tdd d S )Nr   )r=   )r?   r1   )r<   r   r   r   
test_lift5   s    zTestWithFinding.test_lift5N)	__name__
__module____qualname__r?   r@   rB   rC   rD   rE   r   r   r   r   r9      s   r9   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 )N)superrI   setUpr   ZContext	typingctxr   Z
CPUContext	targetctxr   flags)r<   )	__class__r   r   rK      s    
zBaseTestWithLifting.setUpc       	   	   C   sl   t |}t|| j| j| ji d\}}| t|| | |}t }|	  W d Q R X | |
 | d S )N)locals)r   r   rL   rM   rN   r;   r:   r   r   Zentry_pointgetvalue)	r<   r   r=   expected_stdoutr>   Znew_irZ	extractedZcresoutr   r   r   check_extracted_with   s    
z(BaseTestWithLifting.check_extracted_withr   Nc          
   C   s@   | j }| j}| j}t|| t||||||i dS Q R X d S )N)rP   )rL   rM   rN   r   Znested_contextr   )r<   r>   argsZreturn_typerL   rM   rN   r   r   r   r      s    
zBaseTestWithLifting.compile_ir)r   N)rF   rG   rH   rK   rT   r   __classcell__r   r   )rO   r   rI      s   rI   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
)r=   rR   )rT   r%   )r<   r   r   r   r@      s    zTestLiftByPass.test_lift1c             C   s   | j tddd d S )NrA   zA 1
D 3
)r=   rR   )rT   r*   )r<   r   r   r   rB      s    zTestLiftByPass.test_lift2c             C   s   | j tddd d S )Nr   zA 1 100
D 2 101
)r=   rR   )rT   r,   )r<   r   r   r   rC      s    zTestLiftByPass.test_lift3c             C   s   | j tddd d S )NrA   z	A 0
E 11
)r=   rR   )rT   r0   )r<   r   r   r   rD      s    zTestLiftByPass.test_lift4c             C   s   | j tddd d S )Nr   zA
)r=   rR   )rT   r1   )r<   r   r   r   rE      s    zTestLiftByPass.test_lift5N)rF   rG   rH   r@   rB   rC   rD   rE   r   r   r   r   rW      s
   rW   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestLiftCallc          	   C   sP   t |}t }|  W dQ R X t }|  W dQ R X | | |  dS )z2Ensure same semantic with non-jitted code
        N)r   r   r;   rQ   )r<   r   ZjittedgotZ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
)r=   rR   )rT   r2   rZ   )r<   r   r   r   test_liftcall1   s    zTestLiftCall.test_liftcall1c             C   s   | j tddd | t d S )NrA   zA 1
B 2
C 12
)r=   rR   )rT   r3   rZ   )r<   r   r   r   test_liftcall2   s    zTestLiftCall.test_liftcall2c             C   s   | j tddd | t d S )NrA   zA 1
B 2
C 47
)r=   rR   )rT   r4   rZ   )r<   r   r   r   test_liftcall3  s    zTestLiftCall.test_liftcall3c          	   C   s8   |  tj}tt  W d Q R X | dt|j d S )Nz
re-entrant)assertRaisesr   TypingErrorr   r5   assertInstr	exception)r<   raisesr   r   r   test_liftcall4	  s    zTestLiftCall.test_liftcall4N)rF   rG   rH   rZ   r[   r\   r]   rd   r   r   r   r   rX      s
   rX   c                s    fdd}|S )Nc          	      s>   |  tj} | f|| W d Q R X | dt|j d S )NzDoes not support list type)r^   r   r_   r`   ra   rb   )r<   rU   kwargsrc   )fnr   r   core  s    z+expected_failure_for_list_arg.<locals>.corer   )rf   rg   r   )rf   r   expected_failure_for_list_arg  s    rh   c                s    fdd}|S )Nc          	      s>   |  tj} | f|| W d Q R X | dt|j d S )NzDoes not support function type)r^   r   r_   r`   ra   rb   )r<   rU   re   rc   )rf   r   r   rg     s    z/expected_failure_for_function_arg.<locals>.corer   )rf   rg   r   )rf   r   !expected_failure_for_function_arg  s    ri   c               @   s8  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(dCS )DTestLiftObjc             C   s   t dtj d S )Nerror)warningssimplefilterr   ZNumbaWarning)r<   r   r   r   rK   %  s    zTestLiftObj.setUpc             C   s   t   d S )N)rl   resetwarnings)r<   r   r   r   tearDown(  s    zTestLiftObj.tearDownc          	   G   s   t |}t |}t|}t }|| }| }W d Q R X |ttt| t }|| }	| }
W d Q R X | 	||
 | 
||	 d S )N)copydeepcopyr   r   rQ   compiletuplemapr   r;   assertPreciseEqual)r<   ZpyfuncrU   Zpy_argsZc_argsZcfuncstreamZ
expect_resZ
expect_outZgot_resZgot_outr   r   r   assert_equal_return_and_stdout+  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 =ivalrA   )r#   )rx   r   r   r   bar>  s    z0TestLiftObj.test_lift_objmode_basic.<locals>.barc          	      s(   | d7 } t   |  W d Q R X | d S )Nr   )r
   )rx   )ry   r   r   fooA  s    z0TestLiftObj.test_lift_objmode_basic.<locals>.fooc          	      s*   | d7 } t j  |  W d Q R X | d S )Nr   )numbar   )rx   )ry   r   r   foo_nonglobalG  s    z:TestLiftObj.test_lift_objmode_basic.<locals>.foo_nonglobal{   )rw   )r<   rz   r|   r   )ry   r   test_lift_objmode_basic=  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arrrA   )r#   )r   r   r   r   ry   Q  s    z3TestLiftObj.test_lift_objmode_array_in.<locals>.barc          	      s2   t | t j}t  | W d Q R X |d S )Nr   )nparangeastypeint64r
   )nelemr   )ry   r   r   rz   V  s    z3TestLiftObj.test_lift_objmode_array_in.<locals>.foor'   )rw   )r<   rz   r   r   )ry   r   test_lift_objmode_array_inP  s    z&TestLiftObj.test_lift_objmode_array_inc                s(   dd   fdd}d}|  || d S )Nc             S   s   t |  d S )N)r#   )r+   r   r   r   ry   a  s    z<TestLiftObj.test_lift_objmode_define_new_unused.<locals>.barc          	      s0   t    d|  }t|} | W d Q R X | S )NrA   )r
   r   r   )r)   r+   a)ry   r   r   rz   d  s
    
z<TestLiftObj.test_lift_objmode_define_new_unused.<locals>.foor}   )rw   )r<   rz   argr   )ry   r   #test_lift_objmode_define_new_unused`  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 )Nr   )r#   )r)   r   r   r   inverseo  s    z<TestLiftObj.test_lift_objmode_return_simple.<locals>.inversec          	      s&   t dd  | }W d Q R X | |fS )Nfloat64)r+   )r
   )r)   r+   )r   r   r   rz   s  s    z8TestLiftObj.test_lift_objmode_return_simple.<locals>.fooc          	      s(   t jdd  | }W d Q R X | |fS )Nr   )r+   )r{   r   )r)   r+   )r   r   r   r|   x  s    zBTestLiftObj.test_lift_objmode_return_simple.<locals>.foo_nonglobalr}   )rw   )r<   rz   r|   r   r   )r   r   test_lift_objmode_return_simplen  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 )Nr   )r#   )r)   r   r   r   r     s    z;TestLiftObj.test_lift_objmode_return_array.<locals>.inversec          	      s6   t ddd  | }t|d }W d Q R X | ||fS )Nz
float64[:]r   )r+   zr   )r
   int)r)   r+   r   )r   r   r   rz     s    z7TestLiftObj.test_lift_objmode_return_array.<locals>.foor   r'   )dtype)r   r   r   rw   )r<   rz   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 d Q R X | |fS )
Nz
float64[:])r+      r   r   rA      c             S   s   g | ]}d | qS )r   r   ).0r/   r   r   r   
<listcomp>  s    zITestLiftObj.test_lift_objmode_using_list.<locals>.foo.<locals>.<listcomp>)r
   r#   r   asarray)r)   r+   r   r   r   rz     s    z5TestLiftObj.test_lift_objmode_using_list.<locals>.foor   rA   r   )rw   )r<   rz   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   sr   xt | D ]} q
W | r| d7 } tdd@ t|  | d8 } t|  x t | D ]}| |7 } t|  qLW W d Q R X | S )Nr   Zintp)r)   )r.   r
   r#   )r)   r/   r   r   r   rz     s    z4TestLiftObj.test_lift_objmode_var_redef.<locals>.foor}   )rw   )r<   rz   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 d Q R X t   d| | d< t|  W d Q R X | S )NrA   )r
   r#   )r)   r   r   r   r   rz     s    z=TestLiftObj.test_case01_mutate_list_ahead_of_ctx.<locals>.foor   rA   r      )rw   )r<   rz   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 d Q R X t   d| | d< t|  W d Q R X | S )NrA   )r
   r#   )r)   r   r   r   r   rz     s    z>TestLiftObj.test_case02_mutate_array_ahead_of_ctx.<locals>.foor   rA   r   r   )r   arrayrw   )r<   rz   r)   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 d Q R X t   d|d< W d Q R X |S )NzList(int64))r+   r   rA   r   r'   )r
   )r)   r+   r   r   r   rz     s
    z6TestLiftObj.test_case03_create_and_mutate.<locals>.foor   )rw   )r<   rz   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 d Q R X | dt|j d S )Nc          	   S   s"   t dd t|  W d Q R X | S )Nz
float64[:])k)r
   r#   )r)   r   r   r   rz     s    z=TestLiftObj.test_case04_bogus_variable_type_info.<locals>.foor   rA   r   z1Invalid type annotation on non-outgoing variables)	r   r   r   r^   r   r_   r`   ra   rb   )r<   rz   r)   cfoorc   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 d Q R X | dt|j d S )Nc          	   S   s"   t dd | d }W d Q R X |S )Nz
float64[:])r   y              ?)r
   )r)   r   r   r   r   rz     s    z4TestLiftObj.test_case05_bogus_type_info.<locals>.foor   rA   r   zXcan't unbox array from PyObject into native value.  The object maybe of a different type)r   r   r   r^   	TypeErrorr`   ra   rb   )r<   rz   r)   r   rc   rY   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 d Q R X d}| t|j| d S )Nc          
   S   s0   t    t   t|  W d Q R X W d Q R X | S )N)r
   r#   )r)   r   r   r   rz     s    z3TestLiftObj.test_case06_double_objmode.<locals>.foor}   z@During: resolving callee type: type\(ObjModeLiftedWith\(<.*>\)\))r^   r   r_   r   ZassertRegexpMatchesra   rb   )r<   rz   rc   Zpatr   r   r   test_case06_double_objmode  s
    	z&TestLiftObj.test_case06_double_objmodec          	   C   sV   dd }t dddg}t|}| tj}|| W d Q R X | dt|j d S )Nc          	   S   s"   t   d| i}W d Q R X | |fS )Nr   )r
   )r)   tr   r   r   rz     s    z6TestLiftObj.test_case07_mystery_key_error.<locals>.foor   rA   r   z-missing type annotation on outgoing variables)	r   r   r   r^   r   r_   r`   ra   rb   )r<   rz   r)   r   rc   r   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 d Q R X | t|jd d S )Nc          
      sP   xJt t| D ]:}t * t|}| | }| |< t d  W d Q R X qW | S )N2)r.   r:   r
   ra   r#   )r)   r/   r   v)dr   r   rz   &  s    z8TestLiftObj.test_case08_raise_from_external.<locals>.foor   rA   r   z'2')	dictr   r   r   r^   KeyErrorr;   ra   rb   )r<   rz   r)   r   rc   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 d Q R X | dt|j d S )Nc          	   S   s   t   t W d Q R X | S )N)r
   
ValueError)r)   r   r   r   rz   6  s    z3TestLiftObj.test_case09_explicit_raise.<locals>.foor   rA   r   zHunsupported controlflow due to return/raise statements inside with block)	r   r   r   r^   r   CompilerErrorr`   ra   rb   )r<   rz   r)   r   rc   r   r   r   test_case09_explicit_raise5  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 d Q R X t   d|d< W d Q R X |S )NzList(int64))r+   r   rA   r   r'   )r
   )r)   r+   r   r   r   rz   H  s
    z;TestLiftObj.test_case10_mutate_across_contexts.<locals>.foor   rA   r   )r   r   rw   )r<   rz   r)   r   r   r   "test_case10_mutate_across_contextsE  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 d Q R X t   d|d< W d Q R X |S )	Nzint64[:])r+   r   rA   r   r   )r   r'   )r
   r   r   )r)   r+   r   r   r   rz   T  s
    zATestLiftObj.test_case10_mutate_array_across_contexts.<locals>.foor   rA   r   )r   r   rw   )r<   rz   r)   r   r   r   (test_case10_mutate_array_across_contextsR  s    z4TestLiftObj.test_case10_mutate_array_across_contextsc          	   C   sV   dd }t dddg}t|}| tj}|| W d Q R X | dt|j d S )Nc          	   S   s   t   dd }W d Q R X | S )Nc             S   s   | d S )Nr   r   )r+   r   r   r   ry   c  s    zLTestLiftObj.test_case11_define_function_in_context.<locals>.foo.<locals>.bar)r
   )r)   ry   r   r   r   rz   a  s    z?TestLiftObj.test_case11_define_function_in_context.<locals>.foor   rA   r   zop code: make_function)	r   r   r   r^   r   r_   r`   ra   rb   )r<   rz   r)   r   rc   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 )Nr   r   )r+   r   r   r   ry   t  s    z>TestLiftObj.test_case12_njit_inside_a_objmode_ctx.<locals>.barc          	      s0   t dd t | d}W d Q R X | | S )Nzint64[:])r+   r   )r
   r   r   )r)   r+   )ry   r   r   rz   w  s    z>TestLiftObj.test_case12_njit_inside_a_objmode_ctx.<locals>.foor   rA   r   )r   r   rw   )r<   rz   r)   r   )ry   r   %test_case12_njit_inside_a_objmode_ctxp  s    z1TestLiftObj.test_case12_njit_inside_a_objmode_ctxc          	   C   sv   dd }t jdddgdd}tjdd	 }td
t | ||d W d Q R X x"|D ]}| j|j	ddd qTW d S )Nc          	   S   s:   |r*t dd | d d}W d Q R X n| d }| | S )Nzint64[:])r+   r   r   rA   )r
   r   )r)   Zwobjr+   r   r   r   rz     s
    z:TestLiftObj.test_case13_branch_to_objmode_ctx.<locals>.foor   rA   r   r   )r   T)recordalwayszdataflow.pyz"there were warnings in dataflow.py)msg)
r   r   rl   catch_warningsrm   RuntimeWarningrw   ZassertFalsefilenameendswith)r<   rz   r)   wZeachr   r   r   !test_case13_branch_to_objmode_ctx  s    	
z-TestLiftObj.test_case13_branch_to_objmode_ctxc          	   C   sV   dd }t dddg}t|}| tj}|| W d Q R X | dt|j d S )Nc          	   S   s   t dd | S Q R X d S )Nzint64[:])r)   )r
   )r)   r   r   r   rz     s    zCTestLiftObj.test_case14_return_direct_from_objmode_ctx.<locals>.foor   rA   r   zHunsupported controlflow due to return/raise statements inside with block)	r   r   r   r^   r   r   r`   ra   rb   )r<   rz   r)   r   rc   r   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          	      s&   t dd t|  |   S Q R X d S )Nzint64[:])r)   )r
   r#   )r)   )jr   r   ry     s    zHTestLiftObj.test_case15_close_over_objmode_ctx.<locals>.foo.<locals>.barrA   r   )r)   ry   r   )r   r   rz     s    z;TestLiftObj.test_case15_close_over_objmode_ctx.<locals>.foor   rA   r   )r   r   rw   )r<   rz   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          	      s4   t dd  t|   | }|d }W d Q R X |S )Nr   )r   )r   r   )r
   r#   Z
csr_matrix)r)   Zspxr   )spr   r   rz     s
    
z>TestLiftObj.test_case16_scipy_call_in_objmode_ctx.<locals>.foor   rA   r   )scipyr   r   r   rw   )r<   rz   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 d Q R X d S )N)r
   dis)r)   )r   rz   r   r   rz     s    z7TestLiftObj.test_case17_print_own_bytecode.<locals>.foor   rA   r   )r   r   r   rw   )r<   r)   r   )r   rz   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 d Q R X d S )Nr   )r
   )r   r)   r   r   r   rz     s    zCTestLiftObj.test_case18_njitfunc_passed_to_objmode_ctx.<locals>.foor   rA   r   c             S   s   | d S )N   r   )r   r   r   r   <lambda>  s    zHTestLiftObj.test_case18_njitfunc_passed_to_objmode_ctx.<locals>.<lambda>)r   r   r   rw   )r<   rz   r)   rf   r   r   r   *test_case18_njitfunc_passed_to_objmode_ctx  s    z6TestLiftObj.test_case18_njitfunc_passed_to_objmode_ctxc          	      s^    fdd t dddg}t }| tj}|| W d Q R X d}| |t|j d S )Nc          	      s.   t   | dkrdS W d Q R X  | d }|S )Nr      r   )r
   )r)   Zret)rz   r   r   rz     s
    z.TestLiftObj.test_case19_recursion.<locals>.foor   rA   r   z3Does not support with-context that contain branches)	r   r   r   r^   r   r   r`   ra   rb   )r<   r)   r   rc   r   r   )rz   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 d Q R X | | | S )Nr   r   )r   )r   randomseedrandr
   )r)   r+   r   r   r   r   rz     s
    
z1TestLiftObj.test_case20_rng_works_ok.<locals>.foor   rA   r   )r   r   rw   )r<   rz   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 d Q R X | | | S )Nr   r   )r   )r   r   r   r   r
   )r)   r+   r   r   r   r   rz     s    
z6TestLiftObj.test_case21_rng_seed_works_ok.<locals>.foor   rA   r   )r   r   rw   )r<   rz   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 )N)r   r   listreversedtolist)r)   r   r   r   ry     s    z'TestLiftObj.test_example01.<locals>.barc           	      s0   t d} tdd |  |  }W d Q R X |S )Nr   zintp[:])r+   )r   r   r   )r)   r+   )ry   r   r   rz     s    
z'TestLiftObj.test_example01.<locals>.foo)r   ru   Zpy_funcZassertIsr   r
   )r<   rz   r   )ry   r   test_example01  s    zTestLiftObj.test_example01N))rF   rG   rH   rK   ro   rw   r~   r   r   r   r   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   unittestZexpectedFailurer   skip_unless_scipyr   r   ri   r   r   r   r   r   r   r   r   r   rj   #  sB   
	
rj   c               @   s   e Zd Zdd Zdd ZdS )TestBogusContextc          	   C   sN   t t}| tj}t|| j| j| ji d W d Q R X | 	dt
|j d S )N)rP   z*Undefined variable used as context manager)r   r6   r^   r   r   r   rL   rM   rN   r`   ra   rb   )r<   r>   rc   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 d Q R X | 	dt
|j d S )N)rP   z"Unsupported context manager in use)r   r8   r^   r   r   r   rL   rM   rN   r`   ra   rb   )r<   r>   rc   r   r   r   test_invalid  s     zTestBogusContext.test_invalidN)rF   rG   rH   r   r   r   r   r   r   r     s   r   __main__)DZ
__future__r   r   r   rp   rl   Znumpyr   r{   r   r   Znumba.transformsr   r   Znumba.withcontextsr   r	   r
   Znumba.bytecoder   r   Znumba.interpreterr   r   r   Znumba.targets.registryr   Znumba.targetsr   Znumba.compilerr   r   r   r   r   Zsupportr   r   r   r   ImportErrorZ_msgZskipIfr   r   r%   r*   r,   r0   r1   r2   r3   r4   r5   r6   objectr7   r8   r9   rI   rW   rX   rh   ri   rj   r   rF   mainr   r   r   r   <module>   s^   
	%		   m
