U
    ñ¾|e�·  ã                   @   sp  d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZmZ eejƒd
d„ ƒZeejƒdd„ ƒZeejƒeejƒdd„ ƒƒZeejƒdd„ ƒZeejƒdd„ ƒZ eej!ƒdd„ ƒZ"eej!ƒdd„ ƒZ#eej$ƒdd„ ƒZ%eej$ƒdd„ ƒZ&eej'ƒdd„ ƒZ(eej'ƒeej)ƒdd„ ƒƒZ*eej+ƒd d!„ ƒZ,eej+ƒd"d#„ ƒZ-eej.ƒd$d%„ ƒZ/eej.ƒd&d'„ ƒZ0eej1ƒd(d)„ ƒZ2eej3ƒd*d+„ ƒZ4eej3ƒd,d-„ ƒZ5eej6ƒd.d/„ ƒZ7eej6ƒd0d1„ ƒZ8eej9ƒd2d3„ ƒZ:eej9ƒd4d5„ ƒZ;eej<ƒd6d7„ ƒZ=eej>ƒd8d9„ ƒZ?eej>ƒd:d;„ ƒZ@eejAƒd<d=„ ƒZBeejAƒd>d?„ ƒZCeejDƒd@dA„ ƒZEeejFƒdBdC„ ƒZGeejHƒdDdE„ ƒZIeejJƒdFdG„ ƒZKeejLƒdHdI„ ƒZMeejJƒdJdK„ ƒZNeejOƒeejPƒdLdM„ ƒƒZQeejRƒeejSƒdNdO„ ƒƒZTeejUƒdPdQ„ ƒZVeejWƒdRdS„ ƒZXG dTdU„ dUeYƒZZdVdW„ Z[eejWƒdXdY„ ƒZ\e	ejWƒdZd[„ ƒZ]d\d]„ Z^eej_ƒd^d_„ ƒZ`d`da„ Zaeej_ƒdbdc„ ƒZbe	ej_ƒddde„ ƒZceejdƒdfdg„ ƒZeeejdƒdhdi„ ƒZfeejgƒdjdk„ ƒZheejgƒdldm„ ƒZieejjƒdndo„ ƒZkeejjƒdpdq„ ƒZleejmƒeejnƒdrds„ ƒƒZoeejmƒeejnƒdtdu„ ƒƒZpeejqƒdvdw„ ƒZreejsƒdxdy„ ƒZteejsƒdzd{„ ƒZueejvƒd|d}„ ƒZweejvƒd~ds„ ƒZodd€„ Zxd�d‚„ Zyeejzƒdƒd„„ ƒZ{eej|ƒd…d†„ ƒZ}eej|ƒd‡dˆ„ ƒZ~eejƒd‰dŠ„ ƒZ€eej�ƒd‹dŒ„ ƒZ‚eejƒƒd�dŽ„ ƒZ„e ƒd�¡Z…eej†ƒd�d‘„ ƒZ‡eej†ƒd’d“„ ƒZˆd”S )•zG
Boxing and unboxing of native Numba values to / from CPython objects.
é    )Úir)ÚtypesÚcgutils)ÚboxÚunboxÚreflectÚNativeValue)ÚNumbaNotImplementedError)ÚtypeofÚPurpose)ÚsetobjÚlistobj)Únumpy_support)ÚcontextmanagerÚ	ExitStackc                 C   s   |j  |¡S ©N)ÚpyapiÚbool_from_bool©ÚtypÚvalÚc© r   úN/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/core/boxing.pyÚbox_bool   s    r   c                 C   s<   |j  |¡}t |jd¡}|j d||¡}t||j  ¡ d�S )Nr   ú!=©Úis_error)	r   Úobject_istruer   ÚConstantÚtypeÚbuilderÚicmp_signedr   Úc_api_error)r   Úobjr   ÚistrueÚzeror   r   r   r   Úunbox_boolean   s    r'   c                 C   s$   |j  |j|| | j¡}| | j|¡S r   )ÚcontextÚcastr!   Úliteral_typer   r   r   r   r   Úbox_literal_integer!   s    r+   c                 C   sF   | j r$|j ||jj¡}|j |¡S |j ||jj¡}|j |¡S d S r   )	Úsignedr!   Úsextr   ÚlonglongÚlong_from_longlongÚzextÚ	ulonglongÚlong_from_ulonglong)r   r   r   ÚivalZullvalr   r   r   Úbox_integer(   s
    r4   c              	   C   sœ   |j  | ¡}t |j|¡}|j |¡}|j |¡�J | jrH|j 	|¡}n|j 
|¡}|j |¡ |j |j ||¡|¡ W 5 Q R X t|j |¡|j ¡ d�S ©Nr   )r(   Úget_argument_typer   Úalloca_oncer!   r   Únumber_longÚif_object_okr,   Úlong_as_longlongÚlong_as_ulonglongÚdecrefÚstoreÚtruncr   Úloadr#   )r   r$   r   Zll_typer   ZlongobjÚllvalr   r   r   Úunbox_integer1   s    "ÿrA   c                 C   s<   | t jkr|j ||jj¡}n| t jks,t‚|}|j |¡S r   )	r   Úfloat32r!   Úfpextr   ÚdoubleÚfloat64ÚAssertionErrorÚfloat_from_double)r   r   r   Údbvalr   r   r   Ú	box_floatA   s
    
rI   c                 C   sj   |j  |¡}|j  |¡}|j  |¡ | tjkrF|j ||j 	| ¡¡}n| tj
ksTt‚|}t||j  ¡ d�S r5   )r   Únumber_floatÚfloat_as_doubler<   r   rB   r!   Úfptruncr(   r6   rE   rF   r   r#   )r   r$   r   ÚfobjrH   r   r   r   r   Úunbox_floatJ   s    

ÿrN   c                 C   sr   |j j|j| |d�}| tjkrH|j |j|jj¡}|j |j	|jj¡}n| tj
ksVt‚|j|j	 }}|j ||¡S ©N©Úvalue)r(   Úmake_complexr!   r   Ú	complex64rC   Úrealr   rD   ÚimagÚ
complex128rF   Úcomplex_from_doubles)r   r   r   ÚcvalZfrealZfimagr   r   r   Úbox_complexX   s    
rY   c              	   C   sÖ   |j  |jtj¡}|j || ¡ ¡}t 	|j|¡}t 
|j|¡� |j dd| f ¡ W 5 Q R X | tjkr´|j  |j| ¡}|j  |j|jtjtj¡|_|j  |j|jtjtj¡|_n| tjksÂt‚|}t| ¡ |d�S )NÚPyExc_TypeErrorzconversion to %s failedr   )r(   rR   r!   r   rV   r   Úcomplex_adaptorÚ_getpointerr   Úis_falseÚif_unlikelyÚerr_set_stringrS   r)   rT   rE   rB   rU   rF   r   Ú	_getvalue)r   r$   r   Zc128ÚokÚfailedÚcplxr   r   r   Úunbox_complexd   s(    ÿ
 ÿ ÿrd   c                 C   s
   |j  ¡ S r   )r   Ú	make_noner   r   r   r   Úbox_none|   s    rf   c                 C   s   t |j ¡ ƒS r   ©r   r(   Úget_dummy_valuer   r   r   r   Ú
unbox_none€   s    ri   c                 C   s   |j  || j¡S r   )r   Úcreate_np_datetimeÚ	unit_coder   r   r   r   Úbox_npdatetime†   s    rl   c                 C   s   |j  |¡}t||j  ¡ d�S r5   )r   Úextract_np_datetimer   r#   ©r   r$   r   r   r   r   r   Úunbox_npdatetimeŠ   s    ro   c                 C   s   |j  || j¡S r   )r   Úcreate_np_timedeltark   r   r   r   r   Úbox_nptimedelta�   s    rq   c                 C   s   |j  |¡}t||j  ¡ d�S r5   )r   Úextract_np_timedeltar   r#   rn   r   r   r   Úunbox_nptimedelta”   s    rs   c                 C   s*   |j  tj¡}|j ||¡}| tj|¡S )z0
    Convert a raw pointer to a Python int.
    )r(   Úget_value_typer   Úuintpr!   Úptrtointr   )r   r   r   Úll_intpÚaddrr   r   r   Úbox_raw_pointerš   s    ry   c                 C   s4   |  | j|¡}|j |j | j¡¡}|j ||f¡S )z6
    Fetch an enum member given its native value.
    )r   Údtyper   ÚunserializeÚserialize_objectÚinstance_classÚcall_function_objargs)r   r   r   ÚvalobjÚcls_objr   r   r   Úbox_enum¤   s    r�   c                 C   s   |j  |d¡}| | j|¡S )z=
    Convert an enum member's value to its native value.
    rQ   )r   Úobject_getattr_stringr   rz   )r   r$   r   r   r   r   r   Ú
unbox_enum¯   s    rƒ   c                 C   sH   t  t  d¡|jjj¡}|j |t  t  d¡¡¡}|j	 
||| j|j¡S )Né    é   )r   r   ÚIntTyper    ÚpointeeÚcountr!   ÚbitcastÚPointerTyper   Úrecreate_recordrz   Úenv_manager)r   r   r   ÚsizeÚptrr   r   r   Ú
box_record»   s    r�   c                    s\   ˆj  ¡ ‰ ˆj  |ˆ ¡}t ˆj|¡}ˆj | ¡}ˆj ||¡}‡ ‡fdd„}t	|||d�S )Nc                      s   ˆj  ˆ ¡ d S r   ©r   Úrelease_bufferr   ©Úbufr   r   r   ÚcleanupÍ   s    zunbox_record.<locals>.cleanup©r”   r   )
r   Úalloca_bufferÚextract_record_datar   Úis_nullr!   r(   rt   r‰   r   )r   r$   r   rŽ   r   Últypr   r”   r   r’   r   Úunbox_recordÄ   s    
rš   c              
   C   s*  |j j|j j|j jdœtj }|j tj	|¡}t
j|j|d�}|j ||j j¡}|j tj| j¡}| d¡}| d¡}	| tj¡}
t
 |j|¡}t
 |j|g|j¡�d\}|j |j ||j ||
¡g¡¡}|j t
 |j|¡¡� |j |j ||	¡|¡ W 5 Q R X W 5 Q R X |j |¡}|j  |||¡S )N)é   é   é   rP   r   r›   )r   Úpy_unicode_1byte_kindÚpy_unicode_2byte_kindÚpy_unicode_4byte_kindr   Úsizeof_unicode_charr(   Úget_constantr   Úint32r   Úalloca_once_valuer!   r‰   ÚcstringÚintprˆ   r    Ú	loop_nestr?   ÚgepÚmulÚif_thenÚis_not_nullr=   ÚaddÚstring_from_kind_and_data)r   r   r   Úunicode_kindÚkindÚrawptrÚstrptrÚfullsizer&   ÚoneÚsteprˆ   ÚidxÚchÚstrlenr   r   r   Úbox_unicodecharseqÒ   s(    ýý

",r¸   c              	   C   sÆ   |j  | ¡}|j |¡\}}}}}}	t |j|¡�n t |j	| j
¡}
|j d||
¡}|j |||
¡}t |d ¡}t |j|¡}t |j|j ||j	¡||¡ W 5 Q R X |j |¡}t||j |¡d�S ©Nz<=r   )r(   rt   r   Ústring_as_string_size_and_kindr   Ú	if_likelyr!   r   r   r    rˆ   Úicmp_unsignedÚselectr¤   Úmemcpyr‰   r?   r   Únot_)r   r$   r   Últyra   Úbufferr�   r¯   Úis_asciiÚhashvÚstorage_sizeÚ	size_fitsÚnull_stringÚoutspaceÚretr   r   r   Úunbox_unicodecharseqì   s     
ÿ þrÉ   c                 C   s<   |j  |j| |¡}|j |j|j¡}|j j |j| |¡ |S r   )	r(   Úmake_helperr!   r   Úbytes_from_string_and_sizeÚdataÚnitemsÚnrtr<   )r   r   r   r$   rÈ   r   r   r   Ú	box_bytes
  s    rÏ   c              
   C   sä   t j|j|d�}|j ||jj¡}|j tj	| j
¡}| d¡}| d¡}t  |j|¡}t  |j|g|j¡�Z\}	|j |j ||	g¡¡}
|j t  |j|
¡¡� |j |j |	|¡|¡ W 5 Q R X W 5 Q R X |j |¡}|j ||¡S )NrP   r   r›   )r   r¤   r!   r‰   r   r¥   r(   r¢   r   r¦   rˆ   r    r§   r?   r¨   rª   r«   r=   r¬   rË   )r   r   r   r°   r±   r²   r&   r³   rˆ   rµ   r¶   r·   r   r   r   Úbox_charseq  s    

,rÐ   c              	   C   sÀ   |j  | ¡}|j |¡\}}}t |j|¡�n t |j	| j
¡}|j d||¡}|j |||¡}t |d ¡}	t |j|	¡}
t |j|j |
|j	¡||¡ W 5 Q R X |j |
¡}t||j |¡d�S r¹   )r(   rt   r   Ústring_as_string_and_sizer   r»   r!   r   r   r    rˆ   r¼   r½   r¤   r¾   r‰   r?   r   r¿   )r   r$   r   rÀ   ra   rÁ   r�   rÄ   rÅ   rÆ   rÇ   rÈ   r   r   r   Úunbox_charseq)  s     þrÒ   c              
   C   s¢   |j  |j| |¡}t |j|j ¡ ¡}|j |j¡�\\}}|�$ | 	| j
|j¡}|j ||¡ W 5 Q R X |� |j |j ¡ |¡ W 5 Q R X W 5 Q R X |j |¡S r   )r(   rÊ   r!   r   r¤   r   Úborrow_noneÚif_elseÚvalidr   r    rÌ   r=   re   r?   )r   r   r   ÚoptvalrÈ   ÚthenÚ	otherwiseZvalidresr   r   r   Úbox_optionalE  s    (rÙ   c              
      s  ˆ j  ˆ j| j¡}ˆ j d|ˆ j ¡ ¡‰t ˆ j|j¡}t 	ˆ jtj
¡}ˆ j ˆ¡�z\}}|�H ˆ  | j|¡‰ˆ j  ˆ j| jˆj¡}ˆ j ||¡ ˆ j ˆj|¡ W 5 Q R X |� ˆ j ||¡ W 5 Q R X W 5 Q R X ˆjdk	rð‡ ‡‡fdd„}	nd}	ˆ j |¡}
t|
ˆ j |¡|	d�S )z>
    Convert object *obj* to a native optional structure.
    r   Nc                	      s$   ˆ j  ˆ¡� ˆ ¡  W 5 Q R X d S r   )r!   rª   r”   r   ©r   Zis_not_noneÚnativer   r   r”   i  s    zunbox_optional.<locals>.cleanup©r   r”   )r(   Úmake_optional_noner!   r    r"   r   rÓ   r   r7   r¤   Ú	false_bitrÔ   r   Úmake_optional_valuerQ   r=   r   r”   r?   r   )r   r$   r   ZnonevalÚretptrZerrptrr×   ÚorelseZjustr”   rÈ   r   rÚ   r   Úunbox_optionalR  s,    
 ÿ"
ÿrâ   c           	      C   sZ   ddl m} |j |¡\}}}}|j |j| ¡}||_||_||_	t
| ¡ |j |¡d�S )z;
    Convert object *obj* to a native slice structure.
    r   )Úslicingr   )Únumba.cpythonrã   r   Úslice_as_intsr(   rÊ   r!   ÚstartÚstopr´   r   r`   r¿   )	r   r$   r   rã   ra   ræ   rç   r´   Úslir   r   r   Úunbox_slicet  s    ré   c                 C   sÖ   | j }dD ]b}t||ƒ}t|tƒr
zt|tƒ W q
 tk
rj } ztd|› dt|ƒ› �ƒ‚W 5 d }~X Y q
X q
| j  ¡ \}}|j	 
|¡}	|j	 
|¡}
|j	 |	¡}|j	 |
¡}|j	 ||¡}|j	 |¡ |j	 |¡ |S )N)ræ   rç   r´   z7Unable to create literal slice. Error encountered with z attribute. )Úliteral_valueÚgetattrÚ
isinstanceÚintr
   r   Ú
ValueErrorÚstrÚ
__reduce__r   r|   r{   Úcallr<   )r   r   r   Z	slice_litÚ
field_nameZ	field_objÚeZpy_ctorÚpy_argsZserialized_ctorZserialized_argsÚctorÚargsr$   r   r   r   Úbox_slice_literal�  s&    

ÿr÷   c                 C   s   t |j ¡ ƒS r   rg   ©r   r$   r   r   r   r   Úunbox_string_literal›  s    rù   c           	      C   sˆ   |j  | ¡}||j |j|d�}|j jrnt | j¡}|j |j 	|¡¡}|j
 | ||¡}|j j |j| |¡ |S |j}|j
 |¡ |S d S rO   )r(   Ú
make_arrayr!   Ú
enable_nrtr   Úas_dtyperz   rŒ   Ú
read_constÚ	add_constr   Únrt_adapt_ndarray_to_pythonrÎ   r<   ÚparentÚincref)	r   r   r   ÚnativearyclsÚ	nativearyÚnp_dtypeÚdtypeptrÚnewaryr   r   r   r   Ú	box_array§  s    r  c           
   	      sÆ   ˆj  ¡ ‰ ˆj  |ˆ ¡}t ˆj|¡}ˆj | ¡}|ˆjˆjƒ}| ¡ }t 	ˆjˆj 
|¡¡�> ˆj |ˆj j¡}ˆjjrŠˆj  ˆ |¡ nˆj  ˆ |¡ W 5 Q R X ‡ ‡fdd„}	tˆj |¡||	d�S )zK
    Convert a Py_buffer-providing object to a native array structure.
    c                      s   ˆj  ˆ ¡ d S r   r�   r   r’   r   r   r”   Ì  s    zunbox_buffer.<locals>.cleanuprÜ   )r   r–   Ú
get_bufferr   r«   r!   r(   rú   r\   r»   r¿   r‰   Úvoidptrrû   Únrt_adapt_buffer_from_pythonÚnumba_buffer_adaptorr   r?   )
r   r$   r   Úresr   r  r  ÚaryptrrŽ   r”   r   r’   r   Úunbox_buffer¸  s    
ÿr  c              	   C   sü   |j  | ¡}||j |jƒ}| ¡ }|j ||jj¡}|j jrL|j ||¡}n|j 	||¡}zt
 | j¡j}W n tk
r†   tj}	Y n X |j |¡}|j d|j|¡}	|j t |j|¡|	¡}
|jj|
dd�� |j dd¡ W 5 Q R X t|j |¡|
d�S )zC
    Convert a Numpy array object to a native array structure.
    r   F©ÚlikelyrZ   zXcan't unbox array from PyObject into native value.  The object maybe of a different typer   )r(   rú   r!   r\   r‰   r   r	  rû   Únrt_adapt_ndarray_from_pythonÚnumba_array_adaptorr   rü   rz   Úitemsizer	   r   rÞ   r    r¼   Úor_r«   rª   r_   r   r?   )r   r$   r   r  r  r  rŽ   ZerrcodeZexpected_itemsizeZitemsize_mismatchrb   r   r   r   Úunbox_arrayÒ  s4    
ýþÿr  c                 C   sN   |j  | j¡}t| ƒD ]2\}}|j ||¡}| ||¡}|j  |||¡ q|S )zD
    Convert native array or structure *val* to a tuple object.
    )r   Ú	tuple_newrˆ   Ú	enumerater!   Úextract_valuer   Útuple_setitem)r   r   r   Ú	tuple_valÚirz   Úitemr$   r   r   r   Ú	box_tuple  s    r  c                 C   sL   |j  |j  | j¡¡}t| ||ƒ}|j  ||¡}|j  |¡ |j  |¡ |S )zI
    Convert native array or structure *val* to a namedtuple object.
    )r   r{   r|   r}   r  rñ   r<   )r   r   r   r€   Z	tuple_objr$   r   r   r   Úbox_namedtuple  s    r  c              
      s˜  t | ƒ}g }g ‰ |j | ¡}t |jtj¡}t |j|¡}|j 	|¡}|j 
d|t |j|¡¡}	|jj|j |	¡dd��, |j dd|f |¡ |j tj|¡ W 5 Q R X t| ƒD ]r\}
}|j ||
¡}| ||¡}| |j¡ |jj|jdd�� |j tj|¡ W 5 Q R X |jdk	r²ˆ  |j¡ q²|j |j| |¡}|j ||¡ ˆ �rv|jj|	dd�� ‡ fdd	„}W 5 Q R X nd}t|j |¡||j |¡d
�S )zN
    Convert tuple *obj* to a native array (if homogeneous) or structure.
    z==Fr  ZPyExc_ValueErrorz<size mismatch for tuple, expected %d element(s) but got %%zdNTc                     s   t ˆ ƒD ]
} | ƒ  qd S r   )Úreversed)Úfunc©Úcleanupsr   r   r”   G  s    zunbox_tuple.<locals>.cleanupr•   )Úlenr(   rt   r   r¤   r!   rÞ   r7   r   Ú
tuple_sizer¼   r   r   r    rª   r¿   Ú
err_formatr=   Útrue_bitr  Útuple_getitemr   ÚappendrQ   r   r”   Ú
make_tupler   r?   )r   r$   r   ÚnÚvaluesrÀ   Úis_error_ptrZ	value_ptrÚactual_sizeZsize_matchesr  ZeltypeÚelemrÛ   rQ   r”   r   r!  r   Úunbox_tuple  sD    
ÿý

ÿr/  c                 C   s0  t  |j|j| |¡}|j}t |j|¡}|j t |j|¡¡�Ì\}}|� |j	 
|¡ W 5 Q R X |�œ |j}|j	 |¡}|jjt |j|¡dd��V t |j|¡�<}	| |	j¡}
| |
¡ | | j|
¡}|j	 ||	j|¡ W 5 Q R X W 5 Q R X |j ||¡ W 5 Q R X W 5 Q R X |jj |j| |¡ |j |¡S )z5
    Convert native list *val* to a list object.
    Tr  )r   ÚListInstancer(   r!   r   r   r¤   rÔ   r«   r   r  r�   Úlist_newrª   Ú	for_rangeÚgetitemÚindexÚincref_valuer   rz   Úlist_setitemr=   rÎ   r<   r?   )r   r   r   Úlistr$   r  Ú
has_parentrØ   rÍ   Úloopr  Úitemobjr   r   r   Úbox_listQ  s(    ÿ
&"r;  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_NumbaTypeHelperaÿ  A helper for acquiring `numba.typeof` for type checking.

    Usage
    -----

        # `c` is the boxing context.
        with _NumbaTypeHelper(c) as nth:
            # This contextmanager maintains the lifetime of the `numba.typeof`
            # function.
            the_numba_type = nth.typeof(some_object)
            # Do work on the type object
            do_checks(the_numba_type)
            # Cleanup
            c.pyapi.decref(the_numba_type)
        # At this point *nth* should not be used.
    c                 C   s
   || _ d S r   )r   )Úselfr   r   r   r   Ú__init__„  s    z_NumbaTypeHelper.__init__c                 C   sH   | j }|j |jjd¡}|j |¡}|j |d¡}|| _|j 	|¡ | S )NÚnumbar
   )
r   r(   Úinsert_const_stringr!   Úmoduler   Úimport_module_noblockr‚   Ú	typeof_fnr<   )r=  r   Z
numba_nameÚ	numba_modrC  r   r   r   Ú	__enter__‡  s    z_NumbaTypeHelper.__enter__c                 O   s   | j }|j | j¡ d S r   )r   r   r<   rC  )r=  rö   Úkwargsr   r   r   r   Ú__exit__�  s    z_NumbaTypeHelper.__exit__c                 C   s   | j j | j|g¡}|S r   )r   r   r~   rC  )r=  r$   r  r   r   r   r
   ”  s    z_NumbaTypeHelper.typeofN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r>  rE  rG  r
   r   r   r   r   r<  s  s
   	r<  c                    s  ‡ ‡‡fdd„}t j ˆ jˆ j| |¡\}}ˆ jj|dd���ž\}	}
|	��h ||_t |j	d¡}ˆ jj
ˆ j d||¡dd��È tˆ ƒ�´}| ˆ j ||¡¡}t ˆ j|¡�z‰ˆ j |ˆj¡}||||ƒ ˆ  | j|¡}ˆ jj
|jdd�� ˆ j tjˆ¡ ˆ ¡  W 5 Q R X |jˆj|jdd� W 5 Q R X ˆ j |¡ W 5 Q R X W 5 Q R X | j�rV||_ˆ jj
ˆ j ˆ j ˆ¡¡dd�� ˆ j  ||j!¡ W 5 Q R X | "d¡ ˆ j |j|¡ W 5 Q R X |
� ˆ j tjˆ¡ W 5 Q R X W 5 Q R X ˆ j 
ˆ j ˆ¡¡� ˆ jj# ˆ j| |j¡ W 5 Q R X d	S )
z9
    Construct a new native list from a Python list.
    c              	      sº   |   |¡}ˆ jjt ˆ j|¡dd�� ˆ j tjˆ¡ ˆ ¡  W 5 Q R X ˆ j d||¡}ˆ jj|dd��< ˆ j tjˆ¡ ˆ j	 
dd||¡ ˆ j	 |¡ ˆ ¡  W 5 Q R X ˆ j	 |¡ d S )NFr  r   rZ   z(can't unbox heterogeneous list: %S != %S)r
   r!   rª   r   r˜   r=   r&  Údo_breakr"   r   r%  r<   )Únthr:  Úexpected_typobjÚtypobjÚtype_mismatch©r   Úerrorptrr9  r   r   Úcheck_element_type�  s&    
þ ýz2_python_list_to_native.<locals>.check_element_typeTr  r   ú>F)r  N)$r   r0  Úallocate_exr(   r!   rÔ   r�   r   r   r    rª   r"   r<  r
   r   Úlist_getitemr   r2  r4  r   rz   r   r=   r&  rL  ÚsetitemrQ   r<   Ú	reflectedr   r¿   r?   Úobject_set_private_dataÚmeminfoÚ	set_dirtyrÎ   )r   r$   r   r�   ÚlistptrrR  rS  ra   r7  Úif_okÚ	if_not_okr&   rM  rN  r:  rÛ   r   rQ  r   Ú_python_list_to_native™  s@    ÿ
 ÿ
$r_  c              
      sú   ˆ j  ˆ¡}t ˆ jtj¡}t ˆ jˆ j | ¡¡}ˆ j  	ˆ¡}ˆ j 
t ˆ j|¡¡�t\}}|�> tj ˆ jˆ j| |¡}	||	_| jrˆˆ|	_ˆ j |	j|¡ W 5 Q R X |� t| ˆˆ |||ƒ W 5 Q R X W 5 Q R X ‡ ‡fdd„}
tˆ j |¡ˆ j |¡|
d�S )z�
    Convert list *obj* to a native list.

    If list was previously unboxed, we reuse the existing native list
    to ensure consistency.
    c                      s   ˆ j  ˆ¡ d S r   ©r   Úobject_reset_private_datar   ©r   r$   r   r   r”   ý  s    zunbox_list.<locals>.cleanuprÜ   )r   Ú	list_sizer   r¤   r!   rÞ   r7   r(   rt   Úobject_get_private_datarÔ   r«   r   r0  Úfrom_meminfor�   rX  r   r=   rQ   r_  r   r?   )r   r$   r   r�   rR  r\  rŽ   Úhas_meminforØ   r7  r”   r   rb  r   Ú
unbox_listß  s&    &
þrg  c                 C   sü  | j s
dS | jj r$d | ¡}t|ƒ‚t |j|j| |¡}|jj|j	dd���¦ |j
}|j |¡}|j}|j ||¡}|j d|t |jd¡¡}	|j |	¡��B\}
}|
�¼ t |j|¡�<}| |j¡}| |¡ | | j|¡}|j ||j|¡ W 5 Q R X t |j|¡�R}|j ||j¡}| |¡}| |¡ | | j|¡}|j ||¡ |j |¡ W 5 Q R X W 5 Q R X |�h |j |||d¡ t |j|¡�<}| |j¡}| |¡ | | j|¡}|j ||j|¡ W 5 Q R X W 5 Q R X W 5 Q R X | d¡ W 5 Q R X dS )zD
    Reflect the native list's contents into the Python object.
    Nz2cannot reflect element of reflected container: {}
Fr  z>=r   ) rX  rz   ÚformatÚ	TypeErrorr   r0  r(   r!   rª   Údirtyr   r   rc  r�   Úsubr"   r   r   r    rÔ   r   r2  r3  r4  r5  r   r6  r¬   Úlist_appendr<   Úlist_setslicer[  )r   r   r   Úmsgr7  r$   r�   Únew_sizeÚdiffZ	diff_gt_0Zif_growZ	if_shrinkr9  r  r:  rµ   r   r   r   Úreflect_list  sH    

ÿ


 
0rq  c                 C   sX  t j |j|j| |¡\}}|jj|dd���ì\}}	|��¶ t |jt 	|j
jd¡¡}
|j
 |¡��}|j}|j
 |¡}|j |
¡}|jjt |j|¡dd��Š\}}|� |j ||
¡ W 5 Q R X |�X |j d||¡}|jj|dd��, |j tj|¡ |j
 dd¡ | ¡  W 5 Q R X W 5 Q R X W 5 Q R X | | j|¡}|jj|jdd�� |j tj|¡ W 5 Q R X |j|j
|jdd� W 5 Q R X | j�r”||_|jj|j |j |¡¡dd�� |j
 ||j¡ W 5 Q R X |  d¡ |j |j|¡ W 5 Q R X |	� |j tj|¡ W 5 Q R X W 5 Q R X |j |j |¡¡� |jj! "|j| |j¡ W 5 Q R X dS )	z7
    Construct a new native set from a Python set.
    Tr  NFr   rZ   zcan't unbox heterogeneous set)Ú	do_resize)#r   ÚSetInstancerU  r(   r!   rÔ   r   r¤   r   r   r   ÚpyobjÚset_iteraterQ   Úget_typer?   r˜   r=   r"   rª   r&  r_   rL  r   rz   r   Ú	add_pyapirX  r   r¿   rY  rZ  r[  rÎ   r<   )r   r$   r   r�   ÚsetptrrR  ra   Úinstr]  r^  Z	typobjptrr9  r:  rO  rN  Zif_firstZif_not_firstrP  rÛ   r   r   r   Ú_python_set_to_native9  sV    ÿþ
ÿÿ&ÿ
$rz  c              
      sô   ˆ j  ˆ¡}t ˆ jtj¡}t ˆ jˆ j | ¡¡}ˆ j  	ˆ¡}ˆ j 
t ˆ j|¡¡�n\}}|�8 tj ˆ jˆ j| |¡}	| jr‚ˆ|	_ˆ j |	j|¡ W 5 Q R X |� t| ˆˆ |||ƒ W 5 Q R X W 5 Q R X ‡ ‡fdd„}
tˆ j |¡ˆ j |¡|
d�S )zŒ
    Convert set *obj* to a native set.

    If set was previously unboxed, we reuse the existing native set
    to ensure consistency.
    c                      s   ˆ j  ˆ¡ d S r   r`  r   rb  r   r   r”   ‘  s    zunbox_set.<locals>.cleanuprÜ   )r   Úset_sizer   r¤   r!   rÞ   r7   r(   rt   rd  rÔ   r«   r   rs  re  rX  r   r=   rQ   rz  r   r?   )r   r$   r   r�   rR  rx  rŽ   rf  rØ   ry  r”   r   rb  r   Ú	unbox_sett  s$    &
þr|  c              
   C   sÞ   |j }|j |¡}t |j|¡}|jj|dd��  t |jt 	|j
d¡¡}| ¡ �t}|j |¡}|jj}	|jj |j| j|	¡ | | j|	¡}
|j |||
¡ |j |t 	|j
d¡¡}|j ||¡ W 5 Q R X W 5 Q R X ||fS )z9
    Create a Python list from a native set's items.
    Tr  r   r›   )Úusedr   r1  r   r«   r!   rª   r¤   r   r   r    Ú_iterater?   ÚentryÚkeyr(   rÎ   r  rz   r   r6  r¬   r=   )r   Úpayloadr   rÍ   r   ra   r4  r9  r  r  r:  r   r   r   Ú_native_set_to_python_listš  s     ÿ
"r‚  c                 C   sò   t  |j|j| |¡}|j}t |j|¡}|j t |j|¡¡�Ž\}}|� |j	 
|¡ W 5 Q R X |�^ |j}t| ||ƒ\}	}
|jj|	dd��, |j	 |
¡}|j	 |
¡ |j ||¡ W 5 Q R X W 5 Q R X W 5 Q R X |jj |j| |¡ |j |¡S )z3
    Convert native set *val* to a set object.
    Tr  )r   rs  r(   r!   r   r   r¤   rÔ   r«   r   r  r�  r‚  rª   Úset_newr<   r=   rÎ   r?   )r   r   r   ry  r$   r  r8  rØ   r�  ra   r   r   r   r   Úbox_set°  s    ,r„  c              
   C   s¨   | j s
dS t |j|j| |¡}|j}|jj|jdd��h |j}|j	 
|¡ t| ||ƒ\}}|jj|dd��  |j	 ||¡ |j	 |¡ W 5 Q R X | d¡ W 5 Q R X dS )zC
    Reflect the native set's contents into the Python object.
    NFr  T)rX  r   rs  r(   r!   r�  rª   rj  r   r   Ú	set_clearr‚  Ú
set_updater<   r[  )r   r   r   ry  r�  r$   ra   r   r   r   r   Úreflect_setÍ  s    r‡  c                 C   s   |j  || |jj¡S r   )r   Úfrom_native_generatorrŒ   Úenv_ptrr   r   r   r   Úbox_generatorê  s    rŠ  c                 C   s   |j  || ¡S r   )r   Úto_native_generatorrø   r   r   r   Úunbox_generatorî  s    rŒ  c                 C   s    t  | j¡}|j |j |¡¡S r   ©r   rü   rz   r   r{   r|   ©r   r   r   r  r   r   r   Ú	box_dtypeó  s    r�  c                 C   s   t |j ¡ ƒS r   rg   r   r   r   r   Úunbox_dtypeø  s    r�  c                 C   s    t  | j¡}|j |j |¡¡S r   r�  rŽ  r   r   r   Úbox_number_classý  s    r‘  c                 C   s   t |j ¡ ƒS r   rg   r   r   r   r   Úunbox_number_class  s    r’  c                 C   s   |S r   r   r   r   r   r   Úbox_pyobject  s    r“  c                 C   s   t |ƒS r   ©r   rø   r   r   r   Úunbox_pyobject  s    r•  c           	   
   C   s   | j d krt| ƒ‚|j | ¡}tj|jt |d ¡dd�}|j	 
| j ¡}|j	 |¡}t |jt |j|¡¡�v |j	 ||f¡}|j	 |¡ t |jt |j|¡¡�6 |j	 |¡}|j	 |¡ |j |j ||¡|¡ W 5 Q R X W 5 Q R X t|j |¡|j	 ¡ d�S )NÚfnptr)Únamer   )Úget_pointerÚNotImplementedErrorr(   Úget_function_pointer_typer   r¤   r!   r   r   r   r|   r{   r»   r«   r~   r<   Úlong_as_voidptrr=   r‰   r   r?   r#   )	r   r$   r   ÚptrtyrÈ   Zserr˜  ZintobjrŽ   r   r   r   Úunbox_funcptr  s*    

þÿÿ,r�  c                 C   s(   |j j|  ¡ |j |dg¡|jd�}|S )Nr   )rŒ   )r   Úfrom_native_valueÚgetr!   r  rŒ   )r   r   r   Úoutr   r   r   Úbox_deferred)  s
    þr¡  c                 C   sF   |j  |  ¡ |¡}|jj|  }| |j| ¡ |j¡}t	||j
|jd�S )NrÜ   )r   Úto_native_valuerŸ  r(   Údata_model_managerÚsetr!   Úmake_uninitializedrQ   r   r   r”   )r   r$   r   Znative_valueÚmodelr  r   r   r   Úunbox_deferred1  s    ÿr§  c                 C   s   t |ƒS r   r”  rø   r   r   r   Úunbox_dispatcher:  s    r¨  c                 C   s   |j  |¡ |S r   )r   r  r   r   r   r   r“  @  s    c                 C   s.   |j  dd | ¡¡ |j | ¡}t|tjd�S )NrZ   zcan't unbox {!r} typer   )r   r_   rh  r(   Úget_constant_nullr   r   r&  )r   r$   r   r  r   r   r   Úunbox_unsupportedF  s
    ÿrª  c                 C   s&   d| f }|j  d|¡ |j  ¡ }|S )Nz)cannot convert native %s to Python objectrZ   )r   r_   Úget_null_object)r   r   r   rn  r  r   r   r   Úbox_unsupportedM  s    

r¬  c                 C   s   | j }|j |j |¡¡S r   )rê   r   r{   r|   )r   r   r   Úretvalr   r   r   Úbox_literalT  s    r®  c                 C   s   |j  |¡S r   )r   Únrt_meminfo_as_pyobjectr   r   r   r   Úbox_meminfo_pointer]  s    r°  c                 C   s&   |j  |¡}t |j|¡}t||d�S r5   )r   Únrt_meminfo_from_pyobjectr   r˜   r!   r   )r   r$   r   r  Úerroredr   r   r   Úunbox_meminfo_pointerb  s    r³  c                 C   s   t |j ¡ tjd�S r5   )r   r(   rh   r   rÞ   r   r   r   r   Úunbox_typerefh  s    r´  c                 C   s   t | ||ƒS r   )r¬  r   r   r   r   Úbox_LiteralStrKeyDictm  s    rµ  c           	   
      sB  t  ˆ jt j¡‰g ‰‡ ‡fdd„‰‡ ‡‡fdd„‰tƒ ��ê‰	‡ ‡fdd„‰t  | ¡ˆ jˆ jƒ‰
|ˆ
_ˆ|dƒ‰t  ˆ jˆ	ˆ¡� ˆƒ  W 5 Q R X ˆˆdƒ}t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X t	ˆ
dˆ  
tj|¡jƒ ˆˆd	ƒ}t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X ˆ|d
ƒ}t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X t	ˆ
d	ˆ  
tj|¡jƒ ˆ j ˆ jjd¡}ˆ j |¡}ˆ |¡ t  ˆ jˆ	|¡� ˆƒ  W 5 Q R X ˆ|dƒ‰t  ˆ jˆ	ˆ¡� ˆƒ  W 5 Q R X ˆ|dƒ‰t  ˆ jˆ	ˆ¡� ˆƒ  W 5 Q R X ‡ ‡‡‡‡‡‡‡	‡
f	dd„}|dƒ |dƒ |dƒ ˆƒ  W 5 Q R X tˆ
 ¡ ˆ j ˆ¡d�S )ar  
    The bit_generator instance has a `.ctypes` attr which is a namedtuple
    with the following members (types):
    * state_address (Python int)
    * state (ctypes.c_void_p)
    * next_uint64 (ctypes.CFunctionType instance)
    * next_uint32 (ctypes.CFunctionType instance)
    * next_double (ctypes.CFunctionType instance)
    * bit_generator (ctypes.c_void_p)
    c                     s   ˆD ]} ˆ j  | ¡ qd S r   )r   r<   )Z_ref©r   Ú
extra_refsr   r   Úclear_extra_refsƒ  s    z9unbox_numpy_random_bitgenerator.<locals>.clear_extra_refsc                      s   ˆ j  tjˆ¡ ˆƒ  d S r   )r!   r=   r   r&  r   )r   r¸  r,  r   r   Úhandle_failure‡  s    z7unbox_numpy_random_bitgenerator.<locals>.handle_failurec                    s   ˆ j  | |¡}ˆ |¡ |S r   )r   r‚   r(  )r$   ÚattrZattr_objr¶  r   r   Úobject_getattr_safely�  s    
z>unbox_numpy_random_bitgenerator.<locals>.object_getattr_safelyÚctypesÚstate_addressÚstaterQ   r)   Úc_void_pc              	      sÜ   ˆ j  ˆ| ¡}ˆ |¡ t ˆ jˆ|¡� ˆƒ  W 5 Q R X ˆ ˆ¡ ˆ j  |ˆg¡}t ˆ jˆ|¡� ˆƒ  W 5 Q R X ˆ ˆ¡ ˆ j  ˆ|¡}ˆ|dƒ}t ˆ jˆ|¡� ˆƒ  W 5 Q R X tˆd| › �ˆ  	t
j|¡jƒ d S )NrQ   Úfnptr_)r   r‚   r(  r   Úearly_exit_if_nullr!   Ú
tuple_packrñ   Úsetattrr   r   ru   rQ   )r—  Zinterface_next_fnrö   Zinterface_next_fn_castedZinterface_next_fn_casted_value)	r   Úct_castÚct_voidptr_tyÚctypes_bindingr·  r¹  r»  ÚstackÚ
struct_ptrr   r   Úwire_in_fnptrsÆ  s,     ÿ


 ÿÿz7unbox_numpy_random_bitgenerator.<locals>.wire_in_fnptrsÚnext_doubleÚnext_uint64Únext_uint32r   )r   r¤   r!   rÞ   r   Úcreate_struct_proxyr(   r   rÁ  rÃ  r   r   ru   rQ   r@  rA  r   rB  r(  r   r`   r?   )	r   r$   r   Zinterface_state_addressZinterface_stateZinterface_state_valueZctypes_nameZctypes_modulerÉ  r   )r   r¸  rÄ  rÅ  rÆ  r·  r¹  r,  r»  rÇ  rÈ  r   Úunbox_numpy_random_bitgenerators  sl    

 ÿÿ
 ÿþý


 rÎ  Úbit_generatorc           	   
   C   sÈ   t  |jt j¡}tƒ �”}t  | ¡|j|jƒ}|j |d¡}t  	|j||¡� |j 
t j|¡ W 5 Q R X | t|¡j}||_||_t  d¡}|j ||¡|_|j |¡ W 5 Q R X t| ¡ |j |¡d�S )a   
    Here we're creating a NumPyRandomGeneratorType StructModel with following fields:
    * ('bit_generator', _bit_gen_type): The unboxed BitGenerator associated with
                                        this Generator object instance.
    * ('parent', types.pyobject): Pointer to the original Generator PyObject.
    * ('meminfo', types.MemInfoPointer(types.voidptr)): The information about the memory
        stored at the pointer (to the original Generator PyObject). This is useful for
        keeping track of reference counts within the Python runtime. Helps prevent cases
        where deletion happens in Python runtime without NRT being awareness of it. 
    rÏ  Nr   )r   r¤   r!   rÞ   r   rÍ  r(   r   r‚   rÁ  r=   r&  r   Ú_bit_gen_typerQ   rÏ  r   Ú	voidptr_tÚnrt_meminfo_new_from_pyobjectrZ  r<   r   r`   r?   )	r   r$   r   r,  rÇ  rÈ  Zbit_gen_instZunboxedÚNULLr   r   r   Úunbox_numpy_random_generatorð  s     
þrÔ  c                 C   sR   |j  |j| |¡}|j}t |j|¡}|j |¡ |j j 	|j| |¡ |j 
|¡S r   )r(   rÊ   r!   r   r   r¤   r   r  rÎ   r<   r?   )r   r   r   ry  r$   r  r   r   r   Úbox_numpy_random_generator  s    rÕ  N)‰rK  Úllvmliter   Ú
numba.corer   r   Únumba.core.pythonapir   r   r   r   Únumba.core.errorsr	   Znumba.core.typing.typeofr
   r   rä   r   r   Únumba.npr   Ú
contextlibr   r   ÚBooleanr   r'   ÚIntegerLiteralÚBooleanLiteralr+   ÚIntegerr4   rA   ÚFloatrI   rN   ÚComplexrY   rd   ÚNoneTyperf   ÚEllipsisTyperi   Ú
NPDatetimerl   ro   ÚNPTimedeltarq   rs   Ú
RawPointerry   Ú
EnumMemberr�   rƒ   ÚRecordr�   rš   ÚUnicodeCharSeqr¸   rÉ   ÚBytesrÏ   ÚCharSeqrÐ   rÒ   ÚOptionalrÙ   râ   Ú	SliceTyperé   ÚSliceLiteralr÷   ÚStringLiteralrù   ÚArrayr  ÚBufferr  r  ÚTupleÚUniTupler  Ú
NamedTupleÚNamedUniTupler  Ú	BaseTupler/  ÚListr;  Úobjectr<  r_  rg  rq  rz  ÚSetr|  r‚  r„  r‡  Ú	GeneratorrŠ  rŒ  ÚDTyper�  r�  ÚNumberClassr‘  r’  ÚPyObjectÚObjectr“  r•  ÚExternalFunctionPointerr�  ÚDeferredTyper¡  r§  Ú
Dispatcherr¨  rª  r¬  ÚLiteralr®  ÚMemInfoPointerr°  r³  ÚTypeRefr´  ÚLiteralStrKeyDictrµ  ÚNumPyRandomBitGeneratorTyperÎ  rÐ  ÚNumPyRandomGeneratorTyperÔ  rÕ  r   r   r   r   Ú<module>   s&  













	











!





/
1
!&F
&
2;
%


















z

 