B ل=^@sddlZddlZddlZddlmZmZddlmZddlTdZ dZ dZ Gd d d Z Gd d d Z Gd ddZGdddZGdddZGdddZejdkrejZnGdddejZddZd.ddZd/ddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd0d,d-ZdS)1N) ffiplatformmodel)VerificationError)*i&i'i(c@s&eZdZd ddZddZddZdS) GlobalExprrcCs"||_||_||_||_||_dS)N)nameaddresstype_opsize check_value)selfrr r r r rB/opt/alt/python37/lib64/python3.7/site-packages/cffi/recompiler.py__init__ s zGlobalExpr.__init__cCsd|j|j|j|jfS)Nz' { "%s", (void *)%s, %s, (void *)%s },)rr r as_c_exprr )r rrrrszGlobalExpr.as_c_exprcCsd|j|j|jfS)Nz b'%s%s',%d)r as_python_bytesrr )r rrras_python_exprszGlobalExpr.as_python_exprN)rr)__name__ __module__ __qualname__rrrrrrrr s rc@s,eZdZddZddZddZddZd S) FieldExprcCs"||_||_||_||_||_dS)N)r field_offset field_sizefbitsize field_type_op)r rrrrrrrrrs zFieldExpr.__init__cCs>dt|j}d|j|jfd||jfd||jfS)N z { "%s", %s, z %s %s, z %s %s },)lenrrrrr)r Zspacesrrrr#szFieldExpr.as_c_exprcCstdS)N)NotImplementedError)r rrrr)szFieldExpr.as_python_exprcCsD|jjtkrd}n|jjtkr*t|j}ntd|j||jfS)Nz b'%s%s%s') ropOP_NOOP OP_BITFIELDformat_four_bytesrrrr)r Z size_exprrrras_field_python_expr,s    zFieldExpr.as_field_python_exprN)rrrrrrr$rrrrrsrc@s$eZdZddZddZddZdS)StructUnionExprc Cs4||_||_||_||_||_||_||_||_dS)N)r type_indexflagsr alignmentcommentfirst_field_indexc_fields) r rr&r'r r(r)r*r+rrrr8szStructUnionExpr.__init__cCsPd|j|j|jfd|j|jfd|jt|jf|jrFd|jnddS)Nz { "%s", %d, %s,z %s, %s, z%d, %d z /* %s */ rz},) rr&r'r r(r*rr+r))r rrrrCszStructUnionExpr.as_c_exprcCs>t|jt}dd|jD}dt|jt||jd|fS)NcSsg|] }|qSr)r$).0Zc_fieldrrr Lsz2StructUnionExpr.as_python_expr..z(b'%s%s%s',%s),)evalr'ZG_FLAGSr+r#r&rjoin)r r'Z fields_exprrrrrJs  zStructUnionExpr.as_python_exprN)rrrrrrrrrrr%7s r%c@s$eZdZddZddZddZdS)EnumExprcCs"||_||_||_||_||_dS)N)rr&r signedallenums)r rr&r r2r3rrrrUs zEnumExpr.__init__cCsd|j|j|j|j|jfS)Nz1 { "%s", %d, _cffi_prim_int(%s, %s), "%s" },)rr&r r2r3)r rrrr\szEnumExpr.as_c_exprc Cs@ttttttttd|j|j f}dt |j t ||j |j fS)N))rr)rr)r)r4r)r)r5r)r)r6rzb'%s%s%s\x00%s')Z PRIM_UINT8Z PRIM_INT8Z PRIM_UINT16Z PRIM_INT16Z PRIM_UINT32Z PRIM_INT32Z PRIM_UINT64Z PRIM_INT64r r2r#r&rr3)r prim_indexrrrras zEnumExpr.as_python_exprN)rrrrrrrrrrr1Tsr1c@s$eZdZddZddZddZdS) TypenameExprcCs||_||_dS)N)rr&)r rr&rrrrmszTypenameExpr.__init__cCsd|j|jfS)Nz { "%s", %d },)rr&)r rrrrqszTypenameExpr.as_c_exprcCsdt|j|jfS)Nzb'%s%s')r#r&r)r rrrrtszTypenameExpr.as_python_exprN)rrrrrrrrrrr8lsr8c@seZdZdZdddZddZddZd d Zd d Zd ddddgZ ddZ dddZ ddZ ddZ ddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Zd?d@Z ddBdCZ!dDdEZ"dFdGZ#dHdIZ$e$Z%dJdKZ&dLdMZ'e'Z(dNdOZ)e)Z*dPdQZ+dRdSZ,dTdUZ-ddWdXZ.dYdZZ/d[d\Z0d]d^Z1d_d`Z2ddadbZ3dcddZ4dedfZ5dgdhZ6didjZ7dkdlZ8dmdnZ9dodpZ:dqdrZ;dsdtZZ?dwdxZ@dydzZAd{d|ZBd}d~ZCddZDeDZEZFddZGddZHddZIddZJddZKddZLddZMeMZNeMZOddZPddZQddZReRZSddZTdAS) RecompilerrFcCs||_||_||_t|_dS)N)ffi module_nametarget_is_python VERSION_BASE_version)r r:r;r<rrrr~szRecompiler.__init__cCst|j||_dS)N)maxr>)r Zverrrr needs_versionszRecompiler.needs_versionc CsNi|_|dt|jtd}g|_x|D]}|jr*|j|dksFtt|j|j|<|j|xZ|j D]P}t |t j t j t jt jt jfst|j|dkrt|j|j|<|j|qjW|jdq*WxX|D]P}|js|j|dkrt|j|j|<|j||jr|jdk r|jdqWd|jksz/Recompiler.collect_type_table..cSs|jS)N)r)rCrrrrDrEZ_emit_bytecode_) _typesdict _generatesortedstr cffi_typesZis_raw_functionAssertionErrorrappendargs isinstancerVoidTypeBasePrimitiveType PointerTypeStructOrUnionOrEnumFunctionPtrTypeZ is_array_typelengthvalues_struct_unions_enums StructOrUnionEnumType enumerategetattr __class__rCffiOptuple)r Z all_declsrCtp1imethodr rrrcollect_type_tablesZ            zRecompiler.collect_type_tablecCst|tjs2t|tr.x|D]}||qWdS||jkrd|j|<t|tjrb||ntt|tjr|j dk r||j j j krxN| D] \}}}}|||||qWn x|D]\}}||qWdS)N)rNrZBaseTypeByIdentityr^_do_collect_typerFrSas_raw_functionrXfldtypesr:_parser_included_declarations enumfields _field_typeZ _get_items)r rCxZname1r__rrrrcs         zRecompiler._do_collect_typec Cs|jjj}xt|D]\}\}}|dd\}}yt|d||f}Wn tk rjtd|YnXy||_ |||Wqt k r} zt | |Wdd} ~ XYqXqWdS)Nrrz_generate_cpy_%s_%sz"not implemented in recompile(): %r) r:rfZ _declarationsitemsrHsplitr[AttributeErrorr_current_quals ExceptionrZattach_exception_info) r step_namelstrrCqualsZkindZrealnameraerrrrGs zRecompiler._generateglobalfield struct_unionenumtypenamecCs:i|_x|jD]}g|j|<qWt|_|d|x>|jD]4}|j|}|dkrh|jdddt||j|<qBW|jd}x:|j D],\}}|t |kst ||j |j kst qWt |t |jkst |jd}x<|j D].\}}|t |kst ||j |j kst qWt |t |j ks6t dS)NZctxrvcSs|jS)N)r)entryrrrrDrEz0Recompiler.collect_step_tables..)rArwrx)_lsts ALL_STEPSset_seen_struct_unionsrG_add_missing_struct_unionssortr^rVrlrrKrrW)r rqrrrCr`rrrcollect_step_tabless*      zRecompiler.collect_step_tablesrcCs|j|ddS)N )_fwrite)r Zwhatrrr_prntszRecompiler._prntcCs:|jr|dkst||n|dk s*t|||dS)N)r<rKwrite_py_source_to_fwrite_c_source_to_f)r fpreamblerrrwrite_source_to_f s    zRecompiler.write_source_to_fcCs0ttjtjt|d}|}||S)Nr)openospathr0dirname__file__ readlinesclose)r filenameglinesrrr_rel_readlinesszRecompiler._rel_readlinesc Csz||_|j}|jjdk r |d|d}|d}|d|||d<|d||jdd}|jjdk r0|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|j D}xLt|jD]>\}}d} ||krd||} |d||| fqW|js|d|d|t|_|di} xn|jD]d} |j| } t| | | <| | dkr|d | | fx| D]} || qBW|d|qW|jjr|d!xr|jjD]f}y|jdd"\}}Wn(tk rtd#|j|fYnX|dkrtd$|d%|fqW|d&|d||d'|d(x8|jD].} | | dkr@|d)| n |d*| q Wx.|jD]$} | d+krZ|d,| | | fqZW|jjr|d-n|d.|d/t|jfd}|jr|dO}|d0||d||d1|d2|d||d |d3|d4|f|d5|jrD|d6|d7|d8|d9|j|d:|d;|d<|d|d=|d>|d?|d@|dA|f|dB|dC|f|dD|dD|d|d3|dE|f|d5|dF|j|jf|d=|d|d3|dG|f|d5|dH|j|jf|d=|d||d1|dI|dd|_dS)JNz#define _CFFI_USE_EMBEDDINGz_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_%sz#elsez*# define _CFFI_PYTHON_STARTUP_FUNC init%sz#endifz _embedding.hz#include "_cffi_errors.h" z_cffi_errors.hz>/************************************************************/zstatic void *_cffi_types[] = {cSsg|]\}}||fqSrr)r,rCr`rrrr-Gsz2Recompiler.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[] = {r4zQffi 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 */rvz %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 >= 3z 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)rrr: _embeddingrindexr0r;rm_print_string_literal_in_arrayr@VERSION_EMBEDDEDdictrFrlrZrJ _get_c_namerr}_seen_constantsrGr|r{r_included_ffis_assigned_sourcernr _num_externpyr>)r rrprntrr`Zbase_module_nametypeindex2typer r)Znumsrqrrrzffi_to_includeincluded_module_nameincluded_sourcer'rrrrs                         zRecompiler.write_c_source_to_fcsbt|trd|fSt|ttfrZfdd|D}t|dkrJ|ddd|fS|S)Nzb'%s'csg|]}|qSr)_to_py)r,item)r rrr-sz%Recompiler._to_py..rrz(%s)r.)rNrIlistr^rrLr0r)r rjZrepr)r rrs    zRecompiler._to_pyc Cs||_|j}|d|dt|jjp(d}xzt|D]n}|jj|}y|jdd\}}Wn&tk rtd|j|fYnX|dk rtd|d||fq6W||d|j f|d |j fd|_ t |j |_ d d |j D}|d | d |ftdd |jD} xH|jD]>} |j| } t| dkr*| dkr*|d| | | fq*W|dkr|dddd t|Df|ddS)Nz# auto-generated filezimport _cffi_backendrr4zQffi object %r includes %r, but the latter has not been prepared with set_source()zMnot 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)r,r rrrr-sz3Recompiler.write_py_source_to_f..z _types = %s,rcSsg|]\}}||fqSrr)r,rCr`rrrr-srrvz _%ss = %s,z _includes = (%s,),z, cSsg|] }d|qS)z_ffi%dr)r,r`rrrr-s))rrrr:rrangerrnrr;r>r^rJrr0rrFrlr|r{) r rrZ num_includesr`rrrZ types_lstrrqrrrrrrsB     zRecompiler.write_py_source_to_fcCs |j|S)N)rF)r typerrr _gettypenumszRecompiler._gettypenumc Csnd}t|tjr|s|r:|jdkr:d}d|j}nPt|tjrXd|df}n2|d}d||jddf}|d kr| 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_%srrk)char16_tchar32_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()))rNrrPis_complex_typeis_integer_typerUnknownFloatType get_c_namereplacer@VERSION_CHAR16CHAR32rQ"_convert_funcarg_to_c_ptr_or_arrayrRrrrSr) r rCfromvartovarerrcodeZextraargZ convertercnameZerrvaluerrr_convert_funcarg_to_cs@       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);)rNrrQadd)r rC localvars freelinesrrr_extra_local_variables3s   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;rzF if (_cffi_convert_array_argument(_cffi_type(%d), %s, (char **)&%s,z, datasize, &large_args_free) < 0)z %s;z })rrr)r rCrrrrrrr:s   z-Recompiler._convert_funcarg_to_c_ptr_or_arraycCsJt|tjr|r,|jdkr,d||jfSt|tjrBd|fS|jdkr|s|jdd}|dkrt|t d||fSd || |fSnt|tj tj frd || |fSt|tj rd || t |jfSt|tjr|jdkr td ||fd || |fSt|tjr>d || |fSt|dS) Nrz_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s)z long doublerrk)rrz_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)))rNrrPrrrrrr@rrrQrS ArrayTyperrXZfldnames TypeErrorrrYr)r rCvarcontextrrrr_convert_expr_from_cHs8       zRecompiler._convert_expr_from_ccCs||d|fS)Nz (*(%s *)0)) _global_type)r rCrrrr _typedef_typekszRecompiler._typedef_typecCs||||dS)N)rcr)r rCrrrr!_generate_cpy_typedef_collecttypensz,Recompiler._generate_cpy_typedef_collecttypecCsdS)Nr)r rCrrrr_generate_cpy_typedef_declqsz%Recompiler._generate_cpy_typedef_declcCs$|j|}|jdt||dS)Nry)rFr{rLr8)r rCrr&rrr _typedef_ctxts zRecompiler._typedef_ctxcCsf|||}|||t|dddkr<|j||jddn&t|tjrb|j|j|jj|j|ddS)NoriginZ unknown_type) approxname)r named_ptr) rrr[ _struct_ctxrrNrZNamedPointerTypetotype)r rCrrrr_generate_cpy_typedef_ctxxs   z$Recompiler._generate_cpy_typedef_ctxcCs(|||jr$|js$||dS)N)rcrdellipsisr<)r rCrrrr"_generate_cpy_function_collecttypes z-Recompiler._generate_cpy_function_collecttypec CsD|jr tt|tjst|jr0|||dS|j}t|j }|dkrNd}n|dkr\d}nd}g}g}d|}x:t |j D],\} } | | d| || d| q|Wd |} | pd } |jr|jd } nd } d | || f} |d|j | f|dd |}d}t|jtjr"d }|d|||f|d|d|d|d||f|dd|}x4t |j D]&\} } | d| |}|d|qxWt}t}x|j D]} || ||qWx t|D]}|d|fqWt|jtjs0d}d|}d|j d|}|||dnd}d }t|j dkrtt|j }x|D]} |d| q\W||d|t|t|d dd|Df|d|x6t |j D](\} } || d | d| d!|qW|d"|d#d$dtt|j D}d |}|d%|||f|d&|d'||d(|dkr^|d)|r|d*||jd+d,x|D]}|d-|qW|d.n,x|D]}|d-|qW|d/|d0|d|d1d2d3}d4}g}g}d|}x^t |j D]P\} } d }|| r$d5}d6}| d7|| f|}| || d8|| fqW|j}||rd|}| d9|}|d|tj}d}d:}d6}|r"d |} | pd } d;| || f} |d| | f|d|r||d |}|d%|||f|r|d<|dn|d=||f|d>|dS)?NrZnoargrZarg0rMzargument of %sz x%dzx%dz, voidrrz%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 = z result of %sz resultz PyObject *pyresult;z PyObject *arg%d;z1 if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))cSsg|] }d|qS)z&arg%dr)r,r`rrrr-sz:Recompiler._generate_cpy_function_decl..z return NULL;zarg%dz return NULLz Py_BEGIN_ALLOW_THREADSz _cffi_restore_errno();cSsg|] }d|qS)zx%dr)r,r`rrrr-sz { %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;z#elsecSs t|tjpt|tjo|S)N)rNrrX 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_%sz#endif)r<rKrNrrSr_generate_cpy_constant_declrrrMrZrLrr0abirrOr}rrHrrrinsertZ void_type)r rCrrnumargsargname argumentsZcall_argumentsrr`rrepr_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)Nrrruz _cffi_f_%sz _cffi_d_%s)r )rr<_generate_cpy_constant_ctxrFrdrrMZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_Vr{rLrr])r rCrr&rZ meth_kindrrr_generate_cpy_function_ctx+s      z%Recompiler._generate_cpy_function_ctxcCsTt|tjrP|j}|dkr0|d}d||f}||d||j}t||}|S)Nz...rz_cffi_array_len(((%s)0)->%s)z%s[0])rNrrrTrrir)r Z tp_structZ field_nameZtp_field actual_lengthZptr_struct_nametp_itemrrrriAs     zRecompiler._field_typecCs0|||jr,x|D]}||qWdS)N)rcr<anonymous_struct_fields_struct_collecttype)r rCfldtyperrrrMs zRecompiler._struct_collecttypec CsD|jdkrdS|j}d|f}|d|d||f|d|d|dx|D]\}}}} y|sv|dkr|dkr|d |||fwXx2t|tjr|jdks|jd kr|j}|d }qW|d |j d d|| d|fWqXt k r} z|dt | Wdd} ~ XYqXXqXW|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;rrz> (void)((p->%s) | 0); /* check that '%s.%s' is an integer */z...z[0]z { %s = &p->%s; (void)tmp; }z*tmpzfield %r)rsz /* %s */rz(struct _cffi_align_%s { char x; %s y; };) rerrhrrNrrrTrrrrI) r rCrrrZ checkfuncnameZfnameZftyperfqualrtrrr _struct_declTs8   &zRecompiler._struct_declNc Cs|j|}d}g}t|tjr(|d|jdkr@|dd}||jjjkr|dksd||jjjkr|jdkrpn|j st | rn |d|j r|j dkrt d||j f|dn|dd }d |pd }g}|dkrx|j } t|| } x | D]\} } } }||| | } || d |j| ft}| d krRt}d| }nL|dksvt| tjr|| jdkr|d}n"d|dkr|dn|j| f}|dks| d krd}n,|dk rd|j| f}nd|d| f}|t| ||| t||j| qWt|jd}|jd||dkrBd}d}d}n4|dk r^d|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)rrvz (size_t)-2Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z sizeof(%s)z"offsetof(struct _cffi_align_%s, y)rrw)"rFrNrZ UnionTyperLrer:rfrgpartialanyrZpackedrr0r<rrhri_check_not_opaquerr!r"rrTrrr]rr{extendr%r~r)r rCrrrr&Zreason_for_not_expandingr'r+Zexpand_anonymous_struct_unionrhZfldnamerrrr r offsetr*Zalignr)rrrrvs                        zRecompiler._struct_ctxcCs>xt|tjr|j}qWt|tjr:|jdkr:td|dS)Nz0%s is of an opaque type (not declared in cdef()))rNrrrrXrer)r rClocationrrrrs  zRecompiler._check_not_opaquecCst|j}|jdddx|D]\}}||jkr$|jrJtd|f|jdrx|jdd rx|jdd}n4|jdkr|j dkrd}| |dntd |f| |d|q$WdS) NcSs|dS)Nrr)Ztp_orderrrrrDrEz7Recompiler._add_missing_struct_unions..)rAzDinternal inconsistency: %r is partial but was not seen at this point$rZ_IO_FILEFILEzinternal inconsistency: %r) rrVrlrr~rrr startswithisdigitZ forcenamerr)r rrrCorderrrrrrs   z%Recompiler._add_missing_struct_unionscCs||dS)N)r)r rCrrrr _generate_cpy_struct_collecttypesz+Recompiler._generate_cpy_struct_collecttypecCs2|d}d|kr"||ddfS|d|fSdS)Nrrrk)rr)r rCrrrr _struct_namess zRecompiler._struct_namescCs|j|f||dS)N)rr)r rCrrrr_generate_cpy_struct_declsz$Recompiler._generate_cpy_struct_declcCs|j|f||dS)N)rr)r rCrrrr_generate_cpy_struct_ctxsz#Recompiler._generate_cpy_struct_ctxcCs(t|tjr|||n ||dS)N)rNrrY_generate_cpy_enum_collecttyper)r rCrrrr#_generate_cpy_anonymous_collecttypes z.Recompiler._generate_cpy_anonymous_collecttypecCs.t|tjr||n|||d|dS)Ntypedef_)rNrrY_generate_cpy_enum_declr)r rCrrrr_generate_cpy_anonymous_decls  z'Recompiler._generate_cpy_anonymous_declcCs0t|tjr|||n|||d|dS)Nr)rNrrY _enum_ctxr)r rCrrrr_generate_cpy_anonymous_ctxs z&Recompiler._generate_cpy_anonymous_ctxconstcCs||f|jkrtd||f|j||f|j}d||f}|r|d||d|d|f|d||f|dk r|dkrd|f}|d |f|d |d |d n>|dkst|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)rrrrrKr)r is_intrrCcategoryr rfuncnamerrr_generate_cpy_consts2       zRecompiler._generate_cpy_constcCs |}|r|jr||dS)N)rr<rc)r rCrr rrr"_generate_cpy_constant_collecttype5s z-Recompiler._generate_cpy_constant_collecttypecCs|}||||dS)N)rr )r rCrr rrrr:sz&Recompiler._generate_cpy_constant_declcCs^|js|rttd}n$|jr&t}nt}|j|}t||}|jdt |d||dS)Nrruz_cffi_const_%s) r<rr]OP_CONSTANT_INTZOP_DLOPEN_CONSTZ OP_CONSTANTrFr{rLr)r rCrr Z const_kindr&rrrr>s    z%Recompiler._generate_cpy_constant_ctxcCs||dS)N)rc)r rCrrrrrNsz)Recompiler._generate_cpy_enum_collecttypecCs x|jD]}|d|qWdS)NT) enumeratorsr )r rCr enumeratorrrrrQs z"Recompiler._generate_cpy_enum_declc Cs|j|}ttd}|jr"|x:t|j|jD](\}}|jd t |d|||dq2W|dk rd|kr|jsd|}d|}n4| |j g} |j | }tt|j | ddk}d |j} |jd  t|j|||| dS) Nrruz_cffi_const_%s)r rz sizeof(%s)z ((%s)-1) <= 0rr.rx)rFr]OP_ENUMr<Zcheck_not_partialziprZ enumvaluesr{rLrZbuild_baseinttyper:Zsizeofintcastr0r1r) r rCrr&r rZ enumvaluer r2Zbasetpr3rrrrUs"        zRecompiler._enum_ctxcCs|||dS)N)rr)r rCrrrr_generate_cpy_enum_ctxjsz!Recompiler._generate_cpy_enum_ctxcCsdS)Nr)r rCrrrr_generate_cpy_macro_collecttypepsz*Recompiler._generate_cpy_macro_collecttypecCs&|dkrd}n|}|jd||ddS)Nz...T)r )r )r rCrr rrr_generate_cpy_macro_declssz#Recompiler._generate_cpy_macro_declcCsT|dkr"|jrtd|fd}n|}ttd}|jdt|d|||ddS)Nz...zGcannot use the syntax '...' in '#define %s ...' when using the ABI moderruz_cffi_const_%s)r )r<rr]rr{rLr)r rCrr r rrr_generate_cpy_macro_ctxzs    z"Recompiler._generate_cpy_macro_ctxcCsFt|tjrB|j}|dkr$d|f}||jd|}t||}|S)Nz...z_cffi_array_len(%s)z%s[0])rNrrrTrr)r rCZ global_namerrrrrrs   zRecompiler._global_typecCs||||dS)N)rcr)r rCrrrr"_generate_cpy_variable_collecttypesz-Recompiler._generate_cpy_variable_collecttypecCs|j}|||}t|tjr4|jdkr4|j}d}nd}d|f}|d|j||jd|d|d||f|d|dS) Nr&z*_cffi_var_%s(void)zstatic )rsrz return %s(%s);r) rrrNrrrTrrro)r rCrrZ ampersandrrrr_generate_cpy_variable_decls  z&Recompiler._generate_cpy_variable_declcCsL|||}|j|}|jr"t}nt}|jdt|d|t||dS)Nruz _cffi_var_%s) rrFr<Z OP_GLOBAL_VARZOP_GLOBAL_VAR_Fr{rLrr])r rCrr&r rrr_generate_cpy_variable_ctxs   z%Recompiler._generate_cpy_variable_ctxcCst|tjst||dS)N)rNrrSrKrc)r rCrrrr'_generate_cpy_extern_python_collecttypesz2Recompiler._generate_cpy_extern_python_collecttypecCs|j}t|jtjrd}nd|}d|jd|f}|d||d|j||f|g}d|}x0t|jD]"\}} | d||} | | qtWd |} | pd } d || f} |j d krd | } dd} t t |jdd}| |jrt |d}t|jtjr*d|jd||jd|f}|d||j| f|d|d||dxft|jD]X\}} d|} t| tjs| | rd| } t| } |d| d|d| fqjW|d|t|jtjs|d|jdf|d||jd7_dS)Nrz result of %sz(int)sizeof(%s)rz3static struct _cffi_externpy_s _cffi_externpy__%s =z { "%s.%s", %s, 0, 0 };zargument of %sz a%dz, rz%s(%s) __stdcallz_cffi_stdcall cSst|tjo|jdkS)Nz long double)rNrrr)rCrrrmay_need_128_bitss z9Recompiler._extern_python_decl..may_need_128_bitsr6z!sizeof(%s) > %d ? sizeof(%s) : %dz%s%srz char a[%s];z char *p = a;za%drz *(%s)(p + %d) = %s;rz, _cffi_call_python(&_cffi_externpy__%s, p);z return *(%s)p;rr)rrNrrrOrr;rZrMrLr0rr?rrXrQr)r rCrZ tag_and_spacerZsize_of_resultrrr`rrrrr Z size_of_arrr_extern_python_declsZ          " zRecompiler._extern_python_declcCs|||ddS)Nzstatic )r")r rCrrrr _generate_cpy_extern_python_declsz+Recompiler._generate_cpy_extern_python_declcCs|||ddS)NzCFFI_DLLEXPORT )r")r rCrrrr#_generate_cpy_dllexport_python_declsz.Recompiler._generate_cpy_dllexport_python_declcCs|||ddS)Nr)r")r rCrrrr'_generate_cpy_extern_python_plus_c_declsz2Recompiler._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"ruz&_cffi_externpy__%s) r<rrrrFr]ZOP_EXTERN_PYTHONr{rLr)r rCrr&r rrr_generate_cpy_extern_python_ctxs   z*Recompiler._generate_cpy_extern_python_ctxcCsz|j}|dxf|dD]X}|d|d}x6|D].}t|dkrT||d}|dt|f7}q8W||qWdS)Nz=// # NB. this is not a string because of a size limit in MSVCTz// rLz%d,)r splitlinesrstriprord)r srlineZ printed_linecrrrrs  z)Recompiler._print_string_literal_in_arraycCsttt|j|<dS)N)r] OP_PRIMITIVEZ PRIM_VOIDrJ)r rCrrrr_emit_bytecode_VoidType sz"Recompiler._emit_bytecode_VoidTypecCst|j}tt||j|<dS)N)ZPRIMITIVE_TO_INDEXrr]r.rJ)r rCrr7rrr_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))rr]r.rJ)r rCrr+rrr!_emit_bytecode_UnknownIntegerType'sz,Recompiler._emit_bytecode_UnknownIntegerTypecCs$d|j|jf}tt||j|<dS)Nzd_cffi_prim_float(sizeof(%s) * (((%s)1) / 2) * 2 /* integer => 0, float => 1 */ ))rr]r.rJ)r rCrr+rrr_emit_bytecode_UnknownFloatType-sz*Recompiler._emit_bytecode_UnknownFloatTypecCstt|j|j|j|<|d7}xR|jD]H}|j|}||krht|tjrX| ||ntt ||j|<|d7}q(Wt |j }|j dk r|j dkr|dO}ntd|j ftt||j|<dS)Nrrr4zabi=%r)r]Z OP_FUNCTIONrFrrJrMrNrrr0r!rrrrZOP_FUNCTION_END)r rCrr_Z realindexr'rrr_emit_bytecode_RawFunctionType3s        z)Recompiler._emit_bytecode_RawFunctionTypecCstt|j|j|j|<dS)N)r] OP_POINTERrFrrJ)r rCrrrr_emit_bytecode_PointerTypeFsz%Recompiler._emit_bytecode_PointerTypecCs"|}tt|j||j|<dS)N)rdr]r4rFrJ)r rCrrawrrr_emit_bytecode_FunctionPtrTypeLsz)Recompiler._emit_bytecode_FunctionPtrTypecCs|j|j}|jdkr(tt||j|<nf|jdkrNtdt|ddfn@|j|ddksdt tt ||j|<tdt|j|j|d<dS)Nz...zitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/rrB) rFrrTr]Z OP_OPEN_ARRAYrJrrIrrKZOP_ARRAY)r rCrZ item_indexrrr_emit_bytecode_ArrayTypePs   z#Recompiler._emit_bytecode_ArrayTypecCs|j|}tt||j|<dS)N)rVr]ZOP_STRUCT_UNIONrJ)r rCrZ struct_indexrrr_emit_bytecode_StructType^s z$Recompiler._emit_bytecode_StructTypecCs|j|}tt||j|<dS)N)rWr]rrJ)r rCrZ enum_indexrrr_emit_bytecode_EnumTypecs z"Recompiler._emit_bytecode_EnumType)F)r)N)Nr N)N)Urrrrrr@rbrcrGr|rrrrrrrrrrrrrrrrrrrrrirrrrrrZ_generate_cpy_union_collecttyperrZ_generate_cpy_union_declrZ_generate_cpy_union_ctxrrrr rrrrrrrrrrrrrrrZ*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyper"r#r$r%r&Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxrr/r0r1r2r3r5Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyper7r8r9Z_emit_bytecode_UnionTyper:rrrrr9{s : , 4-# # " W     6 r9)cseZdZfddZZS)NativeIOcs(t|tr|d}tt||dS)Nascii)rNZunicodeencodesuperr<r)r r+)r\rrrls  zNativeIO.write)rrrr __classcell__rr)r\rr<ksr<c Cs|rtd|ft|||dkd}||t}||||}y@t|d }|t |d|krvt WdQRX|rtddSt k rd|t f} t| d}| |WdQRXyt | |Wn,tk r t |t | |YnXd SXdS) Nz generating %s)r<rrz(already up-to-date)Fz%s.~%dwT)printr9rbrr<rgetvaluerreadrIOErrorrgetpidrrenameOSErrorunlink) r:r;rZ target_fileverboseZ recompilerroutputf1Ztmp_filerrr_make_c_or_py_sourceqs4     rMFcCs|dk s tt|||||S)N)rKrM)r:r;rZ target_c_filerJrrr make_c_sources  rNcCst||d||S)N)rM)r:r;Ztarget_py_filerJrrrmake_py_sources rOcCsj|d}y$ttjj|f|ddWntk rBYnX|d|7<tjj|f||fS)Nrr)rmrmakedirsrr0rH)Z outputdirmodname extensionpartsrrr_modname_to_files $rTcCs*t||}||||ft||||S)N)r[rLsetattr) patchlistclsrZnew_metholdrrr _patch_meths  rYcCs(x"t|D]\}}}t|||q WdS)N)reversedrU)rVrWrZold_methrrr_unpatch_methssr[cs\tjdkr(ddlm}t||dddtjdkrXddlm}fd d }t||d |dS) Nwin32r) MSVCCompilerZ_remove_visual_c_refcSs|S)Nr)r Z manifest_filerrrrDrEz&_patch_for_embedding..darwin) CCompilercs<d|jkr,t|j|_|jd}d|j|<|f||S)Nz-bundlez -dynamiclib)Z linker_sorr)r rMkwdsr`)old_link_shared_objectrrmy_link_shared_objects     z3_patch_for_embedding..my_link_shared_objectZlink_shared_object)sysplatformZdistutils.msvc9compilerr]rYZdistutils.ccompilerr_)rVr]r_rbr)rar_patch_for_embeddings      recslddlm}drRddtjdkr6d7ntjdkrJd7nd 7t||d fd d dS) Nr) build_extz.*rr\z.dllr^z.dylibz.soZget_ext_filenamecsS)Nr)r Zext_name)targetrrrDrEz#_patch_for_target..)Zdistutils.command.build_extrfendswithrcrdrY)rVrgrfr)rgr_patch_for_targets       rirT.cc  Kst|ts|d}|jr$|| |dk r^|jdk } | rF|| |dkrzt|||\}} |rl|g| } tj j | }n|}| dkr| rd|} nd} t j ||f| }t |||||d}|rTg}t}zn| rt|| dkrt|| |r|dkrd}nd}td|tj |ft|t d||| }Wdt|t|X|S||fSn<|dkrxt||d \}}t||||d}|r|Sd|fSdS) Nr=z%s.*r)rJrzthe current directory isz setting the current directory toz%s %rz.py)rNrIr>Z_windows_unicodeZ_apply_windows_unicoderZ_apply_embedding_fixrTrrr0rZ get_extensionrNgetcwdrerirBabspathchdircompiler[rO)r:r;rZtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verbosergdebugr`Z embeddingrSZ ext_c_fileZextupdatedrVcwdmsgZoutputfilenamerkrrr recompilesb                  rs)F)F)rTNrjNrNN)rrciorrrerrorrZ cffi_opcoder=rrrrr%r1r8r9 version_infoStringIOr<BytesIOrMrNrOrTrYr[rerirsrrrrsF v