o
    ¦¸¢i> ã                   @   sj  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 d dlmZ ejZejZejZedv rTe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Ú	serialize)Ú	PYVERSION))é   é
   )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   úR/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/numba/core/pythonapi.pyÚ__init__   ó   
z_Registry.__init__c                    s"   t ˆtjƒsJ ‚‡ ‡fdd„}|S )Nc                    s&   ˆˆ j v 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)r   r   r   r   r   r   Úregister   s   z_Registry.registerNc                 C   s<   t |tjƒsJ ‚|jD ]}| j |¡}|d ur|  S q|S r   )r   r   r    Ú__mro__r   Úget)r   r   ÚdefaultÚclsr   r   r   r   Úlookup&   s   
ÿz_Registry.lookupr   )Ú__name__Ú
__module__Ú__qualname__r   r!   r&   r   r   r   r   r      s    	r   c                   @   ó   e Zd ZdZdZdd„ ZdS )Ú_BoxContextz<
    The facilities required by boxing implementations.
    r   c                 C   ó   | j  ||| j¡S r   ©ÚpyapiÚfrom_native_valueÚenv_manager©r   ÚtypÚvalr   r   r   Úbox>   ó   z_BoxContext.boxN)r'   r(   r)   Ú__doc__Ú	__slots__r4   r   r   r   r   r+   7   ó    r+   )ÚcontextÚbuilderr.   r0   c                   @   r*   )Ú_UnboxContextz>
    The facilities required by unboxing implementations.
    r   c                 C   s   | j  ||¡S r   )r.   Úto_native_value)r   r2   Úobjr   r   r   ÚunboxI   ó   z_UnboxContext.unboxN)r'   r(   r)   r6   r7   r>   r   r   r   r   r;   B   r8   r;   )r9   r:   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   )r:   ÚstoreÚis_errorr
   Útrue_bitr   r   r   r   Ú	set_errorV   s   z_ReflectContext.set_errorc                 C   r,   r   r-   r1   r   r   r   r4   Y   r5   z_ReflectContext.boxc                 C   r,   r   )r.   Úreflect_native_valuer0   r1   r   r   r   Úreflect\   r5   z_ReflectContext.reflectN)r'   r(   r)   r6   r7   rD   r4   rF   r   r   r   r   r@   M   s    r@   )r9   r:   r.   r0   rB   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 ur	|ntj| _|| _d S r   )Úvaluer
   Ú	false_bitrB   Úcleanup)r   rH   rB   rJ   r   r   r   r   f   s   
zNativeValue.__init__©NN)r'   r(   r)   r6   r   r   r   r   r   rG   `   s    rG   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚEnvironmentManagerc                 C   s,   t |tjƒsJ ‚|| _|| _|| _|| _d S r   )Ú
isinstancer	   ÚEnvironmentr.   ÚenvÚenv_bodyÚenv_ptr)r   r.   rO   rP   rQ   r   r   r   r   n   s
   
zEnvironmentManager.__init__c                 C   sV   t |tƒr
t |¡}t| jjƒD ]\}}||u r |S qt| jjƒ}| jj |¡ |S )zF
        Add a constant to the environment, return its index.
        )	rM   ÚstrÚsysÚinternÚ	enumeraterO   ÚconstsÚlenÚappend)r   ÚconstÚindexr3   r   r   r   Ú	add_constu   s   

ûzEnvironmentManager.add_constc              	   C   sè   |t | jjƒk s
J ‚| jj}| jj}tj|| jjdd}| 	t 
||¡¡B\}}| | j ||¡}| ||¡ W d  ƒ n1 sBw   Y  | | j dd¡ W d  ƒ n1 s[w   Y  W d  ƒ n1 sjw   Y  | |¡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©ÚzfillNÚPyExc_RuntimeErrorz$`env.consts` is NULL in `read_const`)rW   rO   rV   r.   r:   rP   r
   Úalloca_onceÚpyobjÚif_elseÚis_not_nullÚlist_getitemrA   Úerr_set_stringÚload)r   rZ   r:   rV   ÚretÚbr_not_nullÚbr_nullÚgetitemr   r   r   Ú
read_const„   s&   þþý€û
zEnvironmentManager.read_constN)r'   r(   r)   r   r[   rj   r   r   r   r   rL   l   s    rL   Ú_IteratorLoop)rH   Ú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d_d`da„Z3d_dbdc„Z4d_ddde„Z5d_dfdg„Z6d_dhdi„Z7d_djdk„Z8d_dldm„Z9d_dndo„Z:d_dpdq„Z;d_drds„Z<d_dtdu„Z=d_dvdw„Z>d_dxdy„Z?d_dzd{„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d^d®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dadÏdÐ„ZjdbdÑ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Ÿd^d;d<„Z d^d=d>„Z¡d?d@„ Z¢d^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 (c  Ú	PythonAPIz^
    Code generation facilities to call into the CPython C API (and related
    helpers).
    c                 C   s>  || _ || _|jjj| _z| jj W n ty   i | j_Y nw | j  tj	¡| _
| j
 ¡ | _t t d¡¡| _t t tj¡d ¡| _| j| _t t tj¡d ¡| _| j| _t ¡ | _tjrh| j  tj¡| _n| j  tj ¡| _t t d¡¡| _!t t"j#d ¡| _$t %t d¡t"j&¡| _'| j| _(t"j)| _)t"j*| _*t"j+| _+dS )zL
        Note: Maybe called multiple times when lowering a function
        é   N),r9   r:   Úbasic_blockÚfunctionÚmoduleÚ_PythonAPI__serializedÚAttributeErrorÚget_argument_typer   Úpyobjectr`   Ú
as_pointerÚpyobjptrr   ÚPointerTypeÚIntTypeÚvoidptrÚctypesÚsizeofÚc_longÚlongÚulongÚc_ulonglongÚlonglongÚ	ulonglongÚ
DoubleTypeÚdoubler   ÚUSE_LEGACY_TYPE_SYSTEMÚget_value_typeÚintpÚ
py_ssize_tÚc_intpÚcstringr   Úpy_gil_state_sizeÚ	gil_stateÚ	ArrayTypeÚpy_buffer_sizeÚpy_buffer_tÚ	py_hash_tÚpy_unicode_1byte_kindÚpy_unicode_2byte_kindÚpy_unicode_4byte_kind)r   r9   r:   r   r   r   r   ©   s4   ÿ
zPythonAPI.__init__c                 C   s   t | |||ƒS r   )rL   )r   rO   rP   rQ   r   r   r   Úget_env_managerÌ   r?   zPythonAPI.get_env_managerFÚ c                 C   s²   t  | j|¡}t  | j|¡A |r1| jjjj}|j| jksJ ‚|  	dd|› ¡ | j 
|  ¡ ¡ n| jj | jtd|› f¡ W d  ƒ dS W d  ƒ dS 1 sRw   Y  dS )z;Emits LLVM code to ensure the `envptr` is not NULL
        r^   zmissing Environment: N)r
   Úis_nullr:   Úif_unlikelyrp   ÚtypeÚpointeeÚreturn_typer`   rd   rf   Úget_null_objectr9   Ú	call_convÚreturn_user_excÚRuntimeError)r   ÚenvptrÚreturn_pyobjectÚ	debug_msgr–   Úfntyr   r   r   Úemit_environment_sentryÏ   s    
ÿ
þ÷"ùz!PythonAPI.emit_environment_sentryc                 C   ó6   t  t  ¡ | jg¡}| j|dd}| j ||g¡ d S )NÚ	Py_IncRef©Úname©r   ÚFunctionTypeÚVoidTyper`   Ú_get_functionr:   Úcall©r   r=   r¢   Úfnr   r   r   Úincrefè   ó   zPythonAPI.increfc                 C   r¤   )NÚ	Py_DecRefr¦   r¨   r­   r   r   r   Údecrefí   r°   zPythonAPI.decrefc                 C   ó0   t  | j| jg¡}| j|dd}| j ||g¡S )NÚnumba_py_typer¦   ©r   r©   r`   r«   r:   r¬   r­   r   r   r   Úget_typeò   ó   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 )Nrn   é    T©Úvar_argÚPyArg_ParseTupleAndKeywordsr¦   ©	r   rx   ry   r`   r©   r«   r:   r¬   Úlist)r   ÚargsÚkwsÚfmtÚkeywordsÚobjsÚcharptrÚ
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 )Nrn   r¸   Tr¹   Ú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
ƒrA| j | jj|¡}| j |	||||gt|ƒ ¡S )Nrn   r¸   Tr¹   ÚPyArg_UnpackTupler¦   )r   rx   ry   r`   rˆ   r©   r«   r   ÚintrM   rR   r9   Úinsert_const_stringr:   rq   r¬   r½   )
r   r¾   r§   Ún_minÚ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   Ú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   ÚPyErr_Clearr¦   )r   r©   rª   r«   r:   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ƒr*| j	 
| j|¡}| j |||f¡S )NÚPyErr_SetStringr¦   )r   r©   rª   r`   rŠ   r«   rM   rR   Úget_c_objectr9   rË   rq   r:   r¬   )r   ÚexctypeÚmsgr¢   r®   r   r   r   rd   #  s   


zPythonAPI.err_set_stringc                 G   sr   t jt  ¡ | j| jgdd}| j|dd}t|tƒr|  |¡}t|tƒr,| j	 
| j|¡}| j |||ft|ƒ ¡S )NTr¹   ÚPyErr_Formatr¦   )r   r©   rª   r`   rŠ   r«   rM   rR   rÕ   r9   rË   rq   r:   r¬   Útuple)r   rÖ   r×   Úformat_argsr¢   r®   r   r   r   Ú
err_format,  s   


zPythonAPI.err_formatNc                 C   sB   t  t  ¡ | jg¡}| j|dd}|du r|  ¡ }| 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.
        Únumba_do_raiser¦   N)r   r©   rª   r`   r«   Ú	make_noner:   r¬   )r   Úexcr¢   r®   r   r   r   Úraise_object5  s
   zPythonAPI.raise_objectc                 C   sL   t  t  ¡ | j| jg¡}| j|dd}t|tƒr|  |¡}| j 	|||f¡S )NÚPyErr_SetObjectr¦   ©
r   r©   rª   r`   r«   rM   rR   rÕ   r:   r¬   )r   rÖ   Ú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ƒr|  |¡}| j 	||f¡S )NÚPyErr_SetNoner¦   rá   )r   rÖ   r¢   r®   r   r   r   Úerr_set_noneG  s
   

zPythonAPI.err_set_nonec                 C   ó2   t  t  ¡ | jg¡}| j|dd}| j ||f¡S )NÚPyErr_WriteUnraisabler¦   r¨   r­   r   r   r   Úerr_write_unraisableN  ó   zPythonAPI.err_write_unraisablec                 C   ó:   t  t  ¡ | jgd ¡}| j|dd}| j ||||f¡S )Nr   ÚPyErr_Fetchr¦   )r   r©   rª   rw   r«   r:   r¬   )r   ÚptyÚpvalÚptbr¢   r®   r   r   r   Ú	err_fetchS  ó   zPythonAPI.err_fetchc                 C   rê   )Nr   ÚPyErr_Restorer¦   r¨   )r   Útyr3   Útbr¢   r®   r   r   r   Úerr_restoreX  rð   zPythonAPI.err_restorec              	   #   s<   ‡ fdd„t dƒD ƒ\}}}ˆ  |||¡ dV  ˆ j |¡}ˆ j |¡}ˆ j |¡}|r•t ˆ jˆ  ¡ ¡}ˆ jj|ddM\}	}
|	 ˆ  |¡ ˆ  |¡ ˆ  |¡ W d  ƒ n1 s]w   Y  |
 ˆ  	|||¡ W d  ƒ n1 svw   Y  W d  ƒ dS W d  ƒ dS 1 sŽw   Y  dS ˆ  	|||¡ 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
   r_   r:   r`   )Ú.0Úir   r   r   Ú
<listcomp>e  s    ÿz&PythonAPI.err_push.<locals>.<listcomp>r   NF©Úlikely)
Úrangerï   r:   re   r
   rb   rÑ   ra   r²   rô   )r   Úkeep_newrì   rí   rî   rò   r3   ró   Ú	new_errorÚif_errorÚif_okr   r   r   Úerr_push]  s0   €
ÿ

üþú"ú
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)Ú	dllimport)r9   Úget_c_valuer:   r`   r™   )r   r§   r   r   r   rÕ   z  s   ÿzPythonAPI.get_c_objectc                 C   ó(   d| }| j  | j|¡}|  d|¡ d S )Nzglobal name '%s' is not definedÚPyExc_NameError©r9   rË   rq   rd   ©r   r§   r×   Úcstrr   r   r   Úraise_missing_global_error…  ó   z$PythonAPI.raise_missing_global_errorc                 C   r  )Nzname '%s' is not definedr  r  r  r   r   r   Úraise_missing_name_errorŠ  r  z"PythonAPI.raise_missing_name_errorc                 C   sR   t  t  ¡ | jg¡}| j|dd}|j d¡ | j | j	|¡}| j
 ||f¡ d S )NÚPy_FatalErrorr¦   Únoreturn)r   r©   rª   rŠ   r«   Ú
attributesÚaddr9   rË   rq   r:   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
        ÚPyDict_GetItemStringr¦   )
r   r©   r`   rŠ   r«   r9   rË   rq   r:   r¬   )r   Údicr§   r¢   r®   r  r   r   r   Údict_getitem_stringš  s   zPythonAPI.dict_getitem_stringc                 C   ó6   t  | j| j| jg¡}| j|dd}| j |||g¡S )r  ÚPyDict_GetItemr¦   rµ   )r   r  r§   r¢   r®   r   r   r   Údict_getitem¤  s   zPythonAPI.dict_getitemr   c                 C   sn   |dkrt  | jd¡}| j|dd}| j |d¡S t  | j| jg¡}| j|dd}| j |t| jt|ƒƒg¡S )Nr   r   Ú
PyDict_Newr¦   Ú_PyDict_NewPresized)	r   r©   r`   r«   r:   r¬   rˆ   r   rÊ   )r   Ú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¸   ÚPyDict_SetItemr¦   ©r   r©   ry   r`   r«   r:   r¬   )r   ÚdictobjÚ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¸   ÚPyDict_SetItemStringr¦   )r   r©   ry   r`   rŠ   r«   r9   rË   rq   r:   r¬   )r   r  r§   r  r¢   r®   r  r   r   r   Údict_setitem_string¾  s   ÿzPythonAPI.dict_setitem_stringc                 C   sT   |   ¡ }|  |¡ |D ]\}}|  |||¡ qW d  ƒ |S 1 s#w   Y  |S )zb
        Args
        -----
        keyvalues: iterable of (str, llvm.Value of PyObject*)
        N)r  Úif_object_okr!  )r   Ú	keyvaluesr  ÚkÚvr   r   r   Ú	dict_packÅ  s   ÿ
ÿýzPythonAPI.dict_packc                 C   ó0   t  | j| jg¡}| j|dd}| j ||g¡S )NÚPyFloat_FromDoubler¦   )r   r©   r`   r„   r«   r:   r¬   )r   Úfvalr¢   r®   r   r   r   Úfloat_from_doubleÕ  r·   zPythonAPI.float_from_doublec                 C   s@   t  | j| j| jg¡}| j|dd}|  d¡}| j |||g¡S )NÚPyNumber_AsSsize_tr¦   ÚPyExc_OverflowError)r   r©   rˆ   r`   r«   rÕ   r:   r¬   )r   Únumobjr¢   r®   Ú	exc_classr   r   r   Únumber_as_ssize_tÚ  s   
zPythonAPI.number_as_ssize_tc                 C   r³   )NÚPyNumber_Longr¦   rµ   ©r   r-  r¢   r®   r   r   r   Únumber_longá  r·   zPythonAPI.number_longc                 C   r'  )NÚPyLong_AsUnsignedLongLongr¦   ©r   r©   r‚   r`   r«   r:   r¬   r1  r   r   r   Úlong_as_ulonglongæ  r·   zPythonAPI.long_as_ulonglongc                 C   r'  )NÚPyLong_AsLongLongr¦   r4  r1  r   r   r   Úlong_as_longlongë  r·   zPythonAPI.long_as_longlongc                 C   r'  )z–
        Convert the given Python integer to a void*.  This is recommended
        over number_as_ssize_t as it isn't affected by signedness.
        ÚPyLong_AsVoidPtrr¦   ©r   r©   rz   r`   r«   r:   r¬   r1  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©   r`   r«   r
   r_   r:   rA   r¬   re   )r   ÚivalÚ	func_nameÚnative_int_typeÚsignedr¢   r®   Ú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 )NÚPyLong_FromLongr¦   ©r   r©   r`   r~   r«   r:   r¬   )r   r;  r<  r¢   r®   r   r   r   Úlong_from_long  s   zPythonAPI.long_from_longc                 C   ó   | j |d| jddS )NÚPyLong_FromUnsignedLongF©r>  )r@  r~   ©r   r;  r   r   r   Úlong_from_ulong	  ó   ÿzPythonAPI.long_from_ulongc                 C   rD  )NÚPyLong_FromSsize_tTrF  )r@  rˆ   rG  r   r   r   Úlong_from_ssize_t  rI  zPythonAPI.long_from_ssize_tc                 C   rD  )NÚPyLong_FromLongLongTrF  )r@  r   rG  r   r   r   Úlong_from_longlong  rI  zPythonAPI.long_from_longlongc                 C   rD  )NÚPyLong_FromUnsignedLongLongFrF  )r@  r‚   rG  r   r   r   Úlong_from_ulonglong  rI  zPythonAPI.long_from_ulonglongc                 C   óX   |j j}|| jjkr|  | j || j¡¡S || jjkr&|  | j || j¡¡S td| ƒ‚)zH
        Return a Python integer from any native integer value.
        úinteger too big (%d bits))	r˜   Úwidthr~   rC  r:   Úsextr   rM  ÚOverflowError©r   r;  Úbitsr   r   r   Úlong_from_signed_int  ó   zPythonAPI.long_from_signed_intc                 C   rP  )zH
        Same as long_from_signed_int, but for unsigned values.
        rQ  )	r˜   rR  r   rH  r:   Úzextr‚   rO  rT  rU  r   r   r   Úlong_from_unsigned_int%  rX  z PythonAPI.long_from_unsigned_intc                 C   s,   t  | j| j| jg¡}| j|d| d}|S )NzPyNumber_%sr¦   )r   r©   r`   r«   )r   r§   r¢   r®   r   r   r   Ú_get_number_operator1  s   zPythonAPI._get_number_operatorc                 C   s(   |rd| }|   |¡}| j |||g¡S )NÚInPlace)r[  r:   r¬   )r   r§   ÚlhsÚrhsÚinplacer®   r   r   r   Ú_call_number_operator6  s   
zPythonAPI._call_number_operatorc                 C   ó   | j d|||dS )NÚAdd©r_  ©r`  ©r   r]  r^  r_  r   r   r   Ú
number_add<  r5   zPythonAPI.number_addc                 C   ra  )NÚSubtractrc  rd  re  r   r   r   Únumber_subtract?  r5   zPythonAPI.number_subtractc                 C   ra  )NÚMultiplyrc  rd  re  r   r   r   Únumber_multiplyB  r5   zPythonAPI.number_multiplyc                 C   ra  )NÚ
TrueDividerc  rd  re  r   r   r   Únumber_truedivideE  r5   zPythonAPI.number_truedividec                 C   ra  )NÚFloorDividerc  rd  re  r   r   r   Únumber_floordivideH  r5   zPythonAPI.number_floordividec                 C   ra  )NÚ	Remainderrc  rd  re  r   r   r   Únumber_remainderK  r5   zPythonAPI.number_remainderc                 C   ra  )NÚMatrixMultiplyrc  rd  re  r   r   r   Únumber_matrix_multiplyN  r5   z PythonAPI.number_matrix_multiplyc                 C   ra  )NÚLshiftrc  rd  re  r   r   r   Únumber_lshiftQ  r5   zPythonAPI.number_lshiftc                 C   ra  )NÚRshiftrc  rd  re  r   r   r   Únumber_rshiftT  r5   zPythonAPI.number_rshiftc                 C   ra  )NÚAndrc  rd  re  r   r   r   Ú
number_andW  r5   zPythonAPI.number_andc                 C   ra  )NÚOrrc  rd  re  r   r   r   Ú	number_orZ  r5   zPythonAPI.number_orc                 C   ra  )NÚXorrc  rd  re  r   r   r   Ú
number_xor]  r5   zPythonAPI.number_xorc                 C   sF   t  | j| jgd ¡}|rdnd}|  ||¡}| j ||||  ¡ g¡S )Nr   ÚPyNumber_InPlacePowerÚPyNumber_Power)r   r©   r`   r«   r:   r¬   Úborrow_none)r   r]  r^  r_  r¢   Úfnamer®   r   r   r   Únumber_power`  s   zPythonAPI.number_powerc                 C   ó0   t  | j| jg¡}| j|dd}| j ||f¡S )NÚPyNumber_Negativer¦   rµ   r­   r   r   r   Únumber_negativef  r·   zPythonAPI.number_negativec                 C   r‚  )NÚPyNumber_Positiver¦   rµ   r­   r   r   r   Únumber_positivek  r·   zPythonAPI.number_positivec                 C   r³   )NÚPyNumber_Floatr¦   rµ   )r   r3   r¢   r®   r   r   r   Únumber_floatp  r·   zPythonAPI.number_floatc                 C   r‚  )NÚPyNumber_Invertr¦   rµ   r­   r   r   r   Únumber_invertu  r·   zPythonAPI.number_invertc                 C   r'  )NÚPyFloat_AsDoubler¦   )r   r©   r„   r`   r«   r:   r¬   )r   Úfobjr¢   r®   r   r   r   Úfloat_as_doublez  r·   zPythonAPI.float_as_doublec                 C   s   | j  || j¡}|  |¡S )z8
        Get a Python bool from a LLVM boolean.
        )r:   rY  r~   Úbool_from_long)r   ÚbvalÚlongvalr   r   r   Úbool_from_bool  s   
zPythonAPI.bool_from_boolc                 C   r'  )NÚPyBool_FromLongr¦   rB  )r   r;  r¢   r®   r   r   r   rŽ  †  r·   zPythonAPI.bool_from_longc                 C   s:   t  | jt  ¡ t  ¡ g¡}| j|dd}| j |||g¡S )NÚPyComplex_FromDoublesr¦   )r   r©   r`   rƒ   r«   r:   r¬   )r   ÚrealvalÚimagvalr¢   r®   r   r   r   Úcomplex_from_doubles‹  ó   zPythonAPI.complex_from_doublesc                 C   ó2   t  t  ¡ | jg¡}| j|dd}| j ||g¡S )NÚPyComplex_RealAsDoubler¦   ©r   r©   rƒ   r`   r«   r:   r¬   ©r   Úcobjr¢   r®   r   r   r   Úcomplex_real_as_double  ré   z PythonAPI.complex_real_as_doublec                 C   r˜  )NÚPyComplex_ImagAsDoubler¦   rš  r›  r   r   r   Úcomplex_imag_as_double•  ré   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   Únumba_unpack_slicer¦   )r
   r_   r:   rˆ   r   r©   ry   r`   rv   r«   r¬   re   r–   )r   r=   ÚpstartÚpstopÚ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 )NÚPySequence_GetSlicer¦   ©r   r©   r`   rˆ   r«   r:   r¬   )r   r=   r¥  r¦  r¢   r®   r   r   r   Úsequence_getslice´  s
   ÿzPythonAPI.sequence_getslicec                 C   r³   )NÚPySequence_Tupler¦   rµ   r­   r   r   r   Úsequence_tupleº  r·   zPythonAPI.sequence_tuplec                 C   r  )NÚPySequence_Concatr¦   rµ   )r   Úobj1Úobj2r¢   r®   r   r   r   Úsequence_concat¿  ó   zPythonAPI.sequence_concatc                 C   r'  )NÚ
PyList_Newr¦   rª  )r   Úszvalr¢   r®   r   r   r   Úlist_newÄ  r·   zPythonAPI.list_newc                 C   r'  )NÚPyList_Sizer¦   ©r   r©   rˆ   r`   r«   r:   r¬   )r   Úlstr¢   r®   r   r   r   Ú	list_sizeÉ  r·   zPythonAPI.list_sizec                 C   ó:   t  t  d¡| j| jg¡}| j|dd}| j |||g¡S )Nr¸   ÚPyList_Appendr¦   r  )r   r¸  r3   r¢   r®   r   r   r   Úlist_appendÎ  r—  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¸   ÚPyList_SetItemr¦   ©r   r©   ry   r`   rˆ   r«   r:   r¬   )r   r¸  Úidxr3   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.
        ÚPyList_GetItemr¦   )r   r©   r`   rˆ   r«   rM   rÊ   r9   Úget_constantr   r‡   r:   r¬   )r   r¸  r¿  r¢   r®   r   r   r   rc   Ü  s
   
zPythonAPI.list_getitemc                 C   sV   |d u r|   ¡ }t t d¡| j| j| j| jg¡}| j|dd}| j |||||f¡S )Nr¸   ÚPyList_SetSlicer¦   )	r›   r   r©   ry   r`   rˆ   r«   r:   r¬   )r   r¸  r¥  r¦  r=   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
        ÚPyTuple_GetItemr¦   )r   r©   r`   rˆ   r«   r9   rÂ  r   r‡   r:   r¬   )r   Útupr¿  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¹   ÚPyTuple_Packr¦   )r   r©   r`   rˆ   r«   r9   rÂ  r   r‡   rW   Úextendr:   r¬   )r   Úitemsr¢   r®   Únr¾   r   r   r   Ú
tuple_packü  s   
zPythonAPI.tuple_packc                 C   r'  )NÚPyTuple_Sizer¦   r·  )r   rÆ  r¢   r®   r   r   r   Ú
tuple_size  r·   zPythonAPI.tuple_sizec                 C   s6   t  | j| jg¡}| j|dd}| j ||  |¡g¡S )NÚPyTuple_Newr¦   rª  )r   Úcountr¢   r®   r   r   r   Ú	tuple_new	  s   zPythonAPI.tuple_newc                 C   sN   t  t  d¡| j| j| jg¡}| j|dd}|  |¡}| j ||||g¡ dS )z/
        Steals a reference to `item`.
        r¸   ÚPyTuple_SetItemr¦   Nr¾  )r   Ú	tuple_valrZ   Úitemr¢   Ú
setitem_fnr   r   r   Útuple_setitem  s   ÿ
zPythonAPI.tuple_setitemc                 C   s@   |d u r|   ¡ }t | j| jg¡}| j|dd}| j ||g¡S )NÚ	PySet_Newr¦   )r›   r   r©   r`   r«   r:   r¬   )r   Úiterabler¢   r®   r   r   r   Úset_new  s
   zPythonAPI.set_newc                 C   rº  )Nr¸   Ú	PySet_Addr¦   r  )r   ÚsetrH   r¢   r®   r   r   r   Úset_add#  r—  zPythonAPI.set_addc                 C   ó4   t  t  d¡| jg¡}| j|dd}| j ||g¡S )Nr¸   ÚPySet_Clearr¦   r  ©r   rÛ  r¢   r®   r   r   r   Ú	set_clear(  ó   zPythonAPI.set_clearc                 C   r'  )NÚ
PySet_Sizer¦   r·  rß  r   r   r   Úset_size-  r·   zPythonAPI.set_sizec                 C   rº  )Nr¸   Ú_PySet_Updater¦   r  )r   rÛ  rØ  r¢   r®   r   r   r   Ú
set_update2  r—  zPythonAPI.set_updatec                 C   sR   t  t  d¡| j| j ¡ | j ¡ | j ¡ g¡}| j|dd}| j 	|||||f¡S )Nr¸   Ú_PySet_NextEntryr¦   )
r   r©   ry   r`   rˆ   rv   r   r«   r:   r¬   )r   rÛ  ÚposptrÚkeyptrÚhashptrr¢   r®   r   r   r   Úset_next_entry7  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	„}ˆ 
|¡@ |  ||||¡}t ˆ|¡}ˆj|d
d ˆ 	ˆ ¡ W d   ƒ n1 scw   Y  tˆ |¡|ƒV  ˆ 	|¡ W d   ƒ n1 s€w   Y  ˆ ˆ ¡ d S )Nré  r¦   rè  r   rç  Úbb_bodyÚbb_endc                      s   ˆ  ˆ ¡ d S r   )Úbranchr   ©rì  r:   r   r   rl   L  r?   z'PythonAPI.set_iterate.<locals>.do_breakFrø   )r:   r
   r_   r   r`   Úalloca_once_valuer   rˆ   Úappend_basic_blockrí  Ú
goto_blockrê  r–   Úif_thenrk   re   Úposition_at_end)	r   rÛ  ré  rè  rç  rë  rl   ÚrÚfinishedr   rî  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().
        Únumba_gil_ensure)
r   rx   rŒ   r©   rª   r«   r
   r_   r:   r¬   )r   Úgilptrtyr¢   r®   Úgilptrr   r   r   Ú
gil_ensure]  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().
        Únumba_gil_release)r   rx   rŒ   r©   rª   r«   r:   r¬   )r   Úgilrø  r¢   r®   r   r   r   Úgil_releasei  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).
        ÚPyEval_SaveThreadr¦   )r   r©   rz   r«   r:   r¬   rÐ   r   r   r   Úsave_threads  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.
        ÚPyEval_RestoreThreadr¦   N)r   r©   rª   rz   r«   r:   r¬   )r   Úthread_stater¢   r®   r   r   r   Úrestore_thread|  s   zPythonAPI.restore_threadc                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NÚnumba_get_pyobject_private_datar¦   r9  r­   r   r   r   Úobject_get_private_data‰  r·   z!PythonAPI.object_get_private_datac                 C   s8   t  t  ¡ | j| jg¡}| j|dd}| j |||f¡S )NÚnumba_set_pyobject_private_datar¦   )r   r©   rª   r`   rz   r«   r:   r¬   )r   r=   Úptrr¢   r®   r   r   r   Úobject_set_private_dataŽ  s   z!PythonAPI.object_set_private_datac                 C   ræ   )NÚ!numba_reset_pyobject_private_datar¦   r¨   r­   r   r   r   Úobject_reset_private_data“  ré   z#PythonAPI.object_reset_private_datac                 C   r'  )NÚPyImport_ImportModuler¦   ©r   r©   r`   rŠ   r«   r:   r¬   )r   Úmodnamer¢   r®   r   r   r   Úimport_module  r·   zPythonAPI.import_modulec                 C   sT   t j| j| jgdd}| j|dd}|gt|ƒ }| | j tj	¡¡ | j
 ||¡S )NTr¹   ÚPyObject_CallFunctionObjArgsr¦   )r   r©   r`   r«   r½   rX   r9   Úget_constant_nullr   ru   r:   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}	|r8|	 	|¡ |	 
| j  tj¡¡ | j ||	¡S )NTr¹   ÚPyObject_CallMethodr¦   ÚO)r9   rË   rq   r   r©   r`   rŠ   r«   rW   rÉ  rX   r  r   ru   r:   r¬   )
r   r  Úmethodr  Úcnamer¢   r®   rÀ   Úcfmtr¾   r   r   r   Úcall_method©  s   ÿ

zPythonAPI.call_methodc                 C   sp   |d u  }r|   d¡}|d u r|  ¡ }t | j| jgd ¡}| j|dd}| j ||||f¡}|r6|  |¡ |S )Nr   r   ÚPyObject_Callr¦   )	rÑ  r›   r   r©   r`   r«   r:   r¬   r²   )r   r  r¾   r¿   Úargs_was_noner¢   r®   Úresultr   r   r   r¬   ¶  s   

zPythonAPI.callc                 C   r‚  )zJEmit a call to ``PyObject_Type(obj)`` to get the type of ``obj``.
        ÚPyObject_Typer¦   rµ   r­   r   r   r   Úobject_typeÂ  s   zPythonAPI.object_typec                 C   rÝ  )Nr¸   ÚPyObject_IsTruer¦   r  r­   r   r   r   Úobject_istrueÉ  rá  zPythonAPI.object_istruec                 C   rÝ  )Nr¸   ÚPyObject_Notr¦   r  r­   r   r   r   Ú
object_notÎ  rá  zPythonAPI.object_notc                 C   s¬  g d¢}||v r5|  |¡}t | j| j| jt d¡g¡}| j|dd}| j tj	|¡}| j
 ||||f¡S |dkrF| j
 d||¡}	|  |	¡S |dkrW| j
 d||¡}	|  |	¡S |d	v 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kr¥| j
 |
¡}
| j
 |
t d¡¡}| j
 |  |¡|¡ W d  ƒ n1 sÃw   Y  | j
 |¡S tdj|dƒ‚)zd
        Refer to Python source Include/object.h for macros definition
        of the opid.
        )ú<z<=ú==ú!=ú>z>=r¸   ÚPyObject_RichComparer¦   Úisr#  zis notr$  )Úinúnot inÚPySequence_ContainséÿÿÿÿNr)  é   zUnknown operator {op!r})Úop)rZ   r   r©   r`   ry   r«   r9   rÂ  r   Úint32r:   r¬   Úicmp_unsignedr‘  r
   rï  r   Ú	if_likelyÚnot_ÚtruncrA   re   ÚNotImplementedErrorÚformat)r   r]  r^  ÚopstrÚopsÚopidr¢   r®   ÚlopidÚbitflagÚstatusÚnegoneÚis_goodÚoutptrÚ	truncatedr   r   r   Úobject_richcompareÓ  sD   



ÿÿûÿzPythonAPI.object_richcomparec                 C   r³   )NÚPyIter_Nextr¦   rµ   )r   Úiterobjr¢   r®   r   r   r   Ú	iter_nextü  r·   zPythonAPI.iter_nextc                 C   r³   )NÚPyObject_GetIterr¦   rµ   r­   r   r   r   Úobject_getiter  r·   zPythonAPI.object_getiterc                 C   sF   | j  | j|¡}t | j| j| jg¡}| j|dd}| j 	|||g¡S )NÚPyObject_GetAttrStringr¦   )
r9   rË   rq   r   r©   r`   rŠ   r«   r:   r¬   )r   r=   Úattrr  r¢   r®   r   r   r   Úobject_getattr_string  s   zPythonAPI.object_getattr_stringc                 C   r  )NÚPyObject_GetAttrr¦   rµ   )r   r=   rF  r¢   r®   r   r   r   Úobject_getattr  r²  zPythonAPI.object_getattrc                 C   sP   | j  | j|¡}t t d¡| j| j| jg¡}| j|dd}| j	 
||||g¡S )Nr¸   ÚPyObject_SetAttrStringr¦   )r9   rË   rq   r   r©   ry   r`   rŠ   r«   r:   r¬   )r   r=   rF  r3   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¸   ÚPyObject_SetAttrr¦   r  )r   r=   rF  r3   r¢   r®   r   r   r   Úobject_setattr  s   zPythonAPI.object_setattrc                 C   ó   |   |||  ¡ ¡S r   )rK  r›   ©r   r=   rF  r   r   r   Úobject_delattr_string  ó   zPythonAPI.object_delattr_stringc                 C   rN  r   )rM  r›   rO  r   r   r   Úobject_delattr!  rQ  zPythonAPI.object_delattrc                 C   s6   t  | j| j| jg¡}| j|dd}| j |||f¡S )z!
        Return obj[key]
        ÚPyObject_GetItemr¦   rµ   ©r   r=   Ú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¸   ÚPyObject_SetItemr¦   r  )r   r=   rU  r3   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¸   ÚPyObject_DelItemr¦   r  rT  r   r   r   Úobject_delitem6  s   zPythonAPI.object_delitemc                 C   ó4   t  | j| jg¡}d}| j||d}| j ||g¡S )NÚPyUnicode_AsUTF8r¦   ©r   r©   rŠ   r`   r«   r:   r¬   )r   Ústrobjr¢   r€  r®   r   r   r   Ústring_as_string>  ó   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.
        ÚPyUnicode_AsUTF8AndSizer¦   r$  N)r
   r_   r:   rˆ   r   r©   rŠ   r`   rv   r«   r¬   r/  r   r˜   re   )r   r^  Úp_lengthr¢   r€  r®   ÚbufferÚokr   r   r   Ústring_as_string_and_sizeD  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¸   Únumba_extract_unicoder¦   r$  N)r
   r_   r:   rˆ   r   ry   r   r©   rŠ   r`   rv   r«   r¬   r/  r   r˜   re   )r   r^  rb  Úp_kindÚp_asciiÚp_hashr¢   r€  r®   rc  rd  r   r   r   Ústring_as_string_size_and_kindX  s.   	üÿ
þ
þz(PythonAPI.string_as_string_size_and_kindc                 C   ó:   t  | j| j| jg¡}d}| j||d}| j |||g¡S )NÚPyString_FromStringAndSizer¦   ©r   r©   r`   rŠ   rˆ   r«   r:   r¬   ©r   ÚstringÚsizer¢   r€  r®   r   r   r   Ústring_from_string_and_sizev  ó   z%PythonAPI.string_from_string_and_sizec                 C   r[  )NÚPyUnicode_FromStringr¦   r  )r   ro  r¢   r€  r®   r   r   r   Ústring_from_string|  r`  zPythonAPI.string_from_stringc                 C   sD   t  | jt  d¡| j| jg¡}d}| j||d}| j ||||g¡S )Nr¸   ÚPyUnicode_FromKindAndDatar¦   )	r   r©   r`   ry   rŠ   rˆ   r«   r:   r¬   )r   Úkindro  rp  r¢   r€  r®   r   r   r   Ústring_from_kind_and_data‚  s   z#PythonAPI.string_from_kind_and_datac                 C   r[  )NÚPyBytes_AsStringr¦   r]  ©r   r=   r¢   r€  r®   r   r   r   Úbytes_as_stringˆ  r`  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¸   ÚPyBytes_AsStringAndSizer¦   r$  r+  )r   r©   ry   r`   rŠ   rv   rˆ   r«   r:   r¬   Úicmp_signedr   r˜   )	r   r=   Úp_bufferrb  r¢   r€  r®   r  rd  r   r   r   Úbytes_as_string_and_sizeŽ  s   þz"PythonAPI.bytes_as_string_and_sizec                 C   rk  )NÚPyBytes_FromStringAndSizer¦   rm  rn  r   r   r   Úbytes_from_string_and_size™  rr  z$PythonAPI.bytes_from_string_and_sizec                 C   r[  )NÚPyObject_Hashr¦   )r   r©   r   r`   r«   r:   r¬   ry  r   r   r   Úobject_hashŸ  r`  zPythonAPI.object_hashc                 C   r³   )NÚPyObject_Strr¦   rµ   r­   r   r   r   Ú
object_str¥  r·   zPythonAPI.object_strc                 C   s   |   ¡ }|  |¡ |S r   )r  r¯   ©r   r=   r   r   r   rÝ   ª  s   
zPythonAPI.make_nonec                 C   s
   |   d¡S )NÚ_Py_NoneStruct)rÕ   r   r   r   r   r  ¯  r   zPythonAPI.borrow_nonec                 G   s:   t jt  ¡ | jgdd}| j|dd}| j ||f| ¡S )NTr¹   ÚPySys_FormatStdoutr¦   )r   r©   rª   rŠ   r«   r:   r¬   )r   rÀ   r¾   r¢   r®   r   r   r   Úsys_write_stdout²  rð   zPythonAPI.sys_write_stdoutc                 C   ræ   )zL
        Dump a Python object on C stderr.  For debugging purposes.
        Ú_PyObject_Dumpr¦   r¨   r­   r   r   r   Úobject_dump·  s   zPythonAPI.object_dumpc                 C   sÂ   | j jsJ 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¸   Ú"NRT_adapt_ndarray_to_python_acqrefr¦   r   Ú	nocapture)r9   Ú
enable_nrtr   ry   ÚunserializeÚserialize_objectÚbox_typer©   r`   rz   r«   r¾   Úadd_attributerÂ  r   r.  ÚndimrÊ   Úmutabler
   rï  r:   r¬   Úbitcast)r   ÚarytyÚaryÚdtypeptrÚinttyÚserial_aryty_pytyper¢   r®   r’  ÚwritableÚ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.
        ÚNRT_meminfo_new_from_pyobjectr   rŒ  r,  Únoalias)r:   rq   r   r©   r
   Ú	voidptr_tÚget_or_insert_functionr¾   r‘  Úreturn_valuer¬   )r   Údatar`   Ú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 )NÚNRT_meminfo_as_pyobjectrž  )r:   rq   r   r©   r`   r
   rŸ  r   r¡  r‘  r¬   )r   Úmiptrr£  r¢   r®   r   r   r   Únrt_meminfo_as_pyobjectì  ó   þýz!PythonAPI.nrt_meminfo_as_pyobjectc                 C   sD   | j j}t tj| jg¡}t ||d¡}|j 	d¡ | j  
||g¡S )NÚNRT_meminfo_from_pyobjectrž  )r:   rq   r   r©   r
   rŸ  r`   r   r¡  r‘  r¬   )r   Úmiobjr£  r¢   r®   r   r   r   Únrt_meminfo_from_pyobjectú  r¨  z#PythonAPI.nrt_meminfo_from_pyobjectc                 C   sf   | j jsJ ‚t t d¡| j| jg¡}| j|dd}|jd  	d¡ |jd  	d¡ | j
 |||f¡S )Nr¸   ÚNRT_adapt_ndarray_from_pythonr¦   r   rŒ  r,  ©r9   r  r   r©   ry   r`   rz   r«   r¾   r‘  r:   r¬   ©r   r–  r  r¢   r®   r   r   r   Únrt_adapt_ndarray_from_python  ó   z'PythonAPI.nrt_adapt_ndarray_from_pythonc                 C   sj   | j jsJ ‚t t ¡ t | j¡| jg¡}| j|dd}|j	d  
d¡ |j	d  
d¡ | j |||f¡S )NÚNRT_adapt_buffer_from_pythonr¦   r   rŒ  r,  )r9   r  r   r©   rª   rx   r   rz   r«   r¾   r‘  r:   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||¡}| j |¡ |S r   )r
   r   rq   r9   Úapply_target_attributes)r   r¢   r§   r®   r   r   r   r«     s   zPythonAPI._get_functionc                 C   s   | j  | j¡S r   )r:   Úallocar`   r   r   r   r   Ú
alloca_obj   r?   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
   rï  r:   r   r   )r   r  r   r   r   Úalloca_buffer#  s   
ÿzPythonAPI.alloca_bufferc                 c   sF    t  | jt  | j|¡¡ d V  W d   ƒ d S 1 sw   Y  d S r   )r
   r0  r:   rb   r…  r   r   r   r"  ,  s   €ÿ"þzPythonAPI.if_object_okc                 C   s>   |   |¡}|  |¡}| j | jd¡}|  ||¡ |  |¡ d S )Nz%s)r„  r_  r9   rË   rq   rˆ  r²   )r   r=   r^  r  rÀ   r   r   r   Úprint_object2  s
   

zPythonAPI.print_objectc                 C   s   | j  | j|¡}|  |¡ d S r   )r9   rË   rq   rˆ  )r   ÚtextrÀ   r   r   r   Úprint_string9  s   zPythonAPI.print_stringc                 C   s   t | jd ƒS r   )r   r`   r   r   r   r   r›   =  s   zPythonAPI.get_null_objectc                 C   s   |   ¡ }| j |¡ d S r   )rÝ   r:   rf   )r   Únoner   r   r   Úreturn_none@  s   zPythonAPI.return_nonec                 C   sŒ   t |ƒ}|  | j tj|¡¡}|  |¡( t|ƒD ]}| j tj|¡}|  || ¡ |  	|||| ¡ qW d   ƒ |S 1 s?w   Y  |S r   )
rW   rµ  r9   rÂ  r   r‡   r"  rú   r¯   rÀ  )r   rÊ  rË  Úseqrö   r¿  r   r   r   Ú	list_packD  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¸   Únumba_unpickler¦   r   r,  é   )
r   r©   r`   rz   ry   r«   r:   Úextract_valuere   r¬   )r   Ú	structptrr¢   r®   r  rË  Úhashedr   r   r   rŽ  N  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.
        Ú"numba_runtime_build_excinfo_structr¦   rµ   )r   Ú	struct_gvÚexc_argsr¢   r®   r   r   r   Úbuild_dynamic_excinfo_struct\  s   z&PythonAPI.build_dynamic_excinfo_structc           	   
   C   sÊ   t  |¡}t|ƒdk sJ ‚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   ÚdumpsrW   r   rÉ  Úidr
   Úmake_bytearrayÚhashlibÚsha1Údigestr9   Úinsert_unique_constrq   r   Úliteral_structr”  rz   r   ry   r˜   r™   rÐ  Úget_null_value)	r   r=   r¢  r§   ÚbdatarÄ  ÚarrÚhasharrÚstructr   r   r   Úserialize_uncachedf  s"   

ÿ


ûzPythonAPI.serialize_uncachedc                 C   sj   z	| j j| }W |S  ty4   |  |¡}dtjdkrt|ƒnd }| j | j ||¡}|| j j|< Y |S w )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É  )	rq   rr   r   r×  r   rÉ  rË  r9   rÐ  )r   r=   ÚgvrÖ  r§   r   r   r   r  ƒ  s   ú
úzPythonAPI.serialize_objectc                 C   s   t  | j|  ¡ ¡S r   )r
   rb   r:   rÑ   r   r   r   r   Úc_api_error”  r5   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__r;   r9   r:   )r   r2   r=   rÚ  ÚimplÚcr   r   r   r<   —  s   zPythonAPI.to_native_valuec                 C   s&   t |tjƒr
J dƒ‚|  |||¡}|S )Nz;callconv should have prevented the return of optional value)rM   r   ÚOptionalr/   )r   r2   r3   r0   Ú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+   r9   r:   )r   r2   r3   r0   rã  rÞ  rß  r   r   r   r/   ©  s   zPythonAPI.from_native_valuec                 C   sX   t  |j¡}|du 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
   rI   rï  r:   r@   r9   re   rB   )r   r2   r3   r0   rÞ  rB   rß  r   r   r   rE   ¶  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   rx   r9   Úget_data_typeÚget_generator_stater:   rG   )r   r=   r2   Ú
gen_ptr_tyrH   r   r   r   Úto_native_generatorÆ  s   zPythonAPI.to_native_generatorc              	   C   s   | j  |¡}|jrJ ‚| j  |¡}| j  |¡}t | j| j| j| jg¡}| j||j	d}t t 
¡ | jg¡}	|jrB| j|	|jd}
ntt |	¡dƒ}
t | j| j| jt |¡t |	¡| jg¡}| j|dd}t| j|ƒ}| j || j¡}|du 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¦   NÚnumba_make_generator)r9   ræ  Ú
is_pointerÚget_abi_sizeofÚget_generator_descr   r©   r`   r«   Úllvm_cpython_wrapper_namerª   rz   Úhas_finalizerÚllvm_finalizer_namer   rx   rˆ   r:   r”  r›   r¬   )r   r3   r2   rO   ÚlltyÚgen_struct_sizeÚgendescÚgenfntyÚgenfnÚfinalizertyÚ	finalizerr¢   r®   Ú
state_sizeÚinitial_stater   r   r   Úfrom_native_generatorÏ  s2   
üÿzPythonAPI.from_native_generatorc                 C   sf   | j jrJ ‚t t d¡| j| jg¡}| j|dd}|jd  	d¡ |jd  	d¡ | j
 |||f¡S )Nr¸   Únumba_adapt_ndarrayr¦   r   rŒ  r,  r­  r®  r   r   r   Únumba_array_adaptorø  r°  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 )NÚnumba_adapt_bufferr¦   r   rŒ  r,  )r   r©   rª   rx   r   rz   r«   r¾   r‘  r:   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¸   Únumba_complex_adaptorr¦   )r   r©   ry   r`   r˜   r«   r:   r¬   )r   rœ  Úcmplxr¢   r®   r   r   r   Úcomplex_adaptor  r—  zPythonAPI.complex_adaptorc                 C   s<   t  | j| jt  | j¡g¡}| j|dd}| j |||g¡S )NÚnumba_extract_record_datar¦   )	r   r©   rz   r`   rx   r   r«   r:   r¬   ©r   r=   Ú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¸   Únumba_get_bufferr¦   )	r   r©   ry   r`   rx   r   r«   r:   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 )NÚnumba_release_bufferr¦   )r   r©   rª   rx   r   r«   r:   r¬   )r   r  r¢   r®   r   r   r   Úrelease_buffer  s   zPythonAPI.release_bufferc                 C   rÝ  )Né@   Únumba_extract_np_datetimer¦   r  r­   r   r   r   Úextract_np_datetime  rá  zPythonAPI.extract_np_datetimec                 C   rÝ  )Nr
  Únumba_extract_np_timedeltar¦   r  r­   r   r   r   Úextract_np_timedelta#  rá  zPythonAPI.extract_np_timedeltac                 C   óR   t t d¡t|ƒƒ}t | jt d¡t d¡g¡}| j|dd}| j |||g¡S )Nr¸   r
  Únumba_create_np_datetimer¦   ©	r   r   ry   rÊ   r©   r`   r«   r:   r¬   ©r   r3   Ú	unit_coder¢   r®   r   r   r   Úcreate_np_datetime(  ó   zPythonAPI.create_np_datetimec                 C   r  )Nr¸   r
  Únumba_create_np_timedeltar¦   r  r  r   r   r   Úcreate_np_timedelta.  r  zPythonAPI.create_np_timedeltac                 C   sZ   t  | jt  t  d¡¡t  d¡| jg¡}| j|dd}| | |¡¡}| j 	||||g¡S )Nrn   r¸   Únumba_recreate_recordr¦   )
r   r©   r`   rx   ry   r«   rj   r[   r:   r¬   )r   Úpdatarp  Údtyper0   r¢   r®   Ú	dtypeaddrr   r   r   Úrecreate_record4  s   ÿzPythonAPI.recreate_recordc                 C   s0   | j  | j|¡}| j  tjt|ƒ¡}|  ||¡S r   )r9   rË   rq   rÂ  r   r‡   rW   rq  )r   ro  r  Úszr   r   r   Ústring_from_constant_string;  s   z%PythonAPI.string_from_constant_stringc              	   C   s`  | j }| j |||¡}|jj}|j}||kr"t d|› d|› d¡‚| j ||j||¡\}}	t	j
|t	jdd}
| j |j¡}t	j
||dd}| |j¡N\}}| | |j|
¡ | jj || |¡ W d  ƒ n1 slw   Y  | t | j||||	¡}	| |	|¡ W d  ƒ n1 sŽw   Y  W d  ƒ n1 sw   Y  | |
¡}| |¡}	||	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.
Tr\   N)r:   r9   Úcompile_subroutineÚ	signaturerš   ÚerrorsÚLoweringErrorÚcall_internal_no_propagateÚfndescr
   r_   Úbool_tr†   ra   rB   rA   rœ   Úraise_errorr   Úfix_returning_optionalre   )r   r   Úsigr¾   r:   ÚcresÚ	got_rettyÚrettyr:  r¤  Úis_error_ptrÚres_typeÚres_ptrÚhas_errÚno_errrB   r   r   r   Úcall_jit_code@  s<   ÿ
ÿýÿû€û

zPythonAPI.call_jit_code)Fr•   r   )F)r   )r   rK   )±r'   r(   r)   r6   r   r”   r£   r¯   r²   r¶   rÆ   rÈ   rÎ   rÑ   rÓ   rd   rÛ   rß   rã   rå   rè   rï   rô   Ú
contextlibÚcontextmanagerrÿ   rÕ   r  r	  r  r  r  r  r  r!  r&  r*  r/  r2  r5  r7  r:  r@  rC  rH  rK  rM  rO  rW  rZ  r[  r`  rf  rh  rj  rl  rn  rp  rr  rt  rv  rx  rz  r|  r  r„  r†  rˆ  rŠ  r  r‘  rŽ  r–  r  rŸ  r¨  r«  r­  r±  rµ  r¹  r¼  rÀ  rc   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?  rB  rD  rG  rI  rK  rM  rP  rR  rV  rX  rZ  r_  re  rj  rq  rt  rw  rz  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/   rE   ré  rú  rü  rþ  r  r  r  r	  r  r  r  r  r  r  r1  r   r   r   r   rm   £   sd   #ÿ			
		
	
	

	
)
	

	)rm   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     r   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 d   ƒ n1 sYw   Y  | |¡}| t ||¡¡P t |j¡r—t| ƒ}| j  | j  |j¡¡}| j  ||	g¡}| j  |¡ | j  |	¡ n|j t|ƒ¡}|j|t|ƒdd}| j  |¡ | ||¡ W d   ƒ n1 s¿w   Y  | |¡ |  |¡ | |¡}|S )NÚcached_objmode_dispatcherr¦   Úinternalrì  Úwith_objectmode)Úinfo)!r.   r:   r9   rq   r   ÚGlobalVariabler`   Úget_unique_namer˜   r™   ÚinitializerÚlinkagerð  r   Úis_serialiableÚ
dispatcherr  rÙ   rŽ  r
   r–   rò  rí  re   Ú_call_objmode_dispatcherr  r²   ÚcompileÚadd_dynamic_addrrË  r¯   rA   ró  )r   r¢   rÅ   r:   ÚtyctxÚmrØ  rì  Úserialized_dispatcherÚcompile_argsÚfailed_unserÚcachedr%   Úcompilerr  Úentry_ptr   r   r   Úload_dispatcher„  sT   þ
ÿþ
ÿÿ
ÿí


zObjModeUtils.load_dispatcherc                 C   s   | \}}|  |¡}|S r   )r@  )rE  r>  rÅ   Úentryptr   r   r   r?  »  s   
z%ObjModeUtils._call_objmode_dispatcherN)r'   r(   r)   r6   r   rJ  Ústaticmethodr?  r   r   r   r   r4  ~  s    7r4  )0Úcollectionsr   r2  ÚpicklerÍ  rS   Úllvmliter   Úllvmlite.irr   r{   Únumbar   Ú
numba.corer   r   r   r	   r
   r   r   Únumba.core.utilsr   r‘   ÚPY_UNICODE_1BYTE_KINDr’   ÚPY_UNICODE_2BYTE_KINDr“   ÚPY_UNICODE_4BYTE_KINDÚpy_unicode_wchar_kindÚPY_UNICODE_WCHAR_KINDÚobjectr   rä  rÜ  rå  r!   r4   r>   rF   r+   r;   r@   rG   rL   rk   rm   r4  r   r   r   r   Ú<module>   s`    $ÿÿÿ
4           f