o
    1&i(                    @   sB  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Zd dlZd dl	Z
d dlm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 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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZD zd dlEmF  mGZH W n eIy   dZHY nw G dd deJZKG dd dejLZMeMdZNeK ZOe*PeKdd ZQe-eMejRdd ZSdd ZTe2eMe1jU e4eMdd ZVdd ZWeWd\ZXZYZZe4eXdd Z[dd d!Z\d"d# Z]e+e\e]Z^e,e\e,e\ej_d$d% Z`e,e\ejad&d' Zbe?G d(d) d)e=Zce,d*eMd+d, Zdd-d. Zed/d0 Zfd1d2 Zge.eed3d4 Zhe.eed5d6 Zie.ejd7d8 Zke.ejld9d: Zme.ejnd;d< Zoe.ejpd=d> Zqe.ejrd?d@ ZsdAdB ZtdCdD Zue.ejvdEdF ZwdGdH ZxdIdJ ZydKdL ZzdMdN Z{dOdP Z|e0eMdQdRdS Z}dTdU Z~dVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Ze.edndo Zdpdq Zdrds Zdtdu Ze@eG dvdw dweAZdxdy ZG dzd{ d{eJZG d|d} d}ejZe2eG d~d de1jUZe@eee 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 Ze0eMdddiddd Ze0eMdddiddd Ze/eMdddiddd Ze/eMdddiddd ZG dd de ZG dd de Zdd Ze%G dd de ZG dd de ZG dd de ZG dd de ZG dd de Zedkre(  dS dS )    N)ir)njitjit	vectorizeguvectorizeobjmode)typeserrorstypingcompilercgutils)type_inference_stage)
cpu_target)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Seriesc                   @      e Zd ZdS )MyDummyN__name__
__module____qualname__ r7   r7   EC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_extending.pyr2   J       r2   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   NumberZnumba.core.typeconvr<   safe)selfcontexttotyr<   r7   r7   r8   can_convert_toO   s   zMyDummyType.can_convert_toN)r4   r5   r6   rC   r7   r7   r7   r8   r;   N       r;   mydummyc                 C      t S N)mydummy_typevalcr7   r7   r8   typeof_mydummyZ      rL   c                 C   s   |  |dS )z2
    Implicit conversion from MyDummy to int.
    *   )get_constant)rA   builderZfromtyrB   rJ   r7   r7   r8   mydummy_to_number_   s   rQ   c                   C   rF   rG   )rE   r7   r7   r7   r8   	get_dummyg      rR   c                 C      t |j S rG   r"   rA   get_dummy_valuetypobjrK   r7   r7   r8   unbox_indexn      rZ   c                    sX   G dd dt }G dd dtj}||  t| fdd}t|tj || fS )Nc                   @   r1   )z(base_dummy_type_factory.<locals>.DynTypeNr3   r7   r7   r7   r8   DynTypex   r9   r\   c                   @   r1   )z,base_dummy_type_factory.<locals>.DynTypeTypeNr3   r7   r7   r7   r8   DynTypeType{   r9   r]   c                        S rG   r7   rI   dyn_type_typer7   r8   rL      rM   z/base_dummy_type_factory.<locals>.typeof_mydummy)objectr   Opaquer   registerr   r   OpaqueModel)namer\   r]   rL   r7   r_   r8   base_dummy_type_factoryw   s   
rf   mydummy2c                 C   rT   rG   rU   rW   r7   r7   r8   unbox_index2   r[   rh   c                 C      t rG   NotImplementedErrorxr7   r7   r8   func1   rS   rn   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 rG   )r   noneint32r=   Floatrl   r7   r7   r8   typer   s
   ztype_func1_.<locals>.typerrG   r7   )rA   rr   r7   r7   r8   type_func1_   s   
rs   c                 C   s   |  |jdS NrN   )rO   return_type)rA   rP   sigargsr7   r7   r8   func1_nullary   s   rx   c                 C   s   dd }|  ||||S )Nc                 S   s   t d|  S )N   )mathsqrtrl   r7   r7   r8   
func1_impl      zfunc1_unary.<locals>.func1_impl)Zcompile_internal)rA   rP   rv   rw   r|   r7   r7   r8   func1_unary   s   r~   c                   @   s   e Zd ZdZeejegZdS )
PrintDummy
print_itemN)	r4   r5   r6   keyr*   r   ro   rH   casesr7   r7   r7   r8   r      s    r   r   c                 C   s<   |\}|  |}||d}|| || |  S )Nzhello!)Zget_python_apiZunserializeZserialize_objectZprint_objectZdecrefrV   )rA   rP   rv   rw   rm   pyapiZstrobjr7   r7   r8   print_dummy   s   


r   c                 C   ri   rG   rj   condrm   yr7   r7   r8   where   rS   r   c                 C   s   t | ||S )z8
    Wrap np.where() to allow for keyword arguments
    )npr   r   r7   r7   r8   np_where   s   r   c                 C   s   t | ||dS )N)r   rm   )r   r   r7   r7   r8   
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)Zlayout).0tyr7   r7   r8   	<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_likeZflatrangesize)
r   rm   r   r   rescfZxfZyfrfir7   r7   r8   
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   Zndenumerate)r   rm   r   r   r   idxrK   r7   r7   r8   r      s   
N)r=   r   Arraydtyper	   TypingErrorallr   rm   r   r   r7   r7   r8   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
            r7   )r   r   )r   rm   r   Zscalarrr7   r7   r8   r     s   
z*overload_where_scalars.<locals>.where_implN)r=   r   r   r	   r   r   r7   r7   r8   overload_where_scalars  s   

r   c                 C      t | trdd }|S d S )Nc                 S      dS )N   r7   argr7   r7   r8   len_impl-  rS   z$overload_len_dummy.<locals>.len_implr=   r;   )r   r   r7   r7   r8   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   rt   r7   arg1arg2r7   r7   r8   dummy_add_impl9  rS   z*overload_add_dummy.<locals>.dummy_add_implr=   r;   MyDummyType2)r   r   r   r7   r7   r8   overload_add_dummy3     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rY   r   r7   r7   r8   dummy_delitem_implC     z2overload_dummy_delitem.<locals>.dummy_delitem_implr=   r;   r   Integer)rY   r   r   r7   r7   r8   overload_dummy_delitem?     r   c                 C   r   )Nc                 S   s   |d S )N{   r7   r   r7   r7   r8   dummy_getitem_implM     z2overload_dummy_getitem.<locals>.dummy_getitem_implr   )rY   r   r   r7   r7   r8   overload_dummy_getitemI  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 rG   r   rY   r   rJ   r7   r7   r8   dummy_setitem_impl]  r}   z2overload_dummy_setitem.<locals>.dummy_setitem_impl)r   r=   r;   r   r   )rY   r   rJ   r   r7   r7   r8   overload_dummy_setitemS  s   

r   c                 C      t | |S rG   operatoraddr   r7   r7   r8   call_add_operatorc     r   c                 C      | | S rG   r7   r   r7   r7   r8   call_add_binopg  r   r   c                 C   r   )Nc                 S   r   rt   r7   r   r7   r7   r8   dummy_iadd_implq  rS   z,overload_iadd_dummy.<locals>.dummy_iadd_implr   )r   r   r   r7   r7   r8   overload_iadd_dummyk  r   r   c                 C   r   rG   r   r   r7   r7   r8   call_iadd_operatorw  r   r   c                 C   s   | |7 } | S rG   r7   r   r7   r7   r8   call_iadd_binop{  s   r   c                 C   s
   | |= d S rG   r7   r   r7   r7   r8   call_delitem     
r   c                 C      | | S rG   r7   r   r7   r7   r8   call_getitem  r   r   c                 C   s   || |< d S rG   r7   r   r7   r7   r8   call_setitem  r   r   lengthc                 C      dd }|S )Nc                 S      t | S rG   lenr   r7   r7   r8   imp  r   z#overload_method_length.<locals>.impr7   )r   r   r7   r7   r8   overload_method_length     r   c                 C      |   S rG   )r   rl   r7   r7   r8   cache_overload_method_usecase  r   r   c                   C      t  S rG   rn   r7   r7   r7   r8   call_func1_nullary     r   c                 C   r   rG   r   rl   r7   r7   r8   call_func1_unary  r   r   c                 C   r   rG   r   rl   r7   r7   r8   len_usecase  r   r   c                 C   s   t |  d S rG   r   rl   r7   r7   r8   print_usecase  r   r   c                 C   r   rG   r7   )rm   r   r7   r7   r8   getitem_usecase  r   r   c                 C   s   t t | S rG   )r   cossinrl   r7   r7   r8   npyufunc_usecase  r   r   c                 C      | j S rG   )_datarl   r7   r7   r8   get_data_usecase  r   r   c                 C   r   rG   )_indexrl   r7   r7   r8   get_index_usecase  r   r   c                 C   r   rG   )Zis_monotonic_increasingrl   r7   r7   r8   is_monotonic_usecase  r   r   c                 C   s
   t | |S rG   )r0   )dataindexr7   r7   r8   make_series_usecase  r   r   c                 C   s   |  ||S rG   )Zclip)rm   lohir7   r7   r8   clip_usecase  r   r   c                   C   rF   rG   r   r7   r7   r7   r8   return_non_boxable  rS   r   c                  C      dd } | S )Nc                   S   rF   rG   r   r7   r7   r7   r8   r     rS   z(overload_return_non_boxable.<locals>.impr7   )r   r7   r7   r8   overload_return_non_boxable  r   r   c                 C   s   t  }|| S rG   )r   arange)szmodr7   r7   r8   non_boxable_ok_usecase  s   
r  c                   C   r   rG   )r   r7   r7   r7   r8   non_boxable_bad_usecase  r   r  c                 C      d S rG   r7   )fr7   r7   r8   mk_func_input  rS   r  c                   @   r:   )MkFuncTypingc                 C   s&   t |d tjs
J ttjg|R  S Nr   )r=   r   MakeFunctionLiteralr*   ro   )r@   rw   kwsr7   r7   r8   generic  s   zMkFuncTyping.genericN)r4   r5   r6   r
  r7   r7   r7   r8   r        r  c                   C   s   t dd  d S )Nc                 S      | S rG   r7   ar7   r7   r8   <lambda>      z#mk_func_test_impl.<locals>.<lambda>)r  r7   r7   r7   r8   mk_func_test_impl  r   r  c                   @   r1   )MyClassNr3   r7   r7   r7   r8   r    r9   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)r@   r  	__class__r7   r8   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 )NZ_compiled_overloads)Z
_functionstypeapply	Exceptiongetattrr  r  append)r@   rA   rw   r	  Zres_sigtemplateZcompiled_ovldsr7   r7   r8   get_call_type  s   zCallableTypeRef.get_call_typec                 C   s   t | j }|dfS )NT)listr  keys)r@   Zsigsr7   r7   r8   get_call_signatures  s   z#CallableTypeRef.get_call_signaturesc                 C   s
   | j | S rG   )r  )r@   rv   r7   r7   r8   get_impl_key  r   zCallableTypeRef.get_impl_key)r4   r5   r6   r  r"  r%  r&  __classcell__r7   r7   r  r8   r    s
    r  c                   @   r:   )CallableTypeModelc                 C   s   t j| || d S rG   )r   rd   r  )r@   ZdmmZfe_typer7   r7   r8   r       zCallableTypeModel.__init__N)r4   r5   r6   r  r7   r7   r7   r8   r(    s    r(  c                 C   r   rG   )rV   )rA   rP   r   Zpyvalr7   r7   r8   constant_callable_typeref!     r*  c                 C   r   )Nc                 S   r   )N   >[= r7   rY   r7   r7   r8   r   -  rM   zoverload_np_exp.<locals>.impr   rY   r   r7   r7   r8   overload_np_exp)  s   
r/  c                   @   sD   e Zd ZdZdd Zejdd Zdd Zej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nopythonrN   g      2@g      @)r   r   assertPreciseEqualr   r@   pyfunccfuncr7   r7   r8   
test_func1<  s   z TestLowLevelExtending.test_func1c                 C      |    d S rG   )r7  r@   r7   r7   r8   test_func1_isolatedE     z)TestLowLevelExtending.test_func1_isolatedc                 C   s   |  tt | t d S rG   )assertIs
type_func1rs   assertIsNotNoner9  r7   r7   r8   !test_type_callable_keeps_functionI  s   z7TestLowLevelExtending.test_type_callable_keeps_functionc                 C   s&   t }tt |}| | d d S )Ng      E@)rR   r   r   float64r3  r4  r7   r7   r8   test_cast_mydummyM  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
        r7   Nc                 s   s    | ]	}t |tjV  qd S rG   )r=   r   r  )r   r  r7   r7   r8   r   ^  s
    

z=TestLowLevelExtending.test_mk_func_literal.<locals>.<genexpr>)r   Zrun_frontendr  r   Ztyping_contextZtarget_contextrefreshr   
assertTrueanytypemapvalues)r@   Ztest_ir	typingctxZ	targetctxZ
typing_resr7   r7   r8   test_mk_func_literalS  s   

z*TestLowLevelExtending.test_mk_func_literalN)r4   r5   r6   __doc__r7  r   Zrun_test_in_subprocessr:  r?  rA  rH  r7   r7   r7   r8   r0  4  s    	

r0  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   Tr1  )r/   r   r   r   r   r3  )r@   r   r6  r7   r7   r8   test_index_lenk  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rN      Tr1  r.   rN  rO  )
r/   r   rp   r   r   r3  sliceassertIsInstanceassertEqualr#  r@   r   r6  iir7   r7   r8   test_index_getitemp  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  Tr1  N)
r/   r   rp   r   r   rQ  r3  r   r   r   rS  r7   r7   r8   test_index_ufuncx  s
    zTestPandasLike.test_index_ufuncc                 C   s:   t tg d}tddt}||}| ||j d S )NrM  Tr1  )r/   r   rp   r   r   r<  r   )r@   r   r6  r   r7   r7   r8   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 )NTr1  )rN  rN      F)rX  rN  rN   )r   r   r/   r   rp   rR  )r@   r6  rF  expectedr   gotr7   r7   r8   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ry      rK  g      ?g      @      @Tr1  rK  )r/   r   rp   r0   r@  r   r   r3  )r@   r   sr6  r7   r7   r8   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^  Tr1  )
r/   r   rp   r0   r@  r   r   rQ  r<  r   )r@   r   r`  r6  rZ  r7   r7   r8   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.   ry   rK  Tr1  N)r/   r   rp   r0   int64r   r   rQ  r   r<  r   r3  _valuesr   r   r@   r   r`  r6  ssr7   r7   r8   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^  Tr1  )r/   r   rp   r@  r   r   rQ  r0   r   r<  r   re  )r@   r   dr6  rZ  r7   r7   r8   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^  Tr1  皙?      @)rk  rl  r_  )r/   r   rp   r0   r@  r   r   rQ  r   r<  r   r3  re  rf  r7   r7   r8   test_series_clip  s   zTestPandasLike.test_series_clipN)r4   r5   r6   rI  rL  rU  rV  rW  r[  ra  rb  rh  rj  rm  r7   r7   r7   r8   rJ  e  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.
        Tr1  c                     s,   t | i |} | i |}|| d S rG   )r   r3  )rw   kwargsrY  rZ  r6  r@   r7   r8   check  s   z0TestHighLevelExtending.test_where.<locals>.checkrK  rN  )rm   r   r   )TFTrc  )r]  rX  rX  Nr   )r   r   r   Zbool_rp   assertRaisesr	   r   rd  assertInstr	exception)r@   r5  rq  raisesr7   rp  r8   
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.
        Tr1  r   r]  rX  ry   N)r   r   r3  r2   r@   r6  r7   r7   r8   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.
        Tr1  zhello!
N)r   r   r   r2   rR  sysstdoutgetvaluerx  r7   r7   r8   
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.
        Tr1  r.   ry   rK  rN   T   N)r   r   r3  MyDummy2r2   r4  r7   r7   r8   test_add_operator  
   z(TestHighLevelExtending.test_add_operatorc                 C   r~  	zY
        Test re-implementing '+' for a custom type via @overload(operator.add).
        Tr1  r.   ry   rK  rN   r  N)r   r   r3  r  r2   r4  r7   r7   r8   test_add_binop  r  z%TestHighLevelExtending.test_add_binopc                 C   r~  r  )r   r   r3  r  r2   r4  r7   r7   r8   test_iadd_operator  r  z)TestHighLevelExtending.test_iadd_operatorc                 C   r~  r  )r   r   r3  r  r2   r4  r7   r7   r8   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 )NTr1  A  zdel hello! 321
)r   r   r2   r   r  rR  r|  r@   r5  r6  rY   eoutexcr7   r7   r8   test_delitem/  s    z#TestHighLevelExtending.test_delitemc                 C   s*   t }tdd|}| |t dd d S )NTr1  r  i  )r   r   r3  r2   r4  r7   r7   r8   test_getitem?  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 )NTr1  r  r   z321 123
)r   r   r2   r   r  rR  r|  r  r7   r7   r8   test_setitemD  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.
        Tr1  
   Nzcannot convert native Module)r   r  r   testingZassert_equalr  rr  	TypeErrorrt  ru  rs  )	r@   Zok_cfuncnrZ  expectZ	bad_cfuncrv  errmsgZ	expectmsgr7   r7   r8   test_no_cpython_wrapperT  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  rG   r7   r  brK   kwr7   r7   r8   
myoverloadn  rS   zjTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>.myoverloadc                    r^   rG   r7   r  )implr7   r8   _myoverload_implq  rM   zpTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>._myoverload_implTr1  c                    s    | |||d d S )Nr  r7   )r  r  rK   ri  r  r7   r8   foou  r)  zcTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.gen_ol.<locals>.foorG   r   r   )r  r  r  r7   )r  r  r8   gen_olm  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.   r7   r  r7   r7   r8   impl1~     zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl1r.   ry   rK  r]  zkeyword argument default valuesz<Parameter "kw=12">z<Parameter "kw=None">c                 S   r  r  r7   )r  r  rK   kwargr7   r7   r8   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  rK   r  r7   r7   r8   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  r7   )r  r  rK   ri  r  r  r7   r7   r8   impl6  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl6z<Parameter "d">z<Parameter "e">c                 S   r  r  r7   )r  r  r  r7   r7   r8   impl7  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl7z<Parameter "c">c                 S   r  r  r7   )r  r  rK   r  Zextra_kwargr7   r7   r8   impl8  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl8z<Parameter "extra_kwarg=None">c                 S   r  r  r7   )r  r  rK   r7   r7   r8   impl9  r  zUTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling.<locals>.impl9rG   )r  )NN)
rr  r	   r   rt  ru  rs  assertFalseoverload_usecasesr  r  )r@   r  sentinelr  r  msgr  r  r  r  r  r  r  r  r7   r7   r8   /test_typing_vs_impl_signature_mismatch_handlingg  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  rG   r7   r  r  r7   r7   r8   r    rS   ziTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_positional.<locals>.myoverloadr.   )var_positional_implTr1  c                    s    | |dddS )N	      r  r7   r  r  r  r7   r8   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'rG   )
r  r  r   r   rr  r	   r   rt  ru  rs  )r@   r  r  r  r  r7   r  r8   >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  rG   r7   r  r7   r7   r8   r    rS   zvTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_ol.<locals>.myoverloadstrictTr1  c                    s    | ddS )Nr  r  r7   r  r  r7   r8   r    r;  zoTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_ol.<locals>.foorG   r  )r  r  r  r7   r  r8   r    s
   
zbTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.gen_olc                 [      ddd}|S )Nr  c                 S   r  rG   r7   r  r7   r7   r8   r  #  rS   zmTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol1.<locals>.implr  r7   )r  r	  r  r7   r7   r8   ol1"  s   
z_TestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol1Fr.   ry   Nz1use of VAR_KEYWORD (e.g. **kwargs) is unsupportedz"offending argument name is '**kws'r   c                 S      dd }|S )Nc                 [   r  rG   r7   )r  r	  r7   r7   r8   r  1  rS   zmTestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol2.<locals>.implr7   )r  r  r  r7   r7   r8   ol20  s   z_TestHighLevelExtending.test_typing_vs_impl_signature_mismatch_handling_var_keyword.<locals>.ol2)T)r   )rr  r	   r   rt  ru  rs  )r@   r  r  r  r  r  r7   r7   r8   ;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 rG   r7   )r   a_kwargr7   r7   r8   r  @  rS   zQTestHighLevelExtending.test_overload_method_kwargs.<locals>.fooimpl.<locals>.implr  r7   )r   r  r  r7   r7   r8   fooimpl>  s   
zCTestHighLevelExtending.test_overload_method_kwargs.<locals>.fooimplc                 S   s   |   |  d| j ddfS )N      )r  r  Ar7   r7   r8   barE  s   z?TestHighLevelExtending.test_overload_method_kwargs.<locals>.barrX  )r  r  r  r  )r   r   r   r   r   r   rR  )r@   r  r  Zr7   r7   r8   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 d S )Nc                 S   r  rG   r7   )r   rJ   r7   r7   r8   r  V  rS   zXTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.litfoo.<locals>.impl)r=   r   r   Literal)r   rJ   r  r7   r7   r8   r  O  s   zJTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.litfooc                 S   s
   |  dS N  )r  r  r7   r7   r8   r  [     
zGTestHighLevelExtending.test_overload_method_literal_unpack.<locals>.barr.   r  )r   r   r   r   r   ZzerosrR  )r@   r  r  r  r7   r7   r8   #test_overload_method_literal_unpackM  s   



z:TestHighLevelExtending.test_overload_method_literal_unpackc                 C   s   t dd }| | d d S )Nc                   S   s
   t tS rG   )r   exprE   r7   r7   r7   r8   testg  r  z8TestHighLevelExtending.test_overload_ufunc.<locals>.testr,  )r   rR  )r@   r  r7   r7   r8   test_overload_ufuncc  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 rG   r7   )rY   rJ   val2rw   r7   r7   r8   getp  r   z\TestHighLevelExtending.test_overload_method_stararg.<locals>._ov_method_stararg.<locals>.getr7   )rY   rJ   r  rw   r  r7   r7   r8   _ov_method_starargn  r   zOTestHighLevelExtending.test_overload_method_stararg.<locals>._ov_method_starargc                 W   s
   | j | S rG   r  )rY   rw   r7   r7   r8   r  u  s   
z@TestHighLevelExtending.test_overload_method_stararg.<locals>.foor.   ry   r.   ry   r7   rK  r.   ry   rK  r]  r.   ry   rK  r]  c                 S   s(   |  dd|  ddd|  ddddfS )Nr.   ry   rK  r]  r  r-  r7   r7   r8   r    s   
z@TestHighLevelExtending.test_overload_method_stararg.<locals>.bar)r  r  r  r  )r.   ry   )r  r  )r.   ry   )r  rK  )r]  rX  )r.   ry   )r  r   r;   r   r2   rR  )r@   r  r  rY   r  r7   r7   r8   test_overload_method_starargm  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                   @   r1   )zATestHighLevelExtending.test_overload_classmethod.<locals>.MyArrayNr3   r7   r7   r7   r8   MyArray  r9   r  array_allocc                 S   r  )Nc                 S   s   t |}|S rG   r   r   )clsnitemsr   r7   r7   r8   r    s   
zVTestHighLevelExtending.test_overload_classmethod.<locals>.ol_array_alloc.<locals>.implr7   )r  r  r  r7   r7   r8   ol_array_alloc  r   zHTestHighLevelExtending.test_overload_classmethod.<locals>.ol_array_allocc                    s
     | S rG   )r  r  r  r7   r8   r    r  z=TestHighLevelExtending.test_overload_classmethod.<locals>.foor   c                 S   s   t j| S rG   )r   r   r  r  r7   r7   r8   no_classmethod_in_base  r;  zPTestHighLevelExtending.test_overload_classmethod.<locals>.no_classmethod_in_basez"Unknown attribute 'array_alloc' of)r   r   r(   r   r3  r   r   rr  r	   r   rs  rt  ru  )r@   r  r  r  r  rv  r7   r  r8   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@r7   rl   r7   r7   r8   r    r   zeTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld1.<locals>.impl)r=   r   r   rm   r  r7   r7   r8   callable_type_call_ovld1  s   zWTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld1c                 S   r  )Nc                 S   r  )N42.5r7   rl   r7   r7   r8   r    r   zeTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld2.<locals>.impl)r=   r   ZUnicodeTyper  r7   r7   r8   callable_type_call_ovld2  s   zWTestHighLevelExtending.test_overload_callable_typeref.<locals>.callable_type_call_ovld2c                 S   s   t | t |fS rG   )r  r  r7   r7   r8   r    r  zBTestHighLevelExtending.test_overload_callable_typeref.<locals>.foo)r]  4r  r   r  r.   )r   r  r   r3  )r@   r  r  r  rw   rY  r7   r7   r8   test_overload_callable_typeref  s   


z5TestHighLevelExtending.test_overload_callable_typerefN)r4   r5   r6   rI  rw  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7   r7   r7   r8   rn    s.    	 ,
+ rn  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
signaturesAssertionErrorZ_cache_misses)r6  Z
expect_hitZexpect_misseshitZmissr7   r7   r8   _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  r4   
_cache_dirr   run_caching_overload_methodr9  r7   r7   r8   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r2  cacher   r   r.   c                 S   s"   g | ]}| d rd|v r|qS )Zdeclarer   )
startswith)r   lnr7   r7   r8   
<listcomp>  s    zITestOverloadMethodCaching.run_caching_overload_method.<locals>.<listcomp>Zspawn)targetrw   )timeout)r   r   r3  r2   r  Zinspect_llvmrH   
splitlinesrR  r   multiprocessingZget_contextAttributeErrorQueueProcessr  r   startputjoinexitcoder  )r@   r6  ZllvmirZdeclsctxqpr   r7   r7   r8   r    s.   
z5TestOverloadMethodCaching.run_caching_overload_methodN)r4   r5   r6   _numba_parallel_test_r  r  r7   r7   r7   r8   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  Tr  r.   r   N)r   r  r   r   r  r  )r  	cache_dirr   r6  r   r7   r7   r8   r    s   
"r  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  rG   r7   rA   rP   r*   rw   r7   r7   r8   codegen  rS   zBTestIntrinsic.test_void_return.<locals>.void_func.<locals>.codegenr   Zvoidrp   rG  r  rv   r  r7   r7   r8   	void_func  s   z1TestIntrinsic.test_void_return.<locals>.void_funcc                 S   s   t t j}dd }||fS )Nc                 S   r  rG   r7   r  r7   r7   r8   r  &  rS   zFTestIntrinsic.test_void_return.<locals>.non_void_func.<locals>.codegen)r   rp   r  r7   r7   r8   non_void_func"  s   z5TestIntrinsic.test_void_return.<locals>.non_void_funcTr1  c                          d dS Nr.   r   r7   r7   )r  r7   r8   call_void_func+     z6TestIntrinsic.test_void_return.<locals>.call_void_funcc                      r!  r"  r7   r7   )r   r7   r8   call_non_void_func0  r$  z:TestIntrinsic.test_void_return.<locals>.call_non_void_funcr   Nznon-void function returns None)r#   r   rR  rr  r   rs  ru  r  )r@   r#  r%  r  r7   )r   r  r8   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 rG   )ru   get_value_typeZinttoptr)rA   rP   r*   rw   srcZrtypellrtyper7   r7   r8   r  M  s   
z_TestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_caster.<locals>.unsafe_cast.<locals>.codegen)rQ  r
   Contextr=   r   r   Zuintp)rG  r,  rv   r  )result_typer@   r7   r8   unsafe_castF  s   
zNTestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_caster.<locals>.unsafe_cast)r=   r   CPointerr#   )r/  r0  r9  )r/  r8   unsafe_casterC  s   z9TestIntrinsic.test_ll_pointer_cast.<locals>.unsafe_casterc                 S   s   t d)Nznot callable from pythonrj   r,  r7   r7   r8   unsafe_get_ctypes_pointerY  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 )Nr3  )ctypesr   )r   r0  r7   r8   
array_impla  r}   zdTestIntrinsic.test_ll_pointer_cast.<locals>.array_impl_unsafe_get_ctypes_pointer.<locals>.array_impl)r=   r   r   r1  r   )Zarrtyper7  )r2  r6  r8   $array_impl_unsafe_get_ctypes_pointer\  s
   zPTestIntrinsic.test_ll_pointer_cast.<locals>.array_impl_unsafe_get_ctypes_pointerc                 S   s   t |D ]}t| |  qd S rG   )r   r   )ptrr  r   r7   r7   r8   my_c_fun_rawg  s   z8TestIntrinsic.test_ll_pointer_cast.<locals>.my_c_fun_rawNTr1  c                    s   | } || j  d S rG   )r   )r   r9  )my_c_funr4  r7   r8   r  p  s   z/TestIntrinsic.test_ll_pointer_cast.<locals>.foor  )r   )r5  r'  r(  r)  r*  r   r   r   r   Zfloat32r   r|  r
  closer#  maprt  rR  )r@   r'  r(  r)  r*  r8  r:  Z	prototyper  r   bufrZ  r  r7   )r;  r@   r2  r4  r8   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      |d S r  r7   r  r7   r7   r8   r    r   zCTestIntrinsic.test_serialization.<locals>.identity.<locals>.codegenr7   )rA   rm   r  rv   r7   r7   r8   identity  s   z2TestIntrinsic.test_serialization.<locals>.identityTr1  c                        | S rG   r7   rl   rA  r7   r8   r    r+  z-TestIntrinsic.test_serialization.<locals>.foor.   N)
r#   r   rR  r$   _memor   pickledumpsloadsr<  )r@   r  memo	memo_sizeZserialized_fooZfoo_rebuiltZserialized_identityZidentity_rebuiltr7   rC  r8   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  r7   r  r7   r7   r8   r    r   zATestIntrinsic.test_deserialization.<locals>.defn.<locals>.codegenr7   )rA   rm   r  r7   r7   r8   defn  s   z0TestIntrinsic.test_deserialization.<locals>.defnr  r.   N)r$   rD  r   r<  Z_defnrE  rF  rR  Z_recentclearrG  ZassertIsNot)r@   rK  rH  rI  originalZpickledZrebuiltsecondr7   r7   r8   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   r  )void_func docstringc                 S   r  rG   r7   r  r7   r7   r8   r    rS   z@TestIntrinsic.test_docstring.<locals>.void_func.<locals>.codegenr  r  r7   r7   r8   r    s   z/TestIntrinsic.test_docstring.<locals>.void_funcznumba.tests.test_extendingr  rP  )	r#   intrR  r5   r4   r6   ZassertDictEqual__annotations__rI  )r@   r  r7   r7   r8   test_docstring  s   
zTestIntrinsic.test_docstringN)r4   r5   r6   r&  r?  rJ  rO  rS  r7   r7   r7   r8   r    s    *B.(r  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   rG   r7   rm   r   r7   r7   r8   r    r+  z.TestRegisterJitable.test_no_flags.<locals>.fooc                    s
    | |S rG   r7   rV  r  r7   r8   r    r   z.TestRegisterJitable.test_no_flags.<locals>.barTr1  r.   ry   )r%   r   rR  )r@   r  cbarr  rZ  r7   r  r8   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 rG   r  r  r7   r7   r8   r    r  z2TestRegisterJitable.test_flags_no_nrt.<locals>.fooc                    rB  rG   r7   rZ  r  r7   r8   r    r   z2TestRegisterJitable.test_flags_no_nrt.<locals>.barrK  )r   r.   ry   Tr1  ry   COnly accept returning of array passed into the function as argument)
r%   rR  tolistr   rr  r	   r   rs  rt  ru  )r@   r  rW  rv  r  r7   r  r8   test_flags_no_nrt  s   

z%TestRegisterJitable.test_flags_no_nrtN)r4   r5   r6   rX  r]  r7   r7   r7   r8   rU    s    rU  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j0Tr1  c                    rB  rG   r7   rl   Z_j0r7   r8   r    s    z@TestImportCythonFunction.test_getting_function.<locals>.<lambda>r   r.   )r&   r5  r'  c_doubler   rR  )r@   addrZfunctyper`  r7   ra  r8   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 )NZ
fakemoduleZfakefunctionzNo module named '?fakemodule'?)rr  ImportErrorr&   rematchrt  ru  r>  )r@   rv  r  rg  r7   r7   r8   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')rr  r   r&   rR  rt  ru  )r@   rv  r  r7   r7   r8   test_missing_function  s   z.TestImportCythonFunction.test_missing_function)	r4   r5   r6   unittestZskipIfscrd  rh  ri  r7   r7   r7   r8   r^    s    
	r^  method_jit_option_check_nrtrY  TZjit_optionsc                 C   r   )Nc                 S   
   t dS Nr  r  r-  r7   r7   r8   r   0  r   z+ov_method_jit_option_check_nrt.<locals>.impr7   r.  r7   r7   r8   ov_method_jit_option_check_nrt,     rp  method_jit_option_check_no_nrtFc                 C   r   )Nc                 S   rn  ro  r  r-  r7   r7   r8   r   :  r   z.ov_method_jit_option_check_no_nrt.<locals>.impr7   r.  r7   r7   r8   !ov_method_jit_option_check_no_nrt6  rq  rs  attr_jit_option_check_nrtc                 C   r   )Nc                 S   rn  ro  r  r-  r7   r7   r8   r   D  r   z)ov_attr_jit_option_check_nrt.<locals>.impr7   r.  r7   r7   r8   ov_attr_jit_option_check_nrt@  rq  ru  attr_jit_option_check_no_nrtc                 C   r   )Nc                 S   rn  ro  r  r-  r7   r7   r8   r   N  r   z,ov_attr_jit_option_check_no_nrt.<locals>.impr7   r.  r7   r7   r8   ov_attr_jit_option_check_no_nrtJ  rq  rw  c                   @   r  )TestJitOptionsNoNRTc                 O   sT   d}|  tj}||i | W d    n1 sw   Y  | |t|j d S )Nr[  )rr  r	   r   rs  rt  ru  )r@   funcrw   ro  r  rv  r7   r7   r8   check_error_no_nrtW  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   rn  ro  r  r7   r7   r7   r8   dummyb  r   z8TestJitOptionsNoNRT.no_nrt_overload_check.<locals>.dummyrY  rm  c                  S   r   )Nc                   S   rn  ro  r  r7   r7   r7   r8   r{  g  r   zJTestJitOptionsNoNRT.no_nrt_overload_check.<locals>.ov_dummy.<locals>.dummyr7   r{  r7   r7   r8   ov_dummye  r   z;TestJitOptionsNoNRT.no_nrt_overload_check.<locals>.ov_dummyc                      s     S rG   r7   r7   r|  r7   r8   r  l     z6TestJitOptionsNoNRT.no_nrt_overload_check.<locals>.foor  )r   r   r3  r   r   rz  )r@   flagr}  r  r7   r|  r8   no_nrt_overload_checka  s   
z)TestJitOptionsNoNRT.no_nrt_overload_checkc                 C   s   |  d |  d d S )NTF)r  r9  r7   r7   r8   test_overload_no_nrtu  s   
z(TestJitOptionsNoNRT.test_overload_no_nrtc                 C   >   t dd }| |ttd t dd }| |t d S )Nc                 S   r   rG   )rl  rl   r7   r7   r8   udtz  r+  z<TestJitOptionsNoNRT.test_overload_method_no_nrt.<locals>.udtr  c                 S   r   rG   )rr  rl   r7   r7   r8   r    r+  r   r3  rE   r   r   rz  r@   r  r7   r7   r8   test_overload_method_no_nrty     

z/TestJitOptionsNoNRT.test_overload_method_no_nrtc                 C   r  )Nc                 S   r   rG   )rt  rl   r7   r7   r8   r    r~  z?TestJitOptionsNoNRT.test_overload_attribute_no_nrt.<locals>.udtr  c                 S   r   rG   )rv  rl   r7   r7   r8   r    r~  r  r  r7   r7   r8   test_overload_attribute_no_nrt  r  z2TestJitOptionsNoNRT.test_overload_attribute_no_nrtN)r4   r5   r6   rz  r  r  r  r  r7   r7   r7   r8   rx  T  s    
rx  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 )Nrg   )r  setUprf   r]   r\   r`   dyn_type)r@   manyr  r7   r8   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 rG   r   r  rA   rP   rv   rw   rJ   magic_offsetr7   r8   r       zKTestBoxingCallingJIT.test_unboxer_basic.<locals>.my_intrinsic.<locals>.implr*   rG  rJ   r  rv   r  r7   r8   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                    rB  rG   r7   rl   r  r7   r8   bridge  s   zHTestBoxingCallingJIT.test_unboxer_basic.<locals>.unboxer.<locals>.bridgeis_error	rA   rO   r   intpr*   Zvoidptrr   call_jit_coder"   rX   rY   rK   r  rw   rv   r  r   magic_tokenr  r7   r8   unboxer  s
   z8TestBoxingCallingJIT.test_unboxer_basic.<locals>.unboxerc                 S      |j |tj}|j|S rG   rP   Zptrtointr   Zintp_tr   long_from_ssize_trX   rJ   rK   r   r7   r7   r8   boxer     z6TestBoxingCallingJIT.test_unboxer_basic.<locals>.boxerc                 S   r  rG   r7   rl   r7   r7   r8   passthru  rM   z9TestBoxingCallingJIT.test_unboxer_basic.<locals>.passthrur#   r!   r]   r    r   r  rR  )r@   r  r  r  r  r7   r  r  r  r8   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   rl   r7   r7   r8   r       zHTestBoxingCallingJIT.test_unboxer_raise.<locals>.unboxer.<locals>.bridger.   r  r  r  r7   r7   r8   r    s
   z8TestBoxingCallingJIT.test_unboxer_raise.<locals>.unboxerc                 S   r  rG   r  r  r7   r7   r8   r    r  z6TestBoxingCallingJIT.test_unboxer_raise.<locals>.boxerc                 S   r  rG   r7   rl   r7   r7   r8   r    rM   z9TestBoxingCallingJIT.test_unboxer_raise.<locals>.passthrur  
r!   r]   r    r   rr  r   r  rs  rt  ru  r@   r  r  r  rv  r7   r7   r8   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  rG   r  r  r  r7   r8   r    r  zCTestBoxingCallingJIT.test_boxer.<locals>.my_intrinsic.<locals>.implr  r  r  r7   r8   r    r  z5TestBoxingCallingJIT.test_boxer.<locals>.my_intrinsicc                 S   rT   rG   rU   rW   r7   r7   r8   r    r[   z0TestBoxingCallingJIT.test_boxer.<locals>.unboxerc                    sL   fdd}|j tj g}ttjtj}|j|||\}}|j|S )Nc                    rB  rG   r7   rl   r  r7   r8   r    r   z>TestBoxingCallingJIT.test_boxer.<locals>.boxer.<locals>.bridge)rA   rO   r   r  r*   r   r  r  )rX   rJ   rK   r  rw   rv   r  r   r  r7   r8   r    s
   z.TestBoxingCallingJIT.test_boxer.<locals>.boxerc                 S   r  rG   r7   rl   r7   r7   r8   r    rM   z1TestBoxingCallingJIT.test_boxer.<locals>.passthrur  )r@   r  r  r  rr7   r  r8   
test_boxer  s   	



zTestBoxingCallingJIT.test_boxerc                 C   r  )Nc                 S   rT   rG   rU   rW   r7   r7   r8   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  rl   r7   r7   r8   r    r  zDTestBoxingCallingJIT.test_boxer_raise.<locals>.boxer.<locals>.bridger.   T)zfill)rA   rO   r   r  r*   r   r  r   Zalloca_oncerP   ZpyobjZif_thennot_r  storeload)
rX   rJ   rK   r  rw   rv   r  r   retvalrY   r7   r7   r8   r    s   z4TestBoxingCallingJIT.test_boxer_raise.<locals>.boxerc                 S   r  rG   r7   rl   r7   r7   r8   r     rM   z7TestBoxingCallingJIT.test_boxer_raise.<locals>.passthrur  r  r  r7   r7   r8   test_boxer_raise	  s   



z%TestBoxingCallingJIT.test_boxer_raise)	r4   r5   r6   r  r  r  r  r  r'  r7   r7   r  r8   r    s    *%r  c                 C   r  rG   r7   rl   r7   r7   r8   with_objmode_cache_ov_example+  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	   ZNumbaWarningr9  r7   r7   r8   r  8  s   z TestCachingOverloadObjmode.setUpc                 C   s   t   d S rG   )r  resetwarningsr9  r7   r7   r8   tearDown;  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 rG   )r   r   ZlinalgZnorm)rm   r   r7   r7   r8   realworkB  s   zJTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>.realworkc                    rB  rG   r7   rl   )r  r7   r8   python_codeG  r+  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 Nr@  )r   r   rV  r  r7   r8   r  M  s   

zqTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>._ov_with_objmode_cache_ov_example.<locals>.implr7   r  r  r7   r8   !_ov_with_objmode_cache_ov_exampleK  s   zcTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>._ov_with_objmode_cache_ov_exampleTr  c                 S   r   rG   )r  rl   r7   r7   r8   testcaseT  r+  zJTestCachingOverloadObjmode.test_caching_overload_objmode.<locals>.testcaser   )	r   r  r4   r   r   r  r   rR  py_func)r@   r  r  r  r  rZ  Ztestcase_cachedr7   )r  r  r8   test_caching_overload_objmode>  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 rG   r   sumr  r7   r7   r8   do_thisb  r}   zGTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.do_thisc                 S   r  rG   r  r  r7   r7   r8   do_somethinge  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  r7   r8   _do_something_implj  s   
zqTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.overload_do_something.<locals>._do_something_implr7   )r  r  r  r  r7   r8   overload_do_somethingh  s   zUTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.overload_do_somethingTr  c                     s   t d} t d} | |S )Nr  r  r  )r  r7   r8   test_cachingp  s   


zLTestCachingOverloadObjmode.check_objmode_cache_ndarray.<locals>.test_cachingzincorrect result)r   r   r  r  )r  r  r  rZ  r  r7   )r  r  r8   check_objmode_cache_ndarray`  s   z6TestCachingOverloadObjmode.check_objmode_cache_ndarrayc                 C   r8  rG   )r  )r  r7   r7   r8   *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   statsZcache_missesr  Z
cache_hits)r  Zdispr7   r7   r8   '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  r  r   )r   r  r4   r   r   r  r  rR  )r@   r  r   r7   r7   r8    test_check_objmode_cache_ndarray  s   	z;TestCachingOverloadObjmode.test_check_objmode_cache_ndarrayN)r4   r5   r6   rI  r  r  r  r  classmethodr  r  r  r  r7   r7   r7   r8   r  1  s    "


r  c                   @   rT  )TestMiscc                 C   sn   dd }|  t| | tt| |  tt| |  ttdd| |  ttdd| d S )Nc                 S   r  rG   r7   rl   r7   r7   r8   r    rS   z$TestMisc.test_is_jitted.<locals>.fooT)Zparallelzvoid(float64[:])z(m))r  r'   rC  r   r   r   )r@   r  r7   r7   r8   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   r7   r7   r7   r8   standard_order  r  z:TestMisc.test_overload_arg_binding.<locals>.standard_orderc                   S   r  )Nr  r   )r  r   r  r7   r7   r7   r8   reversed_order  r  z:TestMisc.test_overload_arg_binding.<locals>.reversed_order)r   r3  r  )r@   r  r  r7   r7   r8   test_overload_arg_binding  s   

z"TestMisc.test_overload_arg_bindingN)r4   r5   r6   r  r  r7   r7   r7   r8   r    s    r  c                   @   rT  )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  rG   r7   rl   r7   r7   r8   
prefer_lit  rS   z;TestOverloadPreferLiteral.test_overload.<locals>.prefer_litc                 S   r  rG   r7   rl   r7   r7   r8   non_lit  rS   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  r7   rl   r7   r7   r8   r    rS   zATestOverloadPreferLiteral.test_overload.<locals>.ov.<locals>.implliteral valuec                 S   s   | d S Nd   r7   rl   r7   r7   r8   r    r   r=   r   IntegerLiteralliteral_valuer	   r   r  r7   r7   r8   ov     

z3TestOverloadPreferLiteral.test_overload.<locals>.ovTZprefer_literalc                        d d | fS Nr.   ry   r7   rl   r  r7   r8   check_prefer_lit     zATestOverloadPreferLiteral.test_overload.<locals>.check_prefer_litrK  r     ,  c                    r  r  r7   rl   r  r7   r8   check_non_lit  r  z>TestOverloadPreferLiteral.test_overload.<locals>.check_non_litr  )r   r   rR  r@   r  r  r  r  rK   r  r7   r  r  r8   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  r7   r@   rm   r7   r7   r8   r    rS   zHTestOverloadPreferLiteral.test_overload_method.<locals>.ov.<locals>.implr  c                 S   s   |d S r  r7   r   r7   r7   r8   r    r   r  )r@   rm   r  r7   r7   r8   r    r  z:TestOverloadPreferLiteral.test_overload_method.<locals>.ovmethod_prefer_literalTr  method_non_literalFc                 S      |  d|  d|  |fS r  )r  r{  rm   r7   r7   r8   r       zHTestOverloadPreferLiteral.test_overload_method.<locals>.check_prefer_litrK  r  r  r  c                 S   r  r  )r  r  r7   r7   r8   r    r  zETestOverloadPreferLiteral.test_overload_method.<locals>.check_non_litr  r  r  r7   r7   r8   test_overload_method  s2   

z.TestOverloadPreferLiteral.test_overload_methodN)r4   r5   r6   r  r  r7   r7   r7   r8   r    s    *r  c                   @   r:   )TestIntrinsicPreferLiteralc                    s   dd }t dd|t dd| tfdd}|d\}}}| |d	 | |d
 | |d t fdd}|d\}}}| |d | |d
 | |d d S )Nc                 S   sL   t tj|}t|tjr|jdkrdd }||fS tddd }||fS )Nr.   c                 S   s    |j d }| |}t|dS )Nr   r  )rw   r+  r   Constant)rA   rP   r*   rw   atyper-  r7   r7   r8   r    s   

zJTestIntrinsicPreferLiteral.test_intrinsic.<locals>.intrin.<locals>.codegenr  c                 S   s,   |j }| |}t|d}||d |S )Nr  r   )ru   r+  r   r  mul)rA   rP   r*   rw   r	  r-  Zint_100r7   r7   r8   r  %  s   
)r*   r   r  r=   r  r  r	   r   )rA   rm   rv   r  r7   r7   r8   intrin  s   

z9TestIntrinsicPreferLiteral.test_intrinsic.<locals>.intrinTr  Fc                    r  r  r7   rl   r  r7   r8   r  /  r  zCTestIntrinsicPreferLiteral.test_intrinsic.<locals>.check_prefer_litrK  r  r  r  c                    r  r  r7   rl   r  r7   r8   r  8  r  z@TestIntrinsicPreferLiteral.test_intrinsic.<locals>.check_non_litr  )r#   r   rR  )r@   r  r  r  r  rK   r  r7   r  r8   test_intrinsic  s   z)TestIntrinsicPreferLiteral.test_intrinsicN)r4   r5   r6   r  r7   r7   r7   r8   r    rD   r  c                   @   r:   )TestNumbaInternalOverloadsc                    s   d  fdd fdd}t dd d tjjj }|  |j}|	 D ]\}}|j
D ]}t|d	d
r@||j|j q1q*d S )Nr   c              	      s   |  ds[ttj| }t|r]|j }|D ]G}|rZ| }| | rZ| dkr*d}d| d}i }zt	|i | W n t
yM    dkrItd Y  d S w || }t|  S qd S d S d S )N_seedz
seed(seed)zdef z:
	passry   z%... skipped as cannot parse signature)r  r  r   randominspect	isbuiltinrI  r
  stripexecSyntaxErrorr   r  r*   )rm   thingZdocstrlslZ	fake_implfn)DEBUGr7   r8   sig_from_np_randomS  s2   




z[TestNumbaInternalOverloads.test_signatures_match_overloaded_api.<locals>.sig_from_np_randomc                    s   dkrt d|   dd }d }zt| }W n" ty:   t| dd }r8ttj|d }r8|| kr8|}Y nw |d urt|}t|j	 }t|j	 }t
|d t| |D ]m\}	}
|	|
kr|j|	 }|j|jkr{ dkrxt d  d S dt|v r dkrt d	  d S | jr| jd
s|| |||} dkr dkrt d |rt |  d S t| dkr| jst d  d S t d  d S q] dkrt d d S d S d S )Nry   z
Checking: c           
      S   s   g }|  dt | d d}|| |d|  |d|  t|d }t|}|tjd d}|d	| d
|  dd| }	|	S )Nz from module 'r5   z' has mismatched sig.z    - expected: z    -      got: r.   r    zfrom :
)	r  r   r  getsourcelinesgetfilereplacenumba__path__r  )
ry  overload_funcfunc_sigol_sigr  r`  linenoZ
tmpsrcfilesrcfilemsgstrr7   r7   r8   create_messaget  s   

zhTestNumbaInternalOverloads.test_signatures_match_overloaded_api.<locals>.checker.<locals>.create_messager4   Fz.... skipped as positional only arguments found*z... skipped as contains *argsr"  r   z... INVALIDz$... skipped as no __module__ presentz... skipped as Numba internalz... OK)r   r  r*   r   r  r   r  r#  
parametersr$  zipr   kindPOSITIONAL_ONLYrt  r5   r  )ry  r$  r*  r%  fnameZ
maybe_funcr&  rm   r   r  r  r  r)  r  r  r7   r8   checkerp  sh   


$)zPTestNumbaInternalOverloads.test_signatures_match_overloaded_api.<locals>.checkerc                   S   r  rG   r7   r7   r7   r7   r8   r    r  zQTestNumbaInternalOverloads.test_signatures_match_overloaded_api.<locals>.<lambda>r7   _overload_funcF)r   compiler"  corer
   rA   r.  rB  Z_registriesitemsZ	functionsr  r   r3  )r@   r2  Ztyctxregskvitemr7   r1  r8   $test_signatures_match_overloaded_apiD  s   K
z?TestNumbaInternalOverloads.test_signatures_match_overloaded_apiN)r4   r5   r6   r;  r7   r7   r7   r8   r  B  r  r  __main__rG   )r  rz   r   rz  rE  r  r5  r  rf  numpyr   Zllvmliter   r"  r   r   r   r   r   Z
numba.corer   r	   r
   r   r   Znumba.core.typed_passesr   Znumba.core.registryr   Znumba.core.imputilsr   Znumba.tests.supportr   r   r   r   r   r   Znumba.core.errorsr   rj  Znumba.extendingr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   Znumba.core.typing.templatesr)   r*   r+   r,   r-   Zpdlike_usecaser/   r0   Zscipy.special.cython_specialZspecialZcython_specialrk  re  ra   r2   rb   r;   rH   rE   rc   rL   r>   rQ   rR   rd   rZ   rf   r   r  Zmydummy_type_2rh   rn   rs   r=  ro   rx   rq   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(  r*  r  r/  r0  rJ  rn  r  r  r  r  rU  r^  rp  rs  ru  rw  rx  r  r  r  r  r  r  r  r4   mainr7   r7   r7   r8   <module>   s>    P






	




1

	

	
	



"


1a    	( Y# 







@ h_- 
