3
ãdeVü  ã               @   s0  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pdejd0k pdejd1k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d2krÌejZnG dd„ dejƒZdd„ Zd3dd„Zd4dd „Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd5d.d/„Z dS )6é    Né   )ÚffiplatformÚmodel)ÚVerificationError)Ú*i&  i'  i(  Úwin32é   é   c               @   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   úF/var/www/agendate/envp3/lib/python3.6/site-packages/cffi/recompiler.pyÚ__init__   s
    zGlobalExpr.__init__c             C   s   d| j | 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| 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 )N)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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 )N)ÚNotImplementedError)r   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ƒ || 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 )N)r   Ú
type_indexÚflagsr   Ú	alignmentÚcommentÚfirst_field_indexÚc_fields)	r   r   r*   r+   r   r,   r-   r.   r/   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   r,   r.   r    r/   r-   )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j|ƒf S )Nc             S   s   g | ]}|j ƒ ‘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_FLAGSr/   r'   r*   r   Újoin)r   r+   Zfields_exprr   r   r   r   M   s    
zStructUnionExpr.as_python_exprN)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 )ÚEnumExprc             C   s"   || _ || _|| _|| _|| _d S )N)r   r*   r   ÚsignedÚallenums)r   r   r*   r   r6   r7   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   r6   r7   )r   r   r   r   r   _   s    zEnumExpr.as_c_exprc             C   sN   dt dtd	td
tdtdtdtdti| j| j	f }dt
| jƒt
|ƒ| j| jf S )Nr   r   é   é   é   zb'%s%s%s\x00%s')r   r   )r   r   )r8   r   )r8   r   )r9   r   )r9   r   )r:   r   )r:   r   )Z
PRIM_UINT8Z	PRIM_INT8ZPRIM_UINT16Z
PRIM_INT16ZPRIM_UINT32Z
PRIM_INT32ZPRIM_UINT64Z
PRIM_INT64r   r6   r'   r*   r   r7   )r   Ú
prim_indexr   r   r   r   d   s    

zEnumExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r5   W   s   r5   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTypenameExprc             C   s   || _ || _d S )N)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 },)r   r*   )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_exprN)r   r   r   r   r   r   r   r   r   r   r<   o   s   r<   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	dddddg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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ Z dAdB„ Z!d›dDdE„Z"dFdG„ Z#dHdI„ Z$dJdK„ Z%e%Z&dLdM„ Z'dNdO„ Z(e(Z)dPdQ„ Z*e*Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dœdYdZ„Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3d�dcdd„Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwdx„ Z>e> Z?Z@dydz„ ZAd{d|„ ZBd}d~„ 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˜„ ZUdCS )žÚ
Recompilerr   Fc             C   s   || _ || _|| _t| _d S )N)ÚffiÚmodule_nameÚtarget_is_pythonÚVERSION_BASEÚ_version)r   r>   r?   r@   r   r   r   r   �   s    zRecompiler.__init__c             C   s   t | j|ƒ| _d S )N)ÚmaxrB   )r   Úverr   r   r   Úneeds_version‡   s    zRecompiler.needs_versionc          	   C   sP  i | _ | jdƒ t| j td�}g | _x¨|D ] }|jr*| j | d ksFt‚t| jƒ| j |< | jj|ƒ xZ|j	D ]P}t
|tjtjtjtjtjfƒs�t‚| j | d kr®t| jƒ| j |< | jj|ƒ qjW | jjdƒ q*W xZ|D ]R}|j oì| j | d krÔt| jƒ| j |< | jj|ƒ |jrÔ|jd k	rÔ| jjdƒ qÔW d | j jƒ k�s>t‚i | _i | _x@|D ]8}t
|tjƒ�rnd | j|< nt
|tjƒ�rPd | j|< �qPW x.tt| jdd„ d�ƒD ]\}}|| j|< �q¤W x.tt| jdd„ d�ƒD ]\}}|| j|< �qÔW x0|D ](}t| d|jj ƒ}||| j | ƒ �qòW x | jD ]}t
|tƒ�s&t‚�q&W t| jƒ| _d S )	NZcollecttype)ÚkeyZENDÚLENc             S   s   | j S )N)r   )Útpr   r   r   Ú<lambda>´   s    z/Recompiler.collect_type_table.<locals>.<lambda>c             S   s   | j S )N)r   )rH   r   r   r   rI   ·   s    Z_emit_bytecode_)Ú
_typesdictÚ	_generateÚsortedÚstrÚ
cffi_typesZis_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_declsrH   Útp1ÚiÚmethodr$   r   r   r   Úcollect_type_tableŠ   sZ    






zRecompiler.collect_type_tablec             C   s   | j  }|j|ƒS )N)r@   Ú
enumfields)r   rH   Zexpand_anonymous_struct_unionr   r   r   Ú_enum_fieldsÄ   s    zRecompiler._enum_fieldsc             C   sÜ   t |tjƒs2t |tƒr.x|D ]}| j|ƒ qW d S || jkrØd | j|< t |tjƒrb| j|jƒ ƒ nvt |tjƒr¸|j	d k	rØ|| j
jjkrØxP| j|ƒD ] \}}}}| j| j|||ƒƒ q’W n x|jƒ D ]\}}| j|ƒ qÂW d S )N)rR   r   ZBaseTypeByIdentityrb   Ú_do_collect_typerJ   rW   Úas_raw_functionr\   Úfldtypesr>   Ú_parserÚ_included_declarationsrh   Ú_field_typeZ
_get_items)r   rH   ÚxZname1rc   Ú_r   r   r   ri   Ï   s     




zRecompiler._do_collect_typec       
      C   sº   | j jjjƒ }x¦t|ƒD ]š\}\}}|jddƒ\}}yt| d||f ƒ}W n  tk
rj   td| ƒ‚Y nX y|| _	|||ƒ W q t
k
r° }	 ztj|	|ƒ ‚ W Y d d }	~	X qX qW d S )Nr   r   z_generate_cpy_%s_%sz"not implemented in recompile(): %r)r>   rl   Z_declarationsÚitemsrL   Úsplitr_   ÚAttributeErrorr   Ú_current_qualsÚ	Exceptionr   Zattach_exception_info)
r   Ú	step_nameÚlstr   rH   ÚqualsÚkindZrealnamere   Úer   r   r   rK   â   s    zRecompiler._generateÚglobalÚfieldÚstruct_unionÚenumÚtypenamec             C   s:  i | _ x| jD ]}g | j |< qW tƒ | _| jdƒ | jƒ  x>| jD ]4}| j | }|dkrh|jdd„ d� t|ƒ| j |< qBW | j d }x:| jj	ƒ D ],\}}|t
|ƒk s¨t‚|| j|jks�t‚q�W t
|ƒt
| jƒksÖt‚| j d }x<| jj	ƒ D ].\}}|t
|ƒk �st‚|| j|jksìt‚qìW t
|ƒt
| jƒk�s6t‚d S )NÚctxr|   c             S   s   | j S )N)r   )Úentryr   r   r   rI     s    z0Recompiler.collect_step_tables.<locals>.<lambda>)rF   r}   r~   )Ú_lstsÚ	ALL_STEPSÚsetÚ_seen_struct_unionsrK   Ú_add_missing_struct_unionsÚsortrb   rZ   rq   r    rO   r   r[   )r   rv   rw   rH   rd   r   r   r   Úcollect_step_tables÷   s*    



zRecompiler.collect_step_tablesr#   c             C   s   | j j|d ƒ d S )NÚ
)Ú_fÚwrite)r   Úwhatr   r   r   Ú_prnt  s    zRecompiler._prntc             C   s:   | j r|d kst‚| j|ƒ n|d k	s*t‚| j||ƒ d S )N)r@   rO   Ú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jtjjtƒ|ƒdƒ}|jƒ }|jƒ  |S )NÚr)ÚopenÚosÚpathr4   ÚdirnameÚ__file__Ú	readlinesÚclose)r   ÚfilenameÚgÚlinesr   r   r   Ú_rel_readlines!  s    zRecompiler._rel_readlinesc             C   sš  || _ | j}| jjd k	r |dƒ ts,|dƒ | jdƒ}|jdƒ}| jdƒ|||d …< |dj|ƒƒ | jj	dƒdJ }| jjd k	�r<|d	| jf ƒ |d
ƒ | j
| jjƒ |dƒ |dƒ |d|f ƒ |dƒ |d|f ƒ |dƒ |d|f ƒ |dƒ | jdƒ}|jdƒ}| jdƒ|||d …< |dj|ƒƒ | jtƒ |dƒ |ƒ  ||ƒ |ƒ  |dƒ |ƒ  |dƒ tdd„ | jjƒ D ƒƒ}xLt| jƒD ]>\}}d}	||k�r¸d|| jƒ  }	|d||jƒ |	f ƒ �q’W | j�sä|dƒ |dƒ |ƒ  tƒ | _| jdƒ i }
xn| jD ]d}| j| }t|ƒ|
|< |
| dk�r|d ||f ƒ x|D ]}||jƒ ƒ �qNW |dƒ |ƒ  �qW | jj�r|d!ƒ xr| jjD ]f}y|jd d"… \}}W n( tk
�rÖ   td#| j|f ƒ‚Y nX |d k�rêtd$ƒ‚|d%|f ƒ �q”W |d&ƒ |dƒ |ƒ  |d'ƒ |d(ƒ x8| jD ].}|
| dk�rL|d)| ƒ n|d*| ƒ �q,W x.| jD ]$}|d+k�rf|d,|
| |f ƒ �qfW | jj�r¢|d-ƒ n|d.ƒ |d/t| jƒf ƒ d}| jdk�sÜ| jjd k	�rä|dO }|d0| ƒ |dƒ |ƒ  |d1ƒ |d2ƒ |dƒ |ƒ  |dƒ |d3ƒ |d4|f ƒ |d5ƒ |d@ �rd|d6ƒ |d7ƒ |d8ƒ |d9| j ƒ |d:ƒ |d;ƒ |d<ƒ |dƒ |d=ƒ |d>ƒ |d?ƒ |d@ƒ |dA|f ƒ |dBƒ |dC|f ƒ |dDƒ |dDƒ |dƒ |d3ƒ |dE|f ƒ |d5ƒ |dF| j| jf ƒ |d=ƒ |dƒ |d3ƒ |dG|f ƒ |d5ƒ |dH| j| jf ƒ |d=ƒ |dƒ |ƒ  |d1ƒ |dIƒ |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_%sz#elsez*# define _CFFI_PYTHON_STARTUP_FUNC  init%sz#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   )r0   rH   rd   r   r   r   r1   W  s    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[] = {r8   zQffi 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 >= 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#  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�   r>   Ú
_embeddingÚUSE_LIMITED_APIrž   Úindexr4   r?   rr   Ú_print_string_literal_in_arrayrE   ÚVERSION_EMBEDDEDÚdictrJ   rq   r^   rN   Ú_get_c_namer   r„   Ú_seen_constantsrK   rƒ   r‚   r    Ú_included_ffisÚ_assigned_sourcers   r   Ú_num_externpyrB   )r   r�   r‘   Úprntr�   rd   Zbase_module_nameÚtypeindex2typer$   r-   Únumsrv   rw   r�   Úffi_to_includeÚincluded_module_nameÚincluded_sourcer+   r   r   r   r�   '  s   

















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|jdƒ ddj|ƒf S |jƒ S )Nzb'%s'c                s   g | ]}ˆ j |ƒ‘qS r   )Ú_to_py)r0   Úitem)r   r   r   r1   Ø  s    z%Recompiler._to_py.<locals>.<listcomp>r   r#   z(%s)r2   )rR   rM   Úlistrb   r    rP   r4   r   )r   ro   Úrepr   )r   r   rµ   Ô  s    


zRecompiler._to_pyc             C   s¤  || _ | j}|dƒ |dƒ t| jjp(f ƒ}xzt|ƒD ]n}| jj| }y|jd d… \}}W n& tk
r‚   td| j|f ƒ‚Y nX |d k	r”tdƒ‚|d||f ƒ q6W |ƒ  |d| j	f ƒ |d| j
f ƒ d | _
t| jƒ| _d	d
„ | jD ƒ}|d| jdj|ƒƒf ƒ tdd
„ | jjƒ D ƒƒ}	xH| jD ]>}
| j|
 }t|ƒdk�r*|
dk�r*|d|
| j|ƒf ƒ �q*W |dk�r˜|ddjdd
„ t|ƒD ƒƒf ƒ |dƒ d S )Nz# auto-generated filezimport _cffi_backendr8   zQffi 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 ffizfrom %s import ffi as _ffi%dzffi = _cffi_backend.FFI('%s',z    _version = 0x%x,c             S   s   g | ]}|j ƒ ‘qS r   )r   )r0   r$   r   r   r   r1   þ  s    z3Recompiler.write_py_source_to_f.<locals>.<listcomp>z    _types = %s,r#   c             S   s   g | ]\}}||f‘qS r   r   )r0   rH   rd   r   r   r   r1      s    r   r|   z    _%ss = %s,z    _includes = (%s,),z, c             S   s   g | ]}d | ‘qS )z_ffi%dr   )r0   rd   r   r   r   r1     s    ú))rŠ   r�   r    r>   r¬   Úranger­   rs   r   r?   rB   rb   rN   rµ   r4   r©   rJ   rq   rƒ   r‚   )r   r�   r¯   Znum_includesrd   r²   r³   r´   Z	types_lstr°   rv   rw   r   r   r   rŽ   Þ  sB    

zRecompiler.write_py_source_to_fc             C   s
   | j | S )N)rJ   )r   Útyper   r   r   Ú_gettypenum  s    zRecompiler._gettypenumc       	      C   sp  d}t |tjƒr’|jƒ  r’|jƒ r<|jdkr<d}d|j }nPt |tjƒrZd|jdƒf }n2|jdƒ}d||jjddƒf }|dkrŒ| j	t
ƒ d}nœt |tjƒr²| j||||ƒ d S t |tjƒsÊt |tjƒrö| jd|| j|ƒ|f ƒ | jd| ƒ d S t |tjƒ�r&d|jdƒ }d| j|ƒ }d}nt|ƒ‚| jd||||f ƒ | jd||jdƒ|f ƒ | jd| ƒ d S )Nr#   Ú_BoolZ_cffi_to_c_intz, %sz(%s)_cffi_to_c_doublez(%s)_cffi_to_c_%sr   rp   Úchar16_tÚ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)ZNULLz  %s = %s(%s%s);z'  if (%s == (%s)%s && PyErr_Occurred()))r¾   r¿   )rR   r   rT   Úis_complex_typeÚis_integer_typer   ÚUnknownFloatTypeÚ
get_c_nameÚreplacerE   ÚVERSION_CHAR16CHAR32rU   Ú"_convert_funcarg_to_c_ptr_or_arrayrV   r�   r¼   rW   r"   )	r   rH   ÚfromvarÚtovarÚerrcodeZextraargÚ	converterÚcnameZerrvaluer   r   r   Ú_convert_funcarg_to_c  s@    

z Recompiler._convert_funcarg_to_cc             C   s.   t |tjƒr*|jdƒ |jdƒ |j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);)rR   r   rU   Úadd)r   rH   Ú	localvarsÚ	freelinesr   r   r   Ú_extra_local_variablesC  s    

z!Recompiler._extra_local_variablesc             C   s†   | j dƒ | j d| j|ƒ||f ƒ | j dƒ | j d||jdƒf ƒ | j d| j|ƒ||f ƒ | j dƒ | j d| ƒ | j 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   rH   rÇ   rÈ   rÉ   r   r   r   rÆ   J  s    


z-Recompiler._convert_funcarg_to_c_ptr_or_arrayc             C   sL  t |tjƒr–|jƒ r,|jdkr,d||jf S t |tjƒrBd|f S |jdkr‚|jƒ  r‚|jjddƒ}|dkrv| jt	ƒ d	||f S d
|| j
|ƒf S n²t |tjtjfƒrºd|| j
|ƒf S t |tjƒràd|| j
tj|jƒƒf S t |tjƒ�r |jd k�rtd|jƒ |f ƒ‚d|| j
|ƒf S t |tjƒ�r@d
|| j
|ƒf S t|ƒ‚d S )Nr½   z_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s)zlong doubler   rp   r¾   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¿   )rR   r   rT   rÁ   r   rÂ   rÀ   rÄ   rE   rÅ   r¼   rU   rW   Ú	ArrayTyper¶   r\   ZfldnamesÚ	TypeErrorrª   r]   r"   )r   rH   ÚvarÚcontextrË   r   r   r   Ú_convert_expr_from_cX  s8    

zRecompiler._convert_expr_from_cc             C   s   | j |d|f ƒS )Nz
(*(%s *)0))Ú_global_type)r   rH   r   r   r   r   Ú_typedef_type{  s    zRecompiler._typedef_typec             C   s   | j | j||ƒƒ d S )N)ri   r×   )r   rH   r   r   r   r   Ú!_generate_cpy_typedef_collecttype~  s    z,Recompiler._generate_cpy_typedef_collecttypec             C   s   d S )Nr   )r   rH   r   r   r   r   Ú_generate_cpy_typedef_decl�  s    z%Recompiler._generate_cpy_typedef_declc             C   s$   | j | }| jd jt||ƒƒ d S )Nr   )rJ   r‚   rP   r<   )r   rH   r   r*   r   r   r   Ú_typedef_ctx„  s    
zRecompiler._typedef_ctxc             C   sf   | j ||ƒ}| j||ƒ 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Ú   r_   Ú_struct_ctxr   rR   r   ZNamedPointerTypeÚtotype)r   rH   r   r   r   r   Ú_generate_cpy_typedef_ctxˆ  s    z$Recompiler._generate_cpy_typedef_ctxc             C   s*   | j |jƒ ƒ |jr&| j r&| j |ƒ d S )N)ri   rj   Úellipsisr@   )r   rH   r   r   r   r   Ú"_generate_cpy_function_collecttype”  s    z-Recompiler._generate_cpy_function_collecttypec             C   sF  | j  st‚t|tjƒst‚|jr2| j||ƒ d S | j}t|j	ƒ}|dkrPd}n|dkr^d}nd}g }g }d| }x:t
|j	ƒD ],\}	}
|j|
jd|	 |ƒƒ |jd|	 ƒ q~W d	j|ƒ}|p¾d
}|jrÒ|jd }nd}d|||f }|d|jj|ƒf ƒ |dƒ d	j|ƒ}d}t|jtjƒ�r$d}|d|||f ƒ |dƒ |dƒ |dƒ |d||f ƒ |dƒ d| }x4t
|j	ƒD ]&\}	}
|
jd|	 |ƒ}|d| ƒ �qzW tƒ }tƒ }x|j	D ]}
| j|
||ƒ �q¸W x t|ƒD ]}|d|f ƒ �qÚW t|jtjƒ�s2d}d| }d|jjd|ƒ }||ƒ |dƒ nd }d}t|j	ƒdk�r®tt|j	ƒƒ}x|D ]}	|d|	 ƒ �q^W |ƒ  |d|t|ƒt|ƒd	jdd„ |D ƒƒf ƒ |dƒ |ƒ  x6t
|j	ƒD ](\}	}
| j|
d |	 d|	 d!ƒ |ƒ  �qÀW |d"ƒ |d#ƒ d$d„ tt|j	ƒƒD ƒ}d	j|ƒ}|d%|||f ƒ |d&ƒ |d'ƒ |ƒ  |d(ƒ |dk�r`|d)ƒ |�r¤|d*| j|jd+d,ƒ ƒ x|D ]}|d-| ƒ �q„W |d.ƒ n,x|D ]}|d-| ƒ �qªW |d/ƒ |d0ƒ |dƒ |d1ƒ d2d3„ }d4}g }g }d| }x^t
|j	ƒD ]P\}	}
d}||
ƒ�r&d5}d6}|
jd7||	f |ƒ}|j|ƒ |jd8||	f ƒ �qW |j}||ƒ�ržd| }|jd9|ƒ}|jd|ƒ tj}d }d:}d6}|�r$d	j|ƒ}|�p¶d
}d;|||f }|d|j|ƒf ƒ |dƒ |�rð||ƒ d	j|ƒ}|d%|||f ƒ |�r|d<ƒ |dƒ n|d=||f ƒ |d>ƒ |ƒ  d S )?Nr   Znoargr   Zarg0rQ   zargument of %sz x%dzx%dz, Ú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 = z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   )r0   rd   r   r   r   r1   æ  s    z:Recompiler._generate_cpy_function_decl.<locals>.<listcomp>z    return NULL;zarg%dzreturn NULLz  Py_BEGIN_ALLOW_THREADSz  _cffi_restore_errno();c             S   s   g | ]}d | ‘qS )zx%dr   )r0   rd   r   r   r   r1   ñ  s    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;z#elsec             S   s    t | tjƒpt | tjƒo| jƒ S )N)rR   r   r\   Ú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_%sz#endif)r@   rO   rR   r   rW   rá   Ú_generate_cpy_constant_declr�   r    rQ   r^   rP   rÃ   r4   Úabirä   rS   r„   rÐ   rL   rº   rÌ   rÕ   ÚinsertZ	void_type)r   rH   r   r¯   ÚnumargsZargnameÚ	argumentsZcall_argumentsrÔ   rd   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 r| j||ƒ d S | j|jƒ  }t|jƒ}| jrBt}n |dkrPt}n|dkr^t	}nt
}| jd jt|d| t||ƒd| d�ƒ d S )Nr   r   r{   z
_cffi_f_%sz
_cffi_d_%s)r   )rá   r@   Ú_generate_cpy_constant_ctxrJ   rj   r    rQ   ZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_Vr‚   rP   r
   ra   )r   rH   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|jdƒ}d||f }| j|d| |jƒ}tj||ƒ}|S )Nz...r   z_cffi_array_len(((%s)0)->%s)z%s[0])rR   r   rÑ   rX   rÃ   rn   r¶   )r   Z	tp_structÚ
field_nameZtp_fieldÚactual_lengthZptr_struct_nameÚtp_itemr   r   r   rn   Q  s    

zRecompiler._field_typec             C   s0   | j |ƒ | jr,x|jƒ D ]}| j|ƒ qW d S )N)ri   r@   Úanonymous_struct_fieldsÚ_struct_collecttype)r   rH   Úfldtyper   r   r   rø   ]  s    
zRecompiler._struct_collecttypec             C   sF  |j d krd S | j}d|f }|dƒ |d||f ƒ |dƒ |dƒ |dƒ xÔ| j|ƒD ]Æ\}}}}	y„|jƒ sx|dkr”|dkr’|d	|||f ƒ wZx2t|tjƒrÆ|jd ks¶|jd
krÆ|j}|d }q–W |d|j	dd| |	d�|f ƒ W qZ t
k
�r }
 z|dt|
ƒ ƒ W Y d d }
~
X qZX qZW |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 */z...z[0]z  { %s = &p->%s; (void)tmp; }z*tmpzfield %r)rx   z
  /* %s */r¢   z(struct _cffi_align_%s { char x; %s y; };)rk   r�   rh   rÁ   rR   r   rÑ   rX   r¶   rÃ   r   rM   )r   rH   rË   rÜ   r¯   ZcheckfuncnameÚfnameZftyper   Úfqualrz   r   r   r   Ú_struct_decld  s8    

&zRecompiler._struct_declNc             C   s²  | j | }d }g }t|tjƒr(|jdƒ |jd kr@|jdƒ d}|| jjjkr¼|d ksd|| jjjkr¼|jd krpn|j	sŽt
|jƒ ƒr„n
|jdƒ |jrÊ|jdkr°td||jf ƒ‚|jdƒ n|jdƒ d	}d
j|ƒpÖd}g }|d k�rnt| j|ƒƒ}	�x
|	D �] \}
}}}| j||
|ƒ}| j|d|j|
f ƒ t}|dk�rJt}d| }nL|d k�snt|tjƒ�rt|jd k�rtd}n"d|d k�rŠ|jdƒn|j|
f }|d k�sª|dk�r°d}n,|d k	�rÊd|j|
f }nd|jdƒ|
f }|jt|
|||t|| j | ƒƒƒ qüW t| jd ƒ}| jd j|ƒ |d k�r8d}d}d}n4|d k	�rTd|jf }d}nd|f }d|f }d }nd}d}d }|}| jd jt|j|||||||ƒƒ | 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   z"((char *)&((%s)0)->%s) - (char *)0zoffsetof(%s, %s)r#   r|   z
(size_t)-2r8   Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z
sizeof(%s)z"offsetof(struct _cffi_align_%s, y)r}   éþÿÿÿr£   r£   )!rJ   rR   r   Z	UnionTyperP   rk   r>   rl   rm   ÚpartialÚanyr÷   Úpackedr"   r4   r·   rh   rn   Ú_check_not_opaquer   r%   r&   rÑ   rX   rÃ   r   ra   r    r‚   Úextendr)   r…   rÍ   )r   rH   rË   rÜ   rÝ   r*   Zreason_for_not_expandingr+   r/   rg   Zfldnamerù   r   rû   r$   r   Úoffsetr.   Zalignr-   r   r   r   rÞ   †  s’    



















zRecompiler._struct_ctxc             C   s>   xt |tjƒr|j}qW t |tjƒr:|jd kr:td| ƒ‚d S )Nz0%s is of an opaque type (not declared in cdef()))rR   r   rÑ   r¶   r\   rk   rÒ   )r   rH   Úlocationr   r   r   r  Ü  s
    
zRecompiler._check_not_opaquec             C   sÂ   t | jjƒ ƒ}|jdd„ d� xž|D ]–\}}|| jkr$|jrJtd|f ƒ‚|jjdƒrx|jdd … j	ƒ rx|jdd … }n4|jdkrž|j
dkržd}| j|dƒ ntd	|f ƒ‚| j|d |ƒ q$W d S )
Nc             S   s   | d S )Nr   r   )Ztp_orderr   r   r   rI   é  s    z7Recompiler._add_missing_struct_unions.<locals>.<lambda>)rF   zDinternal inconsistency: %r is partial but was not seen at this pointú$r   Z_IO_FILEÚFILEzinternal inconsistency: %r)r·   rZ   rq   r‡   r…   r  r"   r   Ú
startswithÚisdigitZ	forcenamerÚ   rÞ   )r   rw   rH   ÚorderrÜ   r   r   r   r†   ã  s    


z%Recompiler._add_missing_struct_unionsc             C   s   | j |ƒ d S )N)rø   )r   rH   r   r   r   r   Ú _generate_cpy_struct_collecttypeú  s    z+Recompiler._generate_cpy_struct_collecttypec             C   s2   |j dƒ}d|kr"||jddƒfS |d| fS d S )Nr#   r   rp   )rÃ   rÄ   )r   rH   rË   r   r   r   Ú_struct_namesþ  s    
zRecompiler._struct_namesc             C   s   | j |f| j|ƒžŽ  d S )N)rü   r  )r   rH   r   r   r   r   Ú_generate_cpy_struct_decl  s    z$Recompiler._generate_cpy_struct_declc             C   s   | j |f| j|ƒžŽ  d S )N)rÞ   r  )r   rH   r   r   r   r   Ú_generate_cpy_struct_ctx	  s    z#Recompiler._generate_cpy_struct_ctxc             C   s(   t |tjƒr| j||ƒ n
| j|ƒ d S )N)rR   r   r]   Ú_generate_cpy_enum_collecttyperø   )r   rH   r   r   r   r   Ú#_generate_cpy_anonymous_collecttype  s    z.Recompiler._generate_cpy_anonymous_collecttypec             C   s.   t |tjƒr| j|ƒ n| j||d| ƒ d S )NÚtypedef_)rR   r   r]   Ú_generate_cpy_enum_declrü   )r   rH   r   r   r   r   Ú_generate_cpy_anonymous_decl  s    z'Recompiler._generate_cpy_anonymous_declc             C   s0   t |tjƒr| j||ƒ n| j||d| ƒ d S )Nr  )rR   r   r]   Ú	_enum_ctxrÞ   )r   rH   r   r   r   r   Ú_generate_cpy_anonymous_ctx  s    z&Recompiler._generate_cpy_anonymous_ctxÚconstc             C   s   ||f| j krtd||f ƒ‚| j j||fƒ | j}d||f }|r¸|d| ƒ |dƒ |d|f ƒ |d||f ƒ |d k	r¦|dkr�d|f }|d	|f ƒ |d
ƒ |dƒ |dƒ n>|d ksÄt‚|d| ƒ |dƒ |d|j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�   rO   rÃ   )r   Úis_intr   rH   Úcategoryr   r¯   Úfuncnamer   r   r   Ú_generate_cpy_const&  s2    

zRecompiler._generate_cpy_constc             C   s"   |j ƒ }| s| jr| j|ƒ d S )N)rÁ   r@   ri   )r   rH   r   r  r   r   r   Ú"_generate_cpy_constant_collecttypeD  s    z-Recompiler._generate_cpy_constant_collecttypec             C   s   |j ƒ }| j|||ƒ d S )N)rÁ   r  )r   rH   r   r  r   r   r   rç   I  s    z&Recompiler._generate_cpy_constant_declc             C   s`   | j  r|jƒ rttdƒ}n$| j r(t}nt}| j| }t||ƒ}| jd jt	|d| |ƒƒ d S )Nr   r{   z_cffi_const_%sr£   )
r@   rÁ   ra   ÚOP_CONSTANT_INTZOP_DLOPEN_CONSTZOP_CONSTANTrJ   r‚   rP   r
   )r   rH   r   r   Z
const_kindr*   r   r   r   rò   M  s    


z%Recompiler._generate_cpy_constant_ctxc             C   s   | j |ƒ d S )N)ri   )r   rH   r   r   r   r   r  ]  s    z)Recompiler._generate_cpy_enum_collecttypec             C   s    x|j D ]}| jd|ƒ qW d S )NT)Úenumeratorsr  )r   rH   r   Ú
enumeratorr   r   r   r  `  s    z"Recompiler._generate_cpy_enum_declc             C   sê   | j | }ttdƒ}| jr"|jƒ  x:t|j|jƒD ](\}}| jd j	t
|d| ||d�ƒ q2W |d k	rˆd|krˆ| j rˆd| }d| }n4|j| jg ƒ}	| jj|	ƒ}tt| jj|	dƒƒdk ƒ}d	j|jƒ}
| jd
 j	t|j||||
ƒƒ d S )Nr   r{   z_cffi_const_%s)r   r  z
sizeof(%s)z((%s)-1) <= 0r   r2   r~   r£   r£   )rJ   ra   ÚOP_ENUMr@   Zcheck_not_partialÚzipr  Z
enumvaluesr‚   rP   r
   Zbuild_baseinttyper>   ÚsizeofÚintÚcastr4   r5   r   )r   rH   rË   r*   r   r   Z	enumvaluer   r6   Zbasetpr7   r   r   r   r  d  s"    




zRecompiler._enum_ctxc             C   s   | j ||jƒ ƒ d S )N)r  rª   )r   rH   r   r   r   r   Ú_generate_cpy_enum_ctxy  s    z!Recompiler._generate_cpy_enum_ctxc             C   s   d S )Nr   )r   rH   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 )Nz...T)r   )r  )r   rH   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 jt|d| ||d�ƒ d S )Nz...zGcannot use the syntax '...' in '#define %s ...' when using the ABI moder   r{   z_cffi_const_%s)r   r£   )r@   r   ra   r  r‚   rP   r
   )r   rH   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|jd| ƒ}tj||ƒ}|S )Nz...z_cffi_array_len(%s)z%s[0])rR   r   rÑ   rX   rÖ   r¶   )r   rH   Zglobal_namerõ   rö   r   r   r   rÖ   š  s    
zRecompiler._global_typec             C   s   | j | j||ƒƒ d S )N)ri   rÖ   )r   rH   r   r   r   r   Ú"_generate_cpy_variable_collecttype£  s    z-Recompiler._generate_cpy_variable_collecttypec             C   s„   | j }| j||ƒ}t|tjƒr4|jd kr4|j}d}nd}d|f }|d|j|| jd� ƒ |dƒ |d||f ƒ |dƒ |ƒ  d S )	Nr#   ú&z*_cffi_var_%s(void)zstatic )rx   r¡   z  return %s(%s);r¢   )	r�   rÖ   rR   r   rÑ   rX   r¶   rÃ   rt   )r   rH   r   r¯   Z	ampersandr    r   r   r   Ú_generate_cpy_variable_decl¦  s    	
z&Recompiler._generate_cpy_variable_declc             C   sL   | j ||ƒ}| j| }| jr"t}nt}| jd jt|d| t||ƒƒƒ d S )Nr{   z_cffi_var_%s)	rÖ   rJ   r@   ZOP_GLOBAL_VARZOP_GLOBAL_VAR_Fr‚   rP   r
   ra   )r   rH   r   r*   r$   r   r   r   Ú_generate_cpy_variable_ctx½  s    

z%Recompiler._generate_cpy_variable_ctxc             C   s   t |tjƒst‚| j|ƒ d S )N)rR   r   rW   rO   ri   )r   rH   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jd|ƒf }|d| ƒ |d| j||f ƒ |ƒ  g }d| }x0t|jƒD ]"\}}	|	jd| |ƒ}
|j	|
ƒ qtW d	j
|ƒ}|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jdƒ||jjdƒ|f }|d||jj|ƒf ƒ |dƒ |d| ƒ |dƒ xft|jƒD ]X\}}	d| }
t|	tjƒ�s’||	ƒ�r¤d|
 }
tj|	ƒ}	|d|	jdƒ|d |
f ƒ �qjW |d| ƒ t|jtjƒ�sø|d|jjdƒf ƒ |dƒ |ƒ  |  jd7  _d S )Nrÿ   zresult of %sz(int)sizeof(%s)r#   z3static struct _cffi_externpy_s _cffi_externpy__%s =z  { "%s.%s", %s, 0, 0 };zargument of %sz a%dz, rã   z%s(%s)Ú	__stdcallz_cffi_stdcall c             S   s   t | tjƒo| jdkS )Nzlong double)rR   r   rå   r   )rH   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%dr+  z  *(%s)(p + %d) = %s;r   z,  _cffi_call_python(&_cffi_externpy__%s, p);z  return *(%s)p;r¢   r   )r�   rR   rä   r   rS   rÃ   r?   r^   rQ   rP   r4   rè   rC   r    r\   rU   r®   )r   rH   r   Ztag_and_spacer¯   Zsize_of_resultrÔ   rë   rd   r»   rî   rì   rí   r0  Z	size_of_ar   r   r   Ú_extern_python_declÑ  sZ    





"zRecompiler._extern_python_declc             C   s   | j ||dƒ d S )Nzstatic )r2  )r   rH   r   r   r   r   Ú _generate_cpy_extern_python_decl  s    z+Recompiler._generate_cpy_extern_python_declc             C   s   | j ||dƒ d S )NzCFFI_DLLEXPORT )r2  )r   rH   r   r   r   r   Ú#_generate_cpy_dllexport_python_decl
  s    z.Recompiler._generate_cpy_dllexport_python_declc             C   s   | j ||dƒ d S )Nr#   )r2  )r   rH   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 jt	|d| ||ƒƒ d S )Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"r{   z&_cffi_externpy__%s)
r@   r   rá   r"   rJ   ra   ZOP_EXTERN_PYTHONr‚   rP   r
   )r   rH   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$|jdƒ}n
|jdƒ y|jdƒ W n tk
rX   d| }Y nX xŽ|jdƒD ]€}|}tdƒtkr†tt	|ƒ}nt
|ƒdd… }|d| jƒ ƒ d	}x2|D ]*}t|ƒd
krÌ||ƒ d	}|d|f 7 }q°W ||ƒ qfW d S )Nz=// # NB. this is not a string because of a size limit in MSVCzutf-8Úasciis   # -*- encoding: utf8 -*-
Tz//r   z// r#   éL   z%d,r£   )r�   rR   ÚbytesÚencodeÚdecodeÚUnicodeDecodeErrorÚ
splitlinesr»   ÚmapÚordr7  Úrstripr    )r   Úsr¯   Úliner-   Zprinted_lineÚcr   r   r   r§     s,    


z)Recompiler._print_string_literal_in_arrayc             C   s   t ttƒ| j|< d S )N)ra   ÚOP_PRIMITIVEZ	PRIM_VOIDrN   )r   rH   r¦   r   r   r   Ú_emit_bytecode_VoidType=  s    z"Recompiler._emit_bytecode_VoidTypec             C   s   t |j }tt|ƒ| j|< d S )N)ZPRIMITIVE_TO_INDEXr   ra   rD  rN   )r   rH   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   ra   rD  rN   )r   rH   r¦   rA  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 */
         ))r   ra   rD  rN   )r   rH   r¦   rA  r   r   r   Ú_emit_bytecode_UnknownFloatTypeJ  s    z*Recompiler._emit_bytecode_UnknownFloatTypec             C   sÀ   t t| j|j ƒ| j|< |d7 }xR|jD ]H}| j| }||krht|tjƒrX| j	||ƒ nt t
|ƒ| j|< |d7 }q(W t|jƒ}|jd k	r¬|jdkrœ|dO }ntd|jf ƒ‚t t|ƒ| j|< d S )Nr   r/  r8   zabi=%r)ra   ZOP_FUNCTIONrJ   rä   rN   rQ   rR   r   rå   rF  r%   r$  rá   rè   r"   ZOP_FUNCTION_END)r   rH   r¦   rc   Z	realindexr+   r   r   r   Ú_emit_bytecode_RawFunctionTypeP  s    




z)Recompiler._emit_bytecode_RawFunctionTypec             C   s   t t| j|j ƒ| j|< d S )N)ra   Ú
OP_POINTERrJ   rß   rN   )r   rH   r¦   r   r   r   Ú_emit_bytecode_PointerTypec  s    z%Recompiler._emit_bytecode_PointerTypec             C   s"   |j ƒ }tt| j| ƒ| j|< d S )N)rj   ra   rJ  rJ   rN   )r   rH   r¦   Úrawr   r   r   Ú_emit_bytecode_FunctionPtrTypei  s    z)Recompiler._emit_bytecode_FunctionPtrTypec             C   s’   | j |j }|jd kr(tt|ƒ| j|< nf|jdkrNtdt|ƒjddƒf ƒ‚n@| j|d  dksdt	‚tt
|ƒ| j|< td t|jƒƒ| j|d < d S )Nz...zitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/r   rG   )rJ   r¶   rX   ra   ZOP_OPEN_ARRAYrN   r   rM   rÄ   rO   ZOP_ARRAY)r   rH   r¦   Z
item_indexr   r   r   Ú_emit_bytecode_ArrayTypem  s    

z#Recompiler._emit_bytecode_ArrayTypec             C   s   | j | }tt|ƒ| j|< d S )N)rZ   ra   ZOP_STRUCT_UNIONrN   )r   rH   r¦   Zstruct_indexr   r   r   Ú_emit_bytecode_StructType{  s    
z$Recompiler._emit_bytecode_StructTypec             C   s   | j | }tt|ƒ| j|< d S )N)r[   ra   r!  rN   )r   rH   r¦   Z
enum_indexr   r   r   Ú_emit_bytecode_EnumType€  s    
z"Recompiler._emit_bytecode_EnumType)F)r#   )N)Nr  N)N)Vr   r   r   r®   r   rE   rf   rh   ri   rK   rƒ   rˆ   r�   r’   rž   r�   rµ   rŽ   r¼   rÌ   rÐ   rÆ   rÕ   r×   rØ   rÙ   rÚ   rà   râ   rñ   ró   rn   rø   rü   rÞ   r  r†   r  Z_generate_cpy_union_collecttyper  r  Z_generate_cpy_union_declr  Z_generate_cpy_union_ctxr  r  r  r  r  rç   rò   r  r  r  r&  r'  r(  r)  rÖ   r*  r,  r-  r.  Z*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyper2  r3  r4  r5  r6  Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxr§   rE  rF  rG  rH  rI  rK  Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyperM  rN  rO  Z_emit_bytecode_UnionTyperP  r   r   r   r   r=   ~   s¨   
:
 .
4-# #"
V	 

	6r=   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚNativeIOc                s(   t |tƒr|jdƒ}tt| ƒj|ƒ d S )Nr7  )rR   Úunicoder:  ÚsuperrQ  r‹   )r   rA  )r`   r   r   r‹   ‰  s    

zNativeIO.write)r   r   r   r‹   Ú__classcell__r   r   )r`   r   rQ  ˆ  s   rQ  c       
      C   s  |rt d|f ƒ t| ||d kd�}|jƒ  |jƒ  tƒ }|j||ƒ |jƒ }y@t|dƒ� }|jt	|ƒd ƒ|krvt
‚W d Q R X |rŒt dƒ dS  t
k
�r   d|tjƒ f }	t|	dƒ�}|j|ƒ W d Q R X ytj|	|ƒ W n, tk
�r   tj|ƒ tj|	|ƒ Y nX d	S X d S )
Nzgenerating %s)r@   r“   r   z(already up-to-date)Fz%s.~%dÚwT)Úprintr=   rf   rˆ   rQ  r’   Úgetvaluer”   Úreadr    ÚIOErrorr•   Úgetpidr‹   ÚrenameÚOSErrorÚunlink)
r>   r?   r‘   Ztarget_fileÚverboseZ
recompilerr�   ÚoutputÚf1Ztmp_filer   r   r   Ú_make_c_or_py_sourceŽ  s4    
ra  Fc             C   s   |d k	st ‚t| ||||ƒS )N)rO   ra  )r>   r?   r‘   Ztarget_c_filer^  r   r   r   Úmake_c_sourceª  s    
rb  c             C   s   t | |d ||ƒS )N)ra  )r>   r?   Ztarget_py_filer^  r   r   r   Úmake_py_source¯  s    
rc  c             C   sj   |j dƒ}y$tjtjj| f|d d… žŽ ƒ W n tk
rB   Y nX |d  |7  < tjj| f|žŽ |fS )NrŸ   r   r£   r£   )rr   r•   Úmakedirsr–   r4   r\  )Z	outputdirÚmodnameÚ	extensionÚpartsr   r   r   Ú_modname_to_file³  s    
$rh  c             C   s*   t ||ƒ}| j|||fƒ t|||ƒ |S )N)r_   rP   Úsetattr)Ú	patchlistÚclsr   Znew_methÚoldr   r   r   Ú_patch_methÁ  s    
rm  c             C   s(   x"t | ƒD ]\}}}t|||ƒ q
W d S )N)Úreversedri  )rj  rk  r   Zold_methr   r   r   Ú_unpatch_methsÇ  s    ro  c                s\   t jdkr(ddlm} t| |ddd„ ƒ t jdkrXddlm} ‡ fd	d
„}t| |d|ƒ‰ d S )Nr   r   )ÚMSVCCompilerZ_remove_visual_c_refc             S   s   |S )Nr   )r   Zmanifest_filer   r   r   rI   Ð  s    z&_patch_for_embedding.<locals>.<lambda>Údarwin)Ú	CCompilerc                s<   d| j kr,t| j ƒ| _ | j jdƒ}d| j |< ˆ | f|ž|ŽS )Nz-bundlez-dynamiclib)Ú	linker_sor·   r¦   )r   rQ   Úkwdsrd   )Úold_link_shared_objectr   r   Úmy_link_shared_objectÕ  s
    

z3_patch_for_embedding.<locals>.my_link_shared_objectZlink_shared_object)ÚsysÚplatformZdistutils.msvc9compilerrp  rm  Údistutils.ccompilerrr  )rj  rp  rr  rv  r   )ru  r   Ú_patch_for_embeddingË  s    


rz  c                sl   ddl m} ˆ j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.*r8   r   z.dllrq  z.dylibz.soZget_ext_filenamec                s   ˆ S )Nr   )r   Zext_name)Útargetr   r   rI   í  s    z#_patch_for_target.<locals>.<lambda>r   )Zdistutils.command.build_extr{  Úendswithrw  rx  rm  )rj  r|  r{  r   )r|  r   Ú_patch_for_targetß  s    




r~  rŸ   Tú.cc             K   sž  t |tƒs|jdƒ}| jr$| j|ƒ |d k	�r^| jd k	}|rF| j|ƒ |d krzt|||ƒ\}}|rl|g| }tj	j
|Ž }n|}|	d kr˜|r”d| }	nd}	tj||f|Ž}t| ||||d�}|�rTg }tjƒ }zn|rÚt|ƒ |	dkrìt||	ƒ |�r|dk�rd}nd}td|tj	j|ƒf ƒ tj|ƒ tjd|||
ƒ}W d tj|ƒ t|ƒ X |S ||fS n<|d k�rxt||d	ƒ\}}t| |||d�}|�r’|S d |fS d S )
Nr7  z%s.*r   )r^  rŸ   zthe current directory isz setting the current directory toz%s %rz.py)rR   rM   r:  Z_windows_unicodeZ_apply_windows_unicoder¤   Z_apply_embedding_fixrh  r•   r–   r4   r   Úget_extensionrb  Úgetcwdrz  r~  rV  ÚabspathÚchdirÚcompilero  rc  )r>   r?   r‘   ZtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verboser|  Údebugrt  Z	embeddingrg  Z
ext_c_fileÚextÚupdatedrj  ÚcwdÚmsgZoutputfilenamerp   r   r   r   Ú	recompileð  sb    
















rŠ  )r   r   )r   r	   )r   )F)F)rŸ   TNr  Nr   NN)!r•   rw  Úior#   r   r   Úerrorr   Zcffi_opcoderA   r¨   rÅ   rx  Úversion_infor¥   r
   r   r)   r5   r<   r=   ÚStringIOrQ  ÚBytesIOra  rb  rc  rh  rm  ro  rz  r~  rŠ  r   r   r   r   Ú<module>   sL   
          


  