3 L]@sddlZddlZddlZddlmZmZddlmZddlTdZ dZ dZ Gd d d Z Gd d d Z Gd ddZGdddZGdddZGdddZejd.krejZnGdddejZddZd/ddZd0ddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd1d,d-ZdS)2N) ffiplatformmodel)VerificationError)*i&i'i(c@s&eZdZd ddZddZddZdS) GlobalExprrcCs"||_||_||_||_||_dS)N)nameaddresstype_opsize check_value)selfrr r r r r1/tmp/pip-install-wfra5znf/cffi/cffi/recompiler.py__init__ s zGlobalExpr.__init__cCsd|j|j|jj|jfS)Nz' { "%s", (void *)%s, %s, (void *)%s },)rr r as_c_exprr )r rrrrszGlobalExpr.as_c_exprcCsd|jj|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||jjfS)N z { "%s", %s, z %s %s, z %s %s },)lenrrrrr)r spacesrrrr#szFieldExpr.as_c_exprcCstdS)N)NotImplementedError)r rrrr)szFieldExpr.as_python_exprcCsD|jjtkrd}n|jjtkr*t|j}ntd|jj||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 */ r z},) rr'r(r r)r+rr,r*)r rrrrCszStructUnionExpr.as_c_exprcCs>t|jt}dd|jD}dt|jt||jdj|fS)NcSsg|] }|jqSr)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 r3r4rrrrUs zEnumExpr.__init__cCsd|j|j|j|j|jfS)Nz1 { "%s", %d, _cffi_prim_int(%s, %s), "%s" },)rr'r r3r4)r rrrr\szEnumExpr.as_c_exprcCsNdtdtd td td td td tdti|j|j f}dt |j t ||j |j fS)Nrrzb'%s%s%s\x00%s')rr)rr)r5r)r5r)r6r)r6r)r7r)r7r)Z PRIM_UINT8Z PRIM_INT8Z PRIM_UINT16Z PRIM_INT16Z PRIM_UINT32Z PRIM_INT32Z PRIM_UINT64Z PRIM_INT64r r3r$r'rr4)r prim_indexrrrras  zEnumExpr.as_python_exprN)rrrrrrrrrrr2Tsr2c@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)rrrrrrrrrrr9lsr9c@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 verrrr needs_versionszRecompiler.needs_versionc CsPi|_|jdt|jtd}g|_x|D]}|jr*|j|dksFtt|j|j|<|jj|xZ|j D]P}t |t j t j t jt jt jfst|j|dkrt|j|j|<|jj|qjW|jjdq*WxZ|D]R}|j o|j|dkrt|j|j|<|jj||jr|jdk r|jjdqWd|jjks>ti|_i|_x@|D]8}t |t jrnd|j|<nt |t jrPd|j|<qPWx.tt|jdddD]\}}||j|<qWx.tt|jdddD]\}}||j|<qWx0|D](}t|d|jj}|||j|qWx |jD]}t |ts&tq&Wt|j|_dS) NZ collecttype)keyZENDLENcSs|jS)N)r)tprrrsz/Recompiler.collect_type_table..cSs|jS)N)r)rErrrrFsZ_emit_bytecode_) _typesdict _generatesortedstr cffi_typesZis_raw_functionAssertionErrorrappendargs isinstancerVoidTypeBasePrimitiveType PointerTypeStructOrUnionOrEnumFunctionPtrTypeZ is_array_typelengthvalues_struct_unions_enums StructOrUnionEnumType enumerategetattr __class__rCffiOptuple)r Z all_declsrEtp1imethodr!rrrcollect_type_tablesZ            zRecompiler.collect_type_tablecCst|tjs2t|tr.x|D]}|j|qWdS||jkrd|j|<t|tjrb|j|jntt|tjr|j dk r||j j j krxN|j D] \}}}}|j|j|||qWn x|jD]\}}|j|qWdS)N)rOrZBaseTypeByIdentityr__do_collect_typerGrTas_raw_functionrYfldtypesr;_parser_included_declarations enumfields _field_typeZ _get_items)r rExZname1r`_rrrrds         zRecompiler._do_collect_typec Cs|jjjj}xt|D]\}\}}|jdd\}}yt|d||f}Wn tk rjtd|YnXy||_ |||Wqt k r} zt j | |WYdd} ~ XqXqWdS)Nrrz_generate_cpy_%s_%sz"not implemented in recompile(): %r) r;rgZ _declarationsitemsrIsplitr\AttributeErrorr_current_quals ExceptionrZattach_exception_info) r step_namelstrrEqualskindZrealnamerberrrrHs zRecompiler._generateglobalfield struct_unionenumtypenamecCs:i|_x|jD]}g|j|<qWt|_|jd|jx>|jD]4}|j|}|dkrh|jdddt||j|<qBW|jd}x:|jj D],\}}|t |kst ||j |j kst qWt |t |jkst |jd}x<|j j D].\}}|t |kst ||j |j kst qWt |t |j ks6t dS)NctxrxcSs|jS)N)r)entryrrrrFsz0Recompiler.collect_step_tables..)rCryrz)_lsts ALL_STEPSset_seen_struct_unionsrH_add_missing_struct_unionssortr_rWrmrrLrrX)r rrrsrErarrrcollect_step_tabless*      zRecompiler.collect_step_tablesr cCs|jj|ddS)N )_fwrite)r whatrrr_prntszRecompiler._prntcCs:|jr|dkst|j|n|dk s*t|j||dS)N)r=rLwrite_py_source_to_fwrite_c_source_to_f)r fpreamblerrrwrite_source_to_f s    zRecompiler.write_source_to_fcCs0ttjjtjjt|d}|j}|j|S)Nr)openospathr1dirname__file__ readlinesclose)r filenameglinesrrr_rel_readlinesszRecompiler._rel_readlinesc Csz||_|j}|jjdk r |d|jd}|jd}|jd|||d<|dj||jjddI}|jjdk r0|d|jf|d |j |jj|d |d |d |f|d |d|f|d|d|f|d|jd}|jd}|jd|||d<|dj||j t |d|||||d||dt dd|j jD}xLt|jD]>\}}d} ||krd||j} |d||j| fqW|js|d|d|t|_|jdi} xn|jD]d} |j| } t| | | <| | dkr|d| | fx| D]} || jqBW|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}|d/||d||d0|d1|d||d |d2|d3|f|d4|jrD|d5|d6|d7|d8|j|d9|d:|d;|d|d<|d=|d>|d?|d@|f|dA|dB|f|dC|dC|d |d2|dD|f|d4|dE|j|jf|d<|d|d2|dF|f|d4|dG|j|jf|d<|d||d0|dH|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-rErarrrr.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[] = {r5zQffi 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 */rxz %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; _embeddingrindexr1r<rn_print_string_literal_in_arrayrBVERSION_EMBEDDEDdictrGrmr[rK _get_c_namerr_seen_constantsrHrr~r_included_ffis_assigned_sourceror _num_externpyr?)r rrprntrraZbase_module_nametypeindex2typer!r*numsrrrsr}ffi_to_includeincluded_module_nameincluded_sourcer(rrrrs                         zRecompiler.write_c_source_to_fcsbt|trd|fSt|ttfrZfdd|D}t|dkrJ|jdddj|fS|jS)Nzb'%s'csg|]}j|qSr)_to_py)r-item)r rrr.sz%Recompiler._to_py..rr z(%s)r/)rOrJlistr_rrMr1r)r rkrepr)r rrs    zRecompiler._to_pyc Cs||_|j}|d|dt|jjp(f}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 |j d j|ftd d |jjD} xH|jD]>} |j| } t| dkr*| dkr*|d| |j | fq*W|dkr|ddjdd t|Df|ddS)Nz# auto-generated filezimport _cffi_backendr5zQffi 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|] }|jqSr)r)r-r!rrrr.sz3Recompiler.write_py_source_to_f..z _types = %s,r cSsg|]\}}||fqSrr)r-rErarrrr.srrxz _%ss = %s,z _includes = (%s,),z, cSsg|] }d|qS)z_ffi%dr)r-rarrrr.s))rrrr;rrangerrorr<r?r_rKrr1rrGrmrr~) r rrZ num_includesrarrrZ types_lstrrrrsrrrrsB     zRecompiler.write_py_source_to_fcCs |j|S)N)rG)r typerrr _gettypenumszRecompiler._gettypenumc Cspd}t|tjr|j r|jr<|jdkr.z return NULL;zarg%dz return NULLz Py_BEGIN_ALLOW_THREADSz _cffi_restore_errno();cSsg|] }d|qS)zx%dr)r-rarrrr.sz { %s%s(%s); }z _cffi_save_errno();z Py_END_ALLOW_THREADSz (void)self; /* unused */z (void)noarg; /* unused */z return %s;resultz result typez Py_INCREF(Py_None);z return Py_None;z#elsecSs t|tjpt|tjo|jS)N)rOrrY 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=rLrOrrTr_generate_cpy_constant_declrrrNr[rMrr1abirrPrrrrrinsertZ void_type)r rErrnumargsZargname argumentsZcall_argumentsrrarrepr_argumentsrname_and_argumentsZ result_codeargrrZ result_declrngr differenceZ indirectionZ tp_resultrrr_generate_cpy_function_decls                      z&Recompiler._generate_cpy_function_declcCs|jr|j r|j||dS|j|j}t|j}|jrBt}n |dkrPt}n|dkr^t }nt }|j dj t |d|t||d|ddS)Nrrrwz _cffi_f_%sz _cffi_d_%s)r )rr=_generate_cpy_constant_ctxrGrerrNZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_Vr~rMrr^)r rErr'rZ meth_kindrrr_generate_cpy_function_ctx#s     z%Recompiler._generate_cpy_function_ctxcCsTt|tjrP|j}|dkr0|jd}d||f}|j|d||j}tj||}|S)Nz...rz_cffi_array_len(((%s)0)->%s)z%s[0])rOrrrUrrjr)r Z tp_struct field_nameZtp_field actual_lengthZptr_struct_nametp_itemrrrrj9s     zRecompiler._field_typecCs0|j||jr,x|jD]}|j|qWdS)N)rdr=anonymous_struct_fields_struct_collecttype)r rEfldtyperrrrEs zRecompiler._struct_collecttypec Cs<|jdkrdS|j}d|f}|d|d||f|d|d|dx|jD]\}}}} y||jsv|dkr|d|||fwXx2t|tjr|jdks|jd kr|j}|d }qW|d |j d d || d|fWqXt k r} z|dt | WYdd} ~ XqXXqXW|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;rz> (void)((p->%s) | 0); /* check that '%s.%s' is an integer */z...z[0]z { %s = &p->%s; (void)tmp; }z*tmpzfield %r)rtz /* %s */rz(struct _cffi_align_%s { char x; %s y; };) rfrrirrOrrrUrrrrJ) r rErrrZ checkfuncnamefnameZftyperfqualrvrrr _struct_declLs6   &zRecompiler._struct_declNc Cs|j|}d}g}t|tjr(|jd|jdkr@|jdd}||jjjkr|dksd||jjjkr|jdkrpn|j st |j rn |jd|j r|j dkrt d||j f|jdn|jdd }d j|pd }g}|dkrx|j } t|j| } x | D]\} } } }|j|| | } |j| d |j| ft}| d krRt}d| }nL|dksvt| tjr|| jdkr|d}n"d|dkr|jdn|j| f}|dks| d krd}n,|dk rd|j| f}nd|jd| f}|jt| ||| t||j| qWt|jd}|jdj||dkrBd}d}d}n4|dk r^d|jf}d}nd|f}d|f}d}nd}d}d }|}|jdjt|j||||||||j j!|dS)!NZ _CFFI_F_UNIONZ_CFFI_F_OPAQUEopaqueZ_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 rxz (size_t)-2r5Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z sizeof(%s)z"offsetof(struct _cffi_align_%s, y)ryrr)"rGrOrZ UnionTyperMrfr;rgrhpartialanyrpackedrr1r=rrirj_check_not_opaquerr"r#rrUrrr^rr~extendr&rr)r rErrrr'Zreason_for_not_expandingr(r,Zexpand_anonymous_struct_unionriZfldnamerrrr!r offsetr+Zalignr*rrrrms                        zRecompiler._struct_ctxcCs>xt|tjr|j}qWt|tjr:|jdkr:td|dS)Nz0%s is of an opaque type (not declared in cdef()))rOrrrrYrfr)r rElocationrrrrs  zRecompiler._check_not_opaquecCst|jj}|jdddx|D]\}}||jkr$|jrJtd|f|jjdrx|jddj rx|jdd}n4|jdkr|j dkrd}|j |dntd |f|j |d|q$WdS) NcSs|dS)Nrr)Ztp_orderrrrrFsz7Recompiler._add_missing_struct_unions..)rCzDinternal inconsistency: %r is partial but was not seen at this point$rZ_IO_FILEFILEzinternal inconsistency: %r) rrWrmrrrrr startswithisdigitZ forcenamerr)r rsrEorderrrrrrs   z%Recompiler._add_missing_struct_unionscCs|j|dS)N)r)r rErrrr _generate_cpy_struct_collecttypesz+Recompiler._generate_cpy_struct_collecttypecCs2|jd}d|kr"||jddfS|d|fSdS)Nr rrl)rr)r rErrrr _struct_namess zRecompiler._struct_namescCs|j|f|j|dS)N)rr)r rErrrr_generate_cpy_struct_declsz$Recompiler._generate_cpy_struct_declcCs|j|f|j|dS)N)rr)r rErrrr_generate_cpy_struct_ctxsz#Recompiler._generate_cpy_struct_ctxcCs(t|tjr|j||n |j|dS)N)rOrrZ_generate_cpy_enum_collecttyper)r rErrrr#_generate_cpy_anonymous_collecttypes z.Recompiler._generate_cpy_anonymous_collecttypecCs.t|tjr|j|n|j||d|dS)Ntypedef_)rOrrZ_generate_cpy_enum_declr)r rErrrr_generate_cpy_anonymous_decls  z'Recompiler._generate_cpy_anonymous_declcCs0t|tjr|j||n|j||d|dS)Nr )rOrrZ _enum_ctxr)r rErrrr_generate_cpy_anonymous_ctxs z&Recompiler._generate_cpy_anonymous_ctxconstcCs||f|jkrtd||f|jj||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|jd|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)rrrrrLr)r is_intrrEcategoryr rfuncnamerrr_generate_cpy_consts2       zRecompiler._generate_cpy_constcCs"|j}| s|jr|j|dS)N)rr=rd)r rErrrrr"_generate_cpy_constant_collecttype,s z-Recompiler._generate_cpy_constant_collecttypecCs|j}|j|||dS)N)rr)r rErrrrrr1sz&Recompiler._generate_cpy_constant_declcCs`|j r|jrttd}n$|jr(t}nt}|j|}t||}|jdjt |d||dS)Nrrwz_cffi_const_%sr) r=rr^OP_CONSTANT_INTZOP_DLOPEN_CONSTZ OP_CONSTANTrGr~rMr)r rErr Z const_kindr'rrrr5s    z%Recompiler._generate_cpy_constant_ctxcCs|j|dS)N)rd)r rErrrrr Esz)Recompiler._generate_cpy_enum_collecttypecCs x|jD]}|jd|qWdS)NT) enumeratorsr)r rEr enumeratorrrrrHs z"Recompiler._generate_cpy_enum_declc Cs|j|}ttd }|jr"|jx:t|j|jD](\}}|jdj t |d|||dq2W|dk rd|kr|j rd|}d|}n4|j |j g} |j j | }tt|j j| d dk}d j|j} |jd j t|j|||| dS) Nrrwz_cffi_const_%s)r rz sizeof(%s)z ((%s)-1) <= 0rr/rzrr)rGr^OP_ENUMr=Zcheck_not_partialziprZ enumvaluesr~rMrZbuild_baseinttyper;sizeofintcastr1r2r) r rErr'r rZ enumvaluer r3Zbasetpr4rrrrLs"        zRecompiler._enum_ctxcCs|j||jdS)N)rr)r rErrrr_generate_cpy_enum_ctxasz!Recompiler._generate_cpy_enum_ctxcCsdS)Nr)r rErrrr_generate_cpy_macro_collecttypegsz*Recompiler._generate_cpy_macro_collecttypecCs&|dkrd}n|}|jd||ddS)Nz...T)r )r)r rErr rrr_generate_cpy_macro_decljsz#Recompiler._generate_cpy_macro_declcCsT|dkr"|jrtd|fd}n|}ttd}|jdjt|d|||ddS)Nz...zGcannot use the syntax '...' in '#define %s ...' when using the ABI moderrwz_cffi_const_%s)r r)r=rr^rr~rMr)r rErr r rrr_generate_cpy_macro_ctxqs    z"Recompiler._generate_cpy_macro_ctxcCsFt|tjrB|j}|dkr$d|f}|j|jd|}tj||}|S)Nz...z_cffi_array_len(%s)z%s[0])rOrrrUrr)r rEZ global_namerrrrrrs   zRecompiler._global_typecCs|j|j||dS)N)rdr)r rErrrr"_generate_cpy_variable_collecttypesz-Recompiler._generate_cpy_variable_collecttypecCs|j}|j||}t|tjr4|jdkr4|j}d}nd}d|f}|d|j||jd|d|d||f|d|dS) Nr &z*_cffi_var_%s(void)zstatic )rtrz return %s(%s);r) rrrOrrrUrrrp)r rErrZ ampersandrrrr_generate_cpy_variable_decls  z&Recompiler._generate_cpy_variable_declcCsL|j||}|j|}|jr"t}nt}|jdjt|d|t||dS)Nrwz _cffi_var_%s) rrGr=Z OP_GLOBAL_VARZOP_GLOBAL_VAR_Fr~rMrr^)r rErr'r!rrr_generate_cpy_variable_ctxs   z%Recompiler._generate_cpy_variable_ctxcCst|tjst|j|dS)N)rOrrTrLrd)r rErrrr'_generate_cpy_extern_python_collecttypesz2Recompiler._generate_cpy_extern_python_collecttypecCs|j}t|jtjrd}nd|}d|jjd|f}|d||d|j||f|g}d|}x0t|jD]"\}} | jd||} |j | qtWd j |} | pd } d || f} |j d krd | } dd} t t |jdd}| |jrt |d}t|jtjr*d|jjd||jjd|f}|d||jj| f|d|d||dxft|jD]X\}} d|} t| tjs| | rd| } tj| } |d| jd|d| fqjW|d|t|jtjs|d|jjdf|d||jd7_dS)Nrz result of %sz(int)sizeof(%s)r z3static struct _cffi_externpy_s _cffi_externpy__%s =z { "%s.%s", %s };zargument of %sz a%dz, rz%s(%s) __stdcallz_cffi_stdcall cSst|tjo|jdkS)Nz long double)rOrrr)rErrrmay_need_128_bitss z9Recompiler._extern_python_decl..may_need_128_bitsr7z!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)rrOrrrPrr<r[rNrMr1rr@rrYrRr)r rErZ tag_and_spacerZsize_of_resultrrrarrrrr*Z size_of_arrr_extern_python_declsX          " zRecompiler._extern_python_declcCs|j||ddS)Nzstatic )r,)r rErrrr _generate_cpy_extern_python_declsz+Recompiler._generate_cpy_extern_python_declcCs|j||ddS)NzCFFI_DLLEXPORT )r,)r rErrrr#_generate_cpy_dllexport_python_declsz.Recompiler._generate_cpy_dllexport_python_declcCs|j||ddS)Nr )r,)r rErrrr'_generate_cpy_extern_python_plus_c_declsz2Recompiler._generate_cpy_extern_python_plus_c_declcCsR|jrtd|jrtd|j|}tt|}|jdjt |d|||dS)Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"rwz&_cffi_externpy__%s) r=rrrrGr^ZOP_EXTERN_PYTHONr~rMr)r rErr'r rrr_generate_cpy_extern_python_ctxs   z*Recompiler._generate_cpy_extern_python_ctxcCsz|j}|dxf|jdD]X}|d|jd}x6|D].}t|dkrT||d}|dt|f7}q8W||qWdS)Nz=// # NB. this is not a string because of a size limit in MSVCTz// r Lz%d,)r splitlinesrstriprord)r srlineZ printed_linecrrrrs  z)Recompiler._print_string_literal_in_arraycCsttt|j|<dS)N)r^ OP_PRIMITIVEZ PRIM_VOIDrK)r rErrrr_emit_bytecode_VoidTypesz"Recompiler._emit_bytecode_VoidTypecCst|j}tt||j|<dS)N)ZPRIMITIVE_TO_INDEXrr^r8rK)r rErr8rrr_emit_bytecode_PrimitiveTypes 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^r8rK)r rErr5rrr!_emit_bytecode_UnknownIntegerTypesz,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^r8rK)r rErr5rrr_emit_bytecode_UnknownFloatType#sz*Recompiler._emit_bytecode_UnknownFloatTypecCstt|j|j|j|<|d7}xR|jD]H}|j|}||krht|tjrX|j ||ntt ||j|<|d7}q(Wt |j }|j dk r|j dkr|dO}ntd|j ftt||j|<dS)Nrr)r5zabi=%r)r^Z OP_FUNCTIONrGrrKrNrOrrr:r"rrrrZOP_FUNCTION_END)r rErr`Z realindexr(rrr_emit_bytecode_RawFunctionType)s        z)Recompiler._emit_bytecode_RawFunctionTypecCstt|j|j|j|<dS)N)r^ OP_POINTERrGrrK)r rErrrr_emit_bytecode_PointerType<sz%Recompiler._emit_bytecode_PointerTypecCs"|j}tt|j||j|<dS)N)rer^r>rGrK)r rErrawrrr_emit_bytecode_FunctionPtrTypeBsz)Recompiler._emit_bytecode_FunctionPtrTypecCs|j|j}|jdkr(tt||j|<nf|jdkrNtdt|jddfn@|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/*...*/rrD) rGrrUr^Z OP_OPEN_ARRAYrKrrJrrLZOP_ARRAY)r rErZ item_indexrrr_emit_bytecode_ArrayTypeFs   z#Recompiler._emit_bytecode_ArrayTypecCs|j|}tt||j|<dS)N)rWr^ZOP_STRUCT_UNIONrK)r rErZ struct_indexrrr_emit_bytecode_StructTypeTs z$Recompiler._emit_bytecode_StructTypecCs|j|}tt||j|<dS)N)rXr^rrK)r rErZ enum_indexrrr_emit_bytecode_EnumTypeYs z"Recompiler._emit_bytecode_EnumType)F)r )N)NrN)N)UrrrrrrBrcrdrHrrrrrrrrrrrrrrrrrrrrrrjrrrrrrZ_generate_cpy_union_collecttyperr Z_generate_cpy_union_declr Z_generate_cpy_union_ctxr rrrrrrr rrr r!r"r#rr$r&r'r(Z*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyper,r-r.r/r0Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxrr9r:r;r<r=r?Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyperArBrCZ_emit_bytecode_UnionTyperDrrrrr:{s : , 4-#  ! W     5 r:cseZdZfddZZS)NativeIOcs(t|tr|jd}tt|j|dS)Nascii)rOunicodeencodesuperrFr)r r5)r]rrrbs  zNativeIO.write)rrrr __classcell__rr)r]rrFasrFc Cs|rtd|ft|||dkd}|j|jt}|j|||j}y@t|d }|jt |d|krvt WdQRX|rtddSt k rd|t j f} t| d}|j |WdQRXyt j| |Wn,tk r t j|t j| |YnXd SXdS) Nz generating %s)r=rrz(already up-to-date)Fz%s.~%dwT)printr:rcrrFrgetvaluerreadrIOErrorrgetpidrrenameOSErrorunlink) r;r<rZ target_fileverboseZ recompilerroutputf1Ztmp_filerrr_make_c_or_py_sourcegs4     rXFcCs|dk s tt|||||S)N)rLrX)r;r<rZ target_c_filerUrrr make_c_sources  rYcCst||d||S)N)rX)r;r<Ztarget_py_filerUrrrmake_py_sources rZc Csj|jd}y$tjtjj|f|ddWntk rBYnX|d|7<tjj|f||fS)Nrrrr)rnrmakedirsrr1rS)Z outputdirmodname extensionpartsrrr_modname_to_files $r_cCs*t||}|j|||ft||||S)N)r\rMsetattr) patchlistclsrZnew_metholdrrr _patch_meths  rdcCs(x"t|D]\}}}t|||q WdS)N)reversedr`)rarbrZold_methrrr_unpatch_methssrfcs\tjdkr(ddlm}t||dddtjdkrXddlm}fd d }t||d |dS) Nwin32r) MSVCCompilerZ_remove_visual_c_refcSs|S)Nr)r Z manifest_filerrrrFsz&_patch_for_embedding..darwin) CCompilercs<d|jkr,t|j|_|jjd}d|j|<|f||S)Nz-bundlez -dynamiclib) linker_sorr)r rNkwdsra)old_link_shared_objectrrmy_link_shared_objects     z3_patch_for_embedding..my_link_shared_objectZlink_shared_object)sysplatformZdistutils.msvc9compilerrhrddistutils.ccompilerrj)rarhrjrnr)rmr_patch_for_embeddings      rrcslddlm}jdrRdd tjdkr6d7ntjdkrJd7nd 7t||d fd d dS)Nr) build_extz.*r5rgz.dllriz.dylibz.soZget_ext_filenamecsS)Nr)r Zext_name)targetrrrFsz#_patch_for_target..r)Zdistutils.command.build_extrsendswithrorprd)rartrsr)rtr_patch_for_targets       rvrT.cc  Kst|ts|jd}|jr$|j| |dk r^|jdk } | rF|j| |dkrzt|||\}} |rl|g| } tj j | }n|}| dkr| rd|} nd} t j ||f| }t |||||d}|rTg}tj}zn| rt|| dkrt|| |r|dkrd}nd}td|tj j|ftj|t jd||| }Wdtj|t|X|S||fSn<|dkrxt||d \}}t||||d}|r|Sd|fSdS) NrGz%s.*r)rUrzthe current directory isz setting the current directory toz%s %rz.py)rOrJrIZ_windows_unicodeZ_apply_windows_unicoderZ_apply_embedding_fixr_rrr1r get_extensionrYgetcwdrrrvrMabspathchdircompilerfrZ)r;r<rZtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verbosertdebugrlZ embeddingr^Z ext_c_fileextupdatedracwdmsgZoutputfilenamerlrrr recompilesb                  r)rE)F)F)rTNrwNrNN)rroior rrerrorrZ cffi_opcoder>rrrrr&r2r9r: version_infoStringIOrFBytesIOrXrYrZr_rdrfrrrvrrrrrsF l