Your IP : 216.73.216.60


Current Path : /opt/alt/python35/lib64/python3.5/site-packages/cffi/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib64/python3.5/site-packages/cffi/__pycache__/recompiler.cpython-35.pyc



.�W)��
@s�ddlZddlZddlZddlmZmZddlTdZdZGdd�d�Z	Gd	d
�d
�Z
Gdd�d�ZGd
d�d�ZGdd�d�Z
Gdd�d�Zejdfkr�ejZnGdd�dej�Zdd�Zddd�Zddd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(dd)ddddd*d+�Zd,d-�ZdS).�N�)�ffiplatform�model)�*Z0x2601Z0x2701c@s:eZdZdddd�Zdd�Zdd�ZdS)	�
GlobalExprrcCs1||_||_||_||_||_dS)N)�name�address�type_op�size�check_value)�selfrrr	r
r�r
�B/opt/alt/python35/lib64/python3.5/site-packages/cffi/recompiler.py�__init__
s
				zGlobalExpr.__init__cCs&d|j|j|jj�|jfS)Nz'  { "%s", (void *)%s, %s, (void *)%s },)rrr	�	as_c_exprr
)rr
r
rrszGlobalExpr.as_c_exprcCs d|jj�|j|jfS)Nz
b'%s%s',%d)r	�as_python_bytesrr)rr
r
r�as_python_exprszGlobalExpr.as_python_exprN)�__name__�
__module__�__qualname__rrrr
r
r
rr	src@s@eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�	FieldExprcCs1||_||_||_||_||_dS)N)r�field_offset�
field_size�fbitsize�
field_type_op)rrrrrrr
r
rrs
				zFieldExpr.__init__cCsOdt|j�}d|j|jfd||jfd||jj�fS)N� z  { "%s", %s,
z     %s   %s,
z     %s   %s },)�lenrrrrr)rZspacesr
r
rr!s$zFieldExpr.as_c_exprcCs
t�dS)N)�NotImplementedError)rr
r
rr'szFieldExpr.as_python_exprcCsb|jjtkrd}n*|jjtkr?t|j�}nt�d|jj�||jfS)N�z	b'%s%s%s')	r�op�OP_NOOP�OP_BITFIELD�format_four_bytesrrrr)rZ	size_exprr
r
r�as_field_python_expr*s	zFieldExpr.as_field_python_exprN)rrrrrrr#r
r
r
rrsrc@s4eZdZdd�Zdd�Zdd�ZdS)�StructUnionExprc		CsL||_||_||_||_||_||_||_||_dS)N)r�
type_index�flagsr
�	alignment�comment�first_field_index�c_fields)	rrr%r&r
r'r(r)r*r
r
rr6s							zStructUnionExpr.__init__cCsfd|j|j|jfd|j|jfd|jt|j�f|jr]d|jnddS)Nz  { "%s", %d, %s,z
    %s, %s, z%d, %d z	/* %s */ rz},)	rr%r&r
r'r)rr*r()rr
r
rrAszStructUnionExpr.as_c_exprcCsWt|jt�}dd�|jD�}dt|j�t|�|jdj|�fS)NcSsg|]}|j��qSr
)r#)�.0Zc_fieldr
r
r�
<listcomp>Js	z2StructUnionExpr.as_python_expr.<locals>.<listcomp>z(b'%s%s%s',%s)�,)�evalr&ZG_FLAGSr*r"r%r�join)rr&Zfields_exprr
r
rrHs	
	zStructUnionExpr.as_python_exprN)rrrrrrr
r
r
rr$5sr$c@s4eZdZdd�Zdd�Zdd�ZdS)�EnumExprcCs1||_||_||_||_||_dS)N)rr%r
�signed�allenums)rrr%r
r1r2r
r
rrSs
				zEnumExpr.__init__cCs&d|j|j|j|j|jfS)Nz1  { "%s", %d, _cffi_prim_int(%s, %s),
    "%s" },)rr%r
r1r2)rr
r
rrZszEnumExpr.as_c_exprcCsodtdtd	td
tdtdtd
tdti|j|j	f}dt
|j�t
|�|j|j
fS)Nrr���zb'%s%s%s\x00%s')rr)rr)r3r)r3r)r4r)r4r)r5r)r5r)Z
PRIM_UINT8Z	PRIM_INT8ZPRIM_UINT16Z
PRIM_INT16ZPRIM_UINT32Z
PRIM_INT32ZPRIM_UINT64Z
PRIM_INT64r
r1r"r%rr2)r�
prim_indexr
r
rr_s	zEnumExpr.as_python_exprN)rrrrrrr
r
r
rr0Rsr0c@s4eZdZdd�Zdd�Zdd�ZdS)�TypenameExprcCs||_||_dS)N)rr%)rrr%r
r
rrks	zTypenameExpr.__init__cCsd|j|jfS)Nz  { "%s", %d },)rr%)rr
r
rroszTypenameExpr.as_c_exprcCsdt|j�|jfS)Nzb'%s%s')r"r%r)rr
r
rrrszTypenameExpr.as_python_exprN)rrrrrrr
r
r
rr7jsr7c@s�eZdZdZddd�Zdd�Zdd�Zd	d
�Zddd
ddgZdd�Z	ddd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>d?�Zd@dA�Z dBdC�Z!dDdE�Z"e"Z#dFdG�Z$dHdI�Z%e%Z&dJdK�Z'e'Z(dLdM�Z)dNdO�Z*dPdQ�Z+d=dRd=dSdT�Z,dUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0d=d]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|�ZBeBZCZDd}d~�ZEdd��ZFd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKeKZLeKZMd�d��ZNd�d��ZOd�d��ZPePZQd�d��ZRd=S)��
RecompilerrFcCs||_||_||_dS)N)�ffi�module_name�target_is_python)rr9r:r;r
r
rr|s		zRecompiler.__init__c	Csi|_|jd�t|jdt�}g|_x�|D]�}|jr;|j|dksct�t|j�|j|<|jj|�x}|j	D]r}t
|tjtj
tjtjtjf�s�t�|j|dkr�t|j�|j|<|jj|�q�W|jjd�q;Wxy|D]q}|jr$|j|dkr$t|j�|j|<|jj|�|jr$|jdk	r$|jjd�q$Wd|jj�ks�t�i|_i|_xO|D]G}t
|tj�r�d|j|<q�t
|tj�r�d|j|<q�Wx<tt|jddd���D]\}}||j|<q:Wx<tt|jddd���D]\}}||j|<qyWx;|D]3}t|d|jj�}|||j|�q�Wx&|jD]}t
|t�s�t�q�Wt|j�|_dS)	NZcollecttype�keyZEND�LENcSs|jS)N)r)�tpr
r
r�<lambda>�sz/Recompiler.collect_type_table.<locals>.<lambda>cSs|jS)N)r)r>r
r
rr?�sZ_emit_bytecode_)�
_typesdict�	_generate�sorted�str�
cffi_typesZis_raw_function�AssertionErrorr�append�args�
isinstancer�VoidType�BasePrimitiveType�PointerType�StructOrUnionOrEnum�FunctionPtrTypeZ
is_array_type�length�values�_struct_unions�_enums�
StructOrUnion�EnumType�	enumerate�getattr�	__class__r�CffiOp�tuple)rZ	all_declsr>�tp1�i�methodrr
r
r�collect_type_table�sZ	
	
	
		

zRecompiler.collect_type_tablecCs-t|tj�sCt|t�r?x|D]}|j|�q(WdS||jkr)d|j|<t|tj�r�|j|j��n�t|tj�r�|j	dk	r)||j
jjkr)xi|j
�D].\}}}}|j|j|||��q�Wn*x'|j�D]\}}|j|�qWdS)N)rHrZBaseTypeByIdentityrX�_do_collect_typer@rM�as_raw_functionrR�fldtypesr9�_parser�_included_declarations�
enumfields�_field_typeZ
_get_items)rr>�xZname1rY�_r
r
rr]�s 

#zRecompiler._do_collect_typec
Cs�|jjjj�}x�t|�D]�\}\}}|jdd�\}}yt|d||f�}Wn%tk
r�tj	d|��YnXy||_
|||�Wq"tk
r�}	ztj
|	|��WYdd}	~	Xq"Xq"WdS)Nrrz_generate_cpy_%s_%sz"not implemented in recompile(): %r)r9r`Z
_declarations�itemsrB�splitrU�AttributeErrorr�VerificationError�_current_quals�	ExceptionrZattach_exception_info)
r�	step_name�lstrr>�quals�kindZrealnamer[�er
r
rrA�s
	zRecompiler._generate�global�field�struct_union�enum�typenamecCs�i|_x|jD]}g|j|<qWt�|_|jd�|j�xS|jD]H}|j|}|dkr�|jddd��t|�|j|<qWW|jd}xQ|jj	�D]@\}}|t
|�ks�t�||j|jks�t�q�Wt
|�t
|j�ks%t�|jd}xQ|j
j	�D]@\}}|t
|�ksft�||j|jksBt�qBWt
|�t
|j
�ks�t�dS)N�ctxrrr<cSs|jS)N)r)�entryr
r
rr?�sz0Recompiler.collect_step_tables.<locals>.<lambda>rsrt)�_lsts�	ALL_STEPS�set�_seen_struct_unionsrA�_add_missing_struct_unions�sortrXrPrfrrErrQ)rrlrmr>rZr
r
r�collect_step_tables�s*	



 !
 zRecompiler.collect_step_tablesrcCs|jj|d�dS)N�
)�_f�write)r�whatr
r
r�_prntszRecompiler._prntcCsQ|jr+|dkst�|j|�n"|dk	s=t�|j||�dS)N)r;rE�write_py_source_to_f�write_c_source_to_f)r�f�preambler
r
r�write_source_to_fs
	zRecompiler.write_source_to_fcCsDttjjtjjt�|�d�}|j�}|j�|S)N�r)�open�os�pathr/�dirname�__file__�	readlines�close)r�filename�g�linesr
r
r�_rel_readlines
s*
zRecompiler._rel_readlinescCs:||_|j}|jjdk	r.|d�|jd�}|jd�}|jd�|||d�<|dj|��|jjd�dA}|jjdk	r^|d|jf�|d	|j	|jj�f�|d
�|d|f�|d�|d
|f�|d�|d|f�|d�|jd�}|dj|��t
}nt}|d�|�||�|�|d�|�|d�tdd�|j
j�D��}x`t|j�D]O\}}	d}
||krd||j�}
|d||	j�|
f�q�W|js9|d�|d�|�t�|_|jd�i}x�|jD]y}|j|}
t|
�||<||dkrs|d||f�x|
D]}||j��q�W|d�|�qsW|jjr�|d�x�|jjD]�}y|jdd�\}}Wn.tk
rftjd|j|f��YnX|dkr�tjd ��|d!|f�qW|d"�|d�|�|d#�|d$�x@|jD]5}||dkr�|d%|�q�|d&|�q�Wx5|jD]*}|d'kr|d(|||f�qW|jjrZ|d)�n
|d*�|d+t|j�f�d}|jr�|dO}|d,|�|d�|�|d
�|d-�|d.|f�|d/�|jr|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�dS)BNz#define _CFFI_USE_EMBEDDINGz_cffi_include.hz#include "parse_c_type.h"
zparse_c_type.hrr�.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>/************************************************************/zstatic void *_cffi_types[] = {cSs"g|]\}}||f�qSr
r
)r+r>rZr
r
rr,@s	z2Recompiler.write_c_source_to_f.<locals>.<listcomp>z // z/* %2d */ %s,%sz  0z};�declrz.static const struct _cffi_%s_s _cffi_%ss[] = {z.static const char * const _cffi_includes[] = {r3zQffi 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 */rrz  %d,  /* num_%ss */z  _cffi_includes,z  NULL,  /* no includes */z  %d,  /* num_types */z  %d,  /* flags */ZPyMODINIT_FUNCz"_cffi_pypyinit_%s(const void *p[])�{z%    if (((intptr_t)p[0]) >= 0x0A03) {zQ        _cffi_call_python_org = (void(*)(struct _cffi_externpy_s *, char *))p[1];z    }z    p[0] = (const void *)%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#  endifzPyInit_%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@rfrTrD�_get_c_namerrz�_seen_constantsrAryrxr�_included_ffis�_assigned_sourcerhrri�
_num_externpy)rr�r��prntr�rZZbase_module_name�version�typeindex2typerr(�numsrlrmrw�ffi_to_include�included_module_name�included_sourcer&r
r
rr�s�		




	



"!	







	





	




	


















zRecompiler.write_c_source_to_fcs�t|t�rd|fSt|ttf�r{�fdd�|D�}t|�dkrg|jd�ddj|�fS|j�S)Nzb'%s'csg|]}�j|��qSr
)�_to_py)r+�item)rr
rr,�s	z%Recompiler._to_py.<locals>.<listcomp>rrz(%s)r-)rHrC�listrXrrFr/r)rrd�repr
)rrr��s
zRecompiler._to_pyc
Cs||_|j}|d�|d�t|jjp8f�}x�t|�D]�}|jj|}y|jdd�\}}Wn.tk
r�tj	d|j|f��YnX|dk	r�tj	d��|d||f�qKW|�|d|j
f�|dtf�t|j
�|_
d	d
�|j
D�}|d|jdj|��f�td
d
�|jj�D��}	xY|jD]N}
|j|
}t|�dkr�|
dkr�|d|
|j|�f�q�W|dkr|ddjdd
�t|�D��f�|d�dS)Nz# auto-generated filezimport _cffi_backendr3zQffi object %r includes %r, but the latter has not been prepared with set_source()zMnot implemented yet: ffi.include() of a C-based ffi inside a Python-based ffizfrom %s import ffi as _ffi%dzffi = _cffi_backend.FFI('%s',z    _version = %s,cSsg|]}|j��qSr
)r)r+rr
r
rr,�s	z3Recompiler.write_py_source_to_f.<locals>.<listcomp>z    _types = %s,rcSs"g|]\}}||f�qSr
r
)r+r>rZr
r
rr,�s	rrrz    _%ss = %s,z    _includes = (%s,),z, cSsg|]}d|�qS)z_ffi%dr
)r+rZr
r
rr,�s	�))r�r�rr9r��ranger�rhrrir:r�rXrDr�r/r�r@rfryrx)rr�r�Znum_includesrZr�r�r�Z	types_lstr�rlrmr
r
rr��s@		


	#"
!'zRecompiler.write_py_source_to_fcCs|j|S)N)r@)r�typer
r
r�_gettypenum�szRecompiler._gettypenumcCs�d}t|tj�r�|j�rI|jdkrId}d|j}nSt|tj�rtd|jd�f}n(d|jd�|jjdd�f}d	}n�t|tj�r�|j	||||�dSt|tj
�r|jd
||j|�|f�|jd|�dSt|tj
�r\d|jd�}d
|j|�}d}nt|��|jd||||f�|jd||jd�|f�|jd|�dS)NrZ_BoolZ_cffi_to_c_intz, %sz(%s)_cffi_to_c_doublez(%s)_cffi_to_c_%srrez-1z6  if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)z    %s;z(%s)_cffi_to_c_pointerz, _cffi_type(%d)ZNULLz  %s = %s(%s%s);z'  if (%s == (%s)%s && PyErr_Occurred()))rHrrJ�is_integer_typer�UnknownFloatType�
get_c_name�replacerK�"_convert_funcarg_to_c_ptr_or_arrayrLr�r�rMr)rr>�fromvar�tovar�errcodeZextraarg�	converterZerrvaluer
r
r�_convert_funcarg_to_c�s8	
			z Recompiler._convert_funcarg_to_ccCs#t|tj�r|jd�dS)NzPy_ssize_t datasize)rHrrK�add)rr>�	localvarsr
r
r�_extra_local_variablessz!Recompiler._extra_local_variablescCs�|jd�|jd|j|�||f�|jd�|jd�|jd|�|jd||jd�f�|jd|f�|jd	||j|�|f�|jd|�|jd
�dS)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);rz,    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
rr�s
	

		z-Recompiler._convert_funcarg_to_c_ptr_or_arraycCs�t|tj�r�|j�r/d||jfSt|tj�rLd|fS|jdkrxd|jjdd�|fSd||j|�fSn�t|tjtj	f�r�d||j|�fSt|tj
�r�d||jtj|j��fSt|tj�rM|j
dkr6td	|j�|f��d
||j|�fSt|tj�rvd||j|�fSt|��dS)Nz_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s)zlong doublez_cffi_from_c_%s(%s)rrez/_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)))rHrrJr�rr�r�r�rKrM�	ArrayTyper�rRZfldnames�	TypeErrorr�rSr)rr>�var�contextr
r
r�_convert_expr_from_c.s2 zRecompiler._convert_expr_from_ccCs|j|�dS)N)r])rr>rr
r
r�!_generate_cpy_typedef_collecttypeNsz,Recompiler._generate_cpy_typedef_collecttypecCsdS)Nr
)rr>rr
r
r�_generate_cpy_typedef_declQsz%Recompiler._generate_cpy_typedef_declcCs.|j|}|jdjt||��dS)Nru)r@rxrFr7)rr>rr%r
r
r�_typedef_ctxTs
zRecompiler._typedef_ctxcCs�|j||�t|dd�dkrD|j||jdd�n:t|tj�r~|j|j|jjd|jd|�dS)N�originZunknown_type�
approxname�	named_ptr)r�rU�_struct_ctxrrHrZNamedPointerType�totype)rr>rr
r
r�_generate_cpy_typedef_ctxXs!z$Recompiler._generate_cpy_typedef_ctxcCs7|j|j��|jr3|jr3|j|�dS)N)r]r^�ellipsisr;)rr>rr
r
r�"_generate_cpy_function_collecttypecsz-Recompiler._generate_cpy_function_collecttypecCs||jst�t|tj�s(t�|jrE|j||�dS|j}t|j	�}|dkrrd}n|dkr�d}nd}g}g}d|}xKt
|j	�D]:\}	}
|j|
jd|	|��|jd|	�q�Wd	j
|�}|p	d
}|jr%|jd}nd}d
|||f}
|d|jj|
�f�|d�d	j
|�}d}t|jtj�r�d}|d|||f�|d�|d�|d�|d||f�|d�d|}xAt
|j	�D]0\}	}
|
jd|	|�}|d|�qWt�}x!|j	D]}
|j|
|�qIWx|D]}|d|f�qjWt|jtj�s�d}d|}d|jjd|�}||�nd}d}t|j	�dkrrtt|j	��}x|D]}	|d|	�q
W|�|d|t|�t|�d	j
dd�|D��f�|d�|�xBt
|j	�D]1\}	}
|j|
d|	d|	d �|�q�W|d!�|d"�d#d�tt|j	��D�}d	j
|�}|d$|||f�|d%�|d&�|�|d'�|dkrU|d(�|r~|d)|j|jd*d+��n|d,�|d-�|d�|d.�d/}g}g}d|}x�t
|j	�D]p\}	}
d}t|
tj�rd0}d1}|
jd2||	f|�}|j|�|jd3||	f�q�W|j}t|tj�r�d|}|jd4|�}|jd|�tj}d}d5}d1}|rSd	j
|�}|p�d
}d6|||f}
|d|j|
�f�|d�|r||�d	j
|�}|d$|||f�|rF|d7�|d�n|d8||f�|d9�|�dS):NrZnoargrZarg0rGzargument of %sz x%dzx%dz, �voidrrz%s_cffi_d_%s(%s)z	static %sr�zreturn z  %s%s(%s);r�z#ifndef PYPY_VERSIONzstatic 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))cSsg|]}d|�qS)z&arg%dr
)r+rZr
r
rr,�s	z:Recompiler._generate_cpy_function_decl.<locals>.<listcomp>z    return NULL;zarg%dzreturn NULLz  Py_BEGIN_ALLOW_THREADSz  _cffi_restore_errno();cSsg|]}d|�qS)zx%dr
)r+rZr
r
rr,�s	z  { %s%s(%s); }z  _cffi_save_errno();z  Py_END_ALLOW_THREADSz  (void)self; /* unused */z  (void)noarg; /* unused */z  return %s;�resultzresult typez  Py_INCREF(Py_None);z  return Py_None;z#elseFrTz %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;rErHrrMr��_generate_cpy_constant_declr�rrGrTrFr�r/�abir�rIrzr�r�r�r�rR�insertZ	void_type)rr>rr��numargsZargname�	argumentsZcall_argumentsr�rZr��repr_argumentsr��name_and_argumentsZresult_code�argr�r�Zresult_decl�rng�
differenceZindirectionZ	tp_resultr
r
r�_generate_cpy_function_declhs�				
	





	



!


"









	
		





z&Recompiler._generate_cpy_function_declcCs�|jr'|jr'|j||�dS|j|j�}t|j�}|jr[t}n0|dkrpt}n|dkr�t	}nt
}|jdjt
|d|t||�dd|��dS)Nrrrqz
_cffi_f_%sr
z
_cffi_d_%s)r�r;�_generate_cpy_constant_ctxr@r^rrGZOP_DLOPEN_FUNCZOP_CPYTHON_BLTN_NZOP_CPYTHON_BLTN_OZOP_CPYTHON_BLTN_VrxrFrrW)rr>rr%r�Z	meth_kindr
r
r�_generate_cpy_function_ctx�s 				

z%Recompiler._generate_cpy_function_ctxcCsxt|tj�rt|j}|dkrF|jd�}d||f}|j|d||j�}tj||�}|S)Nz...rz_cffi_array_len(((%s)0)->%s)z%s[0])rHrr�rNr�rcr�)rZ	tp_struct�
field_nameZtp_field�
actual_lengthZptr_struct_name�tp_itemr
r
rrcs	
zRecompiler._field_typecCs|j|�dS)N)r])rr>r
r
r�_struct_collecttype szRecompiler._struct_collecttypecCs�|jdkrdS|j}d|f}|d�|d||f�|d�|d�|d�x	|j�D]�\}}}}	y�|j�s�|dkr�|d|||f�wrxGt|tj�r|jdks�|jd	kr|j}|d
}q�W|d|j	dd
|d|	�|f�Wqrt
jk
rl}
z|dt|
��WYdd}
~
XqrXqrW|d�|d||f�|�dS)Nz_cffi_checkfld_%sZ_CFFI_UNUSED_FNzstatic void %s(%s *p)r�z8  /* only to generate compile-time warnings or errors */z
  (void)p;rz>  (void)((p->%s) | 0);  /* check that '%s.%s' is an integer */z...z[0]z  { %s = &p->%s; (void)tmp; }z*tmpzfield %rrnz
  /* %s */r�z(struct _cffi_align_%s { char x; %s y; };)
r_r�rbr�rHrr�rNr�r�rrirC)rr>�cnamer�r�Z
checkfuncname�fnameZftyper�fqualrpr
r
r�_struct_decl#s6	




	+
zRecompiler._struct_declNcCs}|j|}d}g}t|tj�r8|jd�|jdkrZ|jd�d}||jjjkr�|dks�||jjjkr�|jdkr�n%|j	s�|j
�r�n
|jd�|jr�|jd�n|jd�d}dj|�pd	}g}|dkrt
|j��}	x`|	D]X\}
}}}
|j||
|�}|j|d
|j|
f�t}|dkr�t}d|}nd|dks�t|tj�r�|jdkr�d
}n.d|dkr�|jd�n|j|
f}|dks|dkr!d
}n;|dk	rCd|j|
f}nd|jd�|
f}|jt|
|||t||j|���q3Wt|jd�}|jdj|�|dkr�d}d}d}q7|dk	r�d|jf}d}nd|f}d|f}d}nd
}d}d}|}|jdjt|j|||||||��|jj|�dS) NZ
_CFFI_F_UNIONZ_CFFI_F_OPAQUEZopaqueZ_CFFI_F_CHECK_FIELDSZ_CFFI_F_PACKEDZ_CFFI_F_EXTERNALZexternal�|�0z
field '%s.%s'rz
%d /* bits */z
(size_t)-1zsizeof(((%s)0)->%s)rz"((char *)&((%s)0)->%s) - (char *)0zoffsetof(%s, %s)rrrz
(size_t)-2r3Zunnamedzsizeof(*(%s)0)z-1 /* unknown alignment */z
sizeof(%s)z"offsetof(struct _cffi_align_%s, y)rrs���r�r�)r@rHrZ	UnionTyperFr_r9r`ra�partialZhas_anonymous_struct_fieldsZpackedr/r�rbrc�_check_not_opaquerr r!r�rNr�rrWrrx�extendr$r{r�)rr>r�r�r�r%Zreason_for_not_expandingr&r*rbZfldnameZfldtyperr�rr
�offsetr)Zalignr(r
r
rr�Ds�



	
	
	
			

	

zRecompiler._struct_ctxcCsWxt|tj�r!|j}qWt|tj�rS|jdkrStd|��dS)Nz0%s is of an opaque type (not declared in cdef()))rHrr�r�rRr_r�)rr>�locationr
r
rr��s

!zRecompiler._check_not_opaquecCst|jj��}|jddd��x�|D]�\}}||jkr2|jritd|f��|jjd�r�|jdd�j	�r�|jdd�}nJ|jdkr�|j
dkr�d}|j|d�ntd	|f��|j|d|�q2WdS)
Nr<cSs|dS)Nrr
)Ztp_orderr
r
rr?�sz7Recompiler._add_missing_struct_unions.<locals>.<lambda>zDinternal inconsistency: %r is partial but was not seen at this point�$rZ_IO_FILEZFILEzinternal inconsistency: %r)
r�rPrfr}r{r�rr�
startswith�isdigitZ	forcenamer�r�)rrmr>�orderr�r
r
rr|�s	
+
z%Recompiler._add_missing_struct_unionscCs|j|�dS)N)r�)rr>rr
r
r� _generate_cpy_struct_collecttype�sz+Recompiler._generate_cpy_struct_collecttypecCsC|jd�}d|kr1||jdd�fS|d|fSdS)Nrrre)r�r�)rr>r�r
r
r�
_struct_names�szRecompiler._struct_namescCs|j||j|��dS)N)r�r�)rr>rr
r
r�_generate_cpy_struct_decl�sz$Recompiler._generate_cpy_struct_declcCs|j||j|��dS)N)r�r�)rr>rr
r
r�_generate_cpy_struct_ctx�sz#Recompiler._generate_cpy_struct_ctxcCs6t|tj�r%|j||�n
|j|�dS)N)rHrrS�_generate_cpy_enum_collecttyper�)rr>rr
r
r�#_generate_cpy_anonymous_collecttype�sz.Recompiler._generate_cpy_anonymous_collecttypecCs=t|tj�r"|j|�n|j||d|�dS)N�typedef_)rHrrS�_generate_cpy_enum_declr�)rr>rr
r
r�_generate_cpy_anonymous_decl�sz'Recompiler._generate_cpy_anonymous_declcCs@t|tj�r%|j||�n|j||d|�dS)Nr�)rHrrS�	_enum_ctxr�)rr>rr
r
r�_generate_cpy_anonymous_ctx�sz&Recompiler._generate_cpy_anonymous_ctx�constcCsS||f|jkr.tjd||f��|jj||f�|j}d||f}|r�|d|�|d�|d|f�|d||f�|dk	r�|dkr�d|f}|d	|f�|d
�|d�|d�nQ|dks	t�|d
|�|d�|d|jd�|f�|d�|�dS)Nz duplicate declaration of %s '%s'z_cffi_%s_%sz$static int %s(unsigned long long *o)r�z  int n = (%s) <= 0;zI  *o = (unsigned long long)((%s) | 0);  /* check that %s is an integer */rz%dUz"  if (!_cffi_check_int(*o, n, %s))z    n |= 2;z  return n;r�zstatic void %s(char *o)z  *(%s)o = %s;r)r�rrir�r�rEr�)r�is_intrr>�categoryrr��funcnamer
r
r�_generate_cpy_const�s2	






zRecompiler._generate_cpy_constcCs-|j�}|s|jr)|j|�dS)N)r�r;r])rr>rrr
r
r�"_generate_cpy_constant_collecttype�sz-Recompiler._generate_cpy_constant_collecttypecCs#|j�}|j|||�dS)N)r�r)rr>rrr
r
rr�sz&Recompiler._generate_cpy_constant_declcCs�|jr(|j�r(ttd�}n4|jr:t}nt}|j|}t||�}|jdjt	|d||��dS)Nrrqz_cffi_const_%sr�)
r;r�rW�OP_CONSTANT_INTZOP_DLOPEN_CONSTZOP_CONSTANTr@rxrFr)rr>rr	Z
const_kindr%r
r
rr�s		

z%Recompiler._generate_cpy_constant_ctxcCs|j|�dS)N)r])rr>rr
r
rr�sz)Recompiler._generate_cpy_enum_collecttypecCs(x!|jD]}|jd|�q
WdS)NT)�enumeratorsr)rr>r�
enumeratorr
r
rr�sz"Recompiler._generate_cpy_enum_declcCsE|j|}ttd�}|jr/|j�xMt|j|j�D]6\}}|jdj	t
|d||d|��qEW|dk	r�d|kr�|jr�d|}d|}nN|j|jg�}	|jj
|	�}tt|jj|	d��dk�}d	j|j�}
|jd
j	t|j||||
��dS)
Nrrqz_cffi_const_%srr�z
sizeof(%s)z
((%s)-1) <= 0rr-rtr�r�)r@rW�OP_ENUMr;Zcheck_not_partial�ziprZ
enumvaluesrxrFrZbuild_baseinttyper9�sizeof�int�castr/r0r)rr>r�r%r	rZ	enumvaluer
r1Zbasetpr2r
r
rr�s"
	
"
"

'
zRecompiler._enum_ctxcCs|j||j��dS)N)r�r�)rr>rr
r
r�_generate_cpy_enum_ctx1sz!Recompiler._generate_cpy_enum_ctxcCsdS)Nr
)rr>rr
r
r�_generate_cpy_macro_collecttype7sz*Recompiler._generate_cpy_macro_collecttypecCs5|dkrd}n|}|jd|d|�dS)Nz...Tr)r)rr>rrr
r
r�_generate_cpy_macro_decl:s	z#Recompiler._generate_cpy_macro_declcCsw|dkr4|jr+tjd|f��d}n|}ttd�}|jdjt|d||d|��dS)Nz...zGcannot use the syntax '...' in '#define %s ...' when using the ABI moderrqz_cffi_const_%srr�)r;rrirWrrxrFr)rr>rrr	r
r
r�_generate_cpy_macro_ctxAs	
	
z"Recompiler._generate_cpy_macro_ctxcCsct|tj�r_|j}|dkr4d|f}|j|jd|�}tj||�}|S)Nz...z_cffi_array_len(%s)z%s[0])rHrr�rN�_global_typer�)rr>Zglobal_namer�r�r
r
rrRs	
zRecompiler._global_typecCs|j|j||��dS)N)r]r)rr>rr
r
r�"_generate_cpy_variable_collecttype[sz-Recompiler._generate_cpy_variable_collecttypecCs�|j}|j||�}t|tj�rN|jdkrN|j}d}nd}d|f}|d|j|d|j��|d�|d||f�|d�|�dS)	Nr�&z*_cffi_var_%s(void)zstatic rnr�z  return %s(%s);r�)	r�rrHrr�rNr�r�rj)rr>rr�Z	ampersandr�r
r
r�_generate_cpy_variable_decl^s	!			
 

z&Recompiler._generate_cpy_variable_declcCsh|j||�}|j|}|jr1t}nt}|jdjt|d|t||���dS)Nrqz_cffi_var_%s)	rr@r;Z
OP_GLOBAL_VARZOP_GLOBAL_VAR_FrxrFrrW)rr>rr%rr
r
r�_generate_cpy_variable_ctxus
		
z%Recompiler._generate_cpy_variable_ctxcCs)t|tj�st�|j|�dS)N)rHrrMrEr])rr>rr
r
r�'_generate_cpy_extern_python_collecttype�sz2Recompiler._generate_cpy_extern_python_collecttypecCs�|j}t|jtj�r'd}n&d|}d|jjd|�f}|d|�|d||f�|�g}d|}x@t|j�D]/\}}	|	jd||�}
|j|
�q�Wd	j	|�}|p�d
}d||f}|j
dkr
d
|}dd�}
tt|j�dd�}|
|j�rSt|d�}t|jtj
�r�d|jjd�||jjd�|f}|d||jj|�f�|d�|d|�|d�x�t|j�D]q\}}	d|}
t|	tj
�s|
|	�r5d|
}
tj|	�}	|d|	jd�|d|
f�q�W|d|�t|jtj�s�|d|jjd�f�|d�|�|jd7_dS)Nr�zresult of %sz(int)sizeof(%s)rz3static struct _cffi_externpy_s _cffi_externpy__%s =z  { "%s", %s };zargument of %sz a%dz, r�z%s(%s)�	__stdcallz_cffi_stdcall cSst|tj�o|jdkS)Nzlong double)rHr�
PrimitiveTyper)r>r
r
r�may_need_128_bits�sz9Recompiler._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;za%drz  *(%s)(p + %d) = %s;rz,  _cffi_call_python(&_cffi_externpy__%s, p);z  return *(%s)p;r�r)r�rHr�rrIr�rTrGrFr/r��maxrrRrKr�)rr>rZ
tag_and_spacer�Zsize_of_resultr�r�rZr�r�r�r�rZ	size_of_ar
r
r�_extern_python_decl�sX		


 



(
zRecompiler._extern_python_declcCs|j||d�dS)Nzstatic )r)rr>rr
r
r� _generate_cpy_extern_python_decl�sz+Recompiler._generate_cpy_extern_python_declcCs|j||d�dS)NzCFFI_DLLEXPORT )r)rr>rr
r
r�#_generate_cpy_dllexport_python_decl�sz.Recompiler._generate_cpy_dllexport_python_declcCs|j||d�dS)Nr)r)rr>rr
r
r�'_generate_cpy_extern_python_plus_c_decl�sz2Recompiler._generate_cpy_extern_python_plus_c_declcCst|jrtjd��|jr-td��|j|}tt|�}|jdj	t
|d|||��dS)Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"rqz&_cffi_externpy__%s)r;rrir�rr@rWZOP_EXTERN_PYTHONrxrFr)rr>rr%r	r
r
r�_generate_cpy_extern_python_ctx�s			

z*Recompiler._generate_cpy_extern_python_ctxcsodd��g}xM|jd�p*dgD]3}|jddj�fdd�|D���q+Wdj|�S)	NcSsR|dkrd|Sd|ko+dknr4|S|dkrDdSdt|�S)Nz\"?�\r�rz\nz\%03o)�ord)�cr
r
r�
_char_repr�sz.Recompiler._string_literal.<locals>._char_reprTrz"%s"csg|]}�|��qSr
r
)r+r$)r%r
rr,�s	z.Recompiler._string_literal.<locals>.<listcomp>z \
)�
splitlinesrFr/)r�sr��liner
)r%rr��s
1zRecompiler._string_literalcCsttt�|j|<dS)N)rW�OP_PRIMITIVEZ	PRIM_VOIDrD)rr>r�r
r
r�_emit_bytecode_VoidType�sz"Recompiler._emit_bytecode_VoidTypecCs't|j}tt|�|j|<dS)N)ZPRIMITIVE_TO_INDEXrrWr)rD)rr>r�r6r
r
r�_emit_bytecode_PrimitiveType�s
z'Recompiler._emit_bytecode_PrimitiveTypecCs6d|j|j|jf}tt|�|j|<dS)Nzl_cffi_prim_int(sizeof(%s), (
           ((%s)-1) | 0 /* check that %s is an integer type */
         ) <= 0))rrWr)rD)rr>r�r'r
r
r�!_emit_bytecode_UnknownIntegerType�sz,Recompiler._emit_bytecode_UnknownIntegerTypecCs0d|j|jf}tt|�|j|<dS)Nzd_cffi_prim_float(sizeof(%s) *
           (((%s)1) / 2) * 2 /* integer => 0, float => 1 */
         ))rrWr)rD)rr>r�r'r
r
r�_emit_bytecode_UnknownFloatType�sz*Recompiler._emit_bytecode_UnknownFloatTypecCstt|j|j�|j|<|d7}xo|jD]d}|j|}||kr�t|tj�rx|j	||�ntt
|�|j|<|d7}q4Wt|j�}|j
dk	r�|j
dkr�|dO}ntd|j
f��tt|�|j|<dS)Nrrr3zabi=%r)rWZOP_FUNCTIONr@r�rDrGrHrrr+r rr�r�rZOP_FUNCTION_END)rr>r�rYZ	realindexr&r
r
r�_emit_bytecode_RawFunctionType�s 


z)Recompiler._emit_bytecode_RawFunctionTypecCs$tt|j|j�|j|<dS)N)rW�
OP_POINTERr@r�rD)rr>r�r
r
r�_emit_bytecode_PointerTypesz%Recompiler._emit_bytecode_PointerTypecCs-|j�}tt|j|�|j|<dS)N)r^rWr/r@rD)rr>r��rawr
r
r�_emit_bytecode_FunctionPtrTypesz)Recompiler._emit_bytecode_FunctionPtrTypecCs�|j|j}|jdkr8tt|�|j|<n�|jdkrrtjdt|�j	dd�f��nV|j|ddks�t
�tt|�|j|<tdt|j��|j|d<dS)Nz...zitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/rr=)r@r�rNrWZ
OP_OPEN_ARRAYrDrrirCr�rEZOP_ARRAY)rr>r�Z
item_indexr
r
r�_emit_bytecode_ArrayTypes"z#Recompiler._emit_bytecode_ArrayTypecCs'|j|}tt|�|j|<dS)N)rPrWZOP_STRUCT_UNIONrD)rr>r�Zstruct_indexr
r
r�_emit_bytecode_StructType#s
z$Recompiler._emit_bytecode_StructTypecCs'|j|}tt|�|j|<dS)N)rQrWrrD)rr>r�Z
enum_indexr
r
r�_emit_bytecode_EnumType(s
z"Recompiler._emit_bytecode_EnumType)Srrrr�rr\r]rAryr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rcr�r�r�r�r|r�Z_generate_cpy_union_collecttyper�r�Z_generate_cpy_union_declr�Z_generate_cpy_union_ctxr�r�r�rrr�r�r�r�r�r
rrrrrrrrZ*_generate_cpy_dllexport_python_collecttypeZ._generate_cpy_extern_python_plus_c_collecttyperrrrr Z"_generate_cpy_dllexport_python_ctxZ&_generate_cpy_extern_python_plus_c_ctxr�r*r+r,r-r.r0Z_emit_bytecode_ConstPointerTypeZ_emit_bytecode_NamedPointerTyper2r3r4Z_emit_bytecode_UnionTyper5r
r
r
rr8ys�:�
3( �!P		

5
r8�cs"eZdZ�fdd�Z�S)�NativeIOcs8t|t�r|jd�}tt|�j|�dS)N�ascii)rH�unicode�encode�superr7r�)rr')rVr
rr�1szNativeIO.write)rrrr�r
r
)rVrr70sr7c
Cs`|rtd|f�t||d|dk�}|j�|j�t�}|j||�|j�}yVt|d��,}|jt	|�d�|kr�t
�WdQRX|r�td�dSWn�t
k
r[d|tj�f}	t|	d��}|j
|�WdQRXytj|	|�Wn/tk
rRtj|�tj|	|�YnXd	SYnXdS)
Nz
generating %sr;r�rz(already up-to-date)Fz%s.~%d�wT)�printr8r\r~r7r��getvaluer��readr�IOErrorr��getpidr��rename�OSError�unlink)
r9r:r�Ztarget_file�verboseZ
recompilerr��output�f1Ztmp_filer
r
r�_make_c_or_py_source6s4

	




rHFcCs(|dk	st�t|||||�S)N)rErH)r9r:r�Z
target_c_filerEr
r
r�
make_c_sourceRsrIcCst||d||�S)N)rH)r9r:Ztarget_py_filerEr
r
r�make_py_sourceWsrJcCsu|jd�}y*tjtjj||dd���Wntk
rMYnX|d|7<tjj||�|fS)Nr�rr�r�)rgr��makedirsr�r/rC)Z	outputdir�modname�	extension�partsr
r
r�_modname_to_file[s*
rOcCs9t||�}|j|||f�t|||�|S)N)rUrF�setattr)�	patchlist�clsrZnew_meth�oldr
r
r�_patch_methisrTcCs4x-t|�D]\}}}t|||�q
WdS)N)�reversedrP)rQrRrZold_methr
r
r�_unpatch_methsosrVcs�tjdkr8ddlm}t||ddd��tjdkr~ddlm}�fd	d
�}t||d|��dS)N�win32r)�MSVCCompilerZ_remove_visual_c_refcSs|S)Nr
)rZ
manifest_filer
r
rr?xsz&_patch_for_embedding.<locals>.<lambda>�darwin)�	CCompilercsPd|jkr@t|j�|_|jjd�}d|j|<�|||�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�platformZdistutils.msvc9compilerrXrT�distutils.ccompilerrZ)rQrXrZr^r
)r]r�_patch_for_embeddingss
	rccs�ddlm}�jd�rq�dd
��tjdkrK�d7�n&tjdkrg�d7�n
�d	7�t||d
�fdd��dS)Nr)�	build_extz.*r3rWz.dllrYz.dylibz.soZget_ext_filenamecs�S)Nr
)rZext_name)�targetr
rr?�sz#_patch_for_target.<locals>.<lambda>r�)Zdistutils.command.build_extrd�endswithr`rarT)rQrerdr
)rer�_patch_for_target�s


rgr�Tz.ccKs�t|t�s|jd�}|jr4|j|�|dk	r�|jdk	}|rb|j|�|dkr�t|||�\}}
|r�|g|
}
tj	j
|
�}n|}|	dkr�|r�d|}	nd}	tj|||�}t
||||d|�}|r�g}tj�}zR|r4t|�|	dkrMt||	�tj|�tjd|||
�}Wdtj|�t|�X|S||fSnP|dkr�t||d�\}}t|||d|�}|r�|Sd|fSdS)Nr8z%s.*rrEr�z.py)rHrCr:Z_windows_unicodeZ_apply_windows_unicoder�Z_apply_embedding_fixrOr�r�r/rZ
get_extensionrI�getcwdrcrg�chdir�compilerVrJ)r9r:r��tmpdirZcall_c_compilerZc_fileZsource_extensionZextradirZcompiler_verbosere�debugr\Z	embeddingrNZ
ext_c_file�ext�updatedrQ�cwd�outputfilenamerer
r
r�	recompile�sX	

	

	




	rqcOsJddlm}ddl}|tjks>td|f��|jdt|��t|||||�}|j	||�}xct
|j�D]R}	|	jd�s�t
|j|	�}
|
t
||	t��k	r�t||	|
�q�Wdd�}||_xGt
|�D]9}	|	jd�rt|j|	�rt||	t�qW|jS)Nr)�udirzmodule name conflict: %rrkrec_s
t�dS)N)r)rGr\r
r
r�typeof_disabled�sz _verify.<locals>.typeof_disabled)Ztesting.udirrr�impr`�modulesrE�
setdefaultrCrq�load_dynamic�dirr9r�rU�objectrPZ_typeof�hasattr�NotImplemented�lib)r9r:r�rGr\rrrtrp�moduler�attrrsr
r
r�_verify�s$
	#r)r�r`�iorrrZcffi_opcoder�r�rrr$r0r7r8�version_info�StringIOr7�BytesIOrHrIrJrOrTrVrcrgrqrr
r
r
r�<module>s:$
�����	6