a
(`+ @ s d dl Z d dlZd dlZd dlZd dlZddlmZ ddlmZ ddlm Z e j
dkrhd dlZdd Z
nd dlZd d Z
e j
d
krejZnG dd dejZG d
d deZdZdd Zdadd Zdd ZdddZdd Zdd ZdS ) N )__version_verifier_modules__)ffiplatform)VerificationError) r c C s t jjd d S N) importlib machineryEXTENSION_SUFFIXES r r 3/usr/lib64/python3.9/site-packages/cffi/verifier.py_extension_suffixes s r
c C s dd t D S )Nc S s g | ]\}}}|t jkr|qS r )impC_EXTENSION).0suffix_typer r r
s
z'_extension_suffixes..)r Zget_suffixesr r r r r
s r c s e Zd Z fddZ ZS )NativeIOc s( t |tr|d}tt| | d S )Nascii)
isinstanceZunicodeencodesuperr write)selfs __class__r r r s
zNativeIO.write)__name__
__module____qualname__r
__classcell__r r r r r s r c @ sz e Zd ZdddZd ddZd d
Zdd Zd
d Zdd Zdd Z dd Z
dd Zdd Zd!ddZ
dd Zdd ZdS )"VerifierN F.cc K sv |j jrtd|j jf || _|| _|s4t|}t||}
|
| | _| j | | | _
| ||
| _|rz|rxt
dndtjd d t||g|j }tjdkr|d}tt|dd d d @ }|d
d}tt|dd d d @ }|d
d}d|| jj||f }t d }|p0t | _tj| j|| | _ tj| j|| | _!|| _"d| _#d| _$d S )NzKfeature not supported with ffi.verify(), but only with ffi.set_source(): %sz)can't specify both 'modulename' and 'tag' r r zutf-8r l 0xLr 0z_cffi_%s_%s%s%sF)%Z_parserZ_uses_new_featurer ffipreambler Zflatten_locate_engine_class_vengineZpatch_extension_kwdsflagsmake_relative_tokwds TypeErrorjoinsysversionr Z_cdefsourcesversion_infor hexbinasciicrc32lstriprstripZ
_class_key_get_so_suffixes_caller_dir_pycachetmpdirospathsourcefilenamemodulefilenameext_package_has_source_has_module)r r, r- r? Z
modulenamerD tagforce_generic_engineZsource_extensionr0 relative_tor2 Zflattened_kwdsZ
vengine_classkeyZk1Zk2r r r r __init__ sN
zVerifier.__init__c C sL | j j0 | jr |du r td| | W d n1 s>0 Y dS )zkWrite the C source code. It is produced in 'self.sourcefilename',
which can be tweaked beforehand.Nzsource code already written)r, _lockrE r
_write_sourcer filer r r write_sourceH s
zVerifier.write_sourcec C sP | j j4 | jrtd| js&| | W d n1 sB0 Y dS )zWrite the C source code (if not done already) and compile it.
This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r, rL rF r rE rM _compile_moduler r r r compile_moduleQ s
zVerifier.compile_modulec C s^ | j jB | js4| | js4| js,| | | W d S 1 sP0 Y dS )a" Get a C module from this Verifier instance.
Returns an instance of a FFILibrary class that behaves like the
objects returned by ffi.dlopen(), but that delegates all
operations to the C module. If necessary, the C code is written
and compiled first.
N)r, rL rF _locate_modulerE rM rQ
_load_libraryrR r r r load_library[ s
zVerifier.load_libraryc C sB t j| j}|ddd }|dr>ttdr>|d d }|S )N.r r Z_dZgettotalrefcount)r@ rA basenamerC splitendswithhasattrr5 )r rY r r r get_module_namek s
zVerifier.get_module_namec C sn t | jsD| jj | js&| W d n1 s:0 Y t | j}| }t j ||fi | j
S r )r Z_hack_at_distutilsrE r, rL rM Zmaybe_relative_pathrB r]
get_extensionr2 )r Z
sourcenamemodnamer r r r^ v s
&zVerifier.get_extensionc C s | j jS r )r/ Z_gen_python_modulerR r r r generates_python_module s z Verifier.generates_python_modulec sz |rvt j|rvt j| | }tjD ]J}||v r*|| }t|ttfsZt d|f fdd|D }|||<