B
    1‹dõ+  ã               @   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
   úZ/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/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   sz  |j jrtd|j jf ƒ‚|| _|| _|s4t |¡}t||ƒ}|| ƒ| _| j 	|¡ |	| _
|  ||
¡| _|rz|rxtdƒ‚n¦d 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 }|p4tƒ | _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'ú z%d.%dé   )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Úversion_infor   Z_cdefsourcesr   Ú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,   r>   Ú
modulenamerC   ÚtagÚforce_generic_engineZsource_extensionr0   Úrelative_tor2   Zflattened_kwdsZvengine_classÚkeyZk1Zk2r   r
   r
   r   Ú__init__    sF    









zVerifier.__init__c          	   C   s8   | j j& | jr |dkr tdƒ‚|  |¡ 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+   Ú_lockrD   r   Ú_write_source)r   Úfiler
   r
   r   Úwrite_sourceI   s
    
zVerifier.write_sourcec          	   C   s<   | j j* | jrtdƒ‚| js&|  ¡  |  ¡  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+   rL   rE   r   rD   rM   Ú_compile_module)r   r
   r
   r   Úcompile_moduleR   s    
zVerifier.compile_modulec          	   C   sF   | j j4 | js4|  ¡  | js4| js,|  ¡  |  ¡  |  ¡ 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+   rL   rE   Ú_locate_modulerD   rM   rP   Ú_load_library)r   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éþÿÿÿ)r?   r@   ÚbasenamerB   ÚsplitÚendswithÚhasattrr5   )r   rX   r
   r
   r   Úget_module_namel   s
    zVerifier.get_module_namec          	   C   sV   t  ¡  | js0| jj | js&|  ¡  W d Q R X t  | j¡}|  ¡ }t j	||f| j
ŽS )N)r   Z_hack_at_distutilsrD   r+   rL   rM   Zmaybe_relative_pathrA   r\   Úget_extensionr2   )r   Z
sourcenameÚmodnamer
   r
   r   r]   w   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 |¡rzt 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 ˆ |¡‘qS r
   )r?   r@   r4   )r   Úfn)Údirnamer
   r   r   Ž   s    z-Verifier.make_relative_to.<locals>.<listcomp>)
r?   r@   ra   Úcopyr   ZLIST_OF_FILE_NAMESr   ÚlistÚtupler3   )r   r2   rI   rJ   Úlstr
   )ra   r   r1   „   s    
zVerifier.make_relative_toc             C   sˆ   t j | j¡st| jrHyt| jd d dgƒ}W n tk
r>   d S X |j}nd }| j 	|  
¡ |tƒ ¡}|d krnd S || _| j ¡  d| _d S )NÚ__doc__T)r?   r@   ÚisfilerB   rC   Ú
__import__ÚImportErrorÚ__path__r/   Úfind_moduler\   r<   Zcollect_typesrE   )r   Úpkgr@   Úfilenamer
   r
   r   rR   ”   s    
zVerifier._locate_modulec             C   s$   || j _z| j  ¡  W d | j `X d S )N)r/   Ú_fZwrite_source_to_f)r   rN   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 d Q R X nd}|r–t	| jƒ t| jdƒ}| 
|¡ W d Q R X d| _d S )NÚrTÚw)ro   r   Úgetvaluer?   r@   ÚexistsrA   ÚopenÚreadÚ_ensure_dirr   rD   )r   rN   ÚfZsource_dataÚfpZneeds_writtenr
   r
   r   rM   ®   s    

zVerifier._write_sourcec             C   sp   t j | j¡}t ||  ¡ ¡}yt || j¡}W n t	k
rH   d}Y nX |sft
| jƒ t || j¡ d| _d S )NFT)r?   r@   ra   rA   r   Úcompiler]   ÚsamefilerB   ÚOSErrorrv   ÚshutilÚmoverE   )r   r>   ZoutputfilenameZsamer
   r
   r   rP   Ç   s    

zVerifier._compile_modulec             C   s0   | j s
t‚| jd k	r"| j | j¡S | j ¡ S d S )N)rE   ÚAssertionErrorr0   r/   rT   )r   r
   r
   r   rS   Ô   s    

zVerifier._load_library)NNNr#   Fr$   NN)N)N)r   r   r    rK   rO   rQ   rT   r\   r]   r_   r1   rR   ro   rM   rP   rS   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_ENGINEr5   Úbuiltin_module_namesÚ_cffi_backendri   Z_backendr#   r€   ZVGenericEnginer   ZVCPythonEngine)r+   rH   r„   r€   r   r
   r
   r   r.   ß   s     


r.   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__)Ú_TMPDIRr?   ÚenvironÚgetr5   Ú	_getframeÚf_codeÚco_filenamer@   Úabspathr4   ra   )Úresultrm   r
   r
   r   r=   ÷   s    r=   c             C   s   | a dS )z:Set the temporary directory to use instead of __pycache__.N)r†   )ra   r
   r
   r   Ú
set_tmpdir  s    rŽ   c          	   C   s0  | pt ƒ } yt | ¡}W n tk
r,   dS X |r8d}ntƒ d  ¡ }xd|D ]\}| ¡  d¡rL| ¡  |¡sz| ¡  d¡rLyt tj	 
| |¡¡ W qL tk
r¦   Y qLX qLW tj	 
| d¡g}xn|D ]f}yJxDt |¡D ]6}tj	 
||¡}tj	 |¡r | |¡ qÔt |¡ 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_Úbuild)r=   r?   Úlistdirr{   r<   ÚlowerÚ
startswithrZ   Úunlinkr@   r4   ÚisdirÚappend)r>   Zkeep_soÚfilelistr   r`   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 )NÚwin32z.pydz.so)r   r5   Úplatform)Úsuffixesr
   r
   r   r<   %  s    
r<   c             C   s*   t j | ¡}|r&t j |¡s&t  |¡ d S )N)r?   r@   ra   r”   Úmakedirs)rm   ra   r
   r
   r   rv   0  s    rv   )NF)r5   r?   r8   r|   Úior#   r   r   Úerrorr   r6   Zimportlib.machineryr   r   r   ÚStringIOr   ÚBytesIOÚobjectr"   r‚   r.   r†   r=   rŽ   r˜   r<   rv   r
   r
   r
   r   Ú<module>   s*   (


 @

