B
     \Ǚ                 @   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Zd dl	Z	d dl
m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mZ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 d
l"m#Z# d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z; ej<dkZ=ddl>m?Z?m@Z@ y4d dlAZAeeAjBdk rndZCnd dlDmE  mFZC W n eGk
r   dZCY nX G dd deHZIG dd dejJZKeKdZLeI ZMe%NeIdd ZOe(eKejPdd ZQdd ZRe-eKe,jS e/eKdd ZTG dd deHZUG dd  d ejJZVeVd!ZWeU ZXe%NeUd"d ZOd#d$ ZYe-eVe,jS e/eVd%d ZTdd&d'ZZe&eZd(d) Z[e'eZe'eZej\d*d+ Z]e'eZej^d,d- Z_e9G d.d/ d/e7Z`e'd0eKd1d2 Zad3d4 Zbd5d6 Zcd7d8 Zde)ebd9d: Zee)ebd;d< Zfe)egd=d> Zhe)ejid?d@ Zje)ejkdAdB Zle)ejmdCdD Zne)ejodEdF ZpdGdH ZqdIdJ Zre)ejsdKdL ZtdMdN ZudOdP ZvdQdR ZwdSdT ZxdUdV Zye+eKdWdXdY ZzdZd[ Z{d\d] Z|d^d_ Z}d`da Z~dbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq Zdrds Ze)edtdu Zdvdw Zdxdy Zdzd{ Ze:eG d|d} d}e;Zd~d ZG dd deZG dd deZG dd deZdd ZG dd deZdd ZG dd deZG dd dejZG dd dejZedkr$e  dS )    )print_functiondivisionabsolute_importN)LooseVersion)unittest_support)njitjittypeserrorstypingcompiler)
cpu_target)compile_isolated   )TestCasecaptured_stdouttagtemp_directoryoverride_config)LoweringError)typeof_impltype_callablelower_builtin
lower_castoverloadoverload_attributeoverload_methodmodelsregister_modelboxunboxNativeValuemake_attribute_wrapper	intrinsic
_Intrinsicregister_jitableget_cython_function_address)ConcreteTemplate	signatureinferinfer_globalAbstractTemplate)   )IndexSeriesz0.19c               @   s   e Zd ZdS )MyDummyN)__name__
__module____qualname__ r3   r3   9lib/python3.7/site-packages/numba/tests/test_extending.pyr/   6   s   r/   c               @   s   e Zd Zdd ZdS )MyDummyTypec             C   s"   t |tjrddlm} |jS d S )Nr   )
Conversion)
isinstancer	   NumberZnumba.typeconvr6   Zsafe)selfcontexttotyr6   r3   r3   r4   can_convert_to:   s    zMyDummyType.can_convert_toN)r0   r1   r2   r<   r3   r3   r3   r4   r5   9   s   r5   mydummyc             C   s   t S )N)mydummy_type)valcr3   r3   r4   typeof_mydummyB   s    rA   c             C   s   |  |dS )z2
    Implicit conversion from MyDummy to int.
    *   )get_constant)r:   builderZfromtyr;   r?   r3   r3   r4   mydummy_to_numberF   s    rE   c               C   s   t S )N)r=   r3   r3   r3   r4   	get_dummyM   s    rF   c             C   s   t |j S )N)r!   r:   get_dummy_value)typobjr@   r3   r3   r4   unbox_indexR   s    rJ   c               @   s   e Zd ZdS )MyDummy2N)r0   r1   r2   r3   r3   r3   r4   rK   Z   s   rK   c               @   s   e Zd ZdS )MyDummyType2N)r0   r1   r2   r3   r3   r3   r4   rL   ]   s   rL   	mydummy_2c             C   s   t S )N)mydummy_type_2)r?   r@   r3   r3   r4   rA   c   s    c               C   s   t S )N)rM   r3   r3   r3   r4   get_dummy_2h   s    rO   c             C   s   t |j S )N)r!   r:   rG   )rH   rI   r@   r3   r3   r4   rJ   m   s    c             C   s   t d S )N)NotImplementedError)xr3   r3   r4   func1v   s    rR   c             C   s   ddd}|S )Nc             S   s(   | d t jfkrt jS t| t jr$| S d S )N)r	   noneint32r7   Float)rQ   r3   r3   r4   typer{   s    ztype_func1.<locals>.typer)Nr3   )r:   rV   r3   r3   r4   
type_func1y   s    
rW   c             C   s   |  |jdS )NrB   )rC   return_type)r:   rD   sigargsr3   r3   r4   func1_nullary   s    r[   c             C   s   dd }|  ||||S )Nc             S   s   t d|  S )N   )mathZsqrt)rQ   r3   r3   r4   
func1_impl   s    zfunc1_unary.<locals>.func1_impl)Zcompile_internal)r:   rD   rY   rZ   r^   r3   r3   r4   func1_unary   s    r_   c               @   s   e Zd ZdZeejegZdS )
PrintDummy
print_itemN)	r0   r1   r2   keyr(   r	   rS   r>   Zcasesr3   r3   r3   r4   r`      s   r`   ra   c             C   s<   |\}|  |}||d}|| || |  S )Nzhello!)Zget_python_apiZunserializeZserialize_objectZprint_objectZdecrefrG   )r:   rD   rY   rZ   rQ   ZpyapiZstrobjr3   r3   r4   print_dummy   s    


rc   c             C   s   t d S )N)rP   )condrQ   yr3   r3   r4   where   s    rf   c             C   s   t | ||S )z8
    Wrap np.where() to allow for keyword arguments
    )nprf   )rd   rQ   re   r3   r3   r4   np_where   s    rh   c             C   s   t | ||dS )N)re   rQ   )rf   )rd   rQ   re   r3   r3   r4   
call_where   s    ri   c             C   sT   t | tjrP|j|jkr"tdtdd | ||fD rDdd }ndd }|S dS )z'
    Implement where() for arrays.
    z"x and y should have the same dtypec             s   s   | ]}|j d kV  qdS )CN)Zlayout).0Ztyr3   r3   r4   	<genexpr>   s    z(overload_where_arrays.<locals>.<genexpr>c       
      S   sx   | j }|j |ks|j |kr"tdt|}| j}|j}|j}|j}x.t| jD ] }	||	 rd||	 n||	 ||	< qPW |S )zM
                Fast implementation for C-contiguous arrays
                z%all inputs should have the same shape)shape
ValueErrorrg   
empty_likeZflatrangesize)
rd   rQ   re   rm   resZcfZxfZyfZrfir3   r3   r4   
where_impl   s    
 z)overload_where_arrays.<locals>.where_implc             S   s`   | j }|j |ks|j |kr"tdt|}x.t| D ] \}}|rL|| n|| ||< q8W |S )zI
                Generic implementation for other arrays
                z%all inputs should have the same shape)rm   rn   rg   ro   Zndenumerate)rd   rQ   re   rm   rr   idxr@   r3   r3   r4   rt      s    
N)r7   r	   Arraydtyper
   TypingErrorall)rd   rQ   re   rt   r3   r3   r4   overload_where_arrays   s    

rz   c             C   s.   t | tjs*||krtddd }|S dS )z(
    Implement where() for scalars.
    z!x and y should have the same typec             S   s"   | r|n|}t |}||d< |S )z@
            Scalar where() => return a 0-dim array
            r3   )rg   ro   )rd   rQ   re   Zscalarrr3   r3   r4   rt      s    
z*overload_where_scalars.<locals>.where_implN)r7   r	   rv   r
   rx   )rd   rQ   re   rt   r3   r3   r4   overload_where_scalars   s
    

r|   c             C   s   t | trdd }|S d S )Nc             S   s   dS )N   r3   )argr3   r3   r4   len_impl   s    z$overload_len_dummy.<locals>.len_impl)r7   r5   )r~   r   r3   r3   r4   overload_len_dummy   s    
r   c             C   s,   t | ttfr(t |ttfr(dd }|S d S )Nc             S   s   dS )NrB   r3   )arg1arg2r3   r3   r4   dummy_add_impl  s    z*overload_add_dummy.<locals>.dummy_add_impl)r7   r5   rL   )r   r   r   r3   r3   r4   overload_add_dummy   s    r   c             C   s&   t | tr"t |tjr"dd }|S d S )Nc             S   s   t d| | d S )Ndel)print)rI   ru   r3   r3   r4   dummy_delitem_impl  s    z2overload_dummy_delitem.<locals>.dummy_delitem_impl)r7   r5   r	   Integer)rI   ru   r   r3   r3   r4   overload_dummy_delitem	  s    r   c             C   s&   t | tr"t |tjr"dd }|S d S )Nc             S   s   |d S )N{   r3   )rI   ru   r3   r3   r4   dummy_getitem_impl  s    z2overload_dummy_getitem.<locals>.dummy_getitem_impl)r7   r5   r	   r   )rI   ru   r   r3   r3   r4   overload_dummy_getitem  s    r   c             C   s4   t t| tt|tjt|tjgr0dd }|S d S )Nc             S   s   t || d S )N)r   )rI   ru   r?   r3   r3   r4   dummy_setitem_impl   s    z2overload_dummy_setitem.<locals>.dummy_setitem_impl)ry   r7   r5   r	   r   )rI   ru   r?   r   r3   r3   r4   overload_dummy_setitem  s    
r   c             C   s   t | |S )N)operatoradd)r   r   r3   r3   r4   call_add_operator%  s    r   c             C   s   | | S )Nr3   )r   r   r3   r3   r4   call_add_binop)  s    r   c             C   s,   t | ttfr(t |ttfr(dd }|S d S )Nc             S   s   dS )NrB   r3   )r   r   r3   r3   r4   dummy_iadd_impl0  s    z,overload_iadd_dummy.<locals>.dummy_iadd_impl)r7   r5   rL   )r   r   r   r3   r3   r4   overload_iadd_dummy-  s    r   c             C   s   t | |S )N)r   r   )r   r   r3   r3   r4   call_iadd_operator6  s    r   c             C   s   | |7 } | S )Nr3   )r   r   r3   r3   r4   call_iadd_binop:  s    r   c             C   s
   | |= d S )Nr3   )rI   ru   r3   r3   r4   call_delitem@  s    r   c             C   s   | | S )Nr3   )rI   ru   r3   r3   r4   call_getitemD  s    r   c             C   s   || |< d S )Nr3   )rI   ru   r?   r3   r3   r4   call_setitemH  s    r   lengthc             C   s   dd }|S )Nc             S   s   t | S )N)len)r~   r3   r3   r4   impN  s    z#overload_method_length.<locals>.impr3   )r~   r   r3   r3   r4   overload_method_lengthL  s    r   c             C   s   |   S )N)r   )rQ   r3   r3   r4   cache_overload_method_usecaseS  s    r   c               C   s   t  S )N)rR   r3   r3   r3   r4   call_func1_nullaryW  s    r   c             C   s   t | S )N)rR   )rQ   r3   r3   r4   call_func1_unaryZ  s    r   c             C   s   t | S )N)r   )rQ   r3   r3   r4   len_usecase]  s    r   c             C   s   t |  d S )N)r   )rQ   r3   r3   r4   print_usecase`  s    r   c             C   s   | | S )Nr3   )rQ   rb   r3   r3   r4   getitem_usecasec  s    r   c             C   s   t t | S )N)rg   cossin)rQ   r3   r3   r4   npyufunc_usecasef  s    r   c             C   s   | j S )N)_data)rQ   r3   r3   r4   get_data_usecasei  s    r   c             C   s   | j S )N)_index)rQ   r3   r3   r4   get_index_usecasel  s    r   c             C   s   | j S )N)Zis_monotonic_increasing)rQ   r3   r3   r4   is_monotonic_usecaseo  s    r   c             C   s
   t | |S )N)r.   )dataindexr3   r3   r4   make_series_usecaser  s    r   c             C   s   |  ||S )N)Zclip)rQ   lohir3   r3   r4   clip_usecaseu  s    r   c               C   s   t S )N)rg   r3   r3   r3   r4   return_non_boxable{  s    r   c              C   s   dd } | S )Nc               S   s   t S )N)rg   r3   r3   r3   r4   r     s    z(overload_return_non_boxable.<locals>.impr3   )r   r3   r3   r4   overload_return_non_boxable  s    r   c             C   s   t  }|| S )N)r   arange)Zszmodr3   r3   r4   non_boxable_ok_usecase  s    r   c               C   s   t  S )N)r   r3   r3   r3   r4   non_boxable_bad_usecase  s    r   c             C   s   d S )Nr3   )fr3   r3   r4   mk_func_input  s    r   c               @   s   e Zd Zdd ZdS )MkFuncTypingc             C   s$   t |d tjstttjf| S )Nr   )r7   r	   MakeFunctionLiteralAssertionErrorr(   rS   )r9   rZ   kwsr3   r3   r4   generic  s    zMkFuncTyping.genericN)r0   r1   r2   r   r3   r3   r3   r4   r     s   r   c               C   s   t dd  d S )Nc             S   s   | S )Nr3   )ar3   r3   r4   <lambda>  s    z#mk_func_test_impl.<locals>.<lambda>)r   r3   r3   r3   r4   mk_func_test_impl  s    r   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )TestLowLevelExtendingz4
    Test the low-level two-tier extension API.
    c             C   sV   t }tdd|}| | d t}tdd|}| |d d | |dd d S )NT)nopythonrB   g      2@g      @)r   r   assertPreciseEqualr   )r9   pyfunccfuncr3   r3   r4   
test_func1  s    z TestLowLevelExtending.test_func1c             C   sF   t }t|d}| | d t}t|tjf}| |dd d S )Nr3   rB   g      2@g      @)r   r   r   entry_pointr   r	   float64)r9   r   crr3   r3   r4   test_func1_isolated  s    
z)TestLowLevelExtending.test_func1_isolatedc             C   s&   t }t|dtj}| | d d S )Nr3   g      E@)rF   r   r	   r   r   r   )r9   r   r   r3   r3   r4   test_cast_mydummy  s    z'TestLowLevelExtending.test_cast_mydummyc             C   sN   t t}tj}|  t ||dd\}}}| tdd |	 D  dS )zFmake sure make_function is passed to typer class as a literal
        r3   Nc             s   s   | ]}t |tjV  qd S )N)r7   r	   r   )rk   r   r3   r3   r4   rl     s   z=TestLowLevelExtending.test_mk_func_literal.<locals>.<genexpr>)
r   Zrun_frontendr   r   Ztyping_contextZrefreshZtype_inference_stageZ
assertTrueanyvalues)r9   Ztest_ir	typingctxZtypemap_r3   r3   r4   test_mk_func_literal  s    
z*TestLowLevelExtending.test_mk_func_literalN)r0   r1   r2   __doc__r   r   r   r   r3   r3   r3   r4   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e	ddd Z
e	ddd Zdd Ze	ddd Ze	ddd ZdS )TestPandasLikeze
    Test implementing a pandas-like Index object.
    Also stresses most of the high-level API.
    c             C   s0   t td}tddt}| ||d d S )Nr,   T)r   )r-   rg   r   r   r   r   )r9   rs   r   r3   r3   r4   test_index_len  s    zTestPandasLike.test_index_lenc             C   sh   t tdddg}tddt}| ||dd ||tdd }| |t  | t	|ddg d S )NrB      T)r   r   )
r-   rg   rT   r   r   r   sliceassertIsInstanceassertEquallist)r9   rs   r   iir3   r3   r4   test_index_getitem  s    z!TestPandasLike.test_index_getitemc             C   sV   t tdddg}tddt}||}| |t  | |jtt	|j dS )z7
        Check Numpy ufunc on an Index object.
        rB   r   r   T)r   N)
r-   rg   rT   r   r   r   r   r   r   r   )r9   rs   r   r   r3   r3   r4   test_index_ufunc  s
    zTestPandasLike.test_index_ufuncc             C   s<   t tdddg}tddt}||}| ||j d S )NrB   r   r   T)r   )r-   rg   rT   r   r   assertIsr   )r9   rs   r   r   r3   r3   r4   test_index_get_data  s    z"TestPandasLike.test_index_get_datac             C   sd   t ddt}xPdddgdfdddgdfg dfgD ]*\}}tt|}||}| || q2W d S )NT)r   r   rB      F)r   r   r-   rg   rT   r   )r9   r   r   expectedrs   gotr3   r3   r4   test_index_is_monotonic  s    z&TestPandasLike.test_index_is_monotonic	importantc             C   sL   t tdddg}ttdddg|}tddt}| ||d d S )	Nr\      r,   g      ?g      @g      @T)r   )r-   rg   rT   r.   r   r   r   r   )r9   rs   sr   r3   r3   r4   test_series_len  s    zTestPandasLike.test_series_lenc             C   s`   t tdddg}ttdddg|}tddt}||}| |t  | |j	|j	 d S )	Nr\   r   r,   g      ?g      @g      @T)r   )
r-   rg   rT   r.   r   r   r   r   r   r   )r9   rs   r   r   r   r3   r3   r4   test_series_get_index  s    z$TestPandasLike.test_series_get_indexc             C   s   t tdddg}ttdddg|}tddt}||}| |t | |jt  | 	|jj
|j
 | |jtt|j d	S )
z8
        Check Numpy ufunc on an Series object.
        rB   r   r   r   r\   r,   T)r   N)r-   rg   rT   r.   int64r   r   r   r   r   r   r   _valuesr   r   )r9   rs   r   r   ssr3   r3   r4   test_series_ufunc  s    z TestPandasLike.test_series_ufuncc             C   sz   t tdddg}tdddg}tddt}|||}| |t | |jt  | 	|jj
|j
 | 	|j| d S )	NrB   r   r   g      ?g      @g      @T)r   )r-   rg   rT   r   r   r   r   r.   r   r   r   r   )r9   rs   dr   r   r3   r3   r4   test_series_constructor  s    
z&TestPandasLike.test_series_constructorc             C   s   t tdddg}ttdddg|}tddt}||d	d
}| |t | |jt  | 	|jj
|j
 | |jtd	d
dg d S )NrB   r   r   g      ?g      @g      @T)r   g?g      @)r-   rg   rT   r.   r   r   r   r   r   r   r   r   r   )r9   rs   r   r   r   r3   r3   r4   test_series_clip  s    zTestPandasLike.test_series_clipN)r0   r1   r2   r   r   r   r   r   r   r   r   r   r   r   r   r3   r3   r3   r4   r     s   
	r   c               @   s   e Zd ZdZeddd Zed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eddd Zdd Zd d! Zd"d# Zd$S )%TestHighLevelExtendingz+
    Test the high-level combined API.
    r   c          	      s   t }tdd|  fdd}|dddd |ddd |tdddgtd	d
dgtdddg tj$} tg tg tg  W dQ R X 	dt
|j dS )z>
        Test implementing a function with @overload.
        T)r   c                 s   t | |} | |}j d S )N)rh   r   )rZ   kwargsr   r   )r   r9   r3   r4   check8  s    

z0TestHighLevelExtending.test_where.<locals>.checkr,   r   )rQ   rd   re   Fr   r\   r   r   Nz"x and y should have the same dtype)ri   r   rg   Zbool_rT   assertRaisesr
   rx   r   assertInstr	exception)r9   r   r   raisesr3   )r   r9   r4   
test_where0  s    (z!TestHighLevelExtending.test_wherec             C   s8   t ddt}| |t d | |ddgd dS )zN
        Test re-implementing len() for a custom type with @overload.
        T)r   r}   r   r   r\   N)r   r   r   r/   )r9   r   r3   r3   r4   test_lenH  s    zTestHighLevelExtending.test_lenc          	   C   s@   t ddt}t " |t  | tj d W dQ R X dS )zP
        Test re-implementing print() for a custom type with @overload.
        T)r   zhello!
N)r   r   r   r/   r   sysstdoutgetvalue)r9   r   r3   r3   r4   
test_printQ  s    
z!TestHighLevelExtending.test_printc             C   sT   t }tdd|}| |ddd | |t t d | |t t d dS )	zW
        Test re-implementing operator.add() for a custom type with @overload.
        T)r   r   r\   r,   rB   T   N)r   r   r   rK   r/   )r9   r   r   r3   r3   r4   test_add_operatorZ  s
    z(TestHighLevelExtending.test_add_operatorc             C   sT   t }tdd|}| |ddd | |t t d | |t t d dS )	zY
        Test re-implementing '+' for a custom type via @overload(operator.add).
        T)r   r   r\   r,   rB   r   N)r   r   r   rK   r/   )r9   r   r   r3   r3   r4   test_add_binopg  s
    z%TestHighLevelExtending.test_add_binopc             C   sT   t }tdd|}| |ddd | |t t d | |t t d dS )	zW
        Test re-implementing operator.add() for a custom type with @overload.
        T)r   r   r\   r,   rB   r   N)r   r   r   rK   r/   )r9   r   r   r3   r3   r4   test_iadd_operatort  s
    z)TestHighLevelExtending.test_iadd_operatorc             C   sT   t }tdd|}| |ddd | |t t d | |t t d dS )	zY
        Test re-implementing '+' for a custom type via @overload(operator.add).
        T)r   r   r\   r,   rB   r   N)r   r   r   rK   r/   )r9   r   r   r3   r3   r4   test_iadd_binop  s
    z&TestHighLevelExtending.test_iadd_binopc             C   s   t }tdd|}t }d }t <}y||d W n& tk
rX } z|}W d d }~X Y nX W d Q R X |d k	rp|| | d d S )NT)r   iA  zdel hello! 321
)r   r   r/   r   	Exceptionr   r   )r9   r   r   rI   eoutexcr3   r3   r4   test_delitem  s     z#TestHighLevelExtending.test_delitemc             C   s*   t }tdd|}| |t dd d S )NT)r   iA  i  )r   r   r   r/   )r9   r   r   r3   r3   r4   test_getitem  s    z#TestHighLevelExtending.test_getitemc             C   s   t }tdd|}t }d }t >}y||dd W n& tk
rZ } z|}W d d }~X Y nX W d Q R X |d k	rr|| | d d S )NT)r   iA  r   z321 123
)r   r   r/   r   r  r   r   )r9   r   r   rI   r  r  r  r3   r3   r4   test_setitem  s     z#TestHighLevelExtending.test_setitemc       	   	   C   sx   t ddt}d}||}t|}tj|| t ddt}| t}|  W dQ R X t|j	}d}| 
|| dS )zW
        Test overloading whose return value cannot be represented in CPython.
        T)r   
   Nzcannot convert native Module)r   r   rg   ZtestingZassert_equalr   r   	TypeErrorr   r   r   )	r9   Zok_cfuncnr   expectZ	bad_cfuncr   errmsgZ	expectmsgr3   r3   r4   test_no_cpython_wrapper  s    
z.TestHighLevelExtending.test_no_cpython_wrapperc          	   C   s,  d'dd}d}d(dd}|  tj}||dd	d
d W dQ R X t|j}| || | d| tr| d| | d| d)dd}|  tj}||dd	d
d W dQ R X t|j}| || | d| tr| d| | d| d*dd}|  tj}||dd	d
d W dQ R X t|j}| || | d| | d|k trt| d| | d| trbddlm	}m
}	 |  tj}||dd	d
d W dQ R X t|j}| || | d| | d|k | d| |  tj}||	dd	d
d W dQ R X t|j}| || | d| | d|k | d| | d| d+dd}
|  tj}||
dd	d
d W dQ R X t|j}| || | d| | d|k tr| d| | d| d,dd }|  tj}||dd	d
d W dQ R X t|j}| || | d| | d|k trZ| d!| d-d"d#}|  tj}||dd	d
d W dQ R X t|j}| || | d| tr| d$| d%d& }|  tj}||dd	d
d W dQ R X t|j}| || | d| tr(| d| dS ).z}
        Tests that an overload which has a differing typing and implementing
        signature raises an exception.
        Nc                s:   d	ddt d
 fdd	}tddfdd}|S )Nc             S   s   d S )Nr3   )r   br@   kwr3   r3   r4   
myoverload  s    zjTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>.myoverloadc                s    S )Nr3   )r   r  r@   r  )implr3   r4   _myoverload_impl  s    zpTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>._myoverload_implT)r   c                s    | |||d d S )N)r  r3   )r   r  r@   r   )r  r3   r4   foo  s    zcTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>.foo)N)N)r   r   )r  r  r  r3   )r  r  r4   gen_ol  s
    
zVTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_olz-Typing and implementation arguments differ in   c             S   s   | dkrdS dS d S )Nr
  r   r3   )r   r  r@   r  r3   r3   r4   impl1  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl1r   r\   r,   r   zkeyword argument default valuesz<Parameter "kw=12">z<Parameter "kw=None">c             S   s   | dkrdS dS d S )Nr
  r   r  r3   )r   r  r@   Zkwargr3   r3   r4   impl2  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl2zkeyword argument namesz<Parameter "kwarg=None">c             S   s   t dkrdS dS d S )Nr
  r   r  )r   )zr  r@   r  r3   r3   r4   impl3  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl3zargument nameskeywordz<Parameter "a">z<Parameter "z">)impl4impl5zFirst difference: 'z'c             S   s   | dkrdS dS d S )Nr
  r   r  r3   )r   r  r@   r   r  r  r3   r3   r4   impl6"  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl6z<Parameter "d">z<Parameter "e">c             S   s   | dkrdS dS d S )Nr
  r   r  r3   )r   r  r  r3   r3   r4   impl73  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl7z<Parameter "c">c             S   s   | dkrdS dS d S )Nr
  r   r  r3   )r   r  r@   r  Zextra_kwargr3   r3   r4   impl8C  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl8z<Parameter "extra_kwarg=None">c             S   s   | dkrdS dS d S )Nr
  r   r  r3   )r   r  r@   r3   r3   r4   impl9R  s    zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl9)N)r  )N)N)N)N)NN)r   r
   rx   r   r   r   _IS_PY3ZassertFalseoverload_usecasesr  r  )r9   r  sentinelr  r  msgr  r  r  r  r   r!  r"  r#  r3   r3   r4   /test_typing_vs_impl_signature_mismatch_handling  s    















zFTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handlingzPython 3+ only syntaxc          	      s   ddd ddl m} t | tdd fdd	}| tj}|dd
 W dQ R X t|j}| 	d| | 	d| dS )z
        Tests that an overload which has a differing typing and implementing
        signature raises an exception and uses VAR_POSITIONAL (*args) in typing
        Nc             S   s   d S )Nr3   )r   r  r3   r3   r4   r  f  s    ziTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_positional.<locals>.myoverloadr   )var_positional_implT)r   c                s    | |dddS )N	      )r  r3   )r   r  )r  r3   r4   r  m  s    zbTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_positional.<locals>.foor   z)VAR_POSITIONAL (e.g. *args) argument kindz-offending argument name is '*star_args_token')N)
r%  r)  r   r   r   r
   rx   r   r   r   )r9   r)  r  r  r'  r3   )r  r4   >test_typing_vs_impl_signature_mismatch_handling_var_positional`  s    

zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_positionalc          	   C   s   ddd}dd }||ddd |  tj}||dd W d	Q R X t|j}| d
| | d| ddd}|  tj}||dd W d	Q R X t|j}| d
| | d| d	S )zJ
        Tests that an overload which uses **kwargs (VAR_KEYWORD)
        Tc                s4   ddd t  |d|  tdd fdd}|S )	Nc             S   s   d S )Nr3   )r   r  r3   r3   r4   r  ~  s    zvTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_ol.<locals>.myoverload)strictT)r   c                s    | ddS )Nr+  )r  r3   )r   r  )r  r3   r4   r    s    zoTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_ol.<locals>.foo)N)r   r   )r  r-  r  r3   )r  r4   r  |  s    
zbTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_olc             [   s   ddd}|S )Nr
  c             S   s   | S )Nr3   )r   r  r3   r3   r4   r    s    zmTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol1.<locals>.impl)r
  r3   )r   r   r  r3   r3   r4   ol1  s    
z_TestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol1Fr   r\   Nz1use of VAR_KEYWORD (e.g. **kwargs) is unsupportedz"offending argument name is '**kws'r   c             S   s   dd }|S )Nc             [   s   | S )Nr3   )r   r   r3   r3   r4   r    s    zmTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol2.<locals>.implr3   )r   r  r  r3   r3   r4   ol2  s    z_TestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol2)T)r   )r   r
   rx   r   r   r   )r9   r  r.  r  r'  r/  r3   r3   r4   ;test_typing_vs_impl_signature_mismatch_handling_var_keywordw  s    



zRTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keywordc             C   s@   t tjdd	dd}tdd }td}| ||d d S )
Nr  r
  c             S   s   ddd}|S )Nr
  c             S   s   |S )Nr3   )r{   a_kwargr3   r3   r4   r    s    zQTestHighLevelExtending.test_overload_method_kwargs.<locals>.fooimpl.<locals>.impl)r
  r3   )r{   r1  r  r3   r3   r4   fooimpl  s    
zCTestHighLevelExtending.test_overload_method_kwargs.<locals>.fooimplc             S   s   |   |  d| j ddfS )N      )r1  )r  )Ar3   r3   r4   bar  s    z?TestHighLevelExtending.test_overload_method_kwargs.<locals>.barr   )r
  r3  r4  )r
  )r   r	   rv   r   rg   r   r   )r9   r2  r6  Zr3   r3   r4   test_overload_method_kwargs  s
    

z2TestHighLevelExtending.test_overload_method_kwargsc             C   sF   t tjddd }tdd }td}|| | ||d d S )Nlitfooc             S   s(   t |tjr$t |tjs$dd }|S d S )Nc             S   s   |S )Nr3   )r{   r?   r3   r3   r4   r    s    zXTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.litfoo.<locals>.impl)r7   r	   r   ZLiteral)r{   r?   r  r3   r3   r4   r9    s    zJTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.litfooc             S   s
   |  dS )Ni  )r9  )r5  r3   r3   r4   r6    s    zGTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.barr   i  )r   r	   rv   r   rg   Zzerosr   )r9   r9  r6  r5  r3   r3   r4   #test_overload_method_literal_unpack  s
    

z:TestHighLevelExtending.test_overload_method_literal_unpackN)r0   r1   r2   r   r   r   r   r   r   r   r  r  r  r  r	  r  r(  unittestZ
skipUnlessr$  r,  r0  r8  r:  r3   r3   r3   r4   r   +  s$   		 +r   c             C   sD   | j | jd  }||kr td| j| jd  }||kr@tdd S )Nr   zcache not used)Z_cache_hitsZ
signaturesr   Z_cache_misses)r   Z
expect_hitZexpect_missesZhitZmissr3   r3   r4   _assert_cache_stats  s    r<  c               @   s    e Zd ZdZdd Zdd ZdS )TestOverloadMethodCachingFc          	   C   s2   t | jj| _td| j |   W d Q R X d S )N	CACHE_DIR)r   	__class__r0   
_cache_dirr   run_caching_overload_method)r9   r3   r3   r4   test_caching_overload_method  s    z6TestOverloadMethodCaching.test_caching_overload_methodc             C   s   t dddt}| |t d t|dd |tf}dd | D }| t	|d yt
d}W n tk
r   t
}Y nX | }|jt|| jfd	}|  |t  |  | |jd |jdd
}| |d d S )NT)r   cacher}   r   r   c             S   s"   g | ]}| d rd|kr|qS )Zdeclarer   )
startswith)rk   Zlnr3   r3   r4   
<listcomp>  s    zITestOverloadMethodCaching.run_caching_overload_method.<locals>.<listcomp>Zspawn)targetrZ   )Ztimeout)r   r   r   r/   r<  Zinspect_llvmr>   
splitlinesr   r   multiprocessingZget_contextAttributeErrorZQueueZProcessrA  r@  startputjoinZexitcodeget)r9   r   ZllvmirZdeclsZctxqprr   r3   r3   r4   rA    s&    
z5TestOverloadMethodCaching.run_caching_overload_methodN)r0   r1   r2   Z_numba_parallel_test_rB  rA  r3   r3   r3   r4   r=    s   r=  c          	   C   sP   t d|< |  }tdddt}||}| | t|dd W dQ R X dS )zH
    Used by TestOverloadMethodCaching.test_caching_overload_method
    r>  T)r   rC  r   r   N)r   rM  r   r   rK  r<  )rN  Z	cache_dirr~   r   rr   r3   r3   r4   rA    s    
rA  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestIntrinsicc          	      s   t dd t dd  tddfdd}tdd fd	d
}| | d | t}|  W dQ R X | d|jj dS )z
        Verify that returning a None from codegen function is handled
        automatically for void functions, otherwise raise exception.
        c             S   s   t t j}dd }||fS )Nc             S   s   d S )Nr3   )r:   rD   r(   rZ   r3   r3   r4   codegen
  s    zBTestIntrinsic.test_void_return.<locals>.void_func.<locals>.codegen)r	   ZvoidrT   )r   r   rY   rQ  r3   r3   r4   	void_func  s    z1TestIntrinsic.test_void_return.<locals>.void_funcc             S   s   t t j}dd }||fS )Nc             S   s   d S )Nr3   )r:   rD   r(   rZ   r3   r3   r4   rQ    s    zFTestIntrinsic.test_void_return.<locals>.non_void_func.<locals>.codegen)r	   rT   )r   r   rY   rQ  r3   r3   r4   non_void_func  s    z5TestIntrinsic.test_void_return.<locals>.non_void_funcT)r   c                  s    d dS )Nr   r   r3   r3   )rR  r3   r4   call_void_func  s    z6TestIntrinsic.test_void_return.<locals>.call_void_funcc                  s    d dS )Nr   r   r3   r3   )rS  r3   r4   call_non_void_func  s    z:TestIntrinsic.test_void_return.<locals>.call_non_void_funcr   Nznon-void function returns None)r#   r   r   r   r   r   r   r'  )r9   rT  rU  r  r3   )rS  rR  r4   test_void_return  s    	zTestIntrinsic.test_void_returnc          	      s   ddl m}m}m}m} fdddd tddfd	d
}dd }|d|||}|| tdd fdd}tjdtj	d}	t
 }
||	 |
  }W dQ R X |
  ttt|	}|| dS )zV
        Usecase test: custom reinterpret cast to turn int values to pointers
        r   )	CFUNCTYPEPOINTERc_floatc_intc                s&   t  tjstt fdd}|S )Nc                s8    | tj t|tjr4 tj}dd }||fS d S )Nc             S   s"   |\}|j }| |}|||S )N)rX   Zget_value_typeZinttoptr)r:   rD   r(   rZ   srcZrtypeZllrtyper3   r3   r4   rQ  9  s    
z_TestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_caster.<locals>.unsafe_cast.<locals>.codegen)r   r   ZContextr7   r	   r   Zuintp)r   r[  rY   rQ  )result_typer9   r3   r4   unsafe_cast2  s
    
zNTestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_caster.<locals>.unsafe_cast)r7   r	   CPointerr   r#   )r\  r]  )r9   )r\  r4   unsafe_caster/  s    z9TestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_casterc             S   s   t dd S )Nznot callable from python)rP   )r[  r3   r3   r4   unsafe_get_ctypes_pointerE  s    zETestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_get_ctypes_pointerF)r-  c                s0   t | tjr,t| j  fdd}|S d S )Nc                s    | j jdS )N)r[  )ctypesr   )r{   )r]  r3   r4   
array_implM  s    zdTestIntrinsic.test_ll_pointer_cast.<locals>.array_impl_unsafe_get_ctypes_pointer.<locals>.array_impl)r7   r	   rv   r^  rw   )Zarrtyperb  )r_  )r]  r4   $array_impl_unsafe_get_ctypes_pointerH  s    zPTestIntrinsic.test_ll_pointer_cast.<locals>.array_impl_unsafe_get_ctypes_pointerc             S   s"   xt |D ]}t| |  q
W d S )N)rp   r   )ptrr  rs   r3   r3   r4   my_c_fun_rawR  s    z8TestIntrinsic.test_ll_pointer_cast.<locals>.my_c_fun_rawNT)r   c                s   | } || j  d S )N)rq   )r{   rd  )my_c_funr`  r3   r4   r  [  s    z/TestIntrinsic.test_ll_pointer_cast.<locals>.foor
  )rw   )ra  rW  rX  rY  rZ  r   r   rg   r   Zfloat32r   r   rG  closer   mapr   r   )r9   rW  rX  rY  rZ  rc  re  Z	prototyper  r{   Zbufr   r  r3   )rf  r9   r_  r`  r4   test_ll_pointer_cast(  s    
z"TestIntrinsic.test_ll_pointer_castc                s   t dd  tdd fdd}| |dd tj}t|}t|}|d7 }| |t| t|}| |t| | |d|d t }| |t| t|}| 	 | | |t| dS )	z9
        Test serialization of intrinsic objects
        c             S   s   dd }||}||fS )Nc             S   s   |d S )Nr   r3   )r:   rD   r(   rZ   r3   r3   r4   rQ  p  s    zCTestIntrinsic.test_serialization.<locals>.identity.<locals>.codegenr3   )r:   rQ   rQ  rY   r3   r3   r4   identityn  s    z2TestIntrinsic.test_serialization.<locals>.identityT)r   c                s    | S )Nr3   )rQ   )rj  r3   r4   r  w  s    z-TestIntrinsic.test_serialization.<locals>.foor   N)
r#   r   r   r$   _memor   pickledumpsloadsr   )r9   r  memo	memo_sizeZserialized_fooZfoo_rebuiltZserialized_identityZidentity_rebuiltr3   )rj  r4   test_serializationi  s     	



z TestIntrinsic.test_serializationc             C   s   dd }t j}t|}t d|}| |j| t|}|d7 }| |t| ~| |t| t j	  |d8 }| |t| t
|}| |j| t
|}| |j|j dS )z3
        Test deserialization of intrinsic
        c             S   s   dd }|||fS )Nc             S   s   |d S )Nr   r3   )r:   rD   r(   rZ   r3   r3   r4   rQ    s    zATestIntrinsic.test_deserialization.<locals>.defn.<locals>.codegenr3   )r:   rQ   rQ  r3   r3   r4   defn  s    z0TestIntrinsic.test_deserialization.<locals>.defnr  r   N)r$   rk  r   r   Z_defnrl  rm  r   Z_recentclearrn  ZassertIsNot)r9   rr  ro  rp  ZoriginalZpickledZrebuiltsecondr3   r3   r4   test_deserialization  s"    




z"TestIntrinsic.test_deserializationN)r0   r1   r2   rV  ri  rq  ru  r3   r3   r3   r4   rP     s   'A.rP  c               @   s   e Zd Zdd Zdd ZdS )TestRegisterJitablec                sJ   t dd   fdd}tdd|}|dd}|dd}| || d S )	Nc             S   s   | | S )Nr3   )rQ   re   r3   r3   r4   r    s    z.TestRegisterJitable.test_no_flags.<locals>.fooc                s
    | |S )Nr3   )rQ   re   )r  r3   r4   r6    s    z.TestRegisterJitable.test_no_flags.<locals>.barT)r   r   r\   )r%   r   r   )r9   r6  cbarr  r   r3   )r  r4   test_no_flags  s    

z!TestRegisterJitable.test_no_flagsc          	      s   t dddd   fdd}| |d dd	d
g tdd|}| tj}|d
 W d Q R X d}| |t|j	 d S )NF)Z_nrtc             S   s
   t | S )N)rg   r   )r  r3   r3   r4   r    s    z2TestRegisterJitable.test_flags_no_nrt.<locals>.fooc                s    | S )Nr3   )r  )r  r3   r4   r6    s    z2TestRegisterJitable.test_flags_no_nrt.<locals>.barr,   r   r   r\   T)r   zCOnly accept returning of array passed into the function as argument)
r%   r   tolistr   r   r
   rx   r   r   r   )r9   r6  rw  r   r'  r3   )r  r4   test_flags_no_nrt  s    z%TestRegisterJitable.test_flags_no_nrtN)r0   r1   r2   rx  rz  r3   r3   r3   r4   rv    s   rv  c               @   sD   e Zd Zeedkddd Zdd Zeedkddd ZdS )	TestImportCythonFunctionNz&Only run if SciPy >= 0.19 is installedc                sL   t dd}ttjtj}|| tdd fdd}| |dd d S )	Nzscipy.special.cython_specialj0T)r   c                s    | S )Nr3   )rQ   )_j0r3   r4   r     s    z@TestImportCythonFunction.test_getting_function.<locals>.<lambda>r   r   )r&   ra  rW  Zc_doubler   r   )r9   addrZfunctyper|  r3   )r}  r4   test_getting_function  s
    
z.TestImportCythonFunction.test_getting_functionc          	   C   sD   |  t}tdd}W d Q R X d}t|t|j}| | d S )NZ
fakemoduleZfakefunctionzNo module named '?fakemodule'?)r   ImportErrorr&   rematchr   r   ZassertIsNotNone)r9   r   r~  r'  r  r3   r3   r4   test_missing_module  s
    z,TestImportCythonFunction.test_missing_modulec          	   C   s:   |  t}tdd}W d Q R X d}| |t|j d S )Nzscipy.special.cython_specialr  zINo function 'foo' found in __pyx_capi__ of 'scipy.special.cython_special')r   rn   r&   r   r   r   )r9   r   r~  r'  r3   r3   r4   test_missing_function  s    z.TestImportCythonFunction.test_missing_function)	r0   r1   r2   r;  ZskipIfscr  r  r  r3   r3   r3   r4   r{    s   r{  __main__)N)Z
__future__r   r   r   r]   r   r   rl  rH  ra  Zdistutils.versionr   r  Znumpyrg   Znumbar   r;  r   r   r	   r
   r   r   Znumba.targets.registryr   Znumba.compilerr   Zsupportr   r   r   r   r   Znumba.errorsr   Znumba.extendingr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Znumba.typing.templatesr'   r(   r)   r*   r+   version_infor$  Zpdlike_usecaser-   r.   Zscipy__version__r  Zscipy.special.cython_specialZspecialZcython_specialr  objectr/   ZOpaquer5   r>   r=   registerrA   r8   rE   rF   ZOpaqueModelrJ   rK   rL   rN   rM   rO   rR   rW   rS   r[   rU   r_   r`   rc   rf   rh   ri   rz   r|   r   r   r   r   delitemr   getitemr   setitemr   r   r   iaddr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r<  r=  rA  rP  rv  r{  r0   mainr3   r3   r3   r4   <module>   s    L

	
	-			*c   	$ @ 
