3
ãdeõ+  ã               @   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
   úD/var/www/agendate/envp3/lib/python3.6/site-packages/cffi/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
   )ÚimpÚ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)Ú
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j|ƒ}t||ƒ}|| ƒ| _| jj	|ƒ |	| _
| j||
ƒ| _|rz|rxtdƒ‚n¦djd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 }|�p4tƒ | _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'ú z%d.%dé   r   zutf-8r   l   ÿÿ Ú0xÚLr   Ú0z_cffi_%s_%s%s%sF)r   )$Ú_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ƒ‚| 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+   Ú_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&| 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+   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ƒ  | 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+   rL   rE   Ú_locate_modulerD   rM   rP   Ú_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@   ÚbasenamerB   ÚsplitÚendswithÚhasattrr5   )r   rX   r
   r
   r   Úget_module_namel   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_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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@   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| 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@   Ú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 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| 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)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| 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@   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| jƒS | j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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Ú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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_Ú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j| ƒ}|r(t jj|ƒ r(t j|ƒ d S )N)r?   r@   ra   r”   Úmakedirs)rm   ra   r
   r
   r   rv   0  s    rv   )r   r   )r   )NF)r5   r?   r8   r|   Úior#   r   r   Úerrorr   r6   Úimportlib.machineryr   r   r   ÚStringIOr   ÚBytesIOÚobjectr"   r‚   r.   r†   r=   rŽ   r˜   r<   rv   r
   r
   r
   r   Ú<module>   s*   (


 @

