o
    f                    @   s>  d dl mZ d dlZd dlZd dlZzd dlZW n ey%   d dlZY nw ddlm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZmZmZmZmZ ddlmZ ddlmZ h dZdd Z d;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'G dd de&Z(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.G d)d* d*e&Z/G d+d, d,e&Z0G d-d. d.e0Z1G d/d0 d0e0Z2G d1d2 d2e&Z3G d3d4 d4e&Z4G d5d6 d6e&Z5G d7d8 d8e&Z6G d9d: d:e&Z7dS )<    )absolute_importN   )try_finally_contextmanager   )warningerrorInternalErrorperformance_hint)EncodedString)OptionsNaming)
PyrexTypes)py_object_typeunspecified_type)pyfunction_signaturepymethod_signaturerichcmp_special_methodsget_slot_tableget_property_accessor_signature)Future)Code>$   _Complex, _Imaginarydoifforintautocasecharelseenumgotolongvoid_Boolbreakconstfloatshortunionwhiledoubleexterninlinereturnsignedsizeofstaticstructswitchdefaulttypedefcontinueregisterrestrictunsignedvolatilec                 C   s:   | d d dkr|  tjs| dv r| tv rtj|  } | S )Nr   __)__weakref____dict__)
startswithr   pyrex_prefixiso_c99_keywordscname rC   R/var/www/html/mig_web/myenv/lib/python3.10/site-packages/Cython/Compiler/Symtab.pyc_safe_identifier'   s
   
rE   c                 C   sx   z|  d W | S  ty;   |  dddd} |r&d|| f } Y | S | tjr8| tjtjd} Y | S Y | S w )Nasciipunycode   -   _z%s_%sr   )encodeUnicodeEncodeErrorreplacedecoder>   r   r?   pyunicode_identifier_prefix)rB   mangle_withrC   rC   rD   punycodify_name/   s    rP   c                   @       e Zd ZdZdd Zdd ZdS )	BufferAuxFc                 C   s   || _ || _d S N)buflocal_nd_var	rcbuf_var)selfrT   rU   rC   rC   rD   __init__I   s   
zBufferAux.__init__c                 C   s
   d| j  S )Nz<BufferAux %r>)r=   rV   rC   rC   rD   __repr__M      
zBufferAux.__repr__N)__name__
__module____qualname__writable_neededrW   rY   rC   rC   rC   rD   rR   F       rR   c                   @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(g Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdddZMd	d
 ZNdd ZOdd ZPdd ZQdd ZRdd ZSeTdd ZUdd ZVdd ZWdS )EntryFr    NprivateTc                 C   s@   || _ || _|| _|| _|| _g | _g | _g | _g | _| | _	d S rS   )
namerB   typeposinitoverloaded_alternativescf_assignmentscf_referencesinner_entriesdefining_entry)rV   rc   rB   rd   re   rf   rC   rC   rD   rW      s   
zEntry.__init__c                 C   s   dt | jt| | j| j f S )Nz%s(<%x>, name=%s, type=%s))rd   r[   idrc   rX   rC   rC   rD   rY     s   zEntry.__repr__c                 C   s   t | jd d S )NPrevious declaration is here)r   re   rX   rC   rC   rD   already_declared_here     zEntry.already_declared_herec                 C   s   t |d| j  |   d S )Nz('%s' does not match previous declaration)r   rc   rn   )rV   re   rC   rC   rD   
redeclared	     zEntry.redeclaredc                 C      | g| j  S rS   )rg   rX   rC   rC   rD   all_alternatives     zEntry.all_alternativesc                 C   rr   rS   )rj   rX   rC   rC   rD   all_entries  rt   zEntry.all_entriesc                 C   s0   t | trt |tr| j| jf|j|jfk S tS rS   )
isinstancer`   rc   rB   NotImplemented)leftrightrC   rC   rD   __lt__  s   zEntry.__lt__c                 C   s   t | jdkS Nr   )lenrh   rX   rC   rC   rD   cf_is_reassigned  s   zEntry.cf_is_reassignedc                 C   s0   | j jsJ d| _| jrJ tjdd| _d S )NTOptionalLocalsCppSupport.cpp)rd   is_cpp_classis_cpp_optionalutility_coder   UtilityCodeload_cachedutility_code_definitionrX   rC   rC   rD   make_cpp_optional  s   
zEntry.make_cpp_optionalc                 C   s   | j r|| j v S dS NF)pytyping_modifiers)rV   modifier_namerC   rC   rD   declared_with_pytyping_modifier#     z%Entry.declared_with_pytyping_modifierNN)Xr[   r\   r]   inline_func_in_pxdborrowedrf   
annotationpep563_annotation
visibility
is_builtin
is_cglobalis_pyglobal	is_memberis_pyclass_attris_variableis_cfunction
is_cmethodis_builtin_cmethodis_unbound_cmethodis_final_cmethodis_inline_cmethodis_anonymousis_type	is_cclassr   is_constis_propertyis_cproperty	doc_cnamegetter_cnamesetter_cnameis_self_argis_argis_local
in_closurefrom_closurein_subscopeis_declared_genericis_readonlypyfunc_cname
func_cnamefunc_modifiersfinal_func_cnamedocas_variablexdecref_cleanupin_cinclude	as_moduleis_inheritedpystring_cnameis_identifieris_internedused
is_specialdefined_in_pxdis_implementedapir   is_overridable
buffer_aux
prev_entrymight_overflowfused_cfunctionis_fused_specializedr   needs_propertyin_with_gil_blockfrom_cython_utility_codeerror_on_uninitializedcf_usedouter_entry
is_cgetterr   known_standard_library_importr   enum_int_valuevtable_typerW   rY   rn   rp   rs   ru   rz   propertyr}   r   r   rC   rC   rC   rD   r`   Q   s    [

r`   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )

InnerEntryzK
    An entry in a closure scope that represents the real outer Entry.
    Tc                 C   sz   t | |j|j|j|j || _|| _|}|jr|j}|js|| _|j	| _	|j
| _
|j| _|j| _|j| _| j	|  d S rS   )r`   rW   rc   rB   rd   re   r   scoperk   rj   rh   ri   rg   r   append)rV   r   r   outermost_entryrC   rC   rD   rW   -  s$   
zInnerEntry.__init__c                 C   s   | dr	t|t| j|S )Nr;   )r>   AttributeErrorgetattrrk   rV   rc   rC   rC   rD   __getattr__A  s   
zInnerEntry.__getattr__c                 C   
   | j  S rS   )rk   ru   rX   rC   rC   rD   ru   G  rZ   zInnerEntry.all_entriesN)r[   r\   r]   __doc__r   rW   r   ru   rC   rC   rC   rD   r   '  s    r   c                   @   s^  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZg ZdZdd Zdd	 Zdxd
dZdd Zdd ZdyddZdd Zdd ZdyddZdd Z dd Z!dd Z"e#dyddZ$dzd d!Z%d"d# Z&d{d%d&Z'	'	d|d(d)Z(		d}d*d+Z)			d~d,d-Z*	.	dd0d1Z+d2d3 Z,d4d5 Z-	dd6d7Z.d8d9 Z/	$	dd:d;Z0dd<d=Z1d>d? Z2d@dA Z3ddBdCZ4ddDdEZ5dFdG Z6dHdI Z7dJdK Z8		ddLdMZ9		ddNdOZ:ddPdQZ;dRdS Z<dTdU Z=dVdW Z>dXdY Z?dZd[ Z@d\d] ZAd^d_ ZBd`da ZCdbdc ZDddde ZEdfdg ZFdhdi ZGdjdk ZHdldm ZIdndo ZJdpdq ZKdrds ZLdtdu ZMddvdwZNdS )Scoper   Fra   NTc                 C   s   || _ || _|| _dt||ddf }|  }|r(||| _|j| | _nt	|| _|| _i | _
t | _g | _g | _g | _g | _g | _g | _g | _g | _g | _i | _i | _i | _i | _i | _g | _g | _i | _| jD ]}| jt	|t d d qmd S )Nz%d%s_._dot_re   )!rc   outer_scopeparent_scoper|   rL   qualifying_scopequalify_namequalified_namescope_prefixr
   entriesset	subscopesconst_entriestype_entriessue_entriesarg_entriesvar_entriespyfunc_entriescfunc_entriesc_class_entriesdefined_c_classesimported_c_classescname_to_entryidentifier_to_entrynum_to_entryobj_to_entrybuffer_entrieslambda_defsid_countersscope_predefined_namesdeclare_varr   )rV   rc   r   r   mangled_name
qual_scopevar_namerC   rC   rD   rW     s@   

zScope.__init__c                 C      | S rS   rC   )rV   memorC   rC   rD   __deepcopy__     zScope.__deepcopy__c           
      C   s   g }|j  D ]\}}|r||v r|js|r|||f q| j | dD ]'}t| |}tdd |D }	t||D ]}|jsB|rL|j|	vrL|| q;q&d S )N)r   r   r   r   r   r   r   r   c                 s   s    | ]}|j V  qd S rS   rc   ).0erC   rC   rD   	<genexpr>  s    z!Scope.merge_in.<locals>.<genexpr>)r   itemsr   r   updater   r   rc   )
rV   othermerge_unused	allowlistr   rc   entryattrself_entriesnamesrC   rC   rD   merge_in  s    


zScope.merge_inc                 C   s   d| j j| jf S )Nz<%s %s>)	__class__r[   r   rX   rC   rC   rD   __str__     zScope.__str__c                 C      | j S rS   r   rX   rC   rC   rD   r        zScope.qualifying_scopec                 C   s(   |rt d|| j|f S | j|| jS )Nz%s%s%s)rP   r   r   manglerc   rV   prefixrc   rC   rC   rD   r    s   zScope.manglec                 C   s   dt j|f }| |S )Nz%s%s_)r   r?   r  )rV   rc   r  rC   rC   rD   mangle_internal  s   
zScope.mangle_internalc                 C   s   | j r	| j |S |S rS   )r   mangle_class_private_namer   rC   rC   rD   r    s   zScope.mangle_class_private_namec                 C   sZ   |   j}z|| d }W n ty   d}Y nw |||< |r)|s#|S d||f S d| S )Nr   r   z%s%dz%d)global_scoper   KeyError)rV   rc   counterscountrC   rC   rD   next_id  s   
zScope.next_idc                 C   r   z6 Return the module-level scope containing this scope. )r   r  rX   rC   rC   rD   r       
zScope.global_scopec                 C   r   r!  )r   builtin_scoperX   rC   rC   rD   r#    r"  zScope.builtin_scopec                 c   s6    | V  | j rt| j tddD ]}|V  qd S d S )Nr   )key)r   sortedoperator
attrgetter)rV   r   rC   rC   rD   iter_local_scopes  s   zScope.iter_local_scopesc                 c   s&    | j }|d ur|| _ d V  || _ d S rS   )in_c_type_context)rV   r)  old_c_type_contextrC   rC   rD   new_c_type_context  s   
zScope.new_c_type_contextc	                 C   sf  |j rt| tst|d | js |r td|r t|d| d | j}	|r||	v r|s| j	s|	| }
d}|j
rX|
jj
rX|  rX|
 D ]}||jkrU|dkrS|jsSd} nqCd}|r[n,| jrd|	| jrdn#|dkrvt|d	| | jrrd
nd n|dkrt|d	|  |	|   t||||d}| j|_||_|r| ||_|s||	|< |jr|j|_| |_||_|S )Nz5Buffer types only allowed as function local variablesz
^_[_A-Z]+$z'%s' is a reserved name in C.F<init>Tr,   '%s' redeclared r   r   ignorer   )	is_bufferrv   
LocalScoper   r   rematchr   r   is_builtin_scoper   rd   is_cpprs   argsis_cpp_class_scoper   rn   r`   create_wrapperr   r   is_memoryviewslicedefault_valuerf   r   r   )rV   rc   rB   rd   re   r   shadowr   r8  r   	old_entrycpp_override_allowed	alt_entryr  rC   rC   rD   declare  sJ   

zScope.declarec                 C   s   t d| j|f S Nz%s.%s)r
   r   r   rC   rC   rD   r   ;  r  zScope.qualify_namerb   c	           
      C   sP   |s| j s|dks|r|}n| tj|}| j||||||d}	d|	_||	_|	S )Npublic)r8  r   )r   r  r   enum_prefixr?  r   
value_node)
rV   rc   rd   valuere   rB   r   r   r8  r  rC   rC   rD   declare_const>  s   zScope.declare_constr   c
              	   C   sZ   |s|}| j ||||||dd}
d|
_||
_|r| j|
 |	s+t|dd d u r+|
|_|
S )NT)r   r   r  )r?  r   r   r   r   r   r  )rV   rc   rd   re   rB   r   r   definingr;  templater  rC   rC   rD   declare_typeJ  s   zScope.declare_typec              
   C   s   |s| j s|dks|r|}n| tj|}z| jr"| j| jj}nd }t	
||||dk|}W n tyM }	 zt||	jd  t	j}W Y d }	~	nd }	~	ww | j||||||d}
|
j|_|
S )Nrb   r,   r   )r   r   )r   r  r   type_prefixr7  r   lookuprc   rd   r   create_typedef_type
ValueErrorr   r6  
error_typerH  r   )rV   rc   	base_typere   rB   r   r   	namespacerd   r  r  rC   rC   rD   declare_typedef^  s,   
zScope.declare_typedefc
              	   C   s$  |s| j s|dks|r|}n| tj|}| |}
|
sD|  }tj||||||	|d}| j|||||||d ud}
| j	
|
 |
|_n?|
jrQ|
jjrQ|
jj|ksZt|d| d n)|ri|
jjrit|d| d n| |
|| | |
|| |r||
j_| j
|
 | jr| j| jj|
j_|
S )NrA  )in_cpp)r   r   rF  '%s' redeclared  r   2'%s' already defined  (ignoring second definition))r   r  r   rI  lookup_herer5  r   CStructOrUnionTyperH  r   r   r  r   rd   is_struct_or_unionkindr   r   check_previous_typedef_flagcheck_previous_visibilityr   r7  r   rJ  rc   rO  )rV   rc   rW  r   typedef_flagre   rB   r   r   packedr  rQ  rd   rC   rC   rD   declare_struct_or_unionu  s<   
zScope.declare_struct_or_unionrC   r,   c           
         s  |d u r| j s|dkr|}n| tj|}t|}| |}|s>tj|||||d}	| j||	|||d ud}| j	
| n^|jrE|jjsRtd|  |  d S |ra|jjratd| d n|rm||j_| j
| |r|jjr|jj|krtd |  n||j_|s|jjr||jjkrtd |   fd	d
 |r || |jddt|j|jd | jr| j| jj|j_|S )Nrb   )	templates)r   rF  r.  rS  r   -Base type does not match previous declarationz5Template parameters do not match previous declarationc                    sJ   |D ] }|t ju r
q|jd u rtd q | |j | jj| qd S )Nz#Cannot inherit from incomplete type)r   rM  r   r   base_classesrd    declare_inherited_cpp_attributes)r  r_  
base_classdeclare_inherited_attributesre   rC   rD   rc    s   

z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesthis)rc   rB   rd   re   )r   r  r   rI  listrT  r   CppClassTyperH  r   r   r   rd   r   r   rn   r   r   r   r_  r]  r   CPtrTypere   r7  r   rJ  rc   rO  )
rV   rc   r   re   rB   r_  r   r]  r  rd   rC   rb  rD   declare_cpp_class  sN   




	
zScope.declare_cpp_classc                 C   s0   ||j jkrt|d|jd|j j f  d S d S )Nz#'%s' previously declared using '%s')cdefctypedef)rd   rZ  r   rc   )rV   r  rZ  re   rC   rC   rD   rX    s
   z!Scope.check_previous_typedef_flagc                 C   s(   |j |krt|d|j|j f  d S d S )Nz '%s' previously declared as '%s')r   r   rc   )rV   r  r   re   rC   rC   rD   rY    s
   
zScope.check_previous_visibilityc
                 C   s   |r@|s| j s|dks|dks|r|}n| tj|}| jr'| j| jj}
nd }
|r5t	j
|||
|	d}nt	j||||
|	d}nt	j}| j||||||d}|r]tjdd|_| | ||_g |_| j| |S )NrA  r,   )r   )rB   r   r   EnumClassDeclr   )r   r  r   rI  r7  r   rJ  rc   rd   r   CppScopedEnumType	CEnumTypec_anon_enum_typerH  r   r   r   r   use_entry_utility_coder8  enum_valuesr   r   )rV   rc   re   rB   scopedrZ  r   r   r8  r   rO  rd   r  rC   rC   rD   declare_enum  s.   
zScope.declare_enumc                 C      | j ||S rS   )r   declare_tuple_type)rV   re   
componentsrC   rC   rD   rt       zScope.declare_tuple_typec
                 C   s   |s|dks|r|}n|  tj|}| |||||}
d|
_|jr4|dkr4| jd r/|
  n|| |r@|dkr@d|
_	d|
_
|rHd|
_d|
_
|	rM|	|
_|
S )Nrb   r   r,   
cpp_locals)r  r   
var_prefixr?  r   r   
directivesr   check_nullary_constructorr   r   r   r   rV   rc   rd   re   rB   r   r   in_pxdis_cdefr   r  rC   rC   rD   r     s&   


zScope.declare_varc                 C   s,   |sd S |D ]}||vrt |d|  qd S )Nz"Modifier '%s' is not allowed here.)r   )rV   re   	modifiersallowedmodifierrC   rC   rD   _reject_pytyping_modifiers  s   z Scope._reject_pytyping_modifiersc                 C      |  |||S rS   r   rV   rc   rd   re   rC   rC   rD   $declare_assignment_expression_target  s   z*Scope.declare_assignment_expression_targetc                 C   s   |  |}| j||S rS   )r  r   declare_builtinrV   rc   re   rC   rC   rD   r  "  s   
zScope.declare_builtinc                 C   sN   |r|j jst|d|  t|jd | j|t||d}t|_| j	| |S )Nz'%s' already declaredrm   r   )
rd   r   r   re   r   r   r   	signaturer   r   )rV   rc   re   r   r  rC   rC   rD   _declare_pyfunction&  s   zScope._declare_pyfunctionc                 C   s   |  |}|s| j||||dS |r)|jjrt|_n|jtur(| j||||dS n	| j|t||d | jd t||dd}t||_| ||_	t
|_d|_|S )N)r   r  r  rb   rB   r   T)rT  r  rd   is_unspecifiedr   r   r
   rc   r   r   r   r  r   )rV   rc   re   allow_redefiner   r  rC   rC   rD   declare_pyfunction/  s$   



zScope.declare_pyfunctionc                 C   sl   |  tjd |}|  tjd |}| |}| d |t|d}t||_||_||_	||_
t|_d|_|S )Nfuncdef_methdef_rb   T)r  r   lambda_func_prefixr   r?  r   r
   rc   r   pymethdef_cnamer   r   r  r   )rV   lambda_namere   r   r  r   r  rC   rC   rD   declare_lambda_functionC  s   

zScope.declare_lambda_functionc                 C      | j | d S rS   )r   r   rV   def_noderC   rC   rD   add_lambda_defR  ro   zScope.add_lambda_defc                 C   r  rS   )r   r   rV   r  rC   rC   rD   register_pyfunctionU  ro   zScope.register_pyfunctionc                 C   s
  |s|dks|r|}n|  tj|}d|	v o|o|}|rd}| |}|r|s;||jkr;|dkr;d}|j}||_||_|dkrP||jkrPt|d||j|f d ||jkrct|d||r]d	nd
f d |j	
|rr|j	|j|_	n|dkr|jdkr| j}|  rd}n|r|s| D ]}|jr||jkr nqd}|r| ||||||	}| |_|}nFt|dd ||_	n<|s|jr||j	r|j	jr|j	jd u r|jrt|jd|j |  ||_	nt|d n| ||||||	}||_||_|rd|_|r|dkrd|_|rd|_|s|s|dkrt|d|  |r$d|_|	r*|	|_|
r<|jr9J d||f |
|_|rXt||t }| !||_"d|_#d|_$|j%|_%||_&||_'|j(r|jd u r|jr|d j)s|r|s|st*j+|| ||j,j-d |S )Nrb   r-   Fr,   Tz6Function '%s' previously declared as '%s', now as '%s'r   z)Function '%s' previously declared as '%s'cpdefri  6Function signature does not match previous declarationzNo exception value declared for '%s' in pxd file.
Users cimporting this function and calling it without the gil will always require an exception check.
Suggest adding an explicit exception value.3Non-extern C function '%s' declared but not definedz2duplicate utility code definition in entry %s (%s)r   )function_namevoid_return).r  r   func_prefixrT  r   rB   r   r   r   rd   same_aswith_with_gilwith_gilr4  r5  rs   add_cfunctionrg   r   compatible_signature_withnogilexception_valuer	   re   rc   r   r   r   r   r   r   r`   r   r   r   r   r   r   r   r  exception_checkin_utility_coder   write_noexcept_performance_hintreturn_typeis_void)rV   rc   rd   re   rB   r   r   r|  rF  r~  r   overridableinline_in_pxdr  can_overrider>  temp	var_entryrC   rC   rD   declare_cfunctionX  s   


zScope.declare_cfunctionc              	   K   sh   t dd |D sJ tj|td| jd gfi |}	| j||	|d |||d}
d|
_|d ur2||
_|
S )Nc                 s   s    | ]}|d v V  qdS ))r  r  r  r  is_const_methodis_static_methodNrC   )r  krC   rC   rD   r    s
    
z(Scope.declare_cgetter.<locals>.<genexpr>rV   )rB   r   r~  rF  T)allr   	CFuncTypeCFuncTypeArgparent_typer  r   r   )rV   rc   r  re   rB   r   r~  rF  cfunc_type_config
cfunc_typer  rC   rC   rD   declare_cgetter  s    zScope.declare_cgetterc                 C   s   |  |||||}d|_|r||_|s|jr| j| |S t| j}	t| jD ]}
|
js1|
j	js3 n|	d8 }	q(| j
|	| |S r{   )r?  r   r   is_fusedr   r   r|   reversedr   rd   insert)rV   rc   rd   re   rB   r   r~  	inheritedr  icfunc_entryrC   rC   rD   r    s   



zScope.add_cfunctionc                 C   s$   |  |}|r	|S t|d|  d S )Nz'%s' is not declared)rJ  r   rV   rc   re   r  rC   rC   rD   find  s   
z
Scope.findc                 C   sN   | }|D ] }| ||}|s d S |jr|j}qt|dd|   d S |S )Nz'%s' is not a cimported moduler   )r  r   r   join)rV   pathre   r   rc   r  rC   rC   rD   find_imported_module  s   zScope.find_imported_modulec                 C   sd   |  |}| |p| jo| j|pd }|r|S | jr"| j|p#d }|r0|jr0| |j| |S rS   )r  rT  r   rJ  r   _emit_class_private_warningre   )rV   rc   r   r  rC   rC   rD   rJ    s   


zScope.lookupc                 C   s*   | j | |d }|r|S | j |d S rS   )r   getr  rV   rc   r  rC   rC   rD   rT    s   zScope.lookup_herec                 C   s   | j |d S rS   )r   r  r   rC   rC   rD   lookup_here_unmangled  rv  zScope.lookup_here_unmangledc                 C   s
   |  |S rS   )rT  r   rC   rC   rD   #lookup_assignment_expression_target  s   
z)Scope.lookup_assignment_expression_targetc                 C   sF   |  |}|s| |}|r|jr| |j| |s!| |td }|S rS   )rT  r  r   r  re   r   r   r  rC   rC   rD   lookup_target   s   


zScope.lookup_targetc                 C   s4   |r|j r|jjr| jr|j| jS |jS d S d S rS   )r   rd   r  fused_to_specific
specializer  rC   rC   rD   $_type_or_specialized_type_from_entry,  s
   
z*Scope._type_or_specialized_type_from_entryc                 C   sF   |  |}| |}|r|S |r|jrddlm} ||j}| |S )Nr   ) get_known_standard_library_entry)rJ  r  r   Builtinr  )rV   rc   r  tpr  rC   rC   rD   lookup_type2  s   




zScope.lookup_typec                 C   s  |d j jr0|d j }|jd| }|d ur0dd |dd  D }t|| }|d ur0|S | d| }g }|d urA| }g }	t|dkrmtdD ]}
||
 j jrl||
 j }|jd| }|d url|	| 7 }	qM|	ss|ssd S t	t
|	| }tdd |D |S )Nr   z
operator%sc                 S      g | ]}|j qS rC   rd   r  argrC   rC   rD   
<listcomp>G      z)Scope.lookup_operator.<locals>.<listcomp>r   r   c                 S   r  rC   r  r  rC   rC   rD   r  `  r  )rd   r   r   rJ  r   
best_matchrs   r|   rangere  r   )rV   r&  operandsobj_typemethod	arg_typesresfunctionfunction_alternativesmethod_alternativesnrs   rC   rC   rD   lookup_operatorB  s6   

zScope.lookup_operatorc                    s<   ddl m} G dd d|  fdd|D }| ||S )Nr   )Nodec                   @   s   e Zd ZdS )z4Scope.lookup_operator_for_types.<locals>.FakeOperandN)r[   r\   r]   rC   rC   rC   rD   FakeOperande  s    r  c                    s   g | ]} |d qS )r  rC   )r  rd   r  re   rC   rD   r  g  s    z3Scope.lookup_operator_for_types.<locals>.<listcomp>)Nodesr  r  )rV   re   r&  typesr  r  rC   r  rD   lookup_operator_for_typesc  s   zScope.lookup_operator_for_typesc                 C   s   t |d| d d S )NzGlobal name %s matched from within class scope in contradiction to to Python 'class private name' rules. This may change in a future release.r   )r   )rV   re   rc   rC   rC   rD   r  j  s
   z!Scope._emit_class_private_warningc                 C      |   | d S rS   )r  use_utility_coderV   new_coderC   rC   rD   r  o  r  zScope.use_utility_codec                 C   r  rS   )r  ro  r  rC   rC   rD   ro  r  r  zScope.use_entry_utility_codec                 C   s   |D ]
}|| j v r dS qdS Nr   r   )r   rV   r  rc   rC   rC   rD   defines_anyu  s
   
zScope.defines_anyc                 C   s*   |D ]}|| j v r| j | jr dS qdS r  )r   r   r  rC   rC   rD   defines_any_special|  s
   zScope.defines_any_specialc                 C      ddl m} | |  d S )Nr   )get_type_inferer)TypeInferencer  infer_types)rV   r  rC   rC   rD   r       zScope.infer_typesc                 C   s   | j }|d u r	dS | S r   )r   r5  )rV   outerrC   rC   rD   r5    s   zScope.is_cppc                 C   s   | j ||| d S rS   )r   add_include_file)rV   filenameverbatim_includelaterC   rC   rD   r    r   zScope.add_include_file)TNrS   )r   r   r   )Nrb   r   r   )Nrb   r   r   r   r   )Nrb   r   )Nrb   r   F)NrC   r,   N)rb   r   r   NNrb   FFFN)rC   )r,   N)Fr,   Nrb   r   r   r   rC   NF)NNrb   rC   FFr   )Or[   r\   r]   r4  is_py_class_scopeis_c_class_scopeis_closure_scopeis_local_scopeis_generator_expression_scopeis_comprehension_scopeis_passthroughr7  is_property_scopeis_module_scopeis_c_dataclass_scopeis_internalr   r   r  r  r  r   r)  rW   r  r  r  r   r  r  r  r   r  r#  r(  r   r+  r?  r   rE  rH  rP  r\  rh  rX  rY  rr  rt  r   r  r  r  r  r  r  r  r  r  r  r  r  r  rJ  rT  r  r  r  r  r  r  r  r  r  ro  r  r  r  r5  r  rC   rC   rC   rD   r   K  s    #$



:



&
6




	
h

!r   c                   @   s"   e Zd ZejZdd Zdd ZdS )PreImportScopec                 C   s   t | tjd d  d S rS   )r   rW   r   
pre_importrX   rC   rC   rD   rW        zPreImportScope.__init__c                 C   s"   |  ||t|d}d|_d|_|S )Nrb   T)r?  r   r   r   r  rC   rC   rD   r    s   zPreImportScope.declare_builtinN)r[   r\   r]   r   preimport_cnamenamespace_cnamerW   r  rC   rC   rC   rD   r    s    r  c                   @   sN   e Zd ZdZdd ZdddZdd Zdd	d
Zddej	fddZ
dd ZdS )BuiltinScopeTc                 C   sH   t jd u rt| dd d  n	t| dt d  i | _| dtd d d S )N__builtin__boolz((PyObject*)&PyBool_Type))r   r  r   rW   r  
type_namesr   r   rX   rC   rC   rD   rW     s
   
zBuiltinScope.__init__Nc                 C   s,   |dkr|d u r|dv }|sd}t | |S )Nstr)Nr   unicode)r   rJ  )rV   rc   language_level
str_is_strrC   rC   rD   rJ    s   zBuiltinScope.lookupc                 C   sR   t t|s'| jd ur| j||S tjrt|d|  d S t|d| d d S d S )Nundeclared name not builtin: %sr   )hasattrbuiltinsr   r  r   error_on_unknown_namesr   r   r  rC   rC   rD   r    s   

zBuiltinScope.declare_builtinc                 C   st   t |}| j||d |d|d}|r8|dkr|}nt |}t||t}| ||_d|_d|_||_|j	|_	||_
|S )Nr,   )r   r   *r   )r
   r  r`   r   r   r   r   r   r   r   r   )rV   rc   rd   rB   python_equivr   r  r  rC   rC   rD   declare_builtin_cfunction  s   z&BuiltinScope.declare_builtin_cfunctionc           
      C   s   t |}||||}t|d d|d}i |_|dkrd|_|| d| j|< | j||d dd}||_t|j	| 
dj|j|jjd}	| ||	_d|	_d|	_d|	_d|	_||	_| |	_tjr`d|	_|	|_|S )	Nr,   )r   r   r  r  Tr   r  rd   rc   rd   re   rB   )r
   CClassScopery  is_final_type	set_scoper  rH  r   r`   rc   rJ  rd   re   typeptr_cnamer   r   r   r   r   r   r   r   cache_builtinsr   r   )
rV   rc   rB   r   objstruct_cname
type_classrd   r   r  r  rC   rC   rD   declare_builtin_type  s6   


z!BuiltinScope.declare_builtin_typec                 C   r   rS   rC   rX   rC   rC   rD   r#    r  zBuiltinScope.builtin_scoper   )r[   r\   r]   r4  rW   rJ  r  r   r   BuiltinObjectTyper)  r#  rC   rC   rC   rD   r    s    
	


 r  c                   @   s&  e Zd ZdZdZdZdZg dZdAddZdd Z	d	d
 Z
dBddZdd Zdd ZdCddZdAddZdd ZdDddZdd Zdd Zdd  Zd!d" Z	#	dEd$d%Z		dFd'd(Zd)d* Zd+d, Zd-d. Z			#		dGd/d0Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dS )HModuleScoper   r   )	__builtins__r[   __file__r   __path____spec__
__loader____package__
__cached__Fc                 C   s   ddl m} || _|j}t| ||| || _|| _t| j| _|| _	t
j| _t
j| _t
j| _d| _t
j| _g | _i | _i | _t|j| _d| _g | _t | _g | _d| _g | _g | _| j| _ i | _!| "t#j$ddd d S )Nr   r  ra   r   zPython.hT)initial)%ra   r  parent_moduler#  r   rW   
is_packagemodule_namer
   contextr   module_cnamemoddict_cnamemodule_dict_cnamemethtable_cnamemethod_table_cnamer   moddoc_cnamer   utility_code_listmodule_entries
c_includesdictr  pxd_file_loadedcimported_modulesr   types_importedincluded_fileshas_extern_classcached_builtinsundeclared_cached_builtinsr  _cached_tuple_typesprocess_includer   IncludeCode)rV   rc   r5  r8  r6  r  r   rC   rC   rD   rW     s6   zModuleScope.__init__c                 C   r  rS   )r5  rX   rC   rC   rD   r   :  r  zModuleScope.qualifying_scopec                 C   r   rS   rC   rX   rC   rC   rD   r  =  r  zModuleScope.global_scopeNc                 C   sn   |  |}|d ur|S |d u r| jd ur| jjnd}|d u r.|dkp-| jd uo-tj| jjv}| jj|||dS )N   r   )r  r  )rT  r8  r  r   unicode_literalsfuture_directivesr   rJ  )rV   rc   r  r  r  rC   rC   rD   rJ  @  s   
zModuleScope.lookupc           
      C   s   t |}z| j| }W n ty   t| }| j|< Y nw |j}| |}|s^t|}t|D ]\}}|j	d| ||d q1| j
|d d|d||d}	| j|	 |	|_| ||||}||_|S )Nzf%s)rc   rd   re   _structr2   T)rZ  re   rB   )tuplerJ  r  r   c_tuple_typerB   rT  StructOrUnionScope	enumerater   r\  r   removestruct_entryrH  r  )
rV   re   ru  ttyperB   r  r   ix	componentrV  rC   rC   rD   rt  M  s(   
zModuleScope.declare_tuple_typec                 C   s0  t t|s<|tjvr<|tjvr<| jr| |t|}|S tj	r&t
|d|  nt|d| d | |d t|d}d|_|S tjrN| jD ]}|j|krM|  S qB|dkr[| js[| jdS | d d t|d}tjr|tjvrd|_d|_||_tj| |_| j| | j| nd|_||_|  ||_|S )Nr  r   rb   r   globals__Pyx_Globals)r  r  r   non_portable_builtins_mapuncachable_builtinshas_import_starr   r   r   r  r   r   r?  r   r&  rH  rc   old_style_globalsr   rJ  r   r   builtin_prefixrB   r   rI  r#  r   r   r  rC   rC   rD   r  a  s>   




zModuleScope.declare_builtinr,  c           	      C   s   |d uo|dk}d }d}|d ur1|dkr1| }| j rdnd}||kr0|r0|j}|d8 }||kr0|s#n	|dkr:| j}d}|  }|jj|||||dS )Nr   Fr   T)from_modulere   absolute_fallbackrelative_import)r6  r5  r  r8  find_module)	rV   r7  re   relative_levelis_relative_importra  rb  	top_levelmodule_scoperC   rC   rD   rd    s$   
zModuleScope.find_modulec                 C   sf   d|v r| dd\}}nd }| |}|s(t|| | j|rdn|d}|| j|< |r1|j||d}|S )Nr   r   T)r5  r8  r6  )
as_package)splitlookup_submoduler+  r8  r@  find_submodule)rV   rc   ri  	submoduler   rC   rC   rD   rl    s   

zModuleScope.find_submodulec                 C   sF   d|v r| dd\}}nd }| j|d }|r!|d ur!||}|S )Nr   r   )rj  r@  r  rk  )rV   rc   rm  modulerC   rC   rD   rk    s   
zModuleScope.lookup_submodulec                 C   s   t j|||d}| | dS )z
        Add `filename` as include file. Add `verbatim_include` as
        verbatim text in the C file.
        Both `filename` and `verbatim_include` can be `None` or empty.
        )r  N)r   rL  rK  )rV   r  r  r  incrC   rC   rD   r    s   zModuleScope.add_include_filec                 C   s4   |  }|du r| }|| j| | j| }dS )a  
        Add `inc`, which is an instance of `IncludeCode`, to this
        `ModuleScope`. This either adds a new element to the
        `c_includes` dict or it updates an existing entry.

        In detail: the values of the dict `self.c_includes` are
        instances of `IncludeCode` containing the code to be put in the
        generated C file. The keys of the dict are needed to ensure
        uniqueness in two ways: if an include file is specified in
        multiple "cdef extern" blocks, only one `#include` statement is
        generated. Second, the same include might occur multiple times
        if we find it through multiple "cimport" paths. So we use the
        generated code (of the form `#include "header.h"`) as dict key.

        If verbatim code does not belong to any include file (i.e. it
        was put in a `cdef extern from *` block), then we use a unique
        dict key: namely, the `sortkey()`.

        One `IncludeCode` object can contain multiple pieces of C code:
        one optional "main piece" for the include file and several other
        pieces for the verbatim code. The `IncludeCode.dict_update`
        method merges the pieces of two different `IncludeCode` objects
        if needed.
        N)	mainpiecesortkeydict_updaterA  )rV   ro  r$  rC   rC   rD   rK    s
   zModuleScope.process_includec                 C   sN   || j vr#|j D ]}| | q
| j | |j D ]	}| | qd S d S rS   )rD  rA  valuesrK  r   add_imported_module)rV   r   ro  mrC   rC   rD   rt    s   

zModuleScope.add_imported_modulec                 C   s8   |j rd|_|| jvr|| j|< d S t|d| d d S )NTrR  r   )r   r   r   r   )rV   rc   r  re   rC   rC   rD   add_imported_entry  s
   
zModuleScope.add_imported_entryc                 C   s\   |  |}|r|jr|j|u r|S |jr|jr|S n
| |t|}d|_||_| | |S )Nr   )rT  r   r   r   r   r   rt  )rV   rc   r   re   r  rC   rC   rD   declare_module  s   


zModuleScope.declare_modulerb   c
                 C   s\  |dvrt |d|  | ||	d |s$|tu rt}|jr |jr$td|s=| }
|dks3|dkr6|
r6|}n| tj	|}| 
|}|r|jr|j|sa|dkra|jdkrat|d| d ||_|jd	krw| tj	|}|j|krw|}||_|jsd
|_|S tj| |||||||||	d
}|rd|_|jjr|jj|_| j| nd|_tjrd|_|S )N)rb   rA  r,   z+Module-level variable cannot be declared %s)ztyping.Optionalz7Non-cdef global variable is not a generic Python objectr,   rA  z6Variable '%s' type does not match previous declarationr   rb   TrB   r   r   r|  r}  r   )r   r  r   r   is_pyobjectis_extension_typer   r  r   rx  rT  r   rd   r  r   r   rB   r   r   r   r   declaration_valuerf   r   r   r   r   cimport_from_pyxr   )rV   rc   rd   re   rB   r   r   r|  r}  r   rF  r  mangled_cnamerC   rC   rD   r     sT   




zModuleScope.declare_varrC   c                 C   s   |sd|	v rt |dd |s"|dks|dkr|r|}n| tj|}|dkr.|jr.t|d | |}|rQ|jrQ|jdkrQ| tj|}|j	|krQ|}||_	||_
tj| |||||||||	|
|d}|S )	Nr-   z+Declarations should not be declared inline.r   r,   rA  z6Extern functions cannot have default arguments values.rb   )rB   r   r   r|  rF  r~  r   r  )r   r  r   r  optional_arg_countr   rT  r   r   rB   r   r   r  )rV   rc   rd   re   rB   r   r   r|  rF  r~  r   r  r  r}  rC   rC   rD   r  J  s.   




zModuleScope.declare_cfunctionc                 C   s$   |  |}|s| |t| d S d S rS   )rT  r   r   r  rC   rC   rD   declare_globalg  s   
zModuleScope.declare_globalc                 C   s   |d ur| j | d S d S rS   )r?  r   r  rC   rC   rD   r  l  s   zModuleScope.use_utility_codec                 C   s<   |d u rd S |j r| j|j  |jr| j|j d S d S rS   )r   r?  r   r   r  rC   rC   rD   ro  p  s   z"ModuleScope.use_entry_utility_codec                 C   s$  |r|
dkr|
dks|st |dd |}d}nd }| |}|r]|s]|j}|jr+|js.d }n/|j}|r?|r8|jr?| ||| |rD|jsI|rU|jrU|rU||jurUt	|d |r]|js]||_|ra|rt
j||||
dk|d}||_||_|d urz||_|
dkr||_n| j|_|	r|	|_n| tj||_| j||||
d|d}d	|_|r||_n|js| tj||_nt	|jd
 | | | j| |js|s|rt|| |
|d}| j |_|r|jr| |j |!| | j"| n|r|jjrt	|d|  n|r|jj#rt	|d|  |rd|_$|r||_|
dkr/|j%|
kr/t	|d||j%f  |r5d|_&|rJ|jrG|j|krGt	|d ||_|r_|j'r\|j'|kr\t	|d ||_'| j(drjd	|j_)| j(d}|rddl*m+} t,| |st	|d |dkrd	|j_-d	|_.|S )Nr,   rA  z6ctypedef only valid for 'extern' , 'public', and 'api'r   r   r^  )
check_size)r   rF  r;  Tz5Object name required for 'public' or 'extern' C class)rc   r   r   r  zC class '%s' already definedz C class '%s' already implementedr   rb   z&Class '%s' previously declared as '%s'z4Object struct name differs from previous declarationz2Type object name differs from previous declarationfinalcollection_type)NonManglingModuleScopez2'collection_type' is not a public cython directivesequence)/r   rT  rd   r   rz  r   definedrX  rN  r   r   PyExtensionTypere   buffer_defaultsobjtypedef_cnamer7  r   r%  r  r   typeptr_prefixrH  r   r'  r   objstruct_prefixattach_var_entry_to_c_classr   r   r"  ry  copydeclare_inherited_c_attributesr$  r   implementedr   r   r   typeobj_cnamer  r#  r   r  rv   has_sequence_flagr   )rV   rc   re   rF  implementingr7  rN  r'  r  r%  r   rZ  r   r  r  r;  r  r  rd   r   r  r  rC   rC   rD   declare_c_classx  s   









zModuleScope.declare_c_classc                 C   s   |j }|jr|jjrdtj|jjf |_n,|jrA|jjrAt|jj}|j}|r=|jr2|t|jjkr3n
|jr8d S |j}|s'tj|_|jrX| 	tj
|j|_| 	tj|j|_d S d S r@  )rd   rN  vtabslot_cnamer   obj_base_cnamer   r   r|   is_builtin_typer  vtabstruct_prefixrc   vtabstruct_cnamevtabptr_prefixvtabptr_cname)rV   r  rd   entry_countrN  rC   rC   rD   allocate_vtable_names  s(   

	z!ModuleScope.allocate_vtable_namesc                 C   s*   | j D ]}|jjst|jd|j  qd S )N(C class '%s' is declared but not defined)r   rd   r   r   re   rc   r  rC   rC   rD   check_c_classes_pxd  s
   
zModuleScope.check_c_classes_pxdc                 C   s   |j }|j}|j}|jst|jd|  |dkr#|js#| tj	||_|jr<|jj
D ]}|js;|js;t|jd|j  q*|jrJ| tj|j|_d S d S )Nr  r,   z)C method '%s' is declared but not defined)rd   rc   r   r   r   re   r  r  r   typeobj_prefixr   r   r   r  vtable_prefixvtable_cname)rV   r  rd   rc   r   method_entryrC   rC   rD   check_c_class  s"   zModuleScope.check_c_classc                 C   s^   d}|rt d| j  | jD ]}|r't d|j|f  t d|j t d|j | | qd S )Nr   z&Scope.check_c_classes: checking scope z...entry %s %sz......type = z......visibility = )printr   r   rc   rd   r   r  )rV   debug_check_c_classesr  rC   rC   rD   check_c_classes6  s   
zModuleScope.check_c_classesc                 C   sT   | j  D ]"\}}|jr'|jr'|j| u r'|jdkr'|js'|js't|j	d|  qd S )Nr,   r  )
r   r  r   r   r   r   r   r   r   re   r  rC   rC   rD   check_c_functionsN  s   

zModuleScope.check_c_functionsc                 C   sR   ddl m} t|j|j|j|jjd}|j|_d|_	d|_
d|_|j|_||_d S )Nr   r3  r!  )ra   r  r`   rc   	type_typere   rd   r%  r   r   r   r   r   r   )rV   r  r  r  rC   rC   rD   r  Z  s   
z'ModuleScope.attach_var_entry_to_c_classc                 C   r  rS   )cpprX   rC   rC   rD   r5  m  r  zModuleScope.is_cppc                 C   r  )Nr   )PyObjectTypeInferer)r  r  r  )rV   r  rC   rC   rD   r  p  r  zModuleScope.infer_typesr  r   )r,  r   r  r   )r   r   NNNNNrb   r   r   NNr   )$r[   r\   r]   r
  r^  is_cython_builtinr_  r   rW   r   r  rJ  rt  r  rd  rl  rk  r  rK  rt  rv  rw  r   r  r  r  ro  r  r  r  r  r  r  r  r5  r  rC   rC   rC   rD   r+    sV    


%

		
:

zr+  c                   @   sh   e Zd ZdZdZdZdddZdd Zdd	 Z	
	dddZ	dd Z
dd Zdd Zdd Zdd ZdS )r1  TFNc                 C   s    |d u r|}t | ||| d S rS   r   rW   )rV   rc   r   r   rC   rC   rD   rW   ~  s   zLocalScope.__init__c                 C   s   t || S rS   )rP   r  rC   rC   rD   r    rt   zLocalScope.manglec                 C   sR   |  |}| tj|}| ||||d}d|_|jrd|_d|_| j	
| |S )Nrb   r   0)r  r  r   rx  r?  r   ry  rf   r   r   r   )rV   rc   rd   re   rB   r  rC   rC   rD   declare_arg  s   
zLocalScope.declare_argrb   c
                 C   sn   |  |}|dv rt|d|  tj| |||||||||	d
}
|
jjr(|
jj|
_d|
_| j|
_	| j
|
 |
S )NrA  readonlyz$Local variable cannot be declared %srx  r   )r  r   r   r   rd   r{  rf   r   _in_with_gil_blockr   r   r   r{  rC   rC   rD   r     s   

zLocalScope.declare_varc                 C   6   |  |rt|dd d S |  |}|| j|< d S NrR  r   rT  r   r  r  r   r  rC   rC   rD   r       
zLocalScope.declare_globalc                 C   sf   |  |}|r|j| u r|jst|d|  |  d S | |}|d u s(|js1t|d|  d S d S Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)rT  r   r   r   rn   rJ  rV   rc   re   
orig_entryr  rC   rC   rD   declare_nonlocal  s   

zLocalScope.declare_nonlocalc                 C   s$   d|_ t|| }d|_|| j|< |S NT)r   r   r   r   )rV   rc   r  inner_entryrC   rC   rD   _create_inner_entry_for_closure  s
   

z*LocalScope._create_inner_entry_for_closurec                 C   s^   t | |}|d ur-|j}|jr|j}|js|| ur-|jr-t|jdr'td| ||S |S )Nscope_classz#lookup() after scope class created.)	r   rJ  r   r  r   r  r  r   r  )rV   rc   r  entry_scoperC   rC   rD   rJ    s   zLocalScope.lookupc                 C   s   |   D ]O}|j D ]G}|jr4|jj}| jr||_q|tj	r,|t
tj	d d  }d||f |_q|jrR|j|_dtj	|jf |_|jjrR|jjd rR|  qqd S )Nr   z%s->%srw  )r(  r   rs  r   r   rB   r  r>   r   cur_scope_cnamer|   r   original_cnamerd   r   r   ry  r   )rV   outer_scope_cnamer   r  rB   rC   rC   rD   mangle_closure_cnames  s"   z LocalScope.mangle_closure_cnamesrS   r  )r[   r\   r]   r  has_with_gil_blockr  rW   r  r  r   r  r  r  rJ  r  rC   rC   rC   rD   r1  u  s    

r1  c                   @   s\   e Zd ZdZdZ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S )ComprehensionScopezScope for comprehensions (but not generator expressions, which use ClosureScope).
    As opposed to generators, these can be easily inlined in some cases, so all
    we really need is a scope that holds the loop variable(s).
    Tc                 C   s   |}|j r|j}|j s| tj}t| ||| |j| _dtj	t
||f | _|j s3|js3|jr?|j}|j s3|js3|js3|j| _|j|  d S )Nz%s%d%s)r  r   r  r   r   genexpr_id_refr   rW   ry  r?   r|   genexp_prefixr  r  r   r   r   add)rV   r   r   rc   rC   rC   rD   rW     s   zComprehensionScope.__init__c                 C   s   d| j | j||f S N%s%s)r  r   r  r  rC   rC   rD   r    s   zComprehensionScope.mangleNrb   Fc
                 C   s   |t u r| j|}
|
r|
jr|
j}| ||	 d| j| jt	j
|p%|  f }| |||||}d|_| jjr=d|_nd|_d|_| j| || j|< |S )Nr  T)r   r   rJ  r   rd   r  r  r   r  r   rx  r   r?  r
  r   r   r   r   r   r   )rV   rc   rd   re   rB   r   r   r|  r}  r   r   r  rC   rC   rD   r     s   
"
zComprehensionScope.declare_varc                 C      | j |||S rS   )r   r   r  rC   rC   rD   r    s   z7ComprehensionScope.declare_assignment_expression_targetc                 C   r  rS   )r   r  rV   rc   re   r  rC   rC   rD   r    s   z%ComprehensionScope.declare_pyfunctionc                 C   rs  rS   )r   r  )rV   r   re   rC   rC   rD   r    rv  z*ComprehensionScope.declare_lambda_functionc                 C      | j |S rS   )r   r  r  rC   rC   rD   r    rt   z!ComprehensionScope.add_lambda_defc                 C   s   |  |}|s| j|}|S rS   )rT  r   r  r  rC   rC   rD   r  "  s   
z6ComprehensionScope.lookup_assignment_expression_target)Nrb   FFTNr  )r[   r\   r]   r   r  rW   r  r   r  r  r  r  r  rC   rC   rC   rD   r    s    

r  c                   @   s,   e Zd ZdZd
ddZdddZdd	 ZdS )ClosureScopeTNc                 C   s$   t | ||| dtj|f | _d S r  )r1  rW   r   closure_scope_prefixclosure_cname)rV   rc   
scope_namer   r   rC   rC   rD   rW   -  s   zClosureScope.__init__Fc                 C   s   t j| |||ddS )Nrb   r  )r1  r  r  rC   rC   rD   r  :  r   zClosureScope.declare_pyfunctionc                 C   r  rS   r  r  rC   rC   rD   r  =  rv  z1ClosureScope.declare_assignment_expression_targetrS   r  )r[   r\   r]   r  rW   r  r  rC   rC   rC   rD   r  )  s
    

r  c                   @   rQ   )GeneratorExpressionScopeTc                 C   s   | j |||}| ||S rS   )r   r   r  )rV   rc   rd   re   r  rC   rC   rD   r  D  rq   z=GeneratorExpressionScope.declare_assignment_expression_targetc                 C   s.   |  |}|s| j|}|r| ||S |S rS   )rT  r   r  r  r  rC   rC   rD   r  H  s   
z<GeneratorExpressionScope.lookup_assignment_expression_targetN)r[   r\   r]   r  r  r  rC   rC   rC   rD   r  A  r_   r  c                   @   s4   e Zd ZdddZ			dddZ			dddZdS )rS  ?c                 C   s   t j| |d d d d S )N)r   r   r  r   rC   rC   rD   rW   T  r  zStructOrUnionScope.__init__Nrb   Fc                 C   s   |s|}|dkrt |}|jrt|}| ||	 | |||||}d|_| j| |j	r8|
s6t
|d |S |jrD|sBt
|d |S |jrP|sPt
|d|  |S )Nrb   r   z/C struct/union member cannot be a Python objectz-C struct/union member cannot be a memory viewz;C struct/union member cannot be reference-counted type '%s')rE   r   r   rg  r  r?  r   r   r   ry  r   r9  needs_refcounting)rV   rc   rd   re   rB   r   r   r|  r}  r   allow_pyobjectallow_memoryviewallow_refcountedr  rC   rC   rD   r   W  s,   


zStructOrUnionScope.declare_varr   rC   c                 C   s"   |
rt |d | j|||||dS )Nz0C struct/union member cannot be declared 'cpdef'r  )r   r   )rV   rc   rd   re   rB   r   r   r|  rF  r~  r  rC   rC   rD   r  r  s
   

z$StructOrUnionScope.declare_cfunction)r  )	Nrb   FFFNFFF)Nrb   r   r   r   rC   F)r[   r\   r]   rW   r   r  rC   rC   rC   rD   rS  Q  s    

rS  c                   @   s,   e Zd ZddgZdd Zdd Zdd Zd	S )

ClassScoper\   r]   c                 C   sJ   |r|  dr|S |r#|dr#|ds#td| jd|f }|S )N__pyx_r;   z_%s%s_)lowerr>   endswithr
   
class_namelstripr   rC   rC   rD   r    s
   z$ClassScope.mangle_class_private_namec                 C   s    t | ||| || _d | _d S rS   )r   rW   r  r   rV   rc   r   rC   rC   rD   rW     s   
zClassScope.__init__c                 C   sd   t | |}|r
|S |dkr0tddtttdtd gdd}tj	dd|_
| | d|_|S )Nclassmethod__Pyx_Method_ClassMethodra   r   ClassMethodzCythonFunction.cr   )r   rJ  r`   r   r  r   r  r   r   r   r   ro  r   r  rC   rC   rD   rJ    s    
zClassScope.lookupN)r[   r\   r]   r   r  rW   rJ  rC   rC   rC   rD   r  {  s
    	r  c                   @   s6   e Zd ZdZ		dddZdd Zd	d
 Zdd ZdS )PyClassScoper   Nrb   Fc
                 C   sD   |  |}|tu rt}tj| |||||||||	d
}
d|
_d|
_|
S )Nrx  r   )r  r   r   r   r   r   r   r{  rC   rC   rD   r     s   
zPyClassScope.declare_varc                 C   sj   |  |}|r|j| u r|jst|d|  |  d S | |}|d u r.t|d|  d S || j|< d S r  )rT  r   r   r   rn   rJ  r   r  rC   rC   rD   r    s   

zPyClassScope.declare_nonlocalc                 C   r  r  r  r  rC   rC   rD   r    r  zPyClassScope.declare_globalc                 C   r  rS   )r   add_default_value)rV   rd   rC   rC   rD   r    rt   zPyClassScope.add_default_valuer  )r[   r\   r]   r  r   r  r  r  rC   rC   rC   rD   r    s    
r  c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dd Zdd Zdd Zd	d
 Zdd Z		d'ddZ		d(ddZd)ddZdd Z		d*ddZd)ddZd+ddZd,d d!Z	"		d-d#d$Zd%d& ZdS ).r"  r   Fc                 C   sr   t | || |dkr|tj|| _|tj|| _g | _g | _	|| _
|js*|jr7|jr5d|j | _d S d S d S )Nr,   z(PyObject *)%s)r  rW   r  r   methtab_prefixr=  gstab_prefixgetset_table_cnameproperty_entriesinherited_var_entriesr  r  rz  r%  r  )rV   rc   r   r   r  rC   rC   rD   rW     s   zCClassScope.__init__c                 C   sN   | j r| jddsdS | jj}|r|jd ur|j S | jjr%| jj S dS )Nno_gcFT)	has_cyclic_pyobject_attrsry  r  r  rN  r   needs_gcr  is_gc_simple)rV   rN  rC   rC   rD   r  	  s   

zCClassScope.needs_gcc                 C   sN   | j d}|du rdS |r| jrdS | jj}|r#|jd ur#|j S | jjS )NtrashcanFT)ry  r  r  r  rN  r   needs_trashcanbuiltin_trashcan)rV   	directiverN  rC   rC   rD   r  	  s   

zCClassScope.needs_trashcanc                 C   s   |   o| jdd S )z
        Do we need to generate an implementation for the tp_clear slot? Can
        be disabled to keep references for the __dealloc__ cleanup function.
        no_gc_clearF)r  ry  r  rX   rC   rC   rD   needs_tp_clear	  s   zCClassScope.needs_tp_clearc                 C   sX   | }|r*| d}|r|jrdS |jjs|jr|jjrdS |jj}|r&|jnd}|sdS )z
        This covers cases where we definitely have a __del__ function
        and also cases where one of the base classes could have a __del__
        function but we don't know.
        __del__TNF)rT  r   r  is_externalr  multiple_basesrN  r   )rV   current_type_scope	del_entrycurrent_base_typerC   rC   rD   may_have_finalize&	  s   


zCClassScope.may_have_finalizeTc                 C   s   g }g }g }| j D ]1}|jjr%|s| js|jdkr$|s|jjs$|| q	|jtjkr1|| q	|jj	r:|| q	|p@|p@|}||||ffS )Nr<   )
r   rd   ry  is_closure_class_scoperc   r  r   r   c_py_buffer_typer9  )rV   include_weakrefinclude_gc_simplepy_attrs
py_buffersmemoryview_slicesr  have_entriesrC   rC   rD   get_refcounted_entries9	  s    


z"CClassScope.get_refcounted_entriesNrb   c
                 C   s  |  |}|	r,d|	v r d}|js |jst|d|  t}n|j}d|	v r,| js,t|d |r| jr6t|d | jsHt	| j
|rHt|d|  |sZ|}|dkrTt|}t|tj}| |||||}
d	|
_| j|
 |	|
_|jr|d
kr| j
d r|
  n|| |jrd| _n*|jr| td d| _n|jr| js|dkrd| _|j r|j!r|j!" rd| _#|dvrt|d|  |dv rd|
_$| js|dkrt|d |js|%| st|d|  |
S d|
_$|
S |t&u rt}t'j(| |||||||||	d
}
d	|
_)d	|
_*|
S )Nztyping.ClassVarr   zZClassVar[] requires the type to be a Python object type. Found '%s', using object instead.zdataclasses.InitVarzIUse of cython.dataclasses.InitVar does not make sense outside a dataclasszVC attributes cannot be added in implementation part of extension type defined in a pxdz/The name '%s' is reserved for a special method.rb   r   r,   rw  Tz#include <new>r<   )rb   rA  r  z1Attribute of extension type cannot be declared %sr  z9Special attribute __weakref__ cannot be exposed to Pythonz7C attribute of type '%s' cannot be accessed from PythonFrx  )+r  ry  equivalent_typer   r   r  r   r  r  r   ry  get_special_method_signaturerE   rP   r   unicode_structmember_prefixr?  r   r   r   r   r   r   rz  r9  has_memoryview_attrsneeds_cpp_constructionr  r   r   has_cpp_constructable_attrshas_pyobject_attrsr  r   r  r  r   can_coerce_to_pyobjectr   r   r   r   r   r{  rC   rC   rD   r   L	  s   





zCClassScope.declare_varc                 C   s   |t v r| drt|d|  n|dkr&t D ]}| |r%t|d|  q|dkr/t|d | j|t|dd}t| j|}|rI||_d|_	nt
|_d|_	| j| |S )	N__richcmp__z$Cannot define both % and __richcmp____new__zv__new__ method of extension type will change semantics in a future version of Pyrex and Cython. Use __cinit__ instead.r,   r  r   r   )r   rT  r   r   r   r   ry  r  r  r   r   r   r   )rV   rc   re   r  r  r  special_sigrC   rC   rD   r  	  s,   



zCClassScope.declare_pyfunctionc                 C   sD   | j s|dkrtd}t| |}|r |jr | jjs | jjs d S |S )Nr  	__cinit__)r  r
   r  rT  r   r  r  r#  r  rC   rC   rD   rT  	  s   
zCClassScope.lookup_herer   rC   c                 C   sN  |  |}t| j|r| jjst|d |j}|js;|s$t|d n| j	|d j
s;t|d|d j
|| jf  | |}|d u rLtt|tj}|r|js]t|d|  |  n|ri|jrit|d|  |jru|jrut|d nv|j|j
dd	r|j|j
jkr|j
|j|_
n^|j|j
dd	r|j|j
jkr| jr|s|j|j
ddd
st|d|| jf d t|jdd | j||||d|	d}n#t|d t|jd n| jrt|d|| jf  | ||||||	}|r|  tj!||_|
|_"||_#d|	v rd|_$| jj%s|j$s| j&dr%d|_|j|_'|j(s%|j
|_)||_
|S )Nz7Special methods must be declared with 'def', not 'cdef'zC method has no self argumentr   zCSelf argument (%s) of C method '%s' does not match parent type (%s)r.  z'%s' already definedz'Overriding final methods is not allowedr   )
as_cmethod)r  as_pxd_definitionzCompatible but non-identical C method '%s' not redeclared in definition part of extension type '%s'.  This may cause incorrect vtables to be generated.r   rm   r/  )r   r~  z2Signature not compatible with previous declarationzOC method '%s' not previously declared in definition part of extension type '%s'r-   Tr  )*r  r   ry  r  r  r  r   r6  r  assignable_fromrd   rT  rP   rE   r   unicode_vtabentry_prefixr   rn   r   r   r   same_c_signature_asr  r  r  r  r  !same_c_signature_as_resolved_typer   r  re   r  r  r  r   r  r   r#  r  r   r  r   )rV   rc   rd   re   rB   r   r   r|  rF  r~  r   r  r6  r  rC   rC   rD   r  	  s~   







 zCClassScope.declare_cfunctionc           
   
   C   s4   |  |}tj| |||||||d}	d|	_||	_|	S )Nr  r   )rT  r  r  r   r   )
rV   rc   rd   re   rB   r   r~  r  r   r  rC   rC   rD   r  
  s   
zCClassScope.add_cfunctionc                 C   sT   t |}| j||d |d|d}t||t}||_d|_d|_||_|j|_||_	|S )Nr,   )re   rB   r   r   r   )
r
   r  r`   r   r   r   r   r   r   r   )rV   rc   rd   rB   r   r  r  rC   rC   rD   r   
  s   z%CClassScope.declare_builtin_cfunctionc                 C   sx   |  |}|d u r| |||d u rtn||d}d|_|d ur"d|_||_|d u r1t|| d|_n||_| j	| |S )Nrb   T)class_scope)
rT  r?  r   r   r   r   PropertyScoper   r  r   )rV   rc   r   re   ctypeproperty_scoper  rC   rC   rD   declare_property$
  s   
zCClassScope.declare_propertyr,   c              
   C   sT   | j ||||d}|jj|tj|tjd| jddg|||	|
d||||d}||fS )zPInternal convenience method to declare a C property function in one go.
        )r   r  re   rV   Nr   )r  r  r  r  )rc   rd   rB   r   r   re   )r  r   r  r   r  r  r  )rV   rc   rd   
cfunc_namer   re   r   r  r  r  r  r   property_entryr  rC   rC   rD   declare_cproperty3
  s"   zCClassScope.declare_cpropertyc              
      s*   fdd}|j |j }|D ]  |  j| j jd d}d|_d|_ j|_| j 	| q|j
d d  D ]  jjrA j  q6|j
D ]M  j} j}|oQ|j}|sX||}| j j j j| j jdd}d|_ jrd|_ j|_| j|jks|jr j|_|rd|_||_ jr j|_qEd S )Nc                    s   dt j jf S r@  )r   r  rB   rA   
base_entryrC   rD   adaptN
  ro   z9CClassScope.declare_inherited_c_attributes.<locals>.adaptrb   r   Tr  )r  r   r?  rc   rB   rd   r   r   r   r   r   r  "get_all_specialized_function_typesr   r   r  re   r   r   r   r   r   r   r   r   )rV   
base_scoper  r   r  rB   r  r   rC   r  rD   r  J
  sP   



z*CClassScope.declare_inherited_c_attributes)FTr  r  r   rS   r   )NNr,   FFNFN)r[   r\   r]   r  r  r  r  r  r  r  r  rW   r  r  r  r  r  r   r  rT  r  r  r   r  r  r  rC   rC   rC   rD   r"    sB    


R

D
	

r"  c                   @   sN   e Zd ZdZdZdZdddZ		dddZ			dddZdd Z	dd Z
dS )CppClassScoper   Nc                 C   sV   t | ||d  |j| _g | _|d ur'|D ]}| ||t|d d}d|_qd S d S )Nr,   r   )r   rW   ry  r  r?  r   TemplatePlaceholderTyper   )rV   rc   r   r]  Ttemplate_entryrC   rC   rD   rW   
  s   zCppClassScope.__init__r,   Fc                 C   s   |s|}|  ||
 | |}|	r7|d ur7|j|r$|j|j|_n|jr1||jr1||_nt|d n	| 	|||||}d|_
|jrX| jrX| j sXd| j |f |_|dkrh|	sb|dkrh| j| |S )Nr  r   z%s::%srd  r-  )r  rT  rd   r  r  r  r   r  r   r?  r   get_fused_typesempty_declaration_coder   r   r   )rV   rc   rd   re   rB   r   r   r|  r}  rF  r   r  rC   rC   rD   r   
  s$   

zCppClassScope.declare_varr   rC   c                    s(  | j dd }||dfv r6|d u r6dtj|f }td}t |_|j|_	dd   fdd	|jD |_n|d
krN|d u rNdtj|f }td}t |_|dv rs|j
rs| jjD ]}|j|}|rr|jj
srt|d t|jd qY| |}| j||||||d}|r|s| |_|
|_||_|S )Nz::r,  rW   z%s__init__%sr-  c                 S   s.   | j jr| j jst| jt| j | jS | S rS   )rd   r   is_referencer   r  rc   
c_ref_typere   )r  rC   rC   rD   	maybe_ref
  s
   z2CppClassScope.declare_cfunction.<locals>.maybe_refc                    s   g | ]} |qS rC   rC   r  r*  rC   rD   r  
  s    z3CppClassScope.declare_cfunction.<locals>.<listcomp>__dealloc__z%s__dealloc__%s<del>r-  r-  zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.)rF  rB   r   )rc   rj  r   r  r
   r   	CVoidTyper  r6  original_argsr  rd   r_  r   rJ  r   re   rT  r   rs   rg   r   r  )rV   rc   rd   re   rB   r   r   r|  rF  r~  r   r  r  baser  r   r  rC   r+  rD   r  
  s:   





zCppClassScope.declare_cfunctionc                 C   s$  |j }|}t|dd r|j}t|dd st|dd r#dd |jD }nd}|j|j D ])}|jdv r3q+|j| jv r<|j | |j|j	|j
d d}d|_d|_| j| q+|jD ]}| j|j|j
|j|j	|jd	|j|jd
}d|_qX|jD ]}|j|vr| j|j|j
|j|j	|jdd}d|_qud S )Ntemplate_typer]  c                 S   r  rC   r  )r  r$  rC   rC   rD   r  
  r  zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp>rC   r.  r,   r   r   )r   r~  r   F)rF  )r   r   r2  r]  r  r   rc   r   r?  rB   rd   r   r   r   r   r  re   r   r   r   r   rH  )rV   ra  r!  r2  base_templatesr  r  rC   rC   rD   r`  
  sH   



z.CppClassScope.declare_inherited_cpp_attributesc              	   C   s   t | j| j}||_| j D ]F}|jr&|j|j|j||j	|j
dd q|jjrD| D ]}|j|j|j||j	|j
|jd q.q||j|j||j	|j
|j q|S )Nr   )rG  )r   )r"  rc   r   rd   r   rs  r   rH  r  re   rB   r   rs   r  r   r   r   )rV   rs  
type_entryr   r  r  rC   rC   rD   r  
  s4   


zCppClassScope.specializerS   )Nr,   FFFFN)Nr,   r   r   r   rC   NF)r[   r\   r]   r7  default_constructorrd   rW   r   r  r`  r  rC   rC   rC   rD   r"  y
  s    


&&r"  c                   @   s    e Zd Zdd Z	dddZdS )CppScopedEnumScopec                 C   s   t | ||d  d S rS   r  r  rC   rC   rD   rW     r   zCppScopedEnumScope.__init__Nr,   c                 C   s0   |s|}|  || | |||||}d|_|S r  )r  r?  r   )rV   rc   rd   re   rB   r   r   r  rC   rC   rD   r     s   zCppScopedEnumScope.declare_var)Nr,   N)r[   r\   r]   rW   r   rC   rC   rC   rD   r6    s    r6  c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )r  r   c                 C   s8   |j r| nd }tj| |||d |j| _|j| _d S )Nr  )r   r  r   rW   r  ry  )rV   rc   r  r   rC   rC   rD   rW   %  s   zPropertyScope.__init__c                 O   s   |j jr	t|d |jr|jd jtu r| jj|jd _n#t|jdkr*t|d n|jd jj	s@|jd j| jju s@t|d t
j| |||g|R i |}d|_|S )z'Declare a C property function.
        z&C property method cannot return 'void'r   r   z4C property method must have a single (self) argumentz6C property method must have a single (object) argumentT)r  r  r   r6  rd   r   r   r  r|   ry  r   r  r   )rV   rc   rd   re   r6  kwargsr  rC   rC   rD   r  ,  s   
"
zPropertyScope.declare_cfunctionFc                 C   s<   t |}|r| ||t|d}d|_||_|S t|d d S )Nrb   r   zKOnly __get__, __set__ and __del__ methods allowed in a property declaration)r   r?  r   r   r  r   )rV   rc   re   r  r  r  rC   rC   rD   r  >  s   
z PropertyScope.declare_pyfunctionNr  )r[   r\   r]   r	  rW   r  r  rC   rC   rC   rD   r    s
    r  c                   @   s   e Zd ZdddZdd ZdS )CConstOrVolatileScoper   c                 C   s0   t | d|j |j|j || _|| _|| _d S )Ncv_)r   rW   rc   r   r   base_type_scoper   is_volatile)rV   r:  r   r;  rC   rC   rD   rW   N  s   
zCConstOrVolatileScope.__init__c                 C   s<   | j |}|d urt|}t|j| j| j|_|S d S rS   )r:  rT  r  r   c_const_or_volatile_typerd   r   r;  r  rC   rC   rD   rT  X  s   
z!CConstOrVolatileScope.lookup_hereN)r   r   )r[   r\   r]   rW   rT  rC   rC   rC   rD   r8  L  s    

r8  c                   @   s   e Zd Zdd ZdS )TemplateScopec                 C   s   t | ||d  |j| _d S rS   )r   rW   ry  r  rC   rC   rD   rW   b  rq   zTemplateScope.__init__N)r[   r\   r]   rW   rC   rC   rC   rD   r=  a  s    r=  rS   )8
__future__r   r2  r  r&  r  r  ImportErrorUtilsr   Errorsr   r   r   r	   StringEncodingr
   ra   r   r   r   r   r   	TypeSlotsr   r   r   r   r   r   r   r@   rE   rP   objectrR   r`   r   r   r  r  const_counterr+  r1  r  r  r  rS  r  r  r"  r"  r6  r  r8  r=  rC   rC   rC   rD   <module>   sr   

 W$      MZ    }mG*-0   $ /