B
      ›\Â  ã               @   sÆ   d dl mZ d dlZd dlZd dlZd dlZd dlm  mZ	 d dl
Zd dlmZ d dlmZmZmZ d dlmZ d dlmZ ddlmZ e	j ejj¡Zdd	„ ZG d
d„ deƒZe dkrÂe !¡  dS )é    )Úprint_functionN)ÚcgutilsÚtypesÚtyping)Úglobal_compiler_lock)Úcpué   )ÚTestCasec             C   s   t j t| ¡S )N)ÚlcÚConstantÚintÚmachine_int)Ún© r   ú7lib/python3.7/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 )N)r   ZContextr   Z
CPUContextÚcontext)ÚselfZtyping_contextr   r   r   ÚsetUp   s    zStructureTestCase.setUpc             #   sœ   t j ttg| ¡}tjtjftjf| žŽ ‰ ˆj d¡‰ˆj	|ˆ 
¡ d‰ˆjsVt‚ˆ d¡}t  |¡}dg}t‡ ‡‡‡fdd„ƒ}ˆj|ˆj|fV  d S )NÚ )ÚnameÚentryTc                 sB   ˆj  ¡ }| dˆ ¡  ¡}| ˆ¡ | ˆj¡}ˆ |ƒ}|| Ž S )Nztest_module.%s)r   ÚcodegenZcreate_libraryÚidZadd_ir_moduleZget_pointer_to_functionr   )Úargsr   ZlibraryZcptrZcfunc)Úctypes_fntyÚfunctionÚmoduler   r   r   Ú	call_func-   s    

z5StructureTestCase.compile_function.<locals>.call_func)r
   ÚTyper   r   ÚctypesZ	CFUNCTYPEZc_size_tr   Úcreate_moduleZget_or_insert_functionr   Zis_declarationÚAssertionErrorZappend_basic_blockZBuilderr   r   )r   ÚnargsZ	llvm_fntyZentry_blockÚbuilderÚfirstr   r   )r   r   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 )N)
Ú
isinstanceÚ	bytearrayr#   r!   Z	pythonapiZPyByteArray_AsStringZ	py_objectZargtypesZc_void_pZrestype)r   ZbaZba_as_stringr   r   r   Úget_bytearray_addr9   s
    
z$StructureTestCase.get_bytearray_addrc          	   C   sd   |   d¡,\}}}}| |d |d ¡}| |¡ W d Q R X |  |ddƒd¡ |  |ddƒd¡ d S )	Né   r   r   é   éþÿÿÿé   é   é   )r'   ÚaddÚretÚassertEqual)r   r   r%   r   ÚcallZresr   r   r   Útest_compile_function@   s
    z'StructureTestCase.test_compile_functionr   c       
   	   c   s”   |   d¡r\}}}}|||ƒ}| |d t|ƒ¡}	| |	tj |j¡¡}	||||	d}||||fV  | tj	 
td¡¡ W d Q R X ||  |¡ƒ d S )Nr   r   )Úref)r'   r1   r   Zinttoptrr
   r    ZpointerZ_typer2   r   r   r   r*   )
r   Ústruct_classÚbufÚoffsetr   r%   r   r4   ÚinstZsptrr   r   r   Úrun_struct_accessH   s    
z#StructureTestCase.run_struct_accessc          	   c   sz   t dƒd }|d d … }d}|  |||¡\}}}	}
|||
fV  W d Q R X |  ||¡ tj|||f|žŽ  |  ||¡ d S )Nó   !é(   é   )r)   r;   ZassertNotEqualÚstructZ	pack_intor3   )r   r7   Z
struct_fmtZstruct_argsr8   Zexpectedr9   r   r%   r   r:   r   r   r   Úrun_simple_struct_testU   s    
z(StructureTestCase.run_simple_struct_testc          	   C   sj   G dd„ dt jƒ}d}|  ||d¡<\}}}tj tj d¡d¡|_tj tj d¡d¡|_W d 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   ÚSf   s   rG   z=iH)ixV4iÍ«  é    ixV4é   iÍ«  )	r   Ú	Structurer@   r
   r   r   r    rA   rB   )r   rG   Úfmtr   r%   r:   r   r   r   Útest_int_fieldse   s    z!StructureTestCase.test_int_fieldsc          	   C   sf   G dd„ dt jƒ}d}|  ||d¡8\}}}tj tj ¡ d¡|_tj tj 	¡ d¡|_
W d 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>.SrA   rB   N)rC   rD   rE   r   Zfloat64Zfloat32rF   r   r   r   r   rG   q   s   rG   z=df)g®Gáz®ó?g=
×£p=@g®Gáz®ó?g=
×£p=@)r   rJ   r@   r
   r   Úrealr    ZdoublerA   ÚfloatrB   )r   rG   rK   r   r%   r:   r   r   r   Útest_float_fieldsp   s    z#StructureTestCase.test_float_fieldsN)r   )rC   rD   rE   r   Ú
contextlibÚcontextmanagerr'   r*   r5   r;   r@   rL   rO   r   r   r   r   r      s   r   Ú__main__)"Z
__future__r   rP   r!   r?   ÚsysZllvmlite.llvmpy.coreZllvmpyZcorer
   ZnumpyZnpZnumba.unittest_supportZunittest_supportZunittestZnumbar   r   r   Znumba.compiler_lockr   Znumba.targetsr   Zsupportr	   r    r   ZintpZbitwidthr   r   r   rC   Úmainr   r   r   r   Ú<module>   s    d