o
    i'                     @  s   d dl mZ d dlZd dlZd dl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dkZeejdkZe  dv Zd!d
dZd"ddZg dZg dZg dZdZdZdZdZG dd dejZG dd dZ d#ddZ!d$dd Z"dS )%    )annotationsN)	CFUNCTYPEPOINTERc_longc_size_tc_uint32c_ulongc_void_p)ClassVarnt   >   amd64x64x86_64x86Zi368zi686-64i686returnstrc                  C  s   dd l m}  | jS Nr   )Zpolars._plrZ_plrZRUNTIME_REPR)Zplr r   H/home/app/Keep/.python/lib/python3.10/site-packages/polars/_cpu_check.pyget_runtime_repr5   s   r   ctypes.CDLLc                  C  sb   zt  jdkrtjdddW S tjdddW S  ty0   ddlm}  tj| ddd Y S w )	NDarwinz
libc.dylibT)Z	use_errnoz	libc.so.6r   )utilc)osunamesysnamectypesCDLL	Exceptionr   Zfind_library)Zctutilr   r   r   _open_posix_libc;   s   r"   )S         r$            r$      r$   _      r$   O   r   r$   W      [      )r#   r$      I   r$      D   r$      r'   r(   A   r$      r6   r$   Y   r+   r6   r$   r2   r   r6   r$   Q   r.   r/   r0   )r#   r-      |   $   r.   r:   r4   r<      r:   L   r<      r'   r(   r$   r)   r$   r*   r+   r$   r,   r   r$   r-   r.   r*   r/   r0          i   @   c                   @  s$   e Zd ZU dd dD Zded< dS )CPUID_structc                 C  s   g | ]}|t fqS r   )r   ).0rr   r   r   
<listcomp>   s    zCPUID_struct.<listcomp>)eaxebxecxZedxz ClassVar[list[tuple[str, type]]]_fields_N)__name__
__module____qualname__rJ   __annotations__r   r   r   r   rC      s   
 rC   c                   @  s,   e Zd ZdddZddd
dZdddZdS )CPUIDr   Nonec           	      C  sj  t rtrtd| _t}ntjj| _t}ntrt	nt}t
|}tj| | }t rXt| jj_tjtjtjtjg| jj_| jd |ttB t| _| jsOd}t|t| j|| nLdd l}t }|j}tjtjtjf|_tj|_|d||j|jB |j|jB | _t tj!| j| _| j"| || j||j|j#B dkrd}t$|t%d t&t't(t(}|| j| _)d S )Nzkernel32.dllz)could not allocate memory for CPUID checkr   z*could not execute mprotect for CPUID check)*_IS_WINDOWS	_IS_64BITr   r    win_WINDOWS_64_OPCZwindllZkernel32_CDECL_32_OPC_POSIX_64_OPClenZc_ubyter	   ZVirtualAllocrestyper   r   argtypes_MEM_COMMIT_MEM_RESERVE_PAGE_EXECUTE_READWRITEaddrMemoryErrorZmemmovemmapr"   mprotectc_intMAP_PRIVATEMAP_ANONYMOUS	PROT_READ
PROT_WRITEZ	addressofZfrom_bufferwrite	PROT_EXECRuntimeErrorr   r   rC   r   func_ptr)	selfZopcsizecodemsgr`   libcra   	func_typer   r   r   __init__   sR   




zCPUID.__init__r   rG   intrI   rC   c                 C  s   t  }| ||| |S )N)rC   rj   )rk   rG   rI   structr   r   r   __call__   s   zCPUID.__call__c                 C  s8   t rt| jj_tttg| jj_| j| j	dt
 d S d S r   )rR   r   rT   ZVirtualFreerY   r	   r   r   rZ   r^   _MEM_RELEASE)rk   r   r   r   __del__   s
   
zCPUID.__del__N)r   rP   )r   )rG   rr   rI   rr   r   rC   )rK   rL   rM   rq   rt   rv   r   r   r   r   rO      s    
=rO   dict[str, bool]c                  C  s   t si S t } | dd}| dd}| dd}t|jd@ t|jd@ t|jd@ t|jd@ t|jd@ t|jd	@ t|jd
@ t|jd@ t|jd@ t|jd@ t|jd@ t|jd@ t|jd@ t|jd@ dS )Nr7   r   r)   l       i   r@   rA   i   i   i  @ i      i   r          )Zsse3Zssse3fmaZ
cmpxchg16bzsse4.1zsse4.2ZmovbeZpopcntZ	pclmulqdqZavxZbmi1Zbmi2Zavx2Zlzcnt)_SUPPORTS_CPUIDrO   boolrI   rH   )ZcpuidZcpuid1Zcpuid7Zcpuid81hr   r   r   _read_cpu_flags   s*   


r~   feature_flagsrP   c                 C  s   dd |  dD }dd |D }|rtjdrd S t }g }|D ]}||vr1d|}t||| s:|| q"|rRdd l}|jdd		| d
t
dd d S d S )Nc                 S  s    g | ]}| d s|dqS )-+)
startswithlstriprD   fr   r   r   rF      s
    
z#check_cpu_flags.<locals>.<listcomp>,c                 S  s   g | ]
}|r|d kr|qS )z
ctr-staticr   r   r   r   r   rF      s    ZPOLARS_SKIP_CPU_CHECKzunknown feature flag: r   z[Missing required CPU features.

The following required CPU features were not detected:
    z, a  
Continuing to use this version of Polars on this processor will likely result in a crash.
Install `polars[rtcompat]` instead of `polars` to run Polars with better compatibility.

Hint: If you are on an Apple ARM machine (e.g. M1) this is likely due to running Python under Rosetta.
It is recommended to install a native version of Python that does not run under Rosetta x86-64 emulation.

If you believe this warning to be a false positive, you can set the `POLARS_SKIP_CPU_CHECK` environment variable to bypass this check.
r7   )
stacklevel)splitr   environgetr~   ri   appendwarningswarnjoinRuntimeWarning)r   Zexpected_cpu_flagsZsupported_cpu_flagsZmissing_featuresr   rn   r   r   r   r   check_cpu_flags   s6   


r   )r   r   )r   r   )r   rw   )r   r   r   rP   )#
__future__r   r   r   platformr   r   r   r   r   r   r	   typingr
   namerR   ZsizeofrS   machinelowerr|   r   r"   rW   rU   rV   r[   r\   ru   r]   Z	StructurerC   rO   r~   r   r   r   r   r   <module>   s.   $



J