3
.W)                 @   s
  d dl Z d dlZd dlZddlmZmZ ddlT 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d.krejZnG dd dejZdd Zd/ddZd0ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd1d*d+Zd,d- ZdS )2    N   )ffiplatformmodel)*Z0x2601Z0x2701c               @   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   O/var/www/html/enquirykeeper_venv/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   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   6   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   A   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>J   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   H   s    
zStructUnionExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r$   5   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
   r1   r2   r   r   r   r   S   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
   r1   r2   )r   r   r   r   r   Z   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   )r3   r   )r3   r   )r4   r   )r4   r   )r5   r   )r5   r   )Z
PRIM_UINT8Z	PRIM_INT8ZPRIM_UINT16Z
PRIM_INT16ZPRIM_UINT32Z
PRIM_INT32ZPRIM_UINT64Z
PRIM_INT64r
   r1   r"   r%   r   r2   )r   
prim_indexr   r   r   r   _   s    

zEnumExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r0   R   s   r0   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   k   s    zTypenameExpr.__init__c             C   s   d| j | jf S )Nz  { "%s", %d },)r   r%   )r   r   r   r   r   o   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   r   s    zTypenameExpr.as_python_exprN)r   r   r   r   r   r   r   r   r   r   r7   j   s   r7   c               @   sp  e Zd ZdZdddZdd Zdd Zd	d
 ZdddddgZdd Z	dddZ
dd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zdd>d?Zd@dA Z dBdC Z!dDdE Z"e"Z#dFdG Z$dHdI Z%e%Z&dJdK Z'e'Z(dLdM Z)dNdO Z*dPdQ Z+ddSdTZ,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0dd]d^Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkdl Z8dmdn Z9dodp Z:dqdr Z;e; Z<Z=dsdt Z>dudv Z?dwdx Z@dydz ZAd{d| ZBeB ZCZDd}d~ ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKeKZLeKZMdd ZNdd ZOdd ZPePZQdd ZRd=S )
Recompilerr   Fc             C   s   || _ || _|| _d S )N)ffimodule_nametarget_is_python)r   r9   r:   r;   r   r   r   r   |   s    zRecompiler.__init__c          	   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st| j | d krt| j| j |< | jj| qjW | jjd q*W xZ|D ]R}|j o| j | d krt| j| j |< | jj| |jr|jd k	r| jjd qW 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|< qW x.tt| jdd dD ]\}}|| j|< qW x0|D ](}t| d|jj }||| j |  qW 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   )r>   r   r   r   r?      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_declsr>   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rd | j|< t |tjrb| j|j  ntt |tjr|j	d k	r|| j
jjkrxN|j D ] \}}}}| j| j||| qW n x|j D ]\}}| j| qW d S )N)rH   r   ZBaseTypeByIdentityrX   _do_collect_typer@   rM   as_raw_functionrR   fldtypesr9   _parser_included_declarations
enumfields_field_typeZ
_get_items)r   r>   xZname1rY   _r   r   r   r]      s     




zRecompiler._do_collect_typec       
      C   s   | j jjj }xt|D ]\}\}}|jdd\}}yt| d||f }W n" tk
rl   tj	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)r9   r`   Z_declarationsitemsrB   splitrU   AttributeErrorr   VerificationError_current_quals	Exceptionr   Zattach_exception_info)
r   	step_namelstr   r>   qualskindZrealnamer[   er   r   r   rA      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 st|| j|jkstqW t
|t
| jkst| j d }x<| jj	 D ].\}}|t
|k st|| j|jkstqW t
|t
| jks6td S )Nctxrr   c             S   s   | j S )N)r   )entryr   r   r   r?      s    z0Recompiler.collect_step_tables.<locals>.<lambda>)r<   rs   rt   )_lsts	ALL_STEPSset_seen_struct_unionsrA   _add_missing_struct_unionssortrX   rP   rf   r   rE   r   rQ   )r   rl   rm   r>   rZ   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;   rE   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pathr/   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 | jd}|jd}| jd|||d < |dj| | jjddA }| jjd k	r|d| jf  |d	| j	| jjf  |d
 |d|f  |d |d|f  |d |d|f  |d | jd}|dj| t
}nt}|d |  || |  |d |  |d tdd | jj D }xLt| jD ]>\}}	d}
||krd|| 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  qW |d |  qW | jjr|d xv| jjD ]j}y|jd d \}}W n* tk
r   tjd| j|f Y nX |d krtjd |d!|f  qbW |d" |d |  |d# |d$ x8| jD ].}|| dkr|d%|  n|d&|  qW x.| jD ]$}|d'kr8|d(|| |f  q8W | jjrt|d) n|d* |d+t| jf  d}| jr|dO }|d,|  |d |  |d
 |d- |d.|f  |d/ | jr|d0 |d1 |d2 |d3|  |d4 |d5 |d6 |d7 |d8 |d9|f  |d: |d;|f  |d< |d< |d |d- |d=|f  |d/ |d>| j|f  |d5 |d |d- |d?|f  |d/ |d@| j|f  |d5 |d d S )BNz#define _CFFI_USE_EMBEDDINGz_cffi_include.hz#include "parse_c_type.h"
zparse_c_type.hr   r   .z#define _CFFI_MODULE_NAME  "%s"z%#define _CFFI_PYTHON_STARTUP_CODE  %sz#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>/************************************************************/zstatic void *_cffi_types[] = {c             S   s   g | ]\}}||fqS r   r   )r+   r>   rZ   r   r   r   r,   @  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[] = {r3   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 */rr   z  %d,  /* num_%ss */z  _cffi_includes,z  NULL,  /* no includes */z  %d,  /* num_types */z  %d,  /* flags */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 *)%s;z    p[1] = &_cffi_type_context;}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)z3  return _cffi_init("%s", %s, &_cffi_type_context);zinit%s(void)z,  _cffi_init("%s", %s, &_cffi_type_context);)r   r   r9   
_embeddingr   indexr/   r:   rg   _string_literalVERSION_EMBEDDEDVERSIONdictr@   rf   rT   rD   _get_c_namer   rz   _seen_constantsrA   ry   rx   r   _included_ffis_assigned_sourcerh   r   ri   _num_externpy)r   r   r   prntr   rZ   Zbase_module_nameversiontypeindex2typer   r(   numsrl   rm   rw   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-   )rH   rC   listrX   r   rF   r/   r   )r   rd   repr   )r   r   r     s    


zRecompiler._to_pyc             C   s  || _ | j}|d |d t| jjp(f }x~t|D ]r}| jj| }y|jd d \}}W n( tk
r   tj	d| j|f Y nX |d k	rtj	d|d||f  q6W |  |d| j
f  |dtf  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_backendr3   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 = %s,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+   r>   rZ   r   r   r   r,     s    r   rr   z    _%ss = %s,z    _includes = (%s,),z, c             S   s   g | ]}d | qS )z_ffi%dr   )r+   rZ   r   r   r   r,     s    ))r   r   r   r9   r   ranger   rh   r   ri   r:   r   rX   rD   r   r/   r   r@   rf   ry   rx   )r   r   r   Znum_includesrZ   r   r   r   Z	types_lstr   rl   rm   r   r   r   r     s@    

zRecompiler.write_py_source_to_fc             C   s
   | j | S )N)r@   )r   typer   r   r   _gettypenum  s    zRecompiler._gettypenumc             C   sB  d}t |tjrr|j r2|jdkr2d}d|j }n:t |tjrPd|jdf }nd|jd|jjddf }d	}nt |tjr| j	|||| d S t |tj
r| jd
|| j||f  | jd|  d S t |tjrd|jd }d| j| }d}nt|| jd||||f  | jd||jd|f  | jd|  d S )Nr   Z_BoolZ_cffi_to_c_intz, %sz(%s)_cffi_to_c_doublez(%s)_cffi_to_c_%sr   re   z-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()))rH   r   rJ   is_integer_typer   UnknownFloatType
get_c_namereplacerK   "_convert_funcarg_to_c_ptr_or_arrayrL   r   r   rM   r   )r   r>   fromvartovarerrcodeZextraarg	converterZerrvaluer   r   r   _convert_funcarg_to_c  s8    
z Recompiler._convert_funcarg_to_cc             C   s   t |tjr|jd d S )NzPy_ssize_t datasize)rH   r   rK   add)r   r>   	localvarsr   r   r   _extra_local_variables  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   r>   r   r   r   r   r   r   r     s    


z-Recompiler._convert_funcarg_to_c_ptr_or_arrayc             C   s  t |tjrl|j r"d||jf S t |tjr8d|f S |jdkrXd|jjdd|f S d|| j|f S nt |tjtj	frd|| j|f S t |tj
rd|| jtj|jf S t |tjr|jd krtd	|j |f d
|| j|f S t |tjrd|| j|f S t|d S )Nz_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s)zlong doublez_cffi_from_c_%s(%s)r   re   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)))rH   r   rJ   r   r   r   r   r   rK   rM   	ArrayTyper   rR   Zfldnames	TypeErrorr   rS   r   )r   r>   varcontextr   r   r   _convert_expr_from_c.  s2    


zRecompiler._convert_expr_from_cc             C   s   | j | d S )N)r]   )r   r>   r   r   r   r   !_generate_cpy_typedef_collecttypeN  s    z,Recompiler._generate_cpy_typedef_collecttypec             C   s   d S )Nr   )r   r>   r   r   r   r   _generate_cpy_typedef_declQ  s    z%Recompiler._generate_cpy_typedef_declc             C   s$   | j | }| jd jt|| d S )Nru   )r@   rx   rF   r7   )r   r>   r   r%   r   r   r   _typedef_ctxT  s    
zRecompiler._typedef_ctxc             C   sZ   | j || t|dd dkr0| j||jd d n&t|tjrV| j|j|jj|j|d d S )NoriginZunknown_type)
approxname)r   	named_ptr)r   rU   _struct_ctxr   rH   r   ZNamedPointerTypetotype)r   r>   r   r   r   r   _generate_cpy_typedef_ctxX  s    z$Recompiler._generate_cpy_typedef_ctxc             C   s*   | j |j  |jr&| j r&| j | d S )N)r]   r^   ellipsisr;   )r   r>   r   r   r   r   "_generate_cpy_function_collecttypec  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|}|pd
}|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|
| qW x|D ]}|d|f  qW t|jtjsd}d| }d|jjd| }|| nd }d}t|j	dkrtt|j	}x|D ]}	|d|	  qJW |  |d|t|t|d	jdd |D f  |d |  x6t
|j	D ](\}	}
| j|
d|	 d|	 d  |  qW |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/}g }g }d| }xbt
|j	D ]T\}	}
d}t|
tjrd0}d1}|
jd2||	f |}|j| |jd3||	f  qW |j}t|tjrJd| }|jd4|}|jd| tj}d }d5}d1}|rd	j|}|pbd
}d6|||f }|d|j|f  |d |r|| d	j|}|d$|||f  |r|d7 |d n|d8||f  |d9 |  d S ):Nr   Znoargr   Zarg0rG   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+   rZ   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+   rZ   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#elseFr   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;   rE   rH   r   rM   r   _generate_cpy_constant_declr   r   rG   rT   rF   r   r/   abir   rI   rz   r   r   r   r   rR   insertZ	void_type)r   r>   r   r   numargsZargname	argumentsZcall_argumentsr   rZ   r   repr_argumentsr   name_and_argumentsZresult_codeargr   r   Zresult_declrng
differenceZindirectionZ	tp_resultr   r   r   _generate_cpy_function_declh  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   rq   z
_cffi_f_%sz
_cffi_d_%s)r
   )r   r;   _generate_cpy_constant_ctxr@   r^   r   rG   ZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_Vrx   rF   r   rW   )r   r>   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])rH   r   r   rN   r   rc   r   )r   Z	tp_struct
field_nameZtp_fieldactual_lengthZptr_struct_nametp_itemr   r   r   rc     s    

zRecompiler._field_typec             C   s   | j | d S )N)r]   )r   r>   r   r   r   _struct_collecttype   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
 }qW |d|j	dd| |	d|f  W qX t
j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)rn   z
  /* %s */r   z(struct _cffi_align_%s { char x; %s y; };)r_   r   rb   r   rH   r   r   rN   r   r   r   ri   rC   )r   r>   cnamer   r   ZcheckfuncnamefnameZftyper   fqualrp   r   r   r   _struct_decl#  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|j
 rn
|jd |jr|jd n|jd d}dj|pd	}g }|d krLt|j }	x
|	D ] \}
}}}| j||
|}| j|d
|j|
f  t}|dkr(t}d| }nL|d ksLt|tjrR|jd krRd}n"d|d krh|jdn|j|
f }|d ks|dkrd}n,|d k	rd|j|
f }nd|jd|
f }|jt|
|||t|| j |  qW t| jd }| jd j| |d krd}d}d}n4|d k	r2d|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   rr   z
(size_t)-2r3   Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z
sizeof(%s)z"offsetof(struct _cffi_align_%s, y)r   rs   r   r   )r@   rH   r   Z	UnionTyperF   r_   r9   r`   ra   partialZhas_anonymous_struct_fieldsZpackedr/   r   rb   rc   _check_not_opaquer   r    r!   r   rN   r   r   rW   r   rx   extendr$   r{   r   )r   r>   r   r   r   r%   Zreason_for_not_expandingr&   r*   rb   ZfldnameZfldtyper   r   r   r
   offsetr)   Zalignr(   r   r   r   r   D  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()))rH   r   r   r   rR   r_   r   )r   r>   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rd}| j|d ntd	|f | j|d | q$W d S )
Nc             S   s   | d S )Nr   r   )Ztp_orderr   r   r   r?     s    z7Recompiler._add_missing_struct_unions.<locals>.<lambda>)r<   zDinternal inconsistency: %r is partial but was not seen at this point$r   Z_IO_FILEZFILEzinternal inconsistency: %r)r   rP   rf   r}   r{   r   r   r   
startswithisdigitZ	forcenamer   r   )r   rm   r>   orderr   r   r   r   r|     s    


z%Recompiler._add_missing_struct_unionsc             C   s   | j | d S )N)r   )r   r>   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   re   )r   r   )r   r>   r   r   r   r   _struct_names  s    
zRecompiler._struct_namesc             C   s   | j |f| j|  d S )N)r   r   )r   r>   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   r>   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)rH   r   rS   _generate_cpy_enum_collecttyper   )r   r>   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_)rH   r   rS   _generate_cpy_enum_declr   )r   r>   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   )rH   r   rS   	_enum_ctxr   )r   r>   r   r   r   r   _generate_cpy_anonymous_ctx  s    z&Recompiler._generate_cpy_anonymous_ctxconstc             C   s  ||f| j kr tjd||f | j j||f | j}d||f }|r|d|  |d |d|f  |d||f  |d k	r|dkrd|f }|d	|f  |d
 |d |d n>|d kst|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   ri   r   r   rE   r   )r   is_intr   r>   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;   r]   )r   r>   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   r>   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   rq   z_cffi_const_%sr   )
r;   r   rW   OP_CONSTANT_INTZOP_DLOPEN_CONSTZOP_CONSTANTr@   rx   rF   r   )r   r>   r   r	   Z
const_kindr%   r   r   r   r     s    


z%Recompiler._generate_cpy_constant_ctxc             C   s   | j | d S )N)r]   )r   r>   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   r>   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	rd|kr| j rd| }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   rq   z_cffi_const_%s)r   r   z
sizeof(%s)z((%s)-1) <= 0r   r-   rt   r   r   )r@   rW   OP_ENUMr;   Zcheck_not_partialzipr  Z
enumvaluesrx   rF   r   Zbuild_baseinttyper9   sizeofintcastr/   r0   r   )r   r>   r   r%   r	   r  Z	enumvaluer
   r1   Zbasetpr2   r   r   r   r     s"    




zRecompiler._enum_ctxc             C   s   | j ||j  d S )N)r   r   )r   r>   r   r   r   r   _generate_cpy_enum_ctx1  s    z!Recompiler._generate_cpy_enum_ctxc             C   s   d S )Nr   )r   r>   r   r   r   r   _generate_cpy_macro_collecttype7  s    z*Recompiler._generate_cpy_macro_collecttypec             C   s&   |dkrd }n|}| j d||d d S )Nz...T)r   )r  )r   r>   r   r   r   r   r   _generate_cpy_macro_decl:  s    z#Recompiler._generate_cpy_macro_declc             C   sV   |dkr$| j rtj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   rq   z_cffi_const_%s)r   r   )r;   r   ri   rW   r  rx   rF   r   )r   r>   r   r   r	   r   r   r   _generate_cpy_macro_ctxA  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])rH   r   r   rN   _global_typer   )r   r>   Zglobal_namer   r   r   r   r   r  R  s    
zRecompiler._global_typec             C   s   | j | j|| d S )N)r]   r  )r   r>   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 )rn   r   z  return %s(%s);r   )	r   r  rH   r   r   rN   r   r   rj   )r   r>   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 )Nrq   z_cffi_var_%s)	r  r@   r;   ZOP_GLOBAL_VARZOP_GLOBAL_VAR_Frx   rF   r   rW   )r   r>   r   r%   r   r   r   r   _generate_cpy_variable_ctxu  s    

z%Recompiler._generate_cpy_variable_ctxc             C   s   t |tjst| j| d S )N)rH   r   rM   rE   r]   )r   r>   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||f  |  g }d| }x0t|jD ]"\}}	|	jd| |}
|j|
 qpW d	j	|}|pd
}d||f }|j
dkrd| }dd }tt|jd d}||jrt|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||	rd|
 }
tj|	}	|d|	jd|d |
f  qfW |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 };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)rH   r   PrimitiveTyper   )r>   r   r   r   may_need_128_bits  s    z9Recompiler._extern_python_decl.<locals>.may_need_128_bitsr5      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   rH   r   r   rI   r   rT   rG   rF   r/   r   maxr   rR   rK   r   )r   r>   r   Ztag_and_spacer   Zsize_of_resultr   r   rZ   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   r>   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   r>   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   r>   r   r   r   r   '_generate_cpy_extern_python_plus_c_decl  s    z2Recompiler._generate_cpy_extern_python_plus_c_declc             C   sT   | j rtj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"rq   z&_cffi_externpy__%s)r;   r   ri   r   r   r@   rW   ZOP_EXTERN_PYTHONrx   rF   r   )r   r>   r   r%   r	   r   r   r   _generate_cpy_extern_python_ctx  s    


z*Recompiler._generate_cpy_extern_python_ctxc                sR   dd  g }x:|j dpdgD ]&}|jddj fdd|D   qW dj|S )	Nc             S   sD   | dkrd|  S d|   ko"dk n  r,| S | dkr8dS dt |  S )Nz\"?\r   r   z\nz\%03o)ord)cr   r   r   
_char_repr  s       z.Recompiler._string_literal.<locals>._char_reprTr   z"%s"c                s   g | ]} |qS r   r   )r+   r$  )r%  r   r   r,     s    z.Recompiler._string_literal.<locals>.<listcomp>z \
)
splitlinesrF   r/   )r   sr   liner   )r%  r   r     s
    &zRecompiler._string_literalc             C   s   t tt| j|< d S )N)rW   OP_PRIMITIVEZ	PRIM_VOIDrD   )r   r>   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   rW   r)  rD   )r   r>   r   r6   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   rW   r)  rD   )r   r>   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   rW   r)  rD   )r   r>   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  r3   zabi=%r)rW   ZOP_FUNCTIONr@   r   rD   rG   rH   r   r  r+  r    r  r   r   r   ZOP_FUNCTION_END)r   r>   r   rY   Z	realindexr&   r   r   r   _emit_bytecode_RawFunctionType  s    




z)Recompiler._emit_bytecode_RawFunctionTypec             C   s   t t| j|j | j|< d S )N)rW   
OP_POINTERr@   r   rD   )r   r>   r   r   r   r   _emit_bytecode_PointerType  s    z%Recompiler._emit_bytecode_PointerTypec             C   s"   |j  }tt| j| | j|< d S )N)r^   rW   r/  r@   rD   )r   r>   r   rawr   r   r   _emit_bytecode_FunctionPtrType  s    z)Recompiler._emit_bytecode_FunctionPtrTypec             C   s   | j |j }|jd kr(tt|| j|< nh|jdkrPtjdt|j	ddf n@| j|d  dksft
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   r=   )r@   r   rN   rW   ZOP_OPEN_ARRAYrD   r   ri   rC   r   rE   ZOP_ARRAY)r   r>   r   Z
item_indexr   r   r   _emit_bytecode_ArrayType  s    

z#Recompiler._emit_bytecode_ArrayTypec             C   s   | j | }tt|| j|< d S )N)rP   rW   ZOP_STRUCT_UNIONrD   )r   r>   r   Zstruct_indexr   r   r   _emit_bytecode_StructType#  s    
z$Recompiler._emit_bytecode_StructTypec             C   s   | j | }tt|| j|< d S )N)rQ   rW   r  rD   )r   r>   r   Z
enum_indexr   r   r   _emit_bytecode_EnumType(  s    
z"Recompiler._emit_bytecode_EnumType)F)r   )N)Nr   N)N)Sr   r   r   r   r   r\   r]   rA   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   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-  r.  r0  Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyper2  r3  r4  Z_emit_bytecode_UnionTyper5  r   r   r   r   r8   y   s   
:
 
3(  !
P	 

	5r8      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)rH   unicodeencodesuperr7  r   )r   r'  )rV   r   r   r   1  s    

zNativeIO.write)r   r   r   r   __classcell__r   r   )rV   r   r7  0  s   r7  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 |rt 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)printr8   r\   r~   r7  r   getvaluer   readr   IOErrorr   getpidr   renameOSErrorunlink)
r9   r:   r   Ztarget_fileverboseZ
recompilerr   outputf1Ztmp_filer   r   r   _make_c_or_py_source6  s4    
rI  Fc             C   s   |d k	st t| ||||S )N)rE   rI  )r9   r:   r   Ztarget_c_filerF  r   r   r   make_c_sourceR  s    
rJ  c             C   s   t | |d ||S )N)rI  )r9   r:   Ztarget_py_filerF  r   r   r   make_py_sourceW  s    
rK  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   )rg   r   makedirsr   r/   rD  )Z	outputdirmodname	extensionpartsr   r   r   _modname_to_file[  s    
$rP  c             C   s*   t ||}| j|||f t||| |S )N)rU   rF   setattr)	patchlistclsr   Znew_metholdr   r   r   _patch_methi  s    
rU  c             C   s(   x"t | D ]\}}}t||| q
W d S )N)reversedrQ  )rR  rS  r   Zold_methr   r   r   _unpatch_methso  s    rW  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   r?   x  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   rG   kwdsrZ   )old_link_shared_objectr   r   my_link_shared_object}  s
    

z3_patch_for_embedding.<locals>.my_link_shared_objectlink_shared_object)sysplatformZdistutils.msvc9compilerrY  rU  distutils.ccompilerr[  )rR  rY  r[  r_  r   )r^  r   _patch_for_embeddings  s    


rd  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.*r3   rX  z.dllrZ  z.dylibz.soget_ext_filenamec                s    S )Nr   )r   ext_name)targetr   r   r?     s    z#_patch_for_target.<locals>.<lambda>r   )distutils.command.build_extre  endswithra  rb  rU  )rR  rh  re  r   )rh  r   _patch_for_target  s    




rk  r   T.cc             K   sl  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|rd| }	nd}	tj||f|}t| ||||d}|r"g }tj }z<|rt| |	dkrt||	 tj| tjd|||
}W d tj| t| X |S ||fS n<|d krFt||d\}}t| |||d}|r`|S d |fS d S )Nr8  z%s.*r   )rF  r   z.py)rH   rC   r:  Z_windows_unicodeZ_apply_windows_unicoder   Z_apply_embedding_fixrP  r   r   r/   r   get_extensionrJ  getcwdrd  rk  chdircompilerW  rK  )r9   r:   r   tmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verboserh  debugr]  Z	embeddingrO  Z
ext_c_fileextupdatedrR  cwdoutputfilenamere   r   r   r   	recompile  sX    















rw  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 rt|j|	 rt| |	t qW |jS )Nr   )udirzmodule name conflict: %rrq  re   c              _   s   t d S )N)r   )rG   r]  r   r   r   typeof_disabled  s    z _verify.<locals>.typeof_disabled)Ztesting.udirrx  impra  modulesrE   
setdefaultrC   rw  load_dynamicdirr9   r   rU   objectrQ  Z_typeofhasattrNotImplementedlib)r9   r:   r   rG   r]  rx  rz  rv  moduler   attrry  r   r   r   _verify  s$    

r  )r6  )F)F)r   TNrl  Nr   NN)r   ra  ior   r   r   Zcffi_opcoder   r   r   r   r$   r0   r7   r8   version_infoStringIOr7  BytesIOrI  rJ  rK  rP  rU  rW  rd  rk  rw  r  r   r   r   r   <module>   sD            =


  
6