o
    1&i87                     @   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 G dd deZG dd	 d	eZed
krDe  dS dS )    N)njitjit)TypingErrorUnsupportedError)ir)TestCaseIRPreservingTestPipelinec                   @   sl   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
dd Zdd Zdd Zdd ZdS )TestClosurec                    sJ   d  fdd}t di ||}| |dd d | |dd d S )	N
   c                       |   S N xYr   CC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_closure.pyadd_Y      z3TestClosure.run_jit_closure_variable.<locals>.add_Yi4(i4)         r   r   assertEqual)selfjitargsr   c_add_Yr   r   r   run_jit_closure_variable   s   z$TestClosure.run_jit_closure_variablec                 C      | j dd d S NT)Zforceobjr   r   r   r   r   test_jit_closure_variable      z%TestClosure.test_jit_closure_variablec                 C   r    NTZnopythonr"   r#   r   r   r   test_jit_closure_variable_npm   r%   z)TestClosure.test_jit_closure_variable_npmc                    s   d  fdd}t d	i ||}| |dd d t d	i ||}| |dd d | |dd | |dd d S )
Nr
   c                    r   r   r   r   r   r   r   r   %   r   z0TestClosure.run_rejitting_closure.<locals>.add_Yr   r   r   r      r   r   )r   r   r   r   Z	c_add_Y_2r   r   r   run_rejitting_closure"   s   z!TestClosure.run_rejitting_closurec                 C   r    r!   r*   r#   r   r   r   test_rejitting_closure4   r%   z"TestClosure.test_rejitting_closurec                 C   r    r&   r+   r#   r   r   r   test_rejitting_closure_npm7   r%   z&TestClosure.test_rejitting_closure_npmc                    s<   d d fdd}t di ||}| |dd d S )	Nr
      c                    s   |    S r   r   r   r   Zr   r   add_Y_mult_Z>      zDTestClosure.run_jit_multiple_closure_variables.<locals>.add_Y_mult_Zr   r      r   r   )r   r   r1   Zc_add_Y_mult_Zr   r/   r   "run_jit_multiple_closure_variables:   s
   z.TestClosure.run_jit_multiple_closure_variablesc                 C   r    r!   r4   r#   r   r   r   #test_jit_multiple_closure_variablesD   r%   z/TestClosure.test_jit_multiple_closure_variablesc                 C   r    r&   r5   r#   r   r   r   'test_jit_multiple_closure_variables_npmG   r%   z3TestClosure.test_jit_multiple_closure_variables_npmc                    s   dd }t di ||     fdd}t di ||}|  | |  | |dd W d    d S 1 s>w   Y  d S )	Nc                 S   s   | d S )Nr
   r   )ar   r   r   mult_10K   r   z3TestClosure.run_jit_inner_function.<locals>.mult_10
intp(intp)c                    s    | d S N   r   r   Z	c_mult_10r   r   do_mathQ   r2   z3TestClosure.run_jit_inner_function.<locals>.do_mathr   2   )r:   )r   Zdisable_compileZassertRefCountr   )r   r   r9   r>   Z	c_do_mathr   r=   r   run_jit_inner_functionJ   s   "z"TestClosure.run_jit_inner_functionc                 C   r    r!   r@   r#   r   r   r   test_jit_inner_functionZ   r%   z#TestClosure.test_jit_inner_functionc                 C   r    r&   rA   r#   r   r   r   test_jit_inner_function_npm]   r%   z'TestClosure.test_jit_inner_function_npmN)__name__
__module____qualname__r   r$   r(   r*   r,   r-   r4   r6   r7   r@   rB   rC   r   r   r   r   r	      s    
r	   c                   @   s^   e Zd 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jdd ZdS )TestInlinedClosurez
    Tests for (partial) closure support in njit. The support is partial
    because it only works for closures that can be successfully inlined
    at compile time.
    c                 C   (   dd }t |}| |d|d d S )Nc                 S   s   dd }|| ||  S )Nc                 S   s   | |  S r   r   r   r   r   r   innerl   r   zDTestInlinedClosure.test_inner_function.<locals>.outer.<locals>.innerr   r   rI   r   r   r   outerj   s   z5TestInlinedClosure.test_inner_function.<locals>.outerr
   r   r   r   rK   cfuncr   r   r   test_inner_functionh   s   z&TestInlinedClosure.test_inner_functionc                 C   rH   )Nc                    s$   | d   fdd}|| ||  S )Nr   c                    s   | |    S r   r   r   yr   r   rI   y   r2   zQTestInlinedClosure.test_inner_function_with_closure.<locals>.outer.<locals>.innerr   rJ   r   rP   r   rK   v   s   zBTestInlinedClosure.test_inner_function_with_closure.<locals>.outerr
   rL   rM   r   r   r    test_inner_function_with_closuret   s   z3TestInlinedClosure.test_inner_function_with_closurec                 C   rH   )Nc                    s(   | d   fdd}||   ||  S )Nr   c                    s   |   S r   r   r   rP   r   r   rI      r   zSTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer.<locals>.innerr   rJ   r   rP   r   rK      s   zDTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outerr
   rL   rM   r   r   r   "test_inner_function_with_closure_2   s   	z5TestInlinedClosure.test_inner_function_with_closure_2c                 C   s>   d}i }t | | t|d }| |d|d d d S )Na  
            def outer(x):
                y = x + 1
                z = 0

                def inner(x):
                    nonlocal z
                    z += x * x
                    return z + y

                return inner(x) + inner(x) + z
        rK   r
   )execstripr   r   )r   codensrN   r   r   r   "test_inner_function_with_closure_3   s
   z5TestInlinedClosure.test_inner_function_with_closure_3c                 C   rH   )Nc                    s    fdd}|   S )Nc                    s0    fdd}d}t  D ]}|||7 }q|S )Nc                    s     |  S r   r   zr   rQ   r   r   	innermost   r2   z^TestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner.<locals>.innermostr   range)rQ   r\   sir   rP   r   rI      s
   zKTestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.innerr   rJ   r   r   r   rK      s   
z<TestInlinedClosure.test_inner_function_nested.<locals>.outerr
   rL   rM   r   r   r   test_inner_function_nested   s   z-TestInlinedClosure.test_inner_function_nestedc                    s  t fddfdd}fdd}dd }d	d
 }dd }dd }d  fdd}d  fdd}dd }	dd }
dd }dd }d9dd}d9dd }d9d!d"}d#d$ }d%d& }d'd( }d)d* }d+d, }d-d. }d/d0 }|||||||	|
|||||||g}|D ]}t |}d1}| |||| q| t}td2d3|}|| W d4   n1 sw   Y  d5}| |t|j | t}td2d3|}|| W d4   n1 sw   Y  d5}| |t|j | t}td2d3|}|| W d4   n	1 sw   Y  d6}| |t|j | t	}td2d3|}|| W d4   n	1 s3w   Y  d7}| |t|j | t	}td2d3|}|| W d4   n	1 s_w   Y  d7}| |t|j | t	}td2d3|}|| W d4   n	1 sw   Y  d7}| |t|j | t	}td2d3|}|  W d4   n	1 sw   Y  d8}| |t|j d4S ):z3 Tests the large number of use cases defined below c                    s$   | dk r| S  | d  | d  S )Nr.   r   r   )nfib3r   r   rd      s   z4TestInlinedClosure.test_bulk_use_cases.<locals>.fib3c                    s    fdd}|| S )z, Test calling recursive function from inner c                        | S r   r   r   rc   r   r   rI      r   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer1.<locals>.innerr   rJ   rc   r   r   outer1   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer1c                       | d   fdd}|| S )z. Test calling recursive function from closure r   c                    s   |   S r   r   r   )rd   rZ   r   r   rI      r2   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer2.<locals>.innerr   rJ   rc   rY   r   outer2      z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer2c                    s    fdd  | S )z Test recursive inner c                    s   | dk rdS  | d  d S Nr.   r
   r   r   r   rI   r   r   rI      s   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer3.<locals>.innerr   r   r   rk   r   outer3   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer3c                    s   | d  fdd  | S )z Test recursive closure r   c                    s    |  dk rdS  | d  d S rj   r   r   rI   rQ   r   r   rI      s   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer4.<locals>.innerr   r   r   rm   r   outer4   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer4c                       | d   fdd}|| S )z Test nested closure r   c                    s$   |  d   fdd}||  S )Nr.   c                    r   r   r   r   rY   r   r   inner2   r   zVTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1.<locals>.inner2r   r   rp   rP   rY   r   inner1   s   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1r   r   rr   r   rP   r   outer5   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer5c                    ro   )z. Test closure with list comprehension in body r   c                    s    |  d }dd t |D S )Nr.   c                 S   s   g | ]}|qS r   r   ).0tr   r   r   
<listcomp>       zZTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1.<locals>.<listcomp>r]   r   rZ   rP   r   r   rr      s   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1r   rs   r   rP   r   outer6      z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer6	   c                    s   | d }| |   S )z) Test use of outer scope var, no closure r   r   ry   _OUTER_SCOPE_VARr   r   outer7   s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer7c                    rg   )z+ Test use of outer scope var, with closure r   c                       |    S r   r   r   )r~   rZ   r   r   rI     r2   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer8.<locals>.innerr   rJ   r}   rY   r   outer8  ri   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer8c                    s    | d   fdd}|}|| S )z Test closure assignmentr   c                    r   r   r   r   rY   r   r   rI     r   zETestInlinedClosure.test_bulk_use_cases.<locals>.outer9.<locals>.innerr   )r   rI   fr   rY   r   outer9
  s   z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer9c                    s(   | d fdd  fdd}|| S )z! Test two inner, one calls other r   c                    r   r   r   r   rY   r   r   rI     r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.innerc                    re   r   r   r   rk   r   r   rp     r   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner2r   rq   r   )rI   rZ   r   outer10  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer10c                    s   | d   fdd}|S )z return the closure r   c                    r   r   r   r   rY   r   r   rI   #  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer11.<locals>.innerr   rJ   r   rY   r   outer11  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer11c                    s   | d  d fdd	}|| S )z closure with kwargr      c                       |   | S r   r   r   kwrY   r   r   rI   +  r2   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer12.<locals>.innerNr   r   rJ   r   rY   r   outer12'  ri   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer12r   c                 S   s   | d | }|S )z outer with kwarg no closurer   r   )r   r   rZ   r   r   r   outer13/  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer13c                    s   | d  fdd}|| S )z! outer with kwarg used in closurer   c                    r   r   r   r   r   rZ   r   r   rI   8  r2   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer14.<locals>.innerr   r   r   rI   r   r   r   outer144  ri   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer14c                    s   | d   fdd}|| |S )z# outer with kwarg as arg to closurer   c                    r   r   r   r   rY   r   r   rI   @  r2   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer15.<locals>.innerr   r   r   rY   r   outer15<  s   
z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer15c                    s    | d   fdd}t || S )z( closure is generator, consumed locally r   c                 3       |   V  d S r   r   r   rY   r   r   rI   H     zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer16.<locals>.inner)listrJ   r   rY   r   outer16D  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer16c                    ro   )z  closure is generator, returned r   c                 3   r   r   r   r   rY   r   r   rI   Q  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer17.<locals>.innerr   rJ   r   rY   r   outer17M  r{   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer17c                    s*   | d   fdd}|| D ]}|}q|S )z( closure is generator, consumed in loop r   c                 3   r   r   r   r   rY   r   r   rI   Z  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer18.<locals>.innerr   )r   rI   r`   rv   r   rY   r   outer18V  s
   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer18c                    s2   | d  | d  fdd}fdd}||| S )z# closure as arg to another closure r   r.   c                    r   r   r   r   )z1r   r   rI   g  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.innerc                    s   | |  S r   r   )r   r   )z2r   r   rp   j  r2   zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.inner2r   )r   rI   rp   r   )r   r   r   outer19b  s
   
z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer19c                    ro   )z Test calling numpy in closure r   c                       | t   S r   )numpycosr   rY   r   r   rI   s     zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer20.<locals>.innerr   rJ   r   rY   r   outer20o     z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer20c                    ro   )z) Test calling numpy import as in closure r   c                    r   r   )npr   r   rY   r   r   rI   {  r   zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer21.<locals>.innerr   rJ   r   rY   r   outer21w  r   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer21c                  S   s   dd } d}| |  dS )z6Test to ensure that unsupported *args raises correctlyc                 S   s   d S r   r   )r8   br   r   r   bar  s   zDTestInlinedClosure.test_bulk_use_cases.<locals>.outer22.<locals>.bar)r   r.   Nr   )r   r   r   r   r   outer22  s   z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer22r
   Tr'   Nz,Unsupported use of cell variable encounteredz%Cannot capture the non-constant valuez-The use of yield in a closure is unsupported.z,Calling a closure with *args is unsupported.r   )
r   r   assertRaisesNotImplementedErrorr   ZassertInstr	exceptionr   r   )r   rf   rh   rl   rn   rt   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   refrN   varZraisesmsgr   )r~   rd   r   test_bulk_use_cases   s   			


		






z&TestInlinedClosure.test_bulk_use_casesc           	      C   s   t tddd }| |ddd |j|jd  jd }g }|j D ] }|jD ]}t	|t
jrCt	|jt
jrC|jjd	krC|| q)q$| t|d
 |D ]}|jj}d}| || qOd S )N)Zpipeline_classc                 S   s   dd }|| ||fS )Nc                 S   s   d}d}|| |  S )N   r
   r   )rZ   r   rQ   r   r   r   r     s   zITestInlinedClosure.test_closure_renaming_scheme.<locals>.foo.<locals>.barr   )r8   r   r   r   r   r   foo  s   z<TestInlinedClosure.test_closure_renaming_scheme.<locals>.foor
      )   #   r   Zpreserved_irr   r.   zclosure__locals__bar_v[0-9]+.x)r   r   r   Z	overloadsZ
signaturesmetadatablocksvaluesbody
isinstancer   AssignvalueZConstappendlentargetnameassertRegex)	r   r   Zfunc_irstoreZblkstmtr`   r   regexr   r   r   test_closure_renaming_scheme  s&   


z/TestInlinedClosure.test_closure_renaming_schemec                    s0   t dd  t  fdd}tj| d d S )Nc                  S   s   ddd} | S )N皙?c                 S   s   | | S r   r   r[   r   r   r   r     r   z;TestInlinedClosure.test_issue9222.<locals>.foo.<locals>.bar)r   r   )r   r   r   r   r     s   
z.TestInlinedClosure.test_issue9222.<locals>.fooc                      s
     dS r;   r   r   r   r   r   consume  s   
z2TestInlinedClosure.test_issue9222.<locals>.consumegffffff@)r   r   testingZassert_allclose)r   r   r   r   r   test_issue9222  s
   
z!TestInlinedClosure.test_issue9222c                 C   s   t dd }|  d S )Nc                  S   s4   d} t dD ]}tdd t | dD  d} qd S )Nr   r   c                 S   s   g | ]}d qS )r   r   )ru   _r   r   r   rw     rx   zFTestInlinedClosure.test_issue_9577.<locals>._inner.<locals>.<listcomp>r   )r^   r   array)Zrange_startr   r   r   r   _inner  s
   z2TestInlinedClosure.test_issue_9577.<locals>._inner)r   )r   r   r   r   r   test_issue_9577  s   

z"TestInlinedClosure.test_issue_9577N)rD   rE   rF   __doc__rO   rR   rS   rX   ra   r   r   r   r   Zrun_test_in_subprocessr   r   r   r   r   rG   a   s      "rG   __main__)r   r   ZunittestZnumbar   r   Znumba.core.errorsr   r   Z
numba.corer   Znumba.tests.supportr   r   r	   rG   rD   mainr   r   r   r   <module>   s   U   