B
    ]T                 @   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   )lib/python3.7/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t| }|rT|dr@d|kr@d| }n|d dkrTd| }t||}|d|}d	|krtd
|  |f |S )N&r   *z&[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   y|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name)r    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%   r.   r/   r5   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 )N)	__class__r5   )r    otherr   r   r   __eq__J   s    zBaseType.__eq__c             C   s
   | |k S )Nr   )r    r=   r   r   r   __ne__N   s    zBaseType.__ne__c             C   s   t | jt|  fS )N)hashr<   tupler5   )r    r   r   r   __hash__Q   s    zBaseType.__hash__N)r6   r7   r8   r>   r?   rB   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)r6   r7   r8   r4   rD   r(   r   r   r   r   rC   U   s   rC   c               @   s   e Zd Zdd ZdS )BasePrimitiveTypec             C   s   dS )NFr   )r    r   r   r   is_complex_typeb   s    z!BasePrimitiveType.is_complex_typeN)r6   r7   r8   rG   r   r   r   r   rF   a   s   rF   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)r2   cifj)3charZshortintlongz	long longzsigned charzunsigned charzunsigned shortzunsigned intzunsigned longzunsigned long longfloatZ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 kst|| _|d | _d S )Nr   )ALL_PRIMITIVE_TYPESr   r2   r   )r    r2   r   r   r   rD      s    zPrimitiveType.__init__c             C   s   | j | j dkS )NrI   )rQ   r2   )r    r   r   r   is_char_type   s    zPrimitiveType.is_char_typec             C   s   | j | j dkS )NrJ   )rQ   r2   )r    r   r   r   r%      s    zPrimitiveType.is_integer_typec             C   s   | j | j dkS )NrK   )rQ   r2   )r    r   r   r   is_float_type   s    zPrimitiveType.is_float_typec             C   s   | j | j dkS )NrL   )rQ   r2   )r    r   r   r   rG      s    zPrimitiveType.is_complex_typec             C   s   t | |d| jS )NZnew_primitive_type)rE   r2   )r    r*   r+   r   r   r   r(      s    z PrimitiveType.build_backend_typeN)r6   r7   r8   r4   rQ   rD   rR   r%   rS   rG   r(   r   r   r   r   rH   f   st   rH   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	UnknownIntegerType)r2   c             C   s   || _ |d | _d S )Nr   )r2   r   )r    r2   r   r   r   rD      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)NotImplementedErrorr2   )r    r*   r+   r   r   r   r(      s    z%UnknownIntegerType.build_backend_typeN)r6   r7   r8   r4   rD   r%   r(   r   r   r   r   rT      s   rT   c               @   s    e Zd ZdZdd Zdd ZdS )UnknownFloatType)r2   c             C   s   || _ |d | _d S )Nr   )r2   r   )r    r2   r   r   r   rD      s    zUnknownFloatType.__init__c             C   s   t d| j d S )Nz2float type '%s' can only be used after compilation)rU   r2   )r    r*   r+   r   r   r   r(      s    z#UnknownFloatType.build_backend_typeN)r6   r7   r8   r4   rD   r(   r   r   r   r   rV      s   rV   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   )r1   argr   r   r   r3      s    z-BaseFunctionType.__init__.<locals>.<listcomp>z...Zvoidz, r   r   r   )	rX   r"   rY   rZ   append_base_patternjoinr   r   )r    rX   r"   rY   rZ   Zreprargsr   r   r   r   rD      s    

 zBaseFunctionType.__init__)N)r6   r7   r8   r4   rD   r   r   r   r   rW      s   rW   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   )r    r*   r+   r   r   r   r(      s    z"RawFunctionType.build_backend_typec             C   s   t | j| j| j| jS )N)FunctionPtrTyperX   r"   rY   rZ   )r    r   r   r   as_function_pointer   s    z#RawFunctionType.as_function_pointerN)r6   r7   r8   r]   r:   r(   ra   r   r   r   r   r_      s   r_   c               @   s    e Zd ZdZdd Zdd ZdS )r`   z(*&)(%s)c             C   s   | j ||}g }x | jD ]}|||| qW d}| jdkrl| jsly|jjf}W n tk
rj   Y nX t	| |dt
||| jf| S )Nr   Z	__stdcallZnew_function_type)r"   r.   rX   r\   rZ   rY   _backendZFFI_STDCALLAttributeErrorrE   rA   )r    r*   r+   r"   rX   tpZabi_argsr   r   r   r(      s    
z"FunctionPtrType.build_backend_typec             C   s   t | j| j| j| jS )N)r_   rX   r"   rY   rZ   )r    r   r   r   as_raw_function  s    zFunctionPtrType.as_raw_functionN)r6   r7   r8   r]   r(   re   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 *&z(%s)r   )rg   r   r   r9   r
   r   r   )r    rg   r   Zextrar   r   r   rD     s    
zPointerType.__init__c             C   s    | j j||dd}t| |d|S )NT)r,   new_pointer_type)rg   r.   rE   )r    r*   r+   ZBItemr   r   r   r(     s    zPointerType.build_backend_typeN)r   )r6   r7   r8   r4   rD   r(   r   r   r   r   rf     s   
rf   c             C   s
   t | tS )N)rf   r	   )rg   r   r   r   ConstPointerType  s    ri   c               @   s   e Zd ZdZdddZdS )NamedPointerType)rg   r2   r   c             C   s"   t | || || _|d | _d S )Nr   )rf   rD   r2   r   )r    rg   r2   r   r   r   r   rD     s    zNamedPointerType.__init__N)r   )r6   r7   r8   r4   rD   r   r   r   r   rj     s   rj   c               @   s,   e Zd ZdZ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&[]z...z
&[/*...*/]z&[%s]r   )rl   rm   r   r   )r    rl   rm   Zbracketsr   r   r   rD   )  s    zArrayType.__init__c             C   s   t | j|S )N)rk   rl   )r    Z	newlengthr   r   r   resolve_length6  s    zArrayType.resolve_lengthc             C   sJ   | j dkrtd| f | j|| t| j||}t| |d|| j S )Nz...z)cannot render the type %r: unknown lengthZnew_array_type)rm   r   rl   r.   rf   rE   )r    r*   r+   ZBPtrItemr   r   r   r(   9  s    

zArrayType.build_backend_typeN)r6   r7   r8   r4   r9   rD   rn   r(   r   r   r   r   rk   %  s
   rk   rM   c               @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )	StructOrUnionOrEnum)r2   Nc             C   s$   | j pd| j| jf }|d | _d S )Nz%s %sr   )	forcenamekindr2   r   )r    r2   r   r   r   build_c_name_with_markerH  s    z,StructOrUnionOrEnum.build_c_name_with_markerc             C   s   || _ |   d S )N)rp   rr   )r    rp   r   r   r   force_the_nameL  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_nameP  s    z%StructOrUnionOrEnum.get_official_name)r6   r7   r8   r4   rp   rr   rs   rv   r   r   r   r   ro   D  s
   ro   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 )N)r2   fldnamesfldtypes
fldbitsizefldqualsrr   )r    r2   rx   ry   rz   r{   r   r   r   rD   [  s    zStructOrUnion.__init__c             c   sB   | j d k	r>x2t| j| j D ] \}}|dkrt|tr|V  qW d S )Nr   )ry   ziprx   
isinstancerw   )r    r2   typer   r   r   anonymous_struct_fieldsc  s    
z%StructOrUnion.anonymous_struct_fieldsTc             c   s   | j }|d krdt| j }xbt| j| j| j|D ]J\}}}}|dkrnt|trn|rnx&| D ]
}|V  q^W q2||||fV  q2W d S )N)r   r   )	r{   lenrx   r|   ry   rz   r}   rw   
enumfields)r    Zexpand_anonymous_struct_unionr{   r2   r~   bitsizer   r"   r   r   r   r   i  s    zStructOrUnion.enumfieldsc       	      C   s~   g }g }g }g }x@|   D ]4\}}}}|| || || || qW t|| _t|| _t|| _t|| _d S )N)r   r\   rA   rx   ry   rz   r{   )	r    namestypesZbitsizesr{   r2   r~   r   r   r   r   r   force_flattenw  s    





zStructOrUnion.force_flattenc             C   s$   t | |||}|s | || |S )N)ro   r.   finish_backend_type)r    r*   r+   r,   r-   r   r   r   r.     s
    
zStructOrUnion.get_cached_btypec                s8  | 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|  nvg }| j\}}}	}
x6tt| jD ]"}|| }| j| }t|tr|jd
kr|j }t| |\}}|dkrX| d| j| j| pPd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  || qW tt| j|| j	|} j||| |	|
 d| _ d S )Nr   z(recursive structure declaration for '%s'r   c                s   g | ]}|  qS r   )r.   )r1   rd   )r*   r+   r   r   r3     s   z5StructOrUnion.finish_backend_type.<locals>.<listcomp>r   )   r   rt   z...zfield '%s.%s' has a bogus size?z{}z=field '%s.%s' is declared as %d bytes, but is really %d bytes)	completedrU   r2   r&   ry   fixedlayoutlistr|   rx   rz   packedrb   Zcomplete_struct_or_unionranger   r}   rk   rm   rl   r.   divmodsizeof_verification_errorrn   r   r\   )r    r*   r+   r-   ry   Zlstextra_flagsZfieldofsZ	fieldsizeZ	totalsizeZtotalalignmentrJ   ZfsizeZftypeZ	BItemTypeZnlenZnrestZ
BFieldTypeZ	bitemsizer   )r*   r+   r   r     sd    











z!StructOrUnion.finish_backend_typec             C   s   t |d S )N)r   )r    msgr   r   r   r     s    z!StructOrUnion._verification_errorc             C   s    | j r| jd krt|  d S )N)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\   rE   rq   rv   )r    r*   r+   r   r   r   r(     s    
z StructOrUnion.build_backend_type)N)T)F)r6   r7   r8   r   r   r   r   rD   r   r   r   r.   r   r   r   r(   r   r   r   r   rw   U  s   


?rw   c               @   s   e Zd ZdZdS )
StructTypeZstructN)r6   r7   r8   rq   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )	UnionTypeunionN)r6   r7   r8   rq   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 )N)r2   enumerators
enumvaluesbaseinttyperr   )r    r2   r   r   r   r   r   r   rD     s
    zEnumType.__init__c             C   s4   t | | | jd kr0|  }d|dd | _d S )Nr   r   _)ro   rs   rp   rv   r   )r    rp   r2   r   r   r   rs     s    
zEnumType.force_the_namec             C   s   | j r| jst|  d S )N)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_type)r   )r   build_baseinttyperE   rv   r   r   )r    r*   r+   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}y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   rN   rO   zunsigned intzunsigned longrt   r   z=%s values don't all fit into either 'long' or 'unsigned long')r   r.   r   minmaxwarningsZ__warningregistry__clear	NameErrorwarnr   rH   r   r   )r    r*   r+   Zsmallest_valueZlargest_valuer   ZsignZ
candidate1Z
candidate2Zbtype1Zbtype2Zsize1Zsize2r   r   r   r     s@    




zEnumType.build_baseinttype)N)r6   r7   r8   rq   r   r   rD   rs   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   rs   origin)r2   
structnamerd   r   r   r   r   -  s    
r   c             C   s(   |d krd|  }t |d d d }t|| S )Nz$$%s)r   rj   )r2   r   rd   r   r   r   unknown_ptr_type5  s    r   c          	   C   sF   t | tjrtS t( tt| ds2t t| _	t| j	S Q R X d S )N__typecache)
r}   r   
ModuleType_typecache_cffi_backendglobal_lockhasattrr~   weakrefWeakValueDictionaryr   )Zbackendr   r   r   get_typecache?  s    r   c       
   
   O   s   | d||f}|rty
|j| S  tk
r6   Y nX yt|j|| }W n4 tk
r } ztd|| |f W d d }~X Y nX |j}t( ||}	|	d kr|||< |S |	S W d Q R X d S )Nr   z
%s: %r: %s)	popr   Z
_typecacher'   r0   rb   rU   r   get)
Zsrctyper*   funcnamerX   kwdsr   ZresecacheZres1r   r   r   rE   J  s"    
$
rE   c             C   s   t d| d|S )N?rh   )rE   )r*   r-   r   r   r   pointer_cachea  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   )rX   r~   str)r   r2   r   r   r   attach_exception_infod  s    r   )N)N)-r   r   lockr   errorr   r   r   r	   r   r   r   objectr   r;   rC   Z	void_typerF   rH   rT   rV   rW   r_   r`   rf   Z
voidp_typeri   Zconst_voidp_typerj   rk   Zchar_array_typero   rw   r   r   r   r   r   r   r   r   r   rE   r   r   r   r   r   r   <module>   sN   /	L	 
G

