509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
M •ZÇ+  ã               @   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é   c               C   s   t jjd d … S )N)Ú	importlibÚ	machineryÚEXTENSION_SUFFIXES© r
   r
   ú /usr/lib64/python3.6/verifier.pyÚ_extension_suffixes   s    r   c               C   s   dd„ t jƒ D ƒS )Nc             S   s    g | ]\}}}|t jkr|‘qS r
   )ÚimpZC_EXTENSION)Ú.0ÚsuffixÚ_Útyper
   r
   r   ú
<listcomp>   s    z'_extension_suffixes.<locals>.<listcomp>)r   Zget_suffixesr
   r
   r
   r   r      s    c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚNativeIOc                s(   t |tƒr|jdƒ}tt| ƒj|ƒ d S )NÚascii)Ú
isinstanceZ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j|ƒ}t||ƒ}|| ƒ| _| jj	|ƒ |	| _
| j||
ƒ| _|rz|rxtdƒ‚n¢djtjd d… t||g|j ƒ}tjdkr°|jdƒ}ttj|dd d… ƒd@ ƒ}|jd	ƒjd
ƒ}ttj|dd d… ƒd@ ƒ}|jdƒjd
ƒ}d|| jj||f }tƒ d }|�p0tƒ | _tjj| j|| ƒ| _ tj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   zutf-8r   é   l   ÿÿ Z0xÚLr   Ú0z_cffi_%s_%s%s%sF)r   )%Z_parserZ_uses_new_featurer   ÚffiÚpreambler   ZflattenÚ_locate_engine_classÚ_vengineZpatch_extension_kwdsÚflagsÚmake_relative_toÚkwdsÚ	TypeErrorÚjoinÚsysÚversionr   Z_cdefsourcesÚversion_infor   ÚhexÚbinasciiZ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(   r9   Z
modulenamer>   ÚtagÚforce_generic_engineZsource_extensionr+   Úrelative_tor-   Zflattened_kwdsZvengine_classÚkeyZk1Zk2r   r
   r
   r   Ú__init__    sD    









zVerifier.__init__c          	   C   s8   | j j�& | jr |dkr tdƒ‚| j|ƒ W d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'   Ú_lockr?   r   Ú_write_source)r   Úfiler
   r
   r   Úwrite_sourceH   s
    
zVerifier.write_sourcec          	   C   s<   | j j�* | jrtdƒ‚| js&| jƒ  | jƒ  W d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'   rF   r@   r   r?   rG   Ú_compile_module)r   r
   r
   r   Úcompile_moduleQ   s    
zVerifier.compile_modulec          	   C   sF   | j j�4 | js4| jƒ  | js4| js,| jƒ  | jƒ  | jƒ 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'   rF   r@   Ú_locate_moduler?   rG   rJ   Ú_load_library)r   r
   r
   r   Úload_library[   s    
zVerifier.load_libraryc             C   sB   t jj| jƒ}|jddƒd }|jdƒr>ttdƒr>|d d… }|S )NÚ.r   r   Z_dÚgettotalrefcountr$   éþÿÿÿ)r:   r;   Úbasenamer=   ÚsplitÚendswithÚhasattrr0   )r   rR   r
   r
   r   Úget_module_namek   s
    zVerifier.get_module_namec          
   C   sV   t jƒ  | js0| jj� | js&| jƒ  W d Q R X t j| jƒ}| jƒ }t j	||f| j
ŽS )N)r   Z_hack_at_distutilsr?   r'   rF   rG   Zmaybe_relative_pathr<   rV   Úget_extensionr-   )r   Z
sourcenameÚmodnamer
   r
   r   rW   v   s    
zVerifier.get_extensionc             C   s   | j jS )N)r*   Z_gen_python_module)r   r
   r
   r   Úgenerates_python_module€   s    z Verifier.generates_python_modulec                s~   |rzt jj|ƒrzt jj|ƒ‰ |jƒ }xTtjD ]J}||kr,|| }t|ttfƒs\t	d|f ƒ‚‡ fdd„|D ƒ}|||< q,W |S )Nz&keyword '%s' should be a list or tuplec                s   g | ]}t jjˆ |ƒ‘qS r
   )r:   r;   r/   )r   Úfn)Údirnamer
   r   r   �   s    z-Verifier.make_relative_to.<locals>.<listcomp>)
r:   r;   r[   Úcopyr   ZLIST_OF_FILE_NAMESr   ÚlistÚtupler.   )r   r-   rC   rD   Zlstr
   )r[   r   r,   ƒ   s    
zVerifier.make_relative_toc             C   sˆ   t jj| jƒst| jrHyt| jd d dgƒ}W n tk
r>   d S X |j}nd }| jj	| j
ƒ |tƒ ƒ}|d krnd S || _| jjƒ  d| _d S )NÚ__doc__T)r:   r;   Úisfiler=   r>   Ú
__import__ÚImportErrorÚ__path__r*   Úfind_modulerV   r7   Zcollect_typesr@   )r   Zpkgr;   Úfilenamer
   r
   r   rL   “   s    
zVerifier._locate_modulec          
   C   s$   || j _z| j jƒ  W d | j `X d S )N)r*   Z_fZwrite_source_to_f)r   rH   r
   r
   r   Ú_write_source_to¦   s    zVerifier._write_source_toc             C   s    |d k	r| j |ƒ nˆtƒ }| j |ƒ |jƒ }tjj| jƒrbt| jdƒ�}|jƒ |k }W d Q R X nd}|r–t	| jƒ t| jdƒ�}|j
|ƒ W d Q R X d| _d S )NÚrTÚw)rf   r   Úgetvaluer:   r;   Úexistsr<   ÚopenÚreadÚ_ensure_dirr   r?   )r   rH   ÚfZsource_dataÚfpZneeds_writtenr
   r
   r   rG   ­   s    

zVerifier._write_sourcec             C   sp   t jj| jƒ}tj|| jƒ ƒ}ytj|| jƒ}W n t	k
rH   d}Y nX |sft
| jƒ tj|| jƒ d| _d S )NFT)r:   r;   r[   r<   r   ÚcompilerW   Úsamefiler=   ÚOSErrorrm   ÚshutilZmover@   )r   r9   ZoutputfilenameZsamer
   r
   r   rJ   Æ   s    

zVerifier._compile_modulec             C   s0   | j s
t‚| jd k	r"| jj| jƒS | jjƒ S d S )N)r@   ÚAssertionErrorr+   r*   rN   )r   r
   r
   r   rM   Ó   s    

zVerifier._load_library)NNNr!   Fr"   NN)N)N)r   r   r   rE   rI   rK   rN   rV   rW   rY   r,   rL   rf   rG   rJ   rM   r
   r
   r
   r   r       s     
&
	


r    Fc             C   s|   t rd}|sPdtjkrd}n4y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_ENGINEr0   Úbuiltin_module_namesÚ_cffi_backendrb   Z_backendr!   rv   ZVGenericEnginerw   ZVCPythonEngine)r'   rB   rz   rv   rw   r
   r
   r   r)   Þ   s     


r)   c              C   sH   t rt S tjjdƒ} | r| S tjdƒjj}tjj	tjj
tjj|ƒdƒƒS )NZCFFI_TMPDIRr$   Ú__pycache__)Ú_TMPDIRr:   ÚenvironÚgetr0   Ú	_getframeÚf_codeÚco_filenamer;   Úabspathr/   r[   )Úresultre   r
   r
   r   r8   ö   s    r8   c             C   s   | a dS )z:Set the temporary directory to use instead of __pycache__.N)r|   )r[   r
   r
   r   Ú
set_tmpdir   s    r„   c             C   s0  | pt ƒ } ytj| ƒ}W n tk
r,   dS X |r8d}ntƒ d jƒ }xd|D ]\}|jƒ jdƒrL|jƒ j|ƒsz|jƒ jdƒrLytjtj	j
| |ƒƒ W qL tk
r¦   Y qLX qLW tj	j
| dƒg}xn|D ]f}yJxDtj|ƒD ]6}tj	j
||ƒ}tj	j|ƒ�r |j|ƒ qÔtj|ƒ qÔW W qÂ tk
�r&   Y qÂX qÂW dS )z}Clean up the temporary directory by removing all files in it
    called `_cffi_*.{c,so}` as well as the `build` subdirectory.Nz.cr   Z_cffi_Zbuild)r8   r:   Úlistdirrr   r7   ÚlowerÚ
startswithrT   Úunlinkr;   r/   ÚisdirÚappend)r9   Zkeep_soZfilelistr   rZ   Z	clean_dirÚdirr
   r
   r   Úcleanup_tmpdir  s2    



rŒ   c              C   s&   t ƒ } | s"tjdkrdg} ndg} | S )NZwin32z.pydz.so)r   r0   Úplatform)Úsuffixesr
   r
   r   r7   $  s    
r7   c             C   s,   t jj| ƒ}|r(t jj|ƒ r(t j|ƒ d S )N)r:   r;   r[   r‰   Úmakedirs)re   r[   r
   r
   r   rm   /  s    rm   )r   r   )r   )NF)r0   r:   r4   rs   Úior!   r   r   Úerrorr   r2   Zimportlib.machineryr   r   r   ÚStringIOr   ÚBytesIOÚobjectr    rx   r)   r|   r8   r„   rŒ   r7   rm   r
   r
   r
   r   Ú<module>   s*   (


 ?

