a
    (ñ»jåÿ  ã                	   @   sL  d dl Z d dlZd dlZd dlZddlmZmZ ddlmZ ddl	T dZ
dZdZejd	ksnejd
k snejdkoxe d¡ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZejdkràe jZnG dd„ de jƒZdd„ Zdd„ Zd4d!d"„Zd5d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!d-d.„ Z"d6d2d3„Z#dS )7é    Né   )ÚffiplatformÚmodel)ÚVerificationError)Ú*i&  i'  i(  Úwin32)é   r   )r   é   ÚPy_GIL_DISABLEDc                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
Ú
GlobalExprr   c                 C   s"   || _ || _|| _|| _|| _d S ©N)ÚnameÚaddressÚtype_opÚsizeÚcheck_value)Úselfr   r   r   r   r   © r   ú5E:\soccer\ml_env\Lib\site-packages\cffi/recompiler.pyÚ__init__   s
    zGlobalExpr.__init__c                 C   s   d| j | j| j ¡ | jf S )Nz'  { "%s", (void *)%s, %s, (void *)%s },)r   r   r   Ú	as_c_exprr   ©r   r   r   r   r      s    ÿzGlobalExpr.as_c_exprc                 C   s   d| j  ¡ | j| jf S )Nz
b'%s%s',%d)r   Úas_python_bytesr   r   r   r   r   r   Úas_python_expr   s    ÿzGlobalExpr.as_python_exprN)r   r   ©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r      s   
r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	FieldExprc                 C   s"   || _ || _|| _|| _|| _d S r   )r   Úfield_offsetÚ
field_sizeÚfbitsizeÚfield_type_op)r   r   r   r    r!   r"   r   r   r   r      s
    zFieldExpr.__init__c                 C   s>   dt | jƒ }d| j| jf d|| jf  d|| j ¡ f  S )Nú z  { "%s", %s,
z     %s   %s,
z     %s   %s },)Úlenr   r   r    r"   r   )r   Úspacesr   r   r   r   &   s    ÿþzFieldExpr.as_c_exprc                 C   s   t ‚d S r   )ÚNotImplementedErrorr   r   r   r   r   ,   s    zFieldExpr.as_python_exprc                 C   sD   | j jtkrd}n| j jtkr*t| jƒ}nt‚d| j  ¡ || jf S )NÚ z	b'%s%s%s')	r"   ÚopÚOP_NOOPÚOP_BITFIELDÚformat_four_bytesr!   r&   r   r   )r   Z	size_exprr   r   r   Úas_field_python_expr/   s    
þzFieldExpr.as_field_python_exprN)r   r   r   r   r   r   r,   r   r   r   r   r      s   r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStructUnionExprc	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S r   )r   Ú
type_indexÚflagsr   Ú	alignmentÚcommentÚfirst_field_indexÚc_fields)	r   r   r.   r/   r   r0   r1   r2   r3   r   r   r   r   ;   s    zStructUnionExpr.__init__c                 C   sP   d| j | j| jf d| j| jf  d| jt| jƒf  | jrFd| j nd d S )Nz  { "%s", %d, %s,z
    %s, %s, z%d, %d z	/* %s */ r'   z},)	r   r.   r/   r   r0   r2   r$   r3   r1   r   r   r   r   r   F   s    ÿþýüzStructUnionExpr.as_c_exprc                 C   s>   t | jtƒ}dd„ | jD ƒ}dt| jƒt|ƒ| jd |¡f S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )r,   )Ú.0Zc_fieldr   r   r   Ú
<listcomp>O   s   ÿz2StructUnionExpr.as_python_expr.<locals>.<listcomp>z(b'%s%s%s',%s)ú,)Úevalr/   ZG_FLAGSr3   r+   r.   r   Újoin)r   r/   Zfields_exprr   r   r   r   M   s    ÿüzStructUnionExpr.as_python_exprNr   r   r   r   r   r-   :   s   r-   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚEnumExprc                 C   s"   || _ || _|| _|| _|| _d S r   ©r   r.   r   ÚsignedÚallenums)r   r   r.   r   r;   r<   r   r   r   r   X   s
    zEnumExpr.__init__c                 C   s   d| j | j| j| j| jf S )Nz1  { "%s", %d, _cffi_prim_int(%s, %s),
    "%s" },r:   r   r   r   r   r   _   s
    ÿÿzEnumExpr.as_c_exprc              	   C   s@   t tttttttdœ| j| j	f }dt
| jƒt
|ƒ| j| jf S )N))r   r   )r   r   )é   r   )r=   r   )é   r   )r>   r   )é   r   )r?   r   zb'%s%s%s\x00%s')Z
PRIM_UINT8Z	PRIM_INT8ZPRIM_UINT16Z
PRIM_INT16ZPRIM_UINT32Z
PRIM_INT32ZPRIM_UINT64Z
PRIM_INT64r   r;   r+   r.   r   r<   )r   Ú
prim_indexr   r   r   r   d   s    ü
û
þzEnumExpr.as_python_exprNr   r   r   r   r   r9   W   s   r9   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTypenameExprc                 C   s   || _ || _d S r   ©r   r.   )r   r   r.   r   r   r   r   p   s    zTypenameExpr.__init__c                 C   s   d| j | jf S )Nz  { "%s", %d },rB   r   r   r   r   r   t   s    zTypenameExpr.as_c_exprc                 C   s   dt | jƒ| jf S )Nzb'%s%s')r+   r.   r   r   r   r   r   r   w   s    zTypenameExpr.as_python_exprNr   r   r   r   r   rA   o   s   rA   c                   @   s‚  e Zd ZdZd•dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	g d¢Z
dd„ Zd–dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d—d@dA„Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%e%Z&dHdI„ Z'dJdK„ Z(e(Z)dLdM„ Z*e*Z+dNdO„ Z,dPdQ„ Z-dRdS„ Z.d˜dUdV„Z/dWdX„ Z0dYdZ„ Z1d[d\„ Z2d]d^„ Z3d™d_d`„Z4dadb„ Z5dcdd„ Z6dedf„ Z7dgdh„ Z8didj„ Z9dkdl„ Z:dmdn„ Z;dodp„ Z<dqdr„ Z=dsdt„ Z>e> Z?Z@dudv„ ZAdwdx„ ZBdydz„ ZCd{d|„ ZDd}d~„ ZEeE ZFZGdd€„ ZHd�d‚„ ZIdƒd„„ ZJd…d†„ ZKd‡dˆ„ ZLd‰dŠ„ ZMd‹dŒ„ ZNeNZOeNZPd�dŽ„ ZQd�d�„ ZRd‘d’„ ZSeSZTd“d”„ ZUd?S )šÚ
Recompilerr   Fc                 C   s   || _ || _|| _t| _d S r   )ÚffiÚmodule_nameÚtarget_is_pythonÚVERSION_BASEÚ_version)r   rD   rE   rF   r   r   r   r   �   s    zRecompiler.__init__c                 C   s   t | j|ƒ| _d S r   )ÚmaxrH   )r   Úverr   r   r   Úneeds_version‡   s    zRecompiler.needs_versionc              	   C   s.  i | _ |  d¡ t| j td�}g | _|D ]œ}|jr(| j | d u sDJ ‚t| jƒ| j |< | j |¡ |jD ]P}t	|t
jt
jt
jt
jt
jfƒsŒJ ‚| j | d u rªt| jƒ| j |< | j |¡ qf| j d¡ q(|D ]P}|jsÊ| j | d u rÊt| jƒ| j |< | j |¡ |jrÊ|jd urÊ| j d¡ qÊd | j  ¡ v�s0J ‚i | _i | _|D ]8}t	|t
jƒ�r^d | j|< nt	|t
jƒ�r@d | j|< �q@tt| jdd„ d�ƒD ]\}}|| j|< �q�tt| jdd„ d�ƒD ]\}}|| j|< �q¼|D ](}t| d|jj ƒ}||| j | ƒ �qÖ| jD ]}t	|tƒ�sJ ‚�qt| jƒ| _d S )	NZcollecttype©ÚkeyÚENDÚLENc                 S   s   | j S r   ©r   ©Útpr   r   r   Ú<lambda>´   ó    z/Recompiler.collect_type_table.<locals>.<lambda>c                 S   s   | j S r   rP   rQ   r   r   r   rS   ·   rT   Z_emit_bytecode_)Ú
_typesdictÚ	_generateÚsortedÚstrÚ
cffi_typesZis_raw_functionr$   Ú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_declsrR   Útp1ÚiÚmethodr(   r   r   r   Úcollect_type_tableŠ   s`    

ü
ÿÿ
zRecompiler.collect_type_tablec                 C   s   | j  }| |¡S r   )rF   Ú
enumfields)r   rR   Zexpand_anonymous_struct_unionr   r   r   Ú_enum_fieldsÄ   s    zRecompiler._enum_fieldsc                 C   sÐ   t |tjƒs.t |tƒr*|D ]}|  |¡ qd S || jvrÌd | j|< t |tjƒr^|  | ¡ ¡ nnt |tjƒr°|j	d urÌ|| j
jjvrÌ|  |¡D ] \}}}}|  |  |||¡¡ qŒn| ¡ D ]\}}|  |¡ q¸d S r   )r\   r   ZBaseTypeByIdentityrl   Ú_do_collect_typerU   ra   Úas_raw_functionrf   ÚfldtypesrD   Ú_parserÚ_included_declarationsrr   Ú_field_typeZ
_get_items)r   rR   ÚxZname1rm   Ú_r   r   r   rs   Ï   s"    



ÿzRecompiler._do_collect_typec           
      C   s¶   | j jj ¡ }t|ƒD ]š\}\}}| dd¡\}}zt| d||f ƒ}W n tyf   td| ƒ‚Y n0 z|| _	|||ƒ W q t
y® }	 zt |	|¡ ‚ W Y d }	~	qd }	~	0 0 qd S )Nr#   r   z_generate_cpy_%s_%sz"not implemented in recompile(): %r)rD   rv   Z_declarationsÚitemsrW   Úsplitri   ÚAttributeErrorr   Ú_current_qualsÚ	Exceptionr   Zattach_exception_info)
r   Ú	step_nameÚlstr   rR   ÚqualsÚkindZrealnamero   Úer   r   r   rV   â   s"    ÿÿ
zRecompiler._generate)ÚglobalÚfieldÚstruct_unionÚenumÚtypenamec                 C   s(  i | _ | jD ]}g | j |< qtƒ | _|  d¡ |  ¡  | jD ]4}| j | }|dkrb|jdd„ d� t|ƒ| j |< q<| j d }| j 	¡ D ],\}}|t
|ƒk sžJ ‚|| j|jks†J ‚q†t
|ƒt
| jƒksÊJ ‚| j d }| j 	¡ D ],\}}|t
|ƒk söJ ‚|| j|jksÞJ ‚qÞt
|ƒt
| jƒk�s$J ‚d S )NÚctxr†   c                 S   s   | j S r   rP   )Úentryr   r   r   rS     rT   z0Recompiler.collect_step_tables.<locals>.<lambda>rL   r‡   rˆ   )Ú_lstsÚ	ALL_STEPSÚsetÚ_seen_struct_unionsrV   Ú_add_missing_struct_unionsÚsortrl   rd   r{   r$   r   re   )r   r€   r�   rR   rn   r   r   r   Úcollect_step_tables÷   s*    





zRecompiler.collect_step_tablesr'   c                 C   s   | j  |d ¡ d S )NÚ
)Ú_fÚwrite)r   Úwhatr   r   r   Ú_prnt  s    zRecompiler._prntc                 C   s:   | j r|d u sJ ‚|  |¡ n|d us*J ‚|  ||¡ d S r   )rF   Úwrite_py_source_to_fÚwrite_c_source_to_f)r   ÚfÚpreambler   r   r   Úwrite_source_to_f  s
    zRecompiler.write_source_to_fc                 C   s0   t tj tj t¡|¡dƒ}| ¡ }| ¡  |S )NÚr)ÚopenÚosÚpathr8   ÚdirnameÚ__file__Ú	readlinesÚclose)r   ÚfilenameÚgÚlinesr   r   r   Ú_rel_readlines!  s    zRecompiler._rel_readlinesc              	   C   s€  || _ | j}| jjd ur |dƒ ts,|dƒ |  d¡}| d¡}|  d¡|||d …< |d |¡ƒ | j 	d¡d	 }| jjd u�r<|d
| jf ƒ |dƒ |  
| jj¡ |dƒ |dƒ |d|f ƒ |dƒ |d|f ƒ |dƒ |d|f ƒ |dƒ |  d¡}| d¡}|  d¡|||d …< |d |¡ƒ |  t¡ |dƒ |ƒ  ||ƒ |ƒ  |dƒ |ƒ  |dƒ tdd„ | j ¡ D ƒƒ}t| jƒD ]>\}}d}	||v �r¶d||  ¡  }	|d|| ¡ |	f ƒ �q�| j�sà|dƒ |dƒ |ƒ  tƒ | _|  d¡ i }
| jD ]`}| j| }t|ƒ|
|< |
| d k�r
|d!||f ƒ |D ]}|| ¡ ƒ �qF|dƒ |ƒ  �q
| jj�r|d"ƒ | jjD ]d}z|jd d#… \}}W n& t�yÆ   td$| j|f ƒ‚Y n0 |d u �rÚtd%ƒ‚|d&|f ƒ �q†|d'ƒ |dƒ |ƒ  |d(ƒ |d)ƒ | jD ].}|
| d k�r8|d*| ƒ n|d+| ƒ �q| jD ]$}|d,k�rN|d-|
| |f ƒ �qN| jj�rˆ|d.ƒ n|d/ƒ |d0t| jƒf ƒ d }| jd k�sÂ| jjd u�rÊ|dO }|d1| ƒ |dƒ |ƒ  |d2ƒ |d3ƒ |dƒ |ƒ  |dƒ |d4ƒ |d5|f ƒ |d6ƒ |d@ �rJ|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| jf ƒ |d>ƒ |dƒ |d4ƒ |dH|f ƒ |d6ƒ |dI| j| jf ƒ |d>ƒ |dƒ |ƒ  |d2ƒ |dJƒ |dƒ d | _d S )KNz#define _CFFI_USE_EMBEDDINGz#define _CFFI_NO_LIMITED_APIz_cffi_include.hz#include "parse_c_type.h"
zparse_c_type.hr   r'   Ú.éÿÿÿÿz#define _CFFI_MODULE_NAME  "%s"z1static const char _CFFI_PYTHON_STARTUP_CODE[] = {z0 };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>/************************************************************/zstatic void *_cffi_types[] = {c                 S   s   g | ]\}}||f‘qS r   r   ©r4   rR   rn   r   r   r   r5   W  rT   z2Recompiler.write_c_source_to_f.<locals>.<listcomp>z // z/* %2d */ %s,%sz  0z};Údeclr   z.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= */ZPyMODINIT_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#  endifzPyInit_%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—   rD   Ú
_embeddingÚUSE_LIMITED_APIr¨   Úindexr8   rE   r|   Ú_print_string_literal_in_arrayrK   ÚVERSION_EMBEDDEDÚdictrU   r{   rh   rY   Ú_get_c_namer   rŽ   Ú_seen_constantsrV   r�   rŒ   r$   Ú_included_ffisÚ_assigned_sourcer}   r   Ú_num_externpyrH   )r   rš   r›   Úprntr§   rn   Zbase_module_nameÚtypeindex2typer(   r1   Znumsr€   r�   r‹   Úffi_to_includeÚincluded_module_nameÚincluded_sourcer/   r   r   r   r™   '  s2   

ÿÿÿ






ÿ

ÿ
ÿÿÿ

ÿ





ÿÿzRecompiler.write_c_source_to_fc                    sb   t |tƒrd|f S t |ttfƒrZ‡ fdd„|D ƒ}t|ƒdkrJ| d¡ dd |¡f S | ¡ S )Nzb'%s'c                    s   g | ]}ˆ   |¡‘qS r   )Ú_to_py)r4   Úitemr   r   r   r5   Ø  rT   z%Recompiler._to_py.<locals>.<listcomp>r   r'   z(%s)r6   )r\   rX   Úlistrl   r$   rZ   r8   r   )r   ry   Úrepr   r   r   rÃ   Ô  s    


zRecompiler._to_pyc              	   C   sš  || _ | j}|dƒ |dƒ t| jjp(dƒ}t|ƒD ]l}| jj| }z|jd d… \}}W n$ ty~   td| j|f ƒ‚Y n0 |d ur�tdƒ‚|d||f ƒ q4|ƒ  |d| j	f ƒ |d	| j
f ƒ d | _
t| jƒ| _d
d„ | jD ƒ}|d|  d |¡¡f ƒ tdd„ | j ¡ D ƒƒ}	| jD ]>}
| j|
 }t|ƒdk�r"|
dk�r"|d|
|  |¡f ƒ �q"|dk�rŽ|dd dd„ t|ƒD ƒ¡f ƒ |dƒ d S )Nz# auto-generated filezimport _cffi_backendr   r=   r¯   zMnot implemented yet: ffi.include() of a C-based ffi inside a Python-based ffizfrom %s import ffi as _ffi%dzffi = _cffi_backend.FFI('%s',z    _version = 0x%x,c                 S   s   g | ]}|  ¡ ‘qS r   )r   )r4   r(   r   r   r   r5   þ  rT   z3Recompiler.write_py_source_to_f.<locals>.<listcomp>z    _types = %s,r'   c                 S   s   g | ]\}}||f‘qS r   r   r­   r   r   r   r5      rT   r   r†   z    _%ss = %s,z    _includes = (%s,),ú, c                 S   s   g | ]}d | ‘qS )z_ffi%dr   ©r4   rn   r   r   r   r5     rT   ú))r”   r—   r$   rD   r»   Úranger¼   r}   r   rE   rH   rl   rY   rÃ   r8   r¸   rU   r{   r�   rŒ   )r   rš   r¾   Znum_includesrn   rÀ   rÁ   rÂ   Z	types_lstr¿   r€   r�   r   r   r   r˜   Þ  sN    ÿ
ÿÿÿ
ÿ


ÿzRecompiler.write_py_source_to_fc                 C   s
   | j | S r   )rU   )r   Útyper   r   r   Ú_gettypenum  s    zRecompiler._gettypenumc           	      C   sn  d}t |tjƒr�| ¡ s�| ¡ r:|jdkr:d}d|j }nPt |tjƒrXd| d¡f }n2| d¡}d||j dd¡f }|d	v rŠ|  	t
¡ d
}nœt |tjƒr°|  ||||¡ d S t |tjƒsÈt |tjƒrô|  d||  |¡|f ¡ |  d| ¡ d S t |tjƒ�r$d| d¡ }d|  |¡ }d}nt|ƒ‚|  d||||f ¡ |  d|| d¡|f ¡ |  d| ¡ d S )Nr'   Ú_BoolZ_cffi_to_c_intz, %sz(%s)_cffi_to_c_doublez(%s)_cffi_to_c_%sr#   rz   ©Zchar16_tZchar32_tz-1z6  if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)z    %s;z(%s)_cffi_to_c_pointerz, _cffi_type(%d)ÚNULLz  %s = %s(%s%s);z'  if (%s == (%s)%s && PyErr_Occurred()))r\   r   r^   Úis_complex_typeÚis_integer_typer   ÚUnknownFloatTypeÚ
get_c_nameÚreplacerK   ÚVERSION_CHAR16CHAR32r_   Ú"_convert_funcarg_to_c_ptr_or_arrayr`   r—   rÌ   ra   r&   )	r   rR   ÚfromvarÚtovarÚerrcodeZextraargÚ	converterÚcnameZerrvaluer   r   r   Ú_convert_funcarg_to_c  sJ    
ÿ
ÿ
ÿÿÿz Recompiler._convert_funcarg_to_cc                 C   s.   t |tjƒr*| d¡ | d¡ | d¡ d S )NzPy_ssize_t datasizez-struct _cffi_freeme_s *large_args_free = NULLzIif (large_args_free != NULL) _cffi_free_array_arguments(large_args_free);)r\   r   r_   Úadd)r   rR   Ú	localvarsÚ	freelinesr   r   r   Ú_extra_local_variablesC  s    

z!Recompiler._extra_local_variablesc                 C   s†   |   d¡ |   d|  |¡||f ¡ |   d¡ |   d|| d¡f ¡ |   d|  |¡||f ¡ |   d¡ |   d| ¡ |   d	¡ d S )
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  })r—   rÌ   rÓ   )r   rR   r×   rØ   rÙ   r   r   r   rÖ   J  s    
ÿ

ÿÿÿ
z-Recompiler._convert_funcarg_to_c_ptr_or_arrayc                 C   sJ  t |tjƒr”| ¡ r,|jdkr,d||jf S t |tjƒrBd|f S |jdkr€| ¡ s€|j dd¡}|dv rt|  t	¡ d||f S d	||  
|¡f S n²t |tjtjfƒr¸d
||  
|¡f S t |tjƒrÞd
||  
t |j¡¡f S t |tjƒ�r|jd u �rtd| ¡ |f ƒ‚d||  
|¡f S t |tjƒ�r>d	||  
|¡f S t|ƒ‚d S )NrÍ   z_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s)úlong doubler#   rz   rÎ   z_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\   r   r^   rÑ   r   rÒ   rÐ   rÔ   rK   rÕ   rÌ   r_   ra   Ú	ArrayTyperÄ   rf   ZfldnamesÚ	TypeErrorr¹   rg   r&   )r   rR   ÚvarÚcontextrÛ   r   r   r   Ú_convert_expr_from_cX  sD    


ÿ
ÿÿÿ
ÿ
ÿzRecompiler._convert_expr_from_cc                 C   s   |   |d|f ¡S )Nz
(*(%s *)0))Ú_global_type©r   rR   r   r   r   r   Ú_typedef_type{  s    zRecompiler._typedef_typec                 C   s   |   |  ||¡¡ d S r   )rs   ré   rè   r   r   r   Ú!_generate_cpy_typedef_collecttype~  s    z,Recompiler._generate_cpy_typedef_collecttypec                 C   s   d S r   r   rè   r   r   r   Ú_generate_cpy_typedef_decl�  s    z%Recompiler._generate_cpy_typedef_declc                 C   s$   | j | }| jd  t||ƒ¡ d S )Nr‰   )rU   rŒ   rZ   rA   )r   rR   r   r.   r   r   r   Ú_typedef_ctx„  s    
zRecompiler._typedef_ctxc                 C   sf   |   ||¡}|  ||¡ t|dd ƒdkr<| j||jd d� n&t|tjƒrb| j|j|jj|j|d� d S )NÚoriginZunknown_type)Ú
approxname)rî   Ú	named_ptr)	ré   rì   ri   Ú_struct_ctxr   r\   r   ZNamedPointerTypeÚtotyperè   r   r   r   Ú_generate_cpy_typedef_ctxˆ  s    ÿz$Recompiler._generate_cpy_typedef_ctxc                 C   s(   |   | ¡ ¡ |jr$| js$|   |¡ d S r   )rs   rt   ÚellipsisrF   rè   r   r   r   Ú"_generate_cpy_function_collecttype”  s    z-Recompiler._generate_cpy_function_collecttypec              	   C   s   | j r
J ‚t|tjƒsJ ‚|jr0|  ||¡ d S | j}t|jƒ}|dkrNd}n|dkr\d}nd}g }g }d| }t	|jƒD ],\}	}
| 
|
 d|	 |¡¡ | 
d|	 ¡ qzd	 |¡}|p¸d
}|jrÌ|jd }nd}d|||f }|d|j |¡f ƒ |dƒ d	 |¡}d}t|jtjƒ�rd}|d|||f ƒ |dƒ |dƒ |dƒ |d||f ƒ |dƒ d| }t	|jƒD ]&\}	}
|
 d|	 |¡}|d| ƒ �qrtƒ }tƒ }|jD ]}
|  |
||¡ �q¬t|ƒD ]}|d|f ƒ �qÊt|jtjƒ�s d}d| }d|j d|¡ }||ƒ |dƒ nd }d}t|jƒdk�r˜tt|jƒƒ}|D ]}	|d|	 ƒ �qJ|ƒ  |d|t|ƒt|ƒd	 dd„ |D ƒ¡f ƒ |dƒ |ƒ  t	|jƒD ](\}	}
|  |
d |	 d|	 d!¡ |ƒ  �q¨|d"ƒ |d#ƒ d$d„ tt|jƒƒD ƒ}d	 |¡}|d%|||f ƒ |d&ƒ |d'ƒ |ƒ  |d(ƒ |dk�rF|d)ƒ |�r†|d*|  |jd+d,¡ ƒ |D ]}|d-| ƒ �qh|d.ƒ n(|D ]}|d-| ƒ �qŠ|d/ƒ |d0ƒ |dƒ |d1ƒ d2d3„ }d4}g }g }d| }t	|jƒD ]P\}	}
d}||
ƒ�rd5}d6}|
 d7||	f |¡}| 
|¡ | 
d8||	f ¡ �qä|j}||ƒ�rxd| }| d9|¡}| d|¡ tj}d }d:}d6}|�rþd	 |¡}|�p�d
}d;|||f }|d| |¡f ƒ |dƒ |�rÊ||ƒ d	 |¡}|d%|||f ƒ |�rô|d<ƒ |dƒ n|d=||f ƒ |d>ƒ |ƒ  d S )?Nr   Znoargr   Zarg0r[   úargument of %sz x%dúx%drÇ   Úvoidr#   r'   z%s_cffi_d_%s(%s)z	static %sr°   zreturn z  %s%s(%s);r²   z#ifndef PYPY_VERSIONzstatic 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))c                 S   s   g | ]}d | ‘qS )z&arg%dr   rÈ   r   r   r   r5   æ  rT   z:Recompiler._generate_cpy_function_decl.<locals>.<listcomp>r±   zarg%dzreturn NULLz  Py_BEGIN_ALLOW_THREADSz  _cffi_restore_errno();c                 S   s   g | ]}d | ‘qS )rö   r   rÈ   r   r   r   r5   ñ  rT   z  { %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;r«   c                 S   s    t | tjƒpt | tjƒo|  ¡ S r   )r\   r   rf   ÚPrimitiveTyperÐ   )rË   r   r   r   Úneed_indirection  s    þz@Recompiler._generate_cpy_function_decl.<locals>.need_indirectionFr   Tz %sx%dz%sx%dz *resultz
*result = z%s_cffi_f_%s(%s)z  return result;z#  define _cffi_f_%s _cffi_d_%sr¬   )rF   r\   r   ra   ró   Ú_generate_cpy_constant_declr—   r$   r[   rh   rZ   rÓ   r8   Úabirù   r]   rŽ   rà   rW   rÊ   rÜ   ræ   ÚinsertZ	void_type)r   rR   r   r¾   ÚnumargsÚargnameÚ	argumentsZcall_argumentsrå   rn   rË   Úrepr_argumentsrý   Úname_and_argumentsZresult_codeÚargrÞ   rß   r®   Zresult_declÚrngZfreelinerû   Ú
differenceZindirectionZ	tp_resultr   r   r   Ú_generate_cpy_function_decl™  s   





þÿ


ÿ





ÿ

z&Recompiler._generate_cpy_function_declc                 C   sŽ   |j r| js|  ||¡ d S | j| ¡  }t|jƒ}| jr@t}n |dkrNt}n|dkr\t	}nt
}| jd  t|d| t||ƒd| d�¡ d S )Nr   r   r…   z
_cffi_f_%sz
_cffi_d_%s)r   )ró   rF   Ú_generate_cpy_constant_ctxrU   rt   r$   r[   ZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_VrŒ   rZ   r   rk   )r   rR   r   r.   rÿ   Z	meth_kindr   r   r   Ú_generate_cpy_function_ctx;  s$    


þÿz%Recompiler._generate_cpy_function_ctxc                 C   sT   t |tjƒrP|j}|dkr0| d¡}d||f }|  |d| |j¡}t ||¡}|S )Nú...r   z_cffi_array_len(((%s)0)->%s)ú%s[0])r\   r   râ   rb   rÓ   rx   rÄ   )r   Z	tp_structÚ
field_nameZtp_fieldÚactual_lengthZptr_struct_nameÚtp_itemr   r   r   rx   Q  s    
ÿÿzRecompiler._field_typec                 C   s,   |   |¡ | jr(| ¡ D ]}|  |¡ qd S r   )rs   rF   Úanonymous_struct_fieldsÚ_struct_collecttype)r   rR   Úfldtyper   r   r   r  ]  s    
zRecompiler._struct_collecttypec                 C   sB  |j d u rd S | j}d|f }|dƒ |d||f ƒ |dƒ |dƒ |dƒ |  |¡D ]Æ\}}}}	z‚| ¡ sv|dkr”|dkr�|d	|||f ƒ W qXt|tjƒrÄ|jd u s´|jd
krÄ|j}|d }q”|d|j	dd| |	d�|f ƒ W qX t
�y }
 z|dt|
ƒ ƒ W Y d }
~
qXd }
~
0 0 qX|dƒ |d||f ƒ |ƒ  d S )Nz_cffi_checkfld_%sZ_CFFI_UNUSED_FNzstatic void %s(%s *p)r°   z8  /* only to generate compile-time warnings or errors */z
  (void)p;r   r'   z>  (void)((p->%s) | 0);  /* check that '%s.%s' is an integer */r
  z[0]z  { %s = &p->%s; (void)tmp; }z*tmpzfield %r©r‚   z
  /* %s */r²   z(struct _cffi_align_%s { char x; %s y; };)ru   r—   rr   rÑ   r\   r   râ   rb   rÄ   rÓ   r   rX   )r   rR   rÛ   rî   r¾   ZcheckfuncnameÚfnameZftyper!   Úfqualr„   r   r   r   Ú_struct_decld  sB    

ÿÿÿ
þ(zRecompiler._struct_declNc                 C   s¬  | j | }d }g }t|tjƒr(| d¡ |jd u r@| d¡ d}|| jjjvr¼|d u sd|| jjjvr¼|jd u rpn|j	sŽt
| ¡ ƒr„n
| d¡ |jrÊ|jdkr°td||jf ƒ‚| d¡ n| d¡ d	}d
 |¡pÖd}g }|d u �rht|  |¡ƒ}	|	D �] \}
}}}|  ||
|¡}|  |d|j|
f ¡ t}|dk�rFt}d| }nL|d u �sjt|tjƒ�rp|jd u �rpd}n"d|d u �r†| d¡n|j|
f }|d u �s¦|dk�r¬d}n,|d u�rÆd|j|
f }nd| d¡|
f }| t|
|||t|| j | ƒƒ¡ qøt| jd ƒ}| jd  |¡ |d u �r2d}d}d}n4|d u�rNd|jf }d}nd|f }d|f }d }nd}d}d}|}| jd  t|j|||||||ƒ¡ | j  |¡ d S )NZ_CFFI_F_UNIONZ_CFFI_F_OPAQUEÚopaqueZ_CFFI_F_CHECK_FIELDSr   z…%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_EXTERNALZexternalú|Ú0zfield '%s.%s'r   z%d /* bits */z
(size_t)-1zsizeof(((%s)0)->%s)r   z2(size_t)(((char *)&((%s)4096)->%s) - (char *)4096)zoffsetof(%s, %s)r'   r†   z
(size_t)-2éþÿÿÿÚunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */ú
sizeof(%s)z"offsetof(struct _cffi_align_%s, y)rª   r‡   )!rU   r\   r   Z	UnionTyperZ   ru   rD   rv   rw   ÚpartialÚanyr  Úpackedr&   r8   rÅ   rr   rx   Ú_check_not_opaquer   r)   r*   râ   rb   rÓ   r   rk   r$   rŒ   Úextendr-   r�   rÝ   )r   rR   rÛ   rî   rï   r.   Zreason_for_not_expandingr/   r3   rq   Zfldnamer  r!   r  r(   r   Úoffsetr2   Úalignr1   r   r   r   rð   †  s¬    



ÿþ


ýÿ

ÿ



ÿþý
ÿ
ÿÿ




ÿÿzRecompiler._struct_ctxc                 C   s:   t |tjƒr|j}q t |tjƒr6|jd u r6td| ƒ‚d S )Nz0%s is of an opaque type (not declared in cdef()))r\   r   râ   rÄ   rf   ru   rã   )r   rR   Úlocationr   r   r   r  Ü  s    ÿzRecompiler._check_not_opaquec                 C   s¾   t | j ¡ ƒ}|jdd„ d� |D ]–\}}|| jvr"|jrHtd|f ƒ‚|j d¡rv|jdd …  	¡ rv|jdd … }n4|jdkrœ|j
dkrœd}|  |d¡ ntd	|f ƒ‚|  |d |¡ q"d S )
Nc                 S   s   | d S )Nr   r   )Ztp_orderr   r   r   rS   é  rT   z7Recompiler._add_missing_struct_unions.<locals>.<lambda>rL   zDinternal inconsistency: %r is partial but was not seen at this pointú$r   Z_IO_FILEÚFILEzinternal inconsistency: %r)rÅ   rd   r{   r‘   r�   r  r&   r   Ú
startswithÚisdigitZ	forcenamerì   rð   )r   r�   rR   Úorderrî   r   r   r   r�   ã  s"    
þÿz%Recompiler._add_missing_struct_unionsc                 C   s   |   |¡ d S r   )r  rè   r   r   r   Ú _generate_cpy_struct_collecttypeú  s    z+Recompiler._generate_cpy_struct_collecttypec                 C   s2   |  d¡}d|v r"|| dd¡fS |d| fS d S )Nr'   r#   rz   )rÓ   rÔ   )r   rR   rÛ   r   r   r   Ú_struct_namesþ  s    
zRecompiler._struct_namesc                 C   s   | j |g|  |¡¢R Ž  d S r   )r  r*  rè   r   r   r   Ú_generate_cpy_struct_decl  s    z$Recompiler._generate_cpy_struct_declc                 C   s   | j |g|  |¡¢R Ž  d S r   )rð   r*  rè   r   r   r   Ú_generate_cpy_struct_ctx	  s    z#Recompiler._generate_cpy_struct_ctxc                 C   s(   t |tjƒr|  ||¡ n
|  |¡ d S r   )r\   r   rg   Ú_generate_cpy_enum_collecttyper  rè   r   r   r   Ú#_generate_cpy_anonymous_collecttype  s    z.Recompiler._generate_cpy_anonymous_collecttypec                 C   s.   t |tjƒr|  |¡ n|  ||d| ¡ d S ©NZtypedef_)r\   r   rg   Ú_generate_cpy_enum_declr  rè   r   r   r   Ú_generate_cpy_anonymous_decl  s    z'Recompiler._generate_cpy_anonymous_declc                 C   s0   t |tjƒr|  ||¡ n|  ||d| ¡ d S r/  )r\   r   rg   Ú	_enum_ctxrð   rè   r   r   r   Ú_generate_cpy_anonymous_ctx  s    z&Recompiler._generate_cpy_anonymous_ctxÚconstc                 C   s   ||f| j v rtd||f ƒ‚| j  ||f¡ | j}d||f }|r¸|d| ƒ |dƒ |d|f ƒ |d||f ƒ |d ur¦|dkr�d|f }|d	|f ƒ |d
ƒ |dƒ |dƒ n>|d u sÄJ ‚|d| ƒ |dƒ |d| d¡|f ƒ |dƒ |ƒ  d S )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 */r   z%dUz"  if (!_cffi_check_int(*o, n, %s))z    n |= 2;z  return n;r²   zstatic void %s(char *o)z  *(%s)o = %s;r   )rº   r   rÝ   r—   rÓ   )r   Úis_intr   rR   Úcategoryr   r¾   Úfuncnamer   r   r   Ú_generate_cpy_const&  s6    
ÿÿ

zRecompiler._generate_cpy_constc                 C   s    |  ¡ }|r| jr|  |¡ d S r   )rÑ   rF   rs   ©r   rR   r   r5  r   r   r   Ú"_generate_cpy_constant_collecttypeD  s    
z-Recompiler._generate_cpy_constant_collecttypec                 C   s   |  ¡ }|  |||¡ d S r   )rÑ   r8  r9  r   r   r   rü   I  s    z&Recompiler._generate_cpy_constant_declc                 C   s^   | j s| ¡ rttdƒ}n$| j r&t}nt}| j| }t||ƒ}| jd  t	|d| |ƒ¡ d S )Nrª   r…   ú_cffi_const_%s)
rF   rÑ   rk   ÚOP_CONSTANT_INTZOP_DLOPEN_CONSTZOP_CONSTANTrU   rŒ   rZ   r   )r   rR   r   r   Z
const_kindr.   r   r   r   r  M  s    


ÿz%Recompiler._generate_cpy_constant_ctxc                 C   s   |   |¡ d S r   )rs   rè   r   r   r   r-  ]  s    z)Recompiler._generate_cpy_enum_collecttypec                 C   s   |j D ]}|  d|¡ qd S )NT)Úenumeratorsr8  )r   rR   r   Ú
enumeratorr   r   r   r0  `  s    
z"Recompiler._generate_cpy_enum_declc              	   C   sä   | j | }ttdƒ}| jr"| ¡  t|j|jƒD ](\}}| jd  	t
|d| ||d�¡ q0|d ur‚d|vr‚| js‚d| }d| }n4| | jg ¡}	| j |	¡}tt| j |	d¡ƒdk ƒ}d	 |j¡}
| jd
  	t|j||||
ƒ¡ d S )Nrª   r…   r;  ©r   r$  r  z((%s)-1) <= 0r   r6   rˆ   )rU   rk   ÚOP_ENUMrF   Zcheck_not_partialÚzipr=  Z
enumvaluesrŒ   rZ   r   Zbuild_baseinttyperD   ÚsizeofÚintÚcastr8   r9   r   )r   rR   rÛ   r.   r   r>  Z	enumvaluer   r;   Zbasetpr<   r   r   r   r2  d  s(    


ÿÿ

ÿzRecompiler._enum_ctxc                 C   s   |   || ¡ ¡ d S r   )r2  r¹   rè   r   r   r   Ú_generate_cpy_enum_ctxy  s    z!Recompiler._generate_cpy_enum_ctxc                 C   s   d S r   r   rè   r   r   r   Ú_generate_cpy_macro_collecttype  s    z*Recompiler._generate_cpy_macro_collecttypec                 C   s&   |dkrd }n|}| j d||d� d S )Nr
  Tr?  )r8  )r   rR   r   r   r   r   r   Ú_generate_cpy_macro_decl‚  s    z#Recompiler._generate_cpy_macro_declc                 C   sT   |dkr"| j rtd|f ƒ‚d }n|}ttdƒ}| jd  t|d| ||d�¡ d S )Nr
  zGcannot use the syntax '...' in '#define %s ...' when using the ABI moderª   r…   r;  r?  )rF   r   rk   r<  rŒ   rZ   r   )r   rR   r   r   r   r   r   r   Ú_generate_cpy_macro_ctx‰  s    ÿÿ

ÿÿz"Recompiler._generate_cpy_macro_ctxc                 C   sF   t |tjƒrB|j}|dkr$d|f }|  |jd| ¡}t ||¡}|S )Nr
  z_cffi_array_len(%s)r  )r\   r   râ   rb   rç   rÄ   )r   rR   Zglobal_namer  r  r   r   r   rç   š  s    
zRecompiler._global_typec                 C   s   |   |  ||¡¡ d S r   )rs   rç   rè   r   r   r   Ú"_generate_cpy_variable_collecttype£  s    z-Recompiler._generate_cpy_variable_collecttypec                 C   s„   | j }|  ||¡}t|tjƒr4|jd u r4|j}d}nd}d|f }|d|j|| jd� ƒ |dƒ |d||f ƒ |dƒ |ƒ  d S )	Nr'   ú&z*_cffi_var_%s(void)ústatic r  r°   z  return %s(%s);r²   )	r—   rç   r\   r   râ   rb   rÄ   rÓ   r~   )r   rR   r   r¾   Z	ampersandr®   r   r   r   Ú_generate_cpy_variable_decl¦  s    	
z&Recompiler._generate_cpy_variable_declc                 C   sL   |   ||¡}| j| }| jr"t}nt}| jd  t|d| t||ƒƒ¡ d S )Nr…   z_cffi_var_%s)	rç   rU   rF   ZOP_GLOBAL_VARZOP_GLOBAL_VAR_FrŒ   rZ   r   rk   )r   rR   r   r.   r(   r   r   r   Ú_generate_cpy_variable_ctx½  s    

ÿz%Recompiler._generate_cpy_variable_ctxc                 C   s   t |tjƒsJ ‚|  |¡ d S r   )r\   r   ra   rs   rè   r   r   r   Ú'_generate_cpy_extern_python_collecttypeÊ  s    z2Recompiler._generate_cpy_extern_python_collecttypec                 C   s  | j }t|jtjƒrd}nd| }d|j d|¡f }|d| ƒ |d| j||f ƒ |ƒ  g }d| }t|jƒD ]"\}}	|	 d| |¡}
| 	|
¡ qrd	 
|¡}|p¦d
}d||f }|jdkrÆd| }dd„ }tt|jƒd dƒ}||jƒröt|dƒ}t|jtjƒ�r&d|j d¡||j d¡|f }|d||j |¡f ƒ |dƒ |d| ƒ |dƒ t|jƒD ]X\}}	d| }
t|	tjƒ�sŒ||	ƒ�ržd|
 }
t |	¡}	|d|	 d¡|d |
f ƒ �qd|d| ƒ t|jtjƒ�sð|d|j d¡f ƒ |dƒ |ƒ  |  jd7  _d S )Nr  rø   z(int)sizeof(%s)r'   z3static struct _cffi_externpy_s _cffi_externpy__%s =z  { "%s.%s", %s, 0, 0 };rõ   z a%drÇ   r÷   z%s(%s)Ú	__stdcallz_cffi_stdcall c                 S   s   t | tjƒo| jdkS )Nrá   )r\   r   rú   r   rQ   r   r   r   Úmay_need_128_bitsê  s    ÿz9Recompiler._extern_python_decl.<locals>.may_need_128_bitsr?   é   z!sizeof(%s) > %d ? sizeof(%s) : %dz%s%sr°   z  char a[%s];z  char *p = a;za%drJ  z  *(%s)(p + %d) = %s;r   z,  _cffi_call_python(&_cffi_externpy__%s, p);z  return *(%s)p;r²   r   )r—   r\   rù   r   r]   rÓ   rE   rh   r[   rZ   r8   rý   rI   r$   rf   r_   r½   )r   rR   r   Ztag_and_spacer¾   Zsize_of_resultrå   r  rn   rË   r  r  r  rP  Z	size_of_ar   r   r   Ú_extern_python_declÑ  sb    ÿÿ



þÿ
 zRecompiler._extern_python_declc                 C   s   |   ||d¡ d S )NrK  ©rR  rè   r   r   r   Ú _generate_cpy_extern_python_decl  s    z+Recompiler._generate_cpy_extern_python_declc                 C   s   |   ||d¡ d S )NzCFFI_DLLEXPORT rS  rè   r   r   r   Ú#_generate_cpy_dllexport_python_decl
  s    z.Recompiler._generate_cpy_dllexport_python_declc                 C   s   |   ||d¡ d S )Nr'   rS  rè   r   r   r   Ú'_generate_cpy_extern_python_plus_c_decl  s    z2Recompiler._generate_cpy_extern_python_plus_c_declc                 C   sR   | j rtdƒ‚|jrtdƒ‚| j| }tt|ƒ}| jd  t	|d| ||ƒ¡ d S )Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"r…   z&_cffi_externpy__%s)
rF   r   ró   r&   rU   rk   ZOP_EXTERN_PYTHONrŒ   rZ   r   )r   rR   r   r.   r   r   r   r   Ú_generate_cpy_extern_python_ctx  s    ÿ


ÿz*Recompiler._generate_cpy_extern_python_ctxc                 C   sä   | j }|dƒ t|tƒs$| d¡}n
| d¡ z| d¡ W n tyV   d| }Y n0 | d¡D ]|}|}tdƒtu r‚tt	|ƒ}nt
|ƒdd… }|d	|  ¡ ƒ d
}|D ]*}t|ƒdkrÆ||ƒ d
}|d|f 7 }qª||ƒ qbd S )Nz=// # NB. this is not a string because of a size limit in MSVCzutf-8Úasciis   # -*- encoding: utf8 -*-
Tz//r   rª   z// r'   éL   z%d,)r—   r\   ÚbytesÚencodeÚdecodeÚUnicodeDecodeErrorÚ
splitlinesrË   ÚmapÚordrX  Úrstripr$   )r   Úsr¾   Úliner1   Zprinted_lineÚcr   r   r   r¶     s,    

z)Recompiler._print_string_literal_in_arrayc                 C   s   t ttƒ| j|< d S r   )rk   ÚOP_PRIMITIVEZ	PRIM_VOIDrY   ©r   rR   rµ   r   r   r   Ú_emit_bytecode_VoidType=  s    z"Recompiler._emit_bytecode_VoidTypec                 C   s   t |j }tt|ƒ| j|< d S r   )ZPRIMITIVE_TO_INDEXr   rk   re  rY   )r   rR   rµ   r@   r   r   r   Ú_emit_bytecode_PrimitiveType@  s    
z'Recompiler._emit_bytecode_PrimitiveTypec                 C   s(   d|j |j |j f }tt|ƒ| j|< d S )Nzl_cffi_prim_int(sizeof(%s), (
           ((%s)-1) | 0 /* check that %s is an integer type */
         ) <= 0)©r   rk   re  rY   ©r   rR   rµ   rb  r   r   r   Ú!_emit_bytecode_UnknownIntegerTypeD  s    þz,Recompiler._emit_bytecode_UnknownIntegerTypec                 C   s$   d|j |j f }tt|ƒ| j|< d S )Nzd_cffi_prim_float(sizeof(%s) *
           (((%s)1) / 2) * 2 /* integer => 0, float => 1 */
         )ri  rj  r   r   r   Ú_emit_bytecode_UnknownFloatTypeJ  s    
þz*Recompiler._emit_bytecode_UnknownFloatTypec                 C   s¼   t t| j|j ƒ| j|< |d7 }|jD ]H}| j| }||krft|tjƒrV|  	||¡ nt t
|ƒ| j|< |d7 }q&t|jƒ}|jd ur¨|jdkr˜|dO }ntd|jf ƒ‚t t|ƒ| j|< d S )Nr   rO  r=   zabi=%r)rk   ZOP_FUNCTIONrU   rù   rY   r[   r\   r   rú   rh  r)   rC  ró   rý   r&   ZOP_FUNCTION_END)r   rR   rµ   rm   Z	realindexr/   r   r   r   Ú_emit_bytecode_RawFunctionTypeP  s    






z)Recompiler._emit_bytecode_RawFunctionTypec                 C   s   t t| j|j ƒ| j|< d S r   )rk   Ú
OP_POINTERrU   rñ   rY   rf  r   r   r   Ú_emit_bytecode_PointerTypec  s    z%Recompiler._emit_bytecode_PointerTypec                 C   s"   |  ¡ }tt| j| ƒ| j|< d S r   )rt   rk   rn  rU   rY   )r   rR   rµ   Úrawr   r   r   Ú_emit_bytecode_FunctionPtrTypei  s    z)Recompiler._emit_bytecode_FunctionPtrTypec                 C   s’   | j |j }|jd u r(tt|ƒ| j|< nf|jdkrNtdt|ƒ dd¡f ƒ‚n@| j|d  dksdJ ‚tt	|ƒ| j|< td t|jƒƒ| j|d < d S )Nr
  zitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/r   rO   )
rU   rÄ   rb   rk   ZOP_OPEN_ARRAYrY   r   rX   rÔ   ZOP_ARRAY)r   rR   rµ   Z
item_indexr   r   r   Ú_emit_bytecode_ArrayTypem  s    

ÿÿÿz#Recompiler._emit_bytecode_ArrayTypec                 C   s   | j | }tt|ƒ| j|< d S r   )rd   rk   ZOP_STRUCT_UNIONrY   )r   rR   rµ   Zstruct_indexr   r   r   Ú_emit_bytecode_StructType{  s    
z$Recompiler._emit_bytecode_StructTypec                 C   s   | j | }tt|ƒ| j|< d S r   )re   rk   r@  rY   )r   rR   rµ   Z
enum_indexr   r   r   Ú_emit_bytecode_EnumType€  s    
z"Recompiler._emit_bytecode_EnumType)F)r'   )N)Nr4  N)N)Vr   r   r   r½   r   rK   rp   rr   rs   rV   r�   r’   r—   rœ   r¨   r™   rÃ   r˜   rÌ   rÜ   rà   rÖ   ræ   ré   rê   rë   rì   rò   rô   r  r	  rx   r  r  rð   r  r�   r)  Z_generate_cpy_union_collecttyper*  r+  Z_generate_cpy_union_declr,  Z_generate_cpy_union_ctxr.  r1  r3  r8  r:  rü   r  r-  r0  r2  rE  rF  rG  rH  rç   rI  rL  rM  rN  Z*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyperR  rT  rU  rV  rW  Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxr¶   rg  rh  rk  rl  rm  ro  Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyperq  rr  rs  Z_emit_bytecode_UnionTypert  r   r   r   r   rC   ~   s²   
:
 .
4-# #"
V	  ÿ

	þ6þrC   )r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚNativeIOc                    s(   t |tƒr| d¡}tt| ƒ |¡ d S )NrX  )r\   Úunicoder[  Úsuperru  r•   )r   rb  ©rj   r   r   r•   ‰  s    

zNativeIO.write)r   r   r   r•   Ú__classcell__r   r   rx  r   ru  ˆ  s   ru  c                 C   s
   t | dƒS )Nr•   )Úhasattr)Z	maybefiler   r   r   Ú_is_file_likeŽ  s    r{  c           
      C   sZ  |rt d|f ƒ t| ||d u d�}| ¡  | ¡  t|ƒrL| ||¡ dS tƒ }| ||¡ | ¡ }zVt|dƒ�*}| 	t
|ƒd ¡|krŽt‚W d   ƒ n1 s¢0    Y  |r¸t dƒ W dS  t�yT   d|t ¡ f }	t|	d	ƒ�}| |¡ W d   ƒ n1 �s0    Y  zt |	|¡ W n* t�yL   t |¡ t |	|¡ Y n0 Y dS 0 d S )
Nzgenerating %s)rF   Tr�   r   z(already up-to-date)Fz%s.~%dÚw)ÚprintrC   rp   r’   r{  rœ   ru  Úgetvaluerž   Úreadr$   ÚIOErrorrŸ   Úgetpidr•   ÚrenameÚOSErrorÚunlink)
rD   rE   r›   Útarget_fileÚverboseZ
recompilerrš   ÚoutputÚf1Ztmp_filer   r   r   Ú_make_c_or_py_source’  s<    ÿ"*
r‰  Fc                 C   s   |d usJ ‚t | ||||ƒS r   ©r‰  )rD   rE   r›   Ztarget_c_filer†  r   r   r   Úmake_c_source±  s    
ÿr‹  c                 C   s   t | |d ||ƒS r   rŠ  )rD   rE   Ztarget_py_filer†  r   r   r   Úmake_py_source¶  s    
ÿrŒ  c                 C   sl   |  d¡}z&t tjj| g|d d… ¢R Ž ¡ W n tyB   Y n0 |d  |7  < tjj| g|¢R Ž |fS )Nr©   rª   )r|   rŸ   Úmakedirsr    r8   rƒ  )Z	outputdirÚmodnameÚ	extensionÚpartsr   r   r   Ú_modname_to_fileº  s    
&r‘  c                 C   s*   t ||ƒ}|  |||f¡ t|||ƒ |S r   )ri   rZ   Úsetattr)Ú	patchlistÚclsr   Znew_methÚoldr   r   r   Ú_patch_methÈ  s    
r–  c                 C   s$   t | ƒD ]\}}}t|||ƒ qd S r   )Úreversedr’  )r“  r”  r   Zold_methr   r   r   Ú_unpatch_methsÎ  s    r˜  c                    sd   t jdkr0ddlm} |d ur0t| |ddd„ ƒ t jdkr`ddlm} ‡ fd	d
„}t| |d|ƒ‰ d S )Nr   r   )ÚMSVCCompilerZ_remove_visual_c_refc                 S   s   |S r   r   )r   Zmanifest_filer   r   r   rS   Ú  rT   z&_patch_for_embedding.<locals>.<lambda>Údarwin)Ú	CCompilerc                    sB   d| j v r,t| j ƒ| _ | j  d¡}d| j |< ˆ | g|¢R i |¤ŽS )Nz-bundlez-dynamiclib)Ú	linker_sorÅ   rµ   )r   r[   Úkwdsrn   ©Zold_link_shared_objectr   r   Úmy_link_shared_objectß  s
    

z3_patch_for_embedding.<locals>.my_link_shared_objectZlink_shared_object)ÚsysÚplatformÚcffi._shimmed_dist_utilsr™  r–  r›  )r“  r™  r›  rŸ  r   rž  r   Ú_patch_for_embeddingÒ  s    
ÿ
þr£  c                    sl   ddl m} ˆ  d¡rRˆ d d… ‰ tjdkr6ˆ d7 ‰ ntjdkrJˆ d7 ‰ nˆ d	7 ‰ t| |d
‡ fdd„ƒ d S )Nr   )Ú	build_extz.*r  r   z.dllrš  z.dylibz.soZget_ext_filenamec                    s   ˆ S r   r   )r   Zext_name©Útargetr   r   rS   ÷  rT   z#_patch_for_target.<locals>.<lambda>)r¢  r¤  Úendswithr   r¡  r–  )r“  r¦  r¤  r   r¥  r   Ú_patch_for_targeté  s    





ÿr¨  r©   Tú.cc              	   K   sÔ  t |tƒs| d¡}| jr$|  |¡ |d u�r”|rBt|ƒrBtdƒ‚| jd u}|rZ|  |¡ |d u rŽt	|||ƒ\}}|r€|g| }t
jj|Ž }n|}|	d u r¬|r¨d| }	nd}	|rÆtj||fi |¤Ž}nd }t| ||||d�}|�rŠg }t
 ¡ }z‚|rüt|ƒ |	dk�rt||	ƒ |�rB|dk�r&d}nd}td	|t
j |¡f ƒ t
 |¡ t d|||
¡}W t
 |¡ t|ƒ nt
 |¡ t|ƒ 0 |S ||fS n<|d u �r®t	||d
ƒ\}}t| |||d�}|�rÈ|S d |fS d S )NrX  zGWriting to file-like objects is not supported with call_c_compiler=Truez%s.*r   )r†  r©   zthe current directory isz setting the current directory toz%s %rz.py)r\   rX   r[  Z_windows_unicodeZ_apply_windows_unicoder{  rã   r³   Z_apply_embedding_fixr‘  rŸ   r    r8   r   Úget_extensionr‹  Úgetcwdr£  r¨  r}  ÚabspathÚchdirÚcompiler˜  rŒ  )rD   rE   r›   ZtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verboser¦  ÚdebugZuses_ffiplatformr�  Z	embeddingr�  Z
ext_c_fileÚextÚupdatedr“  ÚcwdÚmsgZoutputfilenamerz   r   r   r   Ú	recompileú  sv    





ÿ


ÿ



ÿ

ÿ



ÿr´  )F)F)	r©   TNr©  Nr   NNT)$ÚiorŸ   r   Ú	sysconfigr'   r   r   Úerrorr   Zcffi_opcoderG   r·   rÕ   r¡  Úversion_infoÚget_config_varr´   r   r   r-   r9   rA   rC   ÚStringIOru  ÚBytesIOr{  r‰  r‹  rŒ  r‘  r–  r˜  r£  r¨  r´  r   r   r   r   Ú<module>   sX    ÿ
þ          


    ý