o
    
cU                     @   s  d dl Z d dlZddlmZ ddlmZmZmZ dZdZ	dZ
dd ZG d	d
 d
eZG dd deZG dd deZe ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeeZdd  ZeeZG d!d" d"eZG d#d$ d$eZeed%dZG d&d' d'eZG d(d) d)eZ G d*d+ d+e Z!G d,d- d-e Z"G d.d/ d/eZ#d<d0d1Z$d<d2d3Z%e Z&e' Z(d4d5 Z)d6d7 Z*d8d9 Z+d:d; Z,dS )=    N   )allocate_lock)	CDefErrorVerificationErrorVerificationMissing      c                 C   s@   | t @ r
d|  }| t@ rd|  }| t@ rd|  }|S )Nz const z
 volatile z __restrict )Q_CONSTlstrip
Q_VOLATILE
Q_RESTRICT)qualsreplace_with r   7/opt/certbot/lib/python3.10/site-packages/cffi/model.pyqualify   s   r   c                   @   sP   e Zd ZdZdZdddZdd Zd	d
 Zdd ZdddZ	dd Z
dd ZdS )BaseTypeByIdentityF a C filer   c                 C   s   | j }|ddksJ | }|r*|dr d|v r d| }n
|d dvr*d| }t||}|d|}d	|v rCtd
|  |f |S )N&r   *z&[(%s)r   z[( $z-cannot generate '%s' in %s: unknown type name)c_name_with_markercountstrip
startswithr   replacer   _get_c_name)selfr   contextr   resultr   r   r   
get_c_name   s"   


zBaseTypeByIdentity.get_c_namec                 C   s   | j ddS )Nr   r   )r   r   r    r   r   r   r   /      zBaseTypeByIdentity._get_c_namec                 C   s   d|   vS )Nr   r   r$   r   r   r   
has_c_name2      zBaseTypeByIdentity.has_c_namec                 C      dS NFr   r$   r   r   r   is_integer_type5      z"BaseTypeByIdentity.is_integer_typec                 C   sL   z|j |  }W |S  ty%   | ||}|j | |}||u s"J Y |S w N)_cached_btypesKeyErrorbuild_backend_type
setdefault)r    ffi
finishlist	can_delayBTypeBType2r   r   r   get_cached_btype8   s   z#BaseTypeByIdentity.get_cached_btypec                 C   s   d|   f S )Nz<%s>r&   r$   r   r   r   __repr__A   r%   zBaseTypeByIdentity.__repr__c                    s    fdd j D S )Nc                    s   g | ]	}|t  |fqS r   )getattr).0namer$   r   r   
<listcomp>E   s    z1BaseTypeByIdentity._get_items.<locals>.<listcomp>)_attrs_r$   r   r$   r   
_get_itemsD   s   zBaseTypeByIdentity._get_itemsN)r   r   r   F)__name__
__module____qualname__is_array_typeis_raw_functionr#   r   r'   r+   r7   r8   r>   r   r   r   r   r      s    

	r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BaseTypec                 C   s   | j |j ko|  | kS r-   )	__class__r>   r    otherr   r   r   __eq__J   s   zBaseType.__eq__c                 C   s
   | |k S r-   r   rG   r   r   r   __ne__N      
zBaseType.__ne__c                 C   s   t | jt|  fS r-   )hashrF   tupler>   r$   r   r   r   __hash__Q      zBaseType.__hash__N)r@   rA   rB   rI   rJ   rN   r   r   r   r   rE   H   s    rE   c                   @       e Zd ZdZdd Zdd ZdS )VoidTyper   c                 C   s
   d| _ d S )Nzvoid&)r   r$   r   r   r   __init__X   rK   zVoidType.__init__c                 C   s   t | |dS )Nnew_void_typeglobal_cacher    r2   r3   r   r   r   r0   [   r(   zVoidType.build_backend_typeNr@   rA   rB   r=   rR   r0   r   r   r   r   rQ   U   s    rQ   c                   @   s   e Zd Zdd ZdS )BasePrimitiveTypec                 C   r)   r*   r   r$   r   r   r   is_complex_typeb   r,   z!BasePrimitiveType.is_complex_typeN)r@   rA   rB   rY   r   r   r   r   rX   a   s    rX   c                   @   s~  e Zd ZdZi ddddddddddd	dd
dddddddddddddddddddddi ddddddddddddddddddd dd!dd"dd#dd$dd%dd&dd'di d(dd)dd*dd+dd,dd-dd.dd/dd0dd1dd2dd3dd4dd5dd6dd7dd8dZd9d: Zd;d< Zd=d> Zd?d@ ZdAdB Z	dCdD Z
dES )FPrimitiveTyper;   charcshortiintlongz	long longzsigned charzunsigned charzunsigned shortunsigned intunsigned longzunsigned long longfloatfdoublezlong doublezfloat _Complexjzdouble _Complex_Boolwchar_tchar16_tchar32_tint8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tint_least8_tuint_least8_tint_least16_tuint_least16_tint_least32_tuint_least32_tint_least64_tuint_least64_tint_fast8_tuint_fast8_tint_fast16_tuint_fast16_tint_fast32_tuint_fast32_tint_fast64_tuint_fast64_tintptr_t	uintptr_tintmax_t	uintmax_t	ptrdiff_tsize_tssize_tc                 C   s"   || j v sJ || _|d | _d S Nr   )ALL_PRIMITIVE_TYPESr;   r   r    r;   r   r   r   rR         zPrimitiveType.__init__c                 C      | j | j dkS )Nr]   r   r;   r$   r   r   r   is_char_type      zPrimitiveType.is_char_typec                 C   r   )Nr_   r   r$   r   r   r   r+      r   zPrimitiveType.is_integer_typec                 C   r   )Nre   r   r$   r   r   r   is_float_type   r   zPrimitiveType.is_float_typec                 C   r   )Nrg   r   r$   r   r   r   rY      r   zPrimitiveType.is_complex_typec                 C   s   t | |d| jS )Nnew_primitive_type)rU   r;   rV   r   r   r   r0      r   z PrimitiveType.build_backend_typeN)r@   rA   rB   r=   r   rR   r   r+   r   rY   r0   r   r   r   r   rZ   f   s    	
 !"#$%&'()*+,-./012347rZ   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UnknownIntegerTyper[   c                 C      || _ |d | _d S r   r;   r   r   r   r   r   rR         zUnknownIntegerType.__init__c                 C   r)   )NTr   r$   r   r   r   r+      r,   z"UnknownIntegerType.is_integer_typec                 C      t d| j )Nz4integer type '%s' can only be used after compilationNotImplementedErrorr;   rV   r   r   r   r0         z%UnknownIntegerType.build_backend_typeN)r@   rA   rB   r=   rR   r+   r0   r   r   r   r   r      s
    r   c                   @   rP   )UnknownFloatTyper[   c                 C   r   r   r   r   r   r   r   rR      r   zUnknownFloatType.__init__c                 C   r   )Nz2float type '%s' can only be used after compilationr   rV   r   r   r   r0      r   z#UnknownFloatType.build_backend_typeNrW   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdddZdS )BaseFunctionType)argsr"   ellipsisabiNc                 C   s   || _ || _|| _|| _dd | j D }| jr|d |p dg}| jd|f }|d ur>|d d | d |dd   }| jjd|| _d S )	Nc                 S   s   g | ]}|  qS r   r&   )r:   argr   r   r   r<      s    z-BaseFunctionType.__init__.<locals>.<listcomp>...voidz, r   r   r   )	r   r"   r   r   append_base_patternjoinr   r   )r    r   r"   r   r   reprargsr   r   r   r   rR      s   

 zBaseFunctionType.__init__r-   r@   rA   rB   r=   rR   r   r   r   r   r          r   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )RawFunctionTypez(&)(%s)Tc                 C   s   t d| f )NzPcannot render the type %r: it is a function type, not a pointer-to-function type)r   rV   r   r   r   r0      r   z"RawFunctionType.build_backend_typec                 C      t | j| j| j| jS r-   )FunctionPtrTyper   r"   r   r   r$   r   r   r   as_function_pointer   rO   z#RawFunctionType.as_function_pointerN)r@   rA   rB   r   rD   r0   r   r   r   r   r   r      s
    r   c                   @   rP   )r   z(*&)(%s)c                 C   s   | j ||}g }| jD ]}|||| qd}| jdkr3| js3z|jjf}W n	 ty2   Y nw t	| |dt
||| jg|R  S )Nr   	__stdcallnew_function_type)r"   r7   r   r   r   r   _backendFFI_STDCALLAttributeErrorrU   rM   )r    r2   r3   r"   r   tpabi_argsr   r   r   r0      s"   

z"FunctionPtrType.build_backend_typec                 C   r   r-   )r   r   r"   r   r   r$   r   r   r   as_raw_function  rO   zFunctionPtrType.as_raw_functionN)r@   rA   rB   r   r0   r   r   r   r   r   r      s    r   c                   @   s"   e Zd ZdZdddZdd ZdS )	PointerType)totyper   r   c                 C   s>   || _ || _t|d}|jrd| f }|jd|| _d S )Nz *&r   r   )r   r   r   rC   r
   r   r   )r    r   r   extrar   r   r   rR     s   
zPointerType.__init__c                 C   s    | j j||dd}t| |d|S )NT)r4   new_pointer_type)r   r7   rU   )r    r2   r3   BItemr   r   r   r0     s   zPointerType.build_backend_typeNr   rW   r   r   r   r   r     s    
r   c                 C   s
   t | tS r-   )r   r	   )r   r   r   r   ConstPointerType  rK   r   c                   @   s   e Zd ZdZdddZdS )NamedPointerType)r   r;   r   c                 C   s"   t | || || _|d | _d S r   )r   rR   r;   r   )r    r   r;   r   r   r   r   rR     r   zNamedPointerType.__init__Nr   r   r   r   r   r   r     r   r   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )	ArrayType)itemlengthTc                 C   sF   || _ || _|d u rd}n|dkrd}nd| }| j jd|| _d S )Nz&[]r   z
&[/*...*/]z&[%s]r   )r   r   r   r   )r    r   r   bracketsr   r   r   rR   )  s   zArrayType.__init__c                 C   s   t | jtS r-   )
isinstancer   strr$   r   r   r   length_is_unknown6  r(   zArrayType.length_is_unknownc                 C   s   t | j|S r-   )r   r   )r    	newlengthr   r   r   resolve_length9  r(   zArrayType.resolve_lengthc                 C   sH   |   rtd| f | j|| t| j||}t| |d|| jS )Nz)cannot render the type %r: unknown lengthnew_array_type)r   r   r   r7   r   rU   r   )r    r2   r3   BPtrItemr   r   r   r0   <  s   zArrayType.build_backend_typeN)	r@   rA   rB   r=   rC   rR   r   r   r0   r   r   r   r   r   %  s    r   r\   c                   @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	StructOrUnionOrEnumr[   Nc                 C   s$   | j p
d| j| jf }|d | _d S )Nz%s %sr   )	forcenamekindr;   r   r   r   r   r   build_c_name_with_markerK  s   z,StructOrUnionOrEnum.build_c_name_with_markerc                 C   s   || _ |   d S r-   )r   r   )r    r   r   r   r   force_the_nameO  s   z"StructOrUnionOrEnum.force_the_namec                 C   s   | j dsJ | j d d S )Nr   )r   endswithr$   r   r   r   get_official_nameS  s   z%StructOrUnionOrEnum.get_official_name)r@   rA   rB   r=   r   r   r   r   r   r   r   r   r   G  s    r   c                   @   sj   e Zd ZdZdZdZdZdddZdd Zdd	d
Z	dd Z
dddZdd Zdd Zdd Zdd ZdS )StructOrUnionNr   Fc                 C   s*   || _ || _|| _|| _|| _|   d S r-   )r;   fldnamesfldtypes
fldbitsizefldqualsr   )r    r;   r   r   r   r   r   r   r   rR   ^  s   zStructOrUnion.__init__c                 c   sD    | j d urt| j| j D ]\}}|dkrt|tr|V  qd S d S )Nr   )r   zipr   r   r   )r    r;   typer   r   r   anonymous_struct_fieldsf  s   
z%StructOrUnion.anonymous_struct_fieldsTc                 c   s~    | j }|d u rdt| j }t| j| j| j|D ]#\}}}}|dkr5t|tr5|r5| D ]}|V  q.q||||fV  qd S )Nr   r   )	r   lenr   r   r   r   r   r   
enumfields)r    expand_anonymous_struct_unionr   r;   r   bitsizer   r"   r   r   r   r   l  s   
zStructOrUnion.enumfieldsc           	      C   sz   g }g }g }g }|   D ]\}}}}|| || || || qt|| _t|| _t|| _t|| _d S r-   )r   r   rM   r   r   r   r   )	r    namestypesbitsizesr   r;   r   r   r   r   r   r   force_flattenz  s   





zStructOrUnion.force_flattenc                 C   s$   t | |||}|s| || |S r-   )r   r7   finish_backend_type)r    r2   r3   r4   r5   r   r   r   r7     s   
zStructOrUnion.get_cached_btypec                    s  | j r| j dkrtd| jf d S  j|  }d| _ | jd u r n| jd u r[ fdd| jD }tt| j|| j	}d}| j
rL| j
dkrGd}nd| j
f} jj||| d	d	g|R   ng }| j\}}}	}
tt| jD ]}|| }| j| }t|tr| r|j }t| |\}}|dkr| d
| j| j| pdf  ||}| jd | |f | j|d d   | _| }t|tr|jd u r|dksJ n |}||kr| d| j| j| pd||f  || qktt| j|| j	|} j||| |	|
 d| _ d S )Nr   z(recursive structure declaration for '%s'r   c                    s   g | ]}|  qS r   )r7   )r:   r   r2   r3   r   r   r<     s    z5StructOrUnion.finish_backend_type.<locals>.<listcomp>r   )   r   r   zfield '%s.%s' has a bogus size?z{}z=field '%s.%s' is declared as %d bytes, but is really %d bytes)	completedr   r;   r.   r   fixedlayoutlistr   r   r   packedr   complete_struct_or_unionranger   r   r   r   r   r7   divmodsizeof_verification_errorr   r   r   )r    r2   r3   r5   r   lstextra_flagsfieldofs	fieldsize	totalsizetotalalignmentr_   fsizeftype	BItemTypenlennrest
BFieldType	bitemsizer   r   r   r     s|   










z!StructOrUnion.finish_backend_typec                 C   s   t |r-   )r   )r    msgr   r   r   r     s   z!StructOrUnion._verification_errorc                 C   s$   | j r| jd u rt|  d S d S r-   )partialr   r   r   r$   r   r   r   check_not_partial  s   zStructOrUnion.check_not_partialc                 C   s.   |    ||  t| |d| j |  | dS )Nznew_%s_typekey)r   r   rU   r   r   rV   r   r   r   r0     s
   
z StructOrUnion.build_backend_typer-   )Tr?   )r@   rA   rB   r   r   r   r   rR   r   r   r   r7   r   r   r   r0   r   r   r   r   r   X  s    


?r   c                   @      e Zd ZdZdS )
StructTypestructNr@   rA   rB   r   r   r   r   r   r        r  c                   @   r   )	UnionTypeunionNr  r   r   r   r   r    r  r  c                   @   sB   e Zd ZdZdZdZdddZdd Zdd	 Zd
d Z	dd Z
dS )EnumTypeenumFNc                 C   s$   || _ || _|| _|| _|   d S r-   )r;   enumerators
enumvaluesbaseinttyper   )r    r;   r	  r
  r  r   r   r   rR     s
   zEnumType.__init__c                 C   s8   t | | | jd u r|  }d|dd | _d S d S )Nr   r   _)r   r   r   r   r   )r    r   r;   r   r   r   r     s
   
zEnumType.force_the_namec                 C   s    | j r| jst|  d S d S r-   )r   partial_resolvedr   r   r$   r   r   r   r     s   zEnumType.check_not_partialc              
   C   s4   |    | ||}t| |d|  | j| j|| dS )Nnew_enum_typer   )r   build_baseinttyperU   r   r	  r
  )r    r2   r3   
base_btyper   r   r   r0     s   zEnumType.build_backend_typec                 C   s<  | j d ur| j ||S | jrt| j}t| j}n!dd l}zt  W n	 ty-   Y nw |	d| 
   d }}|dk rJd}td}td}n
d}td}td}|||}	|||}
||	}||
}|dd	| d > kr|dd	| | > k r|	S |dd	| d > kr|dd	| | > k r|
S td
| 
  )Nr   zU%r has no values explicitly defined; guessing that it is equivalent to 'unsigned int'r   r`   ra   rb   rc   r   r   z=%s values don't all fit into either 'long' or 'unsigned long')r  r7   r
  minmaxwarnings__warningregistry__clear	NameErrorwarnr   rZ   r   r   )r    r2   r3   smallest_valuelargest_valuer  sign
candidate1
candidate2btype1btype2size1size2r   r   r   r    sJ   




zEnumType.build_baseinttyper-   )r@   rA   rB   r   r   r  rR   r   r   r0   r  r   r   r   r   r    s    
r  c                 C   s2   |d u rd|  }t |d d d }||  d|_|S )Nz$%sunknown_type)r  r   originr;   
structnamer   r   r   r   r!  0  s   
r!  c                 C   s(   |d u rd|  }t |d d d }t|| S )Nz$$%s)r  r   r#  r   r   r   unknown_ptr_type8  s   
r%  c                 C   s^   t | tjrtS t tt| dst t| _	t| j	W  d    S 1 s(w   Y  d S )N__typecache)
r   r   
ModuleType_typecache_cffi_backendglobal_lockhasattrr   weakrefWeakValueDictionaryr&  )backendr   r   r   get_typecacheB  s   $r.  c           
   
   O   s   | d||f}|rJ z|j| W S  ty   Y nw z
t|j|| }W n ty; } z	td|| |f d }~ww |j}t  ||}	|	d u rX|||< |W  d    S |	W  d    S 1 sdw   Y  d S )Nr   z
%s: %r: %s)pop
_typecacher/   r9   r   r   r)  get)
srctyper2   funcnamer   kwdsr   resecacheres1r   r   r   rU   M  s,   
$rU   c                 C   s   t d| d|S )N?r   rT   )r2   r5   r   r   r   pointer_cached  r%   r:  c                 C   sH   | j r t| j d tu r"d|| j d f f| j dd   | _ d S d S d S )Nr   z%s: %sr   )r   r   r   )r6  r;   r   r   r   attach_exception_infog  s   (r;  r-   )-r   r+  lockr   errorr   r   r   r	   r   r   r   objectr   rE   rQ   	void_typerX   rZ   r   r   r   r   r   r   
voidp_typer   const_voidp_typer   r   char_array_typer   r   r  r  r  r!  r%  r)  r,  r(  r.  rU   r:  r;  r   r   r   r   <module>   sP    /	L	 

G
