o
    VhW                     @   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ejd	kp2ejd
k p2ejdk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rfejZn	G dd dejZdd Zdd Zd3d d!Zd3d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Z 	/			/d4d1d2Z!dS )5    N   )ffiplatformmodel)VerificationError)*i&  i'  i(  win32)   r   )r      c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )

GlobalExprr   c                 C   "   || _ || _|| _|| _|| _d S N)nameaddresstype_opsizecheck_value)selfr   r   r   r   r    r   c/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/cffi/recompiler.py__init__   
   
zGlobalExpr.__init__c                 C   s   d| j | j| j | jf S )Nz'  { "%s", (void *)%s, %s, (void *)%s },)r   r   r   	as_c_exprr   r   r   r   r   r      s   zGlobalExpr.as_c_exprc                 C   s   d| j  | j| jf S )Nz
b'%s%s',%d)r   as_python_bytesr   r   r   r   r   r   as_python_expr   s   zGlobalExpr.as_python_exprN)r   r   __name__
__module____qualname__r   r   r   r   r   r   r   r
      s    
r
   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	FieldExprc                 C   r   r   )r   field_offset
field_sizefbitsizefield_type_op)r   r   r    r!   r"   r#   r   r   r   r      r   zFieldExpr.__init__c                 C   s>   dt | j }d| j| jf d|| jf  d|| j f  S )N z  { "%s", %s,
z     %s   %s,
z     %s   %s },)lenr   r    r!   r#   r   )r   spacesr   r   r   r   &   s   zFieldExpr.as_c_exprc                 C   s   t r   )NotImplementedErrorr   r   r   r   r   ,      zFieldExpr.as_python_exprc                 C   sD   | j jtkr	d}n| j jtkrt| j}ntd| j  || jf S )N z	b'%s%s%s')	r#   opOP_NOOPOP_BITFIELDformat_four_bytesr"   r'   r   r   )r   	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                   @   $   e Zd Zdd Zdd Zdd ZdS )StructUnionExprc	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S r   )r   
type_indexflagsr   	alignmentcommentfirst_field_indexc_fields)	r   r   r2   r3   r   r4   r5   r6   r7   r   r   r   r   ;   s   
zStructUnionExpr.__init__c                 C   sV   d| j | j| jf d| j| jf  d| jt| jf  | jr&d| j  d S d d S )Nz  { "%s", %d, %s,z
    %s, %s, z%d, %d z	/* %s */ r)   z},)	r   r2   r3   r   r4   r6   r%   r7   r5   r   r   r   r   r   F   s   zStructUnionExpr.as_c_exprc                 C   s>   t | jt}dd | jD }dt| jt|| jd|f S )Nc                 S      g | ]}|  qS r   )r/   ).0c_fieldr   r   r   
<listcomp>O   s    z2StructUnionExpr.as_python_expr.<locals>.<listcomp>z(b'%s%s%s',%s),)evalr3   G_FLAGSr7   r-   r2   r   join)r   r3   fields_exprr   r   r   r   M   s   zStructUnionExpr.as_python_exprNr   r   r   r   r   r1   :   s    r1   c                   @   r0   )EnumExprc                 C   r   r   r   r2   r   signedallenums)r   r   r2   r   rC   rD   r   r   r   r   X   r   zEnumExpr.__init__c                 C   s   d| j | j| j| j| jf S )Nz1  { "%s", %d, _cffi_prim_int(%s, %s),
    "%s" },rB   r   r   r   r   r   _   s
   zEnumExpr.as_c_exprc              	   C   s@   t tttttttd| j| j	f }dt
| jt
|| j| jf S )N))r   r   )r   r   )   r   )rE   r   )   r   )rF   r   )   r   )rG   r   zb'%s%s%s\x00%s')
PRIM_UINT8	PRIM_INT8PRIM_UINT16
PRIM_INT16PRIM_UINT32
PRIM_INT32PRIM_UINT64
PRIM_INT64r   rC   r-   r2   r   rD   )r   
prim_indexr   r   r   r   d   s   

zEnumExpr.as_python_exprNr   r   r   r   r   rA   W   s    rA   c                   @   r0   )TypenameExprc                 C   s   || _ || _d S r   r   r2   )r   r   r2   r   r   r   r   p   s   
zTypenameExpr.__init__c                 C   s   d| j | jf S )Nz  { "%s", %d },rR   r   r   r   r   r   t   s   zTypenameExpr.as_c_exprc                 C   s   dt | j| jf S )Nzb'%s%s')r-   r2   r   r   r   r   r   r   w      zTypenameExpr.as_python_exprNr   r   r   r   r   rQ   o   s    rQ   c                   @   s  e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	g d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 d=d> Z!dd@dAZ"dBdC Z#dDdE Z$dFdG Z%e%Z&dHdI Z'dJdK Z(e(Z)dLdM Z*e*Z+dNdO Z,dPdQ Z-dRdS Z.	T	?ddUdVZ/dWdX Z0dYdZ Z1d[d\ Z2d]d^ Z3dd_d`Z4dadb Z5dcdd Z6dedf Z7dgdh Z8didj Z9dkdl Z:dmdn Z;dodp Z<dqdr Z=dsdt Z>e> Z?Z@dudv ZAdwdx ZBdydz ZCd{d| ZDd}d~ ZEeE ZFZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNeNZOeNZPdd ZQdd ZRdd ZSeSZTdd ZUd?S )
Recompilerr   Fc                 C   s   || _ || _|| _t| _d S r   )ffimodule_nametarget_is_pythonVERSION_BASE_version)r   rU   rV   rW   r   r   r   r      s   
zRecompiler.__init__c                 C   s   t | j|| _d S r   )maxrY   )r   verr   r   r   needs_version      zRecompiler.needs_versionc              	   C   s  i | _ | d t| j td}g | _|D ]N}|jrb| j | d u s"J t| j| j |< | j| |jD ](}t	|t
jt
jt
jt
jt
jfsFJ | j | d u rUt| j| j |< | j| q3| jd q|D ](}|js| j | d u rt| j| j |< | j| |jr|jd ur| jd qed | j  vsJ i | _i | _|D ]}t	|t
jrd | j|< qt	|t
jrd | j|< qtt| jdd dD ]	\}}|| j|< qtt| jdd dD ]	\}}|| j|< q|D ]}t| d|jj }||| j |  q| jD ]
}t	|tsJ qt| j| _d S )	NcollecttypekeyENDLENc                 S      | j S r   r   tpr   r   r   <lambda>       z/Recompiler.collect_type_table.<locals>.<lambda>c                 S   rc   r   rd   re   r   r   r   rg      rh   _emit_bytecode_)
_typesdict	_generatesortedstr
cffi_typesis_raw_functionr%   appendargs
isinstancer   VoidTypeBasePrimitiveTypePointerTypeStructOrUnionOrEnumFunctionPtrTypeis_array_typelengthvalues_struct_unions_enumsStructOrUnionEnumType	enumerategetattr	__class__r   CffiOptuple)r   	all_declsrf   tp1imethodr*   r   r   r   collect_type_table   sf   




zRecompiler.collect_type_tablec                 C   s   | j  }||S r   )rW   
enumfields)r   rf   expand_anonymous_struct_unionr   r   r   _enum_fields   s   
zRecompiler._enum_fieldsc                 C   s   t |tjst |tr|D ]}| | qd S || jvrld | j|< t |tjr0| |  d S t |tjr^|j	d urX|| j
jjvrZ| |D ]\}}}}| | ||| qGd S d S d S | D ]\}}| | qbd S d S r   )rr   r   BaseTypeByIdentityr   _do_collect_typerj   rw   as_raw_functionr}   fldtypesrU   _parser_included_declarationsr   _field_type
_get_items)r   rf   xname1r   _r   r   r   r      s*   




zRecompiler._do_collect_typec           
      C   s   | j jj }t|D ]D\}\}}|dd\}}zt| d||f }W n ty1   td| w z
|| _	||| W q t
yO }	 zt|	|  d }	~	ww d S )Nr$   r   z_generate_cpy_%s_%sz"not implemented in recompile(): %r)rU   r   _declarationsitemsrl   splitr   AttributeErrorr   _current_quals	Exceptionr   attach_exception_info)
r   	step_namelstr   rf   qualskindrealnamer   er   r   r   rk      s*   zRecompiler._generate)globalfieldstruct_unionenumtypenamec                 C   s&  i | _ | jD ]}g | j |< qt | _| d |   | jD ]}| j | }|dkr1|jdd d t|| j |< q| j d }| j	 D ]\}}|t
|k sOJ || j|jksYJ qCt
|t
| jkseJ | j d }| j	 D ]\}}|t
|k s{J || j|jksJ qot
|t
| jksJ d S )Nctxr   c                 S   rc   r   rd   )entryr   r   r   rg     rh   z0Recompiler.collect_step_tables.<locals>.<lambda>r_   r   r   )_lsts	ALL_STEPSset_seen_struct_unionsrk   _add_missing_struct_unionssortr   r{   r   r%   r   r|   )r   r   r   rf   r   r   r   r   collect_step_tables   s*   





zRecompiler.collect_step_tablesr)   c                 C   s   | j |d  d S )N
)_fwrite)r   whatr   r   r   _prnt  rS   zRecompiler._prntc                 C   s<   | j r|d u s	J | | d S |d usJ | || d S r   )rW   write_py_source_to_fwrite_c_source_to_f)r   fpreambler   r   r   write_source_to_f  s
   zRecompiler.write_source_to_fc                 C   s0   t tjtjt|d}| }|  |S )Nr)openospathr?   dirname__file__	readlinesclose)r   filenameglinesr   r   r   _rel_readlines!  s   zRecompiler._rel_readlinesc              	   C   sv  || _ | j}| jjd ur|d ts|d | d}|d}| d|||d < |d| | j	dd	 }| jjd ur|d
| jf  |d | 
| jj |d |d |d|f  |d |d|f  |d |d|f  |d | d}|d}| d|||d < |d| | t |d |  || |  |d |  |d tdd | j D }t| jD ]\}}d}	||v rd||   }	|d|| |	f  q| js|d |d |  t | _| d i }
| jD ]0}| j| }t||
|< |
| d kr0|d!||f  |D ]	}||  q|d |  q| jjr{|d" | jjD ]0}z|jd d# \}}W n ty]   td$| j|f w |d u rgtd%|d&|f  q?|d' |d |  |d( |d) | jD ]}|
| d kr|d*|  q|d+|  q| jD ]}|d,kr|d-|
| |f  q| jjr|d. n|d/ |d0t| jf  d }| jd ks| jjd ur|dO }|d1|  |d |  |d2 |d3 |d |  |d |d4 |d5|f  |d6 |d@ r |d7 |d8 |d9 |d:| j  |d; |d< |d= |d |d> |d? |d@ |dA |dB|f  |dC |dD|f  |dE |dE |d |d4 |dF|f  |d6 |dG| j| jf  |d> |d |d4 |dH|f  |d6 |dI| j| jf  |d> |d |  |d2 |dJ |d d | _d S )KNz#define _CFFI_USE_EMBEDDINGz#define _CFFI_NO_LIMITED_APIz_cffi_include.hz#include "parse_c_type.h"
zparse_c_type.hr   r)   .z#define _CFFI_MODULE_NAME  "%s"z1static const char _CFFI_PYTHON_STARTUP_CODE[] = {z0 };z#ifdef PYPY_VERSIONz5# define _CFFI_PYTHON_STARTUP_FUNC  _cffi_pypyinit_%sz#elif PY_MAJOR_VERSION >= 3z-# define _CFFI_PYTHON_STARTUP_FUNC  PyInit_%s#elsez*# define _CFFI_PYTHON_STARTUP_FUNC  init%s#endifz_embedding.hz#include "_cffi_errors.h"
z_cffi_errors.hz>/************************************************************/zstatic void *_cffi_types[] = {c                 S      g | ]\}}||fqS r   r   r9   rf   r   r   r   r   r;   W      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[] = {rE   Qffi object %r includes %r, but the latter has not been prepared with set_source()zMnot implemented yet: ffi.include() of a Python-based ffi inside a C-based ffiz  "%s",z  NULLz?static const struct _cffi_type_context_s _cffi_type_context = {z  _cffi_types,z  _cffi_%ss,z  NULL,  /* no %ss */r   z  %d,  /* num_%ss */z  _cffi_includes,z  NULL,  /* no includes */z  %d,  /* num_types */z  %d,  /* flags */z#ifdef __GNUC__z?#  pragma GCC visibility push(default)  /* for -fvisibility= */PyMODINIT_FUNCz"_cffi_pypyinit_%s(const void *p[]){z%    if (((intptr_t)p[0]) >= 0x0A03) {zQ        _cffi_call_python_org = (void(*)(struct _cffi_externpy_s *, char *))p[1];z    }z    p[0] = (const void *)0x%x;z    p[1] = &_cffi_type_context;z#if PY_MAJOR_VERSION >= 3    return NULL;}z#  ifdef _MSC_VERz     PyMODINIT_FUNCz#  if PY_MAJOR_VERSION >= 3z%     PyInit_%s(void) { return NULL; }z#  elsez     init%s(void) { }z#  endifzPyInit_%s(void)z5  return _cffi_init("%s", 0x%x, &_cffi_type_context);zinit%s(void)z.  _cffi_init("%s", 0x%x, &_cffi_type_context);z#  pragma GCC visibility pop) r   r   rU   
_embeddingUSE_LIMITED_APIr   indexr?   rV   r   _print_string_literal_in_arrayr\   VERSION_EMBEDDEDdictrj   r   r   rn   _get_c_namer   r   _seen_constantsrk   r   r   r%   _included_ffis_assigned_sourcer   r   _num_externpyrY   )r   r   r   prntr   r   base_module_nametypeindex2typer*   r5   numsr   r   r   ffi_to_includeincluded_module_nameincluded_sourcer3   r   r   r   r   '  s8  

















zRecompiler.write_c_source_to_fc                    sb   t |tr
d|f S t |ttfr- fdd|D }t|dkr%|d dd|f S | S )Nzb'%s'c                    s   g | ]}  |qS r   )_to_py)r9   itemr   r   r   r;     s    z%Recompiler._to_py.<locals>.<listcomp>r   r)   z(%s)r<   )rr   rm   listr   r%   rp   r?   r   )r   r   repr   r   r   r     s   


zRecompiler._to_pyc              	   C   s  || _ | j}|d |d t| jjpd}t|D ]4}| jj| }z|jd d \}}W n ty=   td| j|f w |d urFtd|d||f  q|  |d| j	f  |d	| j
f  d | _
t| j| _d
d | jD }|d| d|f  tdd | j D }	| jD ]}
| j|
 }t|dkr|
dkr|d|
| |f  q|dkr|dddd t|D f  |d d S )Nz# auto-generated filezimport _cffi_backendr   rE   r   zMnot implemented yet: ffi.include() of a C-based ffi inside a Python-based ffizfrom %s import ffi as _ffi%dzffi = _cffi_backend.FFI('%s',z    _version = 0x%x,c                 S   r8   r   )r   )r9   r*   r   r   r   r;         z3Recompiler.write_py_source_to_f.<locals>.<listcomp>z    _types = %s,r)   c                 S   r   r   r   r   r   r   r   r;      r   r   r   z    _%ss = %s,z    _includes = (%s,),, c                 S      g | ]}d | qS )z_ffi%dr   r9   r   r   r   r   r;     r   ))r   r   r%   rU   r   ranger   r   r   rV   rY   r   rn   r   r?   r   rj   r   r   r   )r   r   r   num_includesr   r   r   r   	types_lstr   r   r   r   r   r   r     sR   


zRecompiler.write_py_source_to_fc                 C   s
   | j | S r   )rj   )r   typer   r   r   _gettypenum     
zRecompiler._gettypenumc           	      C   sl  d}t |tjrH| sH| r|jdkrd}d|j }n(t |tjr,d|df }n|d}d||jddf }|d	v rE| 	t
 d
}nMt |tjrX| |||| d S t |tjsdt |tjrz| d|| ||f  | d|  d S t |tjrd|d }d| | }d}nt|| d||||f  | d||d|f  | d|  d S )Nr)   _Bool_cffi_to_c_intz, %sz(%s)_cffi_to_c_doublez(%s)_cffi_to_c_%sr$   r   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)NULLz  %s = %s(%s%s);z'  if (%s == (%s)%s && PyErr_Occurred()))rr   r   rt   is_complex_typeis_integer_typer   UnknownFloatType
get_c_namereplacer\   VERSION_CHAR16CHAR32ru   "_convert_funcarg_to_c_ptr_or_arrayrv   r   r   rw   r'   )	r   rf   fromvartovarerrcodeextraarg	convertercnameerrvaluer   r   r   _convert_funcarg_to_c  sJ   


z Recompiler._convert_funcarg_to_cc                 C   s2   t |tjr|d |d |d d S d S )NzPy_ssize_t datasizez-struct _cffi_freeme_s *large_args_free = NULLzIif (large_args_free != NULL) _cffi_free_array_arguments(large_args_free);)rr   r   ru   add)r   rf   	localvars	freelinesr   r   r   _extra_local_variablesC  s
   

z!Recompiler._extra_local_variablesc                 C   s   |  d |  d| |||f  |  d |  d||df  |  d| |||f  |  d |  d|  |  d	 d S )
Nz1  datasize = _cffi_prepare_pointer_call_argument(z(      _cffi_type(%d), %s, (char **)&%s);z  if (datasize != 0) {zI    %s = ((size_t)datasize) <= 640 ? (%s)alloca((size_t)datasize) : NULL;r)   zF    if (_cffi_convert_array_argument(_cffi_type(%d), %s, (char **)&%s,z,            datasize, &large_args_free) < 0)z	      %s;z  })r   r   r   )r   rf   r  r  r  r   r   r   r  J  s   



z-Recompiler._convert_funcarg_to_c_ptr_or_arrayc                 C   s>  t |tjrI| r|jdkrd||jf S t |tjr!d|f S |jdkr@| s@|jdd}|dv r:| t	 d||f S d	|| 
|f S t |tjtjfr[d
|| 
|f S t |tjrnd
|| 
t|jf S t |tjr|jd u rtd| |f d|| 
|f S t |tjrd	|| 
|f S t|)Nr   z_cffi_from_c_int(%s, %s)z_cffi_from_c_double(%s)long doubler$   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)))rr   r   rt   r   r   r   r   r   r\   r  r   ru   rw   	ArrayTyper   r}   fldnames	TypeErrorr   r~   r'   )r   rf   varcontextr  r   r   r   _convert_expr_from_cX  sD   






zRecompiler._convert_expr_from_cc                 C   s   |  |d|f S )Nz
(*(%s *)0))_global_typer   rf   r   r   r   r   _typedef_type{  r]   zRecompiler._typedef_typec                 C      |  | || d S r   )r   r  r  r   r   r   !_generate_cpy_typedef_collecttype~     z,Recompiler._generate_cpy_typedef_collecttypec                 C      d S r   r   r  r   r   r   _generate_cpy_typedef_decl  r(   z%Recompiler._generate_cpy_typedef_declc                 C   s$   | j | }| jd t|| d S )Nr   )rj   r   rp   rQ   )r   rf   r   r2   r   r   r   _typedef_ctx  s   
zRecompiler._typedef_ctxc                 C   sl   |  ||}| || t|dd dkr| j||jd d d S t|tjr4| j|j|jj|j|d d S d S )Noriginunknown_type)
approxname)r!  	named_ptr)	r  r  r   _struct_ctxr   rr   r   NamedPointerTypetotyper  r   r   r   _generate_cpy_typedef_ctx  s   
z$Recompiler._generate_cpy_typedef_ctxc                 C   s0   |  |  |jr| js|  | d S d S d S r   )r   r   ellipsisrW   r  r   r   r   "_generate_cpy_function_collecttype  s   z-Recompiler._generate_cpy_function_collecttypec              	   C   s  | j rJ t|tjsJ |jr| || d S | j}t|j}|dkr'd}n	|dkr.d}nd}g }g }d| }t	|jD ]\}	}
|
|
d|	 | |
d|	  q=d	|}|p\d
}|jrf|jd }nd}d|||f }|d|j|f  |d d	|}d}t|jtjrd}|d|||f  |d |d |d |d||f  |d d| }t	|jD ]\}	}
|
d|	 |}|d|  qt }t }|jD ]	}
| |
|| qt|D ]	}|d|f  qt|jtjsd}d| }d|jd| }|| |d nd }d}t|jdkrHtt|j}|D ]	}	|d|	  q!|  |d|t|t|d	dd |D f  |d |  t	|jD ]\}	}
| |
d |	 d|	 d! |  qP|d" |d# d$d tt|jD }d	|}|d%|||f  |d& |d' |  |d( |dkr|d) |r|d*| |jd+d,  |D ]	}|d-|  q|d. n|D ]	}|d-|  q|d/ |d0 |d |d1 d2d3 }d4}g }g }d| }t	|jD ](\}	}
d}||
rd5}d6}|
d7||	f |}|
| |
d8||	f  q|j}||r8d| }|d9|}|d| tj}d }d:}d6}|r{d	|}|pDd
}d;|||f }|d||f  |d |ra|| d	|}|d%|||f  |rv|d< |d n|d=||f  |d> |  d S )?Nr   noargr   arg0rq   argument of %sz x%dx%dr   voidr$   r)   z%s_cffi_d_%s(%s)z	static %sr   zreturn z  %s%s(%s);r   z#ifndef PYPY_VERSIONzstatic PyObject *z(_cffi_f_%s(PyObject *self, PyObject *%s)z  %s;z	result = result of %sz resultz  PyObject *pyresult;z  PyObject *arg%d;z1  if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))c                 S   r   )z&arg%dr   r   r   r   r   r;     r   z:Recompiler._generate_cpy_function_decl.<locals>.<listcomp>r   zarg%dzreturn NULLz  Py_BEGIN_ALLOW_THREADSz  _cffi_restore_errno();c                 S   r   )r,  r   r   r   r   r   r;     r   z  { %s%s(%s); }z  _cffi_save_errno();z  Py_END_ALLOW_THREADSz  (void)self; /* unused */z  (void)noarg; /* unused */z  pyresult = %s;resultzresult typez  z  return pyresult;z  Py_INCREF(Py_None);z  return Py_None;r   c                 S   s    t | tjpt | tjo|  S r   )rr   r   r}   PrimitiveTyper   )r   r   r   r   need_indirection  s   z@Recompiler._generate_cpy_function_decl.<locals>.need_indirectionFr   Tz %sx%dz%sx%dz *resultz
*result = z%s_cffi_f_%s(%s)z  return result;z#  define _cffi_f_%s _cffi_d_%sr   )rW   rr   r   rw   r'  _generate_cpy_constant_declr   r%   rq   r   rp   r   r?   abir/  rs   r   r  rl   r   r
  r  insert	void_type)r   rf   r   r   numargsargname	argumentscall_argumentsr  r   r   repr_argumentsr3  name_and_argumentsresult_codeargr  r  r   result_declrngfreeliner1  
differenceindirection	tp_resultr   r   r   _generate_cpy_function_decl  s  

















z&Recompiler._generate_cpy_function_declc                 C   s   |j r| js| || d S | j|  }t|j}| jr t}n|dkr't}n	|dkr.t	}nt
}| jd t|d| t||d| d d S )Nr   r   r   z
_cffi_f_%sz
_cffi_d_%s)r   )r'  rW   _generate_cpy_constant_ctxrj   r   r%   rq   OP_DLOPEN_FUNCOP_CPYTHON_BLTN_NOP_CPYTHON_BLTN_OOP_CPYTHON_BLTN_Vr   rp   r
   r   )r   rf   r   r2   r6  	meth_kindr   r   r   _generate_cpy_function_ctx;  s$   


z%Recompiler._generate_cpy_function_ctxc                 C   sT   t |tjr(|j}|dkr|d}d||f }| |d| |j}t||}|S )N...r   z_cffi_array_len(((%s)0)->%s)%s[0])rr   r   r  ry   r   r   r   )r   	tp_struct
field_nametp_fieldactual_lengthptr_struct_nametp_itemr   r   r   r   Q  s   
zRecompiler._field_typec                 C   s0   |  | | jr| D ]	}| | qd S d S r   )r   rW   anonymous_struct_fields_struct_collecttype)r   rf   fldtyper   r   r   rU  ]  s   
zRecompiler._struct_collecttypec                 C   s\  |j d u rd S | j}d|f }|d |d||f  |d |d |d | |D ]p\}}}}	zP| s;|dkrJ|dkrH|d	|||f  W q,t|tjrq|jd u sZ|jd
krq|j}|d }t|tjrq|jd u sZ|jd
ksZ|d|j	dd| |	d|f  W q, t
y }
 z|dt|
  W Y d }
~
q,d }
~
ww |d |d||f  |  d S )Nz_cffi_checkfld_%s_CFFI_UNUSED_FNzstatic void %s(%s *p)r   z8  /* only to generate compile-time warnings or errors */z
  (void)p;r   r)   z>  (void)((p->%s) | 0);  /* check that '%s.%s' is an integer */rL  z[0]z  { %s = &p->%s; (void)tmp; }z*tmpzfield %rr   z
  /* %s */r   z(struct _cffi_align_%s { char x; %s y; };)r   r   r   r   rr   r   r  ry   r   r   r   rm   )r   rf   r  r!  r   checkfuncnamefnameftyper"   fqualr   r   r   r   _struct_decld  sD   


zRecompiler._struct_declNc                 C   s  | j | }d }g }t|tjr|d |jd u r |d d}|| jjjvr^|d u s2|| jjjvr^|jd u r8n|j	sAt
| rBn|d |jr]|jdkrXtd||jf |d n|d d	}d
|pkd}g }|d u r+t| |}	|	D ]x\}
}}}| ||
|}| |d|j|
f  t}|dkrt}d| }n"|d u st|tjr|jd u rd}nd|d u r|dn|j|
f }|d u s|dkrd}n|d urd|j|
f }n	d|d|
f }|t|
|||t|| j |  q|t| jd }| jd | |d u rd}d}d}n#|d urd|jf }d}n
d|f }d|f }d }nd}d}d}|}| jd t|j||||||| | j | d S )N_CFFI_F_UNION_CFFI_F_OPAQUEopaque_CFFI_F_CHECK_FIELDSr   z%r is declared with 'pack=%r'; only 0 or 1 are supported in API mode (try to use "...;", which does not require a 'pack' declaration)_CFFI_F_PACKED_CFFI_F_EXTERNALexternal|0zfield '%s.%s'r   z%d /* bits */z
(size_t)-1zsizeof(((%s)0)->%s)r   z(((char *)&((%s)4096)->%s) - (char *)4096zoffsetof(%s, %s)r)   r   z
(size_t)-2unnamedzsizeof(*(%s)0)z-1 /* unknown alignment */
sizeof(%s)z"offsetof(struct _cffi_align_%s, y)r   r   )!rj   rr   r   	UnionTyperp   r   rU   r   r   partialanyrT  packedr'   r?   r   r   r   _check_not_opaquer   r+   r,   r  ry   r   r   r   r%   r   extendr1   r   r  )r   rf   r  r!  r"  r2   reason_for_not_expandingr3   r7   r   fldnamerV  r"   r\  r*   r   offsetr6   alignr5   r   r   r   r#    s   


















zRecompiler._struct_ctxc                 C   sH   t |tjr|j}t |tjst |tjr |jd u r"td| d S d S )Nz0%s is of an opaque type (not declared in cdef()))rr   r   r  r   r}   r   r  )r   rf   locationr   r   r   rn    s   zRecompiler._check_not_opaquec                 C   s   t | j }|jdd d |D ]K\}}|| jvr\|jr$td|f |jdr;|jdd  	 r;|jdd  }n|jdkrN|j
dkrNd}| |d ntd	|f | |d | qd S )
Nc                 S   s   | d S )Nr   r   )tp_orderr   r   r   rg     s    z7Recompiler._add_missing_struct_unions.<locals>.<lambda>r_   zDinternal inconsistency: %r is partial but was not seen at this point$r   _IO_FILEFILEzinternal inconsistency: %r)r   r{   r   r   r   rk  r'   r   
startswithisdigit	forcenamer  r#  )r   r   rf   orderr!  r   r   r   r     s&   
z%Recompiler._add_missing_struct_unionsc                 C      |  | d S r   )rU  r  r   r   r    _generate_cpy_struct_collecttype     z+Recompiler._generate_cpy_struct_collecttypec                 C   s.   | d}d|v r||ddfS |d| fS )Nr)   r$   r   )r   r   )r   rf   r  r   r   r   _struct_names  s   
zRecompiler._struct_namesc                 C      | j |g| |R   d S r   )r]  r  r  r   r   r   _generate_cpy_struct_decl     z$Recompiler._generate_cpy_struct_declc                 C   r  r   )r#  r  r  r   r   r   _generate_cpy_struct_ctx	  r  z#Recompiler._generate_cpy_struct_ctxc                 C   s*   t |tjr| || d S | | d S r   )rr   r   r~   _generate_cpy_enum_collecttyperU  r  r   r   r   #_generate_cpy_anonymous_collecttype  s   z.Recompiler._generate_cpy_anonymous_collecttypec                 C   s0   t |tjr| | d S | ||d|  d S Ntypedef_)rr   r   r~   _generate_cpy_enum_declr]  r  r   r   r   _generate_cpy_anonymous_decl  s   z'Recompiler._generate_cpy_anonymous_declc                 C   s2   t |tjr| || d S | ||d|  d S r  )rr   r   r~   	_enum_ctxr#  r  r   r   r   _generate_cpy_anonymous_ctx  s   z&Recompiler._generate_cpy_anonymous_ctxconstc                 C   s   ||f| j v rtd||f | j ||f | j}d||f }|r\|d|  |d |d|f  |d||f  |d urS|dkrHd|f }|d	|f  |d
 |d |d n|d u sbJ |d|  |d |d|d|f  |d |  d S )Nz duplicate declaration of %s '%s'z_cffi_%s_%sz$static int %s(unsigned long long *o)r   z  int n = (%s) <= 0;zI  *o = (unsigned long long)((%s) | 0);  /* check that %s is an integer */r   z%dUz"  if (!_cffi_check_int(*o, n, %s))z    n |= 2;z  return n;r   zstatic void %s(char *o)z  *(%s)o = %s;r   )r   r   r  r   r   )r   is_intr   rf   categoryr   r   funcnamer   r   r   _generate_cpy_const&  s6   



zRecompiler._generate_cpy_constc                 C   s$   |  }|r	| jr| | d S d S r   )r   rW   r   r   rf   r   r  r   r   r   "_generate_cpy_constant_collecttypeD  s   
z-Recompiler._generate_cpy_constant_collecttypec                 C   s   |  }| ||| d S r   )r   r  r  r   r   r   r2  I  s   z&Recompiler._generate_cpy_constant_declc                 C   s^   | j s| rttd}n| j rt}nt}| j| }t||}| jd t	|d| | d S )Nr   r   _cffi_const_%s)
rW   r   r   OP_CONSTANT_INTOP_DLOPEN_CONSTOP_CONSTANTrj   r   rp   r
   )r   rf   r   r   
const_kindr2   r   r   r   rE  M  s   


z%Recompiler._generate_cpy_constant_ctxc                 C   r}  r   )r   r  r   r   r   r  ]  r  z)Recompiler._generate_cpy_enum_collecttypec                 C   s   |j D ]}| d| qd S )NT)enumeratorsr  )r   rf   r   
enumeratorr   r   r   r  `  s   
z"Recompiler._generate_cpy_enum_declc              	   C   s   | j | }ttd}| jr|  t|j|jD ]\}}| jd 	t
|d| ||d q|d urAd|vrA| jsAd| }d| }n|| jg }	| j|	}tt| j|	ddk }d	|j}
| jd
 	t|j||||
 d S )Nr   r   r  r   rv  ri  z((%s)-1) <= 0r   r<   r   )rj   r   OP_ENUMrW   check_not_partialzipr  
enumvaluesr   rp   r
   build_baseinttyperU   sizeofintcastr?   rA   r   )r   rf   r  r2   r   r  	enumvaluer   rC   basetprD   r   r   r   r  d  s(   




zRecompiler._enum_ctxc                 C   s   |  ||  d S r   )r  r   r  r   r   r   _generate_cpy_enum_ctxy  rS   z!Recompiler._generate_cpy_enum_ctxc                 C   r  r   r   r  r   r   r   _generate_cpy_macro_collecttype  r(   z*Recompiler._generate_cpy_macro_collecttypec                 C   s&   |dkrd }n|}| j d||d d S )NrL  Tr  )r  )r   rf   r   r   r   r   r   _generate_cpy_macro_decl  s   z#Recompiler._generate_cpy_macro_declc                 C   sT   |dkr| j rtd|f d }n|}ttd}| jd t|d| ||d d S )NrL  zGcannot use the syntax '...' in '#define %s ...' when using the ABI moder   r   r  r  )rW   r   r   r  r   rp   r
   )r   rf   r   r   r   r   r   r   _generate_cpy_macro_ctx  s   

z"Recompiler._generate_cpy_macro_ctxc                 C   sF   t |tjr!|j}|dkrd|f }| |jd| }t||}|S )NrL  z_cffi_array_len(%s)rM  )rr   r   r  ry   r  r   )r   rf   global_namerQ  rS  r   r   r   r    s   
zRecompiler._global_typec                 C   r  r   )r   r  r  r   r   r   "_generate_cpy_variable_collecttype  r  z-Recompiler._generate_cpy_variable_collecttypec                 C   s   | j }| ||}t|tjr|jd u r|j}d}nd}d|f }|d|j|| jd  |d |d||f  |d |  d S )	Nr)   &z*_cffi_var_%s(void)static rX  r   z  return %s(%s);r   )	r   r  rr   r   r  ry   r   r   r   )r   rf   r   r   	ampersandr   r   r   r   _generate_cpy_variable_decl  s   
	
z&Recompiler._generate_cpy_variable_declc                 C   sL   |  ||}| j| }| jrt}nt}| jd t|d| t|| d S )Nr   z_cffi_var_%s)	r  rj   rW   OP_GLOBAL_VAROP_GLOBAL_VAR_Fr   rp   r
   r   )r   rf   r   r2   r*   r   r   r   _generate_cpy_variable_ctx  s   

z%Recompiler._generate_cpy_variable_ctxc                 C   s   t |tjsJ | | d S r   )rr   r   rw   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d|f }|d|  |d| j||f  |  g }d| }t|jD ]\}}	|	d| |}
|	|
 q9d	
|}|pSd
}d||f }|jdkrcd| }dd }tt|jd d}||jr{t|d}t|jtjrd|jd||jd|f }|d||j|f  |d |d|  |d t|jD ])\}}	d| }
t|	tjs||	rd|
 }
t|	}	|d|	d|d |
f  q|d|  t|jtjs|d|jdf  |d |  |  jd7  _d S )Nrf  r.  z(int)sizeof(%s)r)   z3static struct _cffi_externpy_s _cffi_externpy__%s =z  { "%s.%s", %s, 0, 0 };r+  z a%dr   r-  z%s(%s)	__stdcallz_cffi_stdcall c                 S   s   t | tjo
| jdkS )Nr  )rr   r   r0  r   re   r   r   r   may_need_128_bits  s   z9Recompiler._extern_python_decl.<locals>.may_need_128_bitsrG      z!sizeof(%s) > %d ? sizeof(%s) : %dz%s%sr   z  char a[%s];z  char *p = a;za%dr  z  *(%s)(p + %d) = %s;r   z,  _cffi_call_python(&_cffi_externpy__%s, p);z  return *(%s)p;r   r   )r   rr   r/  r   rs   r   rV   r   rq   rp   r?   r3  rZ   r%   r}   ru   r   )r   rf   r   tag_and_spacer   size_of_resultr  r8  r   r   r=  r:  r;  r  	size_of_ar   r   r   _extern_python_decl  sb   




zRecompiler._extern_python_declc                 C      |  ||d d S )Nr  r  r  r   r   r    _generate_cpy_extern_python_decl  r]   z+Recompiler._generate_cpy_extern_python_declc                 C   r  )NzCFFI_DLLEXPORT r  r  r   r   r   #_generate_cpy_dllexport_python_decl
  r]   z.Recompiler._generate_cpy_dllexport_python_declc                 C   r  )Nr)   r  r  r   r   r   '_generate_cpy_extern_python_plus_c_decl  r]   z2Recompiler._generate_cpy_extern_python_plus_c_declc                 C   sR   | j rtd|jrtd| j| }tt|}| jd t	|d| || d S )Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"r   z&_cffi_externpy__%s)
rW   r   r'  r'   rj   r   OP_EXTERN_PYTHONr   rp   r
   )r   rf   r   r2   r   r   r   r   _generate_cpy_extern_python_ctx  s   


z*Recompiler._generate_cpy_extern_python_ctxc                 C   s   | j }|d t|ts|d}n|d z|d W n ty+   d| }Y nw |dD ]>}|}tdtu rAtt	|}nt
|dd }|d	|   d
}|D ]}t|dkrc|| d
}|d|f 7 }qU|| q1d S )Nz=// # NB. this is not a string because of a size limit in MSVCzutf-8asciis   # -*- encoding: utf8 -*-
Tz//r   r   z// r)   L   z%d,)r   rr   bytesencodedecodeUnicodeDecodeError
splitlinesr   mapordr  rstripr%   )r   sr   liner5   printed_linecr   r   r   r     s0   


z)Recompiler._print_string_literal_in_arrayc                 C   s   t tt| j|< d S r   )r   OP_PRIMITIVE	PRIM_VOIDrn   r   rf   r   r   r   r   _emit_bytecode_VoidType=  rS   z"Recompiler._emit_bytecode_VoidTypec                 C   s   t |j }tt|| j|< d S r   )PRIMITIVE_TO_INDEXr   r   r  rn   )r   rf   r   rP   r   r   r   _emit_bytecode_PrimitiveType@     
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  rn   r   rf   r   r  r   r   r   !_emit_bytecode_UnknownIntegerTypeD  s   z,Recompiler._emit_bytecode_UnknownIntegerTypec                 C   s$   d|j |j f }tt|| j|< d S )Nzd_cffi_prim_float(sizeof(%s) *
           (((%s)1) / 2) * 2 /* integer => 0, float => 1 */
         )r  r  r   r   r   _emit_bytecode_UnknownFloatTypeJ  s   
z*Recompiler._emit_bytecode_UnknownFloatTypec                 C   s   t t| j|j | j|< |d7 }|jD ]$}| j| }||kr3t|tjr+| 	|| nt t
|| j|< |d7 }qt|j}|jd urT|jdkrL|dO }ntd|jf t t|| j|< d S )Nr   r  rE   zabi=%r)r   OP_FUNCTIONrj   r/  rn   rq   rr   r   r0  r  r+   r  r'  r3  r'   OP_FUNCTION_END)r   rf   r   r   	realindexr3   r   r   r   _emit_bytecode_RawFunctionTypeP  s   






z)Recompiler._emit_bytecode_RawFunctionTypec                 C   s   t t| j|j | j|< d S r   )r   
OP_POINTERrj   r%  rn   r  r   r   r   _emit_bytecode_PointerTypec  r  z%Recompiler._emit_bytecode_PointerTypec                 C   s"   |  }tt| j| | j|< d S r   )r   r   r  rj   rn   )r   rf   r   rawr   r   r   _emit_bytecode_FunctionPtrTypei  s   z)Recompiler._emit_bytecode_FunctionPtrTypec                 C   s   | j |j }|jd u rtt|| j|< d S |jdkr'tdt|ddf | j|d  dks2J tt	|| j|< td t|j| j|d < d S )NrL  zitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/r   rb   )
rj   r   ry   r   OP_OPEN_ARRAYrn   r   rm   r   OP_ARRAY)r   rf   r   
item_indexr   r   r   _emit_bytecode_ArrayTypem  s   

z#Recompiler._emit_bytecode_ArrayTypec                 C      | j | }tt|| j|< d S r   )r{   r   OP_STRUCT_UNIONrn   )r   rf   r   struct_indexr   r   r   _emit_bytecode_StructType{  r  z$Recompiler._emit_bytecode_StructTypec                 C   r  r   )r|   r   r  rn   )r   rf   r   
enum_indexr   r   r   _emit_bytecode_EnumType  r  z"Recompiler._emit_bytecode_EnumTypeF)r)   r   )Nr  N)Vr   r   r   r   r   r\   r   r   r   rk   r   r   r   r   r   r   r   r   r   r
  r  r  r  r  r  r  r  r&  r(  rD  rK  r   rU  r]  r#  rn  r   r~  _generate_cpy_union_collecttyper  r  _generate_cpy_union_declr  _generate_cpy_union_ctxr  r  r  r  r  r2  rE  r  r  r  r  r  r  r  r  r  r  r  r  *_generate_cpy_dllexport_python_collecttype._generate_cpy_extern_python_plus_c_collecttyper  r  r  r  r  "_generate_cpy_dllexport_python_ctx&_generate_cpy_extern_python_plus_c_ctxr   r  r  r  r  r  r  _emit_bytecode_ConstPointerType_emit_bytecode_NamedPointerTyper  r  r  _emit_bytecode_UnionTyper  r   r   r   r   rT   ~   s    
:
 .
4-# #
"V	

	6rT   )r   c                       s   e Zd Z fddZ  ZS )NativeIOc                    s(   t |tr
|d}tt| | d S )Nr  )rr   unicoder  superr  r   )r   r  r   r   r   r     s   

zNativeIO.write)r   r   r   r   __classcell__r   r   r  r   r    s    r  c                 C   s
   t | dS )Nr   )hasattr)	maybefiler   r   r   _is_file_like  r   r  c           
      C   sR  |r	t d|f  t| ||d u d}|  |  t|r&||| dS t }||| | }z+t|d}|	t
|d |krGtW d    n1 sQw   Y  |r\t d W dS  ty   d|t f }	t|	d	}|| W d    n1 sw   Y  z
t|	| W Y dS  ty   t| t|	| Y Y dS w w )
Nzgenerating %s)rW   Tr   r   z(already up-to-date)Fz%s.~%dw)printrT   r   r   r  r   r  getvaluer   readr%   IOErrorr   getpidr   renameOSErrorunlink)
rU   rV   r   target_fileverbose
recompilerr   outputf1tmp_filer   r   r   _make_c_or_py_source  sH   
r  Fc                 C   s   |d usJ t | ||||S r   r  )rU   rV   r   target_c_filer
  r   r   r   make_c_source  s   
r  c                 C   s   t | |d ||S r   r  )rU   rV   target_py_filer
  r   r   r   make_py_source  s   
r  c                 C   sl   | d}zttjj| g|d d R   W n	 ty!   Y nw |d  |7  < tjj| g|R  |fS )Nr   r   )r   r   makedirsr   r?   r  )	outputdirmodname	extensionpartsr   r   r   _modname_to_file  s   
&r  c                 C   s*   t ||}| |||f t||| |S r   )r   rp   setattr)	patchlistclsr   new_metholdr   r   r   _patch_meth  s   
r   c                 C   s$   t | D ]\}}}t||| qd S r   )reversedr  )r  r  r   old_methr   r   r   _unpatch_meths  s   r#  c                    sh   t jdkrddlm} |d urt| |ddd  t jdkr2ddlm}  fd	d
}t| |d| d S d S )Nr   r   )MSVCCompiler_remove_visual_c_refc                 S   s   |S r   r   )r   manifest_filer   r   r   rg         z&_patch_for_embedding.<locals>.<lambda>darwin)	CCompilerc                    sB   d| j v rt| j | _ | j d}d| j |<  | g|R i |S )Nz-bundlez-dynamiclib)	linker_sor   r   )r   rq   kwdsr   old_link_shared_objectr   r   my_link_shared_object  s
   

z3_patch_for_embedding.<locals>.my_link_shared_objectlink_shared_object)sysplatformcffi._shimmed_dist_utilsr$  r   r)  )r  r$  r)  r.  r   r,  r   _patch_for_embedding  s   

r3  c                    sl   ddl m}  dr) d d  tjdkr d7  ntjdkr% d7  n d	7  t| |d
 fdd d S )Nr   )	build_extz.*rg  r   z.dllr(  z.dylibz.soget_ext_filenamec                    s    S r   r   )r   ext_nametargetr   r   rg     r'  z#_patch_for_target.<locals>.<lambda>)r2  r4  endswithr0  r1  r   )r  r8  r4  r   r7  r   _patch_for_target  s   





r:  r   T.cc              	   K   s  t |ts
|d}| jr| | |d ur|r t|r td| jd u}|r,| | |d u rFt	|||\}}|r?|g| }t
jj| }n|}|	d u rU|rSd| }	nd}	|rbtj||fi |}nd }t| ||||d}|rg }t
 }z?|r|t| |	dkrt||	 |r|dkrd}nd}td	|t
j|f  t
| td|||
}W t
| t| |S t
| t| w ||fS |d u rt	||d
\}}t| |||d}|r|S d |fS )Nr  zGWriting to file-like objects is not supported with call_c_compiler=Truez%s.*r   )r
  r   zthe current directory isz setting the current directory toz%s %rz.py)rr   rm   r  _windows_unicode_apply_windows_unicoder  r  r   _apply_embedding_fixr  r   r   r?   r   get_extensionr  getcwdr3  r:  r  abspathchdircompiler#  r  )rU   rV   r   tmpdircall_c_compilerc_filesource_extensionextradircompiler_verboser8  debuguses_ffiplatformr+  	embeddingr  
ext_c_fileextupdatedr  cwdmsgoutputfilenamer   r   r   r   	recompile  sv   












rS  r  )	r   TNr;  Nr   NNT)"r   r0  ior)   r   r   errorr   cffi_opcoderX   r   r  r1  version_infor   r
   r   r1   rA   rQ   rT   StringIOr  BytesIOr  r  r  r  r  r   r#  r3  r:  rS  r   r   r   r   <module>   sV              


