§
    2@Äj¾a  ã            	       óÖ  — 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
T d dl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mZmZmZ d dlmZ d dlZdZ ej        ej          !                    d¦  «         e¦  «        Z"ej#         $                    ej#         %                    e&¦  «        ¦  «        Z'd	„ Z(ee G d
„ de¦  «        ¦   «         ¦   «         Z) G d„ de¦  «        Z*e G d„ de¦  «        ¦   «         Z+eee G d„ de+¦  «        ¦   «         ¦   «         ¦   «         Z,eeee G d„ de¦  «        ¦   «         ¦   «         ¦   «         ¦   «         Z-e.dk    r ej/        ¦   «          dS dS )é    N)Úmock)Ú*)Úutils)	ÚTestCaseÚimport_dynamicÚtemp_directoryÚhas_blasÚneeds_setuptoolsÚskip_if_py313plus_on_windowsÚskip_if_linux_aarch64Úskip_if_freethreadingÚskip_if_windows)Úcextzwindows onlyÚwinc                  ó@   — 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© ó    úFC:\Projects\Historical\venv\Lib\site-packages\numba/tests/test_pycc.pyÚunset_macosx_deployment_targetr   "   s*   € ð "¥R¤ZÐ/Ð/ÝŒJÐ1Ð2Ð2Ð2ð 0Ð/r   c                   ó$   — e Zd Zed„ ¦   «         ZdS )ÚTestCompilerChecksc                 óÜ   — ddl m} t          j                             dd ¦  «        d u}|r?t          j                             dd ¦  «        �!|                       |¦   «         ¦  «         d S d S d S )Nr   )Úexternal_compiler_worksÚCONDA_BUILDÚVSINSTALLDIR)Únumba.pycc.platformr   r   r   ÚgetÚ
assertTrue)Úselfr   Úis_running_conda_builds      r   Útest_windows_compiler_validityz1TestCompilerChecks.test_windows_compiler_validity/   s‚   € ð 	@Ð?Ð?Ð?Ð?Ð?Ý!#¤§¢°¸tÑ!DÔ!DÈDÐ!PÐØ!ð 	;ÝŒz�~Š~˜n¨dÑ3Ô3Ð?Ø—’Ð 7Ð 7Ñ 9Ô 9Ñ:Ô:Ð:Ð:Ð:ð	;ð 	;Ø?Ð?r   N)Ú__name__Ú
__module__Ú__qualname__Ú_windows_onlyr$   r   r   r   r   r   *   s/   € € € € € ð
 ð;ð ;ñ „]ð;ð ;ð ;r   r   c                   ó   — e Zd Zd„ ZdS )ÚTestExtensionLibsc                 ó`  ‡— g d¢}t          j        ¦   «         Št          j        d|¬¦  «        5  t          j        ¦   «         }d d d ¦  «         n# 1 swxY w Y   t          ˆfd„|D ¦   «         ¦  «        }|                      ||¦  «         |                      |t          |¦  «        ¦  «         d S )N)zsetobject.czlistobject.czutils.czdictobject.cz
README.txtznumba.cext.os.listdir)Úreturn_valuec              3   ó‚   •K  — | ]9}|                      d ¦  «        ¯t          j                             ‰|¦  «        V — Œ:dS )z.cN)Úendswithr   ÚpathÚjoin)Ú.0ÚfnÚbases     €r   ú	<genexpr>zFTestExtensionLibs.test_get_extension_libs_is_sorted.<locals>.<genexpr>G   sX   øè è € ð 
ð 
Ø')¸R¿[º[ÈÑ=NÔ=Nð
ÝŒG�LŠL˜˜rÑ"Ô"ð
ð 
ð 
ð 
ð 
ð 
r   )r   Úget_pathr   ÚpatchÚget_extension_libsÚsortedÚassertEqual)r"   Úfake_listingÚlibsÚexpectedr3   s       @r   Ú!test_get_extension_libs_is_sortedz3TestExtensionLibs.test_get_extension_libs_is_sorted@   s	  ø€ ð6ð 6ð 6ˆåŒ}‰ŒˆÝŒZÐ/¸lÐKÑKÔKð 	-ð 	-ÝÔ*Ñ,Ô,ˆDð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-õ ð 
ð 
ð 
ð 
Ø-9ð
ñ 
ô 
ñ 
ô 
ˆð 	×Ò˜˜xÑ(Ô(Ð(Ø×Ò˜�v d™|œ|Ñ,Ô,Ð,Ð,Ð,s   ¯AÁAÁAN)r%   r&   r'   r=   r   r   r   r*   r*   >   s#   € € € € € ð-ð -ð -ð -ð -r   r*   c                   ó:   — e Zd Zd„ Zd„ Zej        d„ ¦   «         ZdS )ÚBasePYCCTestc                 ól   — t          ¦   «          t          d¦  «        | _        | j        t          _        d S )NÚ	test_pycc)r   r   ÚtmpdirÚtempfileÚtempdir©r"   s    r   ÚsetUpzBasePYCCTest.setUpQ   s/   € Ý&Ñ(Ô(Ð(å$ [Ñ1Ô1ˆŒð  œ;�ÔÐÐr   c                 ó>   — d t           _        ddlm}  |¦   «          d S )Nr   )Úclear_export_registry)rC   rD   Únumba.pycc.decoratorsrH   )r"   rH   s     r   ÚtearDownzBasePYCCTest.tearDownY   s4   € Ø�Ôð 	@Ð?Ð?Ð?Ð?Ð?ØÐÑÔÐÐÐr   c              #   óv  K  — t           j                             |¦  «         	 t          |¦  «        }|V — t           j                             |¦  «         t           j                             |d ¦  «         d S # t           j                             |¦  «         t           j                             |d ¦  «         w xY w©N)Úsysr/   Úappendr   ÚremoveÚmodulesÚpop)r"   ÚextdirÚnameÚlibs       r   Úcheck_c_extzBasePYCCTest.check_c_extd   s˜   è è € åŒ�Š˜ÑÔÐð	(Ý  Ñ&Ô&ˆCØˆIˆIˆIåŒH�OŠO˜FÑ#Ô#Ð#ÝŒK�OŠO˜D $Ñ'Ô'Ð'Ð'Ð'øõ ŒH�OŠO˜FÑ#Ô#Ð#ÝŒK�OŠO˜D $Ñ'Ô'Ð'Ð'øøøs   £A7 Á7AB8N)r%   r&   r'   rF   rJ   Ú
contextlibÚcontextmanagerrU   r   r   r   r?   r?   N   sQ   € € € € € ð'ð 'ð 'ð	 ð 	 ð 	 ð Ôð(ð (ñ Ôð(ð (ð (r   r?   c                   ó\  ‡ — e Zd Zˆ fd„Zej        d„ ¦   «         Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zed„ ¦   «         Zej        ed„ ¦   «         ¦   «         Zej        ed„ ¦   «         ¦   «         Zej        ed„ ¦   «         ¦   «         Zeej        d„ ¦   «         ¦   «         Zd„ Zˆ xZS )ÚTestCCc                 óÊ   •— t          t          | ¦  «                             ¦   «          |                      ¦   «          ddlm} || _        t          j        | j        ¦  «         d S )Nr   )Úcompile_with_pycc)	ÚsuperrY   rF   Úskip_if_no_external_compilerÚnumba.testsr[   Ú_test_moduleÚ	importlibÚreload)r"   r[   Ú	__class__s     €r   rF   zTestCC.setUpt   se   ø€ Ý�f�dÑÔ×!Ò!Ñ#Ô#Ð#Ø×)Ò)Ñ+Ô+Ð+Ø1Ð1Ð1Ð1Ð1Ð1Ø-ˆÔÝÔ˜Ô*Ñ+Ô+Ð+Ð+Ð+r   c              #   óÄ   K  — | j         |_        |                     ¦   «          |                      | j         |j        ¦  «        5 }|V — d d d ¦  «         d S # 1 swxY w Y   d S rL   )rB   Ú
output_dirÚcompilerU   rS   )r"   ÚccrT   s      r   Úcheck_cc_compiledzTestCC.check_cc_compiled{   s¢   è è € ð œˆŒØ
�
Š
‰Œˆà×Ò˜dœk¨2¬7Ñ3Ô3ð 	°sØˆIˆIˆIð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ÁAÁAÁAc                 óÖ   — d|j         t          j                             |j        ¦  «        dœz  }|                     d¦  «        |z   }t          j        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
            )rS   r/   ú ú-c)
r%   r   r/   ÚdirnameÚ__file__ÚstripÚ
subprocessÚ
check_callrM   Ú
executable)r"   rT   ÚcodeÚprologs       r   Úcheck_cc_compiled_in_subprocessz&TestCC.check_cc_compiled_in_subprocess„   sj   € ðð œ<Ýœ7Ÿ?š?¨3¬<Ñ8Ô8ð:ð :ñ:ˆð  �|Š|˜CÑ Ô  4Ñ'ˆÝÔ�sœ~¨t°TÐ:Ñ;Ô;Ð;Ð;Ð;r   c                 óÌ  — | j         j        }|                      |j        d¦  «         | j         j        j        }|                      t          j                             |¦  «        |¦  «         | j         j        j	        }|  
                    t          j                             |¦  «        |¦  «         |                      t          j                             |¦  «                             d¦  «        |¦  «         t          j                             d¦  «        rO|                      |                     d¦  «        |¦  «         ddlm} |                       |¦   «         |¦  «         d S d S )NÚpycc_test_simplezpycc_test_simple.Úlinuxz.sor   )Úfind_pyext_ending)r_   rf   r9   rS   rd   r!   r   r/   ÚisdirÚoutput_fileÚassertFalseÚexistsÚbasenameÚ
startswithrM   Úplatformr.   r   rw   ÚassertIn)r"   rf   ÚdÚfrw   s        r   Útest_cc_propertieszTestCC.test_cc_properties˜   s9  € ØÔÔ!ˆØ×Ò˜œÐ"4Ñ5Ô5Ð5ð ÔÔ Ô+ˆØ�Š�œŸš aÑ(Ô(¨!Ñ,Ô,Ð,ð ÔÔ Ô,ˆØ×Ò�œŸš¨Ñ*Ô*¨AÑ.Ô.Ð.Ø�Š�œ×(Ò(¨Ñ+Ô+×6Ò6Ð7JÑKÔKÈQÑOÔOÐOÝŒ<×"Ò" 7Ñ+Ô+ð 	2Ø�OŠO˜AŸJšJ uÑ-Ô-¨qÑ1Ô1Ð1ð >Ð=Ð=Ð=Ð=Ð=Ø�MŠMÐ+Ð+Ñ-Ô-¨qÑ1Ô1Ð1Ð1Ð1ð	2ð 	2r   c                 ó\  — |                       | j        j        ¦  «        5 }|                     dd¦  «        }|                      |d¦  «         |                     dd¦  «        }|                      |d¦  «         |                     d¦  «        }|                      |d¦  «         |                      |                     ¦   «         d ¦  «         |  	                    t          ¦  «        5  |                     dd	¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )
Né{   éA  é;š  iÛ  g    lVAé   é   é   r   )rg   r_   rf   ÚmultiÚassertPreciseEqualÚmultfÚsquareÚassertIsÚget_noneÚassertRaisesÚZeroDivisionErrorÚdiv)r"   rT   Úress      r   Útest_compilezTestCC.test_compile«   s‹  € Ø×#Ò# DÔ$5Ô$8Ñ9Ô9ð 		¸SØ—)’)˜C Ñ%Ô%ˆCØ×#Ò# C¨Ñ3Ô3Ð3Ø—)’)˜C Ñ%Ô%ˆCØ×#Ò# C¨Ñ7Ô7Ð7Ø—*’*˜Q‘-”-ˆCØ×#Ò# C¨Ñ,Ô,Ð,Ø�MŠM˜#Ÿ,š,™.œ.¨$Ñ/Ô/Ð/Ø×"Ò"Õ#4Ñ5Ô5ð ð Ø—’˜˜1‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		s6    CD!Ã&D	Ã=D!Ä	D	ÄD!ÄD	ÄD!Ä!D%Ä(D%c                 ó   — | j         j        }||_        |                      |¦  «        5 }|                     dd¦  «        }|                      |d¦  «         |                      |j        j        d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr„   r…   r†   ru   )r_   rf   Ú
target_cpurg   rŠ   r‹   r9   r&   )r"   Úcpu_namerf   rT   r“   s        r   Úcheck_compile_for_cpuzTestCC.check_compile_for_cpu·   sá   € ØÔÔ!ˆØ ˆŒà×#Ò# BÑ'Ô'ð 	G¨3Ø—)’)˜C Ñ%Ô%ˆCØ×#Ò# C¨Ñ3Ô3Ð3Ø×Ò˜SœYÔ1Ð3EÑFÔFÐFð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gs   ©ABÂBÂ
Bc                 óR   — |                       t          j        ¦   «         ¦  «         d S rL   )r˜   ÚllÚget_host_cpu_namerE   s    r   Útest_compile_for_cpuzTestCC.test_compile_for_cpuÀ   s%   € à×"Ò"¥2Ô#7Ñ#9Ô#9Ñ:Ô:Ð:Ð:Ð:r   c                 ó0   — |                       d¦  «         d S )NÚhost)r˜   rE   s    r   Útest_compile_for_cpu_hostz TestCC.test_compile_for_cpu_hostÄ   s   € à×"Ò" 6Ñ*Ô*Ð*Ð*Ð*r   c                 ó$  — |                       | j        j        ¦  «        5 }|                     dd¦  «        }|                      |d¦  «         ddt          j        d¦  «        fD ]-}|                     |¦  «        }|                      |d¦  «         Œ.ddt          j        d¦  «        fD ]-}| 	                    |¦  «        }|                      |d	¦  «         Œ.| 
                    d
¦  «        }|                      |d¦  «         |                      |                     d¦  «        |                     d¦  «        ¦  «         |                     d¦  «        }t
          j                             d¦  «                             ¦   «         }|                      ||¦  «         |                     t          j        dgdz  ¦  «        ¦  «        }|                      |d¦  «         dd|iz  }|                      ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Né   é   é€   éÿÿÿÿy      ð¿        y              ð?é   ç      @ç       @ç      ð?g      °<é*   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)
                r<   )rg   r_   Úcc_helperlibÚpowerr‹   ÚnpÚ
complex128ÚsqrtÚfloat64Únp_sqrtÚspacingÚassertNotEqualÚrandomÚRandomStateÚrandom_sampleÚsizers   ©r"   rT   r“   Úvalr<   rq   s         r   Útest_compile_helperlibzTestCC.test_compile_helperlibÈ   s2  € Ø×#Ò# DÔ$5Ô$BÑCÔCð 	<ÀsØ—)’)˜A˜q‘/”/ˆCØ×#Ò# C¨Ñ-Ô-Ð-Ø˜G¥R¤]°2Ñ%6Ô%6Ð7ð 1ð 1�Ø—h’h˜s‘m”m�Ø×'Ò'¨¨RÑ0Ô0Ð0Ð0Ø˜3¥¤
¨1¡¤Ð.ð 2ð 2�Ø—k’k #Ñ&Ô&�Ø×'Ò'¨¨SÑ1Ô1Ð1Ð1Ø—+’+˜cÑ"Ô"ˆCØ×#Ò# C¨Ñ0Ô0Ð0ð ×Ò §
¢
¨2¡¤°·
²
¸2±´Ñ?Ô?Ð?Ø—*’*˜R‘.”.ˆCÝ”y×,Ò,¨RÑ0Ô0×>Ò>Ñ@Ô@ˆHØ×#Ò# C¨Ñ2Ô2Ð2Ø—(’(�2œ: q c¨A¡gÑ.Ô.Ñ/Ô/ˆCØ×#Ò# C¨Ñ+Ô+Ð+ðð " 8Ð,ñ-ˆDð ×0Ò0°°dÑ;Ô;Ð;ð;	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s    GHÈH	ÈH	c                 ó¦  — |                       | j        j        ¦  «        5 }|                      |                     d¦  «        d¦  «         |                     d¦  «        }|                      t          |¦  «        g d¢¦  «         t          r+| 	                    d¦  «        }|                      |d¦  «         t          j        g d¢¦  «        }|                     |¦  «        }t          j        |¦  «        }|                      ||¦  «         dt          t          ¬	¦  «        z  }|                      ||¦  «         d d d ¦  «         d S # 1 swxY 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	   )rg   r_   Úcc_nrtr‹   Úzero_scalarÚzerosr9   Úlistr	   Ú
vector_dotr­   r°   Ú
np_argsortÚargsortÚdictrs   r¸   s         r   Útest_compile_nrtzTestCC.test_compile_nrtè   s{  € Ø×#Ò# DÔ$5Ô$<Ñ=Ô=ð 	<Àà×#Ò# C§O¢O°AÑ$6Ô$6¸Ñ<Ô<Ð<Ø—)’)˜A‘,”,ˆCØ×Ò�T #™YœY¨	¨	¨	Ñ2Ô2Ð2Ýð 3Ø—n’n QÑ'Ô'�Ø×'Ò'¨¨TÑ2Ô2Ð2å”*Ð1Ð1Ð1Ñ2Ô2ˆCØ—.’. Ñ%Ô%ˆCÝ”z #‘”ˆHØ×#Ò# C¨Ñ2Ô2Ð2ðõ ¥HÐ-Ñ-Ô-ñ.ˆDð ×0Ò0°°dÑ;Ô;Ð;ð;	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s    DEÅE
ÅE
c                 ó„  — |                       | j        j        ¦  «        5 }|                     ¦   «         }|                      |t          d¦  «        ¦  «         |                     d¦  «        }|                      |t          d¦  «        ¦  «         d}|                      ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NÚAzþif 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"))
                )rg   r_   r¼   Úhash_literal_str_Ar‹   ÚhashÚhash_strrs   )r"   rT   r“   rq   s       r   Útest_hashingzTestCC.test_hashing  sö   € Ø×#Ò# DÔ$5Ô$<Ñ=Ô=ð 	<ÀØ×(Ò(Ñ*Ô*ˆCØ×#Ò# C­¨c©¬Ñ3Ô3Ð3Ø—,’,˜sÑ#Ô#ˆCØ×#Ò# C­¨c©¬Ñ3Ô3Ð3ðˆDð ×0Ò0°°dÑ;Ô;Ð;ð	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð 	<ð 	<s    BB5Â5B9Â<B9c                 ó  — |                       | j        j        ¦  «        5 }t          j        dt          j        ¬¦  «        }|                     |¦  «        }||z  }|                      ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr£   ©Údtype)rg   r_   r¼   r­   ÚarangeÚintpÚdict_usecaser‹   )r"   rT   ÚarrÚgotÚexpects        r   Útest_c_extension_usecasezTestCC.test_c_extension_usecase  sÅ   € à×#Ò# DÔ$5Ô$<Ñ=Ô=ð 	1ÀÝ”)˜C¥r¤wÐ/Ñ/Ô/ˆCØ×"Ò" 3Ñ'Ô'ˆCØ˜3‘YˆFØ×#Ò# C¨Ñ0Ô0Ð0ð		1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s    AA>Á>BÂBc                 óJ   ‡ ‡‡‡— ddl Šˆˆˆˆ fd„} |¦   «          |¦   «         fS )a  Compile the CC defined by ``build_script`` in two fresh
        subprocesses and return the MD5 of each produced shared object.

        Re-running compilation in the same process re-uses the same
        Python objects, so any ``id(obj)``-based names happen to match
        by accident. To exercise the non-determinism path we must build
        in two fresh subprocesses.
        r   Nc                  ó~  •— t          j        ‰j        ¬¦  «        } t          j        t
          j        d‰| g¦  «         t          t          j	         
                    | ‰¦  «        d¦  «        5 }‰                     |                     ¦   «         ¦  «                             ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )N©Údirrj   Úrb)rC   ÚmkdtemprB   rn   ro   rM   rp   Úopenr   r/   r0   Úmd5ÚreadÚ	hexdigest)ÚoutdirÚfhÚbuild_scriptÚhashlibÚout_namer"   s     €€€€r   Úbuildz/TestCC._check_reproducible_build.<locals>.build+  sá   ø€ ÝÔ%¨$¬+Ð6Ñ6Ô6ˆFÝÔ!Ý”  |°VÐ<ñô ð õ •b”g—l’l 6¨8Ñ4Ô4°dÑ;Ô;ð :¸rØ—{’{ 2§7¢7¡9¤9Ñ-Ô-×7Ò7Ñ9Ô9ð:ð :ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð :ð :s   Á,9B2Â2B6Â9B6)râ   )r"   rá   rã   rä   râ   s   ``` @r   Ú_check_reproducible_buildz TestCC._check_reproducible_build   sR   øøøø€ ð 	ˆˆˆð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð ˆu‰wŒw˜˜™œÐÐr   c                 óš   — dt           ›d�}|                      || j        j        j        ¦  «        \  }}|                      ||d¦  «         dS )zÁSee https://github.com/numba/numba/issues/10610

        AOT-compiled extensions should be byte-for-byte reproducible
        across independent processes that compile the same source.
        zimport sys
sys.path.insert(0, z¤)
import importlib
from numba.tests import compile_with_pycc
importlib.reload(compile_with_pycc)
cc = compile_with_pycc.cc
cc.output_dir = sys.argv[1]
cc.compile()
z,AOT binary is not reproducible across buildsN)Ú	base_pathrå   r_   rf   ry   r9   )r"   ÚscriptÚh1Úh2s       r   Útest_reproducible_buildzTestCC.test_reproducible_build7  sm   € € õ  ˆYˆYð	ˆð ×/Ò/Ø�DÔ%Ô(Ô4ñ
ô 
‰ˆˆBð 	×Ò˜˜RØGñ	Iô 	Ið 	Ið 	Ið 	Ir   c                 óº   — t          j        d¦  «        }ddlm}  |d¦  «        j        }|                      ||¦  «        \  }}|                      ||d¦  «         dS )a%  See https://github.com/numba/numba/issues/10610

        AOT modules that use ``@jitclass`` previously embedded
        ``id(ClassType)`` into the mangled LLVM symbol names (via
        ``numba.core.types.misc.ClassType.__init__``), making the
        emitted binary non-reproducible.
        aa  
            import sys
            from numba.pycc import CC
            from numba.experimental import jitclass
            from numba import types

            @jitclass([('x', types.int64)])
            class Foo:
                def __init__(self, v):
                    self.x = v
                def get(self):
                    return self.x

            cc = CC('aot_repro_jitclass')
            cc.use_nrt = True

            @cc.export('use_foo', 'i8(i8)')
            def use_foo(v):
                return Foo(v).get()

            cc.output_dir = sys.argv[1]
            cc.compile()
        r   ©ÚCCÚaot_repro_jitclassz'AOT jitclass binary is not reproducibleN©ÚtextwrapÚdedentÚ
numba.pyccrî   ry   rå   r9   ©r"   rè   rî   rã   ré   rê   s         r   Ú test_reproducible_build_jitclassz'TestCC.test_reproducible_build_jitclassN  sˆ   € õ ”ð "ñ ô ˆð. 	"Ð!Ð!Ð!Ð!Ð!Ø�2Ð*Ñ+Ô+Ô7ˆØ×/Ò/°¸ÑAÔA‰ˆˆBØ×Ò˜˜RØBñ	Dô 	Dð 	Dð 	Dð 	Dr   c                 óº   — t          j        d¦  «        }ddlm}  |d¦  «        j        }|                      ||¦  «        \  }}|                      ||d¦  «         dS )aB  See https://github.com/numba/numba/issues/10610

        AOT modules that use a recursive (deferred) jitclass previously
        embedded both ``id(ClassType)`` and ``id(DeferredType)`` into
        the mangled LLVM symbol names (see ``numba.core.types.misc``),
        making the emitted binary non-reproducible.
        aR  
            import sys
            from numba.pycc import CC
            from numba.experimental import jitclass
            from numba import types, deferred_type, optional

            node_type = deferred_type()

            @jitclass([('value', types.int64),
                       ('next', optional(node_type))])
            class Node:
                def __init__(self, v):
                    self.value = v
                    self.next = None

            node_type.define(Node.class_type.instance_type)

            cc = CC('aot_repro_recursive')
            cc.use_nrt = True

            @cc.export('mklen', 'i8(i8)')
            def mklen(n):
                head = Node(0)
                cur = head
                for i in range(1, n):
                    nxt = Node(i)
                    cur.next = nxt
                    cur = nxt
                count = 0
                p = head
                while p is not None:
                    count += 1
                    p = p.next
                return count

            cc.output_dir = sys.argv[1]
            cc.compile()
        r   rí   Úaot_repro_recursivez-AOT recursive-type binary is not reproducibleNrð   rô   s         r   Ú&test_reproducible_build_recursive_typez-TestCC.test_reproducible_build_recursive_typeu  s‰   € õ ”ð %"ñ %ô %ˆðL 	"Ð!Ð!Ð!Ð!Ð!Ø�2Ð+Ñ,Ô,Ô8ˆØ×/Ò/°¸ÑAÔA‰ˆˆBØ×Ò˜˜RØHñ	Jô 	Jð 	Jð 	Jð 	Jr   c                 óº   — t          j        d¦  «        }ddlm}  |d¦  «        j        }|                      ||¦  «        \  }}|                      ||d¦  «         dS )a  See https://github.com/numba/numba/issues/10610

        AOT modules that use ``@stencil`` previously embedded
        ``hex(id(the_array))`` into the generated stencil function
        name (see ``numba.stencils.stencil``), making the emitted
        binary non-reproducible.
        aÌ  
            import sys
            from numba import stencil
            from numba.pycc import CC

            @stencil
            def kernel(a):
                return 0.25 * (a[-1] + a[1] + a[0] + a[0])

            cc = CC('aot_repro_stencil')
            cc.use_nrt = True

            @cc.export('blur', 'f8[:](f8[:])')
            def blur(a):
                return kernel(a)

            cc.output_dir = sys.argv[1]
            cc.compile()
        r   rí   Úaot_repro_stencilz&AOT stencil binary is not reproducibleNrð   rô   s         r   Útest_reproducible_build_stencilz&TestCC.test_reproducible_build_stencil«  sˆ   € õ ”ð "ñ ô ˆð& 	"Ð!Ð!Ð!Ð!Ð!Ø�2Ð)Ñ*Ô*Ô6ˆØ×/Ò/°¸ÑAÔA‰ˆˆBØ×Ò˜˜RØAñ	Cô 	Cð 	Cð 	Cð 	Cr   c                 óà   ‡ ‡‡‡‡— ddl ŠddlŠt          j        d¦  «        Šddlm}  |d¦  «        j        Šˆˆˆˆˆ fd„} |d¦  «        } |d¦  «        }‰                      ||d¦  «         dS )	aä  See https://github.com/numba/numba/issues/10610

        AOT modules where two @jitclass classes share the same ``__name__``
        and are created inside a set-of-strings iteration must produce
        byte-for-byte identical binaries regardless of PYTHONHASHSEED.

        Seeds 0 and 2 are known to produce different frozenset({"int64",
        "float64"}) iteration orders on CPython, so they reliably expose any
        counter-based (ordering-dependent) naming scheme.
        r   Naá  
            import sys
            from numba.pycc import CC
            from numba.experimental import jitclass
            from numba import types

            cc = CC('aot_counter_nondeterminism')
            cc.use_nrt = True

            # frozenset of strings: iteration order varies with PYTHONHASHSEED.
            # Both strings map to a distinct field type; the jitclass named
            # "Foo" is created for each in that (non-deterministic) order.
            # A content-based naming scheme must assign the same tag to the
            # int64 variant regardless of which string comes first.
            int64_Foo = None
            for key in frozenset({"int64", "float64"}):
                ft = types.int64 if key == "int64" else types.float64

                @jitclass([("x", ft)])
                class Foo:
                    def __init__(self, v):
                        self.x = v
                    def get(self):
                        return self.x

                if key == "int64":
                    int64_Foo = Foo

            @cc.export("use_int_foo", "i8(i8)")
            def use_int_foo(v):
                return int64_Foo(v).get()

            cc.output_dir = sys.argv[1]
            cc.compile()
        rí   Úaot_counter_nondeterminismc                 ó¬  •— t          j        ‰j        ¬¦  «        }i ‰j        ¥dt	          | ¦  «        i¥}t          j        t          j        d‰|g|¬¦  «         t          ‰j
                             |‰¦  «        d¦  «        5 }‰                     |                     ¦   «         ¦  «                             ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )Nr×   ÚPYTHONHASHSEEDrj   )ÚenvrÙ   )rC   rÚ   rB   r   Ústrrn   ro   rM   rp   rÛ   r/   r0   rÜ   rÝ   rÞ   )	Úseedrß   r   rà   râ   r   rã   rè   r"   s	       €€€€€r   Úbuild_with_seedzKTestCC.test_reproducible_build_set_iteration_order.<locals>.build_with_seed  s  ø€ ÝÔ%¨$¬+Ð6Ñ6Ô6ˆFØ=�R”ZÐ=Ð!1µ3°t±9´9Ð=Ð=ˆCÝÔ!Ý”  v¨vÐ6¸Cðñ ô ð õ �b”g—l’l 6¨8Ñ4Ô4°dÑ;Ô;ð :¸rØ—{’{ 2§7¢7¡9¤9Ñ-Ô-×7Ò7Ñ9Ô9ð:ð :ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð :ð :s   Â9C	Ã	CÃCr¡   uZ   AOT binary differs across PYTHONHASHSEED values â€” ClassType naming is ordering-dependent)râ   r   rñ   rò   ró   rî   ry   r9   )	r"   rî   r  Úh0rê   râ   r   rã   rè   s	   `    @@@@r   Ú+test_reproducible_build_set_iteration_orderz2TestCC.test_reproducible_build_set_iteration_orderÎ  sÝ   øøøøø€ ð 	ÐÐÐÐÐÐÐå”ð ""ñ "ô "ˆðH 	"Ð!Ð!Ð!Ð!Ð!Ø�2Ð2Ñ3Ô3Ô?ˆð	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð ˆ_˜QÑÔˆØˆ_˜QÑÔˆØ×Ò˜˜RðBñ	Cô 	Cð 	Cð 	Cð 	Cr   c                 óæ  — |                       | j        j        ¦  «        5 }t          j        dt          j        ¬¦  «        }t          j        dt          j        ¬¦  «        }|                     ||¦  «         |                      ||¦  «         t          j        dt          j        ¬¦  «        }| 	                    ||¦  «         |                      ||¦  «         t          j        dt          j        ¬¦  «        }t          j        dt          j        ¬¦  «        }|  
                    t          ¦  «        5 }|                     ||¦  «         ddd¦  «         n# 1 swxY w Y   |                      d|j        › d|j        › �t          |j        ¦  «        ¦  «         t          j        dt          j        ¬¦  «        }t          j        dt          j        ¬¦  «        }|  
                    t          ¦  «        5 }| 	                    ||¦  «         ddd¦  «         n# 1 swxY w Y   |                      d|j        › d|j        › �t          |j        ¦  «        ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )	z¿See https://github.com/numba/numba/issues/9948

        Dynamic exception uses a symbol that in PYCC compilation must become
        linkonce_odr linkage to prevent symbol collision.
        )r¡   r¡   rÌ   )r¡   rª   Nzcannot assign slice of shape z from input of shape )r¥   é   )r¥   r‡   )rg   r_   Ú	cc_dynexcr­   r¾   r°   ÚonesÚdo_setitem1r‹   Údo_setitem2r�   Ú
ValueErrorr   Úshaper  Ú	exception)r"   rT   ÚaÚbÚraisess        r   Útest_dynamic_exczTestCC.test_dynamic_exc  sõ  € ð ×#Ò# DÔ$5Ô$?Ñ@Ô@ð 	'ÀCå”˜¥r¤zÐ2Ñ2Ô2ˆAÝ”˜¥b¤jÐ1Ñ1Ô1ˆAØ�OŠO˜A˜qÑ!Ô!Ð!Ø×#Ò# A qÑ)Ô)Ð)å”˜¥r¤zÐ2Ñ2Ô2ˆAØ�OŠO˜A˜qÑ!Ô!Ð!Ø×#Ò# A qÑ)Ô)Ð)õ ”˜¥r¤zÐ2Ñ2Ô2ˆAÝ”˜¥b¤jÐ1Ñ1Ô1ˆAØ×"Ò"¥:Ñ.Ô.ð &°&Ø—’  1Ñ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð �MŠMð,°´ð ,ð ,Ø"#¤'ð,ð ,å�FÔ$Ñ%Ô%ñ'ô 'ð 'õ
 ”˜¥r¤zÐ2Ñ2Ô2ˆAÝ”˜¥b¤jÐ1Ñ1Ô1ˆAØ×"Ò"¥:Ñ.Ô.ð &°&Ø—’  1Ñ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð �MŠMð,°´ð ,ð ,Ø"#¤'ð,ð ,å�FÔ$Ñ%Ô%ñ'ô 'ð 'ð7	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð 	'ð 	's[    DI&Ä3EÅ
I&ÅE	ÅI&ÅE	ÅBI&Ç3HÈ
I&ÈH	ÈI&ÈH	È;I&É&I*É-I*)r%   r&   r'   rF   rV   rW   rg   rs   r‚   r”   r˜   rœ   rŸ   rº   rÄ   rÊ   rÔ   rå   r   rë   ÚunittestÚexpectedFailurerõ   rø   rû   r  r  Ú__classcell__©rb   s   @r   rY   rY   o   så  ø€ € € € € ð
,ð ,ð ,ð ,ð ,ð Ôðð ñ Ôðð<ð <ð <ð(2ð 2ð 2ð&
ð 
ð 
ðGð Gð Gð;ð ;ð ;ð+ð +ð +ð<ð <ð <ð@<ð <ð <ð@<ð <ð <ð 1ð 1ð 1ð ð  ð  ð. ðIð Iñ „_ðIð, ÔØð#Dð #Dñ „_ñ Ôð#DðJ ÔØð2Jð 2Jñ „_ñ Ôð2Jðh ÔØðCð Cñ „_ñ ÔðCðB ØÔðACð ACñ Ôñ „_ðACðF$'ð $'ð $'ð $'ð $'ð $'ð $'r   rY   c                   óB   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	ˆ xZ
S )ÚTestDistutilsSupportc                 ó†  •— t          ¦   «                              ¦   «          |                      ¦   «          t          ¦   «          t	          d¦  «        | _        t          j                             t          d¦  «        }t          j                             | j        d¦  «        | _
        t          j        || j
        ¦  «         d S )NÚtest_pycc_distutilsÚpycc_distutils_usecaseÚwork)r\   rF   r]   r   r   rB   r   r/   r0   rç   Úusecase_dirÚshutilÚcopytree)r"   Ú
source_dirrb   s     €r   rF   zTestDistutilsSupport.setUp@  s�   ø€ Ý‰Œ�Š‰ŒˆØ×)Ò)Ñ+Ô+Ð+å&Ñ(Ô(Ð(õ %Ð%:Ñ;Ô;ˆŒÝ”W—\’\¥)Ð-EÑFÔFˆ
Ýœ7Ÿ<š<¨¬°VÑ<Ô<ˆÔÝŒ˜
 DÔ$4Ñ5Ô5Ð5Ð5Ð5r   c                 ó´  ‡ ‡— dd l }t          j                             t          j                             t          j                             |j        ¦  «        ¦  «        ¦  «        }t          t          j        ¦  «        Š‰                     dd¦  «        r|t          j	        z   ‰d         z   ‰d<   n|‰d<   ˆˆ fd„} ||ddg¦  «         d} |d|g¦  «         d S )	Nr   Ú
PYTHONPATHÚ c                 óF  •— t          j        t          j        g| z   ‰j        t           j        t           j        ‰¬¦  «        }|                     ¦   «         \  }}|                     ¦   «         }|dk    r.‰ 	                    d| 
                    dd¦  «        z  ¦  «         d S d S ©N)ÚcwdÚstdoutÚstderrr   r   z+python failed with the following output:
%szutf-8Úignore©rn   ÚPopenrM   rp   r  ÚPIPEÚSTDOUTÚcommunicateÚwaitÚfailÚdecode©ÚargsÚpÚoutÚ_Úrcr   r"   s        €€r   Ú
run_pythonz7TestDistutilsSupport.check_setup_py.<locals>.run_pythonX  ó£   ø€ ÝÔ ¥#¤.Ð!1°DÑ!8Ø%)Ô%5Ý(2¬Ý(2Ô(9Ø%(ð	*ñ *ô *ˆAð
 —]’]‘_”_‰FˆC�Ø—’‘”ˆBØ�QŠwˆwØ—	’	ÐHØŸJšJ w°Ñ9Ô9ñ:ñ ;ô ;ð ;ð ;ð ;ð ˆwr   Ú	build_extú	--inplacez¸if 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]
            rj   ©
Únumbar   r/   Úabspathrk   rl   rÃ   r   r    Úpathsep©r"   Úsetup_py_filer=  Ú
numba_pathr8  rq   r   s   `     @r   Úcheck_setup_pyz#TestDistutilsSupport.check_setup_pyM  óò   øø€ àˆˆˆÝ”W—_’_¥R¤W§_¢_Ý%'¤W§_¢_°U´^Ñ%DÔ%Dñ&Fô &Fñ Gô Gˆ
å•2”:ÑÔˆØ�7Š7�< Ñ$Ô$ð 	+Ø *­R¬ZÑ 7¸#¸lÔ:KÑ KˆC�ÑÐà *ˆC�Ñð
	;ð 
	;ð 
	;ð 
	;ð 
	;ð 
	;ð 	ˆ
�M ;°Ð<Ñ=Ô=Ð=ðˆð 	ˆ
�D˜$�<Ñ Ô Ð Ð Ð r   c                 ó´  ‡ ‡— dd l }t          j                             t          j                             t          j                             |j        ¦  «        ¦  «        ¦  «        }t          t          j        ¦  «        Š‰                     dd¦  «        r|t          j	        z   ‰d         z   ‰d<   n|‰d<   ˆˆ fd„} ||ddg¦  «         d} |d|g¦  «         d S )	Nr   r"  r#  c                 óF  •— t          j        t          j        g| z   ‰j        t           j        t           j        ‰¬¦  «        }|                     ¦   «         \  }}|                     ¦   «         }|dk    r.‰ 	                    d| 
                    dd¦  «        z  ¦  «         d S d S r%  r*  r2  s        €€r   r8  z>TestDistutilsSupport.check_setup_nested_py.<locals>.run_pythonx  r9  r   r:  r;  z¿if 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]
            rj   r<  r@  s   `     @r   Úcheck_setup_nested_pyz*TestDistutilsSupport.check_setup_nested_pym  rD  r   c                 ó0   — |                       d¦  «         d S )Nzsetup_distutils.py©rC  rE   s    r   Útest_setup_py_distutilsz,TestDistutilsSupport.test_setup_py_distutils�  s   € Ø×ÒÐ0Ñ1Ô1Ð1Ð1Ð1r   c                 ó0   — |                       d¦  «         d S )Nzsetup_distutils_nested.py©rG  rE   s    r   Útest_setup_py_distutils_nestedz3TestDistutilsSupport.test_setup_py_distutils_nested�  s   € Ø×"Ò"Ð#>Ñ?Ô?Ð?Ð?Ð?r   c                 ó0   — |                       d¦  «         d S )Nzsetup_setuptools.pyrI  rE   s    r   Útest_setup_py_setuptoolsz-TestDistutilsSupport.test_setup_py_setuptools“  s   € Ø×ÒÐ1Ñ2Ô2Ð2Ð2Ð2r   c                 ó0   — |                       d¦  «         d S )Nzsetup_setuptools_nested.pyrL  rE   s    r   Útest_setup_py_setuptools_nestedz4TestDistutilsSupport.test_setup_py_setuptools_nested–  s   € Ø×"Ò"Ð#?Ñ@Ô@Ð@Ð@Ð@r   )r%   r&   r'   rF   rC  rG  rJ  rM  rO  rQ  r  r  s   @r   r  r  :  sž   ø€ € € € € ð6ð 6ð 6ð 6ð 6ð!ð !ð !ð@!ð !ð !ð@2ð 2ð 2ð@ð @ð @ð3ð 3ð 3ðAð Að Að Að Að Að Ar   r  Ú__main__)0rV   r`   r   r  rn   rM   rC   rñ   r  r   ÚctypesÚnumpyr­   Úllvmlite.bindingÚbindingrš   Ú
numba.corer   Únumba.tests.supportr   r   r   r	   r
   r   r   r   r   r=  r   Ú_skip_reasonÚskipIfr~   r}   r(   r/   rk   r>  rl   rç   r   r   r*   r?   rY   r  r%   Úmainr   r   r   ú<module>r\     s  ðØ Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð à Ð Ð Ð à Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð ð2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð Ð Ð Ð Ð Ð à €€€ð €Ø�” C¤L×$;Ò$;¸EÑ$BÔ$BÐ BØ ,ñ.ô .€ð ŒG�OŠO˜BœGŸOšO¨HÑ5Ô5Ñ6Ô6€	ð3ð 3ð 3ð Øð;ð ;ð ;ð ;ð ;˜ñ ;ô ;ñ Ôñ Ôð;ð$-ð -ð -ð -ð -˜ñ -ô -ð -ð  ð(ð (ð (ð (ð (�8ñ (ô (ñ Ôð(ð@ ØØðE'ð E'ð E'ð E'ð E'ˆ\ñ E'ô E'ñ Ôñ Ôñ ÔðE'ðP ØØØðYAð YAð YAð YAð YA˜8ñ YAô YAñ Ôñ Ôñ Ôñ ÔðYAðx ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   