o
    8ήc                     @   s:  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Zd dlmZ d dl	Z	d dl
Zd dlmZmZmZmZ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 d dlm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)Z)d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZE zd dlFZFeeFjGdk rdZHn	d dlImJ  mKZH W n eLy   dZHY nw G dd deMZNG dd dejOZPePdZQeN ZRe+SeNdd ZTe.ePejUdd ZVdd ZWe3ePe2jX e5ePdd ZYdd ZZeZd\Z[Z\Z]e5e[d d! Z^dd"d#Z_d$d% Z`e,e_e`Zae-e_e-e_ejbd&d' Zce-e_ejdd(d) Zee@G d*d+ d+e>Zfe-d,ePd-d. Zgd/d0 Zhd1d2 Zid3d4 Zje/ehd5d6 Zke/ehd7d8 Zle/emd9d: Zne/ejod;d< Zpe/ejqd=d> Zre/ejsd?d@ Zte/ejudAdB ZvdCdD ZwdEdF Zxe/ejydGdH ZzdIdJ Z{dKdL Z|dMdN Z}dOdP Z~dQdR Ze1ePdSdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Ze/edpdq Zdrds Zdtdu Zdvdw ZeAeG dxdy dyeBZdzd{ ZG d|d} d}eMZG d~d dejZe3eG dd de2jXZeAeee eedd Ze/ejdd ZG dd de!ZG dd de!ZG dd de!Zdd Ze&G dd de!Zdd ZG dd de!ZG dd de)j!ZG dd de)j!Ze1ePdddiddd Ze1ePdddiddd Ze0ePdddiddd Ze0ePdddiddd ZG dd de!ZG dd de!Zdd Ze&G dd de!ZG dd de!ZG dd de!Zedkre)  dS dS )    N)LooseVersion)njitjit	vectorizeguvectorizeobjmode)typeserrorstypingcompilercgutils)type_inference_stage)
cpu_target)compile_isolated)lower_constant)TestCasecaptured_stdouttemp_directoryoverride_configrun_in_new_process_in_cache_dirskip_if_typeguard)LoweringError)typeof_impltype_callablelower_builtin
lower_castoverloadoverload_attributeoverload_methodmodelsregister_modelboxunboxNativeValue	intrinsic
_Intrinsicregister_jitableget_cython_function_address	is_jittedoverload_classmethod)ConcreteTemplate	signatureinferinfer_globalAbstractTemplate   )IndexSeriesz0.19c                   @      e Zd ZdS )MyDummyN__name__
__module____qualname__ r8   r8   A/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_extending.pyr3   N       r3   c                   @      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   Numbernumba.core.typeconvr=   safe)selfcontexttotyr=   r8   r8   r9   can_convert_toS   s   zMyDummyType.can_convert_toN)r5   r6   r7   rE   r8   r8   r8   r9   r<   R   s    r<   mydummyc                 C      t S N)mydummy_typevalcr8   r8   r9   typeof_mydummy^      rM   c                 C   s   |  |dS )z2
    Implicit conversion from MyDummy to int.
    *   )get_constant)rC   builderfromtyrD   rK   r8   r8   r9   mydummy_to_numberc   s   rS   c                   C   rG   rH   )rF   r8   r8   r8   r9   	get_dummyk      rT   c                 C      t |j S rH   r#   rC   get_dummy_valuetypobjrL   r8   r8   r9   unbox_indexr      r\   c                    sX   G dd dt }G dd dtj}||  t| fdd}t|tj || fS )Nc                   @   r2   )z(base_dummy_type_factory.<locals>.DynTypeNr4   r8   r8   r8   r9   DynType|   r:   r^   c                   @   r2   )z,base_dummy_type_factory.<locals>.DynTypeTypeNr4   r8   r8   r8   r9   DynTypeType   r:   r_   c                        S rH   r8   rJ   dyn_type_typer8   r9   rM      rN   z/base_dummy_type_factory.<locals>.typeof_mydummy)objectr   Opaquer   registerr    r   OpaqueModel)namer^   r_   rM   r8   ra   r9   base_dummy_type_factory{   s   
rh   mydummy2c                 C   rV   rH   rW   rY   r8   r8   r9   unbox_index2   r]   rj   c                 C      t rH   NotImplementedErrorxr8   r8   r9   func1   rU   rp   c                 C   s   ddd}|S )Nc                 S   s(   | d t jfv r
t jS t| t jr| S d S rH   )r   noneint32r>   Floatrn   r8   r8   r9   typer   s
   ztype_func1_.<locals>.typerrH   r8   )rC   rt   r8   r8   r9   type_func1_   s   
ru   c                 C   s   |  |jdS NrO   )rP   return_type)rC   rQ   sigargsr8   r8   r9   func1_nullary   s   rz   c                 C   s   dd }|  ||||S )Nc                 S   s   t d|  S )N   )mathsqrtrn   r8   r8   r9   
func1_impl      zfunc1_unary.<locals>.func1_impl)compile_internal)rC   rQ   rx   ry   r~   r8   r8   r9   func1_unary   s   r   c                   @   s   e Zd ZdZeejegZdS )
PrintDummy
print_itemN)	r5   r6   r7   keyr+   r   rq   rI   casesr8   r8   r8   r9   r      s    r   r   c                 C   s<   |\}|  |}||d}|| || |  S )Nzhello!)get_python_apiunserializeserialize_objectprint_objectdecrefrX   )rC   rQ   rx   ry   ro   pyapistrobjr8   r8   r9   print_dummy   s   


r   c                 C   rk   rH   rl   condro   yr8   r8   r9   where   rU   r   c                 C   s   t | ||S )z8
    Wrap np.where() to allow for keyword arguments
    )npr   r   r8   r8   r9   np_where   s   r   c                 C   s   t | ||dS )N)r   ro   )r   r   r8   r8   r9   
call_where   r   r   c                 C   sV   t | tjr)|j|jkrtdtdd | ||fD r#dd }|S dd }|S dS )z'
    Implement where() for arrays.
    "x and y should have the same dtypec                 s   s    | ]}|j d kV  qdS )CN)layout).0tyr8   r8   r9   	<genexpr>   s    z(overload_where_arrays.<locals>.<genexpr>c           
      S   st   | j }|j |ks|j |krtdt|}| j}|j}|j}|j}t| jD ]}	||	 r1||	 n||	 ||	< q'|S )zM
                Fast implementation for C-contiguous arrays
                %all inputs should have the same shape)shape
ValueErrorr   
empty_likeflatrangesize)
r   ro   r   r   rescfxfyfrfir8   r8   r9   
where_impl   s   
z)overload_where_arrays.<locals>.where_implc                 S   s\   | j }|j |ks|j |krtdt|}t| D ]\}}|r%|| n|| ||< q|S )zI
                Generic implementation for other arrays
                r   )r   r   r   r   ndenumerate)r   ro   r   r   r   idxrL   r8   r8   r9   r      s   
N)r>   r   Arraydtyper	   TypingErrorallr   ro   r   r   r8   r8   r9   overload_where_arrays   s   
r   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
            r8   )r   r   )r   ro   r   scalarrr8   r8   r9   r     s   
z*overload_where_scalars.<locals>.where_implN)r>   r   r   r	   r   r   r8   r8   r9   overload_where_scalars  s   

r   c                 C      t | trdd }|S d S )Nc                 S      dS )N   r8   argr8   r8   r9   len_impl1  rU   z$overload_len_dummy.<locals>.len_implr>   r<   )r   r   r8   r8   r9   overload_len_dummy-  s   
r   c                 C   0   t | ttfrt |ttfrdd }|S d S d S )Nc                 S   r   rv   r8   arg1arg2r8   r8   r9   dummy_add_impl=  rU   z*overload_add_dummy.<locals>.dummy_add_implr>   r<   MyDummyType2)r   r   r   r8   r8   r9   overload_add_dummy7     r   c                 C   *   t | trt |tjrdd }|S d S d S )Nc                 S   s   t d| | d S )Ndelprintr[   r   r8   r8   r9   dummy_delitem_implG     z2overload_dummy_delitem.<locals>.dummy_delitem_implr>   r<   r   Integer)r[   r   r   r8   r8   r9   overload_dummy_delitemC     r   c                 C   r   )Nc                 S   s   |d S )N{   r8   r   r8   r8   r9   dummy_getitem_implQ     z2overload_dummy_getitem.<locals>.dummy_getitem_implr   )r[   r   r   r8   r8   r9   overload_dummy_getitemM  r   r   c                 C   s4   t t| tt|tjt|tjgrdd }|S d S )Nc                 S   s   t || d S rH   r   r[   r   rK   r8   r8   r9   dummy_setitem_impla  r   z2overload_dummy_setitem.<locals>.dummy_setitem_impl)r   r>   r<   r   r   )r[   r   rK   r   r8   r8   r9   overload_dummy_setitemW  s   

r   c                 C      t | |S rH   operatoraddr   r8   r8   r9   call_add_operatorg     r   c                 C      | | S rH   r8   r   r8   r8   r9   call_add_binopk  r   r   c                 C   r   )Nc                 S   r   rv   r8   r   r8   r8   r9   dummy_iadd_implu  rU   z,overload_iadd_dummy.<locals>.dummy_iadd_implr   )r   r   r   r8   r8   r9   overload_iadd_dummyo  r   r   c                 C   r   rH   r   r   r8   r8   r9   call_iadd_operator{  r   r   c                 C   s   | |7 } | S rH   r8   r   r8   r8   r9   call_iadd_binop  s   r   c                 C   s
   | |= d S rH   r8   r   r8   r8   r9   call_delitem     
r   c                 C      | | S rH   r8   r   r8   r8   r9   call_getitem  r   r   c                 C   s   || |< d S rH   r8   r   r8   r8   r9   call_setitem  r   r   lengthc                 C      dd }|S )Nc                 S      t | S rH   lenr   r8   r8   r9   imp  r   z#overload_method_length.<locals>.impr8   )r   r   r8   r8   r9   overload_method_length     r   c                 C      |   S rH   )r   rn   r8   r8   r9   cache_overload_method_usecase  r   r   c                   C      t  S rH   rp   r8   r8   r8   r9   call_func1_nullary     r   c                 C   r   rH   r   rn   r8   r8   r9   call_func1_unary  r   r   c                 C   r   rH   r   rn   r8   r8   r9   len_usecase  r   r   c                 C   s   t |  d S rH   r   rn   r8   r8   r9   print_usecase  r   r   c                 C   r   rH   r8   )ro   r   r8   r8   r9   getitem_usecase  r   r   c                 C   s   t t | S rH   )r   cossinrn   r8   r8   r9   npyufunc_usecase  r   r   c                 C      | j S rH   )_datarn   r8   r8   r9   get_data_usecase  r   r   c                 C   r   rH   )_indexrn   r8   r8   r9   get_index_usecase  r   r  c                 C   r   rH   )is_monotonic_increasingrn   r8   r8   r9   is_monotonic_usecase  r   r  c                 C   s
   t | |S rH   )r1   )dataindexr8   r8   r9   make_series_usecase  r   r  c                 C   s   |  ||S rH   )clip)ro   lohir8   r8   r9   clip_usecase  r   r
  c                   C   rG   rH   r   r8   r8   r8   r9   return_non_boxable  rU   r  c                  C      dd } | S )Nc                   S   rG   rH   r  r8   r8   r8   r9   r     rU   z(overload_return_non_boxable.<locals>.impr8   )r   r8   r8   r9   overload_return_non_boxable  r   r  c                 C   s   t  }|| S rH   )r  arange)szmodr8   r8   r9   non_boxable_ok_usecase  s   
r  c                   C   r   rH   )r  r8   r8   r8   r9   non_boxable_bad_usecase  r   r  c                 C      d S rH   r8   )fr8   r8   r9   mk_func_input  rU   r  c                   @   r;   )MkFuncTypingc                 C   s&   t |d tjs
J ttjg|R  S Nr   )r>   r   MakeFunctionLiteralr+   rq   )rB   ry   kwsr8   r8   r9   generic  s   zMkFuncTyping.genericN)r5   r6   r7   r  r8   r8   r8   r9   r    s    r  c                   C   s   t dd  d S )Nc                 S      | S rH   r8   ar8   r8   r9   <lambda>  s    z#mk_func_test_impl.<locals>.<lambda>)r  r8   r8   r8   r9   mk_func_test_impl  r   r   c                   @   r2   )MyClassNr4   r8   r8   r8   r9   r!    r:   r!  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	CallableTypeRefc                    s.   || _ i | _g | _tt| d| j  d S )Nzcallable_type_ref[{}])instance_typesig_to_impl_keycompiled_templatessuperr"  __init__format)rB   r#  	__class__r8   r9   r'    s   zCallableTypeRef.__init__c              	   C   st   d }|j t|  D ].}z|||}W n	 ty   Y q	w t|di }||v r7|| | j|< | j|  |S q	|S )N_compiled_overloads)
_functionstypeapply	Exceptiongetattrr$  r%  append)rB   rC   ry   r  res_sigtemplatecompiled_ovldsr8   r8   r9   get_call_type  s   zCallableTypeRef.get_call_typec                 C   s   t | j }|dfS )NT)listr$  keys)rB   sigsr8   r8   r9   get_call_signatures  s   z#CallableTypeRef.get_call_signaturesc                 C   s
   | j | S rH   )r$  )rB   rx   r8   r8   r9   get_impl_key  r   zCallableTypeRef.get_impl_key)r5   r6   r7   r'  r5  r9  r:  __classcell__r8   r8   r)  r9   r"    s
    r"  c                   @   r;   )CallableTypeModelc                 C   s   t j| || d S rH   )r   rf   r'  )rB   dmmfe_typer8   r8   r9   r'       zCallableTypeModel.__init__N)r5   r6   r7   r'  r8   r8   r8   r9   r<    s    r<  c                 C   r   rH   )rX   )rC   rQ   r   pyvalr8   r8   r9   constant_callable_typeref%     rA  c                 C   r   )Nc                 S   r   )N   >[= r8   r[   r8   r8   r9   r   1  rN   zoverload_np_exp.<locals>.impr   r[   r   r8   r8   r9   overload_np_exp-  s   
rF  c                   @   s8   e Zd ZdZd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nopythonrO         2@      @)r   r   assertPreciseEqualr   rB   pyfunccfuncr8   r8   r9   
test_func1@  s   z TestLowLevelExtending.test_func1c                 C   sF   t }t|d}| | d t}t|tjf}| |dd d S )Nr8   rO   rJ  rK  )r   r   rL  entry_pointr   r   float64rB   rN  crr8   r8   r9   test_func1_isolatedI  s   
z)TestLowLevelExtending.test_func1_isolatedc                 C   s   |  tt | t d S rH   )assertIs
type_func1ru   assertIsNotNonerB   r8   r8   r9   !test_type_callable_keeps_functionQ  s   z7TestLowLevelExtending.test_type_callable_keeps_functionc                 C   s&   t }t|dtj}| | d d S )Nr8   g      E@)rT   r   r   rR  rL  rQ  rS  r8   r8   r9   test_cast_mydummyU  s   z'TestLowLevelExtending.test_cast_mydummyc                 C   sX   t t}tj}tj}|  |  t|||dd}| t	dd |j
 D  dS )zFmake sure make_function is passed to typer class as a literal
        r8   Nc                 s   s    | ]	}t |tjV  qd S rH   )r>   r   r  )r   r  r8   r8   r9   r   e  s
    

z=TestLowLevelExtending.test_mk_func_literal.<locals>.<genexpr>)r   run_frontendr   r   typing_contexttarget_contextrefreshr   
assertTrueanytypemapvalues)rB   test_ir	typingctx	targetctx
typing_resr8   r8   r9   test_mk_func_literalZ  s   

z*TestLowLevelExtending.test_mk_func_literalN)	r5   r6   r7   __doc__rP  rU  rZ  r[  rh  r8   r8   r8   r9   rG  8  s    	rG  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dd Z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 )N   TrH  )r0   r   r  r   r   rL  )rB   r   rO  r8   r8   r9   test_index_lenr  s   zTestPandasLike.test_index_lenc                 C   sf   t tg d}tddt}| ||dd ||tdd }| |t  | t	|ddg d S )NrO      TrH  r/   rn  ro  )
r0   r   rr   r   r   rL  sliceassertIsInstanceassertEqualr6  rB   r   rO  iir8   r8   r9   test_index_getitemw  s   z!TestPandasLike.test_index_getitemc                 C   sT   t tg d}tddt}||}| |t  | |jtt	|j dS )z7
        Check Numpy ufunc on an Index object.
        rm  TrH  N)
r0   r   rr   r   r   rq  rL  r   r   r   rs  r8   r8   r9   test_index_ufunc  s
    zTestPandasLike.test_index_ufuncc                 C   s:   t tg d}tddt}||}| ||j d S )Nrm  TrH  )r0   r   rr   r   r   rV  r   )rB   r   rO  r  r8   r8   r9   test_index_get_data  s   z"TestPandasLike.test_index_get_datac                 C   s\   t ddt}g ddfg ddfg dffD ]\}}tt|}||}| || qd S )NTrH  )rn  rO      F)rx  rn  rO   )r   r  r0   r   rr   rr  )rB   rO  rc  expectedr   gotr8   r8   r9   test_index_is_monotonic  s   

z&TestPandasLike.test_index_is_monotonicc                 C   sH   t tg d}ttg d|}tddt}| ||d d S )Nr{      rk  g      ?g      @      @TrH  rk  )r0   r   rr   r1   rR  r   r   rL  )rB   r   srO  r8   r8   r9   test_series_len  s   zTestPandasLike.test_series_lenc                 C   s\   t tg d}ttg d|}tddt}||}| |t  | |j	|j	 d S )Nr|  r~  TrH  )
r0   r   rr   r1   rR  r   r  rq  rV  r   )rB   r   r  rO  rz  r8   r8   r9   test_series_get_index  s   z$TestPandasLike.test_series_get_indexc                 C   s   t tg d}ttg d|}tddt}||}| |t | |jt  | 	|jj
|j
 | |jtt|j dS )z8
        Check Numpy ufunc on an Series object.
        rm  r/   r{   rk  TrH  N)r0   r   rr   r1   int64r   r   rq  r   rV  r   rL  _valuesr   r   rB   r   r  rO  ssr8   r8   r9   test_series_ufunc  s    z TestPandasLike.test_series_ufuncc                 C   sv   t tg d}tg d}tddt}|||}| |t | |jt  | 	|jj
|j
 | 	|j| d S )Nrm  r~  TrH  )r0   r   rr   rR  r   r  rq  r1   r   rV  r   r  )rB   r   drO  rz  r8   r8   r9   test_series_constructor  s   
z&TestPandasLike.test_series_constructorc                 C   s   t tg d}ttg d|}tddt}||dd}| |t | |jt  | 	|jj
|j
 | |jtg d d S )Nrm  r~  TrH  皙?      @)r  r  r  )r0   r   rr   r1   rR  r   r
  rq  r   rV  r   rL  r  r  r8   r8   r9   test_series_clip  s   zTestPandasLike.test_series_clipN)r5   r6   r7   ri  rl  ru  rv  rw  r{  r  r  r  r  r  r8   r8   r8   r9   rj  l  s    

rj  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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 )+TestHighLevelExtendingz+
    Test the high-level combined API.
    c                    s   t }tdd|  fdd}|dddd |ddd |tg dtg d	tg d
 tj} tg tg tg  W d   n1 sRw   Y  	dt
|j dS )z>
        Test implementing a function with @overload.
        TrH  c                     s,   t | i |} | i |}|| d S rH   )r   rL  )ry   kwargsry  rz  rO  rB   r8   r9   check  s   z0TestHighLevelExtending.test_where.<locals>.checkrk  rn  )ro   r   r   )TFTr  )r}  rx  rx  Nr   )r   r   r   bool_rr   assertRaisesr	   r   r  assertInstr	exception)rB   rN  r  raisesr8   r  r9   
test_where  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.
        TrH  r   r}  rx  r{   N)r   r   rL  r3   rB   rO  r8   r8   r9   test_len  s   zTestHighLevelExtending.test_lenc                 C   sV   t ddt}t  |t  | tj d W d   dS 1 s$w   Y  dS )zP
        Test re-implementing print() for a custom type with @overload.
        TrH  zhello!
N)r   r   r   r3   rr  sysstdoutgetvaluer  r8   r8   r9   
test_print  s
   
"z!TestHighLevelExtending.test_printc                 C   T   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.
        TrH  r/   r{   rk  rO   T   N)r   r   rL  MyDummy2r3   rM  r8   r8   r9   test_add_operator  
   z(TestHighLevelExtending.test_add_operatorc                 C   r  	zY
        Test re-implementing '+' for a custom type via @overload(operator.add).
        TrH  r/   r{   rk  rO   r  N)r   r   rL  r  r3   rM  r8   r8   r9   test_add_binop  r  z%TestHighLevelExtending.test_add_binopc                 C   r  r  )r   r   rL  r  r3   rM  r8   r8   r9   test_iadd_operator  r  z)TestHighLevelExtending.test_iadd_operatorc                 C   r  r  )r   r   rL  r  r3   rM  r8   r8   r9   test_iadd_binop(  r  z&TestHighLevelExtending.test_iadd_binopc                 C   s   t }tdd|}t }d }t $}z||d W n ty- } z|}W Y d }~nd }~ww W d    n1 s8w   Y  |d urC|| | d d S )NTrH  A  zdel hello! 321
)r   r   r3   r   r/  rr  r  rB   rN  rO  r[   eoutexcr8   r8   r9   test_delitem6  s    z#TestHighLevelExtending.test_delitemc                 C   s*   t }tdd|}| |t dd d S )NTrH  r  i  )r   r   rL  r3   rM  r8   r8   r9   test_getitemF  s   z#TestHighLevelExtending.test_getitemc                 C   s   t }tdd|}t }d }t %}z||dd W n ty. } z|}W Y d }~nd }~ww W d    n1 s9w   Y  |d urD|| | d d S )NTrH  r  r   z321 123
)r   r   r3   r   r/  rr  r  r  r8   r8   r9   test_setitemK  s    z#TestHighLevelExtending.test_setitemc           	      C   s   t ddt}d}||}t|}tj|| t ddt}| t}|  W d   n1 s2w   Y  t|j	}d}| 
|| dS )zW
        Test overloading whose return value cannot be represented in CPython.
        TrH  
   Nzcannot convert native Module)r   r  r   testingassert_equalr  r  	TypeErrorr  r  r  )	rB   ok_cfuncnrz  expect	bad_cfuncr  errmsg	expectmsgr8   r8   r9   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   n1 s&w   Y  t|j}| || | d| | d| | d| d'dd}|  tj}||dd	d
d W d   n1 sgw   Y  t|j}| || | d| | d| | d| d'dd}|  tj}||dd	d
d W d   n1 sw   Y  t|j}| || | d| | d|v  | d| | d| ddlm}m	}	 |  tj}||dd	d
d W d   n1 sw   Y  t|j}| || | d| | d|v  | d| |  tj}||	dd	d
d W d   n	1 s1w   Y  t|j}| || | d| | d|v  | d| | d| d'dd}
|  tj}||
dd	d
d W d   n	1 szw   Y  t|j}| || | d| | d|v  | d| | d| d'dd }|  tj}||dd	d
d W d   n	1 sw   Y  t|j}| || | d| | d|v  | d!| d)d"d#}|  tj}||dd	d
d W d   n	1 sw   Y  t|j}| || | d| | d$| d%d& }|  tj}||dd	d
d W d   n	1 sAw   Y  t|j}| || | d| | 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   r  rH   r8   r  brL   kwr8   r8   r9   
myoverloadu  rU   zjTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>.myoverloadc                    r`   rH   r8   r  )implr8   r9   _myoverload_implx  rN   zpTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>._myoverload_implTrH  c                    s    | |||d d S )Nr  r8   )r  r  rL   r  r  r8   r9   foo|  r?  zcTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>.foorH   r   r   )r  r  r  r8   )r  r  r9   gen_olt  s   
zVTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_olz-Typing and implementation arguments differ in   c                 S      | dkrdS dS Nr  r/   r8   r  r8   r8   r9   impl1     zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl1r/   r{   rk  r}  zkeyword argument default valuesz<Parameter "kw=12">z<Parameter "kw=None">c                 S   r  r  r8   )r  r  rL   kwargr8   r8   r9   impl2  r  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 r  r  )zr  rL   r  r8   r8   r9   impl3  r  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   r  r  r8   )r  r  rL   r  r  r  r8   r8   r9   impl6  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl6z<Parameter "d">z<Parameter "e">c                 S   r  r  r8   )r  r  r  r8   r8   r9   impl7  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl7z<Parameter "c">c                 S   r  r  r8   )r  r  rL   r  extra_kwargr8   r8   r9   impl8  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl8z<Parameter "extra_kwarg=None">c                 S   r  r  r8   )r  r  rL   r8   r8   r9   impl9  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl9rH   )r  )NN)
r  r	   r   r  r  r  assertFalseoverload_usecasesr  r  )rB   r  sentinelr  r  msgr  r  r  r  r  r  r  r  r8   r8   r9   /test_typing_vs_impl_signature_mismatch_handlingn  s   















zFTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handlingc                    s   ddd ddl m} t | tdd fdd	}| tj}|dd
 W d   n1 s2w   Y  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   r  rH   r8   r  r  r8   r8   r9   r    rU   ziTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_positional.<locals>.myoverloadr/   )var_positional_implTrH  c                    s    | |dddS )N	      r  r8   r  r  r  r8   r9   r       zbTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_positional.<locals>.foorx  z)VAR_POSITIONAL (e.g. *args) argument kindz-offending argument name is '*star_args_token'rH   )
r  r  r   r   r  r	   r   r  r  r  )rB   r  r  r  r  r8   r  r9   >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	   n1 s)w   Y  t|j}| d
| | d| ddd}|  tj}||dd W d	   n1 s\w   Y  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   r  rH   r8   r  r8   r8   r9   r    rU   zvTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_ol.<locals>.myoverloadstrictTrH  c                    s    | ddS )Nr  r  r8   r  r  r8   r9   r  "     zoTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_ol.<locals>.foorH   r  )r  r  r  r8   r  r9   r    s
   
zbTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_olc                 [      ddd}|S )Nr  c                 S   r  rH   r8   r  r8   r8   r9   r  *  rU   zmTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol1.<locals>.implr  r8   )r  r  r  r8   r8   r9   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      dd }|S )Nc                 [   r  rH   r8   )r  r  r8   r8   r9   r  8  rU   zmTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol2.<locals>.implr8   )r  r  r  r8   r8   r9   ol27  s   z_TestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol2)T)r   )r  r	   r   r  r  r  )rB   r  r  r  r  r  r8   r8   r9   ;test_typing_vs_impl_signature_mismatch_handling_var_keyword  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   r  )Nr  c                 S      |S rH   r8   )r   a_kwargr8   r8   r9   r  G  rU   zQTestHighLevelExtending.test_overload_method_kwargs.<locals>.fooimpl.<locals>.implr  r8   )r   r  r  r8   r8   r9   fooimplE  s   
zCTestHighLevelExtending.test_overload_method_kwargs.<locals>.fooimplc                 S   s   |   |  d| j ddfS )N      )r  r  Ar8   r8   r9   barL  s   z?TestHighLevelExtending.test_overload_method_kwargs.<locals>.barrx  )r  r  r  r  )r   r   r   r   r   r  rr  )rB   r  r  Zr8   r8   r9   test_overload_method_kwargsC  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 d S )Nc                 S   r  rH   r8   )r   rK   r8   r8   r9   r  ]  rU   zXTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.litfoo.<locals>.impl)r>   r   r   Literal)r   rK   r  r8   r8   r9   r  V  s   zJTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.litfooc                 S   s
   |  dS N  )r  r  r8   r8   r9   r  b     
zGTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.barr/   r  )r   r   r   r   r   zerosrr  )rB   r  r  r  r8   r8   r9   #test_overload_method_literal_unpackT  s   



z:TestHighLevelExtending.test_overload_method_literal_unpackc                 C   s   t dd }| | d d S )Nc                   S   s
   t tS rH   )r   exprF   r8   r8   r8   r9   testn  r  z8TestHighLevelExtending.test_overload_ufunc.<locals>.testrC  )r   rr  )rB   r  r8   r8   r9   test_overload_ufuncj  s   
z*TestHighLevelExtending.test_overload_ufuncc                 C   s   t tddd }tdd }t }| ||ddd | ||ddd	d
 | ||ddd	dd tdd }| ||d | ||dddd | ||dddd | ||dddd d S )Nmethod_starargc                 W   s   dd }|S )Nc                 W   s
   |||fS rH   r8   )r[   rK   val2ry   r8   r8   r9   getw  r   z\TestHighLevelExtending.test_overload_method_stararg.<locals>._ov_method_stararg.<locals>.getr8   )r[   rK   r  ry   r  r8   r8   r9   _ov_method_starargu  r   zOTestHighLevelExtending.test_overload_method_stararg.<locals>._ov_method_starargc                 W   s
   | j | S rH   r  )r[   ry   r8   r8   r9   r  |  s   
z@TestHighLevelExtending.test_overload_method_stararg.<locals>.foor/   r{   r/   r{   r8   rk  r/   r{   rk  r}  r/   r{   rk  r}  c                 S   s(   |  dd|  ddd|  ddddfS )Nr/   r{   rk  r}  r  rD  r8   r8   r9   r    s   
z@TestHighLevelExtending.test_overload_method_stararg.<locals>.bar)r  r	  r  r
  )r/   r{   )r
  r  )r/   r{   )r  rk  )r}  rx  )r/   r{   )r  r   r<   r   r3   rr  )rB   r  r  r[   r  r8   r8   r9   test_overload_method_starargt  s,   


z3TestHighLevelExtending.test_overload_method_starargc                    s   G dd dt j t ddd }t fdd}d}| ||t| td	d
 }| tj	}|| W d    n1 sBw   Y  | 
dt|j d S )Nc                   @   r2   )zATestHighLevelExtending.test_overload_classmethod.<locals>.MyArrayNr4   r8   r8   r8   r9   MyArray  r:   r  array_allocc                 S   r  )Nc                 S   s   t |}|S rH   r   r  )clsnitemsr   r8   r8   r9   r    s   
zVTestHighLevelExtending.test_overload_classmethod.<locals>.ol_array_alloc.<locals>.implr8   )r  r  r  r8   r8   r9   ol_array_alloc  r   zHTestHighLevelExtending.test_overload_classmethod.<locals>.ol_array_allocc                    s
     | S rH   )r  r  r  r8   r9   r    r  z=TestHighLevelExtending.test_overload_classmethod.<locals>.foor   c                 S   s   t j| S rH   )r   r   r  r  r8   r8   r9   no_classmethod_in_base  r  zPTestHighLevelExtending.test_overload_classmethod.<locals>.no_classmethod_in_basez"Unknown attribute 'array_alloc' of)r   r   r)   r   rL  r   r  r  r	   r   r  r  r  )rB   r  r  r  r  r  r8   r  r9   test_overload_classmethod  s    


z0TestHighLevelExtending.test_overload_classmethodc                 C   s\   t tdd }t tdd }tdd }d}d|d	  d
|d  f}| || | d S )Nc                 S      t | tjrdd }|S d S )Nc                 S      d|  S )N     @E@r8   rn   r8   r8   r9   r    r   zeTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld1.<locals>.impl)r>   r   r   ro   r  r8   r8   r9   callable_type_call_ovld1  s   zWTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld1c                 S   r  )Nc                 S   r  )N42.5r8   rn   r8   r8   r9   r    r   zeTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld2.<locals>.impl)r>   r   UnicodeTyper  r8   r8   r9   callable_type_call_ovld2  s   zWTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld2c                 S   s   t | t |fS rH   )r!  r  r8   r8   r9   r    r  zBTestHighLevelExtending.test_overload_callable_typeref.<locals>.foo)r}  4r  r   r  r/   )r   r"  r   rL  )rB   r  r!  r  ry   ry  r8   r8   r9   test_overload_callable_typeref  s   


z5TestHighLevelExtending.test_overload_callable_typerefN)r5   r6   r7   ri  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r8   r8   r8   r9   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)_cache_hits
signaturesAssertionError_cache_misses)rO  
expect_hitexpect_misseshitmissr8   r8   r9   _assert_cache_stats  s   r,  c                   @   s    e Zd ZdZdd Zdd ZdS )TestOverloadMethodCachingFc                 C   sH   t | jj| _td| j |   W d    d S 1 sw   Y  d S )N	CACHE_DIR)r   r*  r5   
_cache_dirr   run_caching_overload_methodrY  r8   r8   r9   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 zt
d}W n ty@   t
}Y nw | }|jt|| jfd	}|  |t  |  | |jd |jdd
}| |d d S )NTrI  cacher   r   r/   c                 S   s"   g | ]}| d rd|v r|qS )declarer   )
startswith)r   lnr8   r8   r9   
<listcomp>  s    zITestOverloadMethodCaching.run_caching_overload_method.<locals>.<listcomp>spawn)targetry   )timeout)r   r   rL  r3   r,  inspect_llvmrI   
splitlinesrr  r   multiprocessingget_contextAttributeErrorQueueProcessr0  r/  startputjoinexitcoder  )rB   rO  llvmirdeclsctxqpr   r8   r8   r9   r0    s.   
z5TestOverloadMethodCaching.run_caching_overload_methodN)r5   r6   r7   _numba_parallel_test_r1  r0  r8   r8   r8   r9   r-    s    r-  c                 C   sf   t d|$ |  }tdddt}||}| | t|dd W d   dS 1 s,w   Y  dS )zH
    Used by TestOverloadMethodCaching.test_caching_overload_method
    r.  Tr2  r/   r   N)r   r  r   r   rC  r,  )rI  	cache_dirr   rO  r   r8   r8   r9   r0    s   
"r0  c                   @   4   e Zd Zd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   n1 s<w   Y  | 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      t t j}dd }||fS )Nc                 S   r  rH   r8   rC   rQ   r+   ry   r8   r8   r9   codegen#  rU   zBTestIntrinsic.test_void_return.<locals>.void_func.<locals>.codegenr   voidrr   re  r  rx   rQ  r8   r8   r9   	void_func  s   z1TestIntrinsic.test_void_return.<locals>.void_funcc                 S   s   t t j}dd }||fS )Nc                 S   r  rH   r8   rP  r8   r8   r9   rQ  -  rU   zFTestIntrinsic.test_void_return.<locals>.non_void_func.<locals>.codegen)r   rr   rT  r8   r8   r9   non_void_func)  s   z5TestIntrinsic.test_void_return.<locals>.non_void_funcTrH  c                          d dS Nr/   r   r8   r8   )rU  r8   r9   call_void_func2     z6TestIntrinsic.test_void_return.<locals>.call_void_funcc                      rW  rX  r8   r8   )rV  r8   r9   call_non_void_func7  rZ  z:TestIntrinsic.test_void_return.<locals>.call_non_void_funcr   Nznon-void function returns None)r$   r   rr  r  r   r  r  r  )rB   rY  r[  r  r8   )rV  rU  r9   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   n1 s^w   Y  |
  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J t fdd}|S )Nc                    s8    | tj t|tjr tj}dd }||fS d S )Nc                 S   s"   |\}|j }| |}|||S rH   )rw   get_value_typeinttoptr)rC   rQ   r+   ry   srcrtypellrtyper8   r8   r9   rQ  T  s   
z_TestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_caster.<locals>.unsafe_cast.<locals>.codegen)rq  r
   Contextr>   r   r   uintp)re  rc  rx   rQ  )result_typerB   r8   r9   unsafe_castM  s   
zNTestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_caster.<locals>.unsafe_cast)r>   r   CPointerr$   )rh  ri  rY  )rh  r9   unsafe_casterJ  s   z9TestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_casterc                 S   s   t d)Nznot callable from pythonrl   rc  r8   r8   r9   unsafe_get_ctypes_pointer`  r   zETestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_get_ctypes_pointerFr  c                    s0   t | tjrt| j  fdd}|S d S )Nc                    s    | j jdS )Nrl  )ctypesr  )r   ri  r8   r9   
array_implh  r   zdTestIntrinsic.test_ll_pointer_cast.<locals>.array_impl_unsafe_get_ctypes_pointer.<locals>.array_impl)r>   r   r   rj  r   )arrtyperp  )rk  ro  r9   $array_impl_unsafe_get_ctypes_pointerc  s
   zPTestIntrinsic.test_ll_pointer_cast.<locals>.array_impl_unsafe_get_ctypes_pointerc                 S   s   t |D ]}t| |  qd S rH   )r   r   )ptrr  r   r8   r8   r9   my_c_fun_rawn  s   z8TestIntrinsic.test_ll_pointer_cast.<locals>.my_c_fun_rawNTrH  c                    s   | } || j  d S rH   )r   )r   rs  )my_c_funrm  r8   r9   r  w  s   z/TestIntrinsic.test_ll_pointer_cast.<locals>.foor  )r   )rn  r]  r^  r_  r`  r   r   r   r  float32r   r  r<  closer6  mapr  rr  )rB   r]  r^  r_  r`  rr  rt  	prototyper  r   bufrz  r  r8   )ru  rB   rk  rm  r9   test_ll_pointer_castC  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      |d S r  r8   rP  r8   r8   r9   rQ    r   zCTestIntrinsic.test_serialization.<locals>.identity.<locals>.codegenr8   )rC   ro   rQ  rx   r8   r8   r9   identity  s   z2TestIntrinsic.test_serialization.<locals>.identityTrH  c                        | S rH   r8   rn   r}  r8   r9   r    rB  z-TestIntrinsic.test_serialization.<locals>.foor/   N)
r$   r   rr  r%   _memor   pickledumpsloadsrV  )rB   r  memo	memo_sizeserialized_foofoo_rebuiltserialized_identityidentity_rebuiltr8   r  r9   test_serialization  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   r|  r  r8   rP  r8   r8   r9   rQ    r   zATestIntrinsic.test_deserialization.<locals>.defn.<locals>.codegenr8   )rC   ro   rQ  r8   r8   r9   defn  s   z0TestIntrinsic.test_deserialization.<locals>.defnr  r/   N)r%   r  r   rV  _defnr  r  rr  _recentclearr  assertIsNot)rB   r  r  r  originalpickledrebuiltsecondr8   r8   r9   test_deserialization  s"   




z"TestIntrinsic.test_deserializationc                 C   s`   t dtfdd}| d|j | d|j | d|j | dti|j | d|j d S )Nr  c                 S   rO  )void_func docstringc                 S   r  rH   r8   rP  r8   r8   r9   rQ    rU   z@TestIntrinsic.test_docstring.<locals>.void_func.<locals>.codegenrR  rT  r8   r8   r9   rU    s   z/TestIntrinsic.test_docstring.<locals>.void_funcznumba.tests.test_extendingrU  r  )	r$   intrr  r6   r5   r7   assertDictEqual__annotations__ri  )rB   rU  r8   r8   r9   test_docstring  s   
zTestIntrinsic.test_docstringN)r5   r6   r7   r\  r{  r  r  r  r8   r8   r8   r9   rN    s    *B.(rN  c                   @      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   r   rH   r8   ro   r   r8   r8   r9   r    rB  z.TestRegisterJitable.test_no_flags.<locals>.fooc                    s
    | |S rH   r8   r  r  r8   r9   r    r   z.TestRegisterJitable.test_no_flags.<locals>.barTrH  r/   r{   )r&   r   rr  )rB   r  cbarr  rz  r8   r  r9   test_no_flags  s   


z!TestRegisterJitable.test_no_flagsc                    s   t dddd   fdd}| |d g d td	d
|}| tj}|d W d    n1 s7w   Y  d}| |t|j	 d S )NF)_nrtc                 S   s
   t | S rH   r  r  r8   r8   r9   r     r  z2TestRegisterJitable.test_flags_no_nrt.<locals>.fooc                    r~  rH   r8   r  r  r8   r9   r    r   z2TestRegisterJitable.test_flags_no_nrt.<locals>.barrk  )r   r/   r{   TrH  r{   COnly accept returning of array passed into the function as argument)
r&   rr  tolistr   r  r	   r   r  r  r  )rB   r  r  r  r  r8   r  r9   test_flags_no_nrt  s   

z%TestRegisterJitable.test_flags_no_nrtN)r5   r6   r7   r  r  r8   r8   r8   r9   r    s    r  c                   @   sD   e Zd Zeedu ddd Zdd Zeedu 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 )	Nscipy.special.cython_specialj0TrH  c                    r~  rH   r8   rn   _j0r8   r9   r    s    z@TestImportCythonFunction.test_getting_function.<locals>.<lambda>r   r/   )r'   rn  r]  c_doubler   rr  )rB   addrfunctyper  r8   r  r9   test_getting_function  s   z.TestImportCythonFunction.test_getting_functionc                 C   sX   |  t}tdd W d    n1 sw   Y  d}t|t|j}| | d S )N
fakemodulefakefunctionzNo module named '?fakemodule'?)r  ImportErrorr'   rematchr  r  rX  )rB   r  r  r  r8   r8   r9   test_missing_module  s   z,TestImportCythonFunction.test_missing_modulec                 C   sN   |  t}tdd W d    n1 sw   Y  d}| |t|j d S )Nr  r  zINo function 'foo' found in __pyx_capi__ of 'scipy.special.cython_special')r  r   r'   rr  r  r  )rB   r  r  r8   r8   r9   test_missing_function&  s   z.TestImportCythonFunction.test_missing_function)	r5   r6   r7   unittestskipIfscr  r  r  r8   r8   r8   r9   r    s    
	r  method_jit_option_check_nrtr  Tjit_optionsc                 C   r   )Nc                 S   
   t dS Nr  r  rD  r8   r8   r9   r   7  r   z+ov_method_jit_option_check_nrt.<locals>.impr8   rE  r8   r8   r9   ov_method_jit_option_check_nrt3     r  method_jit_option_check_no_nrtFc                 C   r   )Nc                 S   r  r  r  rD  r8   r8   r9   r   A  r   z.ov_method_jit_option_check_no_nrt.<locals>.impr8   rE  r8   r8   r9   !ov_method_jit_option_check_no_nrt=  r  r  attr_jit_option_check_nrtc                 C   r   )Nc                 S   r  r  r  rD  r8   r8   r9   r   K  r   z)ov_attr_jit_option_check_nrt.<locals>.impr8   rE  r8   r8   r9   ov_attr_jit_option_check_nrtG  r  r  attr_jit_option_check_no_nrtc                 C   r   )Nc                 S   r  r  r  rD  r8   r8   r9   r   U  r   z,ov_attr_jit_option_check_no_nrt.<locals>.impr8   rE  r8   r8   r9   ov_attr_jit_option_check_no_nrtQ  r  r  c                   @   rM  )TestJitOptionsNoNRTc                 O   sT   d}|  tj}||i | W d    n1 sw   Y  | |t|j d S )Nr  )r  r	   r   r  r  r  )rB   funcry   r  r  r  r8   r8   r9   check_error_no_nrt^  s   z&TestJitOptionsNoNRT.check_error_no_nrtc                    sZ   dd  t  d|iddd }t fdd}|r&| | td	 d S | | d S )
Nc                   S   r  r  r  r8   r8   r8   r9   dummyi  r   z8TestJitOptionsNoNRT.no_nrt_overload_check.<locals>.dummyr  r  c                  S   r  )Nc                   S   r  r  r  r8   r8   r8   r9   r  n  r   zJTestJitOptionsNoNRT.no_nrt_overload_check.<locals>.ov_dummy.<locals>.dummyr8   r  r8   r8   r9   ov_dummyl  r   z;TestJitOptionsNoNRT.no_nrt_overload_check.<locals>.ov_dummyc                      s     S rH   r8   r8   r  r8   r9   r  s     z6TestJitOptionsNoNRT.no_nrt_overload_check.<locals>.foor  )r   r   rL  r   r  r  )rB   flagr  r  r8   r  r9   no_nrt_overload_checkh  s   
z)TestJitOptionsNoNRT.no_nrt_overload_checkc                 C   s   |  d |  d d S )NTF)r  rY  r8   r8   r9   test_overload_no_nrt|  s   
z(TestJitOptionsNoNRT.test_overload_no_nrtc                 C   >   t dd }| |ttd t dd }| |t d S )Nc                 S   r   rH   )r  rn   r8   r8   r9   udt  rB  z<TestJitOptionsNoNRT.test_overload_method_no_nrt.<locals>.udtr  c                 S   r   rH   )r  rn   r8   r8   r9   r    rB  r   rL  rF   r   r  r  rB   r  r8   r8   r9   test_overload_method_no_nrt     

z/TestJitOptionsNoNRT.test_overload_method_no_nrtc                 C   r  )Nc                 S   r   rH   )r  rn   r8   r8   r9   r    r  z?TestJitOptionsNoNRT.test_overload_attribute_no_nrt.<locals>.udtr  c                 S   r   rH   )r  rn   r8   r8   r9   r    r  r  r  r8   r8   r9   test_overload_attribute_no_nrt  r  z2TestJitOptionsNoNRT.test_overload_attribute_no_nrtN)r5   r6   r7   r  r  r  r  r  r8   r8   r8   r9   r  [  s    
r  c                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )TestBoxingCallingJITc                    s0   t    td}|\| _| _| _|  | _d S )Nri   )r&  setUprh   r_   r^   rb   dyn_type)rB   manyr)  r8   r9   r    s   
zTestBoxingCallingJIT.setUpc                    sl   dd t  fddt| jfdd}t| jdd }td	d
 }|| j}| |   d S )Nr  r   c                        fdd}t ||}||fS )Nc                       |\}| || S rH   r   r-  rC   rQ   rx   ry   rK   magic_offsetr8   r9   r       zKTestBoxingCallingJIT.test_unboxer_basic.<locals>.my_intrinsic.<locals>.implr+   re  rK   r  rx   r  r8   r9   my_intrinsic     
z=TestBoxingCallingJIT.test_unboxer_basic.<locals>.my_intrinsicc                    sL   fdd}|j tj g}ttjtj}|j|||\}}t||dS )Nc                    r~  rH   r8   rn   r  r8   r9   bridge  s   zHTestBoxingCallingJIT.test_unboxer_basic.<locals>.unboxer.<locals>.bridgeis_error	rC   rP   r   intpr+   voidptrr   call_jit_coder#   rZ   r[   rL   r  ry   rx   r  r   magic_tokenr  r8   r9   unboxer  s
   z8TestBoxingCallingJIT.test_unboxer_basic.<locals>.unboxerc                 S      |j |tj}|j|S rH   rQ   ptrtointr   intp_tr   long_from_ssize_trZ   rK   rL   r   r8   r8   r9   boxer     z6TestBoxingCallingJIT.test_unboxer_basic.<locals>.boxerc                 S   r  rH   r8   rn   r8   r8   r9   passthru  rN   z9TestBoxingCallingJIT.test_unboxer_basic.<locals>.passthrur$   r"   r_   r!   r   r  rr  )rB   r  r  r  r  r8   r  r  r  r9   test_unboxer_basic  s   	


z'TestBoxingCallingJIT.test_unboxer_basicc                 C   z   t | jdd }t| jdd }tdd }| t}|| j W d    n1 s-w   Y  | dt|j	 d S )Nc                 S   sH   dd }|j tjdg}ttjtj}|j|||\}}t||dS )Nc                 S      | dkrt d| S )Nr   cannot be x > 0r   rn   r8   r8   r9   r       zHTestBoxingCallingJIT.test_unboxer_raise.<locals>.unboxer.<locals>.bridger/   r  r  r  r8   r8   r9   r    s
   z8TestBoxingCallingJIT.test_unboxer_raise.<locals>.unboxerc                 S   r  rH   r  r  r8   r8   r9   r    r  z6TestBoxingCallingJIT.test_unboxer_raise.<locals>.boxerc                 S   r  rH   r8   rn   r8   r8   r9   r    rN   z9TestBoxingCallingJIT.test_unboxer_raise.<locals>.passthrur  
r"   r_   r!   r   r  r   r  r  r  r  rB   r  r  r  r  r8   r8   r9   test_unboxer_raise  s   



z'TestBoxingCallingJIT.test_unboxer_raisec                    sl   dd t  fddt| jdd }t| jfdd}td	d
 }|| j}| |   d S )Nr  i8  c                    r  )Nc                    r  rH   r  r  r  r8   r9   r    r  zCTestBoxingCallingJIT.test_boxer.<locals>.my_intrinsic.<locals>.implr  r  r  r8   r9   r    r  z5TestBoxingCallingJIT.test_boxer.<locals>.my_intrinsicc                 S   rV   rH   rW   rY   r8   r8   r9   r    r]   z0TestBoxingCallingJIT.test_boxer.<locals>.unboxerc                    sL   fdd}|j tj g}ttjtj}|j|||\}}|j|S )Nc                    r~  rH   r8   rn   r  r8   r9   r    r   z>TestBoxingCallingJIT.test_boxer.<locals>.boxer.<locals>.bridge)rC   rP   r   r  r+   r   r  r  )rZ   rK   rL   r  ry   rx   r  r   r  r8   r9   r    s
   z.TestBoxingCallingJIT.test_boxer.<locals>.boxerc                 S   r  rH   r8   rn   r8   r8   r9   r  	  rN   z1TestBoxingCallingJIT.test_boxer.<locals>.passthrur  )rB   r  r  r  rr8   r  r9   
test_boxer  s   	



zTestBoxingCallingJIT.test_boxerc                 C   r  )Nc                 S   rV   rH   rW   rY   r8   r8   r9   r    r]   z6TestBoxingCallingJIT.test_boxer_raise.<locals>.unboxerc           
      S   s   dd }|j tjdg}ttjtj}|j|||\}}tj|j	|jj
dd}|j	|j	| |j|}	|j	|	| W d    n1 sKw   Y  |j	|S )Nc                 S   r  )Nr   cannot do x > 0r  rn   r8   r8   r9   r    r   zDTestBoxingCallingJIT.test_boxer_raise.<locals>.boxer.<locals>.bridger/   T)zfill)rC   rP   r   r  r+   r   r  r   alloca_oncerQ   pyobjif_thennot_r  storeload)
rZ   rK   rL   r  ry   rx   r  r   retvalr[   r8   r8   r9   r    s   z4TestBoxingCallingJIT.test_boxer_raise.<locals>.boxerc                 S   r  rH   r8   rn   r8   r8   r9   r  '  rN   z7TestBoxingCallingJIT.test_boxer_raise.<locals>.passthrur  r  r  r8   r8   r9   test_boxer_raise  s   



z%TestBoxingCallingJIT.test_boxer_raise)	r5   r6   r7   r  r  r  r  r  r;  r8   r8   r)  r9   r    s    *%r  c                 C   r  rH   r8   rn   r8   r8   r9   with_objmode_cache_ov_example2  s   r  c                   @   sX   e Zd ZdZdZdd Zdd Zdd Zed	d
 Z	edd Z
edd Zdd ZdS )TestCachingOverloadObjmodezTTest caching of the use of overload implementations that use
    `with objmode`
    Fc                 C   s   t dtj d S )Nerror)warningssimplefilterr	   NumbaWarningrY  r8   r8   r9   r  ?  s   z TestCachingOverloadObjmode.setUpc                 C   s   t   d S rH   )r  resetwarningsrY  r8   r8   r9   tearDownB  r   z#TestCachingOverloadObjmode.tearDownc                    s   t | jj}td|F dd fdd tt fdd}tdd	d
d }d}|d}| || tdd	|j}|d}| || W d    d S 1 sTw   Y  d S )Nr.  c                 S   s   t | |  }t j|S rH   )r   r  linalgnorm)ro   r   r8   r8   r9   realworkI  s   zJTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>.realworkc                    r~  rH   r8   rn   )r  r8   r9   python_codeN  rB  zMTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>.python_codec                    s    fdd}|S )Nc                    s8   t dd  | }W d    |S 1 sw   Y  |S NrR  )r   r   r  r  r8   r9   r  T  s   

zqTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>._ov_with_objmode_cache_ov_example.<locals>.implr8   r  r  r8   r9   !_ov_with_objmode_cache_ov_exampleR  s   zcTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>._ov_with_objmode_cache_ov_exampleTr3  c                 S   r   rH   )r  rn   r8   r8   r9   testcase[  rB  zJTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>.testcaser   )	r   r*  r5   r   r   r  r   rr  py_func)rB   rL  r  r!  r  rz  testcase_cachedr8   )r  r  r9   test_caching_overload_objmodeE  s   
"z8TestCachingOverloadObjmode.test_caching_overload_objmodec                    s\   dd dd  t  fdd}tdd fd	d
}| }| }||kr,td|S )Nc                 S      t | | S rH   r   sumr  r8   r8   r9   do_thisi  r   zGTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.do_thisc                 S   r%  rH   r&  r  r8   r8   r9   do_somethingl  r   zLTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.do_somethingc                    s    fdd}|S )Nc                    s:   t dd  | |}W d    |S 1 sw   Y  |S r  r  )r  r  r   r(  r8   r9   _do_something_implq  s   
zqTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.overload_do_something.<locals>._do_something_implr8   )r  r  r+  r*  r8   r9   overload_do_somethingo  s   zUTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.overload_do_somethingTr   c                     s   t d} t d} | |S )Nr  r  r  )r)  r8   r9   test_cachingw  s   


zLTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.test_cachingzincorrect result)r   r   r"  r&  )r  r,  r-  rz  r  r8   )r)  r(  r9   check_objmode_cache_ndarrayg  s   z6TestCachingOverloadObjmode.check_objmode_cache_ndarrayc                 C   s   |    d S rH   )r.  )r  r8   r8   r9   *populate_objmode_cache_ndarray_check_cache  r  zETestCachingOverloadObjmode.populate_objmode_cache_ndarray_check_cachec                 C   s<   |   }t|jjdkrtdt|jjdkrtdd S )Nr   zunexpected cache misszunexpected missing cache hit)r.  r   statscache_missesr&  
cache_hits)r  dispr8   r8   r9   'check_objmode_cache_ndarray_check_cache  s   zBTestCachingOverloadObjmode.check_objmode_cache_ndarray_check_cachec                 C   sb   t | jj}td| t| j| t| j|}W d    n1 s"w   Y  | |d d d S )Nr.  rE  r   )r   r*  r5   r   r   r/  r4  rr  )rB   rL  r   r8   r8   r9    test_check_objmode_cache_ndarray  s   	z;TestCachingOverloadObjmode.test_check_objmode_cache_ndarrayN)r5   r6   r7   ri  rK  r  r  r$  classmethodr.  r/  r4  r5  r8   r8   r8   r9   r  8  s    "


r  c                   @   r  )TestMiscc                 C   sn   dd }|  t| | tt| |  tt| |  ttdd| |  ttdd| d S )Nc                 S   r  rH   r8   rn   r8   r8   r9   r    rU   z$TestMisc.test_is_jitted.<locals>.fooT)parallelzvoid(float64[:])z(m))r  r(   r`  r   r   r   )rB   r  r8   r8   r9   test_is_jitted  s   zTestMisc.test_is_jittedc                 C   s@   t dd }t dd }| | |  | | |  d S )Nc                   S      t jdddjS )Nr     )r   
fill_valuer   fullr   r8   r8   r8   r9   standard_order  r  z?TestMisc.test_overload_glue_arg_binding.<locals>.standard_orderc                   S   r:  )Nr;  r   )r<  r   r=  r8   r8   r8   r9   reversed_order  r  z?TestMisc.test_overload_glue_arg_binding.<locals>.reversed_order)r   rL  r"  )rB   r?  r@  r8   r8   r9   test_overload_glue_arg_binding  s   

z'TestMisc.test_overload_glue_arg_bindingN)r5   r6   r7   r9  rA  r8   r8   r8   r9   r7    s    r7  c                   @   r  )TestOverloadPreferLiteralc                    s   dd dd  dd }t dd| t  | tfd	d
}|d\}}}| |d | |d | |d t fdd}|d\}}}| |d | |d | |d d S )Nc                 S   r  rH   r8   rn   r8   r8   r9   
prefer_lit  rU   z;TestOverloadPreferLiteral.test_overload.<locals>.prefer_litc                 S   r  rH   r8   rn   r8   r8   r9   non_lit  rU   z8TestOverloadPreferLiteral.test_overload.<locals>.non_litc                 S   s8   t | tjr| jdkrdd }|S tddd }|S )Nr/   c                 S   r   r  r8   rn   r8   r8   r9   r    rU   zATestOverloadPreferLiteral.test_overload.<locals>.ov.<locals>.implliteral valuec                 S   s   | d S Nd   r8   rn   r8   r8   r9   r    r   r>   r   IntegerLiteralliteral_valuer	   r   r  r8   r8   r9   ov     

z3TestOverloadPreferLiteral.test_overload.<locals>.ovTprefer_literalc                        d d | fS Nr/   r{   r8   rn   )rC  r8   r9   check_prefer_lit     zATestOverloadPreferLiteral.test_overload.<locals>.check_prefer_litrk  r     ,  c                    rO  rP  r8   rn   )rD  r8   r9   check_non_lit  rR  z>TestOverloadPreferLiteral.test_overload.<locals>.check_non_litrG  )r   r   rr  rB   rK  rQ  r  r  rL   rU  r8   )rD  rC  r9   test_overload  s"   z'TestOverloadPreferLiteral.test_overloadc                 C   s   dd }t tddd| t tddd| tdd	 }|t d
\}}}| |d | |d | |d tdd }|t d
\}}}| |d | |d | |d d S )Nc                 S   s8   t |tjr|jdkrdd }|S tddd }|S )Nr/   c                 S   r   r  r8   rB   ro   r8   r8   r9   r    rU   zHTestOverloadPreferLiteral.test_overload_method.<locals>.ov.<locals>.implrE  c                 S   s   |d S rF  r8   rX  r8   r8   r9   r    r   rH  )rB   ro   r  r8   r8   r9   rK    rL  z:TestOverloadPreferLiteral.test_overload_method.<locals>.ovmethod_prefer_literalTrM  method_non_literalFc                 S      |  d|  d|  |fS rP  )rY  r  ro   r8   r8   r9   rQ       zHTestOverloadPreferLiteral.test_overload_method.<locals>.check_prefer_litrk  r  rS  rT  c                 S   r[  rP  )rZ  r\  r8   r8   r9   rU    r]  zETestOverloadPreferLiteral.test_overload_method.<locals>.check_non_litrG  r  rV  r8   r8   r9   test_overload_method  s2   

z.TestOverloadPreferLiteral.test_overload_methodN)r5   r6   r7   rW  r^  r8   r8   r8   r9   rB    s    *rB  __main__rH   )r|   r   r  r  r=  rn  r  distutils.versionr   r  numpyr   numbar   r   r   r   r   
numba.corer   r	   r
   r   r   numba.core.typed_passesr   numba.core.registryr   numba.core.compilerr   numba.core.imputilsr   numba.tests.supportr   r   r   r   r   r   numba.core.errorsr   r  numba.extendingr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   numba.core.typing.templatesr*   r+   r,   r-   r.   pdlike_usecaser0   r1   scipy__version__r  scipy.special.cython_specialspecialcython_specialr  rc   r3   rd   r<   rI   rF   re   rM   r?   rS   rT   rf   r\   rh   r   r  mydummy_type_2rj   rp   ru   rW  rq   rz   rs   r   r   r   r   r   r   r   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!  Callabler"  r<  rA  r   rF  rG  rj  r  r,  r-  r0  rN  r  r  r  r  r  r  r  r  r  r  r7  rB  r5   mainr8   r8   r8   r9   <module>   s>    P






	




1

	

	
	



"


4a    	( Y# 







@ h
_