
    FZjt                     ,   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	 dZ
dZdZ ej                  d	      Zej                  d
k7  xs  ej                   dk  xs ej                   dk\  xr e xs ej                   dk\  Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zej                   dk\  re j0                  Zn G d de j4                        Zd Zd Zd'dZd'd Zd! Zd" Z d# Z!d$ Z"d% Z#	 	 	 	 d(d&Z$y))    N   )ffiplatformmodel)VerificationError)*i&  i'  i(  Py_GIL_DISABLEDwin32)   r   )r
      )r
      c                        e Zd ZddZd Zd Zy)
GlobalExprc                 J    || _         || _        || _        || _        || _        y N)nameaddresstype_opsizecheck_value)selfr   r   r   r   r   s         QC:\Users\Rodrigo\frota-trucks-cliente\python\Lib\site-packages\cffi/recompiler.py__init__zGlobalExpr.__init__   s&    		&    c           	          d| j                   d| j                  d| j                  j                         d| j                  d	S )N  { "z", (void *), z
, (void *) },)r   r   r   	as_c_exprr   r   s    r   r   zGlobalExpr.as_c_expr   s0    IIt||T\\%;%;%=tyyJ 	Jr   c                 j    d| j                   j                         | j                  | j                  fz  S )Nz
b'%s%s',%d)r   as_python_bytesr   r   r   s    r   as_python_exprzGlobalExpr.as_python_expr   s2    t||;;=tyy#//1 1 	1r   N)r   r   __name__
__module____qualname__r   r   r"    r   r   r   r      s    'J1r   r   c                   $    e Zd Zd Zd Zd Zd Zy)	FieldExprc                 J    || _         || _        || _        || _        || _        y r   )r   field_offset
field_sizefbitsizefield_type_op)r   r   r+   r,   r-   r.   s         r   r   zFieldExpr.__init__!   s'    	($ *r   c                     dt        | j                        z  }d| j                  d| j                  dd|d| j                  dz   d|d| j                  j                         dz   S )N r   ", z,
z     z   r   )lenr   r+   r,   r.   r   )r   spacess     r   r   zFieldExpr.as_c_expr(   sZ    s499~%%)YY0A0AB%+T__=>%+T-?-?-I-I-KLM 	Nr   c                     t         r   )NotImplementedErrorr   s    r   r"   zFieldExpr.as_python_expr.   s    !!r   c                    | j                   j                  t        k(  rd}n9| j                   j                  t        k(  rt	        | j
                        }nt        d| j                   j                         || j                  dS )N b'')	r.   opOP_NOOPOP_BITFIELDformat_four_bytesr-   r5   r!   r   )r   	size_exprs     r   as_field_python_exprzFieldExpr.as_field_python_expr1   sj      G+I""k1)$--8I%%"00@@B'"ii) 	)r   N)r$   r%   r&   r   r   r"   r?   r'   r   r   r)   r)       s    +N"	)r   r)   c                       e Zd Zd Zd Zd Zy)StructUnionExprc	                 t    || _         || _        || _        || _        || _        || _        || _        || _        y r   )r   
type_indexflagsr   	alignmentcommentfirst_field_indexc_fields)	r   r   rC   rD   r   rE   rF   rG   rH   s	            r   r   zStructUnionExpr.__init__=   s;    	$
	"!2 r   c                     d| j                   | j                  | j                  fz  d| j                  d| j                  dz   d| j
                  t        | j                        fz  z   | j                  rd| j                  z  z   dz   S dz   dz   S )Nz  { "%s", %d, %s,z
    r   z%d, %d z	/* %s */ r7   z},)	r   rC   rD   r   rE   rG   r2   rH   rF   r   s    r   r   zStructUnionExpr.as_c_exprH   s    #tyy$//4::&NN&*ii@At55s4==7IJJK 26;-G 	 	 DFG 	 	r   c                    t        | j                  t              }| j                  D cg c]  }|j	                          }}dt        | j                        t        |      | j                  ddj                  |      dS c c}w )Nz(b'',,))	evalrD   G_FLAGSrH   r?   r=   rC   r   join)r   rD   c_fieldfields_exprs       r   r"   zStructUnionExpr.as_python_exprO   sw    TZZ)&*mm5&37 335&3 	 5 doo.e$IIHH[!	# 	#5s   BNr#   r'   r   r   rA   rA   <   s    	!#r   rA   c                       e Zd Zd Zd Zd Zy)EnumExprc                 J    || _         || _        || _        || _        || _        y r   )r   rC   r   signedallenums)r   r   rC   r   rV   rW   s         r   r   zEnumExpr.__init__Z   s%    	$	 r   c                    d| j                   | j                  | j                  | j                  fz  g}d}t	        | j
                        |dz   kD  rj| j
                  j                  d|dz         }|dk  rnE|dz  }|j                  d| j
                  || d       |}t	        | j
                        |dz   kD  rj|j                  d| j
                  |d  d	       d
j                  |      S )Nz%  { "%s", %d, _cffi_prim_int(%s, %s),r   n   rL   d   r   z    ""z" },
)	r   rC   r   rV   r2   rW   findappendrP   )r   linespendingjs       r   r   zEnumExpr.as_c_expra   s    8DIIt<@IIt{{<U U V$-- 7S=0""3#6A1uFALLt}}WQ'?ABG $-- 7S=0 	dmmGH&=?@yyr   c           	         t         t        t        t        t        t
        t        t        d| j                  | j                  f   }dt        | j                        t        |      | j                  d| j                  dS )N))r   r   )r   r   )   r   )rc   r   )   r   )rd   r   )   r   )re   r   r8   z\x00r9   )
PRIM_UINT8	PRIM_INT8PRIM_UINT16
PRIM_INT16PRIM_UINT32
PRIM_INT32PRIM_UINT64
PRIM_INT64r   rV   r=   rC   r   rW   )r   
prim_indexs     r   r"   zEnumExpr.as_python_expro   sa    )***	
 ii$&
 &7t%G%6z%B%)YY? 	?r   Nr#   r'   r   r   rT   rT   Y   s    ! 	?r   rT   c                       e Zd Zd Zd Zd Zy)TypenameExprc                      || _         || _        y r   r   rC   )r   r   rC   s      r   r   zTypenameExpr.__init__{   s    	$r   c                 8    d| j                   | j                  fz  S )Nz  { "%s", %d },rr   r   s    r   r   zTypenameExpr.as_c_expr   s     DIIt#???r   c                 L    dt        | j                        | j                  dS )Nr8   r9   )r=   rC   r   r   s    r   r"   zTypenameExpr.as_python_expr   s    -doo>		JJr   Nr#   r'   r   r   rp   rp   z   s    %@Kr   rp   c                      e Zd ZdZdKdZd Zd Zd Zd Zd Z	g dZ
d	 ZdLd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!dMd!Z"d" Z#d# Z$d$ Z%e%Z&d% Z'd& Z(e(Z)d' Z*e*Z+d( Z,d) Z-d* Z.	 	 dNd+Z/d, Z0d- Z1d. Z2d/ Z3dMd0Z4d1 Z5d2 Z6d3 Z7d4 Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z=d: Z>e>xZ?Z@d; ZAd< ZBd= ZCd> ZDd? ZEeExZFZGd@ ZHdA ZIdB ZJdC ZKdD ZLdE ZMdF ZNeNZOeNZPdG ZQdH ZRdI ZSeSZTdJ ZUy )O
Recompilerr   c                 D    || _         || _        || _        t        | _        y r   )ffimodule_nametarget_is_pythonVERSION_BASE_version)r   rx   ry   rz   s       r   r   zRecompiler.__init__   s     & 0$r   c                 :    t        | j                  |      | _        y r   )maxr|   )r   vers     r   needs_versionzRecompiler.needs_version   s    DMM3/r   c           
         i | _         | j                  d       t        | j                   t              }g | _        |D ]/  }|j
                  s| j                   |   J t        | j                        | j                   |<   | j                  j                  |       |j                  D ]  }t        |t        j                  t        j                  t        j                  t        j                  t        j                  f      sJ | j                   |   "t        | j                        | j                   |<   | j                  j                  |        | j                  j                  d       2 |D ]  }|j
                  r| j                   |    t        | j                        | j                   |<   | j                  j                  |       |j                   sj|j"                  w| j                  j                  d        d | j                   j%                         vsJ i | _        i | _        |D ]V  }t        |t        j*                        rd | j&                  |<   -t        |t        j,                        sHd | j(                  |<   X t/        t        | j&                  d             D ]  \  }}|| j&                  |<    t/        t        | j(                  d             D ]  \  }}|| j(                  |<    |D ];  }t1        | d|j2                  j4                  z         } ||| j                   |          = | j                  D ]  }t        |t6              rJ  t9        | j                        | _        y )NcollecttypekeyENDLENc                     | j                   S r   r   tps    r   <lambda>z/Recompiler.collect_type_table.<locals>.<lambda>       RWWr   c                     | j                   S r   r   r   s    r   r   z/Recompiler.collect_type_table.<locals>.<lambda>   r   r   _emit_bytecode_)
_typesdict	_generatesortedstr
cffi_typesis_raw_functionr2   r^   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_declsr   tp1imethodr:   s          r   collect_type_tablezRecompiler.collect_type_table   s   }%4??4	 B!!r*222&)$//&:#&&r*77C%cENN,1,C,C,1,=,=,1,E,E,1,A,A	,C D D D
 s+3/24??/C,OO**3/ # &&u- " B%%$//"*=*E&)$//&:#&&r*##		(=OO**51  4??113333 !B"e112*.##B'B/"&B	 
 vd&9&9*< > ?EAr&'D#? vdkk*< > ?EArDKKO?
 BT#4r||7L7L#LMF2tr*+ 
 //Bb&))) "0r   c                 >    | j                    }|j                  |      S r   )rz   
enumfields)r   r   expand_anonymous_struct_unions      r   _enum_fieldszRecompiler._enum_fields   s#     -1,A,A(A%}}:;;r   c                    t        |t        j                        s)t        |t              r|D ]  }| j	                  |        y || j
                  vrd | j
                  |<   t        |t        j                        r | j	                  |j                                y t        |t        j                        rn|j                  a|| j                  j                  j                  vr>| j                  |      D ])  \  }}}}| j	                  | j                  |||             + y y y |j                         D ]  \  }}| j	                  |        y y r   )r   r   BaseTypeByIdentityr   _do_collect_typer   r   as_raw_functionr   fldtypesrx   _parser_included_declarationsr   _field_type
_get_items)r   r   xname1r   _s         r   r   zRecompiler._do_collect_type   s   "e667"e$A))!, T__$"&DOOB"e334%%b&8&8&:;B 3 34;;*$(("2"2"I"II,0,=,=b,A(sAq--d.>.>r5#.NO -B J +
 MMODAq))!, , %r   c                    | j                   j                  j                  j                         }t	        |      D ]A  \  }\  }}|j                  dd      \  }}	 t        | d|d|      }	 || _	         |||       C y # t        $ r t        d|z        w xY w# t        $ r}	t        j                  |	|        d }	~	ww xY w)Nr0   r   _generate_cpy_r   z"not implemented in recompile(): %r)rx   r   _declarationsitemsr   splitr   AttributeErrorr   _current_quals	Exceptionr   attach_exception_info)
r   	step_namelstr   r   qualskindrealnamer   es
             r   r   zRecompiler._generate   s    hh,,224!'D+2u!ZZQ/ND(A @I(K L
&+#r8$ "-
 " A'84?A AA  ++At4s$   A?,B?B	B?#B::B?)globalfieldstruct_unionenumtypenamec                 Z   i | _         | j                  D ]  }g | j                   |<    t               | _        | j	                  d       | j                          | j                  D ]A  }| j                   |   }|dk7  r|j                  d        t        |      | j                   |<   C | j                   d   }| j                  j                         D ]3  \  }}|t        |      k  sJ ||   j                  |j                  k(  r3J  t        |      t        | j                        k(  sJ | j                   d   }| j                  j                         D ]3  \  }}|t        |      k  sJ ||   j                  |j                  k(  r3J  t        |      t        | j                        k(  sJ y )Nctxr   c                     | j                   S r   r   )entrys    r   r   z0Recompiler.collect_step_tables.<locals>.<lambda>  s    5::r   r   r   r   )_lsts	ALL_STEPSset_seen_struct_unionsr   _add_missing_struct_unionssortr   r   r   r2   r   r   )r   r   r   r   r   s        r   collect_step_tableszRecompiler.collect_step_tables  sr   
I$&DJJy! (#&5 u'')I**Y'CG#56$)#JDJJy!	 ( jj(((..0EBs3x<<q6;;"''))) 1 3x3t223333jj [[&&(EBs3x<<q6;;"''))) ) 3x3t{{++++r   c                 @    | j                   j                  |dz          y )Nr\   )_fwrite)r   whats     r   _prntzRecompiler._prnt!  s    dTk"r   c                 t    | j                   r|J | j                  |       y |J | j                  ||       y r   )rz   write_py_source_to_fwrite_c_source_to_f)r   fpreambles      r   write_source_to_fzRecompiler.write_source_to_f$  sA      ###%%a('''$$Q1r   c                     t        t        j                  j                  t        j                  j	                  t
              |      d      5 }|j                         cd d d        S # 1 sw Y   y xY w)Nr)openospathrP   dirname__file__	readlines)r   filenamegs      r   _rel_readlineszRecompiler._rel_readlines,  s@    "'',,rwwx8(CSIQ;;= JIIs   A&&A/c           	         || _         | j                  }| j                  j                   |d       t        s |d       | j                  d      }|j                  d      }| j                  d      |||dz     |dj                  |             | j                  j                  d      d	   }| j                  j                   |d
| j                  d        |d       | j                  | j                  j                          |d        |d        |d|        |d        |d|        |d       | j                  d      }|j                  d      }| j                  d      |||dz     |dj                  |             | j                  t                |d        |         ||        |         |d        |         |d       t        | j                  j                         D cg c]	  \  }}||f c}}      }t!        | j"                        D ]=  \  }}	d}
||v rd||   j%                         z   }
 |d||	j'                         |
fz         ? | j"                  s |d        |d        |        t)               | _        | j-                  d       i }| j.                  D ]c  }| j0                  |   }t3        |      ||<   ||   dkD  s) |d|d|d        |D ]  } ||j'                                  |d        |        e | j                  j4                  rf |d!       | j                  j4                  D ].  }	 |j6                  d d" \  }}|t;        d&       |d'|d(       0  |d)        |d        |         |d*        |d+       | j.                  D ]!  }||   dkD  r |d,|z          |d-|z         # | j.                  D ]  }|d.k7  s	 |d/||   |fz          | j                  j4                  r	 |d0       n |d1        |d2t3        | j"                        fz         d}| j<                  dkD  s| j                  j                  |dz  } |d3|z          |d        |         |d4        |d5        |d        |         |d        |d6        |d7|d8        |d9       |dz  r |d:        |d;        |d<        |d=| j>                  z          |d>        |d?        |d@        |dA        |dB        |dC|dD        |dE        |d        |d6        |dF|dG        |d9        |dH| j                  | j>                  fz          |d@        |d        |         |d4        |dI        |d       d | _        y c c}}w # t8        $ r t;        d#| j                  d$|d%      w xY w)JNz#define _CFFI_USE_EMBEDDINGz#define _CFFI_NO_LIMITED_APIz_cffi_include.hz#include "parse_c_type.h"
zparse_c_type.hr   r7   .z#define _CFFI_MODULE_NAME  "r[   z1static const char _CFFI_PYTHON_STARTUP_CODE[] = {z0 };z#ifdef PYPY_VERSIONz3# define _CFFI_PYTHON_STARTUP_FUNC  _cffi_pypyinit_#elsez+# define _CFFI_PYTHON_STARTUP_FUNC  PyInit_#endifz_embedding.hz#include "_cffi_errors.h"
z_cffi_errors.hz>/************************************************************/zstatic void *_cffi_types[] = {z // z/* %2d */ %s,%sz  0z};declr   zstatic const struct _cffi_z	_s _cffi_zs[] = {z.static const char * const _cffi_includes[] = {rc   ffi object 
 includes 8, 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  "z",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_FUNC_cffi_pypyinit_z(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;    return NULL;}z#  ifdef _MSC_VERz     PyMODINIT_FUNCz     PyInit_z(void) { return NULL; }z#  endifPyInit_(void)z5  return _cffi_init("%s", 0x%x, &_cffi_type_context);z#  pragma GCC visibility pop) r   r   rx   
_embeddingUSE_LIMITED_APIr   indexrP   ry   r   _print_string_literal_in_arrayr   VERSION_EMBEDDEDdictr   r   r   r   _get_c_namer   r   _seen_constantsr   r   r   r2   _included_ffis_assigned_sourcer   r   _num_externpyr|   )r   r   r   prntr_   r   base_module_namer   typeindex2typer:   rF   numsr   r   r   ffi_to_includeincluded_module_nameincluded_sourcerD   s                      r   r   zRecompiler.write_c_source_to_f0  s   zz88*.//0 ##$56KK56**+;<a!RWWU^  ++11#6r:88*d6F6FHIDE//0C0CDL&' # $M # $N''7E9:A../?@E!AaCL /0 	MNXMN 	-.doo6K6K6MN6M7B2w6MNOt/EArGN" >!#4#@#@#BB"a%AAB	 0
 KT
  #uv I**Y'C!#hDOI"y* + E*+ !T
 ( 88""AB"&(("9"98&77; :(/ #*+34 4 "689 #: NJF 	NOII"^i/0,y89	 (
 IG#+tI	.JJK ( 88""$%-.%T__)=(??@!TXX%8%8%DQJE!E)*T
 	NOX"#5EGHS	1989 E FM-=>./ S	 	 !"#8HJKZW"245S	DdmmH- - 	.S	X+,X] OH & 8+ !HHn78 88s   9V7
V==&W#c                 (   t        |t              rd|dS t        |t        t        f      rR|D cg c]  }| j	                  |       }}t        |      dk(  r|j                  d       ddj                  |      dS |j                         S c c}w )Nr8   r9   r   r7   (rL   rM   )	r   r   listr   _to_pyr2   r^   rP   r"   )r   r   itemreps       r   r  zRecompiler._to_py  s{    a>!a$'1234;;t$C33x1}

2 XXc],,!!	 4s   Bc           
         || _         | j                  } |d        |d       t        | j                  j                  xs d      }t        |      D ]H  }| j                  j                  |   }	 |j                  d d \  }}|t        d       |d	||fz         J  |         |d
| j                  d        |d| j                  fz         d | _
        t        | j                        | _        | j                  D cg c]  }|j                          }	} |d| j                  dj                  |	            d       t!        | j"                  j%                         D 
cg c]	  \  }
}||
f c}}
      }| j&                  D ]D  }| j(                  |   }t        |      dkD  s!|dk7  s' |d|d| j                  |      d       F |dkD  r5 |ddj                  t        |      D cg c]  }d|z  	 c}      d        |d       y # t        $ r t        d| j                  d|d      w xY wc c}w c c}}
w c c}w )Nz# auto-generated filezimport _cffi_backendr'   rc   r   r   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('rK   z    _version = 0x%x,z    _types = r7   rL   r   r   z    _zs = z    _includes = (r   z_ffi%dz,),rM   )r   r   r2   rx   r
  ranger  r   r   ry   r|   r   r   r!   r  rP   r  r   r   r   r   )r   r   r  num_includesr   r  r  r  r:   	types_lstr   r  r   r   s                 r   r   zRecompiler.write_py_source_to_f  s2   zz 	$%#$ 488228b9|$A!XX44Q7N4"33BQ7 6$o *'45 5 /3G2KKL % 	0@0@BC#t}}&667  048OODObR'')O	D4;;rwwy/A#BDEdoo6K6K6MN6M7B2w6MNO I**Y'C3x!|	W 4DKK4DEF ( !		|1DE1DA8a<1DEFI J 	S	C " 4' .34 44" EN Fs   /H?H9$H>
-I&H6c                      | j                   |   S r   )r   )r   types     r   _gettypenumzRecompiler._gettypenum  s    t$$r   c           
      :   d}t        |t        j                        r|j                         s|j	                         r!|j
                  dk7  rd}d|j
                  z  }n|t        |t        j                        rd|j                  d      d}nL|j                  d      }d|d|j
                  j                  dd	      }|d
v r| j                  t               d}nt        |t        j                        r| j                  ||||       y t        |t        j                  t        j                  f      r;| j                  d|| j                  |      |fz         | j                  d|z         y t        |t        j                         r+d|j                  d      z  }d| j                  |      z  }d}nt#        |      | j                  d|d|d||d       | j                  d|d|j                  d      d|d       | j                  d|z         y )Nr7   _Bool_cffi_to_c_intz, %sr  z)_cffi_to_c_doublez)_cffi_to_c_r0   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)NULL  z = );z  if (z == (rM   z && PyErr_Occurred()))r   r   r   is_complex_typeis_integer_typer   UnknownFloatType
get_c_namereplacer   VERSION_CHAR16CHAR32r   "_convert_funcarg_to_c_ptr_or_arrayr   r   r   r   r5   )	r   r   fromvartovarerrcodeextraarg	convertercnameerrvalues	            r   _convert_funcarg_to_cz Recompiler._convert_funcarg_to_c  s   b%1122;M;M;O!!#7(:,	!BGG+B 6 67 8:}}R7HJ	b)383577??33LN	44&&';<HE--.33B497De779P9PQR JJO 0 0 4g>? @JJy7*+E11202==3DDI)D,<,<R,@@HH &b))

	7HMN

2==$h0 	1

9w&'r   c                     t        |t        j                        r4|j                  d       |j                  d       |j                  d       y y )NzPy_ssize_t datasizez-struct _cffi_freeme_s *large_args_free = NULLzIif (large_args_free != NULL) _cffi_free_array_arguments(large_args_free);)r   r   r   add)r   r   	localvars	freeliness       r   _extra_local_variablesz!Recompiler._extra_local_variables;  sD    b%++,MM/0MMIJMM J K -r   c                    | j                  d       | j                  d| j                  |      ||fz         | j                  d       | j                  d|d|j                  d      d       | j                  d| j                  |      ||fz         | j                  d	       | j                  d
|z         | j                  d       y )Nz1  datasize = _cffi_prepare_pointer_call_argument(z(      _cffi_type(%d), %s, (char **)&%s);z  if (datasize != 0) {z    z  = ((size_t)datasize) <= 640 ? (r7   z!)alloca((size_t)datasize) : NULL;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   r   r1  r2  r3  s        r   r0  z-Recompiler._convert_funcarg_to_c_ptr_or_arrayB  s    

FG

=R '5A2 2 	3

+,

2==$& 	' 	

 #&*&6&6r&:GU%KL 	M

AB

;()

5r   c                    t        |t        j                        r|j                         r"|j                  dk7  rd|d|j                  dS t        |t        j
                        rd|dS |j                  dk7  rN|j                         s>|j                  j                  dd      }|d	v r| j                  t               d
|d|dS d|| j                  |      fz  S t        |t        j                  t        j                  f      rd|| j                  |      fz  S t        |t        j                        r3d|| j                  t        j                  |j                              fz  S t        |t        j                        rB|j                    t#        d|j%                         d|d      d|| j                  |      fz  S t        |t        j&                        rd|| j                  |      fz  S t)        |      )Nr"  z_cffi_from_c_int(r   rM   z_cffi_from_c_double(long doubler0   r   r$  _cffi_from_c_r  z/_cffi_from_c_deref((char *)&%s, _cffi_type(%d))z0_cffi_from_c_pointer((char *)%s, _cffi_type(%d))r9   z' is used as z, but is opaquez0_cffi_from_c_struct((char *)&%s, _cffi_type(%d)))r   r   r   r+  r   r,  r*  r.  r   r/  r   r   r   	ArrayTyper  r   fldnames	TypeErrorr  r   r5   )r   r   varcontextr6  s        r   _convert_expr_from_czRecompiler._convert_expr_from_cP  s   b%112!!#7(:58"''BBB 6 674799M)"2D2D2FS144&&';<05s;;H))"-L/ / /U..0E0EFGET%%b)I+ + +EOO,ET%%e&7&7&@AIC C CE//0{{"NN$g!/ 0 0ET%%b)I+ + +ENN+DT%%b)H+ + + &b))r   c                 .    | j                  |d|d      S )Nz(*(z *)0))_global_typer   r   r   s      r   _typedef_typezRecompiler._typedef_types  s      T%;<<r   c                 F    | j                  | j                  ||             y r   )r   rK  rJ  s      r   !_generate_cpy_typedef_collecttypez,Recompiler._generate_cpy_typedef_collecttypev  s    d00T:;r   c                      y r   r'   rJ  s      r   _generate_cpy_typedef_declz%Recompiler._generate_cpy_typedef_decly      r   c                 r    | j                   |   }| j                  d   j                  t        ||             y )Nr   )r   r   r^   rp   )r   r   r   rC   s       r   _typedef_ctxzRecompiler._typedef_ctx|  s.    __R(


:%%l4&DEr   c                 Z   | j                  ||      }| j                  ||       t        |dd       dk(  r| j                  ||j                  d        y t        |t        j                        r>| j                  |j                  |j                  j                  |j                  |       y y )Noriginunknown_type)
approxname)rV  	named_ptr)	rK  rR  r   _struct_ctxr   r   r   NamedPointerTypetotyperJ  s      r   _generate_cpy_typedef_ctxz$Recompiler._generate_cpy_typedef_ctx  s    D)"d#2x&.8RT:E223RYY		277')  + 4r   c                     | j                  |j                                |j                  r| j                  s| j                  |       y y y r   )r   r   ellipsisrz   rJ  s      r   "_generate_cpy_function_collecttypez-Recompiler._generate_cpy_function_collecttype  s=    b0023;;t44!!"%  5;r   c                    | j                   rJ t        |t        j                        sJ |j                  r| j                  ||       y | j                  }t        |j                        }|dk(  rd}n
|dk(  rd}nd}g }g }d|z  }t        |j                        D ]=  \  }	}
|j                  |
j                  d|	z  |             |j                  d|	z         ? d	j                  |      }|xs d
}|j                  r|j                  dz   }nd}|d|d|d} |d|j                  j                  |              |d       d	j                  |      }d}t        |j                  t        j                        rd} |d||d|d        |d        |d        |d        |d|d|d        |d       d|z  }t        |j                        D ]%  \  }	}
|
j                  d|	z  |      } |d|z         ' t!               }t!               }|j                  D ]  }
| j#                  |
||        t%        |      D ]  } |d|d        t        |j                  t        j                        s7d}d|z  }d|j                  j                  d|      z  } ||        |d       nd }d}t        |j                        dkD  rt'        t        |j                              }|D ]  }	 |d |	z           |         |d!|t        |      t        |      d	j                  |D 	cg c]  }	d"|	z  	 c}	      fz          |d#        |        t        |j                        D ]&  \  }	}
| j)                  |
d$|	z  d|	z  d%        |        (  |d&        |d'       t'        t        |j                              D 	cg c]  }	d|	z  	 }}	d	j                  |      } |d(||d|d)        |d*        |d+        |         |d,       |dk(  r |d-       |rA |d.| j+                  |j                  d/d0      z         |D ]  } |d|z            |d1       n"|D ]  } |d|z            |d2        |d3        |d        |d4       d5 }d6}g }g }d|z  }t        |j                        D ]Q  \  }	}
d} ||
      rd7}d8}|
j                  d9||	fz  |      }|j                  |       |j                  d:||	fz         S |j                  } ||      r?d|z  }|j                  d;|      }|j-                  d|       t        j.                  }d }d<}d8}|rd	j                  |      }|xs d
}|d|d|d} |d|j                  |              |d       |r ||       d	j                  |      } |d(||d|d)       |r |d=        |d       n |d>|d?|        |d@        |        y c c}	w c c}	w )ANr   noargr   arg0r   argument of %sz x%dzx%dr   voidr0   r7   _cffi_d_r  rM   static r   zreturn r(  r)  r   z#ifndef PYPY_VERSIONzstatic PyObject *_cffi_f_z(PyObject *self, PyObject *z  %s;;z	result = result of %sz resultz  PyObject *pyresult;z  PyObject *arg%d;z1  if (!PyArg_UnpackTuple(args, "%s", %d, %d, %s))z&arg%dr   zarg%dzreturn NULLz  Py_BEGIN_ALLOW_THREADSz  _cffi_restore_errno();  { z); }z  _cffi_save_errno();z  Py_END_ALLOW_THREADSz  (void)self; /* unused */z  (void)noarg; /* unused */z  pyresult = %s;resultzresult typez  return pyresult;z  Py_INCREF(Py_None);z  return Py_None;r   c                     t        | t        j                        xs, t        | t        j                        xr | j	                         S r   )r   r   r   PrimitiveTyper*  )r  s    r   need_indirectionz@Recompiler._generate_cpy_function_decl.<locals>.need_indirection  s=    tU%8%89 -e&9&9: ,))+.r   Fr   Tz %sx%dz%sx%dz *resultz
*result = z  return result;z#  define _cffi_f_z	 _cffi_d_r   )rz   r   r   r   r]  _generate_cpy_constant_declr   r2   r   r   r^   r-  rP   abirj  r   r   r=  r   r  r8  rG  insert	void_type)r   r   r   r  numargsargname	argumentscall_argumentsrF  r   r  repr_argumentsro  name_and_argumentsresult_codeargr;  r<  r   result_declrngfreelinerm  
differenceindirection	tp_results                             r   _generate_cpy_function_declz&Recompiler._generate_cpy_function_decl  s   (((("e33444;; ,,R6zzbgg,a<G\GG 	"T) )GAtT__VaZAB!!%!), * 9-'1666&&3,CC36nMBII001CDFGS	>2bii0Kk4@AS	#$ !4IJS	"T) )GAt//&1*g6C3 * E	E	GGD''iC 9%DD"# & "))U^^4%K$t+G!BII$8$8G$LLK()KKrww<!BGG%C)A-. FDc#hC		5A8a<56H8 8 9 #$ )GAt&&tWq[%!)'46F *
 	'('(-23rww<-@A-@%!)-@A>2+t^DE$%%&)*a<./#**299hNO P%TH_% &%&%TH_% &()$%S	W	. 
	"T) )GAtK%!!
//(k1-="=wGCS!!!'[!,<"<= * II	I&$t+G&&z7;CQ$IK&KJ!YYy1N+5vN7:D7E"G	 4 45G HJKI[!!YY~6Nk4HI'(IdDABXg 6 Bs   +X Xc           
         |j                   r| j                  s| j                  ||       y | j                  |j	                            }t        |j                        }| j                  rt        }n|dk(  rt        }n|dk(  rt        }nt        }| j                  d   j                  t        |d|z  t        ||      d|z               y )Nr   r   r   z
_cffi_f_%sz
_cffi_d_%s)r   )r]  rz   _generate_cpy_constant_ctxr   r   r2   r   OP_DLOPEN_FUNCOP_CPYTHON_BLTN_NOP_CPYTHON_BLTN_OOP_CPYTHON_BLTN_Vr   r^   r   r   )r   r   r   rC   rr  	meth_kinds         r   _generate_cpy_function_ctxz%Recompiler._generate_cpy_function_ctx3  s    ;;t44++B5__R%7%7%9:
bgg,  &I\)I\)I)I

8##t\D0i4(4/1	2r   c                     t        |t        j                        ra|j                  }|dk(  r|j	                  d      }d|d|d}| j                  |d|z  |j                        }t        j                  ||      }|S )N...r   z_cffi_array_len((()0)->rM   %s[0])r   r   rB  r   r-  r   r  )r   	tp_struct
field_nametp_fieldactual_lengthptr_struct_nametp_items          r   r   zRecompiler._field_typeI  sr    h0$OOM%"+"6"6s";#Z!1&&y'J2F'/}}6Gw>Hr   c                     | j                  |       | j                  r'|j                         D ]  }| j                  |        y y r   )r   rz   anonymous_struct_fields_struct_collecttype)r   r   fldtypes      r   r  zRecompiler._struct_collecttypeU  s?    b!  557((1 8 !r   c           
         |j                   y | j                  }d|} |d        |d|d|d        |d        |d        |d       | j                  |      D ]  \  }}}}		 |j                         s|d	k\  r|d
k7  r |d|d|d|d       6t	        |t
        j                        rc|j                  |j                  dk(  rH|j                  }|dz   }t	        |t
        j                        r|j                  8|j                  dk(  rH |d|j                  dd|z  |	      d|d         |d        |d|d|d        |        y # t        $ r}
 |dt        |
      z         Y d }
~
d }
~
ww xY w)N_cffi_checkfld__CFFI_UNUSED_FNzstatic void r  z *p)r   z8  /* only to generate compile-time warnings or errors */z
  (void)p;r   r7   z  (void)((p->z) | 0);  /* check that 'r   z' is an integer */r  z[0]ri  z*tmpzfield %rr   z = &p->z; (void)tmp; }z
  /* %s */r   zstruct _cffi_align_z { char x; z y; };)r   r   r   r+  r   r   rB  r   r  r-  r   r   )r   r   r6  rV  r  checkfuncnamefnameftyper-   fqualr   s              r   _struct_declzRecompiler._struct_decl\  sm   ;;zz/9;u=>S	GH\-1->->r-B)E5(E,((*h!m{05ueE F "%9!LL0ELLE4I!JJE!EME "%9!LL0ELLE4I $$VZ-=U$K  .C( 	S	:uMN	 % ,\CF*++,s+   (,EA,EE$E	E? E::E?Nc                    | j                   |   }d }g }t        |t        j                        r|j	                  d       |j
                  |j	                  d       d}|| j                  j                  j                  vr|"|| j                  j                  j                  vr|j
                  n7|j                  st        |j                               rn|j	                  d       |j                  rO|j                  dkD  rt        |d|j                  d      |j	                  d       n|j	                  d	       d
}dj                  |      xs d}g }|t        | j!                  |            }	|	D ]  \  }
}}}| j#                  ||
|      }| j%                  |d|j&                  d|
d       t(        }|dk\  rt*        }d|z  }nQ|&t        |t        j,                        r|j.                  d}n&d||j1                  d      n|j&                  d|
d}||dk\  rd}n.|d|j&                  d|
d}nd|j1                  d      d|
d}|j	                  t3        |
|||t5        || j                   |                       t7        | j8                  d         }| j8                  d   j;                  |       |d}d}d }n,|d!|j&                  d"}d#}nd$|d}d%|d&}d }nd}d'}d'}|}| j8                  d(   j	                  t=        |j&                  |||||||             | j>                  jA                  |       y ))N_CFFI_F_UNION_CFFI_F_OPAQUEopaque_CFFI_F_CHECK_FIELDSr   z is declared with 'pack=zi'; 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 'r   r9   r   z%d /* bits */z
(size_t)-1z	sizeof(((r   r  rM   z(size_t)(((char *)&((z)4096)->z) - (char *)4096)z	offsetof(r7   r   r   z
(size_t)-2unnamedz	sizeof(*(z)0)z-1 /* unknown alignment */zsizeof(zoffsetof(struct _cffi_align_z, y)r   r   )!r   r   r   	UnionTyper^   r   rx   r   r   partialanyr  packedr5   rP   r  r   r   _check_not_opaquer   r;   r<   rB  r   r-  r)   r   r2   r   extendrA   r   r:  )r   r   r6  rV  rW  rC   reason_for_not_expandingrD   rH   r   fldnamer  r-   r  r:   r   offsetrG   alignrF   s                       r   rX  zRecompiler._struct_ctx~  s3   __R(
#' b%//*LL);;LL)*'/$dhh&&==="$(("2"2"I"II{{"s2#=#=#?@34yy99q=- RYY() )
 -.LL+,'1$&3#+d//34J5?1(E**2w@&&w:<''7'KM q=$B*X5D]"7EOO<.'D /8.?c*09?!D =HM)F*!1F + 46==3DgNFgvtX$R)ABDE3 6@8 !$DJJw$7 8JJw&&x0}##(/8~~?D8E ) ,12DDNPEDE ".G

>"))BGGZeW-x9	: 	  $$R(r   c                     t        |t        j                        r'|j                  }t        |t        j                        r't        |t        j                        r|j
                  t        d|z        y y )Nz0%s is of an opaque type (not declared in cdef()))r   r   rB  r  r   r   rD  )r   r   locations      r   r  zRecompiler._check_not_opaque  sb    U__-B U__-b%--.2;;3FBXMO O 4G.r   c                    t        | j                  j                               }|j                  d        |D ]  \  }}|| j                  vs|j
                  rt        d|d      |j                  j                  d      r-|j                  dd  j                         r|j                  dd  }nA|j                  dk(  r$|j                  dk(  rd}| j                  |d       nt        d|      | j                  |d |        y )	Nc                     | d   S )Nr   r'   )tp_orders    r   r   z7Recompiler._add_missing_struct_unions.<locals>.<lambda>  s    hqkr   r   zinternal inconsistency: z* is partial but was not seen at this point$r   _IO_FILEFILE)r  r   r   r   r   r  r5   r   
startswithisdigit	forcenamerR  rX  )r   r   r   orderrV  s        r   r   z%Recompiler._add_missing_struct_unions  s    
 4&&,,./12IB111::->@/C D D 77%%c*rwwqr{/B/B/D!#JWW
*r||v/E!'J%%b&1-/1/4 5 5  T:6 r   c                 &    | j                  |       y r   )r  rJ  s      r    _generate_cpy_struct_collecttypez+Recompiler._generate_cpy_struct_collecttype  s      $r   c                 b    |j                  d      }d|v r||j                  dd      fS |d|z   fS )Nr7   r0   r   )r-  r.  )r   r   r6  s      r   _struct_nameszRecompiler._struct_names  s<    b!%<%--S111#+%%r   c                 H     | j                   |g| j                  |        y r   )r  r  rJ  s      r   _generate_cpy_struct_declz$Recompiler._generate_cpy_struct_decl  s"    "6t11"56r   c                 H     | j                   |g| j                  |        y r   )rX  r  rJ  s      r   _generate_cpy_struct_ctxz#Recompiler._generate_cpy_struct_ctx  s"    5d0045r   c                     t        |t        j                        r| j                  ||       y | j	                  |       y r   )r   r   r   _generate_cpy_enum_collecttyper  rJ  s      r   #_generate_cpy_anonymous_collecttypez.Recompiler._generate_cpy_anonymous_collecttype	  s.    b%..)//D9$$R(r   c                     t        |t        j                        r| j                  |       y | j	                  ||d|z          y Ntypedef_)r   r   r   _generate_cpy_enum_declr  rJ  s      r   _generate_cpy_anonymous_declz'Recompiler._generate_cpy_anonymous_decl  s5    b%..)((,b$
T(9:r   c                     t        |t        j                        r| j                  ||       y | j	                  ||d|z          y r  )r   r   r   	_enum_ctxrX  rJ  s      r   _generate_cpy_anonymous_ctxz&Recompiler._generate_cpy_anonymous_ctx  s5    b%..)NN2t$RzD'89r   c                    ||f| j                   v rt        d|d|d      | j                   j                  ||f       | j                  }d|d|}|r` |d|z          |d        |d|d	        |d
|d|d       ||dkD  rd|fz  } |d|d        |d        |d        |d       n=|J  |d|z          |d        |d|j	                  d      d|d        |d        |        y )Nzduplicate declaration of z 'r9   _cffi_r   z$static int %s(unsigned long long *o)r   z  int n = (z) <= 0;z  *o = (unsigned long long)((z) | 0);  /* check that z is an integer */r   z%dUz  if (!_cffi_check_int(*o, n, z))z    n |= 2;z  return n;r   zstatic void %s(char *o)z  *(r   z)o = rg  )r	  r   r:  r   r-  )r   is_intr   r   categoryr   r  funcnames           r   _generate_cpy_constzRecompiler._generate_cpy_const  s   dt333#6>EG G  (D!12zz$,d37(BCI412:>F G&?"';."8K[JK]#I&&&*X56IR]]3%7>?Ir   c                 d    |j                         }|r| j                  r| j                  |       y y r   )r+  rz   r   r   r   r   r  s       r   "_generate_cpy_constant_collecttypez-Recompiler._generate_cpy_constant_collecttype<  s.    ##%..!!"% /r   c                 J    |j                         }| j                  |||       y r   )r+  r  r  s       r   rn  z&Recompiler._generate_cpy_constant_declA  s"    ##%  r2r   c                    | j                   s!|j                         rt        t        d      }n4| j                   rt        }nt
        }| j                  |   }t        ||      }| j                  d   j                  t        |d|z  |             y )Nr   r   _cffi_const_%s)
rz   r+  r   OP_CONSTANT_INTOP_DLOPEN_CONSTOP_CONSTANTr   r   r^   r   )r   r   r   r   
const_kindrC   s         r   r  z%Recompiler._generate_cpy_constant_ctxE  sy    $$););)=_b1G$$,
(
,JZ4G

8##t-4g>	@r   c                 &    | j                  |       y r   )r   rJ  s      r   r  z)Recompiler._generate_cpy_enum_collecttypeU  s    b!r   c                 J    |j                   D ]  }| j                  d|        y )NT)enumeratorsr  )r   r   r   
enumerators       r   r  z"Recompiler._generate_cpy_enum_declX  s     ..J$$T:6 )r   c           	         | j                   |   }t        t        d      }| j                  r|j	                          t        |j                  |j                        D ]3  \  }}| j                  d   j                  t        |d|z  ||             5 |d|vr| j                  sd|z  }d|z  }nh|j                  | j                  g       }	| j                  j                  |	      }t        t        | j                  j                  |	d            dk        }d	j!                  |j                        }
| j                  d
   j                  t#        |j$                  ||||
             y )Nr   r   r  r   r  z
sizeof(%s)z((%s)-1) <= 0r   rL   r   )r   r   OP_ENUMrz   check_not_partialzipr  
enumvaluesr   r^   r   build_baseinttyperx   sizeofintcastrP   rT   r   )r   r   r6  rC   r   r  	enumvaluer   rV   basetprW   s              r   r  zRecompiler._enum_ctx\  s2   __R(
"%    "%(%G!J	JJx '':'7*'Dg'023 &H
 E!1$:O:O%'D$u,F))$((B7F88??6*DTXX]]6267!;<F88BNN+

6!!RWWj$A	Cr   c                 D    | j                  ||j                                y r   )r  r  rJ  s      r   _generate_cpy_enum_ctxz!Recompiler._generate_cpy_enum_ctxq  s    r2>>+,r   c                      y r   r'   rJ  s      r   _generate_cpy_macro_collecttypez*Recompiler._generate_cpy_macro_collecttypew  rP  r   c                 @    |dk(  rd }n|}| j                  d||       y )Nr  Tr  )r  )r   r   r   r   s       r   _generate_cpy_macro_declz#Recompiler._generate_cpy_macro_declz  s(    ;KK  t Er   c                     |dk(  r| j                   rt        d|d      d }n|}t        t        d      }| j                  d   j                  t        |d|z  ||             y )Nr  z(cannot use the syntax '...' in '#define z ...' when using the ABI moder   r   r  r  )rz   r   r   r  r   r^   r   )r   r   r   r   r   s        r   _generate_cpy_macro_ctxz"Recompiler._generate_cpy_macro_ctx  sm    ;$$',034 4 KK"-

8##t-4g#.0	1r   c                     t        |t        j                        rL|j                  }|dk(  rd|d}| j	                  |j
                  d|z        }t        j                  ||      }|S )Nr  z_cffi_array_len(rM   r  )r   r   rB  r   rI  r  )r   r   global_namer  r  s        r   rI  zRecompiler._global_type  sY    b%//*IIM%9D F'';1FGG-8B	r   c                 F    | j                  | j                  ||             y r   )r   rI  rJ  s      r   "_generate_cpy_variable_collecttypez-Recompiler._generate_cpy_variable_collecttype  s    d//D9:r   c                 R   | j                   }| j                  ||      }t        |t        j                        r|j
                  |j                  }d}nd}d|d} |d|j                  || j                        z           |d        |d|d	|d
        |d        |        y )Nr7   &z*_cffi_var_r  re  r  r   z	  return r  r)  r   )	r   rI  r   r   rB  r   r  r-  r   )r   r   r   r  	ampersandr   s         r   _generate_cpy_variable_declz&Recompiler._generate_cpy_variable_decl  s    zzr4(b%//*ryy/@BII )-.Yt43F3FGGHS	9d34S	r   c           
          | j                  ||      }| j                  |   }| j                  rt        }nt        }| j
                  d   j                  t        |d|z  t        ||                   y )Nr   z_cffi_var_%s)	rI  r   rz   OP_GLOBAL_VAROP_GLOBAL_VAR_Fr   r^   r   r   )r   r   r   rC   r:   s        r   _generate_cpy_variable_ctxz%Recompiler._generate_cpy_variable_ctx  se    r4(__R(
  B B

8##t^d2F2z4JK	Mr   c                 ^    t        |t        j                        sJ | j                  |       y r   )r   r   r   r   rJ  s      r   '_generate_cpy_extern_python_collecttypez2Recompiler._generate_cpy_extern_python_collecttype  s&    "e33444b!r   c           	         | j                   }t        |j                  t        j                        rd}n%d|z  }d|j                  j                  d|      d} |d|z          |d| j                  d|d	|d
        |        g }d|z  }t        |j                        D ]+  \  }}	|	j                  d|z  |      }
|j                  |
       - dj                  |      }|xs d}|d|d}|j                  dk(  rd|z   }d }t        t        |j                        dz  d      } ||j                        rt        |d      }t        |j                  t        j                        r;d|j                  j                  d      ||j                  j                  d      |fz  } |||j                  j                  |              |d        |d|z          |d       t        |j                        D ]f  \  }}	d|z  }
t        |	t        j                        s ||	      rd|
z   }
t        j                  |	      }	 |d|	j                  d      |dz  |
fz         h  |d|z         t        |j                  t        j                        s% |d|j                  j                  d      d        |d         |        | xj                   d!z  c_        y )"Nr  rh  z(int)sizeof(r7   rM   z3static struct _cffi_externpy_s _cffi_externpy__%s =r   r   r1   z	, 0, 0 };rb  z a%dr   rc  r  	__stdcallz_cffi_stdcall c                 X    t        | t        j                        xr | j                  dk(  S )Nr@  )r   r   rl  r   r   s    r   may_need_128_bitsz9Recompiler._extern_python_decl.<locals>.may_need_128_bits  s(    r5#6#67 -GG},.r   re      z!sizeof(%s) > %d ? sizeof(%s) : %dr   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 *(z)p;r   r   )r   r   rj  r   r   r-  ry   r   r   r^   rP   ro  r~   r2   r   r   r  )r   r   r   tag_and_spacer  size_of_resultrF  rt  r   r  ry  rv  rw  r  	size_of_as                  r   _extern_python_declzRecompiler._extern_python_decl  s   zzbii0 N$t+G		$$R14NBTIJdN4 	5	"T) )GAt//&1*g6CS! * 9-'16)-~>66[ !14F!F	. BGGQ*	RYY'Ir*Ibii!4!45;		$$R()		$$R()?5 5I 	}bii&:&:;M&NOPS	_y() )GAt!)C4!4!45%d+Ci((.(DOOC,@!A#s+KKL * 	;dBC"))U^^4ryy';';C'@BCS	ar   c                 *    | j                  ||d       y )Nre  r  rJ  s      r    _generate_cpy_extern_python_declz+Recompiler._generate_cpy_extern_python_decl  s      T95r   c                 *    | j                  ||d       y )NzCFFI_DLLEXPORT r  rJ  s      r   #_generate_cpy_dllexport_python_declz.Recompiler._generate_cpy_dllexport_python_decl  s      T+<=r   c                 *    | j                  ||d       y )Nr7   r  rJ  s      r   '_generate_cpy_extern_python_plus_c_declz2Recompiler._generate_cpy_extern_python_plus_c_decl  s      T2.r   c                     | j                   rt        d      |j                  rt        d      | j                  |   }t        t        |      }| j                  d   j                  t        |d|z  ||             y )Nz,cannot use 'extern "Python"' in the ABI modez$a vararg function is extern "Python"r   z&_cffi_externpy__%s)
rz   r   r]  r5   r   r   OP_EXTERN_PYTHONr   r^   r   )r   r   r   rC   r   s        r   _generate_cpy_extern_python_ctxz*Recompiler._generate_cpy_extern_python_ctx  sw      #@B B;;%&NOO__R(
):6

8##t2T97DI	Kr   c                    | j                   } |d       t        |t              s|j                  d      }n|j	                  d       |j                  d      D ]  }|}t        d      t        u rt        t        |      }nt        |      dd } |d|z   j                                d}|D ]#  }t        |      d	k\  r
 ||       d}|d
|fz  z  }%  ||        y )Nz=// # NB. this is not a string because of a size limit in MSVCzutf-8Tz//r   r   z// r7   L   z%d,)r   r   bytesencodedecode
splitlinesr  mapordasciirstripr2   )r   sr  linerF   printed_linecs          r   r  z)Recompiler._print_string_literal_in_array  s    zzLM!U#!AHHWLL&DGDzU"3~  .2.%'/))+,L|$*&#%L,	 
  'r   c                 F    t        t        t              | j                  |<   y r   )r   OP_PRIMITIVE	PRIM_VOIDr   r   r   r  s      r   _emit_bytecode_VoidTypez"Recompiler._emit_bytecode_VoidType1  s    !'i!@r   c                 d    t         |j                     }t        t        |      | j                  |<   y r   )PRIMITIVE_TO_INDEXr   r   r-  r   )r   r   r  rn   s       r   _emit_bytecode_PrimitiveTypez'Recompiler._emit_bytecode_PrimitiveType4  s%    '0
!'j!Ar   c                     d|j                   d|j                   d|j                   d}t        t        |      | j                  |<   y )Nz_cffi_prim_int(sizeof(z), (
           ((z)-1) | 0 /* check that z' is an integer type */
         ) <= 0)r   r   r-  r   r   r   r  r(  s       r   !_emit_bytecode_UnknownIntegerTypez,Recompiler._emit_bytecode_UnknownIntegerType8  s5     $&77BGGRWW> "(a!8r   c                 x    d|j                   d|j                   d}t        t        |      | j                  |<   y )Nz_cffi_prim_float(sizeof(z) *
           (((z6)1) / 2) * 2 /* integer => 0, float => 1 */
         )r5  r6  s       r   _emit_bytecode_UnknownFloatTypez*Recompiler._emit_bytecode_UnknownFloatType>  s/      WWbgg/ "(a!8r   c                 4   t        t        | j                  |j                           | j                  |<   |dz  }|j
                  D ]e  }| j                  |   }||k7  rJt        |t        j                        r| j                  ||       nt        t        |      | j                  |<   |dz  }g t        |j                        }|j                  -|j                  dk(  r|dz  }nt        d|j                        t        t        |      | j                  |<   y )Nr   r  rc   zabi=)r   OP_FUNCTIONr   rj  r   r   r   r   rl  r3  r;   r  r]  ro  r5   OP_FUNCTION_END)r   r   r  r   	realindexrD   s         r   _emit_bytecode_RawFunctionTypez)Recompiler._emit_bytecode_RawFunctionTypeD  s    !'T__RYY5O!P
77C,I	!c5#6#6755c5A-3GY-GDOOE*QJE  BKK 66vv$
)bff*>??!'!?r   c                 l    t        t        | j                  |j                           | j                  |<   y r   )r   
OP_POINTERr   rZ  r   r/  s      r   _emit_bytecode_PointerTypez%Recompiler._emit_bytecode_PointerTypeW  s$    !'
DOOBII4N!Or   c                 x    |j                         }t        t        | j                  |         | j                  |<   y r   )r   r   r@  r   r   )r   r   r  raws       r   _emit_bytecode_FunctionPtrTypez)Recompiler._emit_bytecode_FunctionPtrType]  s.      "!'
DOOC4H!Ir   c                    | j                   |j                     }|j                  t        t        |      | j
                  |<   y |j                  dk(  r(t        dt        |      j                  dd      d      | j
                  |dz      dk(  sJ t        t        |      | j
                  |<   t        d t        |j                              | j
                  |dz   <   y )Nr  ztype z/*...*/zb badly placed: the '...' array length can only be used on global arrays or on fields of structuresr   r   )
r   r  r   r   OP_OPEN_ARRAYr   r   r   r.  OP_ARRAY)r   r   r  
item_indexs       r   _emit_bytecode_ArrayTypez#Recompiler._emit_bytecode_ArrayTypea  s    __RWW-
99%+M:%FDOOE"YY%# GOOIu589 9
 ??519-666%+Hj%ADOOE")/c"))n)EDOOEAI&r   c                 \    | j                   |   }t        t        |      | j                  |<   y r   )r   r   OP_STRUCT_UNIONr   )r   r   r  struct_indexs       r   _emit_bytecode_StructTypez$Recompiler._emit_bytecode_StructTypeo  s'    **2.!'!Fr   c                 \    | j                   |   }t        t        |      | j                  |<   y r   )r   r   r  r   )r   r   r  
enum_indexs       r   _emit_bytecode_EnumTypez"Recompiler._emit_bytecode_EnumTypet  s$    [[_
!'!<r   F)r7   r   )NconstN)Vr$   r%   r&   r  r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r8  r=  r0  rG  rK  rM  rO  rR  r[  r^  r  r  r   r  r  rX  r  r   r  _generate_cpy_union_collecttyper  r  _generate_cpy_union_declr  _generate_cpy_union_ctxr  r  r  r  r  rn  r  r  r  r  r  r  r  r  rI  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  r0  r3  r7  r9  r>  rA  _emit_bytecode_ConstPointerType_emit_bytecode_NamedPointerTyperD  rI  rM  _emit_bytecode_UnionTyperP  r'   r   r   rv   rv      s   M%081t	<-&& HI,>#2![z"0h%*(XK*F=<F+&
`D2,
2 DT)lO7.%&F#&7866);: CJ(,<&
3@ "7C*-F1";.M"
 ...44 l6>/	K &&&,4AB99@&P 'A#&@#JFG  9=r   rv   )r
   c                        e Zd Z fdZ xZS )NativeIOc                 f    t        |t              r|j                  d      }t        |   |       y )Nr&  )r   unicoder!  superr   )r   r(  r   s     r   r   zNativeIO.write}  s'    !W%HHW%GM!r   )r$   r%   r&   r   __classcell__)r   s   @r   r^  r^  |  s    	 	r   r^  c                     t        | d      S )Nr   )hasattr)	maybefiles    r   _is_file_likerf    s    9g&&r   c                    |rt        d|       t        | ||d u       }|j                          |j                          t	        |      r|j                  ||       yt               }|j                  ||       |j                         }	 t        |d      5 }|j                  t        |      dz         |k7  rt        	 d d d        |rt        d       y# 1 sw Y   xY w# t        $ r d|t        j                         fz  }	t        |	d	      5 }|j                  |       d d d        n# 1 sw Y   nxY w	 t        j                  |	|       Y y# t        $ r/ t        j                   |       t        j                  |	|       Y Y yw xY ww xY w)
Nzgenerating )rz   Tr   r   z(already up-to-date)Fz%s.~%dw)printrv   r   r   rf  r   r^  getvaluer   readr2   OSErrorr   getpidr   renameunlink)
rx   ry   r   target_fileverbose
recompilerr   outputf1tmp_files
             r   _make_c_or_py_sourcerv    s^   ./C.6$.>AJ!!#""$[!$$[(;
A  H-ZZ\F+s#rwws6{Q'61 2 $ () $#  	{BIIK88(C BHHV !  	-IIh,   	-IIk"IIh,	-	sZ   C" 'C C" CC" ".FD+"	F+D4	0F8E4FFFFc                 (    |J t        | ||||      S r   rv  )rx   ry   r   target_c_filerq  s        r   make_c_sourcerz    s&    [(M ') )r   c                      t        | |d ||      S r   rx  )rx   ry   target_py_filerq  s       r   make_py_sourcer}    s    [$ ') )r   c                    |j                  d      }	 t        j                  t        j                  j                  | g|d d         |dxx   |z  cc<   t        j                  j                  | g| |fS # t
        $ r Y :w xY w)Nr   r   )r   r   makedirsr   rP   rl  )	outputdirmodname	extensionpartss       r   _modname_to_filer    sz    MM#E
BGGLL8U3BZ89 
"II77<<	*E*E11  s   6A8 8	BBc                 `    t        ||      }| j                  |||f       t        |||       |S r   )r   r^   setattr)	patchlistclsr   new_metholds        r   _patch_methr    s4    
#t
Cc4%&Cx Jr   c                 F    t        |       D ]  \  }}}t        |||        y r   )reversedr  )r  r  r   old_meths       r   _unpatch_methsr    s$    '	2T8T8$  3r   c                     t         j                  dk(  rddlm} |t	        | |dd        t         j                  dk(  rddlm} fd}t	        | |d	|      y y )
Nr	   r   )MSVCCompiler_remove_visual_c_refc                     |S r   r'   )r   manifest_files     r   r   z&_patch_for_embedding.<locals>.<lambda>  s    Mr   darwin)	CCompilerc                     d| j                   v rDt        | j                         | _         | j                   j                  d      }d| j                   |<    | g|i |S )Nz-bundlez-dynamiclib)	linker_sor  r  )r   r   kwdsr   old_link_shared_objects       r   my_link_shared_objectz3_patch_for_embedding.<locals>.my_link_shared_object  sV    DNN*!%dnn!5NN((3$1q!)$>>>>r   link_shared_object)sysplatformcffi._shimmed_dist_utilsr  r  r  )r  r  r  r  r  s       @r   _patch_for_embeddingr    s`    
||w 	:#	<1GAC ||x6	? "-Y	-A-B"D  r   c                     ddl m} j                  d      r<d d t        j                  dk(  rdz  nt        j                  dk(  rdz  nd	z  t        | |d
fd       y )Nr   )	build_extz.*r  r	   z.dllr  z.dylibz.soget_ext_filenamec                     S r   r'   )r   ext_nametargets     r   r   z#_patch_for_target.<locals>.<lambda>  s    vr   )r  r  endswithr  r  r  )r  r  r  s    ` r   _patch_for_targetr    sf    2 t<<7"fF\\X%hFeOF	9&8-/r   c                    t        |t              s|j                  d      }| j                  r| j	                  |       |m|rt        |      rt        d      | j                  d u}|r| j                  |       |5t        |||      \  }}|r|g|z   }t        j                  j                  | }n|}|	
|rd|z  }	nd}	|rt        j                  ||fi |}nd }t        | ||||      }|rg }t        j                          }	 |rt#        |       |	dk7  rt%        ||	       |r7|dk(  rd}nd}t'        |d	t        j                  j)                  |             t        j*                  |       t        j,                  d|||
      }t        j*                  |       t/        |       |S ||fS |t        ||d
      \  }}t1        | |||      }|r|S d |fS # t        j*                  |       t/        |       w xY w)Nr&  zGWriting to file-like objects is not supported with call_c_compiler=Truez%s.*r   )rq  r   zthe current directory isz setting the current directory tor0   z.py)r   r   r!  _windows_unicode_apply_windows_unicoderf  rD  r  _apply_embedding_fixr  r   r   rP   r   get_extensionrz  getcwdr  r  ri  abspathchdircompiler  r}  )rx   ry   r   tmpdircall_c_compilerc_filesource_extensionextradircompiler_verboser  debuguses_ffiplatformr  	embeddingr  
ext_c_fileextupdatedr  cwdmsgoutputfilenamer   s                          r   	recompiler    s    k3'!((1
""4(}V4 8 9 9^^4/	$$T*>,V[-=?MFE!
U*u-JJ>+-++JLtLCC[(F(8:I))+C*(3S=%i8#}8@S"''//&*ABC !,!4!4S#5Eu"N y)!!<>(eDIFA k6)9;M=  y)s   BG "G:rQ  )	r   TNz.cNr   NNT)%ior   r  	sysconfigr7   r   r   errorr   cffi_opcoder{   r  r/  get_config_varFREE_THREADED_BUILDr  version_infor  r   r)   rA   rT   rp   rv   StringIOr^  BytesIOrf  rv  rz  r}  r  r  r  r  r  r  r'   r   r   <module>r     s<       $   .i../@A LLG+ .s/?/?&/H .##v-L ,+Js/?/?7/J 
1 1 ) )8# #:? ?B	K 	Km= m=`' t{{H2:: '>)
)2%D./" GK;?59#C!r   