a <`8@s0ddlZddlZddlZddlmZmZddlmZddlTdZ dZ dZ ej d kpdej d kpdej d kZGd d d ZGdddZGdddZGdddZGdddZGdddZej dkrejZnGdddejZddZd1ddZd2d d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd3d/d0Z dS)4N) ffiplatformmodel)VerificationError)*i&i'i(win32)r)rc@s&eZdZd ddZddZddZdS) GlobalExprrcCs"||_||_||_||_||_dSN)nameaddresstype_opsize check_value)selfr r rrrr5/usr/lib64/python3.9/site-packages/cffi/recompiler.py__init__s zGlobalExpr.__init__cCsd|j|j|j|jfS)Nz' { "%s", (void *)%s, %s, (void *)%s },)r r r as_c_exprrrrrrrszGlobalExpr.as_c_exprcCsd|j|j|jfS)Nz b'%s%s',%d)ras_python_bytesr rrrrras_python_exprszGlobalExpr.as_python_exprN)rr__name__ __module__ __qualname__rrrrrrrr s r c@s,eZdZddZddZddZddZd S) FieldExprcCs"||_||_||_||_||_dSr )r field_offset field_sizefbitsize field_type_op)rr rrr r!rrrrs zFieldExpr.__init__cCs>dt|j}d|j|jfd||jfd||jfS)N z { "%s", %s, z %s %s, z %s %s },)lenr rrr!r)rspacesrrrr&s  zFieldExpr.as_c_exprcCstdSr )NotImplementedErrorrrrrr,szFieldExpr.as_python_exprcCsD|jjtkrd}n|jjtkr*t|j}ntd|j||jfS)Nz b'%s%s%s') r!opOP_NOOP OP_BITFIELDformat_four_bytesr r%rr )rZ size_exprrrras_field_python_expr/s    zFieldExpr.as_field_python_exprN)rrrrrrr+rrrrrsrc@s$eZdZddZddZddZdS)StructUnionExprc Cs4||_||_||_||_||_||_||_||_dSr )r type_indexflagsr alignmentcommentfirst_field_indexc_fields) rr r-r.rr/r0r1r2rrrr;szStructUnionExpr.__init__cCsPd|j|j|jfd|j|jfd|jt|jf|jrFd|jnddS)Nz { "%s", %d, %s,z %s, %s, z%d, %d z /* %s */ r&z},) r r-r.rr/r1r#r2r0rrrrrFszStructUnionExpr.as_c_exprcCs>t|jt}dd|jD}dt|jt||jd|fS)NcSsg|] }|qSr)r+).0Zc_fieldrrr Osz2StructUnionExpr.as_python_expr..z(b'%s%s%s',%s),)evalr.ZG_FLAGSr2r*r-r join)rr.Z fields_exprrrrrMs zStructUnionExpr.as_python_exprNrrrrrr,:s r,c@s$eZdZddZddZddZdS)EnumExprcCs"||_||_||_||_||_dSr r r-rsignedallenums)rr r-rr:r;rrrrXs zEnumExpr.__init__cCsd|j|j|j|j|jfS)Nz1 { "%s", %d, _cffi_prim_int(%s, %s), "%s" },r9rrrrr_s  zEnumExpr.as_c_exprc Cs@ttttttttd|j|j f}dt |j t ||j |j fS)N))rr)rr)r)r<r)r)r=r)r)r>rzb'%s%s%s\x00%s')Z PRIM_UINT8Z PRIM_INT8Z PRIM_UINT16Z PRIM_INT16Z PRIM_UINT32Z PRIM_INT32Z PRIM_UINT64Z PRIM_INT64rr:r*r-r r;)r prim_indexrrrrds  zEnumExpr.as_python_exprNrrrrrr8Wsr8c@s$eZdZddZddZddZdS) TypenameExprcCs||_||_dSr r r-)rr r-rrrrpszTypenameExpr.__init__cCsd|j|jfS)Nz { "%s", %d },rArrrrrtszTypenameExpr.as_c_exprcCsdt|j|jfS)Nzb'%s%s')r*r-r rrrrrwszTypenameExpr.as_python_exprNrrrrrr@osr@c@seZdZdZdddZddZddZd d Zd d Zd dZ gdZ ddZ dddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!dd@dAZ"dBdCZ#dDdEZ$dFdGZ%e%Z&dHdIZ'dJdKZ(e(Z)dLdMZ*e*Z+dNdOZ,dPdQZ-dRdSZ.ddUdVZ/dWdXZ0dYdZZ1d[d\Z2d]d^Z3dd_d`Z4dadbZ5dcddZ6dedfZ7dgdhZ8didjZ9dkdlZ:dmdnZ;dodpZe>Z?Z@dudvZAdwdxZBdydzZCd{d|ZDd}d~ZEeEZFZGddZHddZIddZJddZKddZLddZMddZNeNZOeNZPddZQddZRddZSeSZTddZUd?S) RecompilerrFcCs||_||_||_t|_dSr )ffi module_nametarget_is_python VERSION_BASE_version)rrCrDrErrrrszRecompiler.__init__cCst|j||_dSr )maxrG)rZverrrr needs_versionszRecompiler.needs_versioncCsi|_|dt|jtd}g|_|D]h}|jr(t|j|j|<|j||jD].}|j|durvt|j|j|<|j|qT|jdq(|D]P}|js|j|durt|j|j|<|j||j r|j dur|jdqi|_ i|_ |D]4}t |tjrd|j |<qt |tjrd|j |<qtt|j dddD]\}}||j |<qDtt|j dddD]\}}||j |<qp|D](}t|d|jj}|||j|q|jD]}qt|j|_dS) NZ collecttypekeyZENDZLENcSs|jSr r tprrrz/Recompiler.collect_type_table..cSs|jSr rLrMrrrrOrPZ_emit_bytecode_) _typesdict _generatesortedstr cffi_typesZis_raw_functionr#appendargsZ is_array_typelength_struct_unions_enums isinstancer StructOrUnionEnumType enumerategetattr __class__rtuple)rZ all_declsrNtp1imethodr'rrrcollect_type_tablesP        zRecompiler.collect_type_tablecCs|j }||Sr )rE enumfields)rrNZexpand_anonymous_struct_unionrrr _enum_fieldsszRecompiler._enum_fieldscCst|tjs.t|tr*|D]}||qdS||jvrd|j|<t|tjr^||nnt|tjr|j dur||j j j vr| |D] \}}}}|||||qn|D]\}}||qdSr )r[rZBaseTypeByIdentityra_do_collect_typerQFunctionPtrTypeas_raw_functionr\fldtypesrC_parser_included_declarationsrg _field_typeZ _get_items)rrNxZname1rb_rrrrhs"         zRecompiler._do_collect_typec Cs|jjj}t|D]\}\}}|dd\}}zt|d||f}Wntyftd|Yn0z||_ |||Wqt y} zt | |WYd} ~ qd} ~ 00qdS)Nr"rz_generate_cpy_%s_%sz"not implemented in recompile(): %r) rCrlZ _declarationsitemsrSsplitr_AttributeErrorr_current_quals ExceptionrZattach_exception_info) r step_namelstr rNqualskindZrealnamerderrrrRs"    zRecompiler._generate)globalfield struct_unionenumtypenamecCsi|_|jD]}g|j|<q t|_|d||jD]4}|j|}|dkrb|jdddt||j|<q<|jd}|j D]\}}q|jd}|j D]\}}qdS)Nctxr|cSs|jSr rL)entryrrrrOrPz0Recompiler.collect_step_tables..rJr}r~) _lsts ALL_STEPSset_seen_struct_unionsrR_add_missing_struct_unionssortrarYrqrZ)rrvrwrNrcrrrcollect_step_tabless$       zRecompiler.collect_step_tablesr&cCs|j|ddS)N )_fwrite)rZwhatrrr_prntszRecompiler._prntcCs"|jr||n |||dSr )rEwrite_py_source_to_fwrite_c_source_to_f)rfpreamblerrrwrite_source_to_fs zRecompiler.write_source_to_fcCs0ttjtjt|d}|}||S)Nr)openospathr7dirname__file__ readlinesclose)rfilenameglinesrrr_rel_readlines!szRecompiler._rel_readlinesc Csl||_|j}|jjdur |dts,|d|d}|d}|d|||d<|d||j dd }|jjdur<|d |jf|d | |jj|d |d |d|f|d|d|f|d|d|f|d|d}|d}|d|||d<|d|| t |d|||||d||dt dd|jD}t|jD]>\}}d} ||vrd||} |d||| fq|js|d|d|t|_|di} |jD]`} |j| } t| | | <| | d kr |d!| | f| D]} || qF|d|q |jjr|d"|jjD]d}z|jdd#\}}Wn&tytd$|j|fYn0|durtd%|d&|fq|d'|d||d(|d)|jD].} | | d kr8|d*| n |d+| q|jD]$} | d,krN|d-| | | fqN|jjr|d.n|d/|d0t|jfd }|jr|dO}|d1||d||d2|d3|d||d |d4|d5|f|d6|jr6|d7|d8|d9|d:|j|d;|d<|d=|d|d>|d?|d@|dA|dB|f|dC|dD|f|dE|dE|d|d4|dF|f|d6|dG|j|jf|d>|d|d4|dH|f|d6|dI|j|jf|d>|d||d2|dJ|dd|_dS)KNz#define _CFFI_USE_EMBEDDINGz#define _CFFI_NO_LIMITED_APIz_cffi_include.hz#include "parse_c_type.h" zparse_c_type.hrr&.z#define _CFFI_MODULE_NAME "%s"z1static const char _CFFI_PYTHON_STARTUP_CODE[] = {z0 };z#ifdef PYPY_VERSIONz5# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_%sz#elif PY_MAJOR_VERSION >= 3z-# define _CFFI_PYTHON_STARTUP_FUNC PyInit_%s#elsez*# define _CFFI_PYTHON_STARTUP_FUNC init%s#endifz _embedding.hz#include "_cffi_errors.h" z_cffi_errors.hz>/************************************************************/zstatic void *_cffi_types[] = {cSsg|]\}}||fqSrrr3rNrcrrrr4WrPz2Recompiler.write_c_source_to_f..z // z/* %2d */ %s,%sz 0z};declrz.static const struct _cffi_%s_s _cffi_%ss[] = {z.static const char * const _cffi_includes[] = {r<Qffi object %r includes %r, but the latter has not been prepared with set_source()zMnot implemented yet: ffi.include() of a Python-based ffi inside a C-based ffiz "%s",z NULLz?static const struct _cffi_type_context_s _cffi_type_context = {z _cffi_types,z _cffi_%ss,z NULL, /* no %ss */r|z %d, /* num_%ss */z _cffi_includes,z NULL, /* no includes */z %d, /* num_types */z %d, /* flags */z#ifdef __GNUC__z?# pragma GCC visibility push(default) /* for -fvisibility= */ZPyMODINIT_FUNCz"_cffi_pypyinit_%s(const void *p[]){z% if (((intptr_t)p[0]) >= 0x0A03) {zQ _cffi_call_python_org = (void(*)(struct _cffi_externpy_s *, char *))p[1];z }z p[0] = (const void *)0x%x;z p[1] = &_cffi_type_context;z#if PY_MAJOR_VERSION >= 3 return NULL;}z# ifdef _MSC_VERz PyMODINIT_FUNCz# if PY_MAJOR_VERSION >= 3z% PyInit_%s(void) { return NULL; }z# elsez init%s(void) { }z# endifzPyInit_%s(void)z5 return _cffi_init("%s", 0x%x, &_cffi_type_context);z init%s(void)z. _cffi_init("%s", 0x%x, &_cffi_type_context);z# pragma GCC visibility pop) rrrC _embeddingUSE_LIMITED_APIrindexr7rDrr_print_string_literal_in_arrayrIVERSION_EMBEDDEDdictrQrqr^rU _get_c_namerr_seen_constantsrRrrr#_included_ffis_assigned_sourcersr _num_externpyrG)rrrprntrrcZbase_module_nametypeindex2typer'r0Znumsrvrwrffi_to_includeincluded_module_nameincluded_sourcer.rrrr's2                       zRecompiler.write_c_source_to_fcsbt|trd|fSt|ttfrZfdd|D}t|dkrJ|ddd|fS|S)Nzb'%s'csg|]}|qSr)_to_py)r3itemrrrr4rPz%Recompiler._to_py..rr&z(%s)r5)r[rTlistrar#rVr7r)rroZreprrrrs    zRecompiler._to_pyc Cs||_|j}|d|dt|jjp(d}t|D]l}|jj|}z|jdd\}}Wn$ty~td|j|fYn0|durtd|d||fq4||d|j f|d |j fd|_ t |j |_ d d |j D}|d | d |ftdd |jD} |jD]>} |j| } t| dkr"| dkr"|d| | | fq"|dkr|dddd t|Df|ddS)Nz# auto-generated filezimport _cffi_backendrr<rzMnot implemented yet: ffi.include() of a C-based ffi inside a Python-based ffizfrom %s import ffi as _ffi%dzffi = _cffi_backend.FFI('%s',z _version = 0x%x,cSsg|] }|qSr)r)r3r'rrrr4rPz3Recompiler.write_py_source_to_f..z _types = %s,r&cSsg|]\}}||fqSrrrrrrr4rPrr|z _%ss = %s,z _includes = (%s,),, cSsg|] }d|qS)z_ffi%drr3rcrrrr4 rP))rrr#rCrrangerrsrrDrGrarUrr7rrQrqrr) rrrZ num_includesrcrrrZ types_lstrrvrwrrrrsN         zRecompiler.write_py_source_to_fcCs |j|Sr )rQ)rtyperrr _gettypenumszRecompiler._gettypenumc Csnd}t|tjr|s|r:|jdkr:d}d|j}nPt|tjrXd|df}n2|d}d||jddf}|d vr| t d }nt|tj r| ||||dSt|tj st|tjr|d ||||f|d |dSt|tjr$d |d}d||}d}nt||d||||f|d||d|f|d |dS)Nr&_BoolZ_cffi_to_c_intz, %sz(%s)_cffi_to_c_doublez(%s)_cffi_to_c_%sr"rpZchar16_tZchar32_tz-1z6 if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)z %s;z(%s)_cffi_to_c_pointerz, _cffi_type(%d)ZNULLz %s = %s(%s%s);z' if (%s == (%s)%s && PyErr_Occurred()))r[rBasePrimitiveTypeis_complex_typeis_integer_typer UnknownFloatType get_c_namereplacerIVERSION_CHAR16CHAR32 PointerType"_convert_funcarg_to_c_ptr_or_arrayZStructOrUnionOrEnumrrrir%) rrNfromvartovarerrcodeZextraargZ convertercnameZerrvaluerrr_convert_funcarg_to_csJ         z Recompiler._convert_funcarg_to_ccCs.t|tjr*|d|d|ddS)NzPy_ssize_t datasizez-struct _cffi_freeme_s *large_args_free = NULLzIif (large_args_free != NULL) _cffi_free_array_arguments(large_args_free);)r[rradd)rrN localvars freelinesrrr_extra_local_variablesCs   z!Recompiler._extra_local_variablescCs|d|d||||f|d|d||df|d||||f|d|d||d dS) Nz1 datasize = _cffi_prepare_pointer_call_argument(z( _cffi_type(%d), %s, (char **)&%s);z if (datasize != 0) {zI %s = ((size_t)datasize) <= 640 ? (%s)alloca((size_t)datasize) : NULL;r&zF if (_cffi_convert_array_argument(_cffi_type(%d), %s, (char **)&%s,z, datasize, &large_args_free) < 0)z %s;z })rrr)rrNrrrrrrrJs     z-Recompiler._convert_funcarg_to_c_ptr_or_arraycCsJt|tjr|r,|jdkr,d||jfSt|tjrBd|fS|jdkr|s|jdd}|dvrt|t d||fSd || |fSnt|tj tj frd || |fSt|tj rd || t |jfSt|tjr|jdur td ||fd || |fSt|tjr>d || |fSt|dS) Nrz_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s) long doubler"rprz_cffi_from_c_%s(%s)z/_cffi_from_c_deref((char *)&%s, _cffi_type(%d))z0_cffi_from_c_pointer((char *)%s, _cffi_type(%d))z!'%s' is used as %s, but is opaquez0_cffi_from_c_struct((char *)&%s, _cffi_type(%d)))r[rrrr rrrrIrrrri ArrayTyperr\Zfldnames TypeErrorrr]r%)rrNvarcontextrrrr_convert_expr_from_cXsD           zRecompiler._convert_expr_from_ccCs||d|fS)Nz (*(%s *)0)) _global_typerrNr rrr _typedef_type{szRecompiler._typedef_typecCs||||dSr )rhrrrrr!_generate_cpy_typedef_collecttype~sz,Recompiler._generate_cpy_typedef_collecttypecCsdSr rrrrr_generate_cpy_typedef_declsz%Recompiler._generate_cpy_typedef_declcCs$|j|}|jdt||dS)Nr)rQrrVr@)rrNr r-rrr _typedef_ctxs zRecompiler._typedef_ctxcCsf|||}|||t|dddkr<|j||jddn&t|tjrb|j|j|jj|j|ddS)NoriginZ unknown_type) approxname)r named_ptr) rrr_ _struct_ctxr r[rZNamedPointerTypetotyperrrr_generate_cpy_typedef_ctxs   z$Recompiler._generate_cpy_typedef_ctxcCs(|||jr$|js$||dSr )rhrjellipsisrErrrr"_generate_cpy_function_collecttypes z-Recompiler._generate_cpy_function_collecttypec Cs|jr|||dS|j}t|j}|dkr4d}n|dkrBd}nd}g}g}d|}t|jD],\} } || d| ||d| q`d |} | pd } |j r|j d } nd } d | || f} |d|j | f|dd |}d}t |j t j rd }|d|||f|d|d|d|d||f|dd|}t|jD]&\} } | d| |}|d|qXt}t}|jD]} || ||qt|D]}|d|fqt |j t j sd}d|}d|j d|}|||dnd}d }t|jdkr~tt|j}|D]} |d| q0||d|t|t|d dd|Df|d|t|jD](\} } || d | d| d!|q|d"|d#d$dtt|jD}d |}|d%|||f|d&|d'||d(|dkr,|d)|rl|d*||j d+d,|D]}|d-|qN|d.n(|D]}|d-|qp|d/|d0|d|d1d2d3}d4}g}g}d|}t|jD]P\} } d }|| rd5}d6}| d7|| f|}|||d8|| fq|j }||r^d|}|d9|}|d|t j}d}d:}d6}|rd |} | pvd } d;| || f} |d|| f|d|r||d |}|d%|||f|r|d<|dn|d=||f|d>|dS)?NrZnoargrZarg0rWargument of %sz x%dx%drvoidr"r&z%s_cffi_d_%s(%s)z static %srzreturn z %s%s(%s);rz#ifndef PYPY_VERSIONzstatic PyObject *z(_cffi_f_%s(PyObject *self, PyObject *%s)z %s;z result = result of %sz resultz PyObject *pyresult;z PyObject *arg%d;z1 if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))cSsg|] }d|qS)z&arg%drrrrrr4rPz:Recompiler._generate_cpy_function_decl..rzarg%dz return NULLz Py_BEGIN_ALLOW_THREADSz _cffi_restore_errno();cSsg|] }d|qS)rrrrrrr4rPz { %s%s(%s); }z _cffi_save_errno();z Py_END_ALLOW_THREADSz (void)self; /* unused */z (void)noarg; /* unused */z pyresult = %s;resultz result typez z return pyresult;z Py_INCREF(Py_None);z return Py_None;rcSs t|tjpt|tjo|Sr )r[rr\ PrimitiveTyper)rrrrneed_indirections  z@Recompiler._generate_cpy_function_decl..need_indirectionFrTz %sx%dz%sx%dz *resultz *result = z%s_cffi_f_%s(%s)z return result;z# define _cffi_f_%s _cffi_d_%sr)r_generate_cpy_constant_declrr#rWr^rVrr7abirr[rVoidTyperrrSrrrinsertZ void_type)rrNr rnumargsargname argumentsZcall_argumentsrrcrrepr_argumentsrname_and_argumentsZ result_codeargrrrZ result_declrngZfreeliner differenceZ indirectionZ tp_resultrrr_generate_cpy_function_decls                     z&Recompiler._generate_cpy_function_declcCs|jr|js|||dS|j|}t|j}|jr@t}n |dkrNt}n|dkr\t }nt }|j d t |d|t||d|ddS)Nrrr{z _cffi_f_%sz _cffi_d_%s)r)rrE_generate_cpy_constant_ctxrQrjr#rWZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_VrrVr CffiOp)rrNr r-rZ meth_kindrrr_generate_cpy_function_ctx;s$     z%Recompiler._generate_cpy_function_ctxcCsTt|tjrP|j}|dkr0|d}d||f}||d||j}t||}|S)N...rz_cffi_array_len(((%s)0)->%s)%s[0])r[rrrXrrnr)rZ tp_struct field_nameZtp_field actual_lengthZptr_struct_nametp_itemrrrrnQs    zRecompiler._field_typecCs,|||jr(|D]}||qdSr )rhrEanonymous_struct_fields_struct_collecttype)rrNfldtyperrrr]s  zRecompiler._struct_collecttypec CsB|jdurdS|j}d|f}|d|d||f|d|d|d||D]\}}}} z|sv|dkr|dkr|d |||fWqXt|tjr|jdus|jd kr|j}|d }q|d |j d d|| d|fWqXt y} z|dt | WYd} ~ qXd} ~ 00qX|d|d||f|dS)Nz_cffi_checkfld_%sZ_CFFI_UNUSED_FNzstatic void %s(%s *p)rz8 /* only to generate compile-time warnings or errors */z (void)p;rr&z> (void)((p->%s) | 0); /* check that '%s.%s' is an integer */rz[0]z { %s = &p->%s; (void)tmp; }z*tmpzfield %rrxz /* %s */rz(struct _cffi_align_%s { char x; %s y; };) rkrrgrr[rrrXrrrrT) rrNrrrZ checkfuncnamefnameZftyper fqualrzrrr _struct_decldsB     (zRecompiler._struct_declNc Cs|j|}d}g}t|tjr(|d|jdur@|dd}||jjjvr|dusd||jjjvr|jdurpn|j st | rn |d|j r|j dkrt d||j f|dn|dd }d |pd }g}|durht||} | D]\} } } } ||| | } || d |j| ft}| d krFt}d| }nL|dusjt| tjrp| jdurpd}n"d|dur|dn|j| f}|dus| d krd}n,|durd|j| f}nd|d| f}|t| ||| t||j| qt|jd}|jd||dur2d}d}d}n4|durNd|jf}d}nd|f}d|f}d}nd}d}d}|}|jdt|j||||||||j |dS)NZ _CFFI_F_UNIONZ_CFFI_F_OPAQUEZopaqueZ_CFFI_F_CHECK_FIELDSrz%r is declared with 'pack=%r'; only 0 or 1 are supported in API mode (try to use "...;", which does not require a 'pack' declaration)Z_CFFI_F_PACKEDZ_CFFI_F_EXTERNALZexternal|0z field '%s.%s'rz %d /* bits */z (size_t)-1zsizeof(((%s)0)->%s)rz"((char *)&((%s)0)->%s) - (char *)0zoffsetof(%s, %s)r&r|z (size_t)-2Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */ sizeof(%s)z"offsetof(struct _cffi_align_%s, y)rr})!rQr[rZ UnionTyperVrkrCrlrmpartialanyrZpackedr%r7rrgrn_check_not_opaquer r(r)rrXrrrr#rextendr,rr)rrNrrrr-Zreason_for_not_expandingr.r2rfZfldnamerr r r'roffsetr1Zalignr0rrrrs                         zRecompiler._struct_ctxcCs:t|tjr|j}qt|tjr6|jdur6td|dS)Nz0%s is of an opaque type (not declared in cdef()))r[rrrr\rkr)rrNlocationrrrrs  zRecompiler._check_not_opaquecCst|j}|jddd|D]\}}||jvr"|jrHtd|f|jdrv|jdd rv|jdd}n4|jdkr|j dkrd}| |dntd |f| |d|q"dS) NcSs|dS)Nrr)Ztp_orderrrrrOrPz7Recompiler._add_missing_struct_unions..rJzDinternal inconsistency: %r is partial but was not seen at this point$rZ_IO_FILEFILEzinternal inconsistency: %r) rrYrqrrrr%r startswithisdigitZ forcenamerr)rrwrNorderrrrrrs"  z%Recompiler._add_missing_struct_unionscCs||dSr )rrrrr _generate_cpy_struct_collecttypesz+Recompiler._generate_cpy_struct_collecttypecCs2|d}d|vr"||ddfS|d|fSdS)Nr&r"rp)rr)rrNrrrr _struct_namess zRecompiler._struct_namescCs|j|g||RdSr )r rrrrr_generate_cpy_struct_declsz$Recompiler._generate_cpy_struct_declcCs|j|g||RdSr )rrrrrr_generate_cpy_struct_ctx sz#Recompiler._generate_cpy_struct_ctxcCs(t|tjr|||n ||dSr )r[rr]_generate_cpy_enum_collecttyperrrrr#_generate_cpy_anonymous_collecttypes z.Recompiler._generate_cpy_anonymous_collecttypecCs.t|tjr||n|||d|dSNZtypedef_)r[rr]_generate_cpy_enum_declr rrrr_generate_cpy_anonymous_decls  z'Recompiler._generate_cpy_anonymous_declcCs0t|tjr|||n|||d|dSr!)r[rr] _enum_ctxrrrrr_generate_cpy_anonymous_ctxs z&Recompiler._generate_cpy_anonymous_ctxconstcCs||f|jvrtd||f|j||f|j}d||f}|r|d||d|d|f|d||f|dur|dkrd|f}|d |f|d |d |d n2|d ||d|d|d|f|d |dS)Nz duplicate declaration of %s '%s'z _cffi_%s_%sz$static int %s(unsigned long long *o)rz int n = (%s) <= 0;zI *o = (unsigned long long)((%s) | 0); /* check that %s is an integer */rz%dUz" if (!_cffi_check_int(*o, n, %s))z n |= 2;z return n;rzstatic void %s(char *o)z *(%s)o = %s;r)rrrrr)ris_intr rNcategoryrrfuncnamerrr_generate_cpy_const&s4      zRecompiler._generate_cpy_constcCs |}|r|jr||dSr )rrErhrrNr r'rrr"_generate_cpy_constant_collecttypeDs z-Recompiler._generate_cpy_constant_collecttypecCs|}||||dSr )rr*r+rrrrIsz&Recompiler._generate_cpy_constant_declcCs^|js|rttd}n$|jr&t}nt}|j|}t||}|jdt |d||dS)Nrr{_cffi_const_%s) rErrOP_CONSTANT_INTZOP_DLOPEN_CONSTZ OP_CONSTANTrQrrVr )rrNr rZ const_kindr-rrrrMs    z%Recompiler._generate_cpy_constant_ctxcCs||dSr rhrrrrr]sz)Recompiler._generate_cpy_enum_collecttypecCs|jD]}|d|qdS)NT) enumeratorsr*)rrNr enumeratorrrrr"`s z"Recompiler._generate_cpy_enum_declc Cs|j|}ttd}|jr"|t|j|jD](\}}|jd t |d|||dq0|durd|vr|jsd|}d|}n4| |j g} |j | }tt|j | ddk}d |j} |jd  t|j|||| dS) Nrr{r-rrrz ((%s)-1) <= 0rr5r~)rQrOP_ENUMrEZcheck_not_partialzipr0Z enumvaluesrrVr Zbuild_baseinttyperCZsizeofintcastr7r8r ) rrNrr-rr1Z enumvaluerr:Zbasetpr;rrrr$ds(        zRecompiler._enum_ctxcCs|||dSr )r$rrrrr_generate_cpy_enum_ctxysz!Recompiler._generate_cpy_enum_ctxcCsdSr rrrrr_generate_cpy_macro_collecttypesz*Recompiler._generate_cpy_macro_collecttypecCs&|dkrd}n|}|jd||ddS)NrTr2)r*)rrNr rrrr_generate_cpy_macro_declsz#Recompiler._generate_cpy_macro_declcCsT|dkr"|jrtd|fd}n|}ttd}|jdt|d|||ddS)NrzGcannot use the syntax '...' in '#define %s ...' when using the ABI moderr{r-r2)rErrr.rrVr )rrNr rrrrr_generate_cpy_macro_ctxs   z"Recompiler._generate_cpy_macro_ctxcCsFt|tjrB|j}|dkr$d|f}||jd|}t||}|S)Nrz_cffi_array_len(%s)r)r[rrrXrr)rrNZ global_namerrrrrrs   zRecompiler._global_typecCs||||dSr )rhrrrrr"_generate_cpy_variable_collecttypesz-Recompiler._generate_cpy_variable_collecttypecCs|j}|||}t|tjr4|jdur4|j}d}nd}d|f}|d|j||jd|d|d||f|d|dS) Nr&&z*_cffi_var_%s(void)static rrz return %s(%s);r) rrr[rrrXrrrt)rrNr rZ ampersandrrrr_generate_cpy_variable_decls  z&Recompiler._generate_cpy_variable_declcCsL|||}|j|}|jr"t}nt}|jdt|d|t||dS)Nr{z _cffi_var_%s) rrQrEZ OP_GLOBAL_VARZOP_GLOBAL_VAR_FrrVr r)rrNr r-r'rrr_generate_cpy_variable_ctxs   z%Recompiler._generate_cpy_variable_ctxcCs||dSr r/rrrr'_generate_cpy_extern_python_collecttypesz2Recompiler._generate_cpy_extern_python_collecttypecCs|j}t|jtjrd}nd|}d|jd|f}|d||d|j||f|g}d|}t|jD]"\}} | d||} | | qrd |} | pd } d || f} |j d krd | } dd} t t |jdd}| |jrt |d}t|jtjr&d|jd||jd|f}|d||j| f|d|d||dt|jD]X\}} d|} t| tjs| | rd| } t| } |d| d|d| fqd|d|t|jtjs|d|jdf|d||jd7_dS)Nr rz(int)sizeof(%s)r&z3static struct _cffi_externpy_s _cffi_externpy__%s =z { "%s.%s", %s, 0, 0 };rz a%drrz%s(%s) __stdcallz_cffi_stdcall cSst|tjo|jdkS)Nr)r[rrr rMrrrmay_need_128_bitss z9Recompiler._extern_python_decl..may_need_128_bitsr>z!sizeof(%s) > %d ? sizeof(%s) : %dz%s%srz char a[%s];z char *p = a;za%dr<z *(%s)(p + %d) = %s;rz, _cffi_call_python(&_cffi_externpy__%s, p);z return *(%s)p;rr)rr[rrrrrDr^rWrVr7rrHr#r\rr)rrNr Z tag_and_spacerZsize_of_resultrrrcrrrrrBZ size_of_arrr_extern_python_declsb              zRecompiler._extern_python_declcCs|||ddS)Nr=rDrrrr _generate_cpy_extern_python_declsz+Recompiler._generate_cpy_extern_python_declcCs|||ddS)NzCFFI_DLLEXPORT rErrrr#_generate_cpy_dllexport_python_decl sz.Recompiler._generate_cpy_dllexport_python_declcCs|||ddS)Nr&rErrrr'_generate_cpy_extern_python_plus_c_decl sz2Recompiler._generate_cpy_extern_python_plus_c_declcCsR|jrtd|jrtd|j|}tt|}|jdt |d|||dS)Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"r{z&_cffi_externpy__%s) rErrr%rQrZOP_EXTERN_PYTHONrrVr )rrNr r-rrrr_generate_cpy_extern_python_ctxs   z*Recompiler._generate_cpy_extern_python_ctxcCs|j}|dt|ts$|d}n |dz|dWntyVd|}Yn0|dD]|}|}tdturtt |}nt |dd}|d | d }|D]*}t |d kr||d }|d |f7}q||qbdS) Nz=// # NB. this is not a string because of a size limit in MSVCzutf-8asciis# -*- encoding: utf8 -*- Tz//rrz// r&Lz%d,) rr[bytesencodedecodeUnicodeDecodeError splitlinesrmapordrJrstripr#)rsrliner0Z printed_linecrrrrs,       z)Recompiler._print_string_literal_in_arraycCsttt|j|<dSr )r OP_PRIMITIVEZ PRIM_VOIDrUrrNrrrr_emit_bytecode_VoidType=sz"Recompiler._emit_bytecode_VoidTypecCst|j}tt||j|<dSr )ZPRIMITIVE_TO_INDEXr rrWrU)rrNrr?rrr_emit_bytecode_PrimitiveType@s z'Recompiler._emit_bytecode_PrimitiveTypecCs(d|j|j|jf}tt||j|<dS)Nzl_cffi_prim_int(sizeof(%s), ( ((%s)-1) | 0 /* check that %s is an integer type */ ) <= 0)r rrWrUrrNrrTrrr!_emit_bytecode_UnknownIntegerTypeDsz,Recompiler._emit_bytecode_UnknownIntegerTypecCs$d|j|jf}tt||j|<dS)Nzd_cffi_prim_float(sizeof(%s) * (((%s)1) / 2) * 2 /* integer => 0, float => 1 */ )r[r\rrr_emit_bytecode_UnknownFloatTypeJs z*Recompiler._emit_bytecode_UnknownFloatTypecCstt|j|j|j|<|d7}|jD]H}|j|}||krft|tjrV| ||ntt ||j|<|d7}q&t |j }|j dur|j dkr|dO}ntd|j ftt||j|<dS)NrrAr<zabi=%r)rZ OP_FUNCTIONrQrrUrWr[rrrZr(r5rrr%ZOP_FUNCTION_END)rrNrrbZ realindexr.rrr_emit_bytecode_RawFunctionTypePs        z)Recompiler._emit_bytecode_RawFunctionTypecCstt|j|j|j|<dSr )r OP_POINTERrQrrUrXrrr_emit_bytecode_PointerTypecsz%Recompiler._emit_bytecode_PointerTypecCs"|}tt|j||j|<dSr )rjrr`rQrU)rrNrrawrrr_emit_bytecode_FunctionPtrTypeisz)Recompiler._emit_bytecode_FunctionPtrTypecCs||j|j}|jdur(tt||j|<nP|jdkrNtdt|ddfn*tt ||j|<tdt|j|j|d<dS)Nrzitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/r) rQrrXrZ OP_OPEN_ARRAYrUrrTrZOP_ARRAY)rrNrZ item_indexrrr_emit_bytecode_ArrayTypems   z#Recompiler._emit_bytecode_ArrayTypecCs|j|}tt||j|<dSr )rYrZOP_STRUCT_UNIONrU)rrNrZ struct_indexrrr_emit_bytecode_StructType{s z$Recompiler._emit_bytecode_StructTypecCs|j|}tt||j|<dSr )rZrr3rU)rrNrZ enum_indexrrr_emit_bytecode_EnumTypes z"Recompiler._emit_bytecode_EnumType)F)r&)N)Nr&N)N)VrrrrrrIrergrhrRrrrrrrrrrrrrrrrrrrrrrrnrr rrrrZ_generate_cpy_union_collecttyperrZ_generate_cpy_union_declrZ_generate_cpy_union_ctxr r#r%r*r,rrrr"r$r7r8r9r:rr;r>r?r@Z*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyperDrFrGrHrIZ"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxrrYrZr]r^r_raZ_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTypercrdreZ_emit_bytecode_UnionTyperfrrrrrB~s :  . 4-# # " V     6 rB)rcseZdZfddZZS)NativeIOcs(t|tr|d}tt||dS)NrJ)r[ZunicoderMsuperrgr)rrTr`rrrs  zNativeIO.write)rrrr __classcell__rrrirrgsrgc Cs@|rtd|ft|||dud}||t}||||}zVt|d*}|t |d|krvt Wdn1s0Y|rtdWdSt y:d|t f} t| d}| |Wdn1s0Yzt | |Wn*ty2t |t | |Yn0Yd S0dS) Nz generating %s)rErrz(already up-to-date)Fz%s.~%dwT)printrBrerrgrgetvaluerreadr#IOErrorrgetpidrrenameOSErrorunlink) rCrDrZ target_fileverboseZ recompilerroutputf1Ztmp_filerrr_make_c_or_py_sources6  " ( rwFcCst|||||Sr rw)rCrDrZ target_c_filertrrr make_c_sources rycCst||d||Sr rx)rCrDZtarget_py_filertrrrmake_py_sources rzcCsl|d}z&ttjj|g|ddRWntyBYn0|d|7<tjj|g|R|fS)Nrr)rrrmakedirsrr7rr)Z outputdirmodname extensionpartsrrr_modname_to_files & rcCs*t||}||||ft||||Sr )r_rVsetattr) patchlistclsr Znew_metholdrrr _patch_meths  rcCs$t|D]\}}}t|||qdSr )reversedr)rrr Zold_methrrr_unpatch_methssrcs\tjdkr(ddlm}t||dddtjdkrXddlm}fd d }t||d |dS) Nrr) MSVCCompilerZ_remove_visual_c_refcSs|Sr r)rZ manifest_filerrrrOrPz&_patch_for_embedding..darwin) CCompilercsBd|jvr,t|j|_|jd}d|j|<|g|Ri|S)Nz-bundlez -dynamiclib)Z linker_sorr)rrWkwdsrcZold_link_shared_objectrrmy_link_shared_objects     z3_patch_for_embedding..my_link_shared_objectZlink_shared_object)sysplatformZdistutils.msvc9compilerrrZdistutils.ccompilerr)rrrrrrr_patch_for_embeddings     rcslddlm}drRddtjdkr6d7ntjdkrJd7nd 7t||d fd d dS) Nr) build_extz.*rrz.dllrz.dylibz.soZget_ext_filenamecsSr r)rZext_nametargetrrrOrPz#_patch_for_target..)Zdistutils.command.build_extrendswithrrr)rrrrrr_patch_for_targets        rrT.cc  Kst|ts|d}|jr$|| |durt|jdu} | rF|| |durzt|||\}} |rl|g| } tj j | }n|}| dur| rd|} nd} t j ||fi| }t |||||d}|rjg}t}z| rt|| dkrt|| |r"|dkrd}nd}td|tj |ft|t d||| }Wt|t|nt|t|0|S||fSn<|durt||d \}}t||||d}|r|Sd|fSdS) NrJz%s.*r)rtrzthe current directory isz setting the current directory toz%s %rz.py)r[rTrMZ_windows_unicodeZ_apply_windows_unicoderZ_apply_embedding_fixrrrr7rZ get_extensionrygetcwdrrrlabspathchdircompilerrz)rCrDrZtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verboserdebugrZ embeddingr~Z ext_c_fileextupdatedrcwdmsgZoutputfilenamerprrr recompilesn                 r)F)F)rTNrNrNN)!rrior&rrerrorrZ cffi_opcoderFrrr version_inforr rr,r8r@rBStringIOrgBytesIOrwryrzrrrrrrrrrrsP