509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
M •Z´÷  ã               @   s  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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d0kr®ejZnG dd„ dejƒZdd„ Zd1dd„Zd2dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd3d,d-„Zd.d/„ ZdS )4é    Né   )ÚffiplatformÚmodel)ÚVerificationError)Ú*i&  i'  i(  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   ú"/usr/lib64/python3.6/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   Z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   8   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   C   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>L   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   J   s    
zStructUnionExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r%   7   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   r2   r3   r   r   r   r   U   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   r2   r3   )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   )r4   r   )r4   r   )r5   r   )r5   r   )r6   r   )r6   r   )Z
PRIM_UINT8Z	PRIM_INT8ZPRIM_UINT16Z
PRIM_INT16ZPRIM_UINT32Z
PRIM_INT32ZPRIM_UINT64Z
PRIM_INT64r   r2   r#   r&   r   r3   )r   Ú
prim_indexr   r   r   r   a   s    

zEnumExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r1   T   s   r1   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   m   s    zTypenameExpr.__init__c             C   s   d| j | jf S )Nz  { "%s", %d },)r   r&   )r   r   r   r   r   q   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   t   s    zTypenameExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r8   l   s   r8   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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-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ Z d™dBdC„Z!dDdE„ Z"dFdG„ Z#dHdI„ Z$e$Z%dJdK„ Z&dLdM„ Z'e'Z(dNdO„ Z)e)Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dšdWdX„Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2d›dadb„Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=e= Z>Z?dwdx„ Z@dydz„ ZAd{d|„ ZBd}d~„ ZCdd€„ ZDeD ZEZFd�d‚„ ZGdƒd„„ ZHd…d†„ ZId‡dˆ„ ZJd‰dŠ„ ZKd‹dŒ„ ZLd�dŽ„ ZMeMZNeMZOd�d�„ ZPd‘d’„ ZQd“d”„ ZReRZSd•d–„ ZTdAS )œÚ
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)Úmaxr>   )r   Z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   )rC   r   r   r   rD   ´   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_declsrC   Útp1ÚiÚmethodr    r   r   r   Úcollect_type_table‡   sZ    






zRecompiler.collect_type_tablec             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ƒ ƒ ntt |tjƒr¶|j	d k	rÖ|| j
jjkrÖxN|jƒ D ] \}}}}| j| j|||ƒƒ q�W n x|jƒ D ]\}}| j|ƒ qÀW d S )N)rM   r   ZBaseTypeByIdentityr]   Ú_do_collect_typerE   rR   Úas_raw_functionrW   Úfldtypesr:   Ú_parserÚ_included_declarationsÚ
enumfieldsÚ_field_typeZ
_get_items)r   rC   ÚxZname1r^   Ú_r   r   r   rb   Á   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:   re   Z_declarationsÚitemsrG   ÚsplitrZ   ÚAttributeErrorr   Ú_current_qualsÚ	Exceptionr   Zattach_exception_info)
r   Ú	step_nameÚlstr   rC   ÚqualsZkindZrealnamer`   Úer   r   r   rF   Ô   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 )NZctxru   c             S   s   | j S )N)r   )Úentryr   r   r   rD   õ   s    z0Recompiler.collect_step_tables.<locals>.<lambda>)rA   rv   rw   )Ú_lstsÚ	ALL_STEPSÚsetÚ_seen_struct_unionsrF   Ú_add_missing_struct_unionsÚsortr]   rU   rk   r   rJ   r   rV   )r   rp   rq   rC   r_   r   r   r   Úcollect_step_tablesé   s*    



zRecompiler.collect_step_tablesr   c             C   s   | j j|d ƒ d S )NÚ
)Ú_fÚwrite)r   Z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<   rJ   Ú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Úpathr0   ÚdirnameÚ__file__Ú	readlinesÚclose)r   ÚfilenameÚgÚlinesr   r   r   Ú_rel_readlines  s    zRecompiler._rel_readlinesc             C   sz  || _ | j}| jjd k	r |dƒ | jdƒ}|jdƒ}| jdƒ|||d …< |dj|ƒƒ | jjdƒdI }| jjd k	�r0|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ƒ ƒ �qBW |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�r@|d(| ƒ n|d)| ƒ �q W x.| jD ]$}|d*k�rZ|d+|
| |f ƒ �qZW | jj�r–|d,ƒ n|d-ƒ |d.t| jƒf ƒ d}| j�rÆ|dO }|d/| ƒ |dƒ |ƒ  |d0ƒ |d1ƒ |dƒ |ƒ  |dƒ |d2ƒ |d3|f ƒ |d4ƒ | j�rD|d5ƒ |d6ƒ |d7ƒ |d8| j ƒ |d9ƒ |d:ƒ |d;ƒ |dƒ |d<ƒ |d=ƒ |d>ƒ |d?ƒ |d@|f ƒ |dAƒ |dB|f ƒ |dCƒ |dCƒ |dƒ |d2ƒ |dD|f ƒ |d4ƒ |dE| j| jf ƒ |d<ƒ |dƒ |d2ƒ |dF|f ƒ |d4ƒ |dG| j| jf ƒ |d<ƒ |dƒ |ƒ  |d0ƒ |dHƒ |dƒ d | _d S )JNz#define _CFFI_USE_EMBEDDINGz_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   )r,   rC   r_   r   r   r   r-   G  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[] = {r4   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 */ru   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:   Ú
_embeddingr•   Úindexr0   r;   rl   Ú_print_string_literal_in_arrayr@   ÚVERSION_EMBEDDEDÚdictrE   rk   rY   rI   Ú_get_c_namer   r|   Ú_seen_constantsrF   r{   rz   r   Ú_included_ffisÚ_assigned_sourcerm   r   Ú_num_externpyr>   )r   r‡   rˆ   Úprntr”   r_   Zbase_module_nameÚtypeindex2typer    r)   Znumsrp   rq   ry   Ú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)r,   Úitem)r   r   r   r-   È  s    z%Recompiler._to_py.<locals>.<listcomp>r   r   z(%s)r.   )rM   rH   Úlistr]   r   rK   r0   r   )r   ri   Z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_backendr4   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   )r,   r    r   r   r   r-   î  s    z3Recompiler.write_py_source_to_f.<locals>.<listcomp>z    _types = %s,r   c             S   s   g | ]\}}||f‘qS r   r   )r,   rC   r_   r   r   r   r-   ð  s    r   ru   z    _%ss = %s,z    _includes = (%s,),z, c             S   s   g | ]}d | ‘qS )z_ffi%dr   )r,   r_   r   r   r   r-   û  s    ú))r‚   r„   r   r:   r¢   Úranger£   rm   r   r;   r>   r]   rI   rª   r0   rŸ   rE   rk   r{   rz   )r   r‡   r¥   Znum_includesr_   r§   r¨   r©   Z	types_lstr¦   rp   rq   r   r   r   r…   Î  sB    

zRecompiler.write_py_source_to_fc             C   s
   | j | S )N)rE   )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   rj   Ú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³   )rM   r   rO   Úis_complex_typeÚis_integer_typer   ÚUnknownFloatTypeÚ
get_c_nameÚreplacer@   ÚVERSION_CHAR16CHAR32rP   Ú"_convert_funcarg_to_c_ptr_or_arrayrQ   r„   r°   rR   r   )	r   rC   ÚfromvarÚtovarÚerrcodeZextraargZ	converterÚcnameZerrvaluer   r   r   Ú_convert_funcarg_to_c  s@    

z Recompiler._convert_funcarg_to_cc             C   s   t |tjƒr|jdƒ d S )NzPy_ssize_t datasize)rM   r   rP   Úadd)r   rC   Ú	localvarsr   r   r   Ú_extra_local_variables3  s    z!Recompiler._extra_local_variablesc             C   s¤   | j dƒ | j d| j|ƒ||f ƒ | j dƒ | j dƒ | j d| ƒ | j d||jdƒf ƒ | j d|f ƒ | j d	|| j|ƒ|f ƒ | j d| ƒ | j d
ƒ d S )Nz1  datasize = _cffi_prepare_pointer_call_argument(z(      _cffi_type(%d), %s, (char **)&%s);z  if (datasize != 0) {z    if (datasize < 0)z	      %s;z&    %s = (%s)alloca((size_t)datasize);r   z,    memset((void *)%s, 0, (size_t)datasize);zL    if (_cffi_convert_array_from_object((char *)%s, _cffi_type(%d), %s) < 0)z  })r„   r°   r·   )r   rC   r»   r¼   r½   r   r   r   rº   7  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   rj   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³   )rM   r   rO   rµ   r   r¶   r´   r¸   r@   r¹   r°   rP   rR   Ú	ArrayTyper«   rW   ZfldnamesÚ	TypeErrorr    rX   r   )r   rC   ÚvarÚcontextr¾   r   r   r   Ú_convert_expr_from_cG  s8    

zRecompiler._convert_expr_from_cc             C   s   | j |d|f ƒS )Nz
(*(%s *)0))Ú_global_type)r   rC   r   r   r   r   Ú_typedef_typej  s    zRecompiler._typedef_typec             C   s   | j | j||ƒƒ d S )N)rb   rÉ   )r   rC   r   r   r   r   Ú!_generate_cpy_typedef_collecttypem  s    z,Recompiler._generate_cpy_typedef_collecttypec             C   s   d S )Nr   )r   rC   r   r   r   r   Ú_generate_cpy_typedef_declp  s    z%Recompiler._generate_cpy_typedef_declc             C   s$   | j | }| jd jt||ƒƒ d S )Nrx   )rE   rz   rK   r8   )r   rC   r   r&   r   r   r   Ú_typedef_ctxs  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Ì   rZ   Ú_struct_ctxr   rM   r   ZNamedPointerTypeÚtotype)r   rC   r   r   r   r   Ú_generate_cpy_typedef_ctxw  s    z$Recompiler._generate_cpy_typedef_ctxc             C   s*   | j |jƒ ƒ |jr&| j r&| j |ƒ d S )N)rb   rc   Úellipsisr<   )r   rC   r   r   r   r   Ú"_generate_cpy_function_collecttypeƒ  s    z-Recompiler._generate_cpy_function_collecttypec             C   sò  | 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ƒ }x|j	D ]}
| j|
|ƒ �q²W x|D ]}|d|f ƒ �qÎW t|jtjƒ�sd}d| }d|jjd|ƒ }||ƒ nd }d}t|j	ƒdk�rštt|j	ƒƒ}x|D ]}	|d|	 ƒ �qJW |ƒ  |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�rL|d(ƒ |�rl|d)| j|jd*d+ƒ ƒ n|d,ƒ |d-ƒ |dƒ |d.ƒ d/d0„ }d1}g }g }d| }x^t
|j	ƒD ]P\}	}
d}||
ƒ�rÒd2}d3}|
jd4||	f |ƒ}|j|ƒ |jd5||	f ƒ �q´W |j}||ƒ�rJd| }|jd6|ƒ}|jd|ƒ tj}d }d7}d3}|�rÐd	j|ƒ}|�pbd
}d8|||f }|d|j|ƒf ƒ |dƒ |�rœ||ƒ d	j|ƒ}|d$|||f ƒ |�rÆ|d9ƒ |dƒ n|d:||f ƒ |d;ƒ |ƒ  d S )<Nr   Znoargr   Zarg0rL   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 *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   r   r-   Ó  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   )r,   r_   r   r   r   r-   Þ  s    z  { %s%s(%s); }z  _cffi_save_errno();z  Py_END_ALLOW_THREADSz  (void)self; /* unused */z  (void)noarg; /* unused */z  return %s;Úresultzresult typez  Py_INCREF(Py_None);z  return Py_None;z#elsec             S   s    t | tjƒpt | tjƒo| jƒ S )N)rM   r   rW   Ú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<   rJ   rM   r   rR   rÓ   Ú_generate_cpy_constant_declr„   r   rL   rY   rK   r·   r0   ÚabirÖ   rN   r|   rÂ   r®   r¿   rÇ   ÚinsertZ	void_type)r   rC   r   r¥   ÚnumargsZargnameÚ	argumentsZcall_argumentsrÆ   r_   r¯   Úrepr_argumentsrÚ   Úname_and_argumentsZresult_codeÚargrÁ   r—   Zresult_declÚrngrØ   Ú
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   rt   z
_cffi_f_%sz
_cffi_d_%s)r   )rÓ   r<   Ú_generate_cpy_constant_ctxrE   rc   r   rL   ZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_Vrz   rK   r   r\   )r   rC   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])rM   r   rÃ   rS   r·   rh   r«   )r   Z	tp_structZ
field_nameZtp_fieldÚactual_lengthZptr_struct_nameÚtp_itemr   r   r   rh   9  s    

zRecompiler._field_typec             C   s0   | j |ƒ | jr,x|jƒ D ]}| j|ƒ qW d S )N)rb   r<   Úanonymous_struct_fieldsÚ_struct_collecttype)r   rC   Úfldtyper   r   r   ré   E  s    
zRecompiler._struct_collecttypec             C   s<  |j d krd S | j}d|f }|dƒ |d||f ƒ |dƒ |dƒ |dƒ xÊ|jƒ D ]¾\}}}}	y||jƒ sv|dkrŠ|d|||f ƒ wXx2t|tjƒr¼|jd ks¬|jd	kr¼|j}|d
 }qŒW |d|j	dd| |	d�|f ƒ W qX t
k
�r }
 z|dt|
ƒ ƒ W Y d d }
~
X qXX qXW |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   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)rr   z
  /* %s */r™   z(struct _cffi_align_%s { char x; %s y; };)rd   r„   rg   rµ   rM   r   rÃ   rS   r«   r·   r   rH   )r   rC   r¾   rÎ   r¥   ZcheckfuncnameZfnameZftyper   Úfqualrs   r   r   r   Ú_struct_declL  s6    

&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ƒ n|jdƒ d}dj|ƒpºd	}g }|d k�rZ| j }	t|j|	ƒƒ}
�x
|
D �] \}}}}| j|||ƒ}| j|d
|j|f ƒ t}|dk�r6t}d| }nL|d k�sZt|tjƒ�r`|jd k�r`d}n"d|d k�rv|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�r$d}d}d}n4|d k	�r@d|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_OPAQUEZopaqueZ_CFFI_F_CHECK_FIELDSZ_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   ru   z
(size_t)-2r4   Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z
sizeof(%s)z"offsetof(struct _cffi_align_%s, y)r   rv   éþÿÿÿrš   rš   )!rE   rM   r   Z	UnionTyperK   rd   r:   re   rf   ÚpartialÚanyrè   Zpackedr0   r<   r¬   rg   rh   Ú_check_not_opaquer   r!   r"   rÃ   rS   r·   r   r\   r   rz   Úextendr%   r}   rÀ   )r   rC   r¾   rÎ   rÏ   r&   Zreason_for_not_expandingr'   r+   Zexpand_anonymous_struct_unionrg   Zfldnamerê   r   rë   r    r   Úoffsetr*   Zalignr)   r   r   r   rÐ   m  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()))rM   r   rÃ   r«   rW   rd   rÄ   )r   rC   Ú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   rD   Ë  s    z7Recompiler._add_missing_struct_unions.<locals>.<lambda>)rA   zDinternal inconsistency: %r is partial but was not seen at this pointú$r   Z_IO_FILEÚFILEzinternal inconsistency: %r)r¬   rU   rk   r   r}   rð   r   r   Ú
startswithÚisdigitZ	forcenamerÌ   rÐ   )r   rq   rC   ÚorderrÎ   r   r   r   r~   Å  s    


z%Recompiler._add_missing_struct_unionsc             C   s   | j |ƒ d S )N)ré   )r   rC   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   rj   )r·   r¸   )r   rC   r¾   r   r   r   Ú_struct_namesà  s    
zRecompiler._struct_namesc             C   s   | j |f| j|ƒžŽ  d S )N)rì   rü   )r   rC   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   rC   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)rM   r   rX   Ú_generate_cpy_enum_collecttyperé   )r   rC   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_)rM   r   rX   Ú_generate_cpy_enum_declrì   )r   rC   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  )rM   r   rX   Ú	_enum_ctxrÐ   )r   rC   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„   rJ   r·   )r   Úis_intr   rC   Ú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<   rb   )r   rC   r   r  r   r   r   Ú"_generate_cpy_constant_collecttype&  s    z-Recompiler._generate_cpy_constant_collecttypec             C   s   |j ƒ }| j|||ƒ d S )N)rµ   r
  )r   rC   r   r  r   r   r   rÙ   +  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   rt   z_cffi_const_%srš   )
r<   rµ   r\   ÚOP_CONSTANT_INTZOP_DLOPEN_CONSTZOP_CONSTANTrE   rz   rK   r   )r   rC   r   r
   Z
const_kindr&   r   r   r   rä   /  s    


z%Recompiler._generate_cpy_constant_ctxc             C   s   | j |ƒ d S )N)rb   )r   rC   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   rC   r   Ú
enumeratorr   r   r   r  B  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   rt   z_cffi_const_%s)r   rö   z
sizeof(%s)z((%s)-1) <= 0r   r.   rw   rš   rš   )rE   r\   ÚOP_ENUMr<   Zcheck_not_partialÚzipr  Z
enumvaluesrz   rK   r   Zbuild_baseinttyper:   ZsizeofÚintÚcastr0   r1   r   )r   rC   r¾   r&   r
   r  Z	enumvaluer   r2   Zbasetpr3   r   r   r   r  F  s"    




zRecompiler._enum_ctxc             C   s   | j ||jƒ ƒ d S )N)r  r    )r   rC   r   r   r   r   Ú_generate_cpy_enum_ctx[  s    z!Recompiler._generate_cpy_enum_ctxc             C   s   d S )Nr   )r   rC   r   r   r   r   Ú_generate_cpy_macro_collecttypea  s    z*Recompiler._generate_cpy_macro_collecttypec             C   s&   |dkrd }n|}| j d||d� d S )Nz...T)r   )r
  )r   rC   r   r   r   r   r   Ú_generate_cpy_macro_decld  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   rt   z_cffi_const_%s)r   rš   )r<   r   r\   r  rz   rK   r   )r   rC   r   r   r
   r   r   r   Ú_generate_cpy_macro_ctxk  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])rM   r   rÃ   rS   rÈ   r«   )r   rC   Zglobal_nameræ   rç   r   r   r   rÈ   |  s    
zRecompiler._global_typec             C   s   | j | j||ƒƒ d S )N)rb   rÈ   )r   rC   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 )rr   r˜   z  return %s(%s);r™   )	r„   rÈ   rM   r   rÃ   rS   r«   r·   rn   )r   rC   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 )Nrt   z_cffi_var_%s)	rÈ   rE   r<   ZOP_GLOBAL_VARZOP_GLOBAL_VAR_Frz   rK   r   r\   )r   rC   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)rM   r   rR   rJ   rb   )r   rC   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 };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)rM   r   r×   r   )rC   r   r   r   Úmay_need_128_bitsË  s    z9Recompiler._extern_python_decl.<locals>.may_need_128_bitsr6   é   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„   rM   rÖ   r   rN   r·   r;   rY   rL   rK   r0   rÚ   r?   r   rW   rP   r¤   )r   rC   r   Ztag_and_spacer¥   Zsize_of_resultrÆ   rÝ   r_   r¯   rà   rÞ   rß   r  Z	size_of_ar   r   r   Ú_extern_python_decl³  sX    





"zRecompiler._extern_python_declc             C   s   | j ||dƒ d S )Nzstatic )r  )r   rC   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 )r  )r   rC   r   r   r   r   Ú#_generate_cpy_dllexport_python_declë  s    z.Recompiler._generate_cpy_dllexport_python_declc             C   s   | j ||dƒ d S )Nr   )r  )r   rC   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"rt   z&_cffi_externpy__%s)
r<   r   rÓ   r   rE   r\   ZOP_EXTERN_PYTHONrz   rK   r   )r   rC   r   r&   r
   r   r   r   Ú_generate_cpy_extern_python_ctxñ  s    


z*Recompiler._generate_cpy_extern_python_ctxc             C   sz   | j }|dƒ xf|jdƒD ]X}|d| jƒ ƒ d}x6|D ].}t|ƒdkrT||ƒ d}|dt|ƒf 7 }q8W ||ƒ qW d S )Nz=// # NB. this is not a string because of a size limit in MSVCTz// r   éL   z%d,)r„   Ú
splitlinesÚrstripr   Úord)r   Úsr¥   ÚlineZprinted_lineÚcr   r   r   r�      s    
z)Recompiler._print_string_literal_in_arrayc             C   s   t ttƒ| j|< d S )N)r\   ÚOP_PRIMITIVEZ	PRIM_VOIDrI   )r   rC   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   r\   r+  rI   )r   rC   rœ   r7   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   r\   r+  rI   )r   rC   rœ   r(  r   r   r   Ú!_emit_bytecode_UnknownIntegerType  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   r\   r+  rI   )r   rC   rœ   r(  r   r   r   Ú_emit_bytecode_UnknownFloatType  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  r4   zabi=%r)r\   ZOP_FUNCTIONrE   rÖ   rI   rL   rM   r   r×   r-  r!   r  rÓ   rÚ   r   ZOP_FUNCTION_END)r   rC   rœ   r^   Z	realindexr'   r   r   r   Ú_emit_bytecode_RawFunctionType#  s    




z)Recompiler._emit_bytecode_RawFunctionTypec             C   s   t t| j|j ƒ| j|< d S )N)r\   Ú
OP_POINTERrE   rÑ   rI   )r   rC   rœ   r   r   r   Ú_emit_bytecode_PointerType6  s    z%Recompiler._emit_bytecode_PointerTypec             C   s"   |j ƒ }tt| j| ƒ| j|< d S )N)rc   r\   r1  rE   rI   )r   rC   rœ   Úrawr   r   r   Ú_emit_bytecode_FunctionPtrType<  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   rB   )rE   r«   rS   r\   ZOP_OPEN_ARRAYrI   r   rH   r¸   rJ   ZOP_ARRAY)r   rC   rœ   Z
item_indexr   r   r   Ú_emit_bytecode_ArrayType@  s    

z#Recompiler._emit_bytecode_ArrayTypec             C   s   | j | }tt|ƒ| j|< d S )N)rU   r\   ZOP_STRUCT_UNIONrI   )r   rC   rœ   Zstruct_indexr   r   r   Ú_emit_bytecode_StructTypeN  s    
z$Recompiler._emit_bytecode_StructTypec             C   s   | j | }tt|ƒ| j|< d S )N)rV   r\   r  rI   )r   rC   rœ   Z
enum_indexr   r   r   Ú_emit_bytecode_EnumTypeS  s    
z"Recompiler._emit_bytecode_EnumType)F)r   )N)Nr  N)N)Ur   r   r   r¤   r   r@   ra   rb   rF   r{   r€   r„   r‰   r•   r†   rª   r…   r°   r¿   rÂ   rº   rÇ   rÉ   rÊ   rË   rÌ   rÒ   rÔ   rã   rå   rh   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_collecttyper  r   r!  r"  r#  Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxr�   r,  r-  r.  r/  r0  r2  Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyper4  r5  r6  Z_emit_bytecode_UnionTyper7  r   r   r   r   r9   {   s¦   
:
 ,
4-# !
Q	 

	5r9   é   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚNativeIOc                s(   t |tƒr|jdƒ}tt| ƒj|ƒ d S )NÚascii)rM   ZunicodeÚencodeÚsuperr9  rƒ   )r   r(  )r[   r   r   rƒ   \  s    

zNativeIO.write)r   r   r   rƒ   Ú__classcell__r   r   )r[   r   r9  [  s   r9  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)Úprintr9   ra   r€   r9  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_sourcea  s4    
rJ  Fc             C   s   |d k	st ‚t| ||||ƒS )N)rJ   rJ  )r:   r;   rˆ   Ztarget_c_filerG  r   r   r   Úmake_c_source}  s    
rK  c             C   s   t | |d ||ƒS )N)rJ  )r:   r;   Ztarget_py_filerG  r   r   r   Úmake_py_source‚  s    
rL  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š   )rl   rŒ   Úmakedirsr�   r0   rE  )Z	outputdirÚmodnameÚ	extensionÚpartsr   r   r   Ú_modname_to_file†  s    
$rQ  c             C   s*   t ||ƒ}| j|||fƒ t|||ƒ |S )N)rZ   rK   Úsetattr)Ú	patchlistÚclsr   Znew_methÚoldr   r   r   Ú_patch_meth”  s    
rV  c             C   s(   x"t | ƒD ]\}}}t|||ƒ q
W d S )N)ÚreversedrR  )rS  rT  r   Zold_methr   r   r   Ú_unpatch_methsš  s    rX  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 )NÚwin32r   )ÚMSVCCompilerZ_remove_visual_c_refc             S   s   |S )Nr   )r   Zmanifest_filer   r   r   rD   £  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)Z	linker_sor¬   rœ   )r   rL   Úkwdsr_   )Ú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.msvc9compilerrZ  rV  Zdistutils.ccompilerr\  )rS  rZ  r\  r_  r   )r^  r   Ú_patch_for_embeddingž  s    


rb  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.*r4   rY  z.dllr[  z.dylibz.soZget_ext_filenamec                s   ˆ S )Nr   )r   Zext_name)Útargetr   r   rD   À  s    z#_patch_for_target.<locals>.<lambda>rï   )Zdistutils.command.build_extrc  Úendswithr`  ra  rV  )rS  rd  rc  r   )rd  r   Ú_patch_for_target²  s    




rf  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 )
Nr:  z%s.*r   )rG  r–   zthe current directory isz setting the current directory toz%s %rz.py)rM   rH   r;  Z_windows_unicodeZ_apply_windows_unicoder›   Z_apply_embedding_fixrQ  rŒ   r�   r0   r   Zget_extensionrK  Úgetcwdrb  rf  r?  ÚabspathÚchdirÚcompilerX  rL  )r:   r;   rˆ   ÚtmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verboserd  Údebugr]  Z	embeddingrP  Z
ext_c_fileZextÚupdatedrS  ÚcwdÚmsgÚoutputfilenamerj   r   r   r   Ú	recompileÃ  sb    
















rr  c             O   sð   ddl m} dd l}|tjks,td|f ƒ‚|jdt|ƒƒ t| ||f|ž|Ž}|j	||ƒ}xFt
|jƒD ]8}	|	jdƒsht|j|	ƒ}
|
t| |	tƒ ƒk	rht| |	|
ƒ qhW dd„ }|| _x6t
| ƒD ]*}	|	jdƒ r¼t|j|	ƒ r¼t| |	tƒ q¼W |jS )Nr   )Úudirzmodule name conflict: %rrl  rj   c              _   s   t ‚d S )N)r   )rL   r]  r   r   r   Útypeof_disabled  s    z _verify.<locals>.typeof_disabled)Ztesting.udirrs  Úimpr`  ÚmodulesrJ   Ú
setdefaultrH   rr  Zload_dynamicÚdirr:   rø   rZ   ÚobjectrR  Z_typeofÚhasattrÚNotImplementedÚlib)r:   r;   rˆ   rL   r]  rs  ru  rq  Úmoduler   Úattrrt  r   r   r   Ú_verify  s$    

r  )r8  )F)F)r–   TNrg  Nr   NN) rŒ   r`  Úior   r   r   Úerrorr   Zcffi_opcoder=   rž   r¹   r   r   r%   r1   r8   r9   Úversion_infoÚStringIOr9  ÚBytesIOrJ  rK  rL  rQ  rV  rX  rb  rf  rr  r  r   r   r   r   Ú<module>   sH            f


  
<