B
      ›\•-  ã               @   s°   d dl m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
mZmZ d dlmZmZmZmZ ddlmZmZ d dlmZ G dd	„ d	eƒZG d
d„ deƒZedkr¬e ¡  dS )é    )Úprint_functionN)ÚnjitÚjitÚtestingÚutils)ÚNotDefinedErrorÚTypingErrorÚLoweringErrorÚUnsupportedErroré   )ÚTestCaseÚtag)Úexec_c               @   sz   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ejdd„ ƒZdS )ÚTestClosurec                sF   d‰ ‡ fdd„}t d|Ž|ƒ}|  |dƒd¡ d‰ |  |dƒd¡ d S )	Né
   c                s   | ˆ  S )N© )Úx)ÚYr   ú7lib/python3.7/site-packages/numba/tests/test_closure.pyÚadd_Y   s    z3TestClosure.run_jit_closure_variable.<locals>.add_Yúi4(i4)r   é   é   )r   )r   ÚassertEqual)ÚselfÚjitargsr   Úc_add_Yr   )r   r   Úrun_jit_closure_variable   s    z$TestClosure.run_jit_closure_variablec             C   s   | j dd d S )NT)Úforceobj)r   )r   r   r   r   Útest_jit_closure_variable!   s    z%TestClosure.test_jit_closure_variablec             C   s   | j dd d S )NT)Únopython)r   )r   r   r   r   Útest_jit_closure_variable_npm$   s    z)TestClosure.test_jit_closure_variable_npmc                sx   d‰ ‡ fdd„}t d	|Ž|ƒ}|  |dƒd¡ d‰ t d
|Ž|ƒ}|  |dƒd¡ d‰ |  |dƒd¡ |  |dƒd¡ d S )Nr   c                s   | ˆ  S )Nr   )r   )r   r   r   r   *   s    z0TestClosure.run_rejitting_closure.<locals>.add_Yúi4(i4)r   r   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   s   | j dd d S )NT)r   )r$   )r   r   r   r   Útest_rejitting_closure9   s    z"TestClosure.test_rejitting_closurec             C   s   | j dd d S )NT)r    )r$   )r   r   r   r   Útest_rejitting_closure_npm<   s    z&TestClosure.test_rejitting_closure_npmc                s8   d‰ d‰‡ ‡fdd„}t d|Ž|ƒ}|  |dƒd¡ d S )	Nr   é   c                s   | ˆ  ˆ S )Nr   )r   )r   ÚZr   r   Úadd_Y_mult_ZC   s    zDTestClosure.run_jit_multiple_closure_variables.<locals>.add_Y_mult_Zúi4(i4)r   é   )r*   )r   r   )r   r   r)   Zc_add_Y_mult_Zr   )r   r(   r   Ú"run_jit_multiple_closure_variables?   s
    z.TestClosure.run_jit_multiple_closure_variablesc             C   s   | j dd d S )NT)r   )r,   )r   r   r   r   Ú#test_jit_multiple_closure_variablesI   s    z/TestClosure.test_jit_multiple_closure_variablesc             C   s   | j dd d S )NT)r    )r,   )r   r   r   r   Ú'test_jit_multiple_closure_variables_npmL   s    z3TestClosure.test_jit_multiple_closure_variables_npmc          	      sl   dd„ }t d|Ž|ƒ‰ ˆ  ¡  ‡ fdd„}t d	|Ž|ƒ}| ¡  |  |ˆ ¡ |  |dƒd¡ W d Q R X d S )
Nc             S   s   | d S )Nr   r   )Úar   r   r   Úmult_10P   s    z3TestClosure.run_jit_inner_function.<locals>.mult_10ú
intp(intp)c                s   ˆ | d ƒS )Né   r   )r   )Ú	c_mult_10r   r   Údo_mathV   s    z3TestClosure.run_jit_inner_function.<locals>.do_mathr   é2   )r1   )r1   )r   Zdisable_compileZassertRefCountr   )r   r   r0   r4   Z	c_do_mathr   )r3   r   Úrun_jit_inner_functionO   s    z"TestClosure.run_jit_inner_functionc             C   s   | j dd d S )NT)r   )r6   )r   r   r   r   Útest_jit_inner_function_   s    z#TestClosure.test_jit_inner_functionc             C   s   | j dd d S )NT)r    )r6   )r   r   r   r   Útest_jit_inner_function_npmb   s    z'TestClosure.test_jit_inner_function_npmc             C   s,   dd„ }t |ƒ}|  |dƒƒ |dƒƒ ¡ d S )Nc                s   ‡ fdd„}|S )Nc                  s   ˆ d S )Nr   r   r   )r   r   r   Úinnerj   s    z=TestClosure.test_return_closure.<locals>.outer.<locals>.innerr   )r   r9   r   )r   r   Úouterh   s    z.TestClosure.test_return_closure.<locals>.outerr   )r   r   )r   r:   Úcfuncr   r   r   Útest_return_closuree   s    zTestClosure.test_return_closureN)Ú__name__Ú
__module__Ú__qualname__r   r   r!   r$   r%   r&   r,   r-   r.   r6   r7   r8   r   Zallow_interpreter_moder<   r   r   r   r   r      s   
r   c               @   sz   e Zd ZdZedƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZe 	e
jd	k d
¡dd„ ƒZedƒdd„ ƒZedƒ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.
    Z	importantc             C   s(   dd„ }t |ƒ}|  |dƒ|dƒ¡ d S )Nc             S   s   dd„ }|| ƒ|| ƒ S )Nc             S   s   | |  S )Nr   )r   r   r   r   r9      s    zDTestInlinedClosure.test_inner_function.<locals>.outer.<locals>.innerr   )r   r9   r   r   r   r:   }   s    z5TestInlinedClosure.test_inner_function.<locals>.outerr   )r   r   )r   r:   r;   r   r   r   Útest_inner_functionz   s    z&TestInlinedClosure.test_inner_functionc             C   s(   dd„ }t |ƒ}|  |dƒ|dƒ¡ d S )Nc                s$   | d ‰ ‡ fdd„}|| ƒ|| ƒ S )Nr   c                s   | |  ˆ  S )Nr   )r   )Úyr   r   r9      s    zQTestInlinedClosure.test_inner_function_with_closure.<locals>.outer.<locals>.innerr   )r   r9   r   )rB   r   r:   Š   s    zBTestInlinedClosure.test_inner_function_with_closure.<locals>.outerr   )r   r   )r   r:   r;   r   r   r   Ú test_inner_function_with_closure‡   s    z3TestInlinedClosure.test_inner_function_with_closurec             C   s(   dd„ }t |ƒ}|  |dƒ|dƒ¡ d S )Nc                s(   | d ‰ ‡ fdd„}|| ƒ‰ ˆ || ƒ S )Nr   c                s   | ˆ  S )Nr   )r   )rB   r   r   r9   ›   s    zSTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outer.<locals>.innerr   )r   r9   r   )rB   r   r:   ˜   s    zDTestInlinedClosure.test_inner_function_with_closure_2.<locals>.outerr   )r   r   )r   r:   r;   r   r   r   Ú"test_inner_function_with_closure_2•   s    	z5TestInlinedClosure.test_inner_function_with_closure_2)é   r   zneeds Python 3c             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
        r:   r   )r   Ústripr   r   )r   ÚcodeÚnsr;   r   r   r   Ú"test_inner_function_with_closure_3¤   s
    z5TestInlinedClosure.test_inner_function_with_closure_3c             C   s(   dd„ }t |ƒ}|  |dƒ|dƒ¡ d S )Nc                s   ‡ fdd„}|ˆ ˆ  ƒS )Nc                s4   ‡‡ fdd„}d}xt ˆ ƒD ]}|||ƒ7 }qW |S )Nc                s   ˆ ˆ |  S )Nr   )Úz)r   rB   r   r   Ú	innermostÀ   s    z^TestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.inner.<locals>.innermostr   )Úrange)rB   rK   ÚsÚi)r   )rB   r   r9   ¾   s
    zKTestInlinedClosure.test_inner_function_nested.<locals>.outer.<locals>.innerr   )r   r9   r   )r   r   r:   ¼   s    
z<TestInlinedClosure.test_inner_function_nested.<locals>.outerr   )r   r   )r   r:   r;   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„ }d8dd„}d9dd „}d:d!d"„}d#d$„ }d%d&„ }d'd(„ }d)d*„ }d+d,„ }d-d.„ }|||||||	|
|||||||g}x.|D ]&}t |ƒ}d/}|  ||ƒ||ƒ¡  qþW |  t¡}td0d1|ƒ}||ƒ W d2Q R X d3}|  |t|jƒ¡ |  t¡}td0d1|ƒ}||ƒ W d2Q R X d3}|  |t|jƒ¡ |  t¡}td0d1|ƒ}||ƒ W d2Q R X d4}|  |t|jƒ¡ |  t	¡}td0d1|ƒ}||ƒ W d2Q R X d5}|  |t|jƒ¡ |  t
¡}td0d1|ƒ}||ƒ W d2Q R X d6}|  |t|jƒ¡ |  t	¡}td0d1|ƒ}||ƒ W d2Q R X d7}|  |t|jƒ¡ d2S );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   rQ   Ò   s    z4TestInlinedClosure.test_bulk_use_cases.<locals>.fib3c                s   ‡ fdd„}|| ƒS )z, Test calling recursive function from inner c                s   ˆ | ƒS )Nr   )r   )rQ   r   r   r9   Ú   s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer1.<locals>.innerr   )r   r9   )rQ   r   r   Úouter1Ø   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer1c                s   | d ‰ ‡‡ fdd„}|| ƒS )z. Test calling recursive function from closure r   c                s   | ˆ ˆƒ S )Nr   )r   )rQ   rJ   r   r   r9   â   s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer2.<locals>.innerr   )r   r9   )rQ   )rJ   r   Úouter2Þ   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer2c                s   ‡ fdd„‰ ˆ | ƒS )z Test recursive inner c                s    | t  dk rdS ˆ | d ƒ d S )Nr'   r   r   )rB   )r   )r9   r   r   r9   è   s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer3.<locals>.innerr   )r   r   )r9   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 )Nr'   r   r   r   )r   )r9   rB   r   r   r9   ó   s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer4.<locals>.innerr   )r   r   )r9   rB   r   Úouter4ï   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer4c                s   | d ‰ ‡ fdd„}|| ƒS )z Test nested closure r   c                s$   ˆ|  d ‰ ‡ fdd„}|| ƒˆ S )Nr'   c                s   | ˆ  S )Nr   )r   )rJ   r   r   Úinner2  s    zVTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1.<locals>.inner2r   )r   rV   )rB   )rJ   r   Úinner1þ   s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer5.<locals>.inner1r   )r   rW   r   )rB   r   Úouter5ú   s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer5c                s   | d ‰ ‡ fdd„}|| ƒS )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>  s    zZTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1.<locals>.<listcomp>)rL   )r   rJ   )rB   r   r   rW     s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer6.<locals>.inner1r   )r   rW   r   )rB   r   Úouter6  s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer6é	   c                s   | d }| | ˆ  S )z) Test use of outer scope var, no closure r   r   )r   rJ   )Ú_OUTER_SCOPE_VARr   r   Úouter7  s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer7c                s   | d ‰ ‡‡ fdd„}|| ƒS )z+ Test use of outer scope var, with closure r   c                s   | ˆ ˆ  S )Nr   )r   )r^   rJ   r   r   r9     s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer8.<locals>.innerr   )r   r9   )r^   )rJ   r   Úouter8  s    z6TestInlinedClosure.test_bulk_use_cases.<locals>.outer8c                s    | d ‰ ‡ fdd„}|}|| ƒS )z Test closure assignmentr   c                s   | ˆ  S )Nr   )r   )rJ   r   r   r9   &  s    zETestInlinedClosure.test_bulk_use_cases.<locals>.outer9.<locals>.innerr   )r   r9   Úfr   )rJ   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                s   | ˆ  S )Nr   )r   )rJ   r   r   r9   /  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.innerc                s   ˆ | ƒS )Nr   )r   )r9   r   r   rV   2  s    zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer10.<locals>.inner2r   )r   rV   r   )r9   rJ   r   Úouter10+  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer10c                s   | d ‰ ‡ fdd„}|S )z return the closure r   c                s   | ˆ  S )Nr   )r   )rJ   r   r   r9   ;  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer11.<locals>.innerr   )r   r9   r   )rJ   r   Úouter117  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer11c                s   | d ‰ d‡ fdd„	}|| ƒS )z closure with kwargr   é   c                s   | ˆ  | S )Nr   )r   Úkw)rJ   r   r   r9   C  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer12.<locals>.inner)re   r   )r   r9   r   )rJ   r   Úouter12?  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer12re   c             S   s   | d | }|S )z outer with kwarg no closurer   r   )r   rf   rJ   r   r   r   Úouter13G  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer13c                s   | d ‰‡ ‡fdd„}|| ƒS )z! outer with kwarg used in closurer   c                s   | ˆ ˆ  S )Nr   )r   )rf   rJ   r   r   r9   P  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer14.<locals>.innerr   )r   rf   r9   r   )rf   rJ   r   Úouter14L  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer14c                s   | d ‰ ‡ fdd„}|| |ƒS )z# outer with kwarg as arg to closurer   c                s   | ˆ  | S )Nr   )r   rf   )rJ   r   r   r9   X  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer15.<locals>.innerr   )r   rf   r9   r   )rJ   r   Úouter15T  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer15c                s    | d ‰ ‡ fdd„}t || ƒƒS )z( closure is generator, consumed locally r   c             3   s   | ˆ  V  d S )Nr   )r   )rJ   r   r   r9   `  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer16.<locals>.inner)Úlist)r   r9   r   )rJ   r   Úouter16\  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer16c                s   | d ‰ ‡ fdd„}|| ƒS )z  closure is generator, returned r   c             3   s   | ˆ  V  d S )Nr   )r   )rJ   r   r   r9   i  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer17.<locals>.innerr   )r   r9   r   )rJ   r   Úouter17e  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer17c                s.   | d ‰ ‡ fdd„}x|| ƒD ]}|}qW |S )z( closure is generator, consumed in loop r   c             3   s   | ˆ  V  d S )Nr   )r   )rJ   r   r   r9   r  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer18.<locals>.innerr   )r   r9   rN   rZ   r   )rJ   r   Úouter18n  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                s   | ˆ  S )Nr   )r   )Úz1r   r   r9     s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.innerc                s   | |ƒˆ  S )Nr   )ra   r   )Úz2r   r   rV   ‚  s    zGTestInlinedClosure.test_bulk_use_cases.<locals>.outer19.<locals>.inner2r   )r   r9   rV   r   )ro   rp   r   Úouter19z  s
    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer19c                s   | d ‰ ‡ fdd„}|| ƒS )Nr   c                s   | t  ˆ ¡ S )N)ÚnumpyÚcos)r   )rJ   r   r   r9   ‹  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer20.<locals>.innerr   )r   r9   r   )rJ   r   Úouter20‡  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer20c                s   | d ‰ ‡ fdd„}|| ƒS )Nr   c                s   | t  ˆ ¡ S )N)Únprs   )r   )rJ   r   r   r9   “  s    zFTestInlinedClosure.test_bulk_use_cases.<locals>.outer21.<locals>.innerr   )r   r9   r   )rJ   r   Úouter21  s    z7TestInlinedClosure.test_bulk_use_cases.<locals>.outer21r   T)r    Nz.Unsupported use of op_LOAD_CLOSURE encounteredZmake_functionz#with argument(s) of type(s): (none)z1'NoneType' object has no attribute 'yield_points'z-Invalid use of getiter with parameters (none))re   )re   )re   )r   r   ZassertRaisesÚNotImplementedErrorr   ZassertInÚstrZ	exceptionr
   r   r	   )r   rR   rS   rT   rU   rX   r\   r_   r`   rb   rc   rd   rg   rh   ri   rj   rl   rm   rn   rq   rt   rv   ra   Úrefr;   ÚvarZraisesÚmsgr   )r^   rQ   r   Útest_bulk_use_casesÍ   sz    			


			

z&TestInlinedClosure.test_bulk_use_casesN)r=   r>   r?   Ú__doc__r   rA   rC   rD   ÚunittestZskipIfr   Z	PYVERSIONrI   rO   r|   r   r   r   r   r@   s   s   r@   Ú__main__)Z
__future__r   Úsysrr   ru   Znumba.unittest_supportZunittest_supportr~   Znumbar   r   r   r   Znumba.errorsr   r   r	   r
   Zsupportr   r   Z	numba.sixr   r   r@   r=   Úmainr   r   r   r   Ú<module>   s   b  U