3 L]+@sddlZddlZddlZddlZddlZddlmZddlmZddlm Z ej dkrhddl Z ddZ nddlZd dZ ej dkrejZnGd d d ejZGd d d eZdZddZdaddZddZdddZddZddZdS)N)__version_verifier_modules__) ffiplatform)VerificationErrorcCstjjddS)N) importlib machineryEXTENSION_SUFFIXESr r //tmp/pip-install-wfra5znf/cffi/cffi/verifier.py_extension_suffixes sr cCsddtjDS)NcSs g|]\}}}|tjkr|qSr )imp C_EXTENSION).0suffix_typer r r sz'_extension_suffixes..)r get_suffixesr r r r r scseZdZfddZZS)NativeIOcs(t|tr|jd}tt|j|dS)Nascii) isinstanceunicodeencodesuperrwrite)selfs) __class__r r rs  zNativeIO.write)__name__ __module__ __qualname__r __classcell__r r )rr rsrc@szeZdZdddZd ddZd d Zd d Zd dZddZddZ ddZ ddZ ddZ d!ddZ ddZddZdS)"VerifierNF.cc Ksv|jjrtd|jjf||_||_|s4tj| } t||} | ||_|jj | | |_ |j | | |_ |rz|rxt dndjtjddt|| g|j}tjdkr|jd}ttj|dddd@}|jd jd }ttj|d ddd@}|jd jd }d ||jj||f}td}|p0t|_tjj|j|||_ tjj|j|||_!||_"d|_#d|_$dS)NzKfeature not supported with ffi.verify(), but only with ffi.set_source(): %sz)can't specify both 'modulename' and 'tag'rzutf-8rl0xLr0z_cffi_%s_%s%s%sF)r)%_parserZ_uses_new_featurerffipreamblerflatten_locate_engine_class_vengineZpatch_extension_kwdsflagsmake_relative_tokwds TypeErrorjoinsysversionrZ _cdefsources version_inforhexbinasciicrc32lstriprstripZ _class_key_get_so_suffixes_caller_dir_pycachetmpdirospathsourcefilenamemodulefilename ext_package _has_source _has_module)rr,r-r@ modulenamerEtagforce_generic_engineZsource_extensionr1 relative_tor3Zflattened_kwdsZ vengine_classkeyZk1Zk2rr r r __init__ sD           zVerifier.__init__c Cs8|jj&|jr |dkr td|j|WdQRXdS)zkWrite the C source code. It is produced in 'self.sourcefilename', which can be tweaked beforehand.Nzsource code already written)r,_lockrFr _write_source)rfiler r r write_sourceHs  zVerifier.write_sourcec Cs<|jj*|jrtd|js&|j|jWdQRXdS)zWrite the C source code (if not done already) and compile it. This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r,rNrGrrFrO_compile_module)rr r r compile_moduleQs  zVerifier.compile_modulec CsF|jj4|js4|j|js4|js,|j|j|jSQRXdS)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,rNrG_locate_modulerFrOrR _load_library)rr r r load_library[s zVerifier.load_librarycCsBtjj|j}|jddd}|jdr>ttdr>|dd}|S)N.rrZ_dgettotalrefcountr')rArBbasenamerDsplitendswithhasattrr6)rrZr r r get_module_nameks  zVerifier.get_module_namec CsVtj|js0|jj|js&|jWdQRXtj|j}|j}tj ||f|j S)N) rZ_hack_at_distutilsrFr,rNrOZmaybe_relative_pathrCr^ get_extensionr3)rZ sourcenamemodnamer r r r_vs  zVerifier.get_extensioncCs|jjS)N)r0Z_gen_python_module)rr r r generates_python_modulesz Verifier.generates_python_modulecs~|rztjj|rztjj||j}xTtjD]J}||kr,||}t|ttfs\t d|ffdd|D}|||<q,W|S)Nz&keyword '%s' should be a list or tuplecsg|]}tjj|qSr )rArBr5)rfn)dirnamer r rsz-Verifier.make_relative_to..) rArBrccopyrZLIST_OF_FILE_NAMESrlisttupler4)rr3rKrLlstr )rcr r2s    zVerifier.make_relative_toc Cstjj|jst|jrHyt|jdddg}Wntk r>dSX|j}nd}|jj |j |t }|dkrndS||_|jj d|_ dS)N__doc__T)rArBisfilerDrE __import__ ImportError__path__r0 find_moduler^r>Z collect_typesrG)rpkgrBfilenamer r r rTs zVerifier._locate_modulec Cs$||j_z|jjWd|j`XdS)N)r0_fZwrite_source_to_f)rrPr r r _write_source_toszVerifier._write_source_tocCs|dk r|j|nt}|j||j}tjj|jrbt|jd}|j|k }WdQRXnd}|rt |jt|jd}|j |WdQRXd|_ dS)NrTw) rqrgetvaluerArBexistsrCopenread _ensure_dirrrF)rrPfZ source_datafpZ needs_writtenr r r rOs   zVerifier._write_sourcec Csptjj|j}tj||j}ytj||j}Wnt k rHd}YnX|sft |jt j ||jd|_ dS)NFT)rArBrcrCrcompiler_samefilerDOSErrorrxshutilmoverG)rr@ZoutputfilenameZsamer r r rRs  zVerifier._compile_modulecCs0|js t|jdk r"|jj|jS|jjSdS)N)rGAssertionErrorr1r0rV)rr r r rUs  zVerifier._load_library)NNNr$Fr%NN)N)N)rr r!rMrQrSrVr^r_rar2rTrqrOrRrUr r r r r#s &      r#Fc Cs|trd}|sPdtjkrd}n4y ddl}Wntk r@d}YnX|j|k rPd}|rfddlm}|jSddlm }|j SdS)NTZ__pypy__r?r) vengine_gen) vengine_cpy) _FORCE_GENERIC_ENGINEr6builtin_module_names _cffi_backendrkZ_backendr$rZVGenericEnginerZVCPythonEngine)r,rJrrrr r r r/s       r/cCsHtrtStjjd}|r|Stjdjj}tjj tjj tjj |dS)NZ CFFI_TMPDIRr' __pycache__) _TMPDIRrAenvirongetr6 _getframef_code co_filenamerBabspathr5rc)resultror r r r?s r?cCs|adS)z:Set the temporary directory to use instead of __pycache__.N)r)rcr r r set_tmpdirsrcCs0|pt}ytj|}Wntk r,dSX|r8d}ntdj}xd|D]\}|jjdrL|jj|sz|jjdrLytjtj j ||WqLtk rYqLXqLWtj j |dg}xn|D]f}yJxDtj|D]6}tj j ||}tj j |r|j |qtj|qWWqtk r&YqXqWdS)z}Clean up the temporary directory by removing all files in it called `_cffi_*.{c,so}` as well as the `build` subdirectory.Nz.crZ_cffi_build) r?rAlistdirr}r>lower startswithr\unlinkrBr5isdirappend)r@Zkeep_sofilelistrrbZ clean_dirdirr r r cleanup_tmpdirs2     rcCs&t}|s"tjdkrdg}ndg}|S)Nwin32z.pydz.so)r r6platform)suffixesr r r r>$s  r>cCs,tjj|}|r(tjj| r(tj|dS)N)rArBrcrmakedirs)rorcr r r rx/s rx)rr)r)NF)r6rAr:r~ior$rrerrorrr8importlib.machineryrr r StringIOrBytesIOobjectr#rr/rr?rrr>rxr r r r s*(      ?