3 MZ4h@sHddlZddlZddlZddlmZddlmZGdddeZdZ dS)N)model)VerificationErrorc@seZdZdZdZddZddZddZd d ZdZd d Z ddZ d[ddZ ddZ ddZ ddZddZddZeZeZeZddZeZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Z d5d6Z!d7d8Z"d9d:Z#d\d=d>Z$d?d@Z%eZ&d]dAdBZ'dCdDZ(dEdFZ)dGdHZ*dIdJZ+d^dLdMZ,d_dNdOZ-dPdQZ.dRdSZ/eZ0dTdUZ1dVdWZ2eZ3dXdYZ4d;S)`VGenericEnginegFcCs||_|j|_g|_i|_dS)N)verifierffiexport_symbols_struct_pending_verification)selfrr #/usr/lib64/python3.6/vengine_gen.py__init__szVGenericEngine.__init__cCs|jd|jdS)Nr ) setdefaultr )r kwdsr r r patch_extension_kwdssz#VGenericEngine.patch_extension_kwdscCsTxN|D]F}||}|dkr tj}x*|D]"}tjj||}tjj|r&|Sq&WqWdS)N)syspathosjoinisfile)r Z module_namerZ so_suffixesZ so_suffixbasenamedirnamefilenamer r r find_modules   zVGenericEngine.find_modulecCsdS)Nr )r r r r collect_types%szVGenericEngine.collect_typescCs|jj|ddS)N )Z_fwrite)r Zwhatr r r _prnt(szVGenericEngine._prntcCs`|j}|t||jj|jdtjdkr\tjdkr>d}nd}|jj}|d||fdS)NZdeclZwin32ZPyInit_Zinitzvoid %s%s(void) { } )r ) rcffimod_headerrZpreamble _generaterplatform version_infoZget_module_name)r prntprefixmodnamer r r write_source_to_f+s     z VGenericEngine.write_source_to_frcsjjj}tjjtjjj}|j||j dGfdddt j d}j d|d|S)NZloadingcs&eZdZZjZgZfddZdS)z/VGenericEngine.load_library..FFILibrarycsjS)N) _cffi_dir)r ) FFILibraryr r __dir__Tsz7VGenericEngine.load_library..FFILibrary.__dir__N)__name__ __module__ __qualname__Z_cffi_generic_modulerZ _cffi_ffir)r+r )r*moduler r r r*Psr*rZloaded)library) r_backendrrrcurdirrZmodulefilename load_library_loadtypes ModuleType)r flagsbackendrr0r )r*r/r r r3As  zVGenericEngine.load_librarycCs$dd|jjjjD}|j|S)NcSsg|]\}\}}||fqSr r ).0keytpZqualr r r ^sz4VGenericEngine._get_declarations..)rZ_parserZ _declarationsitemssort)r Zlstr r r _get_declarations]sz VGenericEngine._get_declarationscCsx|jD]\}}|jdd\}}yt|d||f}Wn tk rXtd|YnXy|||Wq tk r}ztj||WYdd}~Xq Xq WdS)N rz_generate_gen_%s_%sznot implemented in verify(): %r)r?splitgetattrAttributeErrorr Exceptionrattach_exception_info)r step_namenamer;kindrealnamemethoder r r r"cs zVGenericEngine._generatec Ksx||jD]p\}}|jdd\}}t|d||f}y||||f|Wq tk rx} ztj| |WYdd} ~ Xq Xq WdS)Nr@rz _%s_gen_%s)r?rArBrDrrE) r r/rFrrGr;rHrIrJrKr r r r4rs zVGenericEngine._loadcCsdS)Nr )r r;rGr r r _generate_nothing|sz VGenericEngine._generate_nothingcKsdS)Nr )r r;rGr/rr r r _loaded_noopszVGenericEngine._loaded_noopcsx|jr|jd||dS|j}t|j}g}xVGenericEngine._generate_gen_function_decl..rz *rz, voidz _cffi_f_%sr@z %s%s(%s)z result of %s{z*r = zreturn z %s%s(%s);})ellipsis_generate_gen_constrlenargs enumerate isinstancer StructOrUnionappendzipresultinsertrO void_typerr abiZVoidType)r r;rGr%ZnumargsZargnamesirPZ indirectionZarglistZtpresult wrappernamerbZfuncdeclZ result_coder )rRr _generate_gen_function_declsH      z*VGenericEngine._generate_gen_function_declcCs`|jr|jd|||}n&g}|}tdd|jDsDt|jtjrg}xDt|jD]6\} } t| tjrtj | } |j | | f|j | qTW|j} t| tjr| j dkrt d| j ftj | } |jd| |jdd| ftj} tjt|| |j}|jj|} d|} |j| | }x"|D]\} } |j|| | |}q"Wt|||t|jj |dS)NFcss|]}t|tjVqdS)N)r[rr\)r9typr r r sz6VGenericEngine._loaded_gen_function..z*'%s' is used as result type, but is opaquerr_z _cffi_f_%s)rV_load_constantanyrYr[r_rr\rZ PointerTyper]Zfldtypes TypeError _get_c_namer`raZFunctionPtrTypetupler_get_cached_btype load_function_make_struct_wrappersetattrrPr))r r;rGr/r0Z newfunctionZ indirectionsbase_tpZ indirect_argsrcrfZindirect_resultBFuncrdr r r _loaded_gen_functions>             z#VGenericEngine._loaded_gen_functioncsP|jj|jj|dkr4|jfdd}nfdd}||_|S)Nr_cs j}|f||dS)Nr)new)rYres)BTyperoldfuncr r newfuncs z4VGenericEngine._make_struct_wrapper..newfunccs6|dj|f|dd}|S)Nr)Znewp)rY)rwr8rcrxr r rys.)rr1rnZ_cffi_base_type)r rxrcr;rrryr )rwr8rrcrxr rps z#VGenericEngine._make_struct_wrappercCs|j|d|dS)Nstruct)_generate_struct_or_union_decl)r r;rGr r r _generate_gen_struct_declsz(VGenericEngine._generate_gen_struct_declcCs|j|d||dS)Nrz)_loading_struct_or_union)r r;rGr/r r r _loading_gen_structsz"VGenericEngine._loading_gen_structcKs|j|dS)N)_loaded_struct_or_union)r r;rGr/rr r r _loaded_gen_structsz!VGenericEngine._loaded_gen_structcCs|j|d|dS)Nunion)r{)r r;rGr r r _generate_gen_union_declsz'VGenericEngine._generate_gen_union_declcCs|j|d||dS)Nr)r})r r;rGr/r r r _loading_gen_unionsz!VGenericEngine._loading_gen_unioncKs|j|dS)N)r)r r;rGr/rr r r _loaded_gen_unionsz VGenericEngine._loaded_gen_unionc Cs|jdkrdSd||f}d||f}d||fj}|j}|d||f|d|d|dx|jD]\}} } } t| tjr| js| dkr|d |qny$|d | jd d || d |fWqnt k r} z|dt | WYdd} ~ XqnXqnW|d|j j ||d|f|d|d||d|d||dxt|jD]h\}} } } | dkrvq\|d||ft| tj r| jdkr|d| jn|d||fq\W|d|d|d|d|d|f|d|dS)Nz_cffi_check_%s_%sz_cffi_layout_%s_%sz%s %szstatic void %s(%s *p)rTz8 /* 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 */rUzintptr_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);)fldnamesstripr enumfieldsr[r PrimitiveTypeis_integer_typerOrstrr r] ArrayTypelengthrl) r r;r&rGZ checkfuncnamelayoutfuncnamecnamer%fnameftypefbitsizefqualrKr r r r{sT    &    z-VGenericEngine._generate_struct_or_union_declcCs|jdkrdSd||f}|jjdd}|j||}g}d} x(|| } | dkrRP|j| | d7} q@Wt|tjr|jr|d} |d} |ddd} |ddd}|j | || | f|_ nd||fj }||f|j |<dS)Nz_cffi_layout_%s_%szintptr_t(*)(intptr_t)rrr z%s %s) rr_typeof_lockedror]r[rr\partialZ force_flattenZ fixedlayoutrr )r r;r&rGr/rrsfunctionlayoutZnumxZ totalsizeZtotalalignmentZfieldofsZ fieldsizerr r r r}7s,     z'VGenericEngine._loading_struct_or_unionc Cs|jdkrdS|jj|||jkrdd}|j}|j|}|jj|\}}||d|j|d||d|j|dd}x|jD]v\}} } } | dkrq||||j||d|f||ddkr|j| } |||d|j| d |f|d7}qWdS) NcSs||krtd|||fdS)Nz'%s (we have %d, but C compiler says %d))r)Z realvalueZ expectedvaluemsgr r r checkZsz5VGenericEngine._loaded_struct_or_union..checkrzwrong total sizerzwrong total alignmentrzwrong offset for field %rzwrong size for field %r) rrrnr popsizeofZalignofrZoffsetof) r r;rrZBStructrrrcrrrrZBFieldr r r rSs,        z&VGenericEngine._loaded_struct_or_unioncCs.t|tjr|j||dn|j|d|dS)Nr)r[rEnumType_generate_gen_enum_declr{)r r;rGr r r _generate_gen_anonymous_declus z+VGenericEngine._generate_gen_anonymous_declcCs2t|tjr|j|||dn|j|d||dS)Nr)r[rr_loading_gen_enumr})r r;rGr/r r r _loading_gen_anonymous{s z%VGenericEngine._loading_gen_anonymouscKs.t|tjr |j|||f|n |j|dS)N)r[rr_loaded_gen_enumr)r r;rGr/rr r r _loaded_gen_anonymouss z$VGenericEngine._loaded_gen_anonymousNconstc Cs |j}d||f}|jj||dk rX|d||d|j|||d|dn|r|d||d|d|f|d|f|dnj|d krd }nd }d } |d krt|tjrd } d }||jd| |f||d|d||f|d|dS)Nz _cffi_%s_%szint %s(char *out_error)rTz return 0;rUzint %s(long long *out_value)z *out_value = (long long)(%s);z return (%s) <= 0;var&rrzconst *z %s%s(void)z return (%s%s);)rr r]_check_int_constant_valuer[rr\rO) r is_intrGr;category check_valuer%funcnameZ ampersandZextrar r r rWs6       z"VGenericEngine._generate_gen_constcCs&t|tjo|j}|j|||dS)N)r[rrrrW)r r;rGrr r r _generate_gen_constant_declsz*VGenericEngine._generate_gen_constant_declcCsd|}|dk r"|j|||}n|r|jjdd}|jjdd} |j| |} |jj|} | | } t| d}|dkr| r|jjdd} |dd|jj| >7}nXd}t|tj rd |}|jj|j ||d} |j| |} | }t|tj r|d}|S) Nz_cffi_const_%sz long long*rzint(*)(long long*)z long longrz (*)(void)rN) _load_known_int_constantrrroruintrr[rr\rO)r rr;rGr/rrvaluerwrsrpnegativeZ BLongLongZ fntypeextrar r r rhs.      zVGenericEngine._load_constantcCsDt|tjo|j}|j||||}t|||t|jj|dS)N) r[rrrrhrqrPr)r])r r;rGr/r0rrr r r _loaded_gen_constants z#VGenericEngine._loaded_gen_constantcCs|j}|dkr"|d|||fn|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 rGrr%r r r rs   z(VGenericEngine._check_int_constant_valuecCsr|jjdd}|jjdd}|j||}|jj|d}||dkrn|jj|}tjdkrft|d}t|dS)Nzchar[]rz int(*)(char*)r zutf-8)r ) rrrorustringrr$rr)r r/rrwrsrrerrorr r r rs     z'VGenericEngine._load_known_int_constantcCs|jdd}d||fS)N$Z___D_z _cffi_e_%s_%s)replace)r r&rGr r r _enum_funcnames zVGenericEngine._enum_funcnameenumcCs|jr&x|jD]}|jd|qWdS|j||}|jj||j}|d||dx&t|j|jD]\}}|j ||qhW|d|d|dS)NTzint %s(char *out_error)rTz return 0;rU) r enumeratorsrWrr r]rr^ enumvaluesr)r r;rGr& enumeratorrr% enumvaluer r r rs    z&VGenericEngine._generate_gen_enum_declcsLjr0fddjD}t|_d_nj||}j|dS)Ncsg|]}jd|qS)T)rh)r9r)r/r r;r r r<sz4VGenericEngine._loading_gen_enum..T)rrrmrZpartial_resolvedrr)r r;rGr/r&rrr )r/r r;r rs   z VGenericEngine._loading_gen_enumcCs<x6t|j|jD]$\}}t|||t|jj|qWdS)N)r^rrrqrPr)r])r r;rGr/r0rrr r r rs zVGenericEngine._loaded_gen_enumcCs&|dkrd}n|}|jd||ddS)Nz...T)r)rW)r r;rGrr r r _generate_gen_macro_decl sz'VGenericEngine._generate_gen_macro_declcCsF|dkrd}n|}|jd||||d}t|||t|jj|dS)Nz...T)r)rhrqrPr)r])r r;rGr/r0rrr r r _loaded_gen_macro)s  z VGenericEngine._loaded_gen_macrocCst|tjrx|jdkr\|j}d|f}|jj||d||d|d|f|dtj|j}|j d||ntj|}|j d||dd dS) Nz...z_cffi_sizeof_%szsize_t %s(void)rTz return sizeof(%s);rUFr)r) r[rrrrr r]rjitemrW)r r;rGr%rtp_ptrr r r _generate_gen_variable_decl6s       z*VGenericEngine._generate_gen_variable_declcs^t|tjr|jdkrd|f}|jjdd}|j||}|}|jj|j} t ||jj | \} } | dkrt d||jf|j | }tj |j} |jd| ||} |jdk r|jj|}|jj|| } t||| t|jj|dSd|}|jj|jd|d}|j||}|fd d }fd d }tt||t||t|jj|dS) Nz...z_cffi_sizeof_%szsize_t(*)(void)rz/bad size: %r does not seem to be an array of %sFz _cffi_var_%sz *(*)(void)csdS)Nrr )r0)ptrr r gettergsz3VGenericEngine._loaded_gen_variable..gettercs |d<dS)Nrr )r0r)rr r setterisz3VGenericEngine._loaded_gen_variable..setter)r[rrrrrrornrdivmodrrZresolve_lengthrjrhcastrqrPr)r]rOproperty)r r;rGr/r0rrsrsizeZ BItemTyperrestrrZBArrayrrr )rr _loaded_gen_variableHs:            z#VGenericEngine._loaded_gen_variable)r)r)NrN)N)r)r)5r,r-r.Z _class_keyZ_gen_python_modulerrrrrr(r3r?r"r4rLrMZ_generate_gen_typedef_declZ_loading_gen_typedefZ_loaded_gen_typedefreZ_loading_gen_functionrtrpr|r~rrrrr{r}rrrrrWrZ_loading_gen_constantrhrrrrrrrrZ_loading_gen_macrorrZ_loading_gen_variablerr r r r r sf    -$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 ) rrr5rrrrobjectrr!r r r r s