U
    ,‰dt3  ã                   @   s¼  d 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 ddlmZmZmZ ddlm  m  mZ ddlmZmZmZ ddlZddlmZ e ejd¡Zd	d
„ Z dd„ Z!dd„ Z"dZ#dZ$dZ%dd„ Z&dZ'dd„ Z(e(eƒZ)e(eƒZ*dd„ Z+e+eƒZ,e+eƒZ-e .e /ej0¡e /ej0¡ej1ej1¡Z2e .e /ej3¡e /ej3¡ej1ej1¡Z4e .ej5ej5ej1ej1¡Z6G dd„ deƒZ7G dd„ deƒZ8eG dd„ deƒƒZ9e:dkr¸e ;¡  dS ) z
Tests for @cfunc and friends.
é    N)Ú
namedtuple)ÚcfuncÚcarrayÚfarrayÚnjit)ÚtypesÚtypingÚutils)ÚTestCaseÚtagÚcaptured_stderr)Únumpy_supportz4CFFI not supported -- please install the cffi modulec                 C   s   | | S ©N© ©ÚaÚbr   r   ú:/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_cfunc.pyÚadd_usecase   s    r   c                 C   s   | | }|S r   r   )r   r   Úcr   r   r   Údiv_usecase   s    r   c                 C   s   | d S )Né   r   )r   r   r   r   Úsquare_usecase"   s    r   zfloat64(float64, float64)zfloat64(int64, int64)zfloat64(float64)c                 C   s   t ƒ  | | S r   )Úobjectr   r   r   r   Úobjmode_usecase+   s    r   é   c                    s   ‡ fdd„}|S )Nc           	         s”   ˆ | ||fƒ}ˆ |t ƒ}|j|d< |j|dd…< |j|dd…< |jj|d< |jj|d< d}t ||¡D ] \}}||||f ||  7 }qf||d< d S )Nr   é   é   é   é   é   )	ÚCARRAY_USECASE_OUT_LENÚndimÚshapeÚstridesÚflagsÚc_contiguousÚf_contiguousÚnpÚndindex©	Zin_ptrZout_ptrÚmÚnZin_ÚoutÚsÚiÚj©Úfuncr   r   Úcfarray_usecase5   s    

z-make_cfarray_usecase.<locals>.cfarray_usecaser   ©r2   r3   r   r1   r   Úmake_cfarray_usecase3   s    r5   c                    s   ‡ fdd„}|S )Nc           	         sž   ˆ | ||ft jd}ˆ |tt jƒ}|j|d< |j|dd…< |j|dd…< |jj|d< |jj|d< d}t  	||¡D ] \}}||||f ||  7 }qp||d< d S )N©Údtyper   r   r   r   r   r    )
r(   Úfloat32r!   r"   r#   r$   r%   r&   r'   r)   r*   r1   r   r   r3   M   s    
z3make_cfarray_dtype_usecase.<locals>.cfarray_usecaser   r4   r   r1   r   Úmake_cfarray_dtype_usecaseJ   s    r9   c                   @   s@   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )Ú	TestCFuncc                 C   sš   t tƒtƒ}|  |jd¡ |  |jd¡ |  |jt¡ |j}|  	|t
¡ |  d|¡ |j}|  	|t¡ |j}|  t |tj¡j|¡ |  |ddƒd¡ dS )z8
        Basic usage and properties of a cfunc.
        r   ç       @g      @g      @N)r   Úadd_sigr   ÚassertEqualÚ__name__Ú__qualname__ZassertIsÚ__wrapped__Únative_nameÚassertIsInstanceÚstrÚassertInÚaddressÚintÚctypesÚcastÚc_void_pÚvalueÚassertPreciseEqual)ÚselfÚfÚsymbolÚaddrÚctr   r   r   Ú
test_basico   s    zTestCFunc.test_basicc                 C   s@   ddl m} | ¡ \}}ttƒtƒ}| |j¡}|  |d¡ d S )Nr   )Úcffi_usecasesg      @)	Znumba.testsrR   Zload_inline_moduler   Ú
square_sigr   Z_numba_test_funcptrÚcffirK   )rL   rR   ÚffiÚlibrM   Úresr   r   r   Ú	test_cffi…   s
    zTestCFunc.test_cffic                 C   s.   t tdtjidtƒ}|  | dd¡d¡ d S )Nr   )Úlocalsr   r   r;   )r   Údiv_sigr   Zint64r   rK   rG   )rL   rM   r   r   r   Útest_locals   s    zTestCFunc.test_localsc              	   C   s   t tƒtƒ}tƒ }|  | dd¡d¡ W 5 Q R X |  | ¡ d¡ tƒ }| dd¡}|  |d¡ W 5 Q R X | ¡ }|  d|¡ |  d|¡ d S )	Nr   r   g      @Ú r   g        zZeroDivisionError:zException ignored)	r   rZ   r   r   rK   rG   r=   ÚgetvaluerD   )rL   rM   ÚerrrW   r   r   r   Útest_errors•   s    zTestCFunc.test_errorsc                 C   s2   t tƒtƒ}| ¡ }|  |j|¡ |  d|¡ d S )Nzfadd double)r   r<   r   Zinspect_llvmrD   rA   )rL   rM   Zirr   r   r   Útest_llvm_ir¥   s    zTestCFunc.test_llvm_irc              	   C   s\   |   t¡ ttddtƒ W 5 Q R X |  ¡ }ttƒtƒ W 5 Q R X |  dt|j	ƒ¡ dS )z7
        Object mode is currently unsupported.
        T)ZforceobjzUntyped global name 'object'N)
ÚassertRaisesÚNotImplementedErrorr   r<   r   ÚassertTypingErrorr   rD   rC   Ú	exception)rL   Úraisesr   r   r   Útest_object_mode«   s
    
zTestCFunc.test_object_modeN)
r>   Ú
__module__r?   rQ   Úskip_cffi_unsupportedrX   r[   r_   r`   rf   r   r   r   r   r:   m   s   
	r:   c                   @   sp   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S )Ú
TestCArrayz*
    Tests for carray() and farray().
    c                 C   sH   t  dd¡ d¡ t j¡}t jtt jd}|||ƒ||ƒf|jžŽ  |S )Né
   é   ©r   r   r6   )r(   ÚarangeÚreshapeÚastyper8   Úemptyr!   r#   )rL   Úpointer_factoryr2   r   r-   r   r   r   Úrun_carray_usecase»   s    zTestCArray.run_carray_usecasec                 C   s(   |   ||¡}|   ||¡}|  ||¡ d S r   )rr   rK   )rL   rq   Úpyfuncr   ÚexpectedÚgotr   r   r   Úcheck_carray_usecaseÁ   s    zTestCArray.check_carray_usecasec                 C   s   |j  t j¡S r   )rG   Údata_asrI   ©rL   Zarrr   r   r   Úmake_voidptrÆ   s    zTestCArray.make_voidptrc                 C   s   |j  t  t j¡¡S r   )rG   rw   ÚPOINTERÚc_floatrx   r   r   r   Úmake_float32_pointerÉ   s    zTestCArray.make_float32_pointerc                 C   s   |j  t  t j¡¡S r   )rG   rw   rz   Úc_doublerx   r   r   r   Úmake_float64_pointerÌ   s    zTestCArray.make_float64_pointerc              	      s‚  ‡ fdd„}t  d¡ d¡ t j¡j|d}|ˆ  |¡|jƒ}|||ƒ |ˆ  |¡|jƒ}||| 	d¡ƒ |ˆ  |¡|j|j
ƒ}|||ƒ |ˆ  |¡|jt jƒ}|||ƒ |ˆ  |¡|j|j
ƒ}|||ƒ |ˆ  |¡|jt jƒ}||| t j¡ƒ ˆ  t¡ |ˆ  |¡|jƒ W 5 Q R X ˆ  t¡ ||jj|jƒ W 5 Q R X ˆ  t¡}|ˆ  |¡|jt jƒ W 5 Q R X ˆ  dt|jƒ¡ d S )Nc                    s$   ˆ   | |¡ ˆ  | jj|jj¡ d S r   )rK   r=   rG   Údata)ru   rt   ©rL   r   r   ÚeqÐ   s    z*TestCArray.check_carray_farray.<locals>.eqr   rl   )ÚorderÚKz%mismatching dtype 'int32' for pointer)r(   rm   rn   ro   r8   Úcopyr|   r#   ÚsizeZravelr7   ry   Úint32Úviewra   Ú	TypeErrorrG   r   rD   rC   rd   )rL   r2   r‚   r   Úbaser   re   r   r€   r   Úcheck_carray_farrayÏ   s.     



 ÿzTestCArray.check_carray_farrayc                 C   s   |   td¡ dS )z,
        Test pure Python carray().
        ÚCN)rŠ   r   r€   r   r   r   Útest_carray÷   s    zTestCArray.test_carrayc                 C   s   |   td¡ dS )z,
        Test pure Python farray().
        ÚFN)rŠ   r   r€   r   r   r   Útest_farrayý   s    zTestCArray.test_farrayc                 #   sJ   t jt jt jt jt jt jfD ](‰ t‡ fdd„|jD ƒƒ}|j	|Ž V  qdS )zŠ
        Generate a bunch of concrete signatures by varying the width
        and signedness of size arguments (see issue #1923).
        c                 3   s    | ]}|t jkrˆ n|V  qd S r   )r   Úintp)Ú.0r   ©Zactual_sizer   r   Ú	<genexpr>
  s   ÿz.TestCArray.make_carray_sigs.<locals>.<genexpr>N)
r   r   r†   ZintcÚuintpZuint32ZuintcÚtupleÚargsÚreturn_type)rL   Z
formal_sigr•   r   r‘   r   Úmake_carray_sigs  s      ÿÿzTestCArray.make_carray_sigsc              	   C   sÌ   |}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q|}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q@|  ¡ }ttƒ|ƒ}W 5 Q R X |  dt	|j
ƒ¡ |}|   t¡D ]"}t|ƒ|ƒ}|  | j||j¡ q¤d S )Nz7mismatching dtype 'float32' for pointer type 'float64*')r—   Úcarray_float32_usecase_sigr   rv   r|   rG   rc   Úcarray_float64_usecase_sigrD   rC   rd   Úcarray_voidptr_usecase_sig)rL   ZusecaseZdtype_usecasers   ÚsigrM   re   r   r   r   Úcheck_numba_carray_farray  s"    
ÿz$TestCArray.check_numba_carray_farrayc                 C   s   |   tt¡ dS )zK
        Test Numba-compiled carray() against pure Python carray()
        N)rœ   Úcarray_usecaseÚcarray_dtype_usecaser€   r   r   r   Útest_numba_carray&  s    zTestCArray.test_numba_carrayc                 C   s   |   tt¡ dS )zK
        Test Numba-compiled farray() against pure Python farray()
        N)rœ   Úfarray_usecaseÚfarray_dtype_usecaser€   r   r   r   Útest_numba_farray,  s    zTestCArray.test_numba_farrayN)r>   rg   r?   Ú__doc__rr   rv   ry   r|   r~   rŠ   rŒ   rŽ   r—   rœ   rŸ   r¢   r   r   r   r   ri   ¶   s   (ri   c                   @   s4   e Zd ZdZefdd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestCffiStructzÎ
typedef struct _big_struct {
    int    i1;
    float  f2;
    double d3;
    float  af4[9];
} big_struct;

typedef struct _error {
    int bits:4;
} error;

typedef double (*myfunc)(big_struct*, size_t);
c                 C   s    ddl m} |ƒ }| |¡ |S )Nr   )ÚFFI)rT   r¥   Zcdef)rL   Úsrcr¥   rU   r   r   r   Úget_ffiD  s    
zTestCffiStruct.get_ffic                 C   sþ   |   ¡ }| d¡}tj|dd}|  |tj¡ |  t|ƒd¡ |  | d¡tj	¡ |  | d¡tj
¡ |  | d¡tj¡ |  | d¡tjtj
d	d
¡ | d¡}tj|dd}|  |tj¡ |  |jd t |¡¡ |  |jd tj¡ |  |jtj¡ d S )NÚ
big_structT©Zuse_record_dtypeé   Úi1Úf2Úd3Úaf4)é	   )r7   r#   Úmyfuncr   r   )r§   ÚtypeofÚcffi_supportÚmap_typerB   r   ZRecordr=   Úlenr†   r8   Úfloat64ZNestedArrayr   Ú	Signaturer•   ÚCPointerr“   r–   )rL   rU   r¨   Znbtyper°   r›   r   r   r   Útest_type_parsingK  s$    
þ
z TestCffiStruct.test_type_parsingc                    s  |   ¡ }| d¡}tj|dd}tj| d¡dd}tdd„ ƒ‰ t|ƒ‡ fdd„ƒ}| d	¡}| d
|¡}tdƒD ]V}|d || _	|d || _
d| d || _tdƒD ]}	|d |	 || j|	< q¬qrt| d|¡ƒ}
| |
d¡}tj| |¡t |¡dd}ˆ |ƒ}|  ||¡ d S )Nr¨   Tr©   r°   c                 S   sH   d}t | jƒD ]4}| | }||j|j |j 7 }|| | j ¡ 7 }q|S )Nr   )Úranger…   r«   r¬   r­   r®   Úsum)r‰   Útmpr/   Úelemr   r   r   Úcalch  s    z0TestCffiStruct.test_cfunc_callback.<locals>.calcc                    s   t | |ƒ}ˆ |ƒS r   )r   )Úptrr,   r‰   ©r½   r   r   Úfooq  s    
z/TestCffiStruct.test_cfunc_callback.<locals>.foozbig_struct[3]zbig_struct*r   é{   éÕ   r   r¯   rj   Zsize_t)Úbufferr7   r#   )r§   r±   r²   r³   r   r   ÚnewrH   r¹   r«   r¬   r­   r®   rF   rG   r(   ZndarrayrÃ   r   Zas_dtyper=   )rL   rU   r¨   Znb_big_structr›   rÀ   Zmydatar¾   r/   r0   rO   ru   ÚarrayÚexpectr   r¿   r   Útest_cfunc_callbackb  s2    


ýz"TestCffiStruct.test_cfunc_callbackc              	   C   sH   |   ¡ }|  t¡}tj| d¡dd W 5 Q R X |  dt|jƒ¡ d S )NÚerrorTr©   z0field 'bits' has bitshift, this is not supported)	r§   ra   Ú
ValueErrorr²   r³   r±   r=   rC   rd   )rL   rU   re   r   r   r   Útest_unsupport_bitsize  s    þþz%TestCffiStruct.test_unsupport_bitsizeN)r>   rg   r?   Zc_sourcer§   r¸   rÇ   rÊ   r   r   r   r   r¤   3  s
   +r¤   Ú__main__)<r£   rG   ÚosÚ
subprocessÚsysÚcollectionsr   Znumpyr(   Znumbar   r   r   r   Z
numba.corer   r   r	   Znumba.core.typing.cffi_utilsÚcoreZ
cffi_utilsr²   Znumba.tests.supportr
   r   r   ZunittestZnumba.npr   Z
skipUnlessZ	SUPPORTEDrh   r   r   r   r<   rZ   rS   r   r!   r5   r   r    r9   rž   r¡   Úvoidr·   r8   r   r˜   rµ   r™   Zvoidptrrš   r:   ri   r¤   r>   Úmainr   r   r   r   Ú<module>   sd   þ
 þ
 þ ÿI}g
