B ل=^+@sddlZddlZddlZddlZddlZddlmZddlmZddlm Z ej dkrhddl Z ddZ nddlZd dZ ej d krejZnGd d d ejZGd ddeZdZddZdaddZddZdddZddZddZdS)N)__version_verifier_modules__) ffiplatform)VerificationError)rcCstjjddS)N) importlib machineryEXTENSION_SUFFIXESr r @/opt/alt/python37/lib64/python3.7/site-packages/cffi/verifier.py_extension_suffixes sr cCsddtDS)NcSs g|]\}}}|tjkr|qSr )impZ C_EXTENSION).0suffix_typer r r sz'_extension_suffixes..)r Z get_suffixesr r r r r s)rcseZdZfddZZS)NativeIOcs(t|tr|d}tt||dS)Nascii) isinstanceZunicodeencodesuperrwrite)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||_||_|s4t| } t||} | ||_|j | | |_ | | | |_ |rz|rxt dndtjddt|| g|j}tjdkr|d}tt|dddd @}|d d }tt|d ddd @}|d d }d||jj||f}td}|p0t|_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'r)rzutf-8rlZ0xLr0z_cffi_%s_%s%s%sF)%Z_parserZ_uses_new_featurerffipreamblerZflatten_locate_engine_class_vengineZpatch_extension_kwdsflagsmake_relative_tokwds TypeErrorjoinsysversionrZ _cdefsources version_inforhexbinasciiZcrc32lstriprstripZ _class_key_get_so_suffixes_caller_dir_pycachetmpdirospathsourcefilenamemodulefilename ext_package _has_source _has_module)rr'r(r9Z modulenamer>tagforce_generic_engineZsource_extensionr+ relative_tor-Zflattened_kwdsZ vengine_classkeyZk1Zk2rr r r __init__ sD           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'_lockr?r _write_source)rfiler r r write_sourceHs  zVerifier.write_sourcec Cs<|jj*|jrtd|js&||WdQRXdS)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'rFr@rr?rG_compile_module)rr r r compile_moduleQs  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'rFr@_locate_moduler?rGrJ _load_library)rr r r load_library[s zVerifier.load_librarycCsBtj|j}|ddd}|dr>ttdr>|dd}|S)N.rrZ_dZgettotalrefcount)r:r;basenamer=splitendswithhasattrr0)rrQr r r get_module_nameks  zVerifier.get_module_namec CsVt|js0|jj|js&|WdQRXt|j}|}tj ||f|j S)N) rZ_hack_at_distutilsr?r'rFrGZmaybe_relative_pathr<rU get_extensionr-)rZ sourcenamemodnamer r r rVvs  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|ttfs\t d|ffdd|D}|||<q,W|S)Nz&keyword '%s' should be a list or tuplecsg|]}tj|qSr )r:r;r/)rfn)dirnamer r rsz-Verifier.make_relative_to..) r:r;rZcopyrZLIST_OF_FILE_NAMESrlisttupler.)rr-rCrDZlstr )rZr r,s    zVerifier.make_relative_tocCstj|jst|jrHyt|jdddg}Wntk r>dSX|j}nd}|j | |t }|dkrndS||_|j d|_ dS)N__doc__T)r:r;isfiler=r> __import__ ImportError__path__r* find_modulerUr7Z collect_typesr@)rZpkgr;filenamer r r rLs zVerifier._locate_modulecCs$||j_z|jWd|j`XdS)N)r*Z_fZwrite_source_to_f)rrHr r r _write_source_toszVerifier._write_source_toc Cs|dk r||nt}|||}tj|jrbt|jd}||k }WdQRXnd}|rt |jt|jd}| |WdQRXd|_ dS)NrTw) rergetvaluer:r;existsr<openread _ensure_dirrr?)rrHfZ source_datafpZ needs_writtenr r r rGs   zVerifier._write_sourcecCsptj|j}t||}yt||j}Wnt k rHd}YnX|sft |jt ||jd|_ dS)NFT)r:r;rZr<rcompilerVsamefiler=OSErrorrlshutilZmover@)rr9ZoutputfilenameZsamer r r rJs  zVerifier._compile_modulecCs&|jdk r|j|jS|jSdS)N)r+r*rN)rr r r rMs zVerifier._load_library)NNNr!Fr"NN)N)N)rrrrErIrKrNrUrVrXr,rLrerGrJrMr 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_ENGINEr0builtin_module_names _cffi_backendraZ_backendr!rtZVGenericEngineruZVCPythonEngine)r'rBrxrtrur r r r)s       r)cCsHtrtStjd}|r|Stdjj}tj tj tj |dS)NZ CFFI_TMPDIRr$ __pycache__) _TMPDIRr:environgetr0 _getframef_code co_filenamer;abspathr/rZ)resultrdr r r r8s r8cCs|adS)z:Set the temporary directory to use instead of __pycache__.N)rz)rZr r r set_tmpdirsrc Cs0|pt}yt|}Wntk r,dSX|r8d}ntd}xd|D]\}|drL||sz|drLyttj ||WqLtk rYqLXqLWtj |dg}xn|D]f}yJxDt|D]6}tj ||}tj |r| |qt|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_Zbuild) r8r:listdirrqr7lower startswithrSunlinkr;r/isdirappend)r9Zkeep_soZfilelistrrYZ clean_dirdirr r r cleanup_tmpdirs2     rcCs&t}|s"tjdkrdg}ndg}|S)NZwin32z.pydz.so)r r0platform)suffixesr r r r7$s  r7cCs*tj|}|r&tj|s&t|dS)N)r:r;rZrmakedirs)rdrZr r r rl/s rl)NF)r0r:r4rrior!rrerrorrr2Zimportlib.machineryrr r StringIOrBytesIOobjectr rvr)rzr8rrr7rlr r r r s*(      ?