o
    "“iåÿ  ã                   @   sT  d dl Z 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s7ejd
k s7ejdko<e 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rpe jZn	G dd„ de jƒZdd„ Zdd„ Zd4d!d"„Zd4d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!d-d.„ Z"	0			0d5d2d3„Z#dS )6é    Né   )ÚffiplatformÚmodel)ÚVerificationError)Ú*i&  i'  i(  Úwin32)é   r   )r   é   ÚPy_GIL_DISABLEDc                   @   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   úO/var/www/html/premium_crap/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   r0   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   r3   r4   r   r5   r6   r7   r8   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   r3   r4   r   r5   r7   r&   r8   r6   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   )r0   )Ú.0Úc_fieldr   r   r   Ú
<listcomp>O   s    ÿz2StructUnionExpr.as_python_expr.<locals>.<listcomp>z(b'%s%s%s',%s)ú,)Úevalr4   ÚG_FLAGSr8   r.   r3   r   Újoin)r   r4   Úfields_exprr   r   r   r   M   s   ÿüzStructUnionExpr.as_python_exprNr   r   r   r   r   r2   :   s    r2   c                   @   r1   )ÚEnumExprc                 C   r   r   ©r   r3   r   ÚsignedÚallenums)r   r   r3   r   rD   rE   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" },rC   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   )rF   r   )é   r   )rG   r   )é   r   )rH   r   zb'%s%s%s\x00%s')Ú
PRIM_UINT8Ú	PRIM_INT8ÚPRIM_UINT16Ú
PRIM_INT16ÚPRIM_UINT32Ú
PRIM_INT32ÚPRIM_UINT64Ú
PRIM_INT64r   rD   r.   r3   r   rE   )r   Ú
prim_indexr   r   r   r   d   s   ü
û
þzEnumExpr.as_python_exprNr   r   r   r   r   rB   W   s    rB   c                   @   r1   )ÚTypenameExprc                 C   s   || _ || _d S r   ©r   r3   )r   r   r3   r   r   r   r   p   s   
zTypenameExpr.__init__c                 C   s   d| j | jf S )Nz  { "%s", %d },rS   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.   r3   r   r   r   r   r   r   w   ó   zTypenameExpr.as_python_exprNr   r   r   r   r   rR   o   s    rR   c                   @   s†  e Zd ZdZd•dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	g d¢Z
dd„ Zd–dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d—d@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	?d˜dUdV„Z/dWdX„ Z0dYdZ„ Z1d[d\„ Z2d]d^„ Z3d—d_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€„ ZHd�d‚„ ZIdƒd„„ ZJd…d†„ ZKd‡dˆ„ ZLd‰dŠ„ ZMd‹dŒ„ ZNeNZOeNZPd�dŽ„ ZQd�d�„ ZRd‘d’„ ZSeSZTd“d”„ ZUd?S )™Ú
Recompilerr   Fc                 C   s   || _ || _|| _t| _d S r   )ÚffiÚmodule_nameÚtarget_is_pythonÚVERSION_BASEÚ_version)r   rV   rW   rX   r   r   r   r   �   s   
zRecompiler.__init__c                 C   s   t | j|ƒ| _d S r   )ÚmaxrZ   )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 r�t| jƒ| j |< | j |¡ |jr�|jd ur�| j d¡ qed | j  ¡ vs—J ‚i | _i | _|D ]}t	|t
jƒr­d | j|< qŸt	|t
jƒr¸d | j|< qŸtt| jdd„ d�ƒD ]	\}}|| j|< qÄtt| jdd„ d�ƒD ]	\}}|| j|< qÙ|D ]}t| d|jj ƒ}||| j | ƒ qå| jD ]
}t	|tƒ�sJ ‚qüt| 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   rd   r   re   rf   r   r   r   rh   ·   ri   Ú_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_declsrg   Útp1ÚiÚmethodr+   r   r   r   Úcollect_type_tableŠ   sf   


ü€€
€ÿÿ
zRecompiler.collect_type_tablec                 C   s   | j  }| |¡S r   )rX   Ú
enumfields)r   rg   Ú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   )rs   r   ÚBaseTypeByIdentityr„   Ú_do_collect_typerk   rx   Úas_raw_functionr~   ÚfldtypesrV   Ú_parserÚ_included_declarationsrŒ   Ú_field_typeÚ
_get_items)r   rg   Ú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)rV   r‘   Ú_declarationsÚitemsrm   Úsplitr�   ÚAttributeErrorr   Ú_current_qualsÚ	Exceptionr   Úattach_exception_info)
r   Ú	step_nameÚlstr   rg   ÚqualsÚkindÚrealnamerˆ   Úer   r   r   rl   â   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s…J ‚qot
|ƒt
| jƒks‘J ‚d S )NÚctxr¦   c                 S   rd   r   re   )Úentryr   r   r   rh     ri   z0Recompiler.collect_step_tables.<locals>.<lambda>r`   r§   r¨   )Ú_lstsÚ	ALL_STEPSÚsetÚ_seen_struct_unionsrl   Ú_add_missing_struct_unionsÚsortr„   r|   r™   r&   r   r}   )r   rŸ   r    rg   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  rT   zRecompiler._prntc                 C   s<   | j r|d u s	J ‚|  |¡ d S |d usJ ‚|  ||¡ d S r   )rX   Ú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 rÙd||  ¡  }	|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   ©r:   rg   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[] = {rF   ú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·   rV   Ú
_embeddingÚUSE_LIMITED_APIrÈ   Úindexr@   rW   rš   Ú_print_string_literal_in_arrayr]   ÚVERSION_EMBEDDEDÚdictrk   r™   r€   ro   Ú_get_c_namer   r®   Ú_seen_constantsrl   r­   r¬   r&   Ú_included_ffisÚ_assigned_sourcer›   r   Ú_num_externpyrZ   )r   rº   r»   ÚprntrÇ   r‡   Úbase_module_nameÚtypeindex2typer+   r6   ÚnumsrŸ   r    r«   Úffi_to_includeÚincluded_module_nameÚincluded_sourcer4   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)r:   Úitemr   r   r   r<   Ø  s    z%Recompiler._to_py.<locals>.<listcomp>r   r*   z(%s)r=   )rs   rn   Úlistr„   r&   rq   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   rF   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   r9   r   )r   )r:   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   ©r:   r‡   r   r   r   r<     rì   ú))r´   r·   r&   rV   rÞ   Úrangerß   r›   r   rW   rZ   r„   ro   rè   r@   rÛ   rk   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   )rk   )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ƒr‘d| 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()))rs   r   ru   Úis_complex_typeÚis_integer_typer   ÚUnknownFloatTypeÚ
get_c_nameÚreplacer]   ÚVERSION_CHAR16CHAR32rv   Ú"_convert_funcarg_to_c_ptr_or_arrayrw   r·   rõ   rx   r(   )	r   rg   Ú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);)rs   r   rv   Úadd)r   rg   Ú	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   rg   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 rƒtd| ¡ |f ƒ‚d||  
|¡f S t |tjƒr›d	||  
|¡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)))rs   r   ru   rþ   r   rÿ   rý   r  r]   r  rõ   rv   rx   Ú	ArrayTyperé   r~   ÚfldnamesÚ	TypeErrorrÜ   r   r(   )r   rg   Ú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   rg   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©   )rk   r¬   rq   rR   )r   rg   r   r3   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   rs   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�   ÚellipsisrX   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ƒrŽd}|d|||f ƒ |dƒ |dƒ |dƒ |d||f ƒ |dƒ d| }t	|jƒD ]\}	}
|
 d|	 |¡}|d| ƒ q¸tƒ }tƒ }|jD ]	}
|  |
||¡ qÔt|ƒD ]	}|d|f ƒ qât|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}||
ƒ�rýd5}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   Úarg0rr   ú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   )rs   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Ì   )rX   rs   r   rx   r(  Ú_generate_cpy_constant_declr·   r&   rr   r€   rq   r   r@   Úabir0  rt   r®   r  rm   rñ   r  r  ÚinsertÚ	void_type)r   rg   r   rá   ÚnumargsÚargnameÚ	argumentsÚcall_argumentsr  r‡   rô   Úrepr_argumentsr4  Úname_and_argumentsÚresult_codeÚargr  r  rÐ   Úresult_declÚrngÚfreeliner2  Ú
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(  rX   Ú_generate_cpy_constant_ctxrk   r�   r&   rr   ÚOP_DLOPEN_FUNCÚOP_CPYTHON_BLTN_NÚOP_CPYTHON_BLTN_OÚOP_CPYTHON_BLTN_Vr¬   rq   r   rƒ   )r   rg   r   r3   r7  Ú	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])rs   r   r  rz   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Ž   rX   Úanonymous_struct_fieldsÚ_struct_collecttype)r   rg   Úfldtyper   r   r   rV  ]  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 */rM  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þ   rs   r   r  rz   ré   r   r   rn   )r   rg   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r¡t}d| }n"|d u s°t|tjƒr³|jd u r³d}nd|d u r½| d¡n|j|
f }|d u sË|dkrÎd}n|d urÚd|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   z2(size_t)(((char *)&((%s)4096)->%s) - (char *)4096)z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§   )!rk   rs   r   Ú	UnionTyperq   r�   rV   r‘   r’   ÚpartialÚanyrU  Úpackedr(   r@   rê   rŒ   r“   Ú_check_not_opaquer   r,   r-   r  rz   r   r    rƒ   r&   r¬   Úextendr2   r¯   r  )r   rg   r	  r"  r#  r3   Úreason_for_not_expandingr4   r8   rŠ   ÚfldnamerW  r#   r]  r+   r   Úoffsetr7   Úalignr6   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()))rs   r   r  ré   r~   r�   r  )r   rg   Úlocationr   r   r   ro  Ü  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   rh   é  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¯   rl  r(   r   Ú
startswithÚisdigitÚ	forcenamer  r$  )r   r    rg   Úorderr"  r   r   r   r°   ã  s&   
þÿ€òz%Recompiler._add_missing_struct_unionsc                 C   ó   |   |¡ d S r   )rV  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   rg   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   )rs   r   r   Ú_generate_cpy_enum_collecttyperV  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_)rs   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ˆ  )rs   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   rg   Ú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þ   rX   rŽ   ©r   rg   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   r3  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)
rX   rþ   rƒ   ÚOP_CONSTANT_INTÚOP_DLOPEN_CONSTÚOP_CONSTANTrk   r¬   rq   r   )r   rg   r   r   Ú
const_kindr3   r   r   r   rF  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   rg   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   rw  rj  z((%s)-1) <= 0r   r=   r¨   )rk   rƒ   ÚOP_ENUMrX   Úcheck_not_partialÚziprš  Ú
enumvaluesr¬   rq   r   Úbuild_baseinttyperV   ÚsizeofÚintÚcastr@   rB   r   )r   rg   r	  r3   r   r›  Ú	enumvaluer   rD   ÚbasetprE   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  rT   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 )NrM  Trœ  )r’  )r   rg   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 )NrM  zGcannot use the syntax '...' in '#define %s ...' when using the ABI moderÊ   r¥   r•  rœ  )rX   r   rƒ   r–  r¬   rq   r   )r   rg   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 )NrM  z_cffi_array_len(%s)rN  )rs   r   r  rz   r  ré   )r   rg   Úglobal_namerR  rT  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 rY  rÓ   z  return %s(%s);rÕ   )	r·   r  rs   r   r  rz   ré   r   rœ   )r   rg   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  rk   rX   ÚOP_GLOBAL_VARÚOP_GLOBAL_VAR_Fr¬   rq   r   rƒ   )r   rg   r   r3   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   )rs   r   rx   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ƒr’d|j d¡||j d¡|f }|d||j |¡f ƒ |dƒ |d| ƒ |dƒ t|jƒD ])\}}	d| }
t|	tjƒsÃ||	ƒrÌd|
 }
t |	¡}	|d|	 d¡|d |
f ƒ q±|d| ƒ t|jtjƒsó|d|j d¡f ƒ |dƒ |ƒ  |  jd7  _d S )Nrg  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  )rs   r   r1  r   rf   r   r   r   Úmay_need_128_bitsê  s   ÿz9Recompiler._extern_python_decl.<locals>.may_need_128_bitsrH   é   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·   rs   r0  r   rt   r   rW   r€   rr   rq   r@   r4  r[   r&   r~   rv   rà   )r   rg   r   Útag_and_spacerá   Úsize_of_resultr  r9  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)
rX   r   r(  r(   rk   rƒ   ÚOP_EXTERN_PYTHONr¬   rq   r   )r   rg   r   r3   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·   rs   ÚbytesÚencodeÚdecodeÚUnicodeDecodeErrorÚ
splitlinesrô   ÚmapÚordrÃ  Úrstripr&   )r   Úsrá   Úliner6   Ú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_VOIDro   ©r   rg   rØ   r   r   r   Ú_emit_bytecode_VoidType=  rT   z"Recompiler._emit_bytecode_VoidTypec                 C   s   t |j }tt|ƒ| j|< d S r   )ÚPRIMITIVE_TO_INDEXr   rƒ   rÑ  ro   )r   rg   rØ   rQ   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Ñ  ro   ©r   rg   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µ  rF   zabi=%r)rƒ   ÚOP_FUNCTIONrk   r0  ro   rr   rs   r   r1  rÖ  r,   r£  r(  r4  r(   ÚOP_FUNCTION_END)r   rg   rØ   r†   Ú	realindexr4   r   r   r   Ú_emit_bytecode_RawFunctionTypeP  s   






z)Recompiler._emit_bytecode_RawFunctionTypec                 C   s   t t| j|j ƒ| j|< d S r   )rƒ   Ú
OP_POINTERrk   r&  ro   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à  rk   ro   )r   rg   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 )NrM  zitype %s badly placed: the '...' array length can only be used on global arrays or on fields of structuresz/*...*/r   rc   )
rk   ré   rz   rƒ   ÚOP_OPEN_ARRAYro   r   rn   r  ÚOP_ARRAY)r   rg   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_UNIONro   )r   rg   rØ   Ústruct_indexr   r   r   Ú_emit_bytecode_StructType{  r×  z$Recompiler._emit_bytecode_StructTypec                 C   rè  r   )r}   rƒ   r�  ro   )r   rg   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Ž   rl   r­   r²   r·   r¼   rÈ   r¹   rè   r¸   rõ   r  r  r  r  r  r  r  r  r'  r)  rE  rL  r“   rV  r^  r$  ro  r°   r  Ú_generate_cpy_union_collecttyper�  rƒ  Ú_generate_cpy_union_declr…  Ú_generate_cpy_union_ctxr‡  r‹  r�  r’  r”  r3  rF  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   rU   ~   s´    
:
 .
4-# #
"V	
ÿ
	þ6þrU   )r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚNativeIOc                    s(   t |tƒr
| d¡}tt| ƒ |¡ d S )NrÃ  )rs   Ú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 s‚w   Y  z
t |	|¡ W Y dS  ty§   t |¡ t |	|¡ Y Y dS w w )
Nzgenerating %s)rX   Tr½   r   z(already up-to-date)Fz%s.~%dÚw)ÚprintrU   r‰   r²   r   r¼   rù  Úgetvaluer¾   Úreadr&   ÚIOErrorr¿   Úgetpidrµ   ÚrenameÚOSErrorÚunlink)
rV   rW   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  )rV   rW   r»   Útarget_c_filer  r   r   r   Úmake_c_source±  s   
ÿr  c                 C   s   t | |d ||ƒS r   r  )rV   rW   Ú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�   rq   Ú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   rh   Ú  ó    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   rr   Ú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   
ÿ
þ÷r4  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.*rh  r   z.dllr)  z.dylibz.soÚget_ext_filenamec                    s   ˆ S r   r   )r   Úext_name©Útargetr   r   rh   ÷  r(  z#_patch_for_target.<locals>.<lambda>)r3  r5  Úendswithr1  r2  r!  )r  r9  r5  r   r8  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�}|r¿g }t
 ¡ }z?|r|t|ƒ |	dkr…t||	ƒ |rœ|dkrŽd}nd}td	|t
j |¡f ƒ t
 |¡ t d|||
¡}W t
 |¡ t|ƒ |S t
 |¡ t|ƒ w ||fS |d u rÏt	||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)rs   rn   rÆ  Ú_windows_unicodeÚ_apply_windows_unicoder   r  rÖ   Ú_apply_embedding_fixr  r¿   rÀ   r@   r   Úget_extensionr  Úgetcwdr4  r;  r  ÚabspathÚchdirÚcompiler$  r  )rV   rW   r»   ÚtmpdirÚcall_c_compilerÚc_fileÚsource_extensionÚextradirÚcompiler_verboser9  ÚdebugÚuses_ffiplatformr,  Ú	embeddingr  Ú
ext_c_fileÚextÚupdatedr  ÚcwdÚmsgÚoutputfilenamer—   r   r   r   Ú	recompileú  sv   




ÿ


ÿ

ÿ

þ
ÿrT  rî  )	rÉ   TNr<  Nr   NNT)$Úior¿   r1  Ú	sysconfigr*   r   r   Úerrorr   Úcffi_opcoderY   rÚ   r  r2  Úversion_infoÚget_config_varr×   r   r    r2   rB   rR   rU   ÚStringIOrù  ÚBytesIOr   r  r  r  r  r!  r$  r4  r;  rT  r   r   r   r   Ú<module>   sZ     ÿ
þ          


ý