B
      ›\–ø  ã               @   sr  d dl mZmZmZ d dlmZ d dlZd dlZd dlm	Z	 d dl
mZmZ d dl
m  mZ d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZ ed	kr¾ejZejZej Z!ej"Z#G d
d„ de$ƒZ%e%ƒ Z&e%ƒ Z'e%ƒ Z(e&j)Z*e'j)Z+e(j)Z,G dd„ deddƒƒZ-G dd„ deddƒƒZ.G dd„ deddƒƒZ/G dd„ de$ƒZ0G dd„ de$ƒZ1eddƒZ2G dd„ de$ƒZ3dS )é    )Úprint_functionÚdivisionÚabsolute_import)Ú
namedtupleN)Úir)ÚTypeÚConstant)Ú	PYVERSION)Úconfig)ÚtypesÚutilsÚcgutilsÚloweringÚ
_helperlib)é   r   c               @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	Ú	_Registryc             C   s
   i | _ d S )N)Ú	functions)Úself© r   ú.lib/python3.7/site-packages/numba/pythonapi.pyÚ__init__   s    z_Registry.__init__c                s"   t ˆtjƒst‚‡ ‡fdd„}|S )Nc                s&   ˆˆ j krtdˆf ƒ‚| ˆ j ˆ< | S )Nzduplicate registration for %s)r   ÚKeyError)Úfunc)r   Ú	typeclassr   r   Ú	decorator   s    

z%_Registry.register.<locals>.decorator)Ú
issubclassr   r   ÚAssertionError)r   r   r   r   )r   r   r   Úregister   s    z_Registry.registerNc             C   s<   t |tjƒst‚x&|jD ]}| j |¡}|d k	r|S qW |S )N)r   r   r   r   Ú__mro__r   Úget)r   r   ÚdefaultÚclsr   r   r   r   Úlookup&   s    z_Registry.lookup)N)Ú__name__Ú
__module__Ú__qualname__r   r   r"   r   r   r   r   r      s   	r   c               @   s   e Zd ZdZdZdd„ ZdS )Ú_BoxContextz<
    The facilities required by boxing implementations.
    r   c             C   s   | j  ||| j¡S )N)ÚpyapiÚfrom_native_valueÚenv_manager)r   ÚtypÚvalr   r   r   Úbox>   s    z_BoxContext.boxN)r#   r$   r%   Ú__doc__Ú	__slots__r,   r   r   r   r   r&   7   s   r&   )ÚcontextÚbuilderr'   r)   c               @   s   e Zd ZdZdZdd„ ZdS )Ú_UnboxContextz>
    The facilities required by unboxing implementations.
    r   c             C   s   | j  ||¡S )N)r'   Úto_native_value)r   r*   Úobjr   r   r   ÚunboxI   s    z_UnboxContext.unboxN)r#   r$   r%   r-   r.   r4   r   r   r   r   r1   B   s   r1   )r/   r0   r'   c               @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
Ú_ReflectContextz@
    The facilities required by reflection implementations.
    r   c             C   s   | j  | jtj¡ d S )N)r0   ÚstoreÚis_errorr   Ztrue_bit)r   r   r   r   Ú	set_errorV   s    z_ReflectContext.set_errorc             C   s   | j  ||| j¡S )N)r'   r(   r)   )r   r*   r+   r   r   r   r,   Y   s    z_ReflectContext.boxc             C   s   | j  ||| j¡S )N)r'   Úreflect_native_valuer)   )r   r*   r+   r   r   r   Úreflect\   s    z_ReflectContext.reflectN)r#   r$   r%   r-   r.   r8   r,   r:   r   r   r   r   r5   M   s
   r5   )r/   r0   r'   r)   r7   c               @   s   e Zd ZdZddd„ZdS )ÚNativeValuez™
    Encapsulate the result of converting a Python object to a native value,
    recording whether the conversion was successful and how to cleanup.
    Nc             C   s$   || _ |d k	r|ntj| _|| _d S )N)Úvaluer   Ú	false_bitr7   Úcleanup)r   r<   r7   r>   r   r   r   r   f   s    zNativeValue.__init__)NN)r#   r$   r%   r-   r   r   r   r   r   r;   `   s   r;   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚEnvironmentManagerc             C   s,   t |tjƒst‚|| _|| _|| _|| _d S )N)Ú
isinstancer   ZEnvironmentr   r'   ÚenvÚenv_bodyÚenv_ptr)r   r'   rA   rB   rC   r   r   r   r   n   s
    zEnvironmentManager.__init__c             C   sV   t |tƒrt |¡}x<t| jjƒD ]\}}||kr"P q"W t| jjƒ}| jj |¡ |S )zF
        Add a constant to the environment, return its index.
        )	r@   Ústrr   ÚinternÚ	enumeraterA   ÚconstsÚlenÚappend)r   ZconstÚindexr+   r   r   r   Ú	add_constu   s    

zEnvironmentManager.add_constc             C   s&   |t | jjƒk st‚| j | jj|¡S )zx
        Look up constant number *index* inside the environment body.
        A borrowed reference is returned.
        )rH   rA   rG   r   r'   Úlist_getitemrB   )r   rJ   r   r   r   Ú
read_const„   s    zEnvironmentManager.read_constN)r#   r$   r%   r   rK   rM   r   r   r   r   r?   l   s   r?   Ú_IteratorLoop)r<   Údo_breakc               @   sZ  e Zd ZdZdd„ Zdd„ ZdRd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dSdd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ ZejdTd*d+„ƒZd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ ZdUd9d:„Z d;d<„ Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(dKdL„ Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,dSdT„ Z-dUdV„ Z.dWdX„ Z/dYdZ„ Z0d[d\„ Z1d]d^„ Z2dVd_d`„Z3dWdadb„Z4dXdcdd„Z5dYdedf„Z6dZdgdh„Z7d[didj„Z8d\dkdl„Z9d]dmdn„Z:d^dodp„Z;d_dqdr„Z<d`dsdt„Z=dadudv„Z>dbdwdx„Z?dcdydz„Z@ddd{d|„ZAd}d~„ ZBdd€„ ZCdd‚„ ZDdƒd„„ ZEd…d†„ ZFd‡dˆ„ ZGd‰dŠ„ ZHd‹dŒ„ ZIddŽ„ ZJdd„ ZKd‘d’„ ZLd“d”„ ZMd•d–„ ZNd—d˜„ ZOd™dš„ ZPd›dœ„ ZQddž„ ZRdŸd „ ZSd¡d¢„ ZTd£d¤„ ZUd¥d¦„ ZVd§d¨„ ZWd©dª„ ZXd«d¬„ ZYded­d®„ZZd¯d°„ Z[d±d²„ Z\d³d´„ Z]dµd¶„ Z^d·d¸„ Z_ejd¹dº„ ƒZ`d»d¼„ Zad½d¾„ Zbd¿dÀ„ ZcdÁdÂ„ ZddÃdÄ„ ZedÅdÆ„ ZfdÇdÈ„ ZgdÉdÊ„ ZhdËdÌ„ ZidfdÎdÏ„ZjdgdÐdÑ„ZkdÒdÓ„ ZldÔdÕ„ ZmdÖd×„ ZndØdÙ„ ZodÚdÛ„ ZpdÜdÝ„ ZqdÞdß„ Zrdàdá„ Zsdâdã„ Ztdädå„ Zudædç„ Zvdèdé„ Zwdêdë„ Zxdìdí„ Zydîdï„ Zzdðdñ„ Z{dòdó„ Z|dôdõ„ Z}död÷„ Z~dødù„ Zdúdû„ Z€düdý„ Zdþ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d„ Zej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šd0d1„ Z›dhd2d3„Zœdid4d5„Zd6d7„ Zždjd8d9„ZŸd:d;„ Z d<d=„ Z¡d>d?„ Z¢d@dA„ Z£dBdC„ Z¤dDdE„ Z¥dFdG„ Z¦dHdI„ Z§dJdK„ Z¨dLdM„ Z©dNdO„ ZªdPdQ„ Z«dS (k  Ú	PythonAPIz^
    Code generation facilities to call into the CPython C API (and related
    helpers).
    c             C   sZ  ddl m} || _|| _|jjj| _y| jj W n tk
rL   i | j_Y nX | j 	t
j¡| _| j ¡ | _t t d¡¡| _t t tj¡d ¡| _| j| _t t tj¡d ¡| _| j| _t ¡ | _| j t
j¡| _t t d¡¡| _t t j!d ¡| _"t# $t# %d¡t j&¡| _'t(dkr$| j| _)n| j| _)t(dkrVt j*| _*t j+| _+t j,| _,t j-| _-dS )zL
        Note: Maybe called multiple times when lowering a function
        r   )Úboxingé   )r   r   )r   r   N).Znumba.targetsrQ   r/   r0   Zbasic_blockÚfunctionÚmoduleÚ_PythonAPI__serializedÚAttributeErrorZget_argument_typer   ÚpyobjectÚpyobjÚ
as_pointerÚpyobjptrr   ÚpointerÚintÚvoidptrÚctypesZsizeofZc_longÚlongÚulongZc_ulonglongÚlonglongÚ	ulonglongÚdoubleZget_value_typeÚintpÚ
py_ssize_tÚcstringr   Zpy_gil_state_sizeÚ	gil_stater   Z	ArrayTypeÚIntTypeZpy_buffer_sizeÚpy_buffer_tr	   Ú	py_hash_tÚpy_unicode_1byte_kindÚpy_unicode_2byte_kindÚpy_unicode_4byte_kindÚpy_unicode_wchar_kind)r   r/   r0   rQ   r   r   r   r   —   s8    



zPythonAPI.__init__c             C   s   t | |||ƒS )N)r?   )r   rA   rB   rC   r   r   r   Úget_env_manager½   s    zPythonAPI.get_env_managerFc          	   C   s~   t  | j|¡}t  | j|¡X |r\| jjjj}|j| jks>t	‚|  
dd¡ | j |  ¡ ¡ n| jj | jtd¡ W dQ R X dS )z;Emits LLVM code to ensure the `envptr` is not NULL
        ZPyExc_RuntimeErrorzmissing Environment)zmissing EnvironmentN)r   Úis_nullr0   Zif_unlikelyrS   ÚtypeÚpointeeZreturn_typerX   r   Úerr_set_stringÚretÚget_null_objectr/   Z	call_convZreturn_user_excÚRuntimeError)r   ZenvptrZreturn_pyobjectrp   Úfntyr   r   r   Úemit_environment_sentryÀ   s    z!PythonAPI.emit_environment_sentryc             C   s6   t  t  ¡ | jg¡}| j|dd}| j ||g¡ d S )NZ	Py_IncRef)Úname)r   rS   ÚvoidrX   Ú_get_functionr0   Úcall)r   r3   rw   Úfnr   r   r   ÚincrefÖ   s    zPythonAPI.increfc             C   s6   t  t  ¡ | jg¡}| j|dd}| j ||g¡ d S )NZ	Py_DecRef)ry   )r   rS   rz   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   ÚdecrefÛ   s    zPythonAPI.decrefc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZnumba_py_type)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úget_typeà   s    zPythonAPI.get_typec             G   sj   t  t  d¡¡}t  |¡}| j| j||g}t jt  ¡ |dd}	| j|	dd}
| j |
||||gt|ƒ ¡S )NrR   T)Úvar_argZPyArg_ParseTupleAndKeywords)ry   )	r   r[   r\   rX   rS   r{   r0   r|   Úlist)r   ÚargsÚkwsÚfmtÚkeywordsÚobjsÚcharptrZ
charptraryÚargtypesrw   r}   r   r   r   Úparse_tuple_and_keywordsé   s    
z"PythonAPI.parse_tuple_and_keywordsc             G   sV   t  t  d¡¡}| j|g}t jt  ¡ |dd}| j|dd}| j |||gt|ƒ ¡S )NrR   T)r   ZPyArg_ParseTuple)ry   )	r   r[   r\   rX   rS   r{   r0   r|   r‚   )r   rƒ   r…   r‡   rˆ   r‰   rw   r}   r   r   r   Úparse_tupleñ   s
    
zPythonAPI.parse_tuplec       
      G   sš   t  t  d¡¡}| j|| j| jg}t jt  ¡ |dd}| j|dd}	t | j|¡}t | j|¡}t|t	ƒr|| j
 | jj|¡}| j |	||||gt|ƒ ¡S )NrR   T)r   ZPyArg_UnpackTuple)ry   )r   r[   r\   rX   re   rS   r{   r   r@   rD   r/   Úinsert_const_stringr0   rT   r|   r‚   )
r   rƒ   ry   Zn_minZn_maxr‡   rˆ   r‰   rw   r}   r   r   r   Úunpack_tupleø   s    
zPythonAPI.unpack_tuplec             C   s*   t  | jd¡}| j|dd}| j |d¡S )Nr   ZPyErr_Occurred)ry   )r   rS   rX   r{   r0   r|   )r   rw   r}   r   r   r   Úerr_occurred  s    zPythonAPI.err_occurredc             C   s,   t  t  ¡ d¡}| j|dd}| j |d¡S )Nr   ZPyErr_Clear)ry   )r   rS   rz   r{   r0   r|   )r   rw   r}   r   r   r   Ú	err_clear  s    zPythonAPI.err_clearc             C   sf   t  t  ¡ | j| jg¡}| j|dd}t|tƒr:|  |¡}t|tƒrT| j	 
| j|¡}| j |||f¡S )NZPyErr_SetString)ry   )r   rS   rz   rX   rf   r{   r@   rD   Úget_c_objectr/   rŒ   rT   r0   r|   )r   ÚexctypeÚmsgrw   r}   r   r   r   rs     s    


zPythonAPI.err_set_stringc             G   sr   t jt  ¡ | j| jgdd}| j|dd}t|tƒr>|  |¡}t|tƒrX| j	 
| j|¡}| j |||ft|ƒ ¡S )NT)r   ZPyErr_Format)ry   )r   rS   rz   rX   rf   r{   r@   rD   r   r/   rŒ   rT   r0   r|   Útuple)r   r‘   r’   Zformat_argsrw   r}   r   r   r   Ú
err_format  s    


zPythonAPI.err_formatNc             C   sB   t  t  ¡ | jg¡}| j|dd}|dkr2|  ¡ }| j ||f¡S )z˜
        Raise an arbitrary exception (type or value or (type, args)
        or None - if reraising).  A reference to the argument is consumed.
        Znumba_do_raise)ry   N)r   rS   rz   rX   r{   Ú	make_noner0   r|   )r   Úexcrw   r}   r   r   r   Úraise_object#  s
    zPythonAPI.raise_objectc             C   sL   t  t  ¡ | j| jg¡}| j|dd}t|tƒr:|  |¡}| j 	|||f¡S )NZPyErr_SetObject)ry   )
r   rS   rz   rX   r{   r@   rD   r   r0   r|   )r   r‘   Zexcvalrw   r}   r   r   r   Úerr_set_object.  s
    

zPythonAPI.err_set_objectc             C   sF   t  t  ¡ | jg¡}| j|dd}t|tƒr6|  |¡}| j 	||f¡S )NZPyErr_SetNone)ry   )
r   rS   rz   rX   r{   r@   rD   r   r0   r|   )r   r‘   rw   r}   r   r   r   Úerr_set_none5  s
    

zPythonAPI.err_set_nonec             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||f¡S )NZPyErr_WriteUnraisable)ry   )r   rS   rz   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úerr_write_unraisable<  s    zPythonAPI.err_write_unraisablec             C   s:   t  t  ¡ | jgd ¡}| j|dd}| j ||||f¡S )Nr   ZPyErr_Fetch)ry   )r   rS   rz   rZ   r{   r0   r|   )r   ÚptyÚpvalÚptbrw   r}   r   r   r   Ú	err_fetchA  s    zPythonAPI.err_fetchc             C   s:   t  t  ¡ | jgd ¡}| j|dd}| j ||||f¡S )Nr   ZPyErr_Restore)ry   )r   rS   rz   rX   r{   r0   r|   )r   Útyr+   Útbrw   r}   r   r   r   Úerr_restoreF  s    zPythonAPI.err_restorec          
   #   sê   ‡ fdd„t dƒD ƒ\}}}ˆ  |||¡ dV  ˆ j |¡}ˆ j |¡}ˆ j |¡}|rØt ˆ jˆ  ¡ ¡}ˆ jj|ddV\}	}
|	$ ˆ  |¡ ˆ  |¡ ˆ  |¡ W dQ R X |
 ˆ  	|||¡ W dQ R X W dQ R X nˆ  	|||¡ dS )a  
        Temporarily push the current error indicator while the code
        block is executed.  If *keep_new* is True and the code block
        raises a new error, the new error is kept, otherwise the old
        error indicator is restored at the end of the block.
        c                s   g | ]}t  ˆ jˆ j¡‘qS r   )r   Úalloca_oncer0   rX   )Ú.0Úi)r   r   r   ú
<listcomp>S  s   z&PythonAPI.err_push.<locals>.<listcomp>r   NF)Úlikely)
Úrangerž   r0   Úloadr   Úis_not_nullrŽ   Úif_elser   r¡   )r   Zkeep_newr›   rœ   r   rŸ   r+   r    Z	new_errorZif_errorZif_okr   )r   r   Úerr_pushK  s"    


$zPythonAPI.err_pushc             C   s   | j j| j| jj|ddS )zÌ
        Get a Python object through its C-accessible *name*
        (e.g. "PyExc_ValueError").  The underlying variable must be
        a `PyObject *`, and the value of that pointer is returned.
        T)Z	dllimport)r/   Zget_c_valuer0   rX   rr   )r   ry   r   r   r   r   h  s    zPythonAPI.get_c_objectc             C   s(   d| }| j  | j|¡}|  d|¡ d S )Nzglobal name '%s' is not definedÚPyExc_NameError)r/   rŒ   rT   rs   )r   ry   r’   Úcstrr   r   r   Úraise_missing_global_errors  s    z$PythonAPI.raise_missing_global_errorc             C   s(   d| }| j  | j|¡}|  d|¡ d S )Nzname '%s' is not definedr¬   )r/   rŒ   rT   rs   )r   ry   r’   r­   r   r   r   Úraise_missing_name_errorx  s    z"PythonAPI.raise_missing_name_errorc             C   sR   t  t  ¡ | jg¡}| j|dd}|j d¡ | j | j	|¡}| j
 ||f¡ d S )NZPy_FatalError)ry   Znoreturn)r   rS   rz   rf   r{   Z
attributesÚaddr/   rŒ   rT   r0   r|   )r   r’   rw   r}   r­   r   r   r   Úfatal_error}  s
    zPythonAPI.fatal_errorc             C   sF   t  | j| j| jg¡}| j|dd}| j | j|¡}| j 	|||g¡S )zFLookup name inside dict

        Returns a borrowed reference
        ZPyDict_GetItemString)ry   )
r   rS   rX   rf   r{   r/   rŒ   rT   r0   r|   )r   Údicry   rw   r}   r­   r   r   r   Údict_getitem_stringˆ  s    zPythonAPI.dict_getitem_stringc             C   s6   t  | j| j| jg¡}| j|dd}| j |||g¡S )zFLookup name inside dict

        Returns a borrowed reference
        ZPyDict_GetItem)ry   )r   rS   rX   r{   r0   r|   )r   r²   ry   rw   r}   r   r   r   Údict_getitem’  s    zPythonAPI.dict_getitemr   c             C   sp   |dkr2t  | jd¡}| j|dd}| j |d¡S t  | j| jg¡}| j|dd}| j |t | j|¡g¡S d S )Nr   r   Z
PyDict_New)ry   Z_PyDict_NewPresized)	r   rS   rX   r{   r0   r|   re   r   r\   )r   Zpresizerw   r}   r   r   r   Údict_new›  s    zPythonAPI.dict_newc             C   s>   t  t  ¡ | j| j| jf¡}| j|dd}| j ||||f¡S )NZPyDict_SetItem)ry   )r   rS   r\   rX   r{   r0   r|   )r   ÚdictobjZnameobjÚvalobjrw   r}   r   r   r   Údict_setitem¦  s    
zPythonAPI.dict_setitemc             C   sN   t  t  ¡ | j| j| jf¡}| j|dd}| j | j|¡}| j	 
||||f¡S )NZPyDict_SetItemString)ry   )r   rS   r\   rX   rf   r{   r/   rŒ   rT   r0   r|   )r   r¶   ry   r·   rw   r}   r­   r   r   r   Údict_setitem_string¬  s
    
zPythonAPI.dict_setitem_stringc          	   C   sB   |   ¡ }|  |¡& x|D ]\}}|  |||¡ qW W dQ R X |S )zb
        Args
        -----
        keyvalues: iterable of (str, llvm.Value of PyObject*)
        N)rµ   Úif_object_okr¹   )r   Z	keyvaluesr¶   ÚkÚvr   r   r   Ú	dict_pack³  s
    zPythonAPI.dict_packc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyFloat_FromDouble)ry   )r   rS   rX   rc   r{   r0   r|   )r   Zfvalrw   r}   r   r   r   Úfloat_from_doubleÃ  s    zPythonAPI.float_from_doublec             C   s@   t  | j| j| jg¡}| j|dd}|  d¡}| j |||g¡S )NZPyNumber_AsSsize_t)ry   ZPyExc_OverflowError)r   rS   re   rX   r{   r   r0   r|   )r   Únumobjrw   r}   Z	exc_classr   r   r   Únumber_as_ssize_tÈ  s    
zPythonAPI.number_as_ssize_tc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyNumber_Long)ry   )r   rS   rX   r{   r0   r|   )r   r¿   rw   r}   r   r   r   Únumber_longÏ  s    zPythonAPI.number_longc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyLong_AsUnsignedLongLong)ry   )r   rS   rb   rX   r{   r0   r|   )r   r¿   rw   r}   r   r   r   Úlong_as_ulonglongÔ  s    zPythonAPI.long_as_ulonglongc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyLong_AsLongLong)ry   )r   rS   rb   rX   r{   r0   r|   )r   r¿   rw   r}   r   r   r   Úlong_as_longlongÙ  s    zPythonAPI.long_as_longlongc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )z–
        Convert the given Python integer to a void*.  This is recommended
        over number_as_ssize_t as it isn't affected by signedness.
        ZPyLong_AsVoidPtr)ry   )r   rS   r]   rX   r{   r0   r|   )r   r¿   rw   r}   r   r   r   Úlong_as_voidptrÞ  s    zPythonAPI.long_as_voidptrc          
   C   st  t  | j|g¡}| j||d}t | j| j¡}tdk r@t  | j| jg¡}| j|dd}	t	 
|tj¡}
|r¤t	 
|tj¡}| j | j tj||¡| j tj||
¡¡}n| j tj||
¡}| j |¡v\}}|4 | j || j¡}| j |	|g¡}| j ||¡ W d Q R X |$ | j ||g¡}| j ||¡ W d Q R X W d Q R X n(| j||d}| j | j ||g¡|¡ | j |¡S )N)ry   )r   r   ÚPyInt_FromLong)r   rS   rX   r{   r   r¢   r0   r	   r_   r   r\   r   Úlong_maxÚlong_minÚand_ÚicmpÚlcZICMP_SGEZICMP_SLEZICMP_ULErª   Útruncr|   r6   r¨   )r   ÚivalÚ	func_nameZnative_int_typeÚsignedrw   r}   ZresptrZ
pyint_fntyZpyint_fnrÆ   rÇ   Z	use_pyintZthenZ	otherwiseZdowncast_ivalÚresr   r   r   Ú_long_from_native_intç  s0    
$zPythonAPI._long_from_native_intc             C   sB   t dk rd}nd}t | j| jg¡}| j||d}| j ||g¡S )N)r   r   rÅ   ZPyLong_FromLong)ry   )r	   r   rS   rX   r_   r{   r0   r|   )r   rÌ   rÍ   rw   r}   r   r   r   Úlong_from_long
  s    zPythonAPI.long_from_longc             C   s   | j |d| jddS )NZPyLong_FromUnsignedLongF)rÎ   )rÐ   r_   )r   rÌ   r   r   r   Úlong_from_ulong  s    zPythonAPI.long_from_ulongc             C   s   | j |d| jddS )NZPyLong_FromSsize_tT)rÎ   )rÐ   re   )r   rÌ   r   r   r   Úlong_from_ssize_t  s    zPythonAPI.long_from_ssize_tc             C   s   | j |d| jddS )NZPyLong_FromLongLongT)rÎ   )rÐ   ra   )r   rÌ   r   r   r   Úlong_from_longlong  s    zPythonAPI.long_from_longlongc             C   s   | j |d| jddS )NZPyLong_FromUnsignedLongLongF)rÎ   )rÐ   rb   )r   rÌ   r   r   r   Úlong_from_ulonglong  s    zPythonAPI.long_from_ulonglongc             C   s\   |j j}|| jjkr*|  | j || j¡¡S || jjkrL|  | j || j¡¡S td| ƒ‚dS )zH
        Return a Python integer from any native integer value.
        zinteger too big (%d bits)N)	rq   Úwidthr_   rÑ   r0   Zsextra   rÔ   ÚOverflowError)r   rÌ   Úbitsr   r   r   Úlong_from_signed_int#  s    zPythonAPI.long_from_signed_intc             C   s\   |j j}|| jjkr*|  | j || j¡¡S || jjkrL|  | j || j¡¡S td| ƒ‚dS )zH
        Same as long_from_signed_int, but for unsigned values.
        zinteger too big (%d bits)N)	rq   rÖ   r`   rÒ   r0   Úzextrb   rÕ   r×   )r   rÌ   rØ   r   r   r   Úlong_from_unsigned_int/  s    z PythonAPI.long_from_unsigned_intc             C   s,   t  | j| j| jg¡}| j|d| d}|S )NzPyNumber_%s)ry   )r   rS   rX   r{   )r   ry   rw   r}   r   r   r   Ú_get_number_operator;  s    zPythonAPI._get_number_operatorc             C   s(   |rd| }|   |¡}| j |||g¡S )NZInPlace)rÜ   r0   r|   )r   ry   ÚlhsÚrhsÚinplacer}   r   r   r   Ú_call_number_operator@  s    
zPythonAPI._call_number_operatorc             C   s   | j d|||dS )NZAdd)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Ú
number_addF  s    zPythonAPI.number_addc             C   s   | j d|||dS )NZSubtract)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_subtractI  s    zPythonAPI.number_subtractc             C   s   | j d|||dS )NZMultiply)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_multiplyL  s    zPythonAPI.number_multiplyc             C   s   t dk st‚| jd|||dS )N)r   r   ZDivide)rß   )r	   r   rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_divideO  s    zPythonAPI.number_dividec             C   s   | j d|||dS )NZ
TrueDivide)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_truedivideS  s    zPythonAPI.number_truedividec             C   s   | j d|||dS )NZFloorDivide)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_floordivideV  s    zPythonAPI.number_floordividec             C   s   | j d|||dS )NZ	Remainder)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_remainderY  s    zPythonAPI.number_remainderc             C   s   t dkst‚| jd|||dS )N)r   é   ZMatrixMultiply)rß   )r	   r   rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_matrix_multiply\  s    z PythonAPI.number_matrix_multiplyc             C   s   | j d|||dS )NZLshift)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_lshift`  s    zPythonAPI.number_lshiftc             C   s   | j d|||dS )NZRshift)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Únumber_rshiftc  s    zPythonAPI.number_rshiftc             C   s   | j d|||dS )NZAnd)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Ú
number_andf  s    zPythonAPI.number_andc             C   s   | j d|||dS )NZOr)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Ú	number_ori  s    zPythonAPI.number_orc             C   s   | j d|||dS )NZXor)rß   )rà   )r   rÝ   rÞ   rß   r   r   r   Ú
number_xorl  s    zPythonAPI.number_xorc             C   sF   t  | j| jgd ¡}|rdnd}|  ||¡}| j ||||  ¡ g¡S )Nr   ZPyNumber_InPlacePowerZPyNumber_Power)r   rS   rX   r{   r0   r|   Úborrow_none)r   rÝ   rÞ   rß   rw   Úfnamer}   r   r   r   Únumber_powero  s    zPythonAPI.number_powerc             C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZPyNumber_Negative)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Únumber_negativeu  s    zPythonAPI.number_negativec             C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZPyNumber_Positive)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Únumber_positivez  s    zPythonAPI.number_positivec             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyNumber_Float)ry   )r   rS   rX   r{   r0   r|   )r   r+   rw   r}   r   r   r   Únumber_float  s    zPythonAPI.number_floatc             C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZPyNumber_Invert)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Únumber_invert„  s    zPythonAPI.number_invertc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyFloat_AsDouble)ry   )r   rS   rc   rX   r{   r0   r|   )r   Zfobjrw   r}   r   r   r   Úfloat_as_double‰  s    zPythonAPI.float_as_doublec             C   s   | j  || j¡}|  |¡S )z8
        Get a Python bool from a LLVM boolean.
        )r0   rÚ   r_   Úbool_from_long)r   ZbvalZlongvalr   r   r   Úbool_from_boolŽ  s    zPythonAPI.bool_from_boolc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyBool_FromLong)ry   )r   rS   rX   r_   r{   r0   r|   )r   rÌ   rw   r}   r   r   r   r÷   •  s    zPythonAPI.bool_from_longc             C   s:   t  | jt  ¡ t  ¡ g¡}| j|dd}| j |||g¡S )NZPyComplex_FromDoubles)ry   )r   rS   rX   rc   r{   r0   r|   )r   ZrealvalZimagvalrw   r}   r   r   r   Úcomplex_from_doublesš  s    zPythonAPI.complex_from_doublesc             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||g¡S )NZPyComplex_RealAsDouble)ry   )r   rS   rc   rX   r{   r0   r|   )r   Úcobjrw   r}   r   r   r   Úcomplex_real_as_doubleŸ  s    z PythonAPI.complex_real_as_doublec             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||g¡S )NZPyComplex_ImagAsDouble)ry   )r   rS   rc   rX   r{   r0   r|   )r   rú   rw   r}   r   r   r   Úcomplex_imag_as_double¤  s    z PythonAPI.complex_imag_as_doublec             C   s²   t  | j| j¡}t  | j| j¡}t  | j| j¡}t t ¡ | jg| j ¡ gd  ¡}| j	|dd}| j 
|||||f¡}| j |¡}| j |¡}	| j |¡}
t  | j|¡||	|
fS )z»
        Read the members of a slice of integers.

        Returns a (ok, start, stop, step) tuple where ok is a boolean and
        the following members are pointer-sized ints.
        r   Znumba_unpack_slice)ry   )r   r¢   r0   re   r   rS   r\   rX   rY   r{   r|   r¨   rp   )r   r3   ZpstartZpstopZpsteprw   r}   rÏ   ÚstartÚstopÚstepr   r   r   Úslice_as_ints­  s    
zPythonAPI.slice_as_intsc             C   s<   t  | j| j| j| jg¡}| j|dd}| j ||||f¡S )NZPySequence_GetSlice)ry   )r   rS   rX   re   r{   r0   r|   )r   r3   rý   rþ   rw   r}   r   r   r   Úsequence_getsliceÄ  s    
zPythonAPI.sequence_getslicec             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPySequence_Tuple)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úsequence_tupleÊ  s    zPythonAPI.sequence_tuplec             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZ
PyList_New)ry   )r   rS   rX   re   r{   r0   r|   )r   Zszvalrw   r}   r   r   r   Úlist_newÏ  s    zPythonAPI.list_newc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyList_Size)ry   )r   rS   re   rX   r{   r0   r|   )r   Úlstrw   r}   r   r   r   Ú	list_sizeÔ  s    zPythonAPI.list_sizec             C   s8   t  t  ¡ | j| jg¡}| j|dd}| j |||g¡S )NZPyList_Append)ry   )r   rS   r\   rX   r{   r0   r|   )r   r  r+   rw   r}   r   r   r   Úlist_appendÙ  s    zPythonAPI.list_appendc             C   s>   t  t  ¡ | j| j| jg¡}| j|dd}| j ||||g¡S )z6
        Warning: Steals reference to ``val``
        ZPyList_SetItem)ry   )r   rS   r\   rX   re   r{   r0   r|   )r   r  Úidxr+   rw   r}   r   r   r   Úlist_setitemÞ  s    
zPythonAPI.list_setitemc             C   sP   t  | j| j| jg¡}| j|dd}t|tƒr>| j t	j
|¡}| j |||g¡S )z/
        Returns a borrowed reference.
        ZPyList_GetItem)ry   )r   rS   rX   re   r{   r@   r\   r/   Úget_constantr   rd   r0   r|   )r   r  r  rw   r}   r   r   r   rL   ç  s
    
zPythonAPI.list_getitemc             C   sT   |d kr|   ¡ }t t ¡ | j| j| j| jg¡}| j|dd}| j |||||f¡S )NZPyList_SetSlice)ry   )	ru   r   rS   r\   rX   re   r{   r0   r|   )r   r  rý   rþ   r3   rw   r}   r   r   r   Úlist_setsliceñ  s    zPythonAPI.list_setslicec             C   sF   t  | j| j| jg¡}| j|dd}| j tj|¡}| j	 
|||g¡S )z"
        Borrow reference
        ZPyTuple_GetItem)ry   )r   rS   rX   re   r{   r/   r	  r   rd   r0   r|   )r   Útupr  rw   r}   r   r   r   Útuple_getitemþ  s    zPythonAPI.tuple_getitemc             C   sV   t j| j| jgdd}| j|dd}| j tjt	|ƒ¡}|g}| 
|¡ | j ||¡S )NT)r   ZPyTuple_Pack)ry   )r   rS   rX   re   r{   r/   r	  r   rd   rH   Úextendr0   r|   )r   Úitemsrw   r}   Únrƒ   r   r   r   Ú
tuple_pack  s    
zPythonAPI.tuple_packc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyTuple_Size)ry   )r   rS   re   rX   r{   r0   r|   )r   r  rw   r}   r   r   r   Ú
tuple_size  s    zPythonAPI.tuple_sizec             C   s>   t  | jt  ¡ g¡}| j|dd}| j || j t	j
|¡g¡S )NZPyTuple_New)ry   )r   rS   rX   r\   r{   r0   r|   r/   r	  r   Úint32)r   Úcountrw   r}   r   r   r   Ú	tuple_new  s    zPythonAPI.tuple_newc             C   sT   t  t  ¡ | jt  ¡ | jg¡}| j|dd}| j tj|¡}| j	 
||||g¡ dS )z/
        Steals a reference to `item`.
        ZPyTuple_SetItem)ry   N)r   rS   r\   rX   r{   r/   r	  r   r  r0   r|   )r   Z	tuple_valrJ   Úitemrw   Z
setitem_fnr   r   r   Útuple_setitem  s    zPythonAPI.tuple_setitemc             C   s@   |d kr|   ¡ }t | j| jg¡}| j|dd}| j ||g¡S )NZ	PySet_New)ry   )ru   r   rS   rX   r{   r0   r|   )r   Úiterablerw   r}   r   r   r   Úset_new'  s
    zPythonAPI.set_newc             C   s8   t  t  ¡ | j| jg¡}| j|dd}| j |||g¡S )NZ	PySet_Add)ry   )r   rS   r\   rX   r{   r0   r|   )r   Úsetr<   rw   r}   r   r   r   Úset_add.  s    zPythonAPI.set_addc             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||g¡S )NZPySet_Clear)ry   )r   rS   r\   rX   r{   r0   r|   )r   r  rw   r}   r   r   r   Ú	set_clear3  s    zPythonAPI.set_clearc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZ
PySet_Size)ry   )r   rS   re   rX   r{   r0   r|   )r   r  rw   r}   r   r   r   Úset_size8  s    zPythonAPI.set_sizec             C   s8   t  t  ¡ | j| jg¡}| j|dd}| j |||g¡S )NZ_PySet_Update)ry   )r   rS   r\   rX   r{   r0   r|   )r   r  r  rw   r}   r   r   r   Ú
set_update=  s    zPythonAPI.set_updatec             C   sP   t  t  ¡ | j| j ¡ | j ¡ | j ¡ g¡}| j|dd}| j 	|||||f¡S )NZ_PySet_NextEntry)ry   )
r   rS   r\   rX   re   rY   rj   r{   r0   r|   )r   r  ÚposptrÚkeyptrÚhashptrrw   r}   r   r   r   Úset_next_entryB  s
    
zPythonAPI.set_next_entryc       	   
   #   sð   | j ‰tjˆ| jdd}tjˆ| jdd}tjˆt | jd¡dd}ˆ 	d¡}ˆ 	d¡‰ ˆ 
|¡ ‡ ‡fdd	„}ˆ |¡b |  ||||¡}t ˆ|¡}ˆj|d
d ˆ 
ˆ ¡ W d Q R X tˆ |¡|ƒV  ˆ 
|¡ W d Q R X ˆ ˆ ¡ d S )Nr   )ry   r  r   r  Úbb_bodyÚbb_endc                  s   ˆ  ˆ ¡ d S )N)Úbranchr   )r#  r0   r   r   rO   W  s    z'PythonAPI.set_iterate.<locals>.do_breakF)r¦   )r0   r   r¢   rj   rX   Úalloca_once_valuer   r   re   Zappend_basic_blockr$  Z
goto_blockr!  rp   Zif_thenrN   r¨   Zposition_at_end)	r   r  r   r  r  r"  rO   ÚrZfinishedr   )r#  r0   r   Úset_iterateI  s$    


zPythonAPI.set_iteratec             C   sN   t  | j¡}t  t  ¡ |g¡}|  |d¡}t | j| j¡}| j 	||g¡ |S )zk
        Ensure the GIL is acquired.
        The returned value must be consumed by gil_release().
        Znumba_gil_ensure)
r   r[   rg   rS   rz   r{   r   r¢   r0   r|   )r   Úgilptrtyrw   r}   Zgilptrr   r   r   Ú
gil_ensureh  s    zPythonAPI.gil_ensurec             C   s:   t  | j¡}t  t  ¡ |g¡}|  |d¡}| j ||g¡S )zg
        Release the acquired GIL by gil_ensure().
        Must be paired with a gil_ensure().
        Znumba_gil_release)r   r[   rg   rS   rz   r{   r0   r|   )r   Zgilr(  rw   r}   r   r   r   Úgil_releaset  s    zPythonAPI.gil_releasec             C   s*   t  | jg ¡}| j|dd}| j |g ¡S )zj
        Release the GIL and return the former thread state
        (an opaque non-NULL pointer).
        ZPyEval_SaveThread)ry   )r   rS   r]   r{   r0   r|   )r   rw   r}   r   r   r   Úsave_thread~  s    zPythonAPI.save_threadc             C   s6   t  t  ¡ | jg¡}| j|dd}| j ||g¡ dS )zH
        Restore the given thread state by reacquiring the GIL.
        ZPyEval_RestoreThread)ry   N)r   rS   rz   r]   r{   r0   r|   )r   Zthread_staterw   r}   r   r   r   Úrestore_thread‡  s    zPythonAPI.restore_threadc             C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZnumba_get_pyobject_private_data)ry   )r   rS   r]   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úobject_get_private_data”  s    z!PythonAPI.object_get_private_datac             C   s8   t  t  ¡ | j| jg¡}| j|dd}| j |||f¡S )NZnumba_set_pyobject_private_data)ry   )r   rS   rz   rX   r]   r{   r0   r|   )r   r3   Úptrrw   r}   r   r   r   Úobject_set_private_data™  s    z!PythonAPI.object_set_private_datac             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||f¡S )NZ!numba_reset_pyobject_private_data)ry   )r   rS   rz   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úobject_reset_private_dataž  s    z#PythonAPI.object_reset_private_datac             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyImport_ImportModuleNoBlock)ry   )r   rS   rX   rf   r{   r0   r|   )r   Úmodnamerw   r}   r   r   r   Úimport_module_noblock¨  s    zPythonAPI.import_module_noblockc             C   sT   t j| j| jgdd}| j|dd}|gt|ƒ }| | j tj	¡¡ | j
 ||¡S )NT)r   ZPyObject_CallFunctionObjArgs)ry   )r   rS   rX   r{   r‚   rI   r/   Úget_constant_nullr   rW   r0   r|   )r   ÚcalleeÚobjargsrw   r}   rƒ   r   r   r   Úcall_function_objargs­  s
    zPythonAPI.call_function_objargsr   c       
      C   s’   | j  | j|¡}tj| j| j| j| jgdd}| j|dd}dt|ƒ }| j  | j|¡}|||g}	|rp|	 	|¡ |	 
| j  tj¡¡ | j ||	¡S )NT)r   ZPyObject_CallMethod)ry   ÚO)r/   rŒ   rT   r   rS   rX   rf   r{   rH   r  rI   r3  r   rW   r0   r|   )
r   r4  Úmethodr5  Zcnamerw   r}   r…   Zcfmtrƒ   r   r   r   Úcall_method´  s    

zPythonAPI.call_methodc             C   sX   |d kr|   ¡ }|d kr |   ¡ }t | j| jgd ¡}| j|dd}| j ||||f¡S )Nr   ZPyObject_Call)ry   )ru   r   rS   rX   r{   r0   r|   )r   r4  rƒ   r„   rw   r}   r   r   r   r|   Á  s    zPythonAPI.callc             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||g¡S )NZPyObject_IsTrue)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úobject_istrueÊ  s    zPythonAPI.object_istruec             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||g¡S )NZPyObject_Not)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Ú
object_notÏ  s    zPythonAPI.object_notc          	   C   s²  ddddddg}||krp|  |¡}t | j| j| jt ¡ g¡}| j|dd}| j tj	|¡}| j
 ||||f¡S |d	kr˜| j
 tj||¡}	|  tj|	¡S |d
krÀ| j
 tj||¡}	|  tj|	¡S |dkržt t ¡ | j| jg¡}| j|dd}| j
 |||f¡}
| j tj	d¡}| j
 tj|
|¡}t | j
t | j¡¡}t | j
|¡D |dkr`| j
 |
¡}
| j
 |
t d¡¡}| j
 |  |¡|¡ W dQ R X | j
 |¡S tdj|dƒ‚dS )zd
        Refer to Python source Include/object.h for macros definition
        of the opid.
        ú<z<=z==z!=ú>z>=ZPyObject_RichCompare)ry   Úiszis not)Úinznot inZPySequence_Containséÿÿÿÿznot iné   NzUnknown operator {op!r})Úop)rJ   r   rS   rX   r\   r{   r/   r	  r   r  r0   r|   rÉ   rÊ   ZICMP_EQr(   ZbooleanZICMP_NEr   r%  r   ÚnullÚ	if_likelyÚnot_rË   r6   rø   r¨   ÚNotImplementedErrorÚformat)r   rÝ   rÞ   ZopstrZopsZopidrw   r}   ZlopidZbitflagÚstatusÚnegoneZis_goodZoutptrZ	truncatedr   r   r   Úobject_richcompareÔ  s<    


zPythonAPI.object_richcomparec             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyIter_Next)ry   )r   rS   rX   r{   r0   r|   )r   Ziterobjrw   r}   r   r   r   Ú	iter_nextý  s    zPythonAPI.iter_nextc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyObject_GetIter)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úobject_getiter  s    zPythonAPI.object_getiterc             C   sF   | j  | j|¡}t | j| j| jg¡}| j|dd}| j 	|||g¡S )NZPyObject_GetAttrString)ry   )
r/   rŒ   rT   r   rS   rX   rf   r{   r0   r|   )r   r3   Úattrr­   rw   r}   r   r   r   Úobject_getattr_string  s    zPythonAPI.object_getattr_stringc             C   s6   t  | j| j| jg¡}| j|dd}| j |||g¡S )NZPyObject_GetAttr)ry   )r   rS   rX   r{   r0   r|   )r   r3   rM  rw   r}   r   r   r   Úobject_getattr  s    zPythonAPI.object_getattrc             C   sN   | j  | j|¡}t t ¡ | j| j| jg¡}| j|dd}| j	 
||||g¡S )NZPyObject_SetAttrString)ry   )r/   rŒ   rT   r   rS   r\   rX   rf   r{   r0   r|   )r   r3   rM  r+   r­   rw   r}   r   r   r   Úobject_setattr_string  s    zPythonAPI.object_setattr_stringc             C   s>   t  t  ¡ | j| j| jg¡}| j|dd}| j ||||g¡S )NZPyObject_SetAttr)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rM  r+   rw   r}   r   r   r   Úobject_setattr  s    zPythonAPI.object_setattrc             C   s   |   |||  ¡ ¡S )N)rP  ru   )r   r3   rM  r   r   r   Úobject_delattr_string  s    zPythonAPI.object_delattr_stringc             C   s   |   |||  ¡ ¡S )N)rQ  ru   )r   r3   rM  r   r   r   Úobject_delattr"  s    zPythonAPI.object_delattrc             C   s6   t  | j| j| jg¡}| j|dd}| j |||f¡S )z!
        Return obj[key]
        ZPyObject_GetItem)ry   )r   rS   rX   r{   r0   r|   )r   r3   Úkeyrw   r}   r   r   r   Úobject_getitem'  s    zPythonAPI.object_getitemc             C   s>   t  t  ¡ | j| j| jg¡}| j|dd}| j ||||f¡S )z 
        obj[key] = val
        ZPyObject_SetItem)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rT  r+   rw   r}   r   r   r   Úobject_setitem/  s    zPythonAPI.object_setitemc             C   s8   t  t  ¡ | j| jg¡}| j|dd}| j |||f¡S )z
        del obj[key]
        ZPyObject_DelItem)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rT  rw   r}   r   r   r   Úobject_delitem7  s    zPythonAPI.object_delitemc             C   sB   t  | j| jg¡}tdkr d}nd}| j||d}| j ||g¡S )N)r   r   ZPyUnicode_AsUTF8ZPyString_AsString)ry   )r   rS   rf   rX   r	   r{   r0   r|   )r   Ústrobjrw   rð   r}   r   r   r   Ústring_as_string?  s    zPythonAPI.string_as_stringc             C   s
  t  | j| j¡}tdkrrt | j| j| j 	¡ g¡}d}| j
||d}| j |||g¡}| j dt |jd¡|¡}n†t tj ¡ | j| j 	¡ | j 	¡ g¡}d}| j
||d}t  | j| j¡}| j ||||g¡}	t |	jd¡}
| j d|	|
¡}| j |¡}||| j |¡fS )zô
        Returns a tuple of ``(ok, buffer, length)``.
        The ``ok`` is i1 value that is set if ok.
        The ``buffer`` is a i8* of the output buffer.
        The ``length`` is a i32/i64 (py_ssize_t) of the length of the buffer.
        )r   r   ZPyUnicode_AsUTF8AndSize)ry   z!=NZPyString_AsStringAndSizer@  )r   r¢   r0   re   r	   r   rS   rf   rX   rY   r{   r|   Úicmp_unsignedr   r   rq   rÊ   r\   Zicmp_signedr¨   )r   rX  Úp_lengthrw   rð   r}   ÚbufferÚokZp_bufferrH  rI  r   r   r   Ústring_as_string_and_sizeH  s*    z#PythonAPI.string_as_string_and_sizec       
      C   sÞ   t dkrÎt | j| j¡}t | jt ¡ ¡}t | j| j¡}t | j	| j
| j ¡ t ¡  ¡ | j ¡ g¡}d}| j||d}| j |||||g¡}| j dt |jd¡|¡}	|	|| j |¡| j |¡| j |¡fS dsÚtdƒ‚dS )aŽ  
        Returns a tuple of ``(ok, buffer, length, kind)``.
        The ``ok`` is i1 value that is set if ok.
        The ``buffer`` is a i8* of the output buffer.
        The ``length`` is a i32/i64 (py_ssize_t) of the length of the buffer.
        The ``kind`` is a i32 (int32) of the Unicode kind constant
        The ``hash`` is a long/uint64_t (py_hash_t) of the Unicode constant hash
        )r   r   Znumba_extract_unicode)ry   z!=NFznot supported on Python < 3.3)r	   r   r¢   r0   re   r   r\   rj   rS   rf   rX   rY   r{   r|   rZ  r   r   rq   r¨   r   )
r   rX  r[  Zp_kindZp_hashrw   rð   r}   r\  r]  r   r   r   Ústring_as_string_size_and_kindl  s"    	
z(PythonAPI.string_as_string_size_and_kindc             C   sH   t  | j| j| jg¡}tdkr$d}nd}| j||d}| j |||g¡S )N)r   r   ZPyUnicode_FromStringAndSizeÚPyString_FromStringAndSize)ry   )	r   rS   rX   rf   re   r	   r{   r0   r|   )r   ÚstringÚsizerw   rð   r}   r   r   r   Ústring_from_string_and_size‰  s    z%PythonAPI.string_from_string_and_sizec             C   sB   t  | j| jg¡}tdkr d}nd}| j||d}| j ||g¡S )N)r   r   ZPyUnicode_FromStringZPyString_FromString)ry   )r   rS   rX   rf   r	   r{   r0   r|   )r   ra  rw   rð   r}   r   r   r   Ústring_from_string’  s    zPythonAPI.string_from_stringc             C   sR   t  | jt  ¡ | j| jg¡}tdks,tdƒ‚d}| j||d}| j	 
||||g¡S )N)r   r   z"unsupported in this python-versionZPyUnicode_FromKindAndData)ry   )r   rS   rX   r\   rf   re   r	   r   r{   r0   r|   )r   Zkindra  rb  rw   rð   r}   r   r   r   Ústring_from_kind_and_data›  s
    z#PythonAPI.string_from_kind_and_datac             C   sH   t  | j| j| jg¡}tdkr$d}nd}| j||d}| j |||g¡S )N)r   r   ZPyBytes_FromStringAndSizer`  )ry   )	r   rS   rX   rf   re   r	   r{   r0   r|   )r   ra  rb  rw   rð   r}   r   r   r   Úbytes_from_string_and_size¢  s    z$PythonAPI.bytes_from_string_and_sizec             C   s4   t  | j| jg¡}d}| j||d}| j ||g¡S )NZPyObject_Hash)ry   )r   rS   rj   rX   r{   r0   r|   )r   r3   rw   rð   r}   r   r   r   Úobject_hash«  s    zPythonAPI.object_hashc             C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyObject_Str)ry   )r   rS   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Ú
object_str±  s    zPythonAPI.object_strc             C   s   |   ¡ }|  |¡ |S )N)rï   r~   )r   r3   r   r   r   r•   ¶  s    
zPythonAPI.make_nonec             C   s
   |   d¡S )NZ_Py_NoneStruct)r   )r   r   r   r   rï   »  s    zPythonAPI.borrow_nonec             G   sR   t jt  ¡ | jgdd}tdkr0| j|dd}n| j|dd}| j ||f| ¡S )NT)r   )r   é   ZPySys_FormatStdout)ry   ZPySys_WriteStdout)r   rS   rz   rf   r	   r{   r0   r|   )r   r…   rƒ   rw   r}   r   r   r   Úsys_write_stdout¾  s
    zPythonAPI.sys_write_stdoutc             C   s2   t  t  ¡ | jg¡}| j|dd}| j ||f¡S )zL
        Dump a Python object on C stderr.  For debugging purposes.
        Z_PyObject_Dump)ry   )r   rS   rz   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úobject_dumpÆ  s    zPythonAPI.object_dumpc       
      C   s¬   | j jstdƒ‚t d¡}t | j| j||| jg¡}| j	|dd}|j
d  tj¡ | j  tj|j¡}| j  tjt|jƒ¡}t | j|¡}	| j || j |	| j¡|||g¡S )NzNRT requiredé    ZNRT_adapt_ndarray_to_python)ry   r   )r/   Ú
enable_nrtr   r   rh   r   rS   rX   r]   r{   rƒ   Úadd_attributerÊ   ÚATTR_NO_CAPTUREr	  r   r  Úndimr\   Zmutabler   r%  r0   r|   Úbitcast)
r   ZarytyÚaryZdtypeptrZinttyrw   r}   rp  ÚwritableZaryptrr   r   r   Únrt_adapt_ndarray_to_pythonÒ  s    
z%PythonAPI.nrt_adapt_ndarray_to_pythonc             C   sn   | j j}t tjtjtjg¡}|j|dd}|jd  t	j
¡ |jd  t	j
¡ |j d¡ | j  |||g¡S )za
        Allocate a new MemInfo with data payload borrowed from a python
        object.
        ZNRT_meminfo_new_from_pyobject)ry   r   rA  Únoalias)r0   rT   r   ÚFunctionTyper   Ú	voidptr_tÚget_or_insert_functionrƒ   rn  rÊ   ro  Úreturn_valuer|   )r   ÚdatarX   Úmodrw   r}   r   r   r   Únrt_meminfo_new_from_pyobjectã  s    z'PythonAPI.nrt_meminfo_new_from_pyobjectc             C   sD   | j j}t | jtjg¡}|j|dd}|j 	d¡ | j  
||g¡S )NZNRT_meminfo_as_pyobject)ry   ru  )r0   rT   r   rv  rX   r   rw  rx  ry  rn  r|   )r   Zmiptrr{  rw   r}   r   r   r   Únrt_meminfo_as_pyobjectö  s    
z!PythonAPI.nrt_meminfo_as_pyobjectc             C   sD   | j j}t tj| jg¡}|j|dd}|j 	d¡ | j  
||g¡S )NZNRT_meminfo_from_pyobject)ry   ru  )r0   rT   r   rv  r   rw  rX   rx  ry  rn  r|   )r   Zmiobjr{  rw   r}   r   r   r   Únrt_meminfo_from_pyobject  s    
z#PythonAPI.nrt_meminfo_from_pyobjectc             C   sh   | j jst‚t t ¡ | j| jg¡}| j|dd}|j	d  
tj¡ |j	d  
tj¡ | j |||f¡S )NZNRT_adapt_ndarray_from_python)ry   r   rA  )r/   rm  r   r   rS   r\   rX   r]   r{   rƒ   rn  rÊ   ro  r0   r|   )r   rr  r.  rw   r}   r   r   r   Únrt_adapt_ndarray_from_python  s    z'PythonAPI.nrt_adapt_ndarray_from_pythonc             C   sn   | j jst‚t t ¡ t | j¡| jg¡}| j	|dd}|j
d  tj¡ |j
d  tj¡ | j |||f¡S )NZNRT_adapt_buffer_from_python)ry   r   rA  )r/   rm  r   r   rS   rz   r[   ri   r]   r{   rƒ   rn  rÊ   ro  r0   r|   )r   Úbufr.  rw   r}   r   r   r   Únrt_adapt_buffer_from_python  s    
z&PythonAPI.nrt_adapt_buffer_from_pythonc             C   s   | j j||dS )N)ry   )rT   rx  )r   rw   ry   r   r   r   r{   #  s    zPythonAPI._get_functionc             C   s   | j  | j¡S )N)r0   ZallocarX   )r   r   r   r   Ú
alloca_obj&  s    zPythonAPI.alloca_objc             C   s   t  | jtj | j¡¡}|S )zT
        Return a pointer to a stack-allocated, zero-initialized Py_buffer.
        )r   r%  r0   rÊ   r   rC  ri   )r   r.  r   r   r   Úalloca_buffer)  s    zPythonAPI.alloca_bufferc          	   c   s.   t  | jt  | j|¡¡ d V  W d Q R X d S )N)r   rD  r0   r©   )r   r3   r   r   r   rº   2  s    zPythonAPI.if_object_okc             C   s>   |   |¡}|  |¡}| j | jd¡}|  ||¡ |  |¡ d S )Nz%s)rh  rY  r/   rŒ   rT   rj  r   )r   r3   rX  r­   r…   r   r   r   Úprint_object8  s
    

zPythonAPI.print_objectc             C   s   | j  | j|¡}|  |¡ d S )N)r/   rŒ   rT   rj  )r   Útextr…   r   r   r   Úprint_string?  s    zPythonAPI.print_stringc             C   s   t  | j¡S )N)r   rC  rX   )r   r   r   r   ru   C  s    zPythonAPI.get_null_objectc             C   s   |   ¡ }| j |¡ d S )N)r•   r0   rt   )r   Znoner   r   r   Úreturn_noneF  s    zPythonAPI.return_nonec          	   C   sz   t |ƒ}|  | j tj|¡¡}|  |¡H x@t|ƒD ]4}| j tj|¡}|  || ¡ |  	|||| ¡ q4W W d Q R X |S )N)
rH   r  r/   r	  r   rd   rº   r§   r~   r  )r   r  r  Úseqr¤   r  r   r   r   Ú	list_packJ  s     zPythonAPI.list_packc             C   sf   t  | j| jt d¡f¡}| j|dd}| j | j 	|¡d¡}| j | j 	|¡d¡}| j 
|||f¡S )zx
        Unserialize some data.  *structptr* should be a pointer to
        a {i8* data, i32 length} structure.
        rl  Znumba_unpickle)ry   r   rA  )r   rS   rX   r]   r   rh   r{   r0   Zextract_valuer¨   r|   )r   Z	structptrrw   r}   r.  r  r   r   r   ÚunserializeT  s
    zPythonAPI.unserializec             C   s„   t j|dd}t|ƒdk st‚dtjdkr2t|ƒnd }t |¡}| j	 
| j||¡}tj | | j¡t t d¡|jjj¡g¡}|S )z“
        Same as serialize_object(), but don't create a global variable,
        simply return a literal {i8* data, i32 length} structure.
        r@  )Zprotocoll        z.const.pickledata.%sr   ÚDIFF_IRrl  )ÚpickleÚdumpsrH   r   r
   r‹  Úidr   Zmake_bytearrayr/   Úinsert_unique_constrT   r   r   Zliteral_structrq  r]   rh   rq   rr   r  )r   r3   rz  ry   ZbdataZarrÚstructr   r   r   Úserialize_uncached_  s    

zPythonAPI.serialize_uncachedc             C   sl   y| j j| }W nV tk
rf   |  |¡}dtjdkr>t|ƒnd }| j | j ||¡}|| j j|< Y nX |S )zÀ
        Serialize the given object in the bitcode, and return it
        as a pointer to a {i8* data, i32 length}, structure constant
        (suitable for passing to unserialize()).
        z.const.picklebuf.%sr   r‹  )	rT   rU   r   r‘  r
   r‹  rŽ  r/   r  )r   r3   Zgvr  ry   r   r   r   Úserialize_objectq  s    
zPythonAPI.serialize_objectc             C   s   t  | j|  ¡ ¡S )N)r   r©   r0   rŽ   )r   r   r   r   Úc_api_error  s    zPythonAPI.c_api_errorc             C   s6   ddl m} t |j|¡}t| j| j| ƒ}||||ƒS )zn
        Unbox the Python object as the given Numba type.
        A NativeValue instance is returned.
        r   )Úunbox_unsupported)Únumba.targets.boxingr”  Ú	_unboxersr"   Ú	__class__r1   r/   r0   )r   r*   r3   r”  ÚimplÚcr   r   r   r2   „  s    zPythonAPI.to_native_valuec             C   s&   t |tjƒrtdƒ‚|  |||¡}|S )Nz;callconv should have prevented the return of optional value)r@   r   ZOptionalr   r(   )r   r*   r+   r)   Úoutr   r   r   Úfrom_native_return  s    zPythonAPI.from_native_returnc             C   s8   ddl m} t |j|¡}t| j| j| |ƒ}||||ƒS )zÒ
        Box the native value of the given Numba type.  A Python object
        pointer is returned (NULL if an error occurred).
        This method steals any native (NRT) reference embedded in *val*.
        r   )Úbox_unsupported)r•  rœ  Ú_boxersr"   r—  r&   r/   r0   )r   r*   r+   r)   rœ  r˜  r™  r   r   r   r(   –  s    zPythonAPI.from_native_valuec             C   sX   t  |j¡}|dkrtjS t | jtj¡}t| j| j| ||ƒ}||||ƒ | j 	|j
¡S )z
        Reflect the native value onto its Python original, if any.
        An error bit (as an LLVM value) is returned.
        N)Ú_reflectorsr"   r—  r   r=   r%  r0   r5   r/   r¨   r7   )r   r*   r+   r)   r˜  r7   r™  r   r   r   r9   £  s    zPythonAPI.reflect_native_valuec             C   s,   t  | j |¡¡}| j | j||¡}t|ƒS )zy
        Extract the generator structure pointer from a generator *obj*
        (a _dynfunc.Generator instance).
        )r   r[   r/   Úget_data_typeZget_generator_stater0   r;   )r   r3   r*   Z
gen_ptr_tyr<   r   r   r   Úto_native_generator³  s    zPythonAPI.to_native_generatorc          	   C   s"  | j  |¡}|jrt‚| j  |¡}| j  |¡}t | j| j| j| jg¡}| j	||j
d}t t ¡ | jg¡}	|jr„| j	|	|jd}
nt t |	¡¡}
t | j| j| jt |¡t |	¡| jg¡}| j	|dd}t | j|¡}| j || j¡}|dkrú|  ¡ }| j || j¡}| j |||||
|f¡S )zÝ
        Make a Numba generator (a _dynfunc.Generator instance) from a
        generator structure pointer *val*.
        *env* is an optional _dynfunc.Environment instance to be wrapped
        in the generator.
        )ry   Znumba_make_generatorN)r/   rŸ  Z
is_pointerr   Zget_abi_sizeofZget_generator_descr   rS   rX   r{   Zllvm_cpython_wrapper_namerz   r]   Zhas_finalizerZllvm_finalizer_namer   rC  r[   re   r   r0   rq  ru   r|   )r   r+   r*   rA   ZlltyZgen_struct_sizeZgendescZgenfntyZgenfnZfinalizertyÚ	finalizerrw   r}   Z
state_sizeZinitial_stater   r   r   Úfrom_native_generator¼  s.    

zPythonAPI.from_native_generatorc             C   sh   | j jrt‚t t ¡ | j| jg¡}| j|dd}|j	d  
tj¡ |j	d  
tj¡ | j |||f¡S )NZnumba_adapt_ndarray)ry   r   rA  )r/   rm  r   r   rS   r\   rX   r]   r{   rƒ   rn  rÊ   ro  r0   r|   )r   rr  r.  rw   r}   r   r   r   Únumba_array_adaptorå  s    zPythonAPI.numba_array_adaptorc             C   sb   t  t  ¡ t | j¡| jg¡}| j|dd}|jd  	t
j¡ |jd  	t
j¡ | j |||f¡S )NZnumba_adapt_buffer)ry   r   rA  )r   rS   rz   r   ÚPointerTyperi   r]   r{   rƒ   rn  rÊ   ro  r0   r|   )r   r€  r.  rw   r}   r   r   r   Únumba_buffer_adaptorí  s    
zPythonAPI.numba_buffer_adaptorc             C   s8   t  t  ¡ | j|jg¡}| j|dd}| j |||g¡S )NZnumba_complex_adaptor)ry   )r   rS   r\   rX   rq   r{   r0   r|   )r   rú   Zcmplxrw   r}   r   r   r   Úcomplex_adaptorõ  s    zPythonAPI.complex_adaptorc             C   s<   t  | j| jt | j¡g¡}| j|dd}| j 	|||g¡S )NZnumba_extract_record_data)ry   )
r   rS   r]   rX   r   r¤  ri   r{   r0   r|   )r   r3   Úpbufrw   r}   r   r   r   Úextract_record_dataú  s    zPythonAPI.extract_record_datac             C   s>   t  t  ¡ | jt | j¡g¡}| j|dd}| j 	|||g¡S )NZnumba_get_buffer)ry   )
r   rS   r\   rX   r   r¤  ri   r{   r0   r|   )r   r3   r§  rw   r}   r   r   r   Ú
get_buffer   s    
zPythonAPI.get_bufferc             C   s8   t  t  ¡ t | j¡g¡}| j|dd}| j ||g¡S )NZnumba_release_buffer)ry   )	r   rS   rz   r   r¤  ri   r{   r0   r|   )r   r§  rw   r}   r   r   r   Úrelease_buffer  s    zPythonAPI.release_bufferc             C   s4   t  t  d¡| jg¡}| j|dd}| j ||g¡S )Né@   Znumba_extract_np_datetime)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úextract_np_datetime  s    zPythonAPI.extract_np_datetimec             C   s4   t  t  d¡| jg¡}| j|dd}| j ||g¡S )Nr«  Znumba_extract_np_timedelta)ry   )r   rS   r\   rX   r{   r0   r|   )r   r3   rw   r}   r   r   r   Úextract_np_timedelta  s    zPythonAPI.extract_np_timedeltac             C   sL   t  t ¡ |¡}t | jt d¡t ¡ g¡}| j|dd}| j |||g¡S )Nr«  Znumba_create_np_datetime)ry   )r   r\   r   rS   rX   r{   r0   r|   )r   r+   Ú	unit_coderw   r}   r   r   r   Úcreate_np_datetime  s    zPythonAPI.create_np_datetimec             C   sL   t  t ¡ |¡}t | jt d¡t ¡ g¡}| j|dd}| j |||g¡S )Nr«  Znumba_create_np_timedelta)ry   )r   r\   r   rS   rX   r{   r0   r|   )r   r+   r®  rw   r}   r   r   r   Úcreate_np_timedelta  s    zPythonAPI.create_np_timedeltac             C   sX   t  | jt  t  d¡¡t  ¡ | jg¡}| j|dd}| | |¡¡}| j 	||||g¡S )NrR   Znumba_recreate_record)ry   )
r   rS   rX   r[   r\   r{   rM   rK   r0   r|   )r   Zpdatarb  Zdtyper)   rw   r}   Z	dtypeaddrr   r   r   Úrecreate_record!  s
    zPythonAPI.recreate_recordc             C   s0   | j  | j|¡}| j  tjt|ƒ¡}|  ||¡S )N)r/   rŒ   rT   r	  r   rd   rH   rc  )r   ra  r­   Zszr   r   r   Ústring_from_constant_string(  s    z%PythonAPI.string_from_constant_string)F)N)F)r   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)N)r   )NN)N)N)N)¬r#   r$   r%   r-   r   ro   rx   r~   r   r€   rŠ   r‹   r   rŽ   r   rs   r”   r—   r˜   r™   rš   rž   r¡   Ú
contextlibÚcontextmanagerr«   r   r®   r¯   r±   r³   r´   rµ   r¸   r¹   r½   r¾   rÀ   rÁ   rÂ   rÃ   rÄ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÙ   rÛ   rÜ   rà   rá   râ   rã   rä   rå   ræ   rç   ré   rê   rë   rì   rí   rî   rñ   rò   ró   rô   rõ   rö   rø   r÷   rù   rû   rü   r   r  r  r  r  r  r  rL   r
  r  r  r  r  r  r  r  r  r  r  r!  r'  r)  r*  r+  r,  r-  r/  r0  r2  r6  r9  r|   r:  r;  rJ  rK  rL  rN  rO  rP  rQ  rR  rS  rU  rV  rW  rY  r^  r_  rc  rd  re  rf  rg  rh  r•   rï   rj  rk  rt  r|  r}  r~  r  r  r{   r‚  rƒ  rº   r„  r†  ru   r‡  r‰  rŠ  r‘  r’  r“  r2   r›  r(   r9   r   r¢  r£  r¥  r¦  r¨  r©  rª  r¬  r­  r¯  r°  r±  r²  r   r   r   r   rP   ‘   sP  &			
		#			
	
	
	)	$				
	)rP   )4Z
__future__r   r   r   Úcollectionsr   r³  rŒ  Zllvmliter   Zllvmlite.llvmpy.corer   r   ZllvmpyZcorerÊ   Znumba.configr	   Znumba.ctypes_supportZctypes_supportr^   Znumbar
   r   r   r   r   r   rk   ZPY_UNICODE_1BYTE_KINDrl   ZPY_UNICODE_2BYTE_KINDrm   ZPY_UNICODE_4BYTE_KINDrn   ZPY_UNICODE_WCHAR_KINDÚobjectr   r  r–  rž  r   r,   r4   r:   r&   r1   r5   r;   r?   rN   rP   r   r   r   r   Ú<module>   s@   

"
