o
    8ήc#m                     @   s  d Z ddl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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mZmZmZ ejd
kZ ejdkZ!ej"j#Z$e%ede$ Z&e%ede$ Z'ej"j(Z)ej"j*Z+e'ej"j,Z-ej.j/dkrdndZ0dZ1e1Z2ej3j4Z5ej"j6Z7ej"j8Z9ee:dd Z;edd Z<ee'e'ej=ej>ej>e'ej>dddd Z?edd Z@edd ZAee'e'e'e'e'e'ejBejBdddd  ZCeejDd!eejEd!d"d# ZFeejGd!d$d% ZHeejId!d&d' ZJe rSe'j/d( d)kr%e'd*ZKe'd+ZLe'd,ZMed-ejNidd.d/ ZOne'd0ZKe'd1ZLe'd2ZMed-ejNidd3d/ ZOdd4lPmQZQ ee'e'e'e'e'd5dd6d7 ZRnee'e&e'e&d8dd9d7 ZRed:d; ZSeejTd!d<d= ZUdd>lmVZVmWZWmXZXmYZYmZZZm[Z[ G d?d@ d@eZZ\G dAdB dBeZZ]G dCdD dDeZZ^G dEdF dFeZZ_G dGdH dHe[Z`edIdJdKgZadLdM Zbeb Zce9dNv r$e9dOkrdPZdeeed eejNejNdQddRdS ZfeejNejNejNejNejNejNdTddUdV ZgeejNejNejNejNdWddXdY ZheejNejNejNejNejNejNeiejNdZd[ejNejNejNejNd\dd]d^ Zjnd_e9 Zdekeded`da Zldbdc Zmeemddde Znedfe'iddgdh Zoeejpd!didj ZqdS )kz&
Hash implementations for Numba types
    N)
namedtuple)ir)overloadoverload_method	intrinsicregister_jitable)errors)typesutils)	grab_bytegrab_uint64_t)	const_intget_next_intget_next_int32get_state_ptr)      )r   
   zint%szuint%s       =   iCB c                 C      dd }|S )Nc                 S   s   |   S N)__hash__)obj r   </tmp/pip-target-vg8gfxp4/lib/python/numba/cpython/hashing.pyimpl2      zhash_overload.<locals>.implr   )r   r   r   r   r   hash_overload0      r   c                 C   s    t | }|tdkrtd}|S )N)
_Py_hash_tint)valasintr   r   r   process_return7   s   r'   )xymesign_PyHASH_MODULUS_PyHASH_BITS)localsc                 C   s
  t | st | r| dkrtS t S trt }t|S tS t	| \}}d}|dk r0d}| }d}|r^|d> t
@ |td ? B }|d9 }|d8 }t|}||8 }||7 }|t
kr\|t
8 }|s4|dkrg|t }n
td d| t  }||> t
@ |t| ? B }|| }t|S )Nr      r!      g      A)npisfiniteisinf_PyHASH_INF_py310_or_later_prng_random_hashr'   _PyHASH_NANmathfrexpr-   r.   r$   )vr(   r*   r+   r,   r)   r   r   r   _Py_HashDoubleF   s>   



r<   c                 C   s   dd }t t j}||fS )Nc                 S   s   |d }| |t S )Nr   )fpextr   
DoubleType)cgctxbuilder	signatureargsr%   r   r   r   r      s   z_fpext.<locals>.impl)r	   float64float32tyctxr%   r   sigr   r   r   _fpext~   s   rH   c                 C   s   dd }t  }||fS )Nc                 S   s@   t | |d}tt}tdkrt| ||}|S t| |||d}|S )Ninternalr   F)r   r   _hash_widthr   r   )r?   r@   rA   rB   	state_ptrbitsvaluer   r   r   r      s   	z_prng_random_hash.<locals>.implr#   )rF   r   rG   r   r   r   r7      s   r7   )r(   p1p2p3p4r-   r.   _PyLong_SHIFTc           
      C   s   dt  }td |? }dt  d }d}tt  }t|d ddD ]'}|t > }|t@ }||? }	||	B }|t| |t  ? |@ 7 }|tkrG|t8 }q t|S )Nr   r   @   r0   r!   )rS   r	   uint32r.   ranger-   r#   )
r%   
_tmp_shift
mask_shiftir(   rQ   idxrO   rP   rR   r   r   r   
_long_impl   s   r[   r   c                    sH   t jdkrdndtdt| ddrtjntj  fdd}|S )	Nl        r"   l         signedFc                    s    | } t | }|tk r*| dkrd}t|S | kr"t}t|S t| }t|S d}| dk r5|  } d}t| }|r>| }t|S )Nr   FT)absr-   r#   r[   r'   )r%   magretneeds_negate_BIG_HASH_I64_MIN_SIGNED_MINr   r   r      s&   
	zint_hash.<locals>.impl)sysmaxsizer	   int64getattruint64r%   r   r   rb   r   int_hash   s
   
rl   c                 C   s"   | j dkrdd }|S dd }|S )NrT   c                 S   s   t | }|S r   )r<   r%   hashedr   r   r   r      s   zfloat_hash.<locals>.implc                 S   s   t t| }t|}|S r   )r2   rC   rH   r<   )r%   
fpextendedrn   r   r   r   r     s   )bitwidthrk   r   r   r   
float_hash   s
   
	rq   c                 C   r   )Nc                 S   s(   t | j}t | j}|t|  }t|S r   )hashrealimag_PyHASH_IMAGr'   )r%   hashrealhashimagcombinedr   r   r   r     s   

zcomplex_hash.<locals>.implr   rk   r   r   r   complex_hash  s   
ry   r      l   Jfq	 l   OkO8 l   g,,> r(   c                 C      | t d> | t d? B S )Nr   !   r	   rj   r(   r   r   r   _PyHASH_XXROTATE'     r   l   yn< l   wJ igVc                 C   r{   )N      r}   r~   r   r   r   r   0  r   )literal_unroll)acclane_PyHASH_XXPRIME_5_PyHASH_XXPRIME_1tlc                 C   s   t | }t}t| D ]}t|}|tdkr dS ||t 7 }t|}|t9 }q
||ttdA A 7 }|tdkr<tdS t|S )Nr!   is5 iK*\)	lenr   r   rr   _Py_uhash_t_PyHASH_XXPRIME_2r   r   r'   )tupr   r   r(   r   r   r   r   _tuple_hash9  s   
r   )r(   r)   multlc                 C   sz   t | }t}td}tt|d ddD ]\}}t| | }||A }|| }|ttd| | 7 }q|td7 }t|S )NxV4 r0   r!   XB | )r   _PyHASH_MULTIPLIERr   	enumeraterV   rr   r#   r'   )r   r   r   r(   rY   r   r)   xxoryr   r   r   r   Q  s   c                    s    fdd}t |}||fS )Nc                    s  | j }|t}|j\}|\}| |j}t|d}	t|t}
t|d}t	|}t
t|jt|d ddD ]F\}}|\}}| |fi }| ||}|||}|||f}||	|}|||
}	t||}||
|}
||
|}
||
|}
q9||	t|d}	|	S )Nr   r   r0   r!   r   )typing_contextresolve_value_typerr   rB   get_value_typereturn_typer   Constantr   r   r   zipr	   rV   get_call_typeget_functionextract_valuexormuladd)r?   r@   rA   rB   	typingctxfntytuptyr   ltyr(   r   shiftr   rY   packedtyr   rG   r   	tuple_valr)   r   lconstrF   r   r   r   n  s.   
$z!_tuple_hash_resolve.<locals>.implrN   rE   r   r   r   _tuple_hash_resolvel  s   r   c                 C   s(   t st| tjrdd }|S dd }|S )Nc                 S      t | S r   )r   )r%   r   r   r   r     r   ztuple_hash.<locals>.implc                 S   s   t t| }t|S r   )r#   r   r'   rm   r   r   r   r     s   )_py38_or_later
isinstancer	   Sequencerk   r   r   r   
tuple_hash  s
   r   )c_size_tc_ubytec_uint64	pythonapi	StructureUnionc                   @      e Zd ZdefdefgZdS )FNVprefixsuffixN)__name__
__module____qualname__r   _fields_r   r   r   r   r         r   c                   @   r   )SIPHASHk0k1N)r   r   r   r   r   r   r   r   r   r     r   r   c                   @       e Zd Zded fdefgZdS )DJBX33Apadding   r   Nr   r   r   r   r   r   r   r   r   r   r         
r   c                   @   r   )EXPATr   r   hashsaltNr   r   r   r   r   r     r   r   c                   @   s2   e Zd Zded fdefdefdefdefgZdS )_Py_HashSecret_tuc   fnvsiphashdjbx33aexpatN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    
r   _hashsecret_entrysymbolrM   c                     sJ   t td} i   fdd}|d| jj |d| jj |d| jj  S )zRead hash secret from the Python process

    Returns
    -------
    info : dict
        - keys are "djbx33a_suffix", "siphash_k0", siphash_k1".
        - values are the namedtuple[symbol:str, value:int]
    _Py_HashSecretc                    s>   d | }t|}t|}t|| t||d | < d S )Nz_numba_hashsecret_{})r   rM   )formatctypesr   	addressofll
add_symbolr   )namer%   symbol_nameaddrinfor   r   inject  s
   


z!_build_hashsecret.<locals>.injectdjbx33a_suffix
siphash_k0
siphash_k1)r   in_dllr   r   r   r   r   r   )pyhashsecretr   r   r   r   _build_hashsecret  s   r   )	siphash24r   r   a  FNV hashing is not implemented in Numba. See PEP 456 https://www.python.org/dev/peps/pep-0456/ for rationale over not using FNV. Numba will continue to work, but hashes for built in types will be computed using siphash24. This will permit e.g. dictionaries to continue to behave as expected, however anything relying on the value of the hash opposed to hash as a derived property is likely to not work as expected.r(   bc                 C   s    t | |> | t d| ? B S )NrT   r}   r   r   r   r   _ROTATE6  s    r   ar   cdstc                 C   sB   | |7 } ||7 }t ||| A }t |||A }t | d} | |||fS )Nr   )r   r   r   r   r   _HALF_ROUND;  s   
r   v0v1v2v3c                 C   st   t | |||dd\} }}}t ||| |dd\}}} }t | |||dd\} }}}t ||| |dd\}}} }| |||fS )Nr   r         )r   r   r   r   r   _DOUBLE_ROUNDI  s
   r   r0   C)r   r   r   r   r   mitmpr   maskjmpohexefefc                 C   s  t |d> }| t dA }|t dA }| t dA }|t dA }d}	|dkrMt||	}
|	d7 }	|d8 }||
N }t||||\}}}}||
N }|dks)t d}|	d }t d	}|d
kryd}t ||>  }||@ t t||d |> B }|dkrd}t ||>  }||@ t t||d |> B }|dkrd}t ||>  }||@ t t||d |> B }|dkr|t dM }tdD ]}|d }t ||>  }||@ t t||| |> B }q|dkrd}t ||>  }||@ t t||d |> B }|dkr!d}t ||>  }||@ t t||d |> B }|dkr7| }||@ t t||d B }||O }||N }t||||\}}}}||N }||N }t||||\}}}}t||||\}}}}||A ||A A }|S )N8   l   ue`5{ l   mo\I{# l   ar\c l   ser+# r   r   r0         0      (      r   rz   l        r   r      )r	   rj   r   r   r   rV   )r   r   srcsrc_szr   r   r   r   r   rZ   r   r   boffsetr   r   r   rY   r   r   r   
_siphash24T  s   






r  z'Unsupported hashing algorithm in use %sc                    sD   t |tjstdt|j j tj}||} fdd}||fS )z&Emit code to load the hashsecret.
    zrequires literal stringc                    sL   |j }z| }W n ty   tj|td d}Y nw ||}|S )NrT   r   )module
get_globalKeyErrorr   GlobalVariableIntTypeload)r?   r@   rG   rB   modgvr;   symr   r   r     s   
z%_inject_hashsecret_read.<locals>.impl)	r   r	   StringLiteralr   TypingError_hashsecretliteral_valuer   rj   )rF   r   restyrG   r   r   r  r   _inject_hashsecret_read  s   
r  c                 C   s
   t |  jS r   )r  rM   r  r   r   r   _load_hashsecret  s   
r  c                 C   r   )Nc                 S   r   r   )r  r  r   r   r   imp  r   z"_impl_load_hashsecret.<locals>.impr   )r   r  r   r   r   _impl_load_hashsecret  r    r  _hashc                 C   s   |dkrt dS |tk r3td}t|D ]}|d> | tt| | }q||N }|tdN }t |S tt	
tdt	
td| |}t |}t |S )Nr   i  r  r   r   r   )r'   _Py_HASH_CUTOFFr   rV   r2   uint8r   r  r  r	   rj   )r%   _lenr   rZ   r   r   r   r   _Py_HashBytes  s   r$  c                    s   ddl m   fdd}|S )Nr   _kind_to_byte_widthc                    s4    | j }t| }| j}|dkr|S t| j|| S )Nr!   )_kindr   r   r$  _data)r%   	kindwidthr#  current_hashr%  r   r   r     s   
zunicode_hash.<locals>.impl)numba.cpython.unicoder&  rk   r   r%  r   unicode_hash  s   r,  )r__doc__r9   numpyr2   rf   r   warningscollectionsr   llvmlite.bindingbindingr   llvmliter   numba.core.extendingr   r   r   r   
numba.corer   r	   r
   numba.core.unsafe.bytesr   r   numba.cpython.randomimplr   r   r   r   	PYVERSIONr   r6   	hash_infowidthrJ   ri   r#   r   infr5   nanr8   modulusr-   intprp   r.   r   ru   int_infobits_per_digitrS   cutoffr!  	algorithm_Py_hashfunc_namerr   r   r'   doubleintcr<   rH   r7   int32r[   IntegerBooleanrl   Floatrq   Complexry   r   r   r   rj   r   numbar   r   r   	BaseTupler   r   r   r   r   r   r   r   r   r   r   r   r   r   r  msgwarnr   r   r   Arrayr  
ValueErrorr  r  r  r$  UnicodeTyper,  r   r   r   r   <module>   s$   




1





,







 



*


C




