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	T d dl
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 d dlmZ d d	lmZmZmZmZmZmZ d dlZzd dl Z W n e!yu   dZ Y nw d
Z"e#ej$%d e"Z&ej'(ej')e*Z+dd Z,G dd deZ-G dd deZ.eG dd de.Z/eG dd de.Z0eG dd deZ1e2dkre  dS dS )    N)skip)*)utils)main)clear_export_registry)find_shared_endingfind_pyext_ending)_external_compiler_ok)TestCasetagimport_dynamictemp_directoryhas_blasneeds_external_compilerszwindows onlywinc                   C   s   dt jv rt jd= dS dS )zVUnset MACOSX_DEPLOYMENT_TARGET because we are not building portable
    libraries
    MACOSX_DEPLOYMENT_TARGETN)osenviron r   r   </tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_pycc.pyunset_macosx_deployment_target'   s   
r   c                   @   s   e Zd Zedd ZdS )TestCompilerChecksc                 C   s>   t jdd d u}|rt jdd d ur| t d S d S d S )NCONDA_BUILDVSINSTALLDIR)r   r   get
assertTruer	   )selfis_running_conda_buildr   r   r   test_windows_compiler_validity1   s   z1TestCompilerChecks.test_windows_compiler_validityN)__name__
__module____qualname___windows_onlyr   r   r   r   r   r   .   s    r   c                   @   s*   e Zd Zdd Zdd Zejdd ZdS )BasePYCCTestc                 C   s   t   td| _| jt_d S )N	test_pycc)r   r   tmpdirtempfiletempdirr   r   r   r   setUp>   s   
zBasePYCCTest.setUpc                 C   s   d t _t  d S N)r&   r'   r   r(   r   r   r   tearDownF   s   
zBasePYCCTest.tearDownc              
   c   sZ    t j| zt|}|V  W t j| t j|d  d S t j| t j|d  w r*   )syspathappendr   removemodulespop)r   extdirnamelibr   r   r   check_c_extM   s   zBasePYCCTest.check_c_extN)r   r    r!   r)   r+   
contextlibcontextmanagerr5   r   r   r   r   r#   <   s
    r#   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestLegacyAPIc                 C   s   t jtd}dt  }t j| j|}t j|rt | tdd||gd t	|}t
ttttg|j_t|j_t
ttttg|j_t|j_t }|t|ddd | |jd	 t }|t|dd
d | |jd dS )zE
        Test creating a C shared library object using pycc.
        compile_with_pycc.pytest_dll_legacy--debug-oargsN{   A  ;    i )r   r-   join	base_pathr   r%   existsunlinkr   CDLLPOINTERc_doublec_void_pmultargtypesc_intrestypec_floatmultfbyrefassertEqualvalue)r   sourcecdll_modulename	cdll_pathr4   resr   r   r   test_pycc_ctypes_lib[   s*   

z"TestLegacyAPI.test_pycc_ctypes_libc                 C   s   |  d tjtd}d}tj| j|t  }tj|r$t| t	ddd||gd | 
| j|!}|dd	}| |d
 |dd	}| |d W d   dS 1 sYw   Y  dS )zF
        Test creating a CPython extension module using pycc.
        z0lack of environment can make the extension crashr9   test_pyext_legacyr;   z--pythonr<   r=   r?   r@   rA   rB       lVAN)skipTestr   r-   rC   rD   r%   r   rE   rF   r   r5   multiassertPreciseEqualrP   )r   rT   
modulenameout_modulenamer4   rW   r   r   r   test_pycc_pymodulew   s   


"z TestLegacyAPI.test_pycc_pymodulec                 C   s   t jtd}t j| jd}t j|rt | tddd||d gd t|d}|	 }W d	   n1 s:w   Y  d
}d}| 
|||f| d	S )z?
        Test creating a LLVM bitcode file using pycc.
        compile_with_pyccztest_bitcode_legacy.bcr;   z--llvmr<   z.pyr=   rbNs   s   BC)r   r-   rC   rD   r%   rE   rF   r   openreadr   
startswith)r   r^   bitcode_modulenamefbcbitcode_wrapper_magicbitcode_magicr   r   r   test_pycc_bitcode   s   


zTestLegacyAPI.test_pycc_bitcodeN)r   r    r!   rX   r`   rk   r   r   r   r   r8   X   s    r8   c                       s   e Zd Z fddZejdd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zeejdko4ejdv ddd Zdd Zdd Zdd Z  ZS )TestCCc                    s0   t t|   ddlm} || _t| j d S )Nr   )ra   )superrl   r)   numba.testsra   _test_moduleimpreload)r   ra   	__class__r   r   r)      s   zTestCC.setUpc                 c   sN    | j |_|  | | j |j}|V  W d    d S 1 s w   Y  d S r*   )r%   
output_dircompiler5   r3   )r   ccr4   r   r   r   check_cc_compiled   s   "zTestCC.check_cc_compiledc                 C   s>   d|j tj|jd }|d| }ttj	d|g d S )Na  if 1:
            import sys
            import types
            # to disable numba package
            sys.modules['numba'] = types.ModuleType('numba')
            try:
                from numba import njit
            except ImportError:
                pass
            else:
                raise RuntimeError('cannot disable numba package')

            sys.path.insert(0, %(path)r)
            import %(name)s as lib
            )r3   r-    -c)
r   r   r-   dirname__file__strip
subprocess
check_callr,   
executable)r   r4   codeprologr   r   r   check_cc_compiled_in_subprocess   s   z&TestCC.check_cc_compiled_in_subprocessc                 C   s   | j j}| |jd | j jj}| tj|| | j jj	}| 
tj|| | tj|d| tjdrN| |d| | t | d S d S )Npycc_test_simplezpycc_test_simple.linuxz.so)ro   rv   rR   r3   rt   r   r   r-   isdiroutput_fileassertFalserE   basenamere   r,   platformendswithassertInr   )r   rv   drg   r   r   r   test_cc_properties   s   

zTestCC.test_cc_propertiesc              	   C   s   |  | jjW}|dd}| |d |dd}| |d |d}| |d | | d  | 	t
 |dd	 W d    n1 sIw   Y  W d    d S W d    d S 1 saw   Y  d S )
Nr?   r@   rA   rB   rZ            r   )rw   ro   rv   r\   r]   rP   squareassertIsget_noneassertRaisesZeroDivisionErrordiv)r   r4   rW   r   r   r   test_compile   s   
"zTestCC.test_compilec                 C   sf   | j j}||_| |}|dd}| |d | |jjd W d    d S 1 s,w   Y  d S )Nr?   r@   rA   r   )ro   rv   
target_cpurw   r\   r]   rR   r    )r   cpu_namerv   r4   rW   r   r   r   check_compile_for_cpu   s   "zTestCC.check_compile_for_cpuc                 C   s   |  t  d S r*   )r   llget_host_cpu_namer(   r   r   r   test_compile_for_cpu   s   zTestCC.test_compile_for_cpuc                 C      |  d d S )Nhost)r   r(   r   r   r   test_compile_for_cpu_host      z TestCC.test_compile_for_cpu_hostdarwin))      )r      z4distutils incorrectly using gcc on python 3.8 buildsc                 C   s2  |  | jj}|dd}| |d ddtdfD ]}||}| |d qddtdfD ]}|	|}| |d	 q2|
d
}| |d | |d|d |d}tjd }| || |tdgd }| |d dd|i }| || W d    d S 1 sw   Y  d S )N   r      y              y              ?         @       @      ?g      <*   r   r   aR  if 1:
                from numpy.testing import assert_equal, assert_allclose
                res = lib.power(2, 7)
                assert res == 128
                res = lib.random(42)
                assert_allclose(res, %(expected)s)
                res = lib.spacing(1.0)
                assert_allclose(res, 2**-52)
                expected)rw   ro   cc_helperlibpowerr]   np
complex128sqrtfloat64np_sqrtspacingassertNotEqualrandomRandomStaterandom_samplesizer   r   r4   rW   valr   r   r   r   r   test_compile_helperlib   s,   



	"zTestCC.test_compile_helperlibc                 C   s   |  | jjR}| |dd |d}| t|g d tr-|	d}| |d t
g d}||}t
|}| || dttd	 }| || W d    d S 1 s\w   Y  d S )
Nr   g        r   )r   r   r   r   g      >@)r   g      @r   g      @r   aB  if 1:
                from numpy.testing import assert_equal
                from numpy import float64, argsort
                res = lib.zero_scalar(1)
                assert res == 0.0
                res = lib.zeros(3)
                assert list(res) == [0, 0, 0]
                if %(has_blas)s:
                    res = lib.vector_dot(4)
                    assert res == 30.0
                val = float64([2., 5., 1., 3., 4.])
                res = lib.np_argsort(val)
                expected = argsort(val)
                assert_equal(res, expected)
                )r   )rw   ro   cc_nrtr]   zero_scalarzerosrR   listr   
vector_dotr   r   
np_argsortargsortdictr   r   r   r   r   test_compile_nrt  s    



"zTestCC.test_compile_nrtc                 C   sv   |  | jj*}| }| |td |d}| |td d}| || W d    d S 1 s4w   Y  d S )NAzif 1:
                from numpy.testing import assert_equal
                res = lib.hash_literal_str_A()
                assert_equal(res, hash("A"))
                res = lib.hash_str("A")
                assert_equal(res, hash("A"))
                )rw   ro   r   hash_literal_str_Ar]   hashhash_strr   )r   r4   rW   r   r   r   r   test_hashing7  s   
"zTestCC.test_hashingc                 C   sb   |  | jj }tjdtjd}||}|| }| || W d    d S 1 s*w   Y  d S )Nr   )dtype)rw   ro   r   r   arangeintpdict_usecaser]   )r   r4   arrgotexpectr   r   r   test_c_extension_usecaseG  s   
"zTestCC.test_c_extension_usecase)r   r    r!   r)   r6   r7   rw   r   r   r   r   r   r   unittestskipIfr,   r   r   	PYVERSIONr   r   r   r   __classcell__r   r   rr   r   rl      s$    
	
  rl   c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Ze	e
du ddd Ze	e
du ddd ZdS )TestDistutilsSupportc                 C   sB   t   td| _tjtd}tj| jd| _t	|| j d S )Ntest_pycc_distutilspycc_distutils_usecasework)
r   r   r%   r   r-   rC   rD   usecase_dirshutilcopytree)r   
source_dirr   r   r   r)   S  s
   
zTestDistutilsSupport.setUpc                       dd l }tjtjtj|j}ttj  ddr*|tj	  d   d< n| d<  fdd}||ddg d}|d	|g d S )
Nr   
PYTHONPATH c                    \   t jtjg|  jt jt j d}| \}}| }|dkr,	d|
dd  d S d S N)cwdstdoutstderrenvr   z+python failed with the following output:
%szutf-8ignorer}   Popenr,   r   r   PIPESTDOUTcommunicatewaitfaildecoder>   pout_rcr   r   r   r   
run_pythonh     

z7TestDistutilsSupport.check_setup_py.<locals>.run_python	build_ext	--inplacezif 1:
            import pycc_compiled_module as lib
            assert lib.get_const() == 42
            res = lib.ones(3)
            assert list(res) == [1.0, 1.0, 1.0]
            ry   
numbar   r-   abspathrz   r{   r   r   r   pathsepr   setup_py_filer   
numba_pathr   r   r   r   r   check_setup_py]     
z#TestDistutilsSupport.check_setup_pyc                    r   )
Nr   r   r   c                    r   r   r   r   r   r   r   r     r   z>TestDistutilsSupport.check_setup_nested_py.<locals>.run_pythonr   r   zif 1:
            import nested.pycc_compiled_module as lib
            assert lib.get_const() == 42
            res = lib.ones(3)
            assert list(res) == [1.0, 1.0, 1.0]
            ry   r   r  r   r   r   check_setup_nested_py}  r  z*TestDistutilsSupport.check_setup_nested_pyc                 C   r   )Nzsetup_distutils.pyr  r(   r   r   r   test_setup_py_distutils     z,TestDistutilsSupport.test_setup_py_distutilsc                 C   r   )Nzsetup_distutils_nested.pyr  r(   r   r   r   test_setup_py_distutils_nested  r	  z3TestDistutilsSupport.test_setup_py_distutils_nestedNztest needs setuptoolsc                 C   r   )Nzsetup_setuptools.pyr  r(   r   r   r   test_setup_py_setuptools  r   z-TestDistutilsSupport.test_setup_py_setuptoolsc                 C   r   )Nzsetup_setuptools_nested.pyr
  r(   r   r   r   test_setup_py_setuptools_nested  r   z4TestDistutilsSupport.test_setup_py_setuptools_nested)r   r    r!   r)   r  r  r  r  r   r   
setuptoolsr  r  r   r   r   r   r   P  s    
  
r   __main__)3r6   rp   r   r   r}   r,   r&   r   r   ctypesnumpyr   llvmlite.bindingbindingr   
numba.corer   
numba.pyccr   numba.pycc.decoratorsr   numba.pycc.platformr   r   r	   numba.tests.supportr
   r   r   r   r   r   r  ImportError_skip_reasonr   r   re   r"   r-   rz   r   r{   rD   r   r   r#   r8   rl   r   r   r   r   r   r   <module>   sR     H /[