a ‚oeßjã@sHddlZddlZddlZddlmZddlmZGdd„deƒZdZ dS)éNé)Úmodel©ÚVerificationErrorc@s„eZdZdZdZdd„Zdd„Zdd„Zd d „ZdZd d „Z dd„Z d[dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZeZeZeZdd„ZeZdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Z d5d6„Z!d7d8„Z"d9d:„Z#d\d=d>„Z$d?d@„Z%eZ&d]dAdB„Z'dCdD„Z(dEdF„Z)dGdH„Z*dIdJ„Z+d^dLdM„Z,d_dNdO„Z-dPdQ„Z.dRdS„Z/eZ0dTdU„Z1dVdW„Z2eZ3dXdY„Z4d;S)`ÚVGenericEngineÚgFcCs||_|j|_g|_i|_dS©N)ÚverifierÚffiÚexport_symbolsÚ_struct_pending_verification)Úselfr ©rú1C:\Program Files\Certbot\pkgs\cffi\vengine_gen.pyÚ__init__szVGenericEngine.__init__cCs| d|j¡dS)Nr )Ú setdefaultr )r ÚkwdsrrrÚpatch_extension_kwdssz#VGenericEngine.patch_extension_kwdscCsT|D]J}||}|durtj}|D]*}tj ||¡}tj |¡r"|Sq"qdSr)ÚsysÚpathÚosÚjoinÚisfile)r Z module_namerZ so_suffixesZ so_suffixÚbasenameÚdirnameÚfilenamerrrÚ find_modules zVGenericEngine.find_modulecCsdSrr©r rrrÚ collect_types%szVGenericEngine.collect_typesÚcCs|j |d¡dS)NÚ )Z_fÚwrite)r ZwhatrrrÚ_prnt(szVGenericEngine._prntcCs`|j}|tƒ||jjƒ| d¡tjdkr\tjdkr>d}nd}|j ¡}|d||fƒdS)NZdeclÚwin32©éZPyInit_Úinitzvoid %s%s(void) { } ) r"Úcffimod_headerr ZpreambleÚ _generaterÚplatformÚ version_infoZget_module_name)r ÚprntÚprefixÚmodnamerrrÚwrite_source_to_f+s     z VGenericEngine.write_source_to_frcsjˆjj}tj tjˆjj¡}| ||¡‰ˆ  ˆd¡G‡‡‡fdd„dt j ƒ‰ˆdƒ}ˆj ˆd|d�|S)NZloadingcs&eZdZ”Z”jZgZ‡fdd„ZdS)z/VGenericEngine.load_library..FFILibrarycsˆjSr)Ú _cffi_dirr)Ú FFILibraryrrÚ__dir__Tsz7VGenericEngine.load_library..FFILibrary.__dir__N)Ú__name__Ú __module__Ú __qualname__Z_cffi_generic_moduler Z _cffi_ffir/r1r©r0Úmoduler rrr0Psr0rZloaded©Úlibrary) r Ú_backendrrrÚcurdirr ZmodulefilenameÚ load_libraryÚ_loadÚtypesÚ ModuleType)r ÚflagsÚbackendrr8rr5rr;As  zVGenericEngine.load_librarycCs$dd„|jjj ¡Dƒ}| ¡|S)NcSsg|]\}\}}||f‘qSrr)Ú.0ÚkeyÚtpZqualrrrÚ ^óz4VGenericEngine._get_declarations..)r Z_parserZ _declarationsÚitemsÚsort)r ZlstrrrÚ_get_declarations]s  ÿz VGenericEngine._get_declarationsc Csž| ¡D]�\}}| dd¡\}}zt|d||fƒ}WntyTtd|ƒ‚Yn0z|||ƒWqty–}zt ||¡‚WYd}~qd}~00qdS)Nú rz_generate_gen_%s_%sznot implemented in verify(): %r)rHÚsplitÚgetattrÚAttributeErrorrÚ ExceptionrÚattach_exception_info)r Ú step_nameÚnamerCÚkindÚrealnameÚmethodÚerrrr(csÿ  ÿ  zVGenericEngine._generatec Ks„| ¡D]v\}}| dd¡\}}t|d||fƒ}z||||fi|¤ŽWqty|} zt | |¡‚WYd} ~ qd} ~ 00qdS)NrIrz _%s_gen_%s)rHrJrKrMrrN) r r6rOrrPrCrQrRrSrTrrrr<rs zVGenericEngine._loadcCsdSrr©r rCrPrrrÚ_generate_nothing|sz VGenericEngine._generate_nothingcKsdSrr©r rCrPr6rrrrÚ _loaded_noopszVGenericEngine._loaded_noopcs„t|tjƒsJ‚|jr(| d||¡dS|j}t|jƒ}g}t|jƒD].\}}d}t|tj ƒrbd}|  d||f¡qFd|‰‡fdd„t |j|ƒDƒ} |j } t| tj ƒrÄ|   d|  d ˆ¡¡tj} d  | ¡pÐd } d |} |j  | ¡|jrø|jd } nd} d| | | f} d|‰||  | ˆ¡ƒ|dƒt|j tj ƒ�r@d}nt|j tjƒ�sVd}nd}|d||d  |¡fƒ|dƒ|ƒdS)NFrÚ*z%sx%dzargument of %scs g|]\}}| d|ˆ¡‘qS)z %s)Ú get_c_name)rAÚtypeÚarg©ÚcontextrrrD�sÿz>VGenericEngine._generate_gen_function_decl..rz *rz, Zvoidú _cffi_f_%srIz %s%s(%s)z result of %sú{z*r = zreturn z %s%s(%s);ú})Ú isinstancerÚFunctionPtrTypeÚellipsisÚ_generate_gen_constr"ÚlenÚargsÚ enumerateÚ StructOrUnionÚappendÚzipÚresultÚinsertrZÚ void_typerr ÚabiZVoidType)r rCrPr+ZnumargsZargnamesÚir[Z indirectionZarglistZtpresultÚ wrappernameroZfuncdeclZ result_coderr]rÚ_generate_gen_function_declŒsL    ÿ   z*VGenericEngine._generate_gen_function_declcCsjt|tjƒsJ‚|jr*| d|||¡}�n g}|}tdd„|jDƒƒsVt|jtjƒ�r g}t |jƒD]6\} } t| tjƒr�t  | ¡} |  | | f¡|  | ¡qd|j} t| tjƒrö| j durÊt d|  ¡fƒ‚t  | ¡} | d| ¡| dd| f¡tj} t t|ƒ| |j¡}|j |¡} d|} | | | ¡}|D]\} } | || | |¡}�q.t|||ƒt|ƒj  |¡dS)NFcss|]}t|tjƒVqdSr)rbrri)rAÚtyprrrÚ ÂrEz6VGenericEngine._loaded_gen_function..z*'%s' is used as result type, but is opaquerrlr_)rbrrcrdÚ_load_constantÚanyrgrlrirhÚ PointerTyperjZfldtypesÚ TypeErrorÚ _get_c_namermrnÚtupler Ú_get_cached_btypeÚ load_functionÚ_make_struct_wrapperÚsetattrr[r/)r rCrPr6r8Z newfunctionZ indirectionsÚbase_tpZ indirect_argsrprsZindirect_resultÚBFuncrqrrrÚ_loaded_gen_function»sJ ÿ     ÿÿ   ÿ    ÿ z#VGenericEngine._loaded_gen_functioncsP|jj‰|j |¡‰ˆdkr4|j‰‡‡‡fdd„}n‡‡‡‡fdd„}||_|S)Nrlcs"ˆ ˆ¡}ˆ|g|¢RŽ|dS©Nr)Únew)rgÚres)ÚBTyper ÚoldfuncrrÚnewfuncäs z4VGenericEngine._make_struct_wrapper..newfunccs6|dˆ…ˆ ˆ|ˆ¡f|ˆdd…}ˆ|ŽS)Nr)Znewp)rg)r…r@rpr†rrr‡és.)r r9r{Z_cffi_base_type)r r†rprCrr‡r)r…r@r rpr†rr}ßs z#VGenericEngine._make_struct_wrappercCs ||jksJ‚| |d|¡dS©NÚstruct©rPÚ_generate_struct_or_union_declrUrrrÚ_generate_gen_struct_declòsz(VGenericEngine._generate_gen_struct_declcCs| |d||¡dSrˆ©Ú_loading_struct_or_union©r rCrPr6rrrÚ_loading_gen_structösz"VGenericEngine._loading_gen_structcKs| |¡dSr©Ú_loaded_struct_or_unionrWrrrÚ_loaded_gen_structùsz!VGenericEngine._loaded_gen_structcCs ||jksJ‚| |d|¡dS©NÚunionrŠrUrrrÚ_generate_gen_union_declüsz'VGenericEngine._generate_gen_union_declcCs| |d||¡dSr”r�r�rrrÚ_loading_gen_unionsz!VGenericEngine._loading_gen_unioncKs| |¡dSrr‘rWrrrÚ_loaded_gen_unionsz VGenericEngine._loaded_gen_unionc Cs|jdurdSd||f}d||f}d||f ¡}|j}|d||fƒ|dƒ|dƒ|dƒ| ¡D]�\}} } } t| tjƒrŒ|  ¡s”| dkr¢|d |ƒqlz$|d | jd d || d �|fƒWqlt yú} z|dt | ƒƒWYd} ~ qld} ~ 00ql|dƒ|j   |¡|d|fƒ|dƒ|d|ƒ|dƒ|d|ƒ|dƒ| ¡D]h\}} } } | dk�rr�qX|d||fƒt| tj ƒ�r®| jdu�r®|d|  ¡ƒn|d||fƒ�qX|dƒ|dƒ|dƒ|dƒ|d|fƒ|dƒ|ƒdS)Nz_cffi_check_%s_%sú_cffi_layout_%s_%sú%s %szstatic void %s(%s *p)r`z8 /* only to generate compile-time warnings or errors */z (void)p;rz (void)((p->%s) << 1);z { %s = &p->%s; (void)tmp; }z*tmpzfield %r)Zqualsz /* %s */razintptr_t %s(intptr_t i)z, struct _cffi_aligncheck { char x; %s y; };z static intptr_t nums[] = {z sizeof(%s),z) offsetof(struct _cffi_aligncheck, y),z offsetof(%s, %s),z 0, /* %s */z sizeof(((%s *)0)->%s),z -1z };z return nums[i];z3 /* the next line is not executed, but compiled */z %s(0);)ÚfldnamesÚstripr"Ú enumfieldsrbrÚ PrimitiveTypeÚis_integer_typerZrÚstrr rjÚ ArrayTypeÚlengthry) r rCr,rPZ checkfuncnameÚlayoutfuncnameÚcnamer+ÚfnameÚftypeÚfbitsizeÚfqualrTrrrr‹s\    ÿÿþ (    z-VGenericEngine._generate_struct_or_union_declcCs|jdurdSd||f}|j d¡d}| ||¡}g}d} || ƒ} | dkrPqd| | ¡| d7} q>t|tjƒrâ|jrâ|d} |d} |ddd…} |ddd…}|  ¡t | ƒt |ƒkrÌt |jƒksÒnJ‚| || | f|_ nd||f  ¡}||f|j |<dS)Nr™zintptr_t(*)(intptr_t)rrér%rš)r›r Ú_typeof_lockedr|rjrbrriÚpartialZ force_flattenrfZ fixedlayoutrœr )r rCr,rPr6r£r€ÚfunctionÚlayoutZnumÚxZ totalsizeZtotalalignmentZfieldofsZ fieldsizer¤rrrrŽ7s*      (z'VGenericEngine._loading_struct_or_unionc Cs|jdurdS|j |¡||jv�rdd„}|j}| |¡}|j |¡\}}||d| |¡dƒ||d| |¡dƒd}| ¡D]v\}} } } | dkrœq†|||| ||¡d|fƒ||ddkrô| | ¡} |||d| | ¡d |fƒ|d7}q†|t |ƒk�sJ‚dS) NcSs||krtd|||fƒ‚dS)Nz'%s (we have %d, but C compiler says %d)r)Z realvalueZ expectedvalueÚmsgrrrÚcheckZs ÿÿz5VGenericEngine._loaded_struct_or_union..checkrzwrong total sizerzwrong total alignmentr©zwrong offset for field %rzwrong size for field %r) r›r r{r ÚpopÚsizeofZalignofr�Zoffsetofrf) r rCr°r ZBStructr­r¤rpr¥r¦r§r¨ZBFieldrrrr’Ss0    ÿ ÿ z&VGenericEngine._loaded_struct_or_unioncCs.t|tjƒr| ||d¡n| |d|¡dS©Nr)rbrÚEnumTypeÚ_generate_gen_enum_declr‹rUrrrÚ_generate_gen_anonymous_declus z+VGenericEngine._generate_gen_anonymous_declcCs2t|tjƒr| |||d¡n| |d||¡dSr³)rbrr´Ú_loading_gen_enumrŽr�rrrÚ_loading_gen_anonymous{s z%VGenericEngine._loading_gen_anonymouscKs2t|tjƒr$|j|||fi|¤Žn | |¡dSr)rbrr´Ú_loaded_gen_enumr’rWrrrÚ_loaded_gen_anonymous�s z$VGenericEngine._loaded_gen_anonymousNÚconstc CsF|j}d||f}|j |¡|durl|s.J‚|dks:J‚|d|ƒ|dƒ| ||¡|dƒ|dƒnÐ|r¶|dks|J‚|d|ƒ|dƒ|d|fƒ|d |fƒ|dƒn†|dusÂJ‚|dusÎJ‚|d krÜd }nd }d } |dk�rt|tjƒ�rd } d }|| d| |f|¡ƒ|dƒ|d||fƒ|dƒ|ƒdS)Nz _cffi_%s_%sr»úint %s(char *out_error)r`ú return 0;razint %s(long long *out_value)z *out_value = (long long)(%s);z return (%s) <= 0;Úvarú&rzconst *z %s%s(void)z return (%s%s);)r"r rjÚ_check_int_constant_valuerbrrirZ) r Úis_intrPrCÚcategoryÚ check_valuer+ÚfuncnameZ ampersandZextrarrrreŠs@           z"VGenericEngine._generate_gen_constcCs&t|tjƒo| ¡}| |||¡dSr)rbrržrŸre)r rCrPrÁrrrÚ_generate_gen_constant_decl¯sz*VGenericEngine._generate_gen_constant_declcCsd|}|dur*|sJ‚| ||¡|}nê|r°|j d¡d}|j d¡d} | | |¡} |j |¡} | | ƒ} t| dƒ}|dkr®| s®|j d¡d} |dd|j | ¡>7}nd|dus¼J‚d}t|tj ƒrÔd |}|j |  ||¡¡d} | | |¡} | ƒ}t|tj ƒ�r|d}|S) Nz_cffi_const_%sz long long*rzint(*)(long long*)z long longréz (*)(void)rY) Ú_load_known_int_constantr rªr|rƒÚintr²rbrrirZ)r rÁrCrPr6rÃrÄÚvaluer…r€r¬ÚpÚnegativeZ BLongLongZ fntypeextrarrrruµs2        zVGenericEngine._load_constantcCsDt|tjƒo| ¡}| ||||¡}t|||ƒt|ƒj |¡dSr) rbrržrŸrur~r[r/rj)r rCrPr6r8rÁrÉrrrÚ_loaded_gen_constantÑs z#VGenericEngine._loaded_gen_constantcCsœ|j}|dkr"|d|||fƒn|d|||fƒ|dƒ|d|ƒ|d|ƒ|dƒ|d|ƒ|d ƒ|d |dd …|fƒ|d ƒ|d ƒdS)Nrz& if ((%s) > 0 || (long)(%s) != %dL) {z1 if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {z char buf[64];z if ((%s) <= 0)z) sprintf(buf, "%%ld", (long)(%s));z elsez2 sprintf(buf, "%%lu", (unsigned long)(%s));z: sprintf(out_error, "%s has the real value %s, not %s",z "%s", buf, "%d");édz return -1;z })r")r rPrÉr+rrrrÀÚs&ÿ ÿ  ÿz(VGenericEngine._check_int_constant_valuecCsr|j d¡d}|j d¡d}| ||¡}|j |d¡}||ƒdkrn|j |¡}tjdkrft|dƒ}t|ƒ‚dS)Nzchar[]rz int(*)(char*)ér$zutf-8) r rªr|rƒÚstringrr*r r)r r6rÄr…r€r¬rÊÚerrorrrrrÇís     z'VGenericEngine._load_known_int_constantcCs| dd¡}d||fS)Nú$Z___D_z _cffi_e_%s_%s)Úreplace)r r,rPrrrÚ_enum_funcnameøs zVGenericEngine._enum_funcnameÚenumcCs’|jr"|jD]}| d|¡q dS| ||¡}|j |¡|j}|d|ƒ|dƒt|j|jƒD]\}}|  ||¡qb|dƒ|dƒ|ƒdS)NTr¼r`r½ra) r«Ú enumeratorsrerÓr rjr"rkÚ enumvaluesrÀ)r rCrPr,Ú enumeratorrÄr+Ú enumvaluerrrrµýs    z&VGenericEngine._generate_gen_enum_declcsLˆjr0‡‡‡fdd„ˆjDƒ}t|ƒˆ_dˆ_nˆ ||¡}ˆ ˆ|¡dS)Ncsg|]}ˆ dˆ|ˆ¡‘qS)T)ru)rArשr6r rCrrrDsÿz4VGenericEngine._loading_gen_enum..T)r«rÕrzrÖZpartial_resolvedrÓrÇ)r rCrPr6r,rÖrÄrrÙrr·sÿ  z VGenericEngine._loading_gen_enumcCs8t|j|jƒD]$\}}t|||ƒt|ƒj |¡qdSr)rkrÕrÖr~r[r/rj)r rCrPr6r8r×rØrrrr¹s zVGenericEngine._loaded_gen_enumcCs&|dkrd}n|}|jd||d�dS©Nz...T)rÃ)re)r rCrPrÃrrrÚ_generate_gen_macro_decl sz'VGenericEngine._generate_gen_macro_declcCsF|dkrd}n|}|jd||||d�}t|||ƒt|ƒj |¡dSrÚ)rur~r[r/rj)r rCrPr6r8rÃrÉrrrÚ_loaded_gen_macro)s ÿ z VGenericEngine._loaded_gen_macrocCs–t|tjƒrv| ¡rZ|j}d|f}|j |¡|d|ƒ|dƒ|d|fƒ|dƒt |j¡}|  d||¡nt |¡}|j d||dd�dS) Nú_cffi_sizeof_%szsize_t %s(void)r`z return sizeof(%s);raFr¾)rÂ) rbrr¡Úlength_is_unknownr"r rjrwÚitemre)r rCrPr+rÄÚtp_ptrrrrÚ_generate_gen_variable_decl6s      z*VGenericEngine._generate_gen_variable_declcs\t|tjƒrè| ¡rˆd|f}|j d¡d}| ||¡}|ƒ}|j |j¡} t ||j  | ¡ƒ\} } | dkr~t d||jfƒ‚|  | ¡}t  |j¡} | d| ||¡} |jdurÈ|j |¡}|j || ¡} t||| ƒt|ƒj |¡dSd|}|j | d|¡¡d}| ||¡}|ƒ‰‡fdd „}‡fd d „}tt|ƒ|t||ƒƒt|ƒj |¡dS) NrÝzsize_t(*)(void)rz/bad size: %r does not seem to be an array of %sFz _cffi_var_%sz *(*)(void)csˆdSr‚rr7©ZptrrrÚgettergsz3VGenericEngine._loaded_gen_variable..gettercs |ˆd<dSr‚r)r8rÉrârrÚsetterisz3VGenericEngine._loaded_gen_variable..setter)rbrr¡rÞr rªr|r{rßÚdivmodr²rZresolve_lengthrwrur¢Úcastr~r[r/rjrZÚproperty)r rCrPr6r8rÄr€r¬ÚsizeZ BItemTyper¢ÚrestràrÉZBArrayrãrärrârÚ_loaded_gen_variableHs>   ÿÿ        z#VGenericEngine._loaded_gen_variable)r)r)Nr»N)N)rÔ)rÔ)5r2r3r4Z _class_keyZ_gen_python_modulerrrrr"r.r;rHr(r<rVrXZ_generate_gen_typedef_declZ_loading_gen_typedefZ_loaded_gen_typedefrrZ_loading_gen_functionr�r}rŒr�r“r–r—r˜r‹rŽr’r¶r¸rºrerÅZ_loading_gen_constantrurÌrÀrÇrÓrµr·r¹rÛZ_loading_gen_macrorÜráZ_loading_gen_variablerêrrrrr sh    -$1" ÿ %      rad #include #include #include #include #include /* XXX for ssize_t on some platforms */ /* this block of #ifs should be kept exactly identical between c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py and cffi/_cffi_include.h */ #if defined(_MSC_VER) # include /* for alloca() */ # if _MSC_VER < 1600 /* MSVC < 2010 */ typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; typedef __int8 int_least8_t; typedef __int16 int_least16_t; typedef __int32 int_least32_t; typedef __int64 int_least64_t; typedef unsigned __int8 uint_least8_t; typedef unsigned __int16 uint_least16_t; typedef unsigned __int32 uint_least32_t; typedef unsigned __int64 uint_least64_t; typedef __int8 int_fast8_t; typedef __int16 int_fast16_t; typedef __int32 int_fast32_t; typedef __int64 int_fast64_t; typedef unsigned __int8 uint_fast8_t; typedef unsigned __int16 uint_fast16_t; typedef unsigned __int32 uint_fast32_t; typedef unsigned __int64 uint_fast64_t; typedef __int64 intmax_t; typedef unsigned __int64 uintmax_t; # else # include # endif # if _MSC_VER < 1800 /* MSVC < 2013 */ # ifndef __cplusplus typedef unsigned char _Bool; # endif # endif #else # include # if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux) # include # endif #endif ) rrr=rrrÐrÚobjectrr'rrrrÚs  g