
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    Ù„=^Ç+  ã                   @   sê   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	 e j
dkrhd dlZdd„ Znd dlZd	d„ Ze j
d
krŠejZnG dd„ dejƒZG dd„ deƒZdZdd„ Zdadd„ Zdd„ Zddd„Zdd„ Zdd„ ZdS )é    Né   )Ú__version_verifier_modules__)Úffiplatform)ÚVerificationError)é   r   c                   C   s   t jjd d … S ©N)Ú	importlibÚ	machineryÚEXTENSION_SUFFIXES© r   r   ú@/opt/alt/python38/lib64/python3.8/site-packages/cffi/verifier.pyÚ_extension_suffixes   s    r   c                   C   s   dd„ t  ¡ D ƒS )Nc                 S   s    g | ]\}}}|t jkr|‘qS r   )ÚimpÚC_EXTENSION)Ú.0ÚsuffixÚ_Útyper   r   r   Ú
<listcomp>   s    
ÿz'_extension_suffixes.<locals>.<listcomp>)r   Zget_suffixesr   r   r   r   r      s    ©r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚNativeIOc                    s(   t |tƒr| d¡}tt| ƒ |¡ d S )NÚascii)Ú
isinstanceÚunicodeÚencodeÚsuperr   Úwrite)ÚselfÚs©Ú	__class__r   r   r      s    

zNativeIO.write)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r   r   r   r   r      s   r   c                   @   sz   e Zd Zddd„Zd dd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zd!dd„Zdd„ Zdd„ ZdS )"ÚVerifierNÚ Fú.cc                 K   sv  |j jrtd|j jf ƒ‚|| _|| _|s4t |¡}t||ƒ}|| ƒ| _| j 	|¡ |	| _
|  ||
¡| _|rz|rxtdƒ‚n¢d tjd d… t||g|j ¡}tjdkr°| d¡}tt |dd d… ¡d	@ ƒ}| d
¡ d¡}tt |dd d… ¡d	@ ƒ}| d¡ d¡}d|| jj||f }tƒ d }|�p0tƒ | _tj | j|| ¡| _ tj | 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   zutf-8r   é   l   ÿÿ Ú0xÚLr   Ú0z_cffi_%s_%s%s%sF)%Ú_parserZ_uses_new_featurer   ÚffiÚpreambler   ÚflattenÚ_locate_engine_classÚ_vengineZpatch_extension_kwdsÚflagsÚmake_relative_toÚkwdsÚ	TypeErrorÚjoinÚsysÚversionr   Z_cdefsourcesÚversion_infor   ÚhexÚbinasciiÚcrc32ÚlstripÚrstripZ
_class_keyÚ_get_so_suffixesÚ_caller_dir_pycacheÚtmpdirÚosÚpathÚsourcefilenameÚmodulefilenameÚext_packageÚ_has_sourceÚ_has_module)r   r.   r/   rB   Z
modulenamerG   ÚtagÚforce_generic_engineZsource_extensionr3   Úrelative_tor5   Zflattened_kwdsZvengine_classÚkeyZk1Zk2r   r   r   r   Ú__init__    sR    ÿÿ



 ÿþ


 ÿ
zVerifier.__init__c              	   C   s8   | j j�& | jr |dkr tdƒ‚|  |¡ W 5 Q R X dS )zkWrite the C source code.  It is produced in 'self.sourcefilename',
        which can be tweaked beforehand.Nzsource code already written)r.   Ú_lockrH   r   Ú_write_source©r   Úfiler   r   r   Úwrite_sourceH   s    
ÿzVerifier.write_sourcec              	   C   s<   | j j�* | jrtdƒ‚| js&|  ¡  |  ¡  W 5 Q R X dS )z„Write the C source code (if not done already) and compile it.
        This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r.   rO   rI   r   rH   rP   Ú_compile_module©r   r   r   r   Úcompile_moduleQ   s    
zVerifier.compile_modulec              
   C   sR   | j j�@ | js4|  ¡  | js4| js,|  ¡  |  ¡  |  ¡ W  5 Q R £ S Q R X dS )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.   rO   rI   Ú_locate_modulerH   rP   rT   Ú_load_libraryrU   r   r   r   Úload_library[   s    
zVerifier.load_libraryc                 C   sB   t j | j¡}| dd¡d }| d¡r>ttdƒr>|d d… }|S )NÚ.r   r   Z_dÚgettotalrefcountéþÿÿÿ)rC   rD   ÚbasenamerF   ÚsplitÚendswithÚhasattrr8   )r   r]   r   r   r   Úget_module_namek   s
    zVerifier.get_module_namec              	   C   sV   t  ¡  | js0| jj� | js&|  ¡  W 5 Q R X t  | j¡}|  ¡ }t j	||f| j
ŽS r   )r   Z_hack_at_distutilsrH   r.   rO   rP   Zmaybe_relative_pathrE   ra   Úget_extensionr5   )r   Z
sourcenameÚmodnamer   r   r   rb   v   s    
zVerifier.get_extensionc                 C   s   | j jS r   )r2   Z_gen_python_modulerU   r   r   r   Úgenerates_python_module€   s    z Verifier.generates_python_modulec                    sz   |rvt j |¡rvt j |¡‰ | ¡ }tjD ]J}||kr*|| }t|ttfƒsZt	d|f ƒ‚‡ fdd„|D ƒ}|||< q*|S )Nz&keyword '%s' should be a list or tuplec                    s   g | ]}t j ˆ |¡‘qS r   )rC   rD   r7   )r   Úfn©Údirnamer   r   r   �   s     z-Verifier.make_relative_to.<locals>.<listcomp>)
rC   rD   rg   Úcopyr   ZLIST_OF_FILE_NAMESr   ÚlistÚtupler6   )r   r5   rL   rM   Úlstr   rf   r   r4   ƒ   s    
ÿ
zVerifier.make_relative_toc                 C   sŠ   t j | j¡sv| jrJzt| jd d dgƒ}W n tk
r@   Y d S X |j}nd }| j 	|  
¡ |tƒ ¡}|d krpd S || _| j ¡  d| _d S )NÚ__doc__T)rC   rD   ÚisfilerF   rG   Ú
__import__ÚImportErrorÚ__path__r2   Úfind_modulera   r@   Zcollect_typesrI   )r   ÚpkgrD   Úfilenamer   r   r   rW   “   s     ÿ
zVerifier._locate_modulec                 C   s$   || j _z| j  ¡  W 5 | j `X d S r   )r2   Z_fZwrite_source_to_frQ   r   r   r   Ú_write_source_to¦   s    zVerifier._write_source_toc              	   C   s    |d k	r|   |¡ nˆtƒ }|   |¡ | ¡ }tj | j¡rbt| jdƒ�}| ¡ |k }W 5 Q R X nd}|r–t	| jƒ t| jdƒ�}| 
|¡ W 5 Q R X d| _d S )NÚrTÚw)rt   r   ÚgetvaluerC   rD   ÚexistsrE   ÚopenÚreadÚ_ensure_dirr   rH   )r   rR   ÚfZsource_dataÚfpZneeds_writtenr   r   r   rP   ­   s    

zVerifier._write_sourcec                 C   sp   t j | j¡}t ||  ¡ ¡}zt || j¡}W n t	k
rH   d}Y nX |sft
| jƒ t || j¡ d| _d S )NFT)rC   rD   rg   rE   r   Úcompilerb   ÚsamefilerF   ÚOSErrorr{   ÚshutilÚmoverI   )r   rB   ZoutputfilenameZsamer   r   r   rT   Æ   s    

zVerifier._compile_modulec                 C   s0   | j s
t‚| jd k	r"| j | j¡S | j ¡ S d S r   )rI   ÚAssertionErrorr3   r2   rY   rU   r   r   r   rX   Ó   s    

zVerifier._load_library)NNNr&   Fr'   NN)N)N)r!   r"   r#   rN   rS   rV   rY   ra   rb   rd   r4   rW   rt   rP   rT   rX   r   r   r   r   r%      s(              þ
(
	


r%   Fc                 C   s|   t rd}|sPdtjkrd}n4zdd l}W n tk
r@   d}Y nX | j|k	rPd}|rfddlm} |jS ddlm	} |j
S d S )NTZ__pypy__r   ú?r   )Úvengine_gen)Úvengine_cpy)Ú_FORCE_GENERIC_ENGINEr8   Úbuiltin_module_namesÚ_cffi_backendro   Z_backendr&   r…   ZVGenericEnginer†   ZVCPythonEngine)r.   rK   r‰   r…   r†   r   r   r   r1   Þ   s     


r1   c                  C   sH   t rt S tj d¡} | r| S t d¡jj}tj 	tj 
tj |¡d¡¡S )NZCFFI_TMPDIRr)   Ú__pycache__)Ú_TMPDIRrC   ÚenvironÚgetr8   Ú	_getframeÚf_codeÚco_filenamerD   Úabspathr7   rg   )Úresultrs   r   r   r   rA   ö   s    ÿrA   c                 C   s   | a dS )z:Set the temporary directory to use instead of __pycache__.N)r‹   rf   r   r   r   Ú
set_tmpdir   s    r“   c              	   C   s$  | pt ƒ } zt | ¡}W n tk
r.   Y dS X |r:d}ntƒ d  ¡ }|D ]\}| ¡  d¡rL| ¡  |¡sz| ¡  d¡rLzt tj	 
| |¡¡ W qL tk
r¦   Y qLX qLtj	 
| d¡g}|D ]`}zDt |¡D ]4}tj	 
||¡}tj	 |¡rø| |¡ qÎt |¡ qÎW q¾ tk
�r   Y q¾X q¾dS )z}Clean up the temporary directory by removing all files in it
    called `_cffi_*.{c,so}` as well as the `build` subdirectory.Nr'   r   Z_cffi_Úbuild)rA   rC   Úlistdirr€   r@   ÚlowerÚ
startswithr_   ÚunlinkrD   r7   ÚisdirÚappend)rB   Zkeep_soÚfilelistr   re   Z	clean_dirÚdirr   r   r   Úcleanup_tmpdir  s8    
ÿÿr�   c                  C   s&   t ƒ } | s"tjdkrdg} ndg} | S )NÚwin32z.pydz.so)r   r8   Úplatform)Úsuffixesr   r   r   r@   $  s    
r@   c                 C   s*   t j | ¡}|r&t j |¡s&t  |¡ d S r   )rC   rD   rg   r™   Úmakedirs)rs   rg   r   r   r   r{   /  s    r{   )NF)r8   rC   r<   r�   Úior&   r   r   Úerrorr   r:   Zimportlib.machineryr   r   r   ÚStringIOr   ÚBytesIOÚobjectr%   r‡   r1   r‹   rA   r“   r�   r@   r{   r   r   r   r   Ú<module>   s*   (


 ?

