B ©#aõ+ã@sêddlZddlZddlZddlZddlZddlmZddlmZddlm Z ej dkrhddl Z dd„Z nddlZd d„Z ej d krŠejZnGd d „d ejƒZGd d„deƒZdZdd„Zdadd„Zdd„Zddd„Zdd„Zdd„ZdS)éNé)Ú__version_verifier_modules__)Ú ffiplatform)ÚVerificationError)ércCstjjdd…S)N)Ú importlibÚ machineryÚEXTENSION_SUFFIXES©r r ú6/tmp/pip-target-jgxl_w8r/lib64/python/cffi/verifier.pyÚ_extension_suffixes sr cCsdd„t ¡DƒS)NcSs g|]\}}}|tjkr|‘qSr )ÚimpÚ C_EXTENSION)Ú.0ÚsuffixÚ_Útyper r r ú sz'_extension_suffixes..)r Z get_suffixesr r r r r s)rcseZdZ‡fdd„Z‡ZS)ÚNativeIOcs(t|tƒr| d¡}tt|ƒ |¡dS)NÚascii)Ú isinstanceÚunicodeÚencodeÚsuperrÚwrite)ÚselfÚs)Ú __class__r r rs  zNativeIO.write)Ú__name__Ú __module__Ú __qualname__rÚ __classcell__r r )rr rsrc@szeZdZddd„Zd dd„Zd d „Zd d „Zd d„Zdd„Zdd„Z dd„Z dd„Z dd„Z d!dd„Z dd„Zdd„ZdS)"ÚVerifierNÚFú.cc Ksz|jjrtd|jjfƒ‚||_||_|s4t | ¡} t||ƒ} | |ƒ|_|j  | ¡| |_ |  | | ¡|_ |rz|rxt dƒ‚n¦d dtjdd…t|| g|j¡}tjdkr´| d¡}tt |ddd…¡d @ƒ}| d ¡ d ¡}tt |d dd…¡d @ƒ}| d ¡ d ¡}d||jj||f}tƒd}|p4tƒ|_tj |j||¡|_tj |j||¡|_ ||_!d|_"d|_#dS)NzKfeature not supported with ffi.verify(), but only with ffi.set_source(): %sz)can't specify both 'modulename' and 'tag'úz%d.%dé)rzutf-8rlÿÿÚ0xÚLrÚ0z_cffi_%s_%s%s%sF)$Ú_parserZ_uses_new_featurerÚffiÚpreamblerÚflattenÚ_locate_engine_classÚ_vengineZpatch_extension_kwdsÚflagsÚmake_relative_toÚkwdsÚ TypeErrorÚjoinÚsysÚ version_inforZ _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)rr+r,r>Ú modulenamerCÚtagÚforce_generic_engineZsource_extensionr0Ú relative_tor2Zflattened_kwdsZ vengine_classÚkeyZk1Zk2rr r r Ú__init__ sF           zVerifier.__init__c Cs8|jj&|jr |dkr tdƒ‚| |¡WdQRXdS)zkWrite the C source code. It is produced in 'self.sourcefilename', which can be tweaked beforehand.Nzsource code already written)r+Ú_lockrDrÚ _write_source)rÚfiler r r Ú write_sourceIs  zVerifier.write_sourcec Cs<|jj*|jrtdƒ‚|js&| ¡| ¡WdQRXdS)z„Write the C source code (if not done already) and compile it. This produces a dynamic link library in 'self.modulefilename'.zmodule already compiledN)r+rLrErrDrMÚ_compile_module)rr r r Úcompile_moduleRs  zVerifier.compile_modulec CsF|jj4|js4| ¡|js4|js,| ¡| ¡| ¡SQRXdS)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+rLrEÚ_locate_modulerDrMrPÚ _load_library)rr r r Ú load_library\s zVerifier.load_librarycCsBtj |j¡}| dd¡d}| d¡r>ttdƒr>|dd…}|S)NÚ.rrZ_dÚgettotalrefcountéþÿÿÿ)r?r@ÚbasenamerBÚsplitÚendswithÚhasattrr5)rrXr r r Úget_module_namels  zVerifier.get_module_namec CsVt ¡|js0|jj|js&| ¡WdQRXt |j¡}| ¡}tj ||f|j ŽS)N) rZ_hack_at_distutilsrDr+rLrMZmaybe_relative_pathrAr\Ú get_extensionr2)rZ sourcenameÚmodnamer r r r]ws  zVerifier.get_extensioncCs|jjS)N)r/Z_gen_python_module)rr r r Úgenerates_python_modulesz Verifier.generates_python_modulecs~|rztj |¡rztj |¡‰| ¡}xTtjD]J}||kr,||}t|ttfƒs\t d|fƒ‚‡fdd„|Dƒ}|||<q,W|S)Nz&keyword '%s' should be a list or tuplecsg|]}tj ˆ|¡‘qSr )r?r@r4)rÚfn)Údirnamer r rŽsz-Verifier.make_relative_to..) r?r@raÚcopyrZLIST_OF_FILE_NAMESrÚlistÚtupler3)rr2rIrJÚlstr )rar r1„s    zVerifier.make_relative_tocCsˆtj |j¡st|jrHyt|jdddgƒ}Wntk r>dSX|j}nd}|j  |  ¡|t ƒ¡}|dkrndS||_|j  ¡d|_ dS)NÚ__doc__T)r?r@ÚisfilerBrCÚ __import__Ú ImportErrorÚ__path__r/Ú find_moduler\r<Z collect_typesrE)rÚpkgr@Úfilenamer r r rR”s zVerifier._locate_modulecCs$||j_z|j ¡Wd|j`XdS)N)r/Ú_fZwrite_source_to_f)rrNr r r Ú_write_source_to§szVerifier._write_source_toc Cs |dk r| |¡nˆtƒ}| |¡| ¡}tj |j¡rbt|jdƒ}| ¡|k }WdQRXnd}|r–t |jƒt|jdƒ}|  |¡WdQRXd|_ dS)NÚrTÚw) rorÚgetvaluer?r@ÚexistsrAÚopenÚreadÚ _ensure_dirrrD)rrNÚfZ source_dataÚfpZ needs_writtenr r r rM®s   zVerifier._write_sourcecCsptj |j¡}t || ¡¡}yt ||j¡}Wnt k rHd}YnX|sft |jƒt   ||j¡d|_ dS)NFT)r?r@rarArÚcompiler]ÚsamefilerBÚOSErrorrvÚshutilÚmoverE)rr>ZoutputfilenameZsamer r r rPÇs  zVerifier._compile_modulecCs0|js t‚|jdk r"|j |j¡S|j ¡SdS)N)rEÚAssertionErrorr0r/rT)rr r r rSÔs  zVerifier._load_library)NNNr#Fr$NN)N)N)rrr rKrOrQrTr\r]r_r1rRrorMrPrSr r r r r"s '      r"FcCs|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_ENGINEr5Úbuiltin_module_namesÚ _cffi_backendriZ_backendr#r€ZVGenericEnginerZVCPythonEngine)r+rHr„r€rr r r r.ßs       r.cCsHtrtStj d¡}|r|St d¡jj}tj  tj  tj  |¡d¡¡S)NZ CFFI_TMPDIRr&Ú __pycache__) Ú_TMPDIRr?ÚenvironÚgetr5Ú _getframeÚf_codeÚ co_filenamer@Úabspathr4ra)Úresultrmr r r r=÷s r=cCs|adS)z:Set the temporary directory to use instead of __pycache__.N)r†)rar r r Ú set_tmpdirsrŽc Cs0|ptƒ}yt |¡}Wntk r,dSX|r8d}ntƒd ¡}xd|D]\}| ¡ d¡rL| ¡ |¡sz| ¡ d¡rLyt tj   ||¡¡WqLtk r¦YqLXqLWtj   |d¡g}xn|D]f}yJxDt |¡D]6}tj   ||¡}tj   |¡r|  |¡qÔt |¡qÔWWqÂtk r&YqÂXqÂWdS)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=r?Úlistdirr{r<ÚlowerÚ startswithrZÚunlinkr@r4ÚisdirÚappend)r>Zkeep_soÚfilelistrr`Z clean_dirÚdirr r r Úcleanup_tmpdirs2     r˜cCs&tƒ}|s"tjdkrdg}ndg}|S)NÚwin32z.pydz.so)r r5Úplatform)Úsuffixesr r r r<%s  r<cCs*tj |¡}|r&tj |¡s&t |¡dS)N)r?r@rar”Úmakedirs)rmrar r r rv0s rv)NF)r5r?r8r|Úior#rrÚerrorrr6Zimportlib.machineryrr r ÚStringIOrÚBytesIOÚobjectr"r‚r.r†r=rŽr˜r<rvr r r r Ús*(      @