o
    8ήc                     @   s(  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZ d
edgZG dd deZG dd deZG dd deZeeZG dd deZ eee< e eee < dd Z!e!eee < G dd deZ"G dd de j#Z$dS )    N)contextmanager)njit)errorscpuutilstyping)TargetDescriptor)TargetConfigurationStack)BasicRetarget)overload)dispatcher_registryCPUDispatcherCPUtarget_registryjit_registry.	CustomCPUc                   @   s   e Zd ZdZdS )r   zExtend from the CPU target
    N)__name__
__module____qualname____doc__ r   r   C/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_retargeting.pyr      s    c                   @   s    e Zd ZdZdZedd ZdS )_NestedContextNc              	   c   sB    | j | jf}z|| _ || _d V  W |\| _ | _d S |\| _ | _w N)_typing_context_target_context)selftyping_contexttarget_context
old_nestedr   r   r   nested#   s   z_NestedContext.nested)r   r   r   r   r   r   r!   r   r   r   r   r      s
    r   c                   @   sT   e Zd ZejZe Zej	dd Z
ej	dd Zedd Zedd Zd	d
 ZdS )CustomTargetDescrc                 C   s   t | j| jS r   )r   
CPUContextr   _target_namer   r   r   r   _toplevel_target_context3   s   z*CustomTargetDescr._toplevel_target_contextc                 C   s   t  S r   )r   Contextr%   r   r   r   _toplevel_typing_context8   s   z*CustomTargetDescr._toplevel_typing_contextc                 C      | j j}|dur
|S | jS )z5
        The target context for DPU targets.
        N)_nestedr   r&   r   r!   r   r   r   r   =      z CustomTargetDescr.target_contextc                 C   r)   )z5
        The typing context for CPU targets.
        N)r*   r   r(   r+   r   r   r   r   H   r,   z CustomTargetDescr.typing_contextc                 C   s   | j ||S )z
        A context manager temporarily replacing the contexts with the
        given ones, for the current thread of execution.
        )r*   r!   )r   r   r   r   r   r   nested_contextS   s   z CustomTargetDescr.nested_contextN)r   r   r   r   CPUTargetOptionsoptionsr   r*   r   cached_propertyr&   r(   propertyr   r   r-   r   r   r   r   r"   /   s    





r"   c                   @   s   e Zd ZeZdS )CustomCPUDispatcherN)r   r   r   custom_targettargetdescrr   r   r   r   r2   ^   s    r2   c                  O   s*   d|vsJ d|vsJ t | dti|S )Ntarget_target)r   CUSTOM_TARGET)argskwargsr   r   r   
custom_jitf   s   r:   c                   @   s    e Zd Zedd Zdd ZdS )CustomCPURetargetc                 C   s   t S r   )r7   r%   r   r   r   output_targetr      zCustomCPURetarget.output_targetc                 C   s   t td|j}|S )Nr6   )r   r7   py_func)r   cpu_dispkernelr   r   r   compile_retargetv   s   z"CustomCPURetarget.compile_retargetN)r   r   r   r1   r<   rB   r   r   r   r   r;   q   s    
r;   c                   @   s`   e Zd Z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dd ZdS )TestRetargetingc                    sB   t dddd  t  fdd}t dd }t | _t | _d S )	Nr   r>   c                 S      | d S )zo
            This has a fixed target to "cpu".
            Cannot be used in CUSTOM_TARGET target.
            
   r   xr   r   r   fixed_target      z+TestRetargeting.setUp.<locals>.fixed_targetc                    s    | d S )z
            This has a flexible target, but uses a fixed target function.
            Cannot be used in CUSTOM_TARGET target.
            d   r   rF   rH   r   r   flex_call_fixed   s   z.TestRetargeting.setUp.<locals>.flex_call_fixedc                 S   rD   )zf
            This has a flexible target.
            Can be used in CUSTOM_TARGET target.
            i  r   rF   r   r   r   flex_target   rI   z*TestRetargeting.setUp.<locals>.flex_target)r   locals	functionsr;   retarget)r   rL   rM   r   rK   r   setUp|   s   

zTestRetargeting.setUpc                 C   s   t | jS r   )r	   switch_targetrP   r%   r   r   r   rR      s   zTestRetargeting.switch_targetc                 c   sP    |  tj}d V  W d    n1 sw   Y  | t dt|j d S )Nz != cpu)assertRaisesr   
NumbaErrorassertInr7   str	exception)r   raisesr   r   r   check_retarget_error   s
   z$TestRetargeting.check_retarget_errorc                 C   s(   | j j }| |d |d  d d S )Nhitmissr   )rP   cachestatsassertGreater)r   r]   r   r   r   check_non_empty_cache   s   z%TestRetargeting.check_non_empty_cachec                    s^   | j d  | j d t fdd}|d}| |d | jj }| |tddd d S )	NrH   rM   c                        | } | } | S r   r   rF   rH   rM   r   r   foo      z'TestRetargeting.test_case0.<locals>.foo{   im  r   )rZ   r[   )rO   r   assertEqualrP   r\   r]   dict)r   rb   rr]   r   ra   r   
test_case0   s   

zTestRetargeting.test_case0c                    sb   | j d  t fdd}|   |d}W d    n1 s w   Y  | |d |   d S )NrM   c                    s    | } | S r   r   rF   rM   r   r   rb      s   z'TestRetargeting.test_case1.<locals>.foord   ic  )rO   r   rR   re   r_   )r   rb   rg   r   ri   r   
test_case1   s   


zTestRetargeting.test_case1c              	      s   | j d  | j d t fdd}|  ) |   |d W d   n1 s+w   Y  W d   dS W d   dS 1 sCw   Y  dS )zK
        The non-nested call into fixed_target should raise error.
        rH   rM   c                    r`   r   r   rF   ra   r   r   rb      rc   z'TestRetargeting.test_case2.<locals>.foord   NrO   r   rY   rR   r   rb   r   ra   r   
test_case2      




"zTestRetargeting.test_case2c              	      s   | j d | j d  t fdd}|  ) |   |d W d   n1 s+w   Y  W d   dS W d   dS 1 sCw   Y  dS )zF
        The nested call into fixed_target should raise error
        rM   rL   c                    r`   r   r   rF   rL   rM   r   r   rb      rc   z'TestRetargeting.test_case3.<locals>.foord   Nrk   rl   r   ro   r   
test_case3   rn   zTestRetargeting.test_case3c              	      s   | j d | j d   d}| |d t fdd}|  ) |   |d W d   n1 s5w   Y  W d   dS W d   dS 1 sMw   Y  dS )z
        Same as case2 but flex_call_fixed() is invoked outside of CUSTOM_TARGET
        target before the switch_target.
        rM   rL   rd      c                    r`   r   r   rF   ro   r   r   rb      rc   z'TestRetargeting.test_case4.<locals>.fooN)rO   re   r   rY   rR   )r   rg   rb   r   ro   r   
test_case4   s   




"zTestRetargeting.test_case4c                    s   dd  t  tddd }t  dddd }td	d
 }t fdd}|d}| |d |   |d}| |d W d   n1 sIw   Y  |   dS )zA
        Tests overload resolution with target switching
        c                 S      d S r   r   rF   r   r   r   overloaded_func     z3TestRetargeting.test_case5.<locals>.overloaded_func)r5   c                 S      dd }|S )Nc                 S      dS )Nin  r   rF   r   r   r   impl
  ru   zRTestRetargeting.test_case5.<locals>.ol_overloaded_func_custom_target.<locals>.implr   rG   rx   r   r   r    ol_overloaded_func_custom_target     zDTestRetargeting.test_case5.<locals>.ol_overloaded_func_custom_targetr   c                 S   rv   )Nc                 S   rw   )Niz  r   rF   r   r   r   rx     ru   zHTestRetargeting.test_case5.<locals>.ol_overloaded_func_cpu.<locals>.implr   ry   r   r   r   ol_overloaded_func_cpu  r{   z:TestRetargeting.test_case5.<locals>.ol_overloaded_func_cpuc                 S   rs   r   r   rF   r   r   r   flex_resolve_overload  r=   z9TestRetargeting.test_case5.<locals>.flex_resolve_overloadc                    s   |  |  S r   r   rF   rt   r   r   rb     s   z'TestRetargeting.test_case5.<locals>.foord   i2{  i  N)r   r7   r   re   rR   r_   )r   rz   r|   r}   rb   rg   r   r~   r   
test_case5   s    





zTestRetargeting.test_case5N)r   r   r   rQ   rR   r   rY   r_   rh   rj   rm   rp   rr   r   r   r   r   r   rC   {   s     
rC   )%unittest
contextlibr   numbar   
numba.corer   r   r   r   numba.core.descriptorsr   numba.core.dispatcherr	   numba.core.retargetr
   numba.core.extendingr   numba.core.target_extensionr   r   r   r   r   joinr   r7   r   objectr   r"   r3   r2   r:   r;   TestCaserC   r   r   r   r   <module>   s*    ,
