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 Zxdd Zyeejzdd Z{eej|dd Z}eej|dd Z~eejdd Zeejdd Zeejdd ZedZeejdd Zeejdd ZdS )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st|}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

 