
    i'                    ~   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j                   ej                        dk(  Z ej$                         j'                         dv ZddZdd	Zg d
Zg dZg dZdZdZdZdZ G d dej<                        Z G d d      Z ddZ!ddZ"y)    )annotationsN)	CFUNCTYPEPOINTERc_longc_size_tc_uint32c_ulongc_void_p)ClassVarnt   >   i686-64x64x86i368i686amd64x86_64c                 &    dd l m}  | j                  S Nr   )polars._plr_plrRUNTIME_REPR)plrs    J/home/work/apex_v16/venv/lib/python3.12/site-packages/polars/_cpu_check.pyget_runtime_reprr   5   s        c                    	 t        j                         j                  dk(  rt        j                  dd      S t        j                  dd      S # t
        $ r/ ddlm}  t        j                  | j                  d      d      cY S w xY w)	NDarwinz
libc.dylibT)	use_errnoz	libc.so.6r   )utilc)osunamesysnamectypesCDLL	Exceptionr!   find_library)ctutils    r   _open_posix_libcr+   ;   sn    E88:);;|t<<;;{d;; E){{6..s3tDDEs   7A A 5B	B	)S         r-            r-      r-   _      r-   O   r   r-   W      [      )r,   r-      I   r-      D   r-      r0   r1   A   r-      r?   r-   Y   r4   r?   r-   r;   r   r?   r-   Q   r7   r8   r9   )r,   r6      |   $   r7   rC   r=   rE      rC   L   rE      r0   r1   r-   r2   r-   r3   r4   r-   r5   r   r-   r6   r7   r3   r8   r9          i   @   c                  Z    e Zd ZU dD  cg c]
  }|t        f c}}} Zded<   yc c}}} w )CPUID_struct)eaxebxecxedxz ClassVar[list[tuple[str, type]]]_fields_N)__name__
__module____qualname__r   rR   __annotations__).0rr   s   000r   rM   rM      s-    ;2 2H2H.  2s   &rM   c                  &    e Zd ZddZdddZddZy)CPUIDc                   t         rMt        r!t        j                  d      | _        t
        }n8t        j                  j                  | _        t        }nt        rt        nt        }t        |      }t        j                  |z  | }t         rt        | j                  j                  _        t        j                  t        j                  t        j                   t        j                   g| j                  j                  _        | j                  j                  d |t$        t&        z  t(              | _        | j*                  sd}t-        |      t        j.                  | j*                  ||       nAdd l}t3               }|j4                  }t        j                  t        j                  t        j6                  f|_        t        j6                  |_        |j1                  d||j8                  |j:                  z  |j<                  |j>                  z        | _        t        j@                  t        j                  jC                  | j0                              | _        | j0                  jE                  |        || j*                  ||j<                  |jF                  z        dk7  rd}tI        |      tK        d tM        tN              tP        tP              } || j*                        | _)        y )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_OPCwindllkernel32_CDECL_32_OPC_POSIX_64_OPClenc_ubyter
   VirtualAllocrestyper   r	   argtypes_MEM_COMMIT_MEM_RESERVE_PAGE_EXECUTE_READWRITEaddrMemoryErrormemmovemmapr+   mprotectc_intMAP_PRIVATEMAP_ANONYMOUS	PROT_READ
PROT_WRITE	addressoffrom_bufferwrite	PROT_EXECRuntimeErrorr   r   rM   r   func_ptr)	selfopcsizecodemsgrp   libcrq   	func_types	            r   __init__zCPUID.__init__   s    ";;~6%
 "==11##,--C3x%,,4DHH!!)	.DHH!!* --dK,68ODI 99A!#&&NN499dD1 $%D}}H!'&//6<< PH%||H		  4#5#550	DI (()D)DTYY)OPDIIIOOD!		4$..)HIQNB"3''dGL$98XN	!$)),r   c                @    t               }| j                  |||       |S )N)rM   r|   )r}   rN   rP   structs       r   __call__zCPUID.__call__   s    fc3'r   c                    t         rut        | j                  j                  _        t
        t        t        g| j                  j                  _        | j                  j                  | j                  dt               y y r   )r]   r   r_   VirtualFreerh   r
   r   r	   ri   rm   _MEM_RELEASE)r}   s    r   __del__zCPUID.__del__   sO    +1DHH  (-5x,IDHH  )HH  A|< r   N)returnNone)r   )rN   intrP   r   r   rM   )rS   rT   rU   r   r   r    r   r   rZ   rZ      s    ;-z
=r   rZ   c                    t         si S t               }  | dd      } | dd      } | dd      }t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  d	z        t        |j                  d
z        t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  dz        t        |j                  dz        dS )Nr@   r   r2   l       i   rI   rJ   i   i   i  @ i      i   r          )sse3ssse3fma
cmpxchg16bzsse4.1zsse4.2movbepopcnt	pclmulqdqavxbmi1bmi2avx2lzcnt)_SUPPORTS_CPUIDrZ   boolrP   rO   )cpuidcpuid1cpuid7cpuid81hs       r   _read_cpu_flagsr      s/   	 GE1a[F1a[FZ#H VZZ6*+fjjF+,FJJ'*+6::12vzzW-.vzzW-.fjjG,-vzzW-.&**/0FJJ'*+VZZ6*+VZZ6*+VZZ6*+hllf-. r   c                   | j                  d      D cg c]%  }|j                  d      r|j                  d      ' }}|D cg c]  }|r|dk7  r| }}|rt        j                  j                  d      ry t               }g }|D ]-  }||vrd|}t        |      ||   r|j                  |       / |r0dd l	}|j                  dd	j                  |       d
t        d       y y c c}w c c}w )N,-+z
ctr-static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.
r@   )
stacklevel)split
startswithlstripr#   environgetr   r{   appendwarningswarnjoinRuntimeWarning)feature_flagsfexpected_cpu_flagssupported_cpu_flagsmissing_featuresr   r   s          r   check_cpu_flagsr      s"   ,2237q||C?P 
 $l" 	
  0G!H)+ '''*1%0Cs##"1%##A&'  
YY ! "  	 	
 /s   C)C)C.)r   str)r   zctypes.CDLL)r   zdict[str, bool])r   r   r   r   )#
__future__r   r&   r#   platformr   r   r   r   r   r	   r
   typingr   namer]   sizeofr^   machinelowerr   r   r+   rd   r`   rc   rj   rk   r   rl   	StructurerM   rZ   r   r   r   r   r   <module>r      s   0 #  	  T T T  ggoFMM&//*a/	"(""$**, 1 
E4$  6## G= G=T8*
r   