3
.W,                 @   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 e jdkr\d 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dd 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   c               C   s   t jjd d  S )N)	importlib	machineryEXTENSION_SUFFIXES r	   r	   M/var/www/html/enquirykeeper_venv/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   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              C   s0   t jdkr,ydd l} W n tk
r*   Y nX d S )Nwin32r   )sysplatform
setuptoolsImportError)r%   r	   r	   r
   _hack_at_distutils   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   sx  |j jrtjd|j jf || _|| _|s6tj|}t||}|| | _| jj	| |	| _
| j||
| _|r||rztdnd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 }|p2t | _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    0xLr   0z_cffi_%s_%s%s%sF)r   )%_parserZ_uses_new_featurer   VerificationErrorffipreambleflatten_locate_engine_class_vengineZpatch_extension_kwdsflagsmake_relative_tokwds	TypeErrorjoinr#   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   r2   r3   rE   Z
modulenamerJ   tagforce_generic_engineZsource_extensionr7   relative_tor9   Zflattened_kwdsZvengine_classkeyZk1Zk2r   r	   r	   r
   __init__)   sD    









zVerifier.__init__c          	   C   s:   | j j( | jr"|dkr"tj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)r2   _lockrK   r   r1   _write_source)r   filer	   r	   r
   write_sourceQ   s
    
zVerifier.write_sourcec          	   C   s>   | j j, | jrtjd| js(| j  | j  W dQ R X dS )zWrite the C source code (if not done already) and compile it.
        This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r2   rR   rL   r   r1   rK   rS   _compile_module)r   r	   r	   r
   compile_moduleZ   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)r2   rR   rL   _locate_modulerK   rS   rV   _load_library)r   r	   r	   r
   load_libraryd   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   _dgettotalrefcountr,   )rF   rG   basenamerI   splitendswithhasattrr#   )r   r_   r	   r	   r
   get_module_namet   s
    zVerifier.get_module_namec          
   C   sT   t   | js.| jj | js$| j  W d Q R X tj| j}| j }tj	||f| j
S )N)r'   rK   r2   rR   rS   r   Zmaybe_relative_pathrH   rc   get_extensionr9   )r   Z
sourcenamemodnamer	   r	   r
   rd      s    
zVerifier.get_extensionc             C   s   | j jS )N)r6   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	   )rF   rG   r;   )r   fn)dirnamer	   r
   r      s    z-Verifier.make_relative_to.<locals>.<listcomp>)
rF   rG   rh   copyr   ZLIST_OF_FILE_NAMESr   listtupler:   )r   r9   rO   rP   lstr	   )rh   r
   r8      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)rF   rG   isfilerI   rJ   
__import__r&   __path__r6   find_modulerc   rC   Zcollect_typesrL   )r   pkgrG   filenamer	   r	   r
   rX      s    
zVerifier._locate_modulec          
   C   s$   || j _z| j j  W d | j `X d S )N)r6   Z_fZwrite_source_to_f)r   rT   r	   r	   r
   _write_source_to   s    zVerifier._write_source_toc             C   s   |d k	r| j | nt }| j | |j }tjj| jrbt| jd}|j |k }W d Q R X nd}|rt	| j t| jd}|j
| W d Q R X d| _d S )NrTw)rt   r   getvaluerF   rG   existsrH   openread_ensure_dirr   rK   )r   rT   fZsource_datafpZneeds_writtenr	   r	   r
   rS      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)rF   rG   rh   rH   r   compilerd   samefilerI   OSErrorr{   shutilmoverL   )r   rE   ZoutputfilenameZsamer	   r	   r
   rV      s    

zVerifier._compile_modulec             C   s0   | j s
t| jd k	r"| jj| jS | jj S d S )N)rL   AssertionErrorr7   r6   rZ   )r   r	   r	   r
   rY      s    

zVerifier._load_library)NNNr)   Fr*   NN)N)N)r   r   r    rQ   rU   rW   rZ   rc   rd   rf   r8   rX   rt   rS   rV   rY   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_ENGINEr#   builtin_module_names_cffi_backendr&   Z_backendr)   r   ZVGenericEnginer   ZVCPythonEngine)r2   rN   r   r   r   r	   r	   r
   r5      s     


r5   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__)_TMPDIRrF   environgetr#   	_getframef_codeco_filenamerG   abspathr;   rh   )resultrs   r	   r	   r
   rD      s    rD   c             C   s   | a dS )z:Set the temporary directory to use instead of __pycache__.N)r   )rh   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| qtj| qW W q tk
r&   Y qX qW 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)rD   rF   listdirr   rC   lower
startswithra   unlinkrG   r;   isdirappend)rE   Zkeep_sofilelistr   rg   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 )Nr"   z.pydz.so)r   r#   r$   )suffixesr	   r	   r
   rC   -  s    
rC   c             C   s0   yt jt jj|  W n tk
r*   Y nX d S )N)rF   makedirsrG   rh   r   )rs   r	   r	   r
   r{   8  s    r{   )r   r   )r   )NF)r#   rF   r?   r   ior)   r   r   r=   importlib.machineryr   r   r   StringIOr   BytesIOr'   objectr(   r   r5   r   rD   r   r   rC   r{   r	   r	   r	   r
   <module>   s*   (


 ?

