o
    d’×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/SoloSpeech/.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 ¡ | _| 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ÚdoubleÚget_value_typeÚintpÚ
py_ssize_tÚ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   ©   s0   ÿ
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_object2  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_noneD  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_unraisableK  ó   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_fetchP  ó   zPythonAPI.err_fetchc                 C   rè   )Nr   ÚPyErr_Restorer¤   r¦   )r   Útyr3   Útbr    r¬   r   r   r   Úerr_restoreU  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>b  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_pushZ  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Ó   w  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ª   r/  r   r   r   Úlong_as_ulonglongã  rµ   zPythonAPI.long_as_ulonglongc                 C   r%  )NÚPyLong_AsLongLongr¤   r2  r/  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ª   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§   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   r9  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   r9  r   r   r   Úlong_from_ulong  ó   ÿzPythonAPI.long_from_ulongc                 C   rB  )NÚPyLong_FromSsize_tTrD  )r>  r‡   rE  r   r   r   Úlong_from_ssize_t
  rG  zPythonAPI.long_from_ssize_tc                 C   rB  )NÚPyLong_FromLongLongTrD  )r>  r   rE  r   r   r   Úlong_from_longlong  rG  zPythonAPI.long_from_longlongc                 C   rB  )NÚPyLong_FromUnsignedLongLongFrD  )r>  r‚   rE  r   r   r   Úlong_from_ulonglong  rG  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~   rA  r:   Úsextr   rK  ÚOverflowError©r   r9  Úbitsr   r   r   Úlong_from_signed_int  ó   zPythonAPI.long_from_signed_intc                 C   rN  )zH
        Same as long_from_signed_int, but for unsigned values.
        rO  )	r–   rP  r   rF  r:   Úzextr‚   rM  rR  rS  r   r   r   Úlong_from_unsigned_int"  rV  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_operator.  s   zPythonAPI._get_number_operatorc                 C   s(   |rd| }|   |¡}| j |||g¡S )NÚInPlace)rY  r:   rª   )r   r¥   ÚlhsÚrhsÚinplacer¬   r   r   r   Ú_call_number_operator3  s   
zPythonAPI._call_number_operatorc                 C   ó   | j d|||dS )NÚAdd©r]  ©r^  ©r   r[  r\  r]  r   r   r   Ú
number_add9  r5   zPythonAPI.number_addc                 C   r_  )NÚSubtractra  rb  rc  r   r   r   Únumber_subtract<  r5   zPythonAPI.number_subtractc                 C   r_  )NÚMultiplyra  rb  rc  r   r   r   Únumber_multiply?  r5   zPythonAPI.number_multiplyc                 C   r_  )NÚ
TrueDividera  rb  rc  r   r   r   Únumber_truedivideB  r5   zPythonAPI.number_truedividec                 C   r_  )NÚFloorDividera  rb  rc  r   r   r   Únumber_floordivideE  r5   zPythonAPI.number_floordividec                 C   r_  )NÚ	Remainderra  rb  rc  r   r   r   Únumber_remainderH  r5   zPythonAPI.number_remainderc                 C   r_  )NÚMatrixMultiplyra  rb  rc  r   r   r   Únumber_matrix_multiplyK  r5   z PythonAPI.number_matrix_multiplyc                 C   r_  )NÚLshiftra  rb  rc  r   r   r   Únumber_lshiftN  r5   zPythonAPI.number_lshiftc                 C   r_  )NÚRshiftra  rb  rc  r   r   r   Únumber_rshiftQ  r5   zPythonAPI.number_rshiftc                 C   r_  )NÚAndra  rb  rc  r   r   r   Ú
number_andT  r5   zPythonAPI.number_andc                 C   r_  )NÚOrra  rb  rc  r   r   r   Ú	number_orW  r5   zPythonAPI.number_orc                 C   r_  )NÚXorra  rb  rc  r   r   r   Ú
number_xorZ  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_negativec  rµ   zPythonAPI.number_negativec                 C   r€  )NÚPyNumber_Positiver¤   r³   r«   r   r   r   Únumber_positiveh  rµ   zPythonAPI.number_positivec                 C   r±   )NÚPyNumber_Floatr¤   r³   )r   r3   r    r¬   r   r   r   Únumber_floatm  rµ   zPythonAPI.number_floatc                 C   r€  )NÚPyNumber_Invertr¤   r³   r«   r   r   r   Únumber_invertr  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_doublew  rµ   zPythonAPI.float_as_doublec                 C   s   | j  || j¡}|  |¡S )z8
        Get a Python bool from a LLVM boolean.
        )r:   rW  r~   Úbool_from_long)r   ÚbvalÚlongvalr   r   r   Úbool_from_bool|  s   
zPythonAPI.bool_from_boolc                 C   r%  )NÚPyBool_FromLongr¤   r@  )r   r9  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_update/  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_entry4  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   I  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_ensureZ  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_releasef  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_threadp  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_thready  s   zPythonAPI.restore_threadc                 C   s0   t  | j| jg¡}| j|dd}| j ||f¡S )NÚnumba_get_pyobject_private_datar¤   r7  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=   rD  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=   rD  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=   rD  r3   r    r¬   r   r   r   Úobject_setattr  s   zPythonAPI.object_setattrc                 C   ó   |   |||  ¡ ¡S r   )rI  r™   ©r   r=   rD  r   r   r   Úobject_delattr_string  ó   zPythonAPI.object_delattr_stringc                 C   rL  r   )rK  r™   rM  r   r   r   Úobject_delattr  rO  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=   rS  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  rR  r   r   r   Úobject_delitem3  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_sizeA  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\  r`  Úp_kindÚp_asciiÚp_hashr    r~  r¬   ra  rb  r   r   r   Ústring_as_string_size_and_kindU  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_sizes  ó   z%PythonAPI.string_from_string_and_sizec                 C   rY  )NÚPyUnicode_FromStringr¤   r	  )r   rm  r    r~  r¬   r   r   r   Ústring_from_stringy  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   Úkindrm  rn  r    r~  r¬   r   r   r   Ústring_from_kind_and_data  s   z#PythonAPI.string_from_kind_and_datac                 C   rY  )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_bufferr`  r    r~  r¬   r  rb  r   r   r   Úbytes_as_string_and_size‹  s   þz"PythonAPI.bytes_as_string_and_sizec                 C   ri  )NÚPyBytes_FromStringAndSizer¤   rk  rl  r   r   r   Úbytes_from_string_and_size–  rp  z$PythonAPI.bytes_from_string_and_sizec                 C   rY  )NÚPyObject_Hashr¤   )r   r§   rŽ   r`   r©   r:   rª   rw  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
   r.  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_object/  s
   

zPythonAPI.print_objectc                 C   s   | j  | j|¡}|  |¡ d S r   )r9   rÉ   rq   r†  )r   Útextr¾   r   r   r   Úprint_string6  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_packA  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Œ  K  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_structY  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_uncachedc  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   Úpdatarn  Údtyper0   r    r¬   Ú	dtypeaddrr   r   r   Úrecreate_record1  s   ÿzPythonAPI.recreate_recordc                 C   s0   | j  | j|¡}| j  tjt|ƒ¡}|  ||¡S r   )r9   rÉ   rq   rÀ  r   r†   rW   ro  )r   rm  r  Úszr   r   r   Ústring_from_constant_string8  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Úrettyr8  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-  r0  r3  r5  r8  r>  rA  rF  rI  rK  rM  rU  rX  rY  r^  rd  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¾  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=  r@  rB  rE  rG  rI  rK  rN  rP  rT  rV  rX  r]  rc  rh  ro  rr  ru  rx  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  r/  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>  )rC  r<  rÃ   Úentryptr   r   r   r=  ¸  s   
z%ObjModeUtils._call_objmode_dispatcherN)r'   r(   r)   r6   r   rH  Ústaticmethodr=  r   r   r   r   r2  {  s    7r2  )0Úcollectionsr   r0  Ú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   r2  r   r   r   r   Ú<module>   s`    $ÿÿÿ
4           c