a
    |fqW                     @   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   DD:\Projects\storyit_web\backend\venv\Lib\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 | }|rT|dr@d|v r@d| }n|d dvrTd| }t||}|d|}d	|v rt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   /   s    zBaseTypeByIdentity._get_c_namec                 C   s   d|   vS )Nr   r   r$   r   r   r   
has_c_name2   s    zBaseTypeByIdentity.has_c_namec                 C   s   dS NFr   r$   r   r   r   is_integer_type5   s    z"BaseTypeByIdentity.is_integer_typec                 C   sL   z|j |  }W n8 tyF   | ||}|j | |}||u sBJ Y n0 |S N)_cached_btypesKeyErrorbuild_backend_type
setdefault)r    ffi
finishlist	can_delayBTypeZ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   s    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       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(   r2   r3   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   rB   r   r   r   __ne__N   s    zBaseType.__ne__c                 C   s   t | jt|  fS r)   )hashrA   tupler:   r$   r   r   r   __hash__Q   s    zBaseType.__hash__N)r;   r<   r=   rD   rE   rH   r   r   r   r   r@   H   s   r@   c                   @   s    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   s    zVoidType.__init__c                 C   s   t | |dS )NZnew_void_typeglobal_cacher    r.   r/   r   r   r   r,   [   s    zVoidType.build_backend_typeNr;   r<   r=   r9   rJ   r,   r   r   r   r   rI   U   s   rI   c                   @   s   e Zd Zdd ZdS )BasePrimitiveTypec                 C   s   dS r'   r   r$   r   r   r   is_complex_typeb   s    z!BasePrimitiveType.is_complex_typeN)r;   r<   r=   rP   r   r   r   r   rO   a   s   rO   c                4   @   s   e Zd ZdZ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dddddddddddddddddd3Zdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dS )PrimitiveTyper6   cifj)3charshortintlongz	long longzsigned charzunsigned charzunsigned shortunsigned intunsigned longzunsigned long longfloatdoublezlong doublezfloat _Complexzdouble _ComplexZ_BoolZwchar_tZchar16_tZchar32_tZint8_tZuint8_tZint16_tZuint16_tZint32_tZuint32_tZint64_tZuint64_tZint_least8_tZuint_least8_tZint_least16_tZuint_least16_tZint_least32_tZuint_least32_tZint_least64_tZuint_least64_tZint_fast8_tZuint_fast8_tZint_fast16_tZuint_fast16_tZint_fast32_tZuint_fast32_tZint_fast64_tZuint_fast64_tZintptr_tZ	uintptr_tZintmax_tZ	uintmax_tZ	ptrdiff_tZsize_tZssize_tc                 C   s"   || j v sJ || _|d | _d S Nr   )ALL_PRIMITIVE_TYPESr6   r   r    r6   r   r   r   rJ      s    zPrimitiveType.__init__c                 C   s   | j | j dkS )NrS   r`   r6   r$   r   r   r   is_char_type   s    zPrimitiveType.is_char_typec                 C   s   | j | j dkS )NrT   rb   r$   r   r   r   r(      s    zPrimitiveType.is_integer_typec                 C   s   | j | j dkS )NrU   rb   r$   r   r   r   is_float_type   s    zPrimitiveType.is_float_typec                 C   s   | j | j dkS )NrV   rb   r$   r   r   r   rP      s    zPrimitiveType.is_complex_typec                 C   s   t | |d| jS )NZnew_primitive_type)rL   r6   rM   r   r   r   r,      s    z PrimitiveType.build_backend_typeN)r;   r<   r=   r9   r`   rJ   rc   r(   rd   rP   r,   r   r   r   r   rQ   f   sv   7rQ   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UnknownIntegerTyperR   c                 C   s   || _ |d | _d S r_   r6   r   ra   r   r   r   rJ      s    zUnknownIntegerType.__init__c                 C   s   dS )NTr   r$   r   r   r   r(      s    z"UnknownIntegerType.is_integer_typec                 C   s   t d| j d S )Nz4integer type '%s' can only be used after compilationNotImplementedErrorr6   rM   r   r   r   r,      s    z%UnknownIntegerType.build_backend_typeN)r;   r<   r=   r9   rJ   r(   r,   r   r   r   r   re      s   re   c                   @   s    e Zd ZdZdd Zdd ZdS )UnknownFloatTyperR   c                 C   s   || _ |d | _d S r_   rf   ra   r   r   r   rJ      s    zUnknownFloatType.__init__c                 C   s   t d| j d S )Nz2float type '%s' can only be used after compilationrg   rM   r   r   r   r,      s    z#UnknownFloatType.build_backend_typeNrN   r   r   r   r   ri      s   ri   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r8|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%   )r5   argr   r   r   r7      r8   z-BaseFunctionType.__init__.<locals>.<listcomp>...Zvoidz, r   r   r   )	rk   r"   rl   rm   append_base_patternjoinr   r   )r    rk   r"   rl   rm   Zreprargsr   r   r   r   rJ      s    

 zBaseFunctionType.__init__)Nr;   r<   r=   r9   rJ   r   r   r   r   rj      s   rj   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 d S )NzPcannot render the type %r: it is a function type, not a pointer-to-function type)r   rM   r   r   r   r,      s    z"RawFunctionType.build_backend_typec                 C   s   t | j| j| j| jS r)   )FunctionPtrTyperk   r"   rl   rm   r$   r   r   r   as_function_pointer   s    z#RawFunctionType.as_function_pointerN)r;   r<   r=   rq   r?   r,   rv   r   r   r   r   rt      s   rt   c                   @   s    e Zd ZdZdd Zdd ZdS )ru   z(*&)(%s)c                 C   s   | j ||}g }| jD ]}|||| qd}| jdkrf| jsfz|jjf}W n tyd   Y n0 t	| |dt
||| jg|R  S )Nr   Z	__stdcallZnew_function_type)r"   r2   rk   rp   rm   rl   _backendZFFI_STDCALLAttributeErrorrL   rG   )r    r.   r/   r"   rk   tpZabi_argsr   r   r   r,      s     

z"FunctionPtrType.build_backend_typec                 C   s   t | j| j| j| jS r)   )rt   rk   r"   rl   rm   r$   r   r   r   as_raw_function  s    zFunctionPtrType.as_raw_functionN)r;   r<   r=   rq   r,   rz   r   r   r   r   ru      s   ru   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   r>   r
   r   r   )r    r|   r   extrar   r   r   rJ     s    
zPointerType.__init__c                 C   s    | j j||dd}t| |d|S )NT)r0   new_pointer_type)r|   r2   rL   )r    r.   r/   ZBItemr   r   r   r,     s    zPointerType.build_backend_typeN)r   rN   r   r   r   r   r{     s   
r{   c                 C   s
   t | tS r)   )r{   r	   )r|   r   r   r   ConstPointerType  s    r   c                   @   s   e Zd ZdZdddZdS )NamedPointerType)r|   r6   r   c                 C   s"   t | || || _|d | _d S r_   )r{   rJ   r6   r   )r    r|   r6   r   r   r   r   rJ     s    zNamedPointerType.__init__N)r   rs   r   r   r   r   r     s   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&[]ro   z
&[/*...*/]z&[%s]r   )r   r   r   r   )r    r   r   Zbracketsr   r   r   rJ   )  s    zArrayType.__init__c                 C   s   t | jtS r)   )
isinstancer   strr$   r   r   r   length_is_unknown6  s    zArrayType.length_is_unknownc                 C   s   t | j|S r)   )r   r   )r    Z	newlengthr   r   r   resolve_length9  s    zArrayType.resolve_lengthc                 C   sH   |   rtd| f | j|| t| j||}t| |d|| jS )Nz)cannot render the type %r: unknown lengthZnew_array_type)r   r   r   r2   r{   rL   r   )r    r.   r/   ZBPtrItemr   r   r   r,   <  s    zArrayType.build_backend_typeN)	r;   r<   r=   r9   r>   rJ   r   r   r,   r   r   r   r   r   %  s   r   rW   c                   @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	StructOrUnionOrEnumrR   Nc                 C   s$   | j pd| j| jf }|d | _d S )Nz%s %sr   )	forcenamekindr6   r   ra   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;   r<   r=   r9   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)   )r6   fldnamesfldtypes
fldbitsizefldqualsr   )r    r6   r   r   r   r   r   r   r   rJ   ^  s    zStructOrUnion.__init__c                 c   s>   | j d ur:t| j| j D ] \}}|dkrt|tr|V  qd S )Nr   )r   zipr   r   r   )r    r6   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 ]F\}}}}|dkrht|trh|rh| D ]
}|V  qZq0||||fV  q0d S )N)r   r   )	r   lenr   r   r   r   r   r   
enumfields)r    Zexpand_anonymous_struct_unionr   r6   r   bitsizer   r"   r   r   r   r   l  s    

zStructOrUnion.enumfieldsc           	      C   sz   g }g }g }g }|   D ]4\}}}}|| || || || qt|| _t|| _t|| _t|| _d S r)   )r   rp   rG   r   r   r   r   )	r    namestypesZbitsizesr   r6   r   r   r   r   r   r   force_flattenz  s    





zStructOrUnion.force_flattenc                 C   s$   t | |||}|s | || |S r)   )r   r2   finish_backend_type)r    r.   r/   r0   r1   r   r   r   r2     s    
zStructOrUnion.get_cached_btypec                    s2  | j r$| j dkr td| jf d S  j|  }d| _ | jd u rBn| jd u r fdd| jD }tt| j|| j	}d}| j
r| j
dkrd}n
d| j
f} jj||| d	d	g|R   nng }| j\}}}	}
tt| jD ] }|| }| j| }t|tr| r|j }t| |\}}|dkrT| d
| j| j| pLdf  ||}| jd | |f | j|d d   | _| }t|tr|jd u r|dksJ n8 |}||kr| d| j| j| pd||f  || qtt| j|| j	|} j||| |	|
 d| _ d S )Nr   z(recursive structure declaration for '%s'r   c                    s   g | ]}|  qS r   )r2   )r5   ry   r.   r/   r   r   r7     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)	completedrh   r6   r*   r   fixedlayoutlistr   r   r   packedrw   Zcomplete_struct_or_unionranger   r   r   r   r   r2   divmodsizeof_verification_errorr   r   rp   )r    r.   r/   r1   r   lstextra_flagsZfieldofsZ	fieldsizeZ	totalsizeZtotalalignmentrT   ZfsizeZftypeZ	BItemTypenlenZnrestZ
BFieldTypeZ	bitemsizer   r   r   r     s|    










z!StructOrUnion.finish_backend_typec                 C   s   t |d S r)   )r   )r    msgr   r   r   r     s    z!StructOrUnion._verification_errorc                 C   s    | j r| jd u rt|  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   rp   rL   r   r   rM   r   r   r   r,     s
    
z StructOrUnion.build_backend_type)N)T)F)r;   r<   r=   r   r   r   r   rJ   r   r   r   r2   r   r   r   r,   r   r   r   r   r   X  s   


?r   c                   @   s   e Zd ZdZdS )
StructTypestructNr;   r<   r=   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )	UnionTypeunionNr   r   r   r   r   r     s   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)   )r6   enumerators
enumvaluesbaseinttyper   )r    r6   r   r   r   r   r   r   rJ     s
    zEnumType.__init__c                 C   s4   t | | | jd u r0|  }d|dd | _d S )Nr   r   _)r   r   r   r   r   )r    r   r6   r   r   r   r     s    
zEnumType.force_the_namec                 C   s   | j r| jst|  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 )NZnew_enum_typer   )r   build_baseinttyperL   r   r   r   )r    r.   r/   Z
base_btyper   r   r   r,     s    zEnumType.build_backend_typec                 C   sH  | j d ur| j ||S | jr4t| j}t| j}nBdd l}zt  W n tyZ   Y n0 |	d| 
   d }}|dk rd}td}td}nd}td}td}|||}	|||}
||	}||
}|dd	| d > kr|dd	| | > k r|	S |dd	| d > kr4|dd	| | > k r4|
S td
| 
  d S )Nr   zU%r has no values explicitly defined; guessing that it is equivalent to 'unsigned int'r   rY   rZ   r[   r\   r   r   z=%s values don't all fit into either 'long' or 'unsigned long')r   r2   r   minmaxwarningsZ__warningregistry__clear	NameErrorwarnr   rQ   r   r   )r    r.   r/   Zsmallest_valueZlargest_valuer   signZ
candidate1Z
candidate2Zbtype1Zbtype2Zsize1Zsize2r   r   r   r     sH    




zEnumType.build_baseinttype)N)r;   r<   r=   r   r   r   rJ   r   r   r,   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r6   Z
structnamery   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6 tt| ds2t t| _	t| j	W  d    S 1 sP0    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y6   Y n0 zt|j|| }W n6 ty } ztd|| |f W Y d }~n
d }~0 0 |j}tN ||}	|	d u r|||< |W  d    S |	W  d    S W d    n1 s0    Y  d S )Nr   z
%s: %r: %s)popZ
_typecacher+   r4   rw   rh   r   get)
Zsrctyper.   funcnamerk   kwdsr   resecacheZres1r   r   r   rL   M  s"    (
rL   c                 C   s   t d| d|S )N?r~   rK   )r.   r1   r   r   r   pointer_cached  s    r   c                 C   s@   | j r<t| j d tu r<d|| j d f f| j dd   | _ d S )Nr   z%s: %sr   )rk   r   r   )r   r6   r   r   r   attach_exception_infog  s    r   )N)N)-r   r   lockr   errorr   r   r   r	   r   r   r   objectr   r@   rI   Z	void_typerO   rQ   re   ri   rj   rt   ru   r{   Z
voidp_typer   Zconst_voidp_typer   r   Zchar_array_typer   r   r   r   r   r   r   r   r   r   r   rL   r   r   r   r   r   r   <module>   sN   /	L	 
G

