U
    ڲg%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   ./tmp/pip-unpacked-wheel-lbi5ej3i/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t| }|rT|dr@d|kr@d| }n|d dkrTd| }t||}|d|}d	|krtd
|  |f |S )N&r   *z&[(%s)r   z[( $z-cannot generate '%s' in %s: unknown type name)	c_name_with_markercountAssertionError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|   k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   sN   z|j |  }W n: tk
rH   | ||}|j | |}||ksDtY nX |S N)_cached_btypesKeyErrorbuild_backend_type
setdefaultr   )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   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)   r3   r4   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/   r0   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r7   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_cffi_float_complex_tZ_cffi_double_complex_tZ_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 kst|| _|d | _d S Nr   )ALL_PRIMITIVE_TYPESr   r7   r   r!   r7   r   r   r   rJ      s    zPrimitiveType.__init__c                 C   s   | j | j dkS )NrS   r`   r7   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   r7   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_   r7   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NotImplementedErrorr7   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 k	r||d d | d |dd   }| jjd|| _d S )	Nc                 S   s   g | ]}|  qS r   r&   )r6   argr   r   r   r8      s     z-BaseFunctionType.__init__.<locals>.<listcomp>...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=   rr   r?   r-   rw   r   r   r   r   ru      s   ru   c                   @   s    e Zd ZdZdd Zdd ZdS )rv   z(*&)(%s)c                 C   s   | j ||}g }| jD ]}|||| qd}| jdkrh| jshz|jjf}W n tk
rf   Y nX t	| |dt
||| jf| S )Nr   Z	__stdcallZnew_function_type)r#   r3   rk   rq   rm   rl   _backendZFFI_STDCALLAttributeErrorrL   rG   )r!   r/   r0   r#   rk   tpZabi_argsr   r   r   r-      s$    

  z"FunctionPtrType.build_backend_typec                 C   s   t | j| j| j| jS r*   )ru   rk   r#   rl   rm   r%   r   r   r   as_raw_function  s    zFunctionPtrType.as_raw_functionN)r;   r<   r=   rr   r-   r{   r   r   r   r   rv      s   rv   c                   @   s"   e Zd ZdZdddZdd ZdS )	PointerType)totyper   r   c                 C   sB   || _ || _d}|jr$d| f }t||}|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)r1   new_pointer_type)r}   r3   rL   )r!   r/   r0   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}   r7   r   c                 C   s"   t | || || _|d | _d S r_   )r|   rJ   r7   r   )r!   r}   r7   r   r   r   r   rJ      s    zNamedPointerType.__init__N)r   rt   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 k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_unknown7  s    zArrayType.length_is_unknownc                 C   s   t | j|S r*   )r   r   )r!   Z	newlengthr   r   r   resolve_length:  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   r3   r|   rL   r   )r!   r/   r0   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kindr7   r   ra   r   r   r   build_c_name_with_markerL  s    z,StructOrUnionOrEnum.build_c_name_with_markerc                 C   s   || _ |   d S r*   )r   r   )r!   r   r   r   r   force_the_nameP  s    z"StructOrUnionOrEnum.force_the_namec                 C   s   | j dst| j d d S )Nr   )r   endswithr   r%   r   r   r   get_official_nameT  s    z%StructOrUnionOrEnum.get_official_name)r;   r<   r=   r9   r   r   r   r   r   r   r   r   r   H  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*   )r7   fldnamesfldtypes
fldbitsizefldqualsr   )r!   r7   r   r   r   r   r   r   r   rJ   _  s    zStructOrUnion.__init__c                 c   s>   | j d k	r:t| j| j D ] \}}|dkrt|tr|V  qd S )Nr   )r   zipr   r   r   )r!   r7   typer   r   r   anonymous_struct_fieldsg  s    
z%StructOrUnion.anonymous_struct_fieldsTc                 c   s|   | j }|d k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   r7   r   bitsizer   r#   r   r   r   r   m  s    
 
zStructOrUnion.enumfieldsc           	      C   sz   g }g }g }g }|   D ]4\}}}}|| || || || qt|| _t|| _t|| _t|| _d S r*   )r   rq   rG   r   r   r   r   )	r!   namestypesZbitsizesr   r7   r   r   r   r   r   r   force_flatten{  s    





zStructOrUnion.force_flattenc                 C   s$   t | |||}|s | || |S r*   )r   r3   finish_backend_type)r!   r/   r0   r1   r2   r   r   r   r3     s    
zStructOrUnion.get_cached_btypec                    s0  | j r$| j dkr td| jf d S  j|  }d| _ | jd krBn| jd k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	f|  nng }| j\}}}	}
tt| jD ] }|| }| j| }t|tr| r|j }t| |\}}|dkrR| d
| j| j| pJdf  ||}| jd | |f | j|d d   | _| }t|tr|jd kr|dkst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   )r3   )r6   rz   r/   r0   r   r   r8     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   r7   r+   r   fixedlayoutlistr   r   r   packedrx   Zcomplete_struct_or_unionranger   r   r   r   r   r3   divmodsizeof_verification_errorr   r   r   rq   )r!   r/   r0   r2   r   lstextra_flagsZfieldofsZ	fieldsizeZ	totalsizeZtotalalignmentrT   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 k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   rq   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   r3   r   r   r   r-   r   r   r   r   r   Y  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*   )r7   enumerators
enumvaluesbaseinttyper   )r!   r7   r   r   r   r   r   r   rJ     s
    zEnumType.__init__c                 C   s4   t | | | jd kr0|  }d|dd | _d S )Nr   r   _)r   r   r   r   r   )r!   r   r7   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/   r0   Z
base_btyper   r   r   r-      s      zEnumType.build_backend_typec                 C   sJ  | j d k	r| j ||S | jr4t| j}t| j}nDdd l}zt  W n tk
r\   Y nX |	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r6|dd	| | > k r6|
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   r3   r   minmaxwarnings__warningregistry__clear	NameErrorwarnr    rQ   r   r   )r!   r/   r0   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 krd|  }t |d d d }||  d|_|S )Nz$%sunknown_type)r   r   originr7   Z
structnamerz   r   r   r   r   1  s    
r   c                 C   s(   |d krd|  }t |d d d }t|| S )Nz$$%s)r   r   r   r   r   r   unknown_ptr_type9  s    r   c              
   C   sR   t | tjrtS t4 tt| ds2t t| _	t| j	W  5 Q R  S Q R X d S )N__typecache)
r   r   
ModuleType_typecache_cffi_backendglobal_lockhasattrr   weakrefWeakValueDictionaryr   )backendr   r   r   get_typecacheC  s    r   c           
   
   O   s   | d||f}|rtz|j| W S  tk
r8   Y nX zt|j|| }W n4 tk
r } ztd|| |f W 5 d }~X Y nX |j}t@ ||}	|	d kr|||< |W  5 Q R  S |	W  5 Q R  S W 5 Q R X d S )Nr   z
%s: %r: %s)	popr   Z
_typecacher,   r5   rx   rh   r   get)
Zsrctyper/   funcnamerk   kwdsr   resecacheZres1r   r   r   rL   N  s"    $
rL   c                 C   s   t d| d|S )N?r   rK   )r/   r2   r   r   r   pointer_cachee  s    r   c                 C   s@   | j r<t| j d tkr<d|| j d f f| j dd   | _ d S )Nr   z%s: %sr   )rk   r   r   )r   r7   r   r   r   attach_exception_infoh  s    r   )N)N)-r   r   lockr   errorr   r   r   r	   r   r   r   objectr   r@   rI   Z	void_typerO   rQ   re   ri   rj   ru   rv   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

