???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
MZ0T                 @   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j' Z(d4d5 Z)d6d7 Z*d8d9 Z+d:d; Z,dS )>    N   )allocate_lock)	CDefErrorVerificationErrorVerificationMissing      c             C   s@   | t @ rd|j  }| t@ r(d|j  }| t@ r<d|j  }|S )Nz const z
 volatile z __restrict )Q_CONSTlstrip
Q_VOLATILE
Q_RESTRICT)qualsreplace_with r   /usr/lib64/python3.6/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 }|jddkst|j }|rT|jdr@d|kr@d| }n|d dkrTd| }t||}|jd|}d	|krtd
| j |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 jddS )Nr   r   )r   r   )r    r   r   r   r   /   s    zBaseTypeByIdentity._get_c_namec             C   s   d| j  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||}|j 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| j  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| j |j 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| j 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f Zdd Zdd ZdS )VoidTypec             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 )PrimitiveTyper2   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)r2   )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 )
UnknownIntegerTyper2   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)r2   )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 )UnknownFloatTyper2   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)r2   )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|jd |p@dg}| jdj|f }|d k	r||d d | d |dd   }| jjjd|| _d S )	Nc             S   s   g | ]}|j  qS r   )r   )r1   argr   r   r   r3      s    z-BaseFunctionType.__init__.<locals>.<listcomp>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__)rX   r"   rY   rZ   )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(   rb   r   r   r   r   r`      s   r`   c               @   s    e Zd ZdZdd Zdd ZdS )ra   z(*&)(%s)c             C   s   | j j||}g }x | jD ]}|j|j|| qW f }| jdkrl| jsly|jjf}W n tk
rj   Y nX t	| |dt
||| jf| S )NZ	__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(   rf   r   r   r   r   ra      s   ra   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|j f }|jjd|| _d S )Nz *&z(%s)r   )rh   r   r   r9   r
   r   r   )r    rh   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)rh   r.   rE   )r    r*   r+   ZBItemr   r   r   r(     s    zPointerType.build_backend_typeN)rh   r   )r   )r6   r7   r8   r4   rD   r(   r   r   r   r   rg     s   
rg   c             C   s
   t | tS )N)rg   r	   )rh   r   r   r   ConstPointerType  s    rj   c               @   s   e Zd ZdZdddZdS )	NamedPointerTyperh   r2   r   c             C   s"   t j| || || _|d | _d S )Nr   )rg   rD   r2   r   )r    rh   r2   r   r   r   r   rD     s    zNamedPointerType.__init__N)rh   r2   )r   )r6   r7   r8   r4   rD   r   r   r   r   rk     s   rk   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jd|| _d S )Nz&[]z...z
&[/*...*/]z&[%s]r   )rm   rn   r   r   )r    rm   rn   Zbracketsr   r   r   rD   )  s    zArrayType.__init__c             C   s   t | j|S )N)rl   rm   )r    Z	newlengthr   r   r   resolve_length6  s    zArrayType.resolve_lengthc             C   sJ   | j dkrtd| f | jj|| t| jj||}t| |d|| j S )Nz...z)cannot render the type %r: unknown lengthZnew_array_type)rn   r   rm   r.   rg   rE   )r    r*   r+   ZBPtrItemr   r   r   r(   9  s    

zArrayType.build_backend_typeN)rm   rn   )r6   r7   r8   r4   r9   rD   ro   r(   r   r   r   r   rl   %  s
   rl   rM   c               @   s,   e Zd Zd	ZdZdd Zdd Zdd ZdS )
StructOrUnionOrEnumr2   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   || _ | j  d S )N)rq   rs   )r    rq   r   r   r   force_the_nameL  s    z"StructOrUnionOrEnum.force_the_namec             C   s   | j jdst| j d d S )Nr   r   )r   endswithr   )r    r   r   r   get_official_nameP  s    z%StructOrUnionOrEnum.get_official_name)r2   )r6   r7   r8   r4   rq   rs   rt   rw   r   r   r   r   rp   D  s
   rp   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*   || _ || _|| _|| _|| _| j  d S )N)r2   fldnamesfldtypes
fldbitsizefldqualsrs   )r    r2   ry   rz   r{   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   )rz   zipry   
isinstancerx   )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&|j D ]
}|V  q^W q2||||fV  q2W d S )Nr   r   )r   )	r|   lenry   r}   rz   r{   r~   rx   
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@| j  D ]4\}}}}|j| |j| |j| |j| qW t|| _t|| _t|| _t|| _d S )N)r   r]   rA   ry   rz   r{   r|   )	r    namestypesZbitsizesr|   r2   r   r   r   r   r   r   force_flattenw  s    





zStructOrUnion.force_flattenc             C   s$   t j| |||}|s | j|| |S )N)rp   r.   finish_backend_type)r    r*   r+   r,   r-   r   r   r   r.     s
    
zStructOrUnion.get_cached_btypec                s  | 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
rd} jj||| dd| ntg }| j\}}}	}
x4tt| jD ] }|| }| j| }t|to|jdkrn|jj }t| j|\}}|dkr<| jd	| j| j| p4d
f  |j|}| jd | |f | j|d d   | _|j }t|tr|jd kr|dkstn8 j|}||kr| jd| j| j| pd
||f  |j| qW tt| j|| j	|} jj||| |	|
 d| _ d S )Nr   z(recursive structure declaration for '%s'r   c                s   g | ]}|j  qS r   )r.   )r1   re   )r*   r+   r   r   r3     s   z5StructOrUnion.finish_backend_type.<locals>.<listcomp>r      z...zfield '%s.%s' has a bogus size?z{}z=field '%s.%s' is declared as %d bytes, but is really %d bytesru   ru   )	completedrU   r2   r&   rz   fixedlayoutlistr}   ry   r{   packedrc   Zcomplete_struct_or_unionranger   r~   rl   rn   rm   r.   divmodsizeof_verification_errorro   r   r]   )r    r*   r+   r-   rz   ZlstZsflagsZfieldofsZ	fieldsizeZ	totalsizeZtotalalignmentrJ   ZfsizeZftypeZ	BItemTypeZnlenZnrestZ
BFieldTypeZ	bitemsizer   )r*   r+   r   r     s`    









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| j d S )N)partialr   r   r   )r    r   r   r   check_not_partial  s    zStructOrUnion.check_not_partialc             C   s.   | j   |j|  t| |d| j | j | dS )Nznew_%s_type)key)r   r]   rE   rr   rw   )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   rx   U  s   


<rx   c               @   s   e Zd ZdZdS )
StructTypestructN)r6   r7   r8   rr   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )	UnionTypeunionN)r6   r7   r8   rr   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$   || _ || _|| _|| _| j  d S )N)r2   enumerators
enumvaluesbaseinttypers   )r    r2   r   r   r   r   r   r   rD     s
    zEnumType.__init__c             C   s4   t j| | | jd kr0| j }d|jdd | _d S )Nr   r   _)rp   rt   rq   rw   r   )r    rq   r2   r   r   r   rt     s    
zEnumType.force_the_namec             C   s   | j r| j rt| j d S )N)r   partial_resolvedr   r   )r    r   r   r   r     s    zEnumType.check_not_partialc          
   C   s4   | j   | j||}t| |d| j | j| j|| dS )NZnew_enum_type)r   )r   build_baseinttyperE   rw   r   r   )r    r*   r+   Z
base_btyper   r   r   r(     s    zEnumType.build_backend_typec             C   sH  | j d k	r| j j||S | jr4t| j}t| j}nDdd l}ytj  W n tk
r\   Y nX |j	d| j
   d }}|dk rd}td}td}nd}td}td}|j||}	|j||}
|j|	}|j|
}|d
d| d > ko|dd| | > k r|	S |dd| d > kr4|dd| | > k r4|
S td	| j
  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 longr   z=%s values don't all fit into either 'long' or 'unsigned long'ru   ru   )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   rr   r   r   rD   rt   r   r(   r   r   r   r   r   r     s   
r   c             C   s2   |d krd|  }t |d d d }|j|  d|_|S )Nz$%sunknown_type)r   rt   origin)r2   
structnamere   r   r   r   r   *  s    
r   c             C   s(   |d krd|  }t |d d d }t|| S )Nz$$%s)r   rk   )r2   r   re   r   r   r   unknown_ptr_type2  s    r   c          
   C   sF   t | tjrtS t( tt| ds2tj 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   |j d||f}| sty
|j| S  tk
r8   Y nX yt|j|| }W n4 tk
r } ztd|| |f W Y d d }~X nX |j}t( |j|}	|	d kr|||< |S |	S W d Q R X d S )Nr   z
%s: %r: %s)	popr   Z
_typecacher'   r0   rc   rU   r   get)
Zsrctyper*   funcnamerX   kwdsr   resecacheZres1r   r   r   rE   G  s"    

$
rE   c             C   s   t d| d|S )N?ri   )rE   )r*   r-   r   r   r   pointer_cache^  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_infoa  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`   ra   rg   Z
voidp_typerj   Zconst_voidp_typerk   rl   Zchar_array_typerp   rx   r   r   r   r   r   r   r   r   r   rE   r   r   r   r   r   r   <module>   sN   /	L	 G

