o
    8ήc`                      @   sz   d dl mZ d dlmZ d dlmZ d dlZd dlZedd Z	edd Z
d	ZG d
d dejZedkr;e  dS dS )    )njit)errors)overloadNc                 G      | | S N funcargsr   r   U/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_make_function_to_jit_function.pyconsumer	      r   c                 C      || S r   r   )func1func2r   r   r   consumer2arg   r   r   {   c                   @   sz   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
eddd Zdd Zdd Zdd Zdd ZdS )TestMakeFunctionToJITFunctionzo
    This tests the pass that converts ir.Expr.op == make_function (i.e. closure)
    into a JIT function.
    c                 C   2   dd }t |t}|tj}| | |  d S )Nc                        fdd}|S )Nc                        dd }  | S )Nc                   S      dS N
   r   r   r   r   r   inner'      z\TestMakeFunctionToJITFunction.test_escape.<locals>.impl_factory.<locals>.impl.<locals>.innerr   r   consumer_funcr   r   impl&   s   zMTestMakeFunctionToJITFunction.test_escape.<locals>.impl_factory.<locals>.implr   r   r   r   r   r   impl_factory%      z?TestMakeFunctionToJITFunction.test_escape.<locals>.impl_factoryr   r   py_funcassertEqualselfr!   cfuncr   r   r   r   test_escape#   s   
z)TestMakeFunctionToJITFunction.test_escapec                 C   r   )Nc                    r   )Nc                     s   dd } dd } | |S )Nc                   S   r   r   r   r   r   r   r   r   5   r   zcTestMakeFunctionToJITFunction.test_nested_escape.<locals>.impl_factory.<locals>.impl.<locals>.innerc                 S   s   |  S r   r   xr   r   r   
innerinner8   s   zhTestMakeFunctionToJITFunction.test_nested_escape.<locals>.impl_factory.<locals>.impl.<locals>.innerinnerr   )r   r,   r   r   r   r   4   s   
zTTestMakeFunctionToJITFunction.test_nested_escape.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!   3      zFTestMakeFunctionToJITFunction.test_nested_escape.<locals>.impl_factory)r   r   r$   r%   r&   r   r   r   test_nested_escape1   s   

z0TestMakeFunctionToJITFunction.test_nested_escapec                 C   r   )Nc                    r   )Nc                     r   )Nc                  S   s   dd } |  S )Nc                   S   r   r   r   r   r   r   r   r   G   r   z{TestMakeFunctionToJITFunction.test_closure_in_escaper.<locals>.impl_factory.<locals>.impl.<locals>.callinner.<locals>.innerr   r   r   r   r   	callinnerF   s   zlTestMakeFunctionToJITFunction.test_closure_in_escaper.<locals>.impl_factory.<locals>.impl.<locals>.callinnerr   r/   r   r   r   r   E   s   zYTestMakeFunctionToJITFunction.test_closure_in_escaper.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!   D      zKTestMakeFunctionToJITFunction.test_closure_in_escaper.<locals>.impl_factoryr#   r&   r   r   r   test_closure_in_escaperB      	
z5TestMakeFunctionToJITFunction.test_closure_in_escaperc                 C   r   )Nc                    r   )Nc                     s   d  fdd} | dS )Nr   c                        |  t  S r   _globalzyr   r   r/   X      zkTestMakeFunctionToJITFunction.test_close_over_consts.<locals>.impl_factory.<locals>.impl.<locals>.callinner   r   r0   r   r9   r   r   U      
zXTestMakeFunctionToJITFunction.test_close_over_consts.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!   T   r1   zJTestMakeFunctionToJITFunction.test_close_over_consts.<locals>.impl_factoryr#   r&   r   r   r   test_close_over_constsR   r3   z4TestMakeFunctionToJITFunction.test_close_over_constsc                 C   s:   dd }t |t}|tj}d}| |||| d S )Nc                    r   )Nc                    s   d  fdd}|| S )Nr   c                    r4   r   r5   r7   r9   r   r   r/   h   r;   zrTestMakeFunctionToJITFunction.test_close_over_consts_w_args.<locals>.impl_factory.<locals>.impl.<locals>.callinnerr   r+   r/   r   r9   r   r   e   r=   z_TestMakeFunctionToJITFunction.test_close_over_consts_w_args.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!   d   r1   zQTestMakeFunctionToJITFunction.test_close_over_consts_w_args.<locals>.impl_factory   r#   r'   r!   r(   r   ar   r   r   test_close_over_consts_w_argsb   s
   	
z;TestMakeFunctionToJITFunction.test_close_over_consts_w_argsc                    sV   dd  t  dd } fdd}t|t}|tj}d}| |||| d S )Nc                 W   s0   t |}|dkr| | S |dkr| | | S d S )N      len)r	   r
   nargsr   r   r   foou   s   z=TestMakeFunctionToJITFunction.test_with_overload.<locals>.fooc                 W   s4   t |}|dkrdd }|S |dkrdd }|S d S )NrD   c                 W   r   r   r   r   r   r   r   r         zNTestMakeFunctionToJITFunction.test_with_overload.<locals>.foo_ol.<locals>.implrE   c                 W   s   | | | S r   r   r   r   r   r   r      r;   rF   )r	   r
   rH   r   r   r   r   foo_ol|   s   z@TestMakeFunctionToJITFunction.test_with_overload.<locals>.foo_olc                    r   )Nc                    s&   d  fdd}|| || | fS )Nr   c                     s    t t |  t S r   )npsumasarrayr6   r7   r9   r   r   r/      s   zgTestMakeFunctionToJITFunction.test_with_overload.<locals>.impl_factory.<locals>.impl.<locals>.callinnerr   r?   rI   r9   r   r      s   zTTestMakeFunctionToJITFunction.test_with_overload.<locals>.impl_factory.<locals>.implr   r    rO   r   r   r!      r-   zFTestMakeFunctionToJITFunction.test_with_overload.<locals>.impl_factoryr@   )r   r   r   r$   r%   )r'   rK   r!   r(   r   rB   r   rO   r   test_with_overloads   s   


z0TestMakeFunctionToJITFunction.test_with_overloadc                    sP   dd  t  dd } fdd}t|}td}tj|||| d S )Nc                 S   r   r   r   arrayr	   r   r   r   apply   rJ   zGTestMakeFunctionToJITFunction.test_basic_apply_like_case.<locals>.applyc                 S   s   dd S )Nc                 S   r   r   r   rQ   r   r   r   <lambda>   s    z\TestMakeFunctionToJITFunction.test_basic_apply_like_case.<locals>.ov_apply.<locals>.<lambda>r   rQ   r   r   r   ov_apply   r   zJTestMakeFunctionToJITFunction.test_basic_apply_like_case.<locals>.ov_applyc                    s   dd } | |S )Nc                 S   s   | d S r   r   r*   r   r   r   mul10   rJ   zUTestMakeFunctionToJITFunction.test_basic_apply_like_case.<locals>.impl.<locals>.mul10r   )rR   rV   rS   r   r   r         
zFTestMakeFunctionToJITFunction.test_basic_apply_like_case.<locals>.implr   )r   r   rL   arangetestingassert_allclose)r'   rU   r   r(   rB   r   rW   r   test_basic_apply_like_case   s   

z8TestMakeFunctionToJITFunction.test_basic_apply_like_casez%Needs option/flag inheritance to workc                 C   s@   dd }t dd|t}|tj}d}| |||| d S )Nc                    r   )Nc                    s   dd } || S )Nc                 S   s   d|  S NrD   r   valr   r   r   r      rJ   zlTestMakeFunctionToJITFunction.test_jit_option_inheritance.<locals>.impl_factory.<locals>.impl.<locals>.innerr   r+   r   r   r   r   r      rX   z]TestMakeFunctionToJITFunction.test_jit_option_inheritance.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!      r"   zOTestMakeFunctionToJITFunction.test_jit_option_inheritance.<locals>.impl_factorynumpy)error_modelr   r#   rA   r   r   r   test_jit_option_inheritance   s
   
z9TestMakeFunctionToJITFunction.test_jit_option_inheritancec                 C   V   t dd }| tj}|d W d    n1 sw   Y  | dt|j d S )Nc                    s@   | rd  fdd}t |d}|S d  fdd}t |d}|S )N   c                       |   S r   r   r9   r*   r   r   r      rJ   zXTestMakeFunctionToJITFunction.test_multiply_defined_freevar.<locals>.impl.<locals>.innerrD   r<   c                    rf   r   r   r9   r*   r   r   r      rJ   rE   )r   )cr   rr   r*   r   r      s   

zITestMakeFunctionToJITFunction.test_multiply_defined_freevar.<locals>.implrD   z,Cannot capture a constant value for variabler   assertRaisesr   TypingErrorassertInstr	exceptionr'   r   er   r   r   test_multiply_defined_freevar   s   

z;TestMakeFunctionToJITFunction.test_multiply_defined_freevarc                 C   rd   )Nc                    s    t |   fdd}t|| S )Nc                    s   d  |  S r]   r   r^   r7   r   r   r      r;   zTTestMakeFunctionToJITFunction.test_non_const_in_escapee.<locals>.impl.<locals>.inner)rL   rY   r   r`   r   r7   r   r      s   

zETestMakeFunctionToJITFunction.test_non_const_in_escapee.<locals>.implrD   z0Cannot capture the non-constant value associatedri   ro   r   r   r   test_non_const_in_escapee   s   

z7TestMakeFunctionToJITFunction.test_non_const_in_escapeec                 C   s4   dd }t |t}|tj}tj| |  d S )Nc                    r   )Nc                     sH   d d fdd	} | dddd	d
| dddd| ddd| dddfS )N   r     c                        d}|| |   |  | | S N   r   rB   brg   
mydefault1
mydefault2r8   tr   r   r         zhTestMakeFunctionToJITFunction.test_escape_with_kwargs.<locals>.impl_factory.<locals>.impl.<locals>.innerrD   rE   r@   [   5   re   I   rw   r   rt   r   r   r   r|   r   r      s   
zYTestMakeFunctionToJITFunction.test_escape_with_kwargs.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!         zKTestMakeFunctionToJITFunction.test_escape_with_kwargs.<locals>.impl_factory)r   r   r$   rL   rZ   r[   r&   r   r   r   test_escape_with_kwargs   s   
z5TestMakeFunctionToJITFunction.test_escape_with_kwargsc                 C   s@   t dd }dd }t ||}||j}tj| |  d S )Nc                 W   sH   |\}}}| |||dd}| |||dd}| |||ddd}|| | S )Ni  )rz   )r{   )rz   r{   r   )r	   r
   r+   r:   r8   rB   ry   rg   r   r   r   specialised_consumer   s
   
zcTestMakeFunctionToJITFunction.test_escape_with_kwargs_override_kwargs.<locals>.specialised_consumerc                    r   )Nc                     sF   d d fdd	} | dddd	d
| ddd| ddd| dddfS )Nrs   r   rt   c                    ru   rv   r   rx   r|   r   r   r   
  r~   zxTestMakeFunctionToJITFunction.test_escape_with_kwargs_override_kwargs.<locals>.impl_factory.<locals>.impl.<locals>.innerrD   rE   r@   r   r      re   rw   r   r   r   r   r|   r   r     s   
ziTestMakeFunctionToJITFunction.test_escape_with_kwargs_override_kwargs.<locals>.impl_factory.<locals>.implr   r    r   r   r   r!     r   z[TestMakeFunctionToJITFunction.test_escape_with_kwargs_override_kwargs.<locals>.impl_factory)r   r$   rL   rZ   r[   )r'   r   r!   r(   r   r   r   r   'test_escape_with_kwargs_override_kwargs   s   

zETestMakeFunctionToJITFunction.test_escape_with_kwargs_override_kwargsN)__name__
__module____qualname____doc__r)   r.   r2   r>   rC   rP   r\   unittestskiprc   rq   rr   r   r   r   r   r   r   r      s    &
r   __main__)numbar   
numba.corer   numba.core.extendingr   ra   rL   r   r   r   r6   TestCaser   r   mainr   r   r   r   <module>   s     

  