U
    Ã9%eh ã                   @   sV  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Z d dlm	Z	 d dl
Z
d dlmZ d dlmZmZmZmZmZmZmZ 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ƒZ)G dd„ deƒZ*eddƒZ+G dd„ deƒZ,G dd„ dƒZ-dS )é    )Ú
namedtupleN)Úir)ÚConstant)Ú
_helperlib)ÚtypesÚutilsÚconfigÚloweringÚcgutilsÚimputilsÚ	serializec                   @   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   úS/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/core/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   ÚTypeÚAssertionError)r   r   r   r   r   r   Úregister   s    z_Registry.registerNc                 C   s<   t |tjƒst‚|jD ] }| j |¡}|d k	r|  S q|S r   )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 r   ©Ú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&   5   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 r   )r(   Úto_native_value)r   r,   Úobjr   r   r   ÚunboxG   s    z_UnboxContext.unboxN)r#   r$   r%   r/   r0   r6   r   r   r   r   r3   @   s   r3   )r1   r2   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 r   )r2   ÚstoreÚis_errorr
   Ztrue_bitr   r   r   r   Ú	set_errorT   s    z_ReflectContext.set_errorc                 C   s   | j  ||| j¡S r   r'   r+   r   r   r   r.   W   s    z_ReflectContext.boxc                 C   s   | j  ||| j¡S r   )r(   Úreflect_native_valuer*   r+   r   r   r   ÚreflectZ   s    z_ReflectContext.reflectN)r#   r$   r%   r/   r0   r:   r.   r<   r   r   r   r   r7   K   s
   r7   )r1   r2   r(   r*   r9   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 r   )Úvaluer
   Ú	false_bitr9   Úcleanup)r   r>   r9   r@   r   r   r   r   d   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 r   )Ú
isinstancer	   ÚEnvironmentr   r(   ÚenvÚenv_bodyÚenv_ptr)r   r(   rD   rE   rF   r   r   r   r   l   s
    zEnvironmentManager.__init__c                 C   sT   t |tƒrt |¡}t| jjƒD ]\}}||kr  qPq t| jjƒ}| jj |¡ |S )zF
        Add a constant to the environment, return its index.
        )	rB   ÚstrÚsysÚinternÚ	enumeraterD   ÚconstsÚlenÚappend)r   ÚconstÚindexr-   r   r   r   Ú	add_consts   s    

zEnvironmentManager.add_constc              
   C   s¬   |t | jjƒk st‚| jj}| jj}tj|| jj	dd}| 
t ||¡¡R\}}|  | j ||¡}| ||¡ W 5 Q R X | | j dd¡ W 5 Q R X W 5 Q R X | |¡S )zå
        Look up constant number *index* inside the environment body.
        A borrowed reference is returned.

        The returned LLVM value may have NULL value at runtime which indicates
        an error at runtime.
        T©ÚzfillÚPyExc_RuntimeErrorz$`env.consts` is NULL in `read_const`)rL   rD   rK   r   r(   r2   rE   r
   Úalloca_onceÚpyobjÚif_elseÚis_not_nullÚlist_getitemr8   Úerr_set_stringÚload)r   rO   r2   rK   ÚretZbr_not_nullZbr_nullÚgetitemr   r   r   Ú
read_const‚   s    þzEnvironmentManager.read_constN)r#   r$   r%   r   rP   r]   r   r   r   r   rA   j   s   rA   Ú_IteratorLoop)r>   Údo_breakc                   @   s”  e Zd ZdZdd„ Zdd„ Zd]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d „Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zejd_d+d,„ƒZd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd`d:d;„Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2dad`da„Z3dbdbdc„Z4dcddde„Z5dddfdg„Z6dedhdi„Z7dfdjdk„Z8dgdldm„Z9dhdndo„Z:didpdq„Z;djdrds„Z<dkdtdu„Z=dldvdw„Z>dmdxdy„Z?dndzd{„Z@d|d}„ ZAd~d„ ZBd€d„ ZCd‚dƒ„ ZDd„d…„ ZEd†d‡„ ZFdˆd‰„ ZGdŠd‹„ ZHdŒd„ ZIdŽd„ ZJdd‘„ 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­„ ZYdod®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dpdÏdÐ„ZjdqdÑ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„ Zdd„ Zdd„ Z‘dd „ Z’ejd!d"„ ƒZ“d#d$„ Z”d%d&„ Z•d'd(„ Z–d)d*„ Z—d+d,„ Z˜d-d.„ Z™d/d0„ Zšd1d2„ Z›d3d4„ Zœd5d6„ Zd7d8„ Zžd9d:„ ZŸdrd;d<„Z dsd=d>„Z¡d?d@„ Z¢dtdAdB„Z£dCdD„ Z¤dEdF„ Z¥dGdH„ Z¦dIdJ„ Z§dKdL„ Z¨dMdN„ Z©dOdP„ ZªdQdR„ Z«dSdT„ Z¬dUdV„ Z­dWdX„ Z®dYdZ„ Z¯d[d\„ Z°dS (u  Ú	PythonAPIz^
    Code generation facilities to call into the CPython C API (and related
    helpers).
    c                 C   s0  || _ || _|jjj| _z| jj W n tk
r@   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#¡| _$| j| _%tj&| _&tj'| _'tj(| _(tj)| _)dS )zL
        Note: Maybe called multiple times when lowering a function
        é   N)*r1   r2   Zbasic_blockÚfunctionÚmoduleÚ_PythonAPI__serializedÚAttributeErrorZget_argument_typer   ÚpyobjectrU   Ú
as_pointerÚpyobjptrr   ÚPointerTypeÚIntTypeÚvoidptrÚctypesZsizeofZc_longÚlongÚulongZc_ulonglongÚlonglongÚ	ulonglongÚ
DoubleTypeÚdoubleÚget_value_typeÚintpÚ
py_ssize_tÚcstringr   Zpy_gil_state_sizeÚ	gil_stateÚ	ArrayTypeZpy_buffer_sizeÚpy_buffer_tÚ	py_hash_tÚpy_unicode_1byte_kindÚpy_unicode_2byte_kindÚpy_unicode_4byte_kindÚpy_unicode_wchar_kind)r   r1   r2   r   r   r   r   §   s0    
zPythonAPI.__init__c                 C   s   t | |||ƒS r   )rA   )r   rD   rE   rF   r   r   r   Úget_env_managerÈ   s    zPythonAPI.get_env_managerFÚ c              	   C   sŒ   t  | j|¡}t  | j|¡f |rb| jjjj}|j| jks>t	‚|  
dd|› ¡ | j |  ¡ ¡ n| jj | jtd|› f¡ W 5 Q R X dS )z;Emits LLVM code to ensure the `envptr` is not NULL
        rS   zmissing Environment: N)r
   Úis_nullr2   Zif_unlikelyrb   ÚtypeÚpointeeÚreturn_typerU   r   rY   r[   Úget_null_objectr1   Ú	call_convZreturn_user_excÚRuntimeError)r   ZenvptrZreturn_pyobjectZ	debug_msgr   Ú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   ÚFunctionTypeÚVoidTyperU   Ú_get_functionr2   Úcall©r   r5   rˆ   Úfnr   r   r   Úincrefä   s    zPythonAPI.increfc                 C   s6   t  t  ¡ | jg¡}| j|dd}| j ||g¡ d S )NZ	Py_DecRefrŠ   rŒ   r‘   r   r   r   Údecrefé   s    zPythonAPI.decrefc                 C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZnumba_py_typerŠ   ©r   r   rU   r   r2   r   r‘   r   r   r   Úget_typeî   s    zPythonAPI.get_typec                 G   sl   t  t  d¡¡}t  |¡}| j| j||g}t jt  d¡|dd}	| j|	dd}
| j |
||||gt|ƒ ¡S )Nra   é    T©Zvar_argZPyArg_ParseTupleAndKeywordsrŠ   ©	r   ri   rj   rU   r   r   r2   r   Úlist)r   ÚargsÚkwsÚfmtÚkeywordsÚobjsÚcharptrZ
charptraryÚargtypesrˆ   r’   r   r   r   Úparse_tuple_and_keywords÷   s    
z"PythonAPI.parse_tuple_and_keywordsc                 G   sX   t  t  d¡¡}| j|g}t jt  d¡|dd}| j|dd}| j |||gt|ƒ ¡S )Nra   r—   Tr˜   ZPyArg_ParseTuplerŠ   r™   )r   r›   r   rŸ   r    r¡   rˆ   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d}| j|dd}	t| jt|ƒƒ}t| jt|ƒƒ}t	|t
ƒr‚| j | jj|¡}| j |	||||gt|ƒ ¡S )Nra   r—   Tr˜   ZPyArg_UnpackTuplerŠ   )r   ri   rj   rU   ru   r   r   r   ÚintrB   rG   r1   Úinsert_const_stringr2   rc   r   rš   )
r   r›   r‹   Zn_minZn_maxrŸ   r    r¡   rˆ   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_OccurredrŠ   r•   ©r   rˆ   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_ClearrŠ   )r   r   rŽ   r   r2   r   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_SetStringrŠ   )r   r   rŽ   rU   rv   r   rB   rG   Úget_c_objectr1   r¥   rc   r2   r   )r   ÚexctypeÚmsgrˆ   r’   r   r   r   rY     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 )NTr˜   ZPyErr_FormatrŠ   )r   r   rŽ   rU   rv   r   rB   rG   rª   r1   r¥   rc   r2   r   Útuple)r   r«   r¬   Zformat_argsrˆ   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_raiserŠ   N)r   r   rŽ   rU   r   Ú	make_noner2   r   )r   Úexcrˆ   r’   r   r   r   Úraise_object1  s
    zPythonAPI.raise_objectc                 C   sL   t  t  ¡ | j| jg¡}| j|dd}t|tƒr:|  |¡}| j 	|||f¡S )NZPyErr_SetObjectrŠ   ©
r   r   rŽ   rU   r   rB   rG   rª   r2   r   )r   r«   Zexcvalrˆ   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_SetNonerŠ   r²   )r   r«   rˆ   r’   r   r   r   Úerr_set_noneC  s
    

zPythonAPI.err_set_nonec                 C   s2   t  t  ¡ | jg¡}| j|dd}| j ||f¡S )NZPyErr_WriteUnraisablerŠ   rŒ   r‘   r   r   r   Úerr_write_unraisableJ  s    zPythonAPI.err_write_unraisablec                 C   s:   t  t  ¡ | jgd ¡}| j|dd}| j ||||f¡S )Né   ZPyErr_FetchrŠ   )r   r   rŽ   rh   r   r2   r   )r   ÚptyÚpvalÚptbrˆ   r’   r   r   r   Ú	err_fetchO  s    zPythonAPI.err_fetchc                 C   s:   t  t  ¡ | jgd ¡}| j|dd}| j ||||f¡S )Nr¶   ZPyErr_RestorerŠ   rŒ   )r   Útyr-   Útbrˆ   r’   r   r   r   Úerr_restoreT  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 5 Q R X |
 ˆ  	|||¡ W 5 Q R X W 5 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
   rT   r2   rU   )Ú.0Úir   r   r   Ú
<listcomp>a  s   ÿz&PythonAPI.err_push.<locals>.<listcomp>r¶   NF©Zlikely)
Úrangerº   r2   rZ   r
   rW   r¨   rV   r”   r½   )r   Zkeep_newr·   r¸   r¹   r»   r-   r¼   Z	new_errorZif_errorZif_okr   r   r   Úerr_pushY  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)r1   Zget_c_valuer2   rU   rƒ   )r   r‹   r   r   r   rª   v  s    ÿzPythonAPI.get_c_objectc                 C   s(   d| }| j  | j|¡}|  d|¡ d S )Nzglobal name '%s' is not definedÚPyExc_NameError©r1   r¥   rc   rY   ©r   r‹   r¬   Úcstrr   r   r   Úraise_missing_global_error  s    z$PythonAPI.raise_missing_global_errorc                 C   s(   d| }| j  | j|¡}|  d|¡ d S )Nzname '%s' is not definedrÄ   rÅ   rÆ   r   r   r   Úraise_missing_name_error†  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_FatalErrorrŠ   Znoreturn)r   r   rŽ   rv   r   Ú
attributesÚaddr1   r¥   rc   r2   r   )r   r¬   rˆ   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 )úFLookup name inside dict

        Returns a borrowed reference
        ZPyDict_GetItemStringrŠ   )
r   r   rU   rv   r   r1   r¥   rc   r2   r   )r   Údicr‹   rˆ   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 )rÍ   ZPyDict_GetItemrŠ   r•   )r   rÎ   r‹   rˆ   r’   r   r   r   Údict_getitem   s    zPythonAPI.dict_getitemr   c                 C   sr   |dkr2t  | jd¡}| j|dd}| j |d¡S t  | j| jg¡}| j|dd}| j |t| jt|ƒƒg¡S d S )Nr   r   Z
PyDict_NewrŠ   Z_PyDict_NewPresized)	r   r   rU   r   r2   r   ru   r   r¤   )r   Zpresizerˆ   r’   r   r   r   Údict_new©  s    ÿzPythonAPI.dict_newc                 C   s@   t  t  d¡| j| j| jf¡}| j|dd}| j ||||f¡S )Nr—   ZPyDict_SetItemrŠ   ©r   r   rj   rU   r   r2   r   )r   ÚdictobjZnameobjÚvalobjrˆ   r’   r   r   r   Údict_setitem´  s
    ÿzPythonAPI.dict_setitemc                 C   sP   t  t  d¡| j| j| jf¡}| j|dd}| j | j|¡}| j	 
||||f¡S )Nr—   ZPyDict_SetItemStringrŠ   )r   r   rj   rU   rv   r   r1   r¥   rc   r2   r   )r   rÓ   r‹   rÔ   rˆ   r’   rÇ   r   r   r   Údict_setitem_stringº  s    ÿzPythonAPI.dict_setitem_stringc              	   C   s>   |   ¡ }|  |¡" |D ]\}}|  |||¡ qW 5 Q R X |S )zb
        Args
        -----
        keyvalues: iterable of (str, llvm.Value of PyObject*)
        )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_FromDoublerŠ   )r   r   rU   rr   r   r2   r   )r   Zfvalrˆ   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_trŠ   ZPyExc_OverflowError)r   r   ru   rU   r   rª   r2   r   )r   Únumobjrˆ   r’   Ú	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_LongrŠ   r•   ©r   rÜ   rˆ   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_AsUnsignedLongLongrŠ   ©r   r   rp   rU   r   r2   r   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_AsLongLongrŠ   rá   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_AsVoidPtrrŠ   ©r   r   rk   rU   r   r2   r   rß   r   r   r   Úlong_as_voidptrì  s    zPythonAPI.long_as_voidptrc                 C   sb   t  | j|g¡}| j||d}t | j| j¡}| j||d}| j | j ||g¡|¡ | j 	|¡S )NrŠ   )
r   r   rU   r   r
   rT   r2   r8   r   rZ   )r   ÚivalÚ	func_nameZnative_int_typeÚsignedrˆ   r’   Zresptrr   r   r   Ú_long_from_native_intõ  s    zPythonAPI._long_from_native_intc                 C   s4   d}t  | j| jg¡}| j||d}| j ||g¡S )NZPyLong_FromLongrŠ   ©r   r   rU   rm   r   r2   r   )r   ræ   rç   rˆ   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é   rm   ©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_tTrì   )ré   ru   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_FromLongLongTrì   )ré   ro   rí   r   r   r   Úlong_from_longlong  s     ÿzPythonAPI.long_from_longlongc                 C   s   | j |d| jddS )NZPyLong_FromUnsignedLongLongFrì   )ré   rp   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.
        úinteger too big (%d bits)N)	r‚   Úwidthrm   rë   r2   Zsextro   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.
        rò   N)	r‚   ró   rn   rî   r2   Úzextrp   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_%srŠ   )r   r   rU   r   )r   r‹   rˆ   r’   r   r   r   Ú_get_number_operator-  s    zPythonAPI._get_number_operatorc                 C   s(   |rd| }|   |¡}| j |||g¡S )NZInPlace)rú   r2   r   )r   r‹   ÚlhsÚrhsÚinplacer’   r   r   r   Ú_call_number_operator2  s    
zPythonAPI._call_number_operatorc                 C   s   | j d|||dS )NÚAdd©rý   ©rþ   ©r   rû   rü   rý   r   r   r   Ú
number_add8  s    zPythonAPI.number_addc                 C   s   | j d|||dS )NZSubtractr   r  r  r   r   r   Únumber_subtract;  s    zPythonAPI.number_subtractc                 C   s   | j d|||dS )NZMultiplyr   r  r  r   r   r   Únumber_multiply>  s    zPythonAPI.number_multiplyc                 C   s   | j d|||dS )NZ
TrueDivider   r  r  r   r   r   Únumber_truedivideA  s    zPythonAPI.number_truedividec                 C   s   | j d|||dS )NZFloorDivider   r  r  r   r   r   Únumber_floordivideD  s    zPythonAPI.number_floordividec                 C   s   | j d|||dS )NZ	Remainderr   r  r  r   r   r   Únumber_remainderG  s    zPythonAPI.number_remainderc                 C   s   | j d|||dS )NZMatrixMultiplyr   r  r  r   r   r   Únumber_matrix_multiplyJ  s    z PythonAPI.number_matrix_multiplyc                 C   s   | j d|||dS )NZLshiftr   r  r  r   r   r   Únumber_lshiftM  s    zPythonAPI.number_lshiftc                 C   s   | j d|||dS )NZRshiftr   r  r  r   r   r   Únumber_rshiftP  s    zPythonAPI.number_rshiftc                 C   s   | j d|||dS )NÚAndr   r  r  r   r   r   Ú
number_andS  s    zPythonAPI.number_andc                 C   s   | j d|||dS )NÚOrr   r  r  r   r   r   Ú	number_orV  s    zPythonAPI.number_orc                 C   s   | j d|||dS )NZXorr   r  r  r   r   r   Ú
number_xorY  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   r   rU   r   r2   r   Úborrow_none)r   rû   rü   rý   rˆ   Úfnamer’   r   r   r   Únumber_power\  s    zPythonAPI.number_powerc                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZPyNumber_NegativerŠ   r•   r‘   r   r   r   Únumber_negativeb  s    zPythonAPI.number_negativec                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZPyNumber_PositiverŠ   r•   r‘   r   r   r   Únumber_positiveg  s    zPythonAPI.number_positivec                 C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyNumber_FloatrŠ   r•   )r   r-   rˆ   r’   r   r   r   Únumber_floatl  s    zPythonAPI.number_floatc                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZPyNumber_InvertrŠ   r•   r‘   r   r   r   Únumber_invertq  s    zPythonAPI.number_invertc                 C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyFloat_AsDoublerŠ   )r   r   rr   rU   r   r2   r   )r   Zfobjrˆ   r’   r   r   r   Úfloat_as_doublev  s    zPythonAPI.float_as_doublec                 C   s   | j  || j¡}|  |¡S )z8
        Get a Python bool from a LLVM boolean.
        )r2   rø   rm   Ú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_FromLongrŠ   rê   )r   ræ   rˆ   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_FromDoublesrŠ   )r   r   rU   rq   r   r2   r   )r   ZrealvalZimagvalrˆ   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_RealAsDoublerŠ   ©r   r   rq   rU   r   r2   r   ©r   Úcobjrˆ   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_ImagAsDoublerŠ   r  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 d¡| 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—   r¶   Znumba_unpack_slicerŠ   )r
   rT   r2   ru   r   r   rj   rU   rg   r   r   rZ   r   )r   r5   ZpstartZpstopZpsteprˆ   r’   ÚresÚ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_GetSlicerŠ   ©r   r   rU   ru   r   r2   r   )r   r5   r"  r#  rˆ   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_TuplerŠ   r•   r‘   r   r   r   Úsequence_tuple¶  s    zPythonAPI.sequence_tuplec                 C   s6   t  | j| j| jg¡}| j|dd}| j |||g¡S )NZPySequence_ConcatrŠ   r•   )r   Zobj1Úobj2rˆ   r’   r   r   r   Úsequence_concat»  s    zPythonAPI.sequence_concatc                 C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZ
PyList_NewrŠ   r&  )r   Zszvalrˆ   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_SizerŠ   ©r   r   ru   rU   r   r2   r   )r   Úlstrˆ   r’   r   r   r   Ú	list_sizeÅ  s    zPythonAPI.list_sizec                 C   s:   t  t  d¡| j| jg¡}| j|dd}| j |||g¡S )Nr—   ZPyList_AppendrŠ   rÒ   )r   r-  r-   rˆ   r’   r   r   r   Úlist_appendÊ  s    zPythonAPI.list_appendc                 C   s@   t  t  d¡| j| j| jg¡}| j|dd}| j ||||g¡S )z6
        Warning: Steals reference to ``val``
        r—   ZPyList_SetItemrŠ   )r   r   rj   rU   ru   r   r2   r   )r   r-  Úidxr-   rˆ   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_GetItemrŠ   )r   r   rU   ru   r   rB   r¤   r1   Úget_constantr   rt   r2   r   )r   r-  r0  rˆ   r’   r   r   r   rX   Ø  s
    
zPythonAPI.list_getitemc                 C   sV   |d kr|   ¡ }t t d¡| j| j| j| jg¡}| j|dd}| j |||||f¡S )Nr—   ZPyList_SetSlicerŠ   )	r…   r   r   rj   rU   ru   r   r2   r   )r   r-  r"  r#  r5   rˆ   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_GetItemrŠ   )r   r   rU   ru   r   r1   r2  r   rt   r2   r   )r   Útupr0  rˆ   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 )NTr˜   ZPyTuple_PackrŠ   )r   r   rU   ru   r   r1   r2  r   rt   rL   Úextendr2   r   )r   Úitemsrˆ   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_SizerŠ   r,  )r   r4  rˆ   r’   r   r   r   Ú
tuple_size   s    zPythonAPI.tuple_sizec                 C   s@   t  | jt  d¡g¡}| j|dd}| j || j t	j
|¡g¡S )Nr—   ZPyTuple_NewrŠ   )r   r   rU   rj   r   r2   r   r1   r2  r   Úint32)r   Úcountrˆ   r’   r   r   r   Ú	tuple_new  s
    ÿzPythonAPI.tuple_newc                 C   sX   t  t  d¡| jt  d¡| jg¡}| j|dd}| j tj|¡}| j	 
||||g¡ dS )z/
        Steals a reference to `item`.
        r—   ZPyTuple_SetItemrŠ   N)r   r   rj   rU   r   r1   r2  r   r;  r2   r   )r   Z	tuple_valrO   Úitemrˆ   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_NewrŠ   ©r…   r   r   rU   r   r2   r   )r   Úiterablerˆ   r’   r   r   r   Úset_new  s
    zPythonAPI.set_newc                 C   s:   t  t  d¡| j| jg¡}| j|dd}| j |||g¡S )Nr—   Z	PySet_AddrŠ   rÒ   )r   Úsetr>   rˆ   r’   r   r   r   Úset_add  s    zPythonAPI.set_addc                 C   s4   t  t  d¡| jg¡}| j|dd}| j ||g¡S )Nr—   ZPySet_ClearrŠ   rÒ   ©r   rC  rˆ   r’   r   r   r   Ú	set_clear$  s    zPythonAPI.set_clearc                 C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZ
PySet_SizerŠ   r,  rE  r   r   r   Úset_size)  s    zPythonAPI.set_sizec                 C   s:   t  t  d¡| j| jg¡}| j|dd}| j |||g¡S )Nr—   Z_PySet_UpdaterŠ   rÒ   )r   rC  rA  rˆ   r’   r   r   r   Ú
set_update.  s    zPythonAPI.set_updatec                 C   sR   t  t  d¡| j| j ¡ | j ¡ | j ¡ g¡}| j|dd}| j 	|||||f¡S )Nr—   Z_PySet_NextEntryrŠ   )
r   r   rj   rU   ru   rg   rz   r   r2   r   )r   rC  ÚposptrÚkeyptrÚhashptrrˆ   r’   r   r   r   Úset_next_entry3  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 5 Q R X tˆ |¡|ƒV  ˆ 	|¡ W 5 Q R X ˆ ˆ ¡ d S )NrK  rŠ   rJ  r   rI  Úbb_bodyÚbb_endc                      s   ˆ  ˆ ¡ d S r   )Úbranchr   ©rN  r2   r   r   r_   H  s    z'PythonAPI.set_iterate.<locals>.do_breakFrÁ   )r2   r
   rT   rz   rU   Úalloca_once_valuer   ru   Úappend_basic_blockrO  Z
goto_blockrL  r   Úif_thenr^   rZ   Úposition_at_end)	r   rC  rK  rJ  rI  rM  r_   ÚrÚfinishedr   rP  r   Úset_iterate:  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   ri   rw   r   rŽ   r   r
   rT   r2   r   )r   Úgilptrtyrˆ   r’   Zgilptrr   r   r   Ú
gil_ensureY  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   ri   rw   r   rŽ   r   r2   r   )r   ZgilrX  rˆ   r’   r   r   r   Úgil_releasee  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_SaveThreadrŠ   )r   r   rk   r   r2   r   r§   r   r   r   Úsave_threado  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_RestoreThreadrŠ   N)r   r   rŽ   rk   r   r2   r   )r   Zthread_staterˆ   r’   r   r   r   Úrestore_threadx  s    zPythonAPI.restore_threadc                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NZnumba_get_pyobject_private_datarŠ   rä   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_datarŠ   )r   r   rŽ   rU   rk   r   r2   r   )r   r5   Úptrrˆ   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_datarŠ   rŒ   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_ImportModuleNoBlockrŠ   ©r   r   rU   rv   r   r2   r   )r   Úmodnamerˆ   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 )NTr˜   ZPyObject_CallFunctionObjArgsrŠ   )r   r   rU   r   rš   rM   r1   Úget_constant_nullr   rf   r2   r   )r   ÚcalleeÚobjargsrˆ   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 )NTr˜   ZPyObject_CallMethodrŠ   ÚO)r1   r¥   rc   r   r   rU   rv   r   rL   r6  rM   rd  r   rf   r2   r   )
r   re  Úmethodrf  Úcnamerˆ   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_CallrŠ   r@  )r   re  r›   rœ   rˆ   r’   r   r   r   r   ²  s    zPythonAPI.callc                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )zJEmit a call to ``PyObject_Type(obj)`` to get the type of ``obj``.
        ZPyObject_TyperŠ   r•   r‘   r   r   r   Úobject_type»  s    zPythonAPI.object_typec                 C   s4   t  t  d¡| jg¡}| j|dd}| j ||g¡S )Nr—   ZPyObject_IsTruerŠ   rÒ   r‘   r   r   r   Úobject_istrueÂ  s    zPythonAPI.object_istruec                 C   s4   t  t  d¡| jg¡}| j|dd}| j ||g¡S )Nr—   ZPyObject_NotrŠ   rÒ   r‘   r   r   r   Ú
object_notÇ  s    zPythonAPI.object_notc              	   C   s¨  ddddddg}||krr|  |¡}t | j| j| jt d¡g¡}| j|dd	}| j tj	|¡}| j
 ||||f¡S |d
kr”| j
 d||¡}	|  |	¡S |dkr¶| j
 d||¡}	|  |	¡S |dkr”t t d¡| j| jg¡}| j|dd	}| j
 |||f¡}
| j tj	d¡}| j
 d|
|¡}t | j
t| jdƒ¡}t | j
|¡D |dkrV| j
 |
¡}
| j
 |
t d¡¡}| j
 |  |¡|¡ W 5 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>=r—   ZPyObject_RichComparerŠ   Úiszis not)Úinúnot inZPySequence_ContainséÿÿÿÿNrt  é   zUnknown operator {op!r})Úop)rO   r   r   rU   rj   r   r1   r2  r   r;  r2   r   Úicmp_unsignedr  r
   rQ  r   Ú	if_likelyÚnot_Útruncr8   rZ   ÚNotImplementedErrorÚformat)r   rû   rü   ZopstrZopsZopidrˆ   r’   ZlopidZbitflagÚstatusZnegoneZis_goodZoutptrÚ	truncatedr   r   r   Úobject_richcompareÌ  sB    




ÿ
ÿÿzPythonAPI.object_richcomparec                 C   s0   t  | j| jg¡}| j|dd}| j ||g¡S )NZPyIter_NextrŠ   r•   )r   Ziterobjrˆ   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_GetIterrŠ   r•   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_GetAttrStringrŠ   )
r1   r¥   rc   r   r   rU   rv   r   r2   r   )r   r5   ÚattrrÇ   rˆ   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_GetAttrrŠ   r•   )r   r5   rƒ  rˆ   r’   r   r   r   Úobject_getattr  s    zPythonAPI.object_getattrc                 C   sP   | j  | j|¡}t t d¡| j| j| jg¡}| j|dd}| j	 
||||g¡S )Nr—   ZPyObject_SetAttrStringrŠ   )r1   r¥   rc   r   r   rj   rU   rv   r   r2   r   )r   r5   rƒ  r-   rÇ   rˆ   r’   r   r   r   Úobject_setattr_string
  s    zPythonAPI.object_setattr_stringc                 C   s@   t  t  d¡| j| j| jg¡}| j|dd}| j ||||g¡S )Nr—   ZPyObject_SetAttrrŠ   rÒ   )r   r5   rƒ  r-   rˆ   r’   r   r   r   Úobject_setattr  s    zPythonAPI.object_setattrc                 C   s   |   |||  ¡ ¡S r   )r†  r…   ©r   r5   rƒ  r   r   r   Úobject_delattr_string  s    zPythonAPI.object_delattr_stringc                 C   s   |   |||  ¡ ¡S r   )r‡  r…   rˆ  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_GetItemrŠ   r•   ©r   r5   Úkeyrˆ   r’   r   r   r   Úobject_getitem  s    zPythonAPI.object_getitemc                 C   s@   t  t  d¡| j| j| jg¡}| j|dd}| j ||||f¡S )z 
        obj[key] = val
        r—   ZPyObject_SetItemrŠ   rÒ   )r   r5   rŒ  r-   rˆ   r’   r   r   r   Úobject_setitem'  s    zPythonAPI.object_setitemc                 C   s:   t  t  d¡| j| jg¡}| j|dd}| j |||f¡S )z
        del obj[key]
        r—   ZPyObject_DelItemrŠ   rÒ   r‹  r   r   r   Úobject_delitem/  s    zPythonAPI.object_delitemc                 C   s4   t  | j| jg¡}d}| j||d}| j ||g¡S )NZPyUnicode_AsUTF8rŠ   ©r   r   rv   rU   r   r2   r   )r   Ústrobjrˆ   r  r’   r   r   r   Ústring_as_string7  s    zPythonAPI.string_as_stringc                 C   sx   t  | j| j¡}t | j| j| j ¡ g¡}d}| j	||d}| j 
|||g¡}| j dt|jdƒ|¡}||| 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.
        ZPyUnicode_AsUTF8AndSizerŠ   rp  N)r
   rT   r2   ru   r   r   rv   rU   rg   r   r   rx  r   r‚   rZ   )r   r‘  Úp_lengthrˆ   r  r’   ÚbufferÚokr   r   r   Ústring_as_string_and_size=  s    ÿ
þz#PythonAPI.string_as_string_and_sizec              	   C   sô   t  | j| j¡}t  | jt d¡¡}t  | jt d¡¡}t  | j| j¡}t | j| j	| j 
¡ t d¡ 
¡ t d¡ 
¡ | j 
¡ g¡}d}| j||d}| j ||||||g¡}	| j dt|	jdƒ|	¡}
|
|	| j |¡| j |¡| j |¡| j |¡f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—   Znumba_extract_unicoderŠ   rp  N)r
   rT   r2   ru   r   rj   rz   r   rv   rU   rg   r   r   rx  r   r‚   rZ   )r   r‘  r“  Zp_kindZp_asciiZp_hashrˆ   r  r’   r”  r•  r   r   r   Ústring_as_string_size_and_kindQ  s2    	ü ÿ
þ
 

þz(PythonAPI.string_as_string_size_and_kindc                 C   s:   t  | j| j| jg¡}d}| j||d}| j |||g¡S )NZPyString_FromStringAndSizerŠ   ©r   r   rU   rv   ru   r   r2   r   ©r   ÚstringÚsizerˆ   r  r’   r   r   r   Ústring_from_string_and_sizeo  s    z%PythonAPI.string_from_string_and_sizec                 C   s4   t  | j| jg¡}d}| j||d}| j ||g¡S )NZPyUnicode_FromStringrŠ   ra  )r   rš  rˆ   r  r’   r   r   r   Ústring_from_stringu  s    zPythonAPI.string_from_stringc                 C   sD   t  | jt  d¡| j| jg¡}d}| j||d}| j ||||g¡S )Nr—   ZPyUnicode_FromKindAndDatarŠ   )	r   r   rU   rj   rv   ru   r   r2   r   )r   Úkindrš  r›  rˆ   r  r’   r   r   r   Ústring_from_kind_and_data{  s    z#PythonAPI.string_from_kind_and_datac                 C   s4   t  | j| jg¡}d}| j||d}| j ||g¡S )NZPyBytes_AsStringrŠ   r  ©r   r5   rˆ   r  r’   r   r   r   Úbytes_as_string  s    zPythonAPI.bytes_as_stringc           	      C   sh   t  t  d¡| j| j ¡ | j ¡ g¡}d}| j||d}| j 	||||g¡}| j 
dt|jdƒ|¡}|S )Nr—   ZPyBytes_AsStringAndSizerŠ   rp  ru  )r   r   rj   rU   rv   rg   ru   r   r2   r   Zicmp_signedr   r‚   )	r   r5   Zp_bufferr“  rˆ   r  r’   Úresultr•  r   r   r   Úbytes_as_string_and_size‡  s    þz"PythonAPI.bytes_as_string_and_sizec                 C   s:   t  | j| j| jg¡}d}| j||d}| j |||g¡S )NZPyBytes_FromStringAndSizerŠ   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_HashrŠ   )r   r   rz   rU   r   r2   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_StrrŠ   r•   r‘   r   r   r   Ú
object_strž  s    zPythonAPI.object_strc                 C   s   |   ¡ }|  |¡ |S r   )r  r“   ©r   r5   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   s:   t jt  ¡ | jgdd}| j|dd}| j ||f| ¡S )NTr˜   ZPySys_FormatStdoutrŠ   )r   r   rŽ   rv   r   r2   r   )r   r   r›   rˆ   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_DumprŠ   rŒ   r‘   r   r   r   Úobject_dump°  s    zPythonAPI.object_dumpc                 C   sÂ   | j jstdƒ‚t d¡}|  |  |j¡¡}t | j	| j
| j	||| j	g¡}| j|dd}|jd  d¡ | j  tj|j¡}| j  tjt|jƒ¡}	t | j|¡}
| j || j |
| j
¡|||	|g¡S )NzNRT requiredr—   Z"NRT_adapt_ndarray_to_python_acqrefrŠ   r   Ú	nocapture)r1   Ú
enable_nrtr   r   rj   ÚunserializeÚserialize_objectZbox_typer   rU   rk   r   r›   Úadd_attributer2  r   r;  Úndimr¤   Zmutabler
   rQ  r2   r   Úbitcast)r   ZarytyÚaryZdtypeptrZinttyZserial_aryty_pytyperˆ   r’   r¯  ÚwritableZaryptrr   r   r   Únrt_adapt_ndarray_to_python¼  s&    
ÿÿ  ýz%PythonAPI.nrt_adapt_ndarray_to_pythonc                 C   sj   | j j}t tjtjtjg¡}t ||d¡}|jd  d¡ |jd  d¡ |j	 d¡ | j  
|||g¡S )za
        Allocate a new MemInfo with data payload borrowed from a python
        object.
        ZNRT_meminfo_new_from_pyobjectr   rª  rv  Únoalias)r2   rc   r   r   r
   Ú	voidptr_tÚget_or_insert_functionr›   r®  Úreturn_valuer   )r   ÚdatarU   Úmodrˆ   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¡}t ||d¡}|j 	d¡ | j  
||g¡S )NZNRT_meminfo_as_pyobjectr´  )r2   rc   r   r   rU   r
   rµ  r¶  r·  r®  r   )r   Zmiptrr¹  rˆ   r’   r   r   r   Únrt_meminfo_as_pyobjectå  s    þýz!PythonAPI.nrt_meminfo_as_pyobjectc                 C   sD   | j j}t tj| jg¡}t ||d¡}|j 	d¡ | j  
||g¡S )NZNRT_meminfo_from_pyobjectr´  )r2   rc   r   r   r
   rµ  rU   r¶  r·  r®  r   )r   Zmiobjr¹  rˆ   r’   r   r   r   Únrt_meminfo_from_pyobjectó  s    þýz#PythonAPI.nrt_meminfo_from_pyobjectc                 C   sf   | j jst‚t t d¡| j| jg¡}| j|dd}|j	d  
d¡ |j	d  
d¡ | j |||f¡S )Nr—   ZNRT_adapt_ndarray_from_pythonrŠ   r   rª  rv  ©r1   r«  r   r   r   rj   rU   rk   r   r›   r®  r2   r   ©r   r±  r^  rˆ   r’   r   r   r   Únrt_adapt_ndarray_from_python  s    z'PythonAPI.nrt_adapt_ndarray_from_pythonc                 C   sj   | j jst‚t t ¡ t | j¡| jg¡}| j	|dd}|j
d  d¡ |j
d  d¡ | j |||f¡S )NZNRT_adapt_buffer_from_pythonrŠ   r   rª  rv  )r1   r«  r   r   r   rŽ   ri   ry   rk   r   r›   r®  r2   r   ©r   Úbufr^  rˆ   r’   r   r   r   Únrt_adapt_buffer_from_python	  s    ÿz&PythonAPI.nrt_adapt_buffer_from_pythonc                 C   s   t  | j||¡S r   )r
   r¶  rc   )r   rˆ   r‹   r   r   r   r     s    zPythonAPI._get_functionc                 C   s   | j  | j¡S r   )r2   ZallocarU   r   r   r   r   Ú
alloca_obj  s    zPythonAPI.alloca_objc                 C   s   t  | jt| jdƒ¡}|S )zT
        Return a pointer to a stack-allocated, zero-initialized Py_buffer.
        N)r
   rQ  r2   r   ry   )r   r^  r   r   r   Úalloca_buffer  s    
ÿzPythonAPI.alloca_bufferc              	   c   s.   t  | jt  | j|¡¡ d V  W 5 Q R X d S r   )r
   ry  r2   rW   r§  r   r   r   r×   #  s    ÿzPythonAPI.if_object_okc                 C   s>   |   |¡}|  |¡}| j | jd¡}|  ||¡ |  |¡ d S )Nz%s)r¦  r’  r1   r¥   rc   r¨  r”   )r   r5   r‘  rÇ   r   r   r   r   Úprint_object)  s
    

zPythonAPI.print_objectc                 C   s   | j  | j|¡}|  |¡ d S r   )r1   r¥   rc   r¨  )r   Útextr   r   r   r   Úprint_string0  s    zPythonAPI.print_stringc                 C   s   t | jd ƒS r   )r   rU   r   r   r   r   r…   4  s    zPythonAPI.get_null_objectc                 C   s   |   ¡ }| j |¡ d S r   )r¯   r2   r[   )r   Únoner   r   r   Úreturn_none7  s    zPythonAPI.return_nonec              	   C   sv   t |ƒ}|  | j tj|¡¡}|  |¡D t|ƒD ]4}| j tj|¡}|  || ¡ |  	|||| ¡ q2W 5 Q R X |S r   )
rL   r+  r1   r2  r   rt   r×   rÂ   r“   r1  )r   r7  r8  Úseqr¿   r0  r   r   r   Ú	list_pack;  s    zPythonAPI.list_packc                 C   s‚   t  | j| jt  d¡| jf¡}| j|dd}| j | j |¡d¡}| j | j |¡d¡}| j | j |¡d¡}| j 	||||f¡S )z«
        Unserialize some data.  *structptr* should be a pointer to
        a {i8* data, i32 length, i8* hashbuf, i8* func_ptr, i32 alloc_flag}
        structure.
        r—   Znumba_unpicklerŠ   r   rv  é   )
r   r   rU   rk   rj   r   r2   Zextract_valuerZ   r   )r   Z	structptrrˆ   r’   r^  r8  Úhashedr   r   r   r¬  E  s    ÿzPythonAPI.unserializec                 C   s6   t  | j| j| jf¡}| j|dd}| j |||f¡S )zÉ
        Serialize some data at runtime. Returns a pointer to a python tuple
        (bytes_data, hash) where the first element is the serialized data as
        bytes and the second its hash.
        Z"numba_runtime_build_excinfo_structrŠ   r•   )r   Z	struct_gvZexc_argsrˆ   r’   r   r   r   Úbuild_dynamic_excinfo_structS  s    z&PythonAPI.build_dynamic_excinfo_structc           	   
   C   sÊ   t  |¡}t|ƒdk st‚dtjdkr.t|ƒnd }t |¡}t t	 
|¡ ¡ ¡}| j | j||¡}| j | j|› d|¡}t | | j¡tt d¡|jjjƒ| | j¡t | j¡tt d¡dƒg¡}|S )zÊ
        Same as serialize_object(), but don't create a global variable,
        simply return a literal for structure:
        {i8* data, i32 length, i8* hashbuf, i8* func_ptr, i32 alloc_flag}
        l        z.const.pickledata.%sr   ÚDIFF_IRz.sha1r—   )r   ÚdumpsrL   r   r   rÏ  Úidr
   Zmake_bytearrayÚhashlibÚsha1Údigestr1   Úinsert_unique_constrc   r   Zliteral_structr°  rk   r   rj   r‚   rƒ   r<  Zget_null_value)	r   r5   r¸  r‹   ZbdatarÍ  ZarrZhasharrÚstructr   r   r   Úserialize_uncached]  s&    

  ÿ


ûzPythonAPI.serialize_uncachedc                 C   sl   z| 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, i8* hashbuf, i8* fn_ptr, i32 alloc_flag},
        structure constant (suitable for passing to unserialize()).
        z.const.picklebuf.%sr   rÏ  )	rc   rd   r   r×  r   rÏ  rÑ  r1   rÕ  )r   r5   ÚgvrÖ  r‹   r   r   r   r­  z  s    
zPythonAPI.serialize_objectc                 C   s   t  | j|  ¡ ¡S r   )r
   rW   r2   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.core.boxingrÚ  Ú	_unboxersr"   Ú	__class__r3   r1   r2   )r   r,   r5   rÚ  ÚimplÚcr   r   r   r4   Ž  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)rB   r   Ú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&   r1   r2   )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?   rQ  r2   r7   r1   rZ   r9   )r   r,   r-   r*   rÞ  r9   rß  r   r   r   r;   ­  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   ri   r1   Úget_data_typeZget_generator_stater2   r=   )r   r5   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 |	¡dƒ}
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.
        rŠ   NZnumba_make_generator)r1   ræ  Z
is_pointerr   Zget_abi_sizeofZget_generator_descr   r   rU   r   Zllvm_cpython_wrapper_namerŽ   rk   Zhas_finalizerZllvm_finalizer_namer   ri   ru   r2   r°  r…   r   )r   r-   r,   rD   ZlltyZgen_struct_sizeZgendescZgenfntyZgenfnZfinalizertyÚ	finalizerrˆ   r’   Z
state_sizeZinitial_stater   r   r   Úfrom_native_generatorÆ  s2    
üÿzPythonAPI.from_native_generatorc                 C   sf   | j jrt‚t t d¡| j| jg¡}| j|dd}|j	d  
d¡ |j	d  
d¡ | j |||f¡S )Nr—   Znumba_adapt_ndarrayrŠ   r   rª  rv  r½  r¾  r   r   r   Únumba_array_adaptorï  s    zPythonAPI.numba_array_adaptorc                 C   s^   t  t  ¡ t  | j¡| jg¡}| j|dd}|jd  d¡ |jd  d¡ | j	 
|||f¡S )NZnumba_adapt_bufferrŠ   r   rª  rv  )r   r   rŽ   ri   ry   rk   r   r›   r®  r2   r   rÀ  r   r   r   Únumba_buffer_adaptor÷  s    
ÿzPythonAPI.numba_buffer_adaptorc                 C   s:   t  t  d¡| j|jg¡}| j|dd}| j |||g¡S )Nr—   Znumba_complex_adaptorrŠ   )r   r   rj   rU   r‚   r   r2   r   )r   r  Zcmplxrˆ   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_datarŠ   )	r   r   rk   rU   ri   ry   r   r2   r   ©r   r5   Úpbufrˆ   r’   r   r   r   Úextract_record_data  s
    ÿzPythonAPI.extract_record_datac                 C   s@   t  t  d¡| jt  | j¡g¡}| j|dd}| j |||g¡S )Nr—   Znumba_get_bufferrŠ   )	r   r   rj   rU   ri   ry   r   r2   r   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_bufferrŠ   )r   r   rŽ   ri   ry   r   r2   r   )r   rî  rˆ   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_datetimerŠ   rÒ   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_timedeltarŠ   rÒ   r‘   r   r   r   Úextract_np_timedelta  s    zPythonAPI.extract_np_timedeltac                 C   sR   t t d¡t|ƒƒ}t | jt d¡t d¡g¡}| j|dd}| j |||g¡S )Nr—   rò  Znumba_create_np_datetimerŠ   ©	r   r   rj   r¤   r   rU   r   r2   r   ©r   r-   Z	unit_coderˆ   r’   r   r   r   Úcreate_np_datetime  s    zPythonAPI.create_np_datetimec                 C   sR   t t d¡t|ƒƒ}t | jt d¡t d¡g¡}| j|dd}| j |||g¡S )Nr—   rò  Znumba_create_np_timedeltarŠ   rõ  rö  r   r   r   Úcreate_np_timedelta%  s    zPythonAPI.create_np_timedeltac                 C   sZ   t  | jt  t  d¡¡t  d¡| jg¡}| j|dd}| | |¡¡}| j 	||||g¡S )Nra   r—   Znumba_recreate_recordrŠ   )
r   r   rU   ri   rj   r   r]   rP   r2   r   )r   Zpdatar›  Zdtyper*   rˆ   r’   Z	dtypeaddrr   r   r   Úrecreate_record+  s     ÿzPythonAPI.recreate_recordc                 C   s0   | j  | j|¡}| j  tjt|ƒ¡}|  ||¡S r   )r1   r¥   rc   r2  r   rt   rL   rœ  )r   rš  rÇ   Úszr   r   r   Ústring_from_constant_string2  s    z%PythonAPI.string_from_constant_stringc              
   C   s$  | j }| j |||¡}|jj}|j}||krDt d|› d|› d¡‚| j ||j||¡\}}	t	j
|t	jdd}
| j |j¡}t	j
||dd}| |j¡j\}}|& | |j|
¡ | jj || |¡ W 5 Q R X |& t | j||||	¡}	| |	|¡ W 5 Q R X W 5 Q R X | |
¡}| |¡}	||	fS )aP  Calls into Numba jitted code and propagate error using the Python
        calling convention.

        Parameters
        ----------
        func : function
            The Python function to be compiled. This function is compiled
            in nopython-mode.
        sig : numba.typing.Signature
            The function signature for *func*.
        args : Sequence[llvmlite.binding.Value]
            LLVM values to use as arguments.

        Returns
        -------
        (is_error, res) :  2-tuple of llvmlite.binding.Value.
            is_error : true iff *func* raised an exception.
            res : Returned value from *func* iff *is_error* is false.

        If *is_error* is true, this method will adapt the nopython exception
        into a Python exception. Caller should return NULL to Python to
        indicate an error.
        zmismatching signature z != z.
TrQ   )r2   r1   Zcompile_subroutineÚ	signaturer„   ÚerrorsZLoweringErrorZcall_internal_no_propagateZfndescr
   rT   Zbool_trs   rV   r9   r8   r†   Zraise_errorr   Zfix_returning_optionalrZ   )r   r   Úsigr›   r2   ZcresZ	got_rettyZrettyr~  r!  Zis_error_ptrZres_typeZres_ptrZhas_errZno_errr9   r   r   r   Úcall_jit_code7  sB    ÿ   ÿ    ÿ 

zPythonAPI.call_jit_code)Fr€   )N)F)r   )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   r   r‰   r“   r”   r–   r¢   r£   r¦   r¨   r©   rY   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/  r1  rX   r3  r5  r9  r:  r=  r?  rB  rD  rF  rG  rH  rL  rW  rY  rZ  r[  r\  r]  r_  r`  rc  rg  rk  r   rl  rm  rn  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Ù  r4   râ  r)   r;   rç  ré  rê  rë  rì  rï  rð  rñ  ró  rô  r÷  rø  rù  rû  rÿ  r   r   r   r   r`   ¡   sb  ! ÿ
			
		
	
	

	
	)
	

	)r`   c                   @   s,   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdS )	ÚObjModeUtilszHInternal utils for calling objmode dispatcher from within NPM code.
    c                 C   s
   || _ d S r   )r(   )r   r(   r   r   r   r   x  s    zObjModeUtils.__init__c              	   C   s„  | j j}| j j}|j}tj|| j j| d¡d}|j 	d ¡|_
d|_| d¡}t |j¡r¨| j  |jt|ƒf¡}| j  |¡}	t ||	¡}
| |
¡ | |¡ W 5 Q R X | |¡}| t ||¡¡˜ t |j¡rt| ƒ}| j  | j  |j¡¡}| j  ||	g¡}| j  |¡ | j  |	¡ n$|j t|ƒ¡}|j|t|ƒdd}| j  |¡ | ||¡ W 5 Q R X | |¡ |  |¡ | |¡}|S )NZcached_objmode_dispatcherrŠ   ZinternalrN  Zwith_objectmode)Úinfo)!r(   r2   r1   rc   r   ZGlobalVariablerU   Zget_unique_namer‚   rƒ   ZinitializerÚlinkagerR  r   Zis_serialiableÚ
dispatcherr­  r­   r¬  r
   r   rS  rO  rZ   Ú_call_objmode_dispatcherrg  r”   ÚcompileZadd_dynamic_addrrÑ  r“   r8   rT  )r   rˆ   r¡   r2   ZtyctxÚmrØ  rN  Zserialized_dispatcherÚcompile_argsZfailed_unserÚcachedr!   Úcompilerre  Zentry_ptr   r   r   Úload_dispatcher{  sX     þ
ÿ
ÿ ÿ  ÿ


zObjModeUtils.load_dispatcherc                 C   s   | \}}|  |¡}|S r   )r  )r	  r  r¡   Zentryptr   r   r   r  ²  s    
z%ObjModeUtils._call_objmode_dispatcherN)r#   r$   r%   r/   r   r  Ústaticmethodr  r   r   r   r   r  u  s
   7r  ).Úcollectionsr   r   ÚpicklerÒ  rH   Zllvmliter   Zllvmlite.irr   rl   Znumbar   Z
numba.corer   r   r   r	   r
   r   r   r{   ZPY_UNICODE_1BYTE_KINDr|   ZPY_UNICODE_2BYTE_KINDr}   ZPY_UNICODE_4BYTE_KINDr~   ZPY_UNICODE_WCHAR_KINDÚobjectr   rä  rÜ  rå  r   r.   r6   r<   r&   r3   r7   r=   rA   r^   r`   r  r   r   r   r   Ú<module>   sZ   $ÿÿÿ4
           _