3 M •Z´÷ã@sddlZddlZddlZddlmZmZddlmZddlTdZ dZ dZ Gd d „d ƒZ Gd d „d ƒZ Gd d„dƒZGdd„dƒZGdd„dƒZGdd„dƒZejd0kr®ejZnGdd„dejƒZdd„Zd1dd„Zd2dd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd3d,d-„Zd.d/„ZdS)4éNé)Ú ffiplatformÚmodel)ÚVerificationError)Ú*i&i'i(c@s&eZdZd dd„Zdd„Zdd„ZdS) Ú GlobalExprrcCs"||_||_||_||_||_dS)N)ÚnameÚaddressÚtype_opÚsizeÚ check_value)Úselfrr r r r ©rú"/usr/lib64/python3.6/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 rrrÚas_python_exprszGlobalExpr.as_python_exprN)rr)Ú__name__Ú __module__Ú __qualname__rrrrrrrr s rc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú FieldExprcCs"||_||_||_||_||_dS)N)rÚ field_offsetÚ field_sizeÚfbitsizeÚ field_type_op)r rrrrrrrrrs zFieldExpr.__init__cCs>dt|jƒ}d|j|jfd||jfd||jjƒfS)Nú z { "%s", %s, z %s %s, z %s %s },)Úlenrrrrr)r Zspacesrrrr#szFieldExpr.as_c_exprcCst‚dS)N)ÚNotImplementedError)r rrrr)szFieldExpr.as_python_exprcCsD|jjtkrd}n|jjtkr*t|jƒ}nt‚d|jjƒ||jfS)NÚz b'%s%s%s') rÚopÚOP_NOOPÚ OP_BITFIELDÚformat_four_bytesrrrr)r Z size_exprrrrÚas_field_python_expr,s    zFieldExpr.as_field_python_exprN)rrrrrrr$rrrrrsrc@s$eZdZdd„Zdd„Zdd„ZdS)ÚStructUnionExprc Cs4||_||_||_||_||_||_||_||_dS)N)rÚ type_indexÚflagsr Ú alignmentÚcommentÚfirst_field_indexÚc_fields) r rr&r'r r(r)r*r+rrrr8szStructUnionExpr.__init__cCsPd|j|j|jfd|j|jfd|jt|jƒf|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|jƒt|ƒ|jdj|ƒfS)NcSsg|] }|jƒ‘qSr)r$)Ú.0Zc_fieldrrrú Lsz2StructUnionExpr.as_python_expr..z(b'%s%s%s',%s)ú,)Úevalr'ZG_FLAGSr+r#r&rÚjoin)r r'Z fields_exprrrrrJs  zStructUnionExpr.as_python_exprN)rrrrrrrrrrr%7s r%c@s$eZdZdd„Zdd„Zdd„ZdS)ÚEnumExprcCs"||_||_||_||_||_dS)N)rr&r ÚsignedÚallenums)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_exprcCsNdtdtd td td td td tdti|j|j f}dt |j ƒt |ƒ|j |j fS)Nrrééézb'%s%s%s\x00%s')rr)rr)r4r)r4r)r5r)r5r)r6r)r6r)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$eZdZdd„Zdd„Zdd„ZdS)Ú 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@s€eZdZdZd—dd„Zdd„Zdd„Zd d „Zd d „Zd ddddgZ dd„Z d˜dd„Z dd„Z dd„Z dd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Zd=d>„Zd?d@„Z d™dBdC„Z!dDdE„Z"dFdG„Z#dHdI„Z$e$Z%dJdK„Z&dLdM„Z'e'Z(dNdO„Z)e)Z*dPdQ„Z+dRdS„Z,dTdU„Z-dšdWdX„Z.dYdZ„Z/d[d\„Z0d]d^„Z1d_d`„Z2d›dadb„Z3dcdd„Z4dedf„Z5dgdh„Z6didj„Z7dkdl„Z8dmdn„Z9dodp„Z:dqdr„Z;dsdt„ZZ?dwdx„Z@dydz„ZAd{d|„ZBd}d~„ZCdd€„ZDeDZEZFd�d‚„ZGdƒd„„ZHd…d†„ZId‡dˆ„ZJd‰dŠ„ZKd‹dŒ„ZLd�dŽ„ZMeMZNeMZOd�d�„ZPd‘d’„ZQd“d”„ZReRZSd•d–„ZTdAS)œÚ RecompilerrFcCs||_||_||_t|_dS)N)ÚffiÚ module_nameÚtarget_is_pythonÚ VERSION_BASEÚ_version)r r:r;r<rrrr~szRecompiler.__init__cCst|j|ƒ|_dS)N)Úmaxr>)r ZverrrrÚ needs_version„szRecompiler.needs_versionc CsPi|_|jdƒt|jtd�}g|_x¨|D] }|jr*|j|dksFt‚t|jƒ|j|<|jj|ƒxZ|j D]P}t |t j t j t jt jt jfƒs�t‚|j|dkr®t|jƒ|j|<|jj|ƒqjW|jjdƒq*WxZ|D]R}|j oì|j|dkrÔt|jƒ|j|<|jj|ƒ|jrÔ|jdk rÔ|jjdƒqÔWd|jjƒk�s>t‚i|_i|_x@|D]8}t |t jƒ�rnd|j|<nt |t jƒ�rPd|j|<�qPWx.tt|jdd„d�ƒD]\}}||j|<�q¤Wx.tt|jdd„d�ƒD]\}}||j|<�qÔWx0|D](}t|d|jjƒ}|||j|ƒ�qòWx |jD]}t |tƒ�s&t‚�q&Wt|jƒ|_dS) NZ collecttype)ÚkeyZENDÚLENcSs|jS)N)r)ÚtprrrÚ±sz/Recompiler.collect_type_table..cSs|jS)N)r)rCrrrrD´sZ_emit_bytecode_)Ú _typesdictÚ _generateÚsortedÚstrÚ cffi_typesZis_raw_functionÚAssertionErrorrÚappendÚargsÚ isinstancerÚVoidTypeÚBasePrimitiveTypeÚ PointerTypeÚStructOrUnionOrEnumÚFunctionPtrTypeZ is_array_typeÚlengthÚvaluesÚ_struct_unionsÚ_enumsÚ StructOrUnionÚEnumTypeÚ enumerateÚgetattrÚ __class__rÚCffiOpÚtuple)r Z all_declsrCÚtp1ÚiÚmethodr rrrÚcollect_type_table‡sZ            zRecompiler.collect_type_tablecCsÚt|tjƒs2t|tƒr.x|D]}|j|ƒqWdS||jkrÖd|j|<t|tjƒrb|j|jƒƒntt|tjƒr¶|j dk rÖ||j j j krÖxN|j ƒD] \}}}}|j|j|||ƒƒq�Wn x|jƒD]\}}|j|ƒqÀWdS)N)rMrZBaseTypeByIdentityr]Ú_do_collect_typerErRÚas_raw_functionrWÚfldtypesr:Ú_parserÚ_included_declarationsÚ enumfieldsÚ _field_typeZ _get_items)r rCÚxZname1r^Ú_rrrrbÁs         zRecompiler._do_collect_typec Csº|jjjjƒ}x¦t|ƒ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:reZ _declarationsÚitemsrGÚsplitrZÚAttributeErrorrÚ_current_qualsÚ ExceptionrZattach_exception_info) r Ú step_nameÚlstrrCÚqualsZkindZrealnamer`ÚerrrrFÔs zRecompiler._generateÚglobalÚfieldÚ struct_unionÚenumÚtypenamecCs:i|_x|jD]}g|j|<qWtƒ|_|jdƒ|jƒx>|jD]4}|j|}|dkrh|jdd„d�t|ƒ|j|<qBW|jd}x:|jj ƒD],\}}|t |ƒks¨t ‚||j |j ks�t ‚q�Wt |ƒt |jƒksÖt ‚|jd}x<|j j ƒD].\}}|t |ƒk�st ‚||j |j ksìt ‚qìWt |ƒt |j ƒk�s6t ‚dS)NZctxrucSs|jS)N)r)ÚentryrrrrDõsz0Recompiler.collect_step_tables..)rArvrw)Ú_lstsÚ ALL_STEPSÚsetÚ_seen_struct_unionsrFÚ_add_missing_struct_unionsÚsortr]rUrkrrJrrV)r rprqrCr_rrrÚcollect_step_tablesés*      zRecompiler.collect_step_tablesrcCs|jj|dƒdS)NÚ )Ú_fÚwrite)r ZwhatrrrÚ_prntszRecompiler._prntcCs:|jr|dkst‚|j|ƒn|dk s*t‚|j||ƒdS)N)r<rJÚwrite_py_source_to_fÚwrite_c_source_to_f)r ÚfÚpreamblerrrÚwrite_source_to_f s    zRecompiler.write_source_to_fcCs0ttjjtjjtƒ|ƒdƒ}|jƒ}|jƒ|S)NÚr)ÚopenÚosÚpathr0ÚdirnameÚ__file__Ú readlinesÚclose)r ÚfilenameÚgÚlinesrrrÚ_rel_readlinesszRecompiler._rel_readlinesc Csz||_|j}|jjdk r |dƒ|jdƒ}|jdƒ}|jdƒ|||d…<|dj|ƒƒ|jjdƒdI}|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ƒ|ƒ|dƒt dd„|j jƒDƒƒ}xLt|jƒD]>\}}d} ||k�r¬d||jƒ} |d||jƒ| fƒ�q†W|j�sØ|dƒ|dƒ|ƒtƒ|_|jdƒi} xn|jD]d} |j| } t| ƒ| | <| | dk�r|d| | fƒx| D]} || jƒƒ�qBW|dƒ|ƒ�qW|jj�r|d ƒxr|jjD]f}y|jdd!…\}}Wn(tk �rÊtd"|j|fƒ‚YnX|dk�rÞtd#ƒ‚|d$|fƒ�qˆW|d%ƒ|dƒ|ƒ|d&ƒ|d'ƒx8|jD].} | | dk�r@|d(| ƒn |d)| ƒ�q Wx.|jD]$} | d*k�rZ|d+| | | fƒ�qZW|jj�r–|d,ƒn|d-ƒ|d.t|jƒfƒd}|j�rÆ|dO}|d/|ƒ|dƒ|ƒ|d0ƒ|d1ƒ|dƒ|ƒ|d ƒ|d2ƒ|d3|fƒ|d4ƒ|j�rD|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ƒ|dƒd|_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|]\}}||f‘qSrr)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 */ruz %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éÿÿÿÿ)r‚r„r:Ú _embeddingr•Úindexr0r;rlÚ_print_string_literal_in_arrayr@ÚVERSION_EMBEDDEDÚdictrErkrYrIÚ _get_c_namerr|Ú_seen_constantsrFr{rzrÚ_included_ffisÚ_assigned_sourcermrÚ _num_externpyr>)r r‡rˆÚprntr”r_Zbase_module_nameÚtypeindex2typer r)ZnumsrprqryÚffi_to_includeÚincluded_module_nameÚincluded_sourcer'rrrr†s                         zRecompiler.write_c_source_to_fcsbt|tƒrd|fSt|ttfƒrZ‡fdd„|Dƒ}t|ƒdkrJ|jdƒddj|ƒfS|jƒS)Nzb'%s'csg|]}ˆj|ƒ‘qSr)Ú_to_py)r,Úitem)r rrr-Èsz%Recompiler._to_py..rrz(%s)r.)rMrHÚlistr]rrKr0r)r riZrepr)r rrªÄs    zRecompiler._to_pyc Cs¤||_|j}|dƒ|dƒt|jjp(fƒ}xzt|ƒD]n}|jj|}y|jdd…\}}Wn&tk r‚td|j|fƒ‚YnX|dk r”tdƒ‚|d||fƒq6W|ƒ|d|j fƒ|d|j fƒd|_ t |j ƒ|_ d d „|j Dƒ}|d |j d j|ƒƒfƒtd d „|jjƒDƒƒ} xH|jD]>} |j| } t| ƒdk�r*| dk�r*|d| |j | ƒfƒ�q*W|dk�r˜|ddjdd „t|ƒDƒƒfƒ|dƒdS)Nz# auto-generated filezimport _cffi_backendr4zQffi 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|] }|jƒ‘qSr)r)r,r rrrr-îsz3Recompiler.write_py_source_to_f..z _types = %s,rcSsg|]\}}||f‘qSrr)r,rCr_rrrr-ðsrruz _%ss = %s,z _includes = (%s,),z, cSsg|] }d|‘qS)z_ffi%dr)r,r_rrrr-ûsú))r‚r„rr:r¢Úranger£rmrr;r>r]rIrªr0rŸrErkr{rz) r r‡r¥Z num_includesr_r§r¨r©Z types_lstr¦rprqrrrr…ÎsB     zRecompiler.write_py_source_to_fcCs |j|S)N)rE)r ÚtyperrrÚ _gettypenumszRecompiler._gettypenumc Cspd}t|tjƒr’|jƒ r’|jƒr<|jdkr.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 return %s;Úresultz result typez Py_INCREF(Py_None);z return Py_None;z#elsecSs t|tjƒpt|tjƒo|jƒS)N)rMrrWÚ PrimitiveTyper´)r¯rrrÚneed_indirectionös  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<rJrMrrRrÓÚ_generate_cpy_constant_declr„rrLrYrKr·r0ÚabirÖrNr|rÂr®r¿rÇÚinsertZ void_type)r rCrr¥ÚnumargsZargnameÚ argumentsZcall_argumentsrÆr_r¯Úrepr_argumentsrÚÚname_and_argumentsZ result_codeÚargrÁr—Z result_declÚrngrØÚ differenceZ indirectionZ tp_resultrrrÚ_generate_cpy_function_declˆsö                      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|d�ƒdS)Nrrrtz _cffi_f_%sz _cffi_d_%s)r )rÓr<Ú_generate_cpy_constant_ctxrErcrrLZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_VrzrKrr\)r rCrr&rÜZ meth_kindrrrÚ_generate_cpy_function_ctx#s     z%Recompiler._generate_cpy_function_ctxcCsTt|tjƒrP|j}|dkr0|jdƒ}d||f}|j|d||jƒ}tj||ƒ}|S)Nz...rz_cffi_array_len(((%s)0)->%s)z%s[0])rMrrÃrSr·rhr«)r Z tp_structZ field_nameZtp_fieldÚ actual_lengthZptr_struct_nameÚtp_itemrrrrh9s     zRecompiler._field_typecCs0|j|ƒ|jr,x|jƒD]}|j|ƒqWdS)N)rbr<Úanonymous_struct_fieldsÚ_struct_collecttype)r rCÚfldtyperrrréEs zRecompiler._struct_collecttypec Cs<|jdkrdS|j}d|f}|dƒ|d||fƒ|dƒ|dƒ|dƒxÊ|jƒD]¾\}}}} y||jƒsv|dkrŠ|d|||fƒwXx2t|tjƒr¼|jdks¬|jd kr¼|j}|d }qŒW|d |j d d || d�|fƒWqXt k �r} z|dt | ƒƒWYdd} ~ XqXXqXW|dƒ|d||fƒ|ƒdS)Nz_cffi_checkfld_%sZ_CFFI_UNUSED_FNzstatic void %s(%s *p)r˜z8 /* 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)rrz /* %s */r™z(struct _cffi_align_%s { char x; %s y; };) rdr„rgrµrMrrÃrSr«r·rrH) r rCr¾rÎr¥Z checkfuncnameZfnameZftyperÚfqualrsrrrÚ _struct_declLs6   &zRecompiler._struct_declNc Csž|j|}d}g}t|tjƒr(|jdƒ|jdkr@|jdƒd}||jjjkr |dksd||jjjkr |jdkrpn|j sŽt |j ƒƒr„n |jdƒ|j r®|jdƒn|jdƒd}dj |ƒpºd }g}|dk�rZ|j } t|j| ƒƒ} �x | D�]\} } } }|j|| | ƒ} |j| d |j| fƒt}| d k�r6t}d | }nL|dk�sZt| tjƒ�r`| jdk�r`d }n"d|dk�rv|jdƒn|j| f}|dk�s–| d k�rœd }n,|dk �r¶d|j| f}nd|jdƒ| f}|jt| ||| t||j| ƒƒƒqèWt|jdƒ}|jdj|ƒ|dk�r$d}d}d}n4|dk �r@d|jf}d}nd|f}d|f}d}nd }d}d}|}|jdjt|j|||||||ƒƒ|jj |ƒdS) NZ _CFFI_F_UNIONZ_CFFI_F_OPAQUEZopaqueZ_CFFI_F_CHECK_FIELDSZ_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)rruz (size_t)-2r4Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z sizeof(%s)z"offsetof(struct _cffi_align_%s, y)rrvéþÿÿÿršrš)!rErMrZ UnionTyperKrdr:rerfÚpartialÚanyrèZpackedr0r<r¬rgrhÚ_check_not_opaquerr!r"rÃrSr·rr\rrzÚextendr%r}rÀ)r rCr¾rÎrÏr&Zreason_for_not_expandingr'r+Zexpand_anonymous_struct_unionrgZfldnamerêrrër r Úoffsetr*Zalignr)rrrrÐmsŒ                       zRecompiler._struct_ctxcCs>xt|tjƒr|j}qWt|tjƒr:|jdkr:td|ƒ‚dS)Nz0%s is of an opaque type (not declared in cdef()))rMrrÃr«rWrdrÄ)r rCÚlocationrrrrò¾s  zRecompiler._check_not_opaquecCsÂt|jjƒƒ}|jdd„d�xž|D]–\}}||jkr$|jrJtd|fƒ‚|jjdƒrx|jdd…j ƒrx|jdd…}n4|jdkrž|j dkržd}|j |dƒntd |fƒ‚|j |d|ƒq$WdS) NcSs|dS)Nrr)Ztp_orderrrrrDËsz7Recompiler._add_missing_struct_unions..)rAzDinternal inconsistency: %r is partial but was not seen at this pointú$rZ_IO_FILEÚFILEzinternal inconsistency: %r) r¬rUrkrr}rðrrÚ startswithÚisdigitZ forcenamerÌrÐ)r rqrCÚorderrÎrrrr~Ås   z%Recompiler._add_missing_struct_unionscCs|j|ƒdS)N)ré)r rCrrrrÚ _generate_cpy_struct_collecttypeÜsz+Recompiler._generate_cpy_struct_collecttypecCs2|jdƒ}d|kr"||jddƒfS|d|fSdS)Nrrrj)r·r¸)r rCr¾rrrÚ _struct_namesàs zRecompiler._struct_namescCs|j|f|j|ƒžŽdS)N)rìrü)r rCrrrrÚ_generate_cpy_struct_declçsz$Recompiler._generate_cpy_struct_declcCs|j|f|j|ƒžŽdS)N)rÐrü)r rCrrrrÚ_generate_cpy_struct_ctxësz#Recompiler._generate_cpy_struct_ctxcCs(t|tjƒr|j||ƒn |j|ƒdS)N)rMrrXÚ_generate_cpy_enum_collecttyperé)r rCrrrrÚ#_generate_cpy_anonymous_collecttypeós z.Recompiler._generate_cpy_anonymous_collecttypecCs.t|tjƒr|j|ƒn|j||d|ƒdS)NÚtypedef_)rMrrXÚ_generate_cpy_enum_declrì)r rCrrrrÚ_generate_cpy_anonymous_declùs  z'Recompiler._generate_cpy_anonymous_declcCs0t|tjƒr|j||ƒn|j||d|ƒdS)Nr)rMrrXÚ _enum_ctxrÐ)r rCrrrrÚ_generate_cpy_anonymous_ctxÿs z&Recompiler._generate_cpy_anonymous_ctxÚconstcCs||f|jkrtd||fƒ‚|jj||fƒ|j}d||f}|r¸|d|ƒ|dƒ|d|fƒ|d||fƒ|dk r¦|dkr�d|f}|d |fƒ|d ƒ|d ƒ|d ƒn>|dksÄt‚|d |ƒ|dƒ|d|jdƒ|fƒ|d ƒ|ƒdS)Nz duplicate declaration of %s '%s'z _cffi_%s_%sz$static int %s(unsigned long long *o)r˜z 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;r™zstatic void %s(char *o)z *(%s)o = %s;r)r¡rrÀr„rJr·)r Úis_intrrCÚcategoryr r¥ÚfuncnamerrrÚ_generate_cpy_consts2       zRecompiler._generate_cpy_constcCs"|jƒ}| s|jr|j|ƒdS)N)rµr<rb)r rCrrrrrÚ"_generate_cpy_constant_collecttype&s z-Recompiler._generate_cpy_constant_collecttypecCs|jƒ}|j|||ƒdS)N)rµr )r rCrrrrrrÙ+sz&Recompiler._generate_cpy_constant_declcCs`|j r|jƒrttdƒ}n$|jr(t}nt}|j|}t||ƒ}|jdjt |d||ƒƒdS)Nrrtz_cffi_const_%srš) r<rµr\ÚOP_CONSTANT_INTZOP_DLOPEN_CONSTZ OP_CONSTANTrErzrKr)r rCrr Z const_kindr&rrrrä/s    z%Recompiler._generate_cpy_constant_ctxcCs|j|ƒdS)N)rb)r rCrrrrrÿ?sz)Recompiler._generate_cpy_enum_collecttypecCs x|jD]}|jd|ƒqWdS)NT)Ú enumeratorsr )r rCrÚ enumeratorrrrrBs z"Recompiler._generate_cpy_enum_declc Csê|j|}ttd ƒ}|jr"|jƒx:t|j|jƒD](\}}|jdj t |d|||d�ƒq2W|dk rˆd|krˆ|j rˆd|}d|}n4|j |j gƒ} |j j | ƒ}tt|j j| d ƒƒdkƒ}d j|jƒ} |jd j t|j|||| ƒƒdS) Nrrtz_cffi_const_%s)r röz sizeof(%s)z ((%s)-1) <= 0rr.rwršrš)rEr\ÚOP_ENUMr<Zcheck_not_partialÚzipr Z enumvaluesrzrKrZbuild_baseinttyper:ZsizeofÚintÚcastr0r1r) r rCr¾r&r rZ enumvaluer r2Zbasetpr3rrrrFs"        zRecompiler._enum_ctxcCs|j||jƒƒdS)N)rr )r rCrrrrÚ_generate_cpy_enum_ctx[sz!Recompiler._generate_cpy_enum_ctxcCsdS)Nr)r rCrrrrÚ_generate_cpy_macro_collecttypeasz*Recompiler._generate_cpy_macro_collecttypecCs&|dkrd}n|}|jd||d�dS)Nz...T)r )r )r rCrr rrrÚ_generate_cpy_macro_decldsz#Recompiler._generate_cpy_macro_declcCsT|dkr"|jrtd|fƒ‚d}n|}ttdƒ}|jdjt|d|||d�ƒdS)Nz...zGcannot use the syntax '...' in '#define %s ...' when using the ABI moderrtz_cffi_const_%s)r rš)r<rr\r rzrKr)r rCrr r rrrÚ_generate_cpy_macro_ctxks    z"Recompiler._generate_cpy_macro_ctxcCsFt|tjƒrB|j}|dkr$d|f}|j|jd|ƒ}tj||ƒ}|S)Nz...z_cffi_array_len(%s)z%s[0])rMrrÃrSrÈr«)r rCZ global_namerærçrrrrÈ|s   zRecompiler._global_typecCs|j|j||ƒƒdS)N)rbrÈ)r rCrrrrÚ"_generate_cpy_variable_collecttype…sz-Recompiler._generate_cpy_variable_collecttypecCs„|j}|j||ƒ}t|tjƒr4|jdkr4|j}d}nd}d|f}|d|j||jd�ƒ|dƒ|d||fƒ|dƒ|ƒdS) Nrú&z*_cffi_var_%s(void)zstatic )rrr˜z return %s(%s);r™) r„rÈrMrrÃrSr«r·rn)r rCrr¥Z ampersandr—rrrÚ_generate_cpy_variable_declˆs  z&Recompiler._generate_cpy_variable_declcCsL|j||ƒ}|j|}|jr"t}nt}|jdjt|d|t||ƒƒƒdS)Nrtz _cffi_var_%s) rÈrEr<Z OP_GLOBAL_VARZOP_GLOBAL_VAR_FrzrKrr\)r rCrr&r rrrÚ_generate_cpy_variable_ctxŸs   z%Recompiler._generate_cpy_variable_ctxcCst|tjƒst‚|j|ƒdS)N)rMrrRrJrb)r rCrrrrÚ'_generate_cpy_extern_python_collecttype¬sz2Recompiler._generate_cpy_extern_python_collecttypecCs|j}t|jtjƒrd}nd|}d|jjd|ƒf}|d|ƒ|d|j||fƒ|ƒg}d|}x0t|jƒD]"\}} | jd||ƒ} |j | ƒqtWd j |ƒ} | pªd } d || f} |j d krÊd | } dd„} t t |jƒddƒ}| |jƒrút |dƒ}t|jtjƒ�r*d|jjdƒ||jjdƒ|f}|d||jj| ƒfƒ|dƒ|d|ƒ|dƒxft|jƒD]X\}} d|} t| tjƒ�s’| | ƒ�r¤d| } tj| ƒ} |d| jdƒ|d| fƒ�qjW|d|ƒt|jtjƒ�sø|d|jjdƒfƒ|dƒ|ƒ|jd7_dS)Nrîz result of %sz(int)sizeof(%s)rz3static struct _cffi_externpy_s _cffi_externpy__%s =z { "%s.%s", %s };zargument of %sz a%dz, rÕz%s(%s)Ú __stdcallz_cffi_stdcall cSst|tjƒo|jdkS)Nz long double)rMrr×r)rCrrrÚmay_need_128_bitsËs z9Recompiler._extern_python_decl..may_need_128_bitsr6éz!sizeof(%s) > %d ? sizeof(%s) : %dz%s%sr˜z 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;r™r)r„rMrÖrrNr·r;rYrLrKr0rÚr?rrWrPr¤)r rCrZ tag_and_spacer¥Zsize_of_resultrÆrÝr_r¯ràrÞrßrZ size_of_arrrÚ_extern_python_decl³sX          " zRecompiler._extern_python_declcCs|j||dƒdS)Nzstatic )r)r rCrrrrÚ _generate_cpy_extern_python_declèsz+Recompiler._generate_cpy_extern_python_declcCs|j||dƒdS)NzCFFI_DLLEXPORT )r)r rCrrrrÚ#_generate_cpy_dllexport_python_declësz.Recompiler._generate_cpy_dllexport_python_declcCs|j||dƒdS)Nr)r)r rCrrrrÚ'_generate_cpy_extern_python_plus_c_declîsz2Recompiler._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"rtz&_cffi_externpy__%s) r<rrÓrrEr\ZOP_EXTERN_PYTHONrzrKr)r rCrr&r rrrÚ_generate_cpy_extern_python_ctxñs   z*Recompiler._generate_cpy_extern_python_ctxcCsz|j}|dƒxf|jdƒD]X}|d|jƒƒd}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„Ú splitlinesÚrstriprÚord)r Úsr¥ÚlineZ printed_lineÚcrrrr�s  z)Recompiler._print_string_literal_in_arraycCstttƒ|j|<dS)N)r\Ú OP_PRIMITIVEZ PRIM_VOIDrI)r rCrœrrrÚ_emit_bytecode_VoidTypesz"Recompiler._emit_bytecode_VoidTypecCst|j}tt|ƒ|j|<dS)N)ZPRIMITIVE_TO_INDEXrr\r+rI)r rCrœr7rrrÚ_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\r+rI)r rCrœr(rrrÚ!_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\r+rI)r rCrœr(rrrÚ_emit_bytecode_UnknownFloatTypesz*Recompiler._emit_bytecode_UnknownFloatTypecCsÀtt|j|jƒ|j|<|d7}xR|jD]H}|j|}||krht|tjƒrX|j ||ƒntt |ƒ|j|<|d7}q(Wt |j ƒ}|j dk r¬|j dkrœ|dO}ntd|j fƒ‚tt|ƒ|j|<dS)Nrrr4zabi=%r)r\Z OP_FUNCTIONrErÖrIrLrMrr×r-r!rrÓrÚrZOP_FUNCTION_END)r rCrœr^Z realindexr'rrrÚ_emit_bytecode_RawFunctionType#s        z)Recompiler._emit_bytecode_RawFunctionTypecCstt|j|jƒ|j|<dS)N)r\Ú OP_POINTERrErÑrI)r rCrœrrrÚ_emit_bytecode_PointerType6sz%Recompiler._emit_bytecode_PointerTypecCs"|jƒ}tt|j|ƒ|j|<dS)N)rcr\r1rErI)r rCrœÚrawrrrÚ_emit_bytecode_FunctionPtrType<sz)Recompiler._emit_bytecode_FunctionPtrTypecCs’|j|j}|jdkr(tt|ƒ|j|<nf|jdkrNtdt|ƒjddƒfƒ‚n@|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) rEr«rSr\Z OP_OPEN_ARRAYrIrrHr¸rJZOP_ARRAY)r rCrœZ item_indexrrrÚ_emit_bytecode_ArrayType@s   z#Recompiler._emit_bytecode_ArrayTypecCs|j|}tt|ƒ|j|<dS)N)rUr\ZOP_STRUCT_UNIONrI)r rCrœZ struct_indexrrrÚ_emit_bytecode_StructTypeNs z$Recompiler._emit_bytecode_StructTypecCs|j|}tt|ƒ|j|<dS)N)rVr\rrI)r rCrœZ enum_indexrrrÚ_emit_bytecode_EnumTypeSs z"Recompiler._emit_bytecode_EnumType)F)r)N)NrN)N)Urrrr¤rr@rarbrFr{r€r„r‰r•r†rªr…r°r¿rÂrºrÇrÉrÊrËrÌrÒrÔrãrårhrérìrÐròr~rûZ_generate_cpy_union_collecttyperürýZ_generate_cpy_union_declrþZ_generate_cpy_union_ctxrrrr r rÙrärÿrrrrrrrÈrrrrZ*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyperr r!r"r#Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxr�r,r-r.r/r0r2Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyper4r5r6Z_emit_bytecode_UnionTyper7rrrrr9{s¦ : , 4-#  ! Q     5 r9écseZdZ‡fdd„Z‡ZS)ÚNativeIOcs(t|tƒr|jdƒ}tt|ƒj|ƒdS)NÚascii)rMZunicodeÚencodeÚsuperr9rƒ)r r()r[rrrƒ\s  zNativeIO.write)rrrrƒÚ __classcell__rr)r[rr9[sr9c Cs|rtd|fƒt|||dkd�}|jƒ|jƒtƒ}|j||ƒ|jƒ}y@t|dƒ� }|jt |ƒdƒ|krvt ‚WdQRX|rŒtdƒdSt k �rd|t j ƒf} t| dƒ�}|j |ƒWdQRXyt j| |ƒWn,tk �r t j|ƒt j| |ƒYnXd SXdS) Nz generating %s)r<rŠrz(already up-to-date)Fz%s.~%dÚwT)Úprintr9rar€r9r‰Úgetvaluer‹ÚreadrÚIOErrorrŒÚgetpidrƒÚrenameÚOSErrorÚunlink) r:r;rˆZ target_fileÚverboseZ recompilerr‡ÚoutputÚf1Ztmp_filerrrÚ_make_c_or_py_sourceas4     rJFcCs|dk s t‚t|||||ƒS)N)rJrJ)r:r;rˆZ target_c_filerGrrrÚ make_c_source}s  rKcCst||d||ƒS)N)rJ)r:r;Ztarget_py_filerGrrrÚmake_py_source‚s rLc Csj|jdƒ}y$tjtjj|f|dd…žŽƒWntk rBYnX|d|7<tjj|f|žŽ|fS)Nr–rršrš)rlrŒÚmakedirsr�r0rE)Z outputdirÚmodnameÚ extensionÚpartsrrrÚ_modname_to_file†s $rQcCs*t||ƒ}|j|||fƒt|||ƒ|S)N)rZrKÚsetattr)Ú patchlistÚclsrZnew_methÚoldrrrÚ _patch_meth”s  rVcCs(x"t|ƒD]\}}}t|||ƒq WdS)N)ÚreversedrR)rSrTrZold_methrrrÚ_unpatch_methsšsrXcs\tjdkr(ddlm}t||ddd„ƒtjdkrXddlm}‡fd d „}t||d |ƒ‰dS) NÚwin32r)Ú MSVCCompilerZ_remove_visual_c_refcSs|S)Nr)r Z manifest_filerrrrD£sz&_patch_for_embedding..Údarwin)Ú CCompilercs<d|jkr,t|jƒ|_|jjdƒ}d|j|<ˆ|f|ž|ŽS)Nz-bundlez -dynamiclib)Z linker_sor¬rœ)r rLÚkwdsr_)Úold_link_shared_objectrrÚmy_link_shared_object¨s     z3_patch_for_embedding..my_link_shared_objectZlink_shared_object)ÚsysÚplatformZdistutils.msvc9compilerrZrVZdistutils.ccompilerr\)rSrZr\r_r)r^rÚ_patch_for_embeddingžs      rbcslddlm}ˆjdƒrRˆdd …‰tjdkr6ˆd7‰ntjdkrJˆd7‰nˆd 7‰t||d ‡fd d „ƒdS)Nr)Ú build_extz.*r4rYz.dllr[z.dylibz.soZget_ext_filenamecsˆS)Nr)r Zext_name)ÚtargetrrrDÀsz#_patch_for_target..rï)Zdistutils.command.build_extrcÚendswithr`rarV)rSrdrcr)rdrÚ_patch_for_target²s       rfr–Tú.cc  Ksžt|tƒs|jdƒ}|jr$|j| ƒ|dk �r^|jdk } | rF|j| ƒ|dkrzt|||ƒ\}} |rl|g| } tj j | Ž}n|}| dkr˜| r”d|} nd} t j ||f| Ž}t |||||d�}|�rTg}tjƒ}zn| rÚt|ƒ| dkrìt|| ƒ|�r|dk�rd}nd}td|tj j|ƒfƒtj|ƒt jd||| ƒ}Wdtj|ƒt|ƒX|S||fSn<|dk�rxt||d ƒ\}}t||||d�}|�r’|Sd|fSdS) Nr:z%s.*r)rGr–zthe current directory isz setting the current directory toz%s %rz.py)rMrHr;Z_windows_unicodeZ_apply_windows_unicoder›Z_apply_embedding_fixrQrŒr�r0rZ get_extensionrKÚgetcwdrbrfr?ÚabspathÚchdirÚcompilerXrL)r:r;rˆÚtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verboserdÚdebugr]Z embeddingrPZ ext_c_fileZextÚupdatedrSÚcwdÚmsgÚoutputfilenamerjrrrÚ recompileÃsb                  rrc Osðddlm}ddl}|tjks,td|fƒ‚|jdt|ƒƒt|||f|ž|Ž}|j ||ƒ}xFt |j ƒD]8} | j dƒsht |j | ƒ} | t || tƒƒk rht|| | ƒqhWdd„} | |_x6t |ƒD]*} | j dƒ r¼t|j | ƒ r¼t|| tƒq¼W|jS)Nr)Úudirzmodule name conflict: %rrlrjc_st‚dS)N)r)rLr]rrrÚtypeof_disabledsz _verify..typeof_disabled)Z testing.udirrsÚimpr`ÚmodulesrJÚ setdefaultrHrrZ load_dynamicÚdirr:rørZÚobjectrRZ_typeofÚhasattrÚNotImplementedÚlib) r:r;rˆrLr]rsrurqÚmodulerÚattrrtrrrÚ_verifys$     r)r8)F)F)r–TNrgNrNN) rŒr`ÚiorrrÚerrorrZ cffi_opcoder=ržr¹rrr%r1r8r9Ú version_infoÚStringIOr9ÚBytesIOrJrKrLrQrVrXrbrfrrrrrrrÚsH f    <