U
    iâËdÿ  ã                   @   sº   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dl	m
Z
mZmZmZ d dlmZ d dlmZmZ e e
jj¡Zdd„ ZG dd„ deƒZG d	d
„ d
eƒZedkr¶e ¡  dS )é    N)ÚtypesÚtypingÚcgutilsÚcpu)Úglobal_compiler_lock)ÚTestCaseÚrun_in_subprocessc                 C   s   t  t| ¡S ©N)ÚirÚConstantÚmachine_int)Ún© r   úQ/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_cgutils.pyÚmachine_const   s    r   c                   @   s`   e Zd Zdd„ Zejdd„ ƒZdd„ Zdd„ Zejdd
d„ƒZ	ejdd„ ƒZ
dd„ Zdd„ ZdS )ÚStructureTestCasec                 C   s   t  ¡ }t |¡| _d S r	   )r   ÚContextr   Z
CPUContextÚcontext)ÚselfZtyping_contextr   r   r   ÚsetUp   s    zStructureTestCase.setUpc                 #   sš   t  ttg| ¡}tjtjftjf| žŽ ‰ ˆj d¡‰t 	ˆ|ˆ 
¡ ¡‰ˆjsTt‚ˆ d¡}t  |¡}dg}t‡ ‡‡‡fdd„ƒ}ˆj|ˆj|fV  d S )NÚ ÚentryTc                     sB   ˆj  ¡ }| dˆ ¡  ¡}| ˆ¡ | ˆj¡}ˆ |ƒ}|| Ž S )Nztest_module.%s)r   ÚcodegenZcreate_libraryÚidZadd_ir_moduleZget_pointer_to_functionÚname)Úargsr   ZlibraryZcptrZcfunc©Zctypes_fntyÚfunctionÚmoduler   r   r   Ú	call_func)   s    

z5StructureTestCase.compile_function.<locals>.call_func)r
   ÚFunctionTyper   ÚctypesZ	CFUNCTYPEZc_size_tr   Úcreate_moduler   Zget_or_insert_functionr   Zis_declarationÚAssertionErrorZappend_basic_blockZ	IRBuilderr   r   )r   ÚnargsZ	llvm_fntyZentry_blockÚbuilderÚfirstr   r   r   r   Úcompile_function   s    

ÿ


z"StructureTestCase.compile_functionc                 C   s0   t |tƒst‚tjj}tjg|_tj|_	||ƒS r	   )
Ú
isinstanceÚ	bytearrayr#   r!   Z	pythonapiZPyByteArray_AsStringZ	py_objectZargtypesZc_void_pÚrestype)r   ÚbaZba_as_stringr   r   r   Úget_bytearray_addr5   s
    
z$StructureTestCase.get_bytearray_addrc              	   C   sd   |   d¡�,\}}}}| |d |d ¡}| |¡ W 5 Q R X |  |ddƒd¡ |  |ddƒd¡ d S )	Né   r   é   é   éþÿÿÿé   é   é   )r'   ÚaddÚretÚassertEqual)r   r   r%   r   ÚcallÚresr   r   r   Útest_compile_function<   s
    z'StructureTestCase.test_compile_functionr   c           
   	   c   s�   |   d¡�n\}}}}|||ƒ}| |d t|ƒ¡}	| |	t |j¡¡}	||||	d�}||||fV  | t t	d¡¡ W 5 Q R X ||  
|¡ƒ d S )Nr.   r   )Úref)r'   r4   r   Zinttoptrr
   ZPointerTypeÚ_typer5   r   r   r,   )
r   Ústruct_classÚbufÚoffsetr   r%   r   r7   ÚinstZsptrr   r   r   Úrun_struct_accessD   s    
z#StructureTestCase.run_struct_accessc              	   c   sz   t dƒd }|d d … }d}|  |||¡�\}}}	}
|||
fV  W 5 Q R X |  ||¡ tj|||f|žŽ  |  ||¡ d S )Nó   !é(   é   )r)   r@   ZassertNotEqualÚstructÚ	pack_intor6   )r   r<   Z
struct_fmtZstruct_argsr=   Úexpectedr>   r   r%   r   r?   r   r   r   Úrun_simple_struct_testQ   s    
z(StructureTestCase.run_simple_struct_testc              	   C   sb   G dd„ dt jƒ}d}|  ||d¡�4\}}}t t d¡d¡|_t t d¡d¡|_W 5 Q R X d S )	Nc                   @   s    e Zd ZdejfdejfgZdS )z,StructureTestCase.test_int_fields.<locals>.SÚaÚbN)Ú__name__Ú
__module__Ú__qualname__r   Zint32Zuint16Ú_fieldsr   r   r   r   ÚSb   s   ÿrN   z=iH)éxV4éÍ«  é    rO   é   rP   )r   Ú	StructurerG   r
   r   ÚIntTyperH   rI   ©r   rN   Úfmtr   r%   r?   r   r   r   Útest_int_fieldsa   s    z!StructureTestCase.test_int_fieldsc              	   C   s^   G dd„ dt jƒ}d}|  ||d¡�0\}}}t t ¡ d¡|_t t ¡ d¡|_W 5 Q R X d S )Nc                   @   s    e Zd ZdejfdejfgZdS )z.StructureTestCase.test_float_fields.<locals>.SrH   rI   N)rJ   rK   rL   r   Zfloat64Zfloat32rM   r   r   r   r   rN   m   s   ÿrN   z=df)ç®Gáz®ó?ç=
×£p=@rX   rY   )	r   rS   rG   r
   r   Z
DoubleTyperH   Z	FloatTyperI   rU   r   r   r   Útest_float_fieldsl   s    z#StructureTestCase.test_float_fieldsN)r   )rJ   rK   rL   r   Ú
contextlibÚcontextmanagerr'   r,   r9   r@   rG   rW   rZ   r   r   r   r   r      s   

r   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestCGContextz/Tests for code generation context functionalityc                 C   s4   d}d|› d�}t |ƒ\}}|  t|ƒ| ¡ ¡ d S )Ni@â az  if 1:
        from numba import njit, types
        from numba.extending import intrinsic

        @intrinsic
        def printf(tyctx, int_arg):
            sig = types.void(int_arg)
            def codegen(cgctx, builder, sig, llargs):
                cgctx.printf(builder, "%d\n", *llargs)
            return sig, codegen

        @njit
        def foo():
            printf(z)

        foo()
        )r   ZassertInÚstrÚdecode)r   ÚvalueÚcodeÚoutÚ_r   r   r   Útest_printf{   s    ózTestCGContext.test_printfN)rJ   rK   rL   Ú__doc__rd   r   r   r   r   r]   x   s   r]   Ú__main__)r[   r!   rD   ÚsysZllvmlite.irr
   ÚnumpyÚnpZunittestZ
numba.corer   r   r   r   Znumba.core.compiler_lockr   Znumba.tests.supportr   r   rT   ZintpZbitwidthr   r   r   r]   rJ   Úmainr   r   r   r   Ú<module>   s   c