o
    e                    @   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 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%Z/G d-d. d.e/Z0G d/d0 d0e/Z1G d1d2 d2e%Z2G d3d4 d4e%Z3G d5d6 d6e%Z4G d7d8 d8e%Z5G d9d: d:e%Z6dS )<    )absolute_importN   )try_finally_contextmanager   )warningerrorInternalError)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>$   continueswitchforintdoublewhiledefaultregisterZtypedefsizeofdoifelseZgotobreakunionZshortZrestrictZvoidZunsignedZstaticconstZvolatilefloatstructcasereturnsignedenumautoZ_Boolz_Complex, _Imaginarycharexterninlinelongc                 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 r8   FD:\Projects\ConvertPro\env\Lib\site-packages\Cython/Compiler/Symtab.pyc_safe_identifier'   s
   
r:   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decoder3   r   r4   Zpyunicode_identifier_prefix)r7   Zmangle_withr8   r8   r9   punycodify_name/   s    rC   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)selfrG   rH   r8   r8   r9   __init__I   s   
zBufferAux.__init__c                 C   s
   d| j  S )Nz<BufferAux %r>)r2   rI   r8   r8   r9   __repr__M      
zBufferAux.__repr__N)__name__
__module____qualname__Zwritable_neededrJ   rL   r8   r8   r8   r9   rE   F       rE   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ddZLd	d
 ZMdd ZNdd ZOdd ZPdd ZQdd ZReSdd ZTdd ZUdd ZVdS )EntryFr    NprivateTc                 C   s@   || _ || _|| _|| _|| _g | _g | _g | _g | _| | _	d S rF   )
namer7   typeposinitoverloaded_alternativescf_assignmentscf_referencesinner_entriesdefining_entry)rI   rU   r7   rV   rW   rX   r8   r8   r9   rJ      s   
zEntry.__init__c                 C   s   dt | jt| | j| j f S )Nz%s(<%x>, name=%s, type=%s))rV   rN   idrU   rK   r8   r8   r9   rL     s   zEntry.__repr__c                 C   s   t | jd d S )NPrevious declaration is here)r   rW   rK   r8   r8   r9   already_declared_here     zEntry.already_declared_herec                 C   s   t |d| j  |   d S )Nz('%s' does not match previous declaration)r   rU   r`   )rI   rW   r8   r8   r9   
redeclared     zEntry.redeclaredc                 C      | g| j  S rF   )rY   rK   r8   r8   r9   all_alternatives     zEntry.all_alternativesc                 C   rd   rF   )r\   rK   r8   r8   r9   all_entries  rf   zEntry.all_entriesc                 C   s0   t | trt |tr| j| jf|j|jfk S tS rF   )
isinstancerR   rU   r7   NotImplemented)leftrightr8   r8   r9   __lt__  s   zEntry.__lt__c                 C   s   t | jdkS Nr   )lenrZ   rK   r8   r8   r9   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 )NTZOptionalLocalsCppSupport.cpp)rV   is_cpp_classis_cpp_optionalutility_coder   UtilityCodeload_cachedutility_code_definitionrK   r8   r8   r9   make_cpp_optional  s   
zEntry.make_cpp_optionalc                 C   s   | j r|| j v S dS NF)pytyping_modifiers)rI   Zmodifier_namer8   r8   r9   declared_with_pytyping_modifier"     z%Entry.declared_with_pytyping_modifierNN)WrN   rO   rP   Zinline_func_in_pxdZborrowedrX   
annotationZpep563_annotation
visibility
is_builtin
is_cglobalis_pyglobal	is_memberis_pyclass_attris_variableis_cfunction
is_cmethodis_builtin_cmethodZis_unbound_cmethodis_final_cmethodis_inline_cmethodis_anonymousis_type	is_cclassrq   is_constis_propertyis_cproperty	doc_cnameZgetter_cnameZsetter_cnameZis_self_argis_argis_local
in_closurefrom_closurein_subscopeZis_declared_genericis_readonlyZpyfunc_cname
func_cnamefunc_modifiersfinal_func_cnamedocas_variableZxdecref_cleanupin_cinclude	as_moduleis_inheritedZpystring_cnameZis_identifierZis_internedused
is_specialdefined_in_pxdis_implementedapirs   is_overridableZ
buffer_aux
prev_entryZmight_overflowZfused_cfunctionZis_fused_specializedrv   needs_propertyin_with_gil_blockZfrom_cython_utility_codeZerror_on_uninitializedZcf_usedouter_entry
is_cgetterrr   known_standard_library_importry   Zenum_int_valuerJ   rL   r`   rb   re   rg   rl   propertyro   rw   rz   r8   r8   r8   r9   rR   Q   s    [

rR   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 rF   )rR   rJ   rU   r7   rV   rW   r   scoper]   r\   rZ   r[   rY   rr   append)rI   r   r   Zoutermost_entryr8   r8   r9   rJ   ,  s$   
zInnerEntry.__init__c                 C   s   | dr	t|t| j|S )Nr0   )r3   AttributeErrorgetattrr]   rI   rU   r8   r8   r9   __getattr__@  s   
zInnerEntry.__getattr__c                 C   
   | j  S rF   )r]   rg   rK   r8   r8   r9   rg   F  rM   zInnerEntry.all_entriesN)rN   rO   rP   __doc__r   rJ   r   rg   r8   r8   r8   r9   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   FrS   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_.Z_dot_rW   )!rU   outer_scopeparent_scopern   rA   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_entriesZdefined_c_classesZimported_c_classesZcname_to_entryZidentifier_to_entryZnum_to_entryZobj_to_entryZbuffer_entrieslambda_defsid_countersscope_predefined_namesdeclare_varr   )rI   rU   r   r   mangled_nameZ
qual_scopevar_namer8   r8   r9   rJ     s@   

zScope.__init__c                 C      | S rF   r8   )rI   memor8   r8   r9   __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 rF   rU   ).0er8   r8   r9   	<genexpr>  s    z!Scope.merge_in.<locals>.<genexpr>)r   itemsr   r   updater   r   rU   )
rI   otherZmerge_unusedZ	allowlistr   rU   entryattrZself_entriesnamesr8   r8   r9   merge_in  s    


zScope.merge_inc                 C   s   d| j j| jf S )Nz<%s %s>)	__class__rN   r   rK   r8   r8   r9   __str__     zScope.__str__c                 C      | j S rF   r   rK   r8   r8   r9   r        zScope.qualifying_scopec                 C   s(   |rt d|| j|f S | j|| jS )Nz%s%s%s)rC   r   r   manglerU   rI   prefixrU   r8   r8   r9   r     s   zScope.manglec                 C   s   dt j|f }| |S )Nz%s%s_)r   r4   r   )rI   rU   r   r8   r8   r9   mangle_internal  s   
zScope.mangle_internalc                 C   s   | j r	| j |S |S rF   )r   mangle_class_private_namer   r8   r8   r9   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)rI   rU   Zcounterscountr8   r8   r9   next_id  s   
zScope.next_idc                 C   r   z6 Return the module-level scope containing this scope. )r   r   rK   r8   r8   r9   r        
zScope.global_scopec                 C   r   r   )r   builtin_scoperK   r8   r8   r9   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)rI   r   r8   r8   r9   iter_local_scopes  s   zScope.iter_local_scopesc                 c   s&    | j }|d ur|| _ d V  || _ d S rF   )in_c_type_context)rI   r   Zold_c_type_contextr8   r8   r9   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   )Z	is_bufferrh   
LocalScoper   r   rematchr   r   is_builtin_scoper   rV   is_cppre   argsis_cpp_class_scoper   r`   rR   create_wrapperr   r   is_memoryviewslicedefault_valuerX   r   r~   )rI   rU   r7   rV   rW   r~   shadowr   r  r   Z	old_entryZcpp_override_allowed	alt_entryr   r8   r8   r9   declare   sJ   

zScope.declarec                 C   s   t d| j|f S Nz%s.%s)r	   r   r   r8   r8   r9   r   :  r   zScope.qualify_namerT   c	           
      C   sP   |s| j s|dks|r|}n| tj|}| j||||||d}	d|	_||	_|	S )Npublic)r  r   )r   r   r   Zenum_prefixr  r   Z
value_node)
rI   rU   rV   valuerW   r7   r~   r   r  r   r8   r8   r9   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   )rI   rU   rV   rW   r7   r~   r   definingr  templater   r8   r8   r9   declare_typeI  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 )NrT   r-   r   )r~   r   )r   r   r   type_prefixr  r   lookuprU   rV   r   Zcreate_typedef_type
ValueErrorr   r   
error_typer  r   )rI   rU   	base_typerW   r7   r~   r   	namespacerV   r   r   r8   r8   r9   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 )Nr	  )in_cpp)r~   r   r  '%s' redeclared  r   2'%s' already defined  (ignoring second definition))r   r   r   r  lookup_herer   r   ZCStructOrUnionTyper  r   r   r   r   rV   Zis_struct_or_unionkindr   r   check_previous_typedef_flagcheck_previous_visibilityr   r  r   r  rU   r  )rI   rU   r  r   typedef_flagrW   r7   r~   r   packedr   r  rV   r8   r8   r9   declare_struct_or_uniont  s<   
zScope.declare_struct_or_unionr8   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 )NrT   )	templates)r~   r  r   r  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   r  r   r   base_classesrV    declare_inherited_cpp_attributes)r   r"  
base_classdeclare_inherited_attributesrW   r8   r9   r&    s   

z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesthis)rU   r7   rV   rW   )r   r   r   r  listr  r   ZCppClassTyper  r   r   r   rV   rq   r   r`   r   r   r   r"  r   r   CPtrTyperW   r  r   r  rU   r  )
rI   rU   r   rW   r7   r"  r~   r   r   rV   r8   r%  r9   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')cdefZctypedef)rV   r  r   rU   )rI   r   r  rW   r8   r8   r9   r    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   rU   )rI   r   r~   rW   r8   r8   r9   r    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 )Nr	  r-   )r   )r7   r~   r   ZEnumClassDeclrp   )r   r   r   r  r  r   r  rU   rV   r   ZCppScopedEnumTypeZ	CEnumTypeZc_anon_enum_typer  r   rt   ru   rs   use_entry_utility_coder  Zenum_valuesr   r   )rI   rU   rW   r7   Zscopedr  r~   r   r  r   r  rV   r   r8   r8   r9   declare_enum  s.   
zScope.declare_enumc                 C      | j ||S rF   )r   declare_tuple_type)rI   rW   
componentsr8   r8   r9   r/       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 )NrT   r   r-   
cpp_locals)r   r   
var_prefixr  r   rq   
directivesrw   check_nullary_constructorr   r   r   ry   rI   rU   rV   rW   r7   r~   r   in_pxdis_cdefry   r   r8   r8   r9   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   )rI   rW   	modifiersallowedmodifierr8   r8   r9   _reject_pytyping_modifiers  s   z Scope._reject_pytyping_modifiersc                 C      |  |||S rF   r   rI   rU   rV   rW   r8   r8   r9   $declare_assignment_expression_target  s   z*Scope.declare_assignment_expression_targetc                 C   s   |  |}| j||S rF   )r   r   declare_builtinrI   rU   rW   r8   r8   r9   rA  !  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 declaredr_   r~   )
rV   r   r   rW   r   r   r   	signaturer   r   )rI   rU   rW   r~   r   r8   r8   r9   _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   rC  rT   r7   r~   T)r  rE  rV   is_unspecifiedr   r   r	   rU   r   r   r   rD  r   )rI   rU   rW   allow_redefiner~   r   r8   r8   r9   declare_pyfunction.  s$   



zScope.declare_pyfunctionc                 C   sl   |  tjd |}|  tjd |}| |}| d |t|d}t||_||_||_	||_
t|_d|_|S )NZfuncdef_Zmethdef_rT   T)r   r   Zlambda_func_prefixr   r  r   r	   rU   r   pymethdef_cnamer   r   rD  r   )rI   Zlambda_namerW   r   rJ  r   r   r8   r8   r9   declare_lambda_functionB  s   

zScope.declare_lambda_functionc                 C      | j | d S rF   )r   r   rI   Zdef_noder8   r8   r9   add_lambda_defQ  ra   zScope.add_lambda_defc                 C   rL  rF   )r   r   rI   r   r8   r8   r9   register_pyfunctionT  ra   zScope.register_pyfunctionc                 C   sZ  |s|dks|r|}n|  tj|}| |}|r|s/||jkr/|dkr/d}|j}||_||_|dkrD||jkrDt|d||j|f d ||jkrWt|d||rQdndf d |j	
|rf|j	|j|_	nm|dkr|jdkr| j}|  ryd}n|r|s| D ]}|jr||jkr nqd}|r| ||||||	}| |_|}n/t|d	d ||_	n%|s|jr||j	r||_	nt|d	 n| ||||||	}||_||_|r|dkrd|_|rd|_|s|s|dkrt|d
|  |rd|_|	r|	|_|
r|jr	J d||f |
|_|r(t||t}| ||_d|_d|_|j|_||_ ||_!|S )NrT   r-   Tz6Function '%s' previously declared as '%s', now as '%s'r   z)Function '%s' previously declared as '%s'Zcpdefr+  6Function signature does not match previous declaration3Non-extern C function '%s' declared but not definedz2duplicate utility code definition in entry %s (%s))"r   r   func_prefixr  r~   r7   r   r   r   rV   same_aswith_with_gilwith_gilr   r   re   add_cfunctionrY   r   compatible_signature_withr   r   r   r   rs   rR   r   r   r   r   r   r   r   r   )rI   rU   rV   rW   r7   r~   r   r7  r  r9  rs   overridabler   Zcan_overrider  temp	var_entryr8   r8   r9   declare_cfunctionW  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 ))exception_valueexception_checknogilrV  Zis_const_methodis_static_methodNr8   )r   kr8   r8   r9   r     s
    
z(Scope.declare_cgetter.<locals>.<genexpr>rI   )r7   r~   r9  r  T)allr   	CFuncTypeCFuncTypeArgparent_typer\  r   r   )rI   rU   return_typerW   r7   r~   r9  r  Zcfunc_type_configZ
cfunc_typer   r8   r8   r9   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 rm   )r  r   r   is_fusedr   r   rn   reversedr   rV   insert)rI   rU   rV   rW   r7   r~   r9  	inheritedr   icfunc_entryr8   r8   r9   rW    s   



zScope.add_cfunctionc                 C   s$   |  |}|r	|S t|d|  d S )Nz'%s' is not declared)r  r   rI   rU   rW   r   r8   r8   r9   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   )ro  r   r   join)rI   pathrW   r   rU   r   r8   r8   r9   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 rF   )r   r  r   r  r   _emit_class_private_warningrW   )rI   rU   r   r   r8   r8   r9   r    s   


zScope.lookupc                 C   s*   | j | |d }|r|S | j |d S rF   )r   getr   rI   rU   r   r8   r8   r9   r    s   zScope.lookup_herec                 C   s   | j |d S rF   )r   rt  r   r8   r8   r9   lookup_here_unmangled   r1  zScope.lookup_here_unmangledc                 C   s
   |  |S rF   )r  r   r8   r8   r9   #lookup_assignment_expression_target  s   
z)Scope.lookup_assignment_expression_targetc                 C   sF   |  |}|s| |}|r|jr| |j| |s!| |td }|S rF   )r  rv  r   rs  rW   r   r   ru  r8   r8   r9   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 rF   )r   rV   rh  fused_to_specific
specializerO  r8   r8   r9   $_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)r  r{  r   Builtinr|  )rI   rU   r   tpr|  r8   r8   r9   lookup_type  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 r8   rV   r   argr8   r8   r9   
<listcomp>/      z)Scope.lookup_operator.<locals>.<listcomp>r   r   c                 S   r  r8   r  r  r8   r8   r9   r  H  r  )rV   rq   r   r  r   
best_matchre   rn   ranger(  r   )rI   r   operandsobj_typemethodZ	arg_typesresfunctionZfunction_alternativesZmethod_alternativesnre   r8   r8   r9   lookup_operator*  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)rN   rO   rP   r8   r8   r8   r9   FakeOperandM  s    r  c                    s   g | ]} |d qS )r  r8   )r   rV   r  rW   r8   r9   r  O  s    z3Scope.lookup_operator_for_types.<locals>.<listcomp>)ZNodesr  r  )rI   rW   r   typesr  r  r8   r  r9   lookup_operator_for_typesK  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   )rI   rW   rU   r8   r8   r9   rs  R  s
   z!Scope._emit_class_private_warningc                 C      |   | d S rF   )r   use_utility_coderI   Znew_coder8   r8   r9   r  W  r   zScope.use_utility_codec                 C   r  rF   )r   r,  rO  r8   r8   r9   r,  Z  r   zScope.use_entry_utility_codec                 C   s   |D ]
}|| j v r dS qdS Nr   r   )r   rI   r   rU   r8   r8   r9   defines_any]  s
   
zScope.defines_anyc                 C   s*   |D ]}|| j v r| j | jr dS qdS r  )r   r   r  r8   r8   r9   defines_any_speciald  s
   zScope.defines_any_specialc                 C      ddl m} | |  d S )Nr   )get_type_inferer)TypeInferencer  infer_types)rI   r  r8   r8   r9   r  k     zScope.infer_typesc                 C   s   | j }|d u r	dS | S rx   )r   r   )rI   outerr8   r8   r9   r   o  s   zScope.is_cppc                 C   s   | j ||| d S rF   )r   add_include_file)rI   filenameverbatim_includelater8   r8   r9   r  v  r{   zScope.add_include_file)TNrF   )r   r   r   )NrT   r   r   )NrT   r   r   r   r   )NrT   r   )NrT   r   F)Nr8   r-   N)rT   r   r   NNrT   FFFN)r8   )r-   N)Fr-   NrT   r   r   r   r8   NF)NNrT   r8   FFrx   )OrN   rO   rP   r   is_py_class_scopeis_c_class_scopeis_closure_scopeis_local_scopeis_generator_expression_scopeis_comprehension_scopeis_passthroughr  is_property_scopeis_module_scopeis_c_dataclass_scopeZis_internalr   r   r_  ry  rf  r   r   rJ   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r  r*  r  r  r-  r/  r   r<  r@  rA  rE  rI  rK  rN  rP  r\  rg  rW  ro  rr  r  r  rv  rw  rx  r{  r  r  r  rs  r  r,  r  r  r  r   r  r8   r8   r8   r9   r   J  s    #$



:



&
6


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

!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 rF   )r   rJ   r
   
pre_importrK   r8   r8   r9   rJ   ~     zPreImportScope.__init__c                 C   s"   |  ||t|d}d|_d|_|S )NrT   T)r  r   r   r   rn  r8   r8   r9   rA    s   zPreImportScope.declare_builtinN)rN   rO   rP   r   Zpreimport_cnamenamespace_cnamerJ   rA  r8   r8   r8   r9   r  z  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   rJ   r  
type_namesr   r   rK   r8   r8   r9   rJ     s
   
zBuiltinScope.__init__Nc                 C   s,   |dkr|d u r|dv }|sd}t | |S )Nstr)Nr   unicode)r   r  )rI   rU   language_level
str_is_strr8   r8   r9   r    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   rA  r
   error_on_unknown_namesr   r   rB  r8   r8   r9   rA    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~   rs   *r   )r	   r\  rR   r   r   r   r   r   rs   r   r   )rI   rU   rV   r7   Zpython_equivrs   r   r[  r8   r8   r9   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~   re  r  Tr   rC  rV   rU   rV   rW   r7   )r	   CClassScoper4  is_final_type	set_scoper  r  rs   rR   rU   r  rV   rW   typeptr_cnamer   r   r   r   r   r   r   r
   cache_builtinsr   r   )
rI   rU   r7   rs   objstruct_cnameZ
type_classrV   r   r   r[  r8   r8   r9   declare_builtin_type  s6   


z!BuiltinScope.declare_builtin_typec                 C   r   rF   r8   rK   r8   r8   r9   r     r   zBuiltinScope.builtin_scoper|   )rN   rO   rP   r   rJ   r  rA  r  r   ZBuiltinObjectTyper  r   r8   r8   r8   r9   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__rN   __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}  rS   r   zPython.hT)initial)%rS   r}  parent_moduler   r   rJ   
is_packagemodule_namer	   contextr   Zmodule_cnameZmoddict_cnameZmodule_dict_cnameZmethtable_cnamemethod_table_cnamer   Zmoddoc_cnamer   utility_code_listmodule_entries
c_includesdictr  Zpxd_file_loadedcimported_modulesr   Ztypes_importedZincluded_filesZhas_extern_classcached_builtinsundeclared_cached_builtinsr  _cached_tuple_typesprocess_includer   IncludeCode)rI   rU   r  r  r  r}  r   r8   r8   r9   rJ     s6   zModuleScope.__init__c                 C   r   rF   )r  rK   r8   r8   r9   r   "  r   zModuleScope.qualifying_scopec                 C   r   rF   r8   rK   r8   r8   r9   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  )r  r  r  r   unicode_literalsZfuture_directivesr   r  )rI   rU   r  r  r   r8   r8   r9   r  (  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)rU   rV   rW   _structr&   T)r  rW   r7   )tupler  r   r   Zc_tuple_typer7   r  StructOrUnionScope	enumerater   r  r   removestruct_entryr  r   )
rI   rW   r0  ttyper7   r   r   Zix	componentr  r8   r8   r9   r/  5  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   rT   r   globalsZ__Pyx_Globals)r  r  r   Znon_portable_builtins_mapZuncachable_builtinshas_import_starr   r   r
   r  r   r   r  r   r  r  rU   old_style_globalsr   r  r   r   Zbuiltin_prefixr7   r   r  r   r   r   rn  r8   r8   r9   rA  I  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_modulerW   absolute_fallbackZrelative_import)r  r  r   r  find_module)	rI   r  rW   Zrelative_levelZis_relative_importr  r  Z	top_levelZmodule_scoper8   r8   r9   r  n  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)r  r  r  )
as_package)splitlookup_submoduler  r  r  find_submodule)rI   rU   r  	submoduler   r8   r8   r9   r    s   

zModuleScope.find_submodulec                 C   sF   d|v r| dd\}}nd }| j|d }|r!|d ur!||}|S )Nr   r   )r  r  rt  r  )rI   rU   r  moduler8   r8   r9   r    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   r  r  )rI   r  r  r  incr8   r8   r9   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)Z	mainpieceZsortkeyZdict_updater  )rI   r  r   r8   r8   r9   r    s
   zModuleScope.process_includec                 C   sN   || j vr#|j D ]}| | q
| j | |j D ]	}| | qd S d S rF   )r  r  valuesr  r   add_imported_module)rI   r   r  mr8   r8   r9   r    s   

zModuleScope.add_imported_modulec                 C   s8   |j rd|_|| jvr|| j|< d S t|d| d d S )NTr  r   )r   r   r   r   )rI   rU   r   rW   r8   r8   r9   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   )r  r   r   r   r   r   r  )rI   rU   r   rW   r   r8   r8   r9   declare_module  s   


zModuleScope.declare_modulerT   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)rT   r	  r-   z+Module-level variable cannot be declared %s)ztyping.Optionalz7Non-cdef global variable is not a generic Python objectr-   r	  z6Variable '%s' type does not match previous declarationr   rT   Tr7   r~   r   r7  r8  ry   )r   r<  r   r   is_pyobjectis_extension_typer   r   r   r3  r  r   rV   rT  r~   r   r7   r   r   r   r   declaration_valuerX   r   r   r   r
   Zcimport_from_pyxr   )rI   rU   rV   rW   r7   r~   r   r7  r8  ry   r  r   mangled_cnamer8   r8   r9   r     sT   




zModuleScope.declare_varr8   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-   r	  z6Extern functions cannot have default arguments values.rT   )r7   r~   r   r7  r  r9  rs   rY  )r   r   r   rS  Zoptional_arg_countr   r  r   r~   r7   r   r   r\  )rI   rU   rV   rW   r7   r~   r   r7  r  r9  rs   rY  r   r  r8   r8   r9   r\  2  s.   




zModuleScope.declare_cfunctionc                 C   s$   |  |}|s| |t| d S d S rF   )r  r   r   rn  r8   r8   r9   declare_globalO  s   
zModuleScope.declare_globalc                 C   s   |d ur| j | d S d S rF   )r  r   r  r8   r8   r9   r  T  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 rF   )rs   r  r   rv   rO  r8   r8   r9   r,  X  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-   r	  z6ctypedef only valid for 'extern' , 'public', and 'api'r   r   r!  )
check_size)r~   r  r  Tz5Object name required for 'public' or 'extern' C class)rU   r   r~   re  zC class '%s' already definedz C class '%s' already implementedr   rT   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   r  rV   r   r  r   definedr  r  r   r   ZPyExtensionTyperW   buffer_defaultsobjtypedef_cnamer  r   r  r   r   Ztypeptr_prefixr  r   r  r   Zobjstruct_prefixattach_var_entry_to_c_classr   r   r  r4  copydeclare_inherited_c_attributesr  r   implementedr   r~   r   typeobj_cnamert  r  rt   r
  rh   Zhas_sequence_flagr   )rI   rU   rW   r  Zimplementingr  r  r  r  r  r~   r  r   r  r  r  r  r   rV   r   r	  r
  r8   r8   r9   declare_c_class`  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  )rV   r  vtabslot_cnamer   obj_base_cnamer   r   rn   is_builtin_typer   Zvtabstruct_prefixrU   Zvtabstruct_cnameZvtabptr_prefixZvtabptr_cname)rI   r   rV   Zentry_countr  r8   r8   r9   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   rV   r   r   rW   rU   rO  r8   r8   r9   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)rV   rU   r~   r   r   rW   r  r   r   Ztypeobj_prefixr   r   r   r  Zvtable_prefixZvtable_cname)rI   r   rV   rU   r~   Zmethod_entryr8   r8   r9   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   rU   rV   r~   r  )rI   Zdebug_check_c_classesr   r8   r8   r9   check_c_classes  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-   rR  )
r   r   r   r   r   r~   r   r   r   rW   ru  r8   r8   r9   check_c_functions6  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   r  r  )rS   r}  rR   rU   Z	type_typerW   rV   r  r   r   r   r   r   r   )rI   r   r}  r[  r8   r8   r9   r  B  s   
z'ModuleScope.attach_var_entry_to_c_classc                 C   r   rF   )cpprK   r8   r8   r9   r   U  r   zModuleScope.is_cppc                 C   r  )Nr   )PyObjectTypeInferer)r  r   r  )rI   r   r8   r8   r9   r  X  r  zModuleScope.infer_typesr  r|   )r   rx   r  r  )r   r   NNNNNrT   r   r   NNr   )$rN   rO   rP   r  r  Zis_cython_builtinr  r   rJ   r   r   r  r/  rA  r  r  r  r  r  r  r  r   r   r\  r  r  r,  r  r  r  r  r  r  r  r   r  r8   r8   r8   r9   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 )r   TFNc                 C   s    |d u r|}t | ||| d S rF   r   rJ   )rI   rU   r   r   r8   r8   r9   rJ   f  s   zLocalScope.__init__c                 C   s   t || S rF   )rC   r   r8   r8   r9   r   k  rf   zLocalScope.manglec                 C   sR   |  |}| tj|}| ||||d}d|_|jrd|_d|_| j	
| |S )NrT   r   0)r   r   r   r3  r  r   r  rX   r   r   r   )rI   rU   rV   rW   r7   r   r8   r8   r9   declare_argn  s   
zLocalScope.declare_argrT   c
                 C   sn   |  |}|dv rt|d|  tj| |||||||||	d
}
|
jjr(|
jj|
_d|
_| j|
_	| j
|
 |
S )Nr	  readonlyz$Local variable cannot be declared %sr  r   )r   r   r   r   rV   r  rX   r   _in_with_gil_blockr   r   r   r6  r8   r8   r9   r   {  s   

zLocalScope.declare_varc                 C   6   |  |rt|dd d S |  |}|| j|< d S Nr  r   r  r   r   rx  r   rn  r8   r8   r9   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)r  r   r   r   r`   r  rI   rU   rW   Z
orig_entryr   r8   r8   r9   declare_nonlocal  s   

zLocalScope.declare_nonlocalc                 C   s$   d|_ t|| }d|_|| j|< |S NT)r   r   r   r   )rI   rU   r   Zinner_entryr8   r8   r9   _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 )NZscope_classz#lookup() after scope class created.)	r   r  r   r  r   r  r  r   r/  )rI   rU   r   Zentry_scoper8   r8   r9   r    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->%sr2  )r   r   r  r   r   r7   r  r3   r   Zcur_scope_cnamern   r   Zoriginal_cnamerV   rq   r   r4  rw   )rI   Zouter_scope_cnamer   r   r7   r8   r8   r9   mangle_closure_cnames  s"   z LocalScope.mangle_closure_cnamesrF   r  )rN   rO   rP   r  Zhas_with_gil_blockr&  rJ   r   r#  r   r  r-  r/  r  r0  r8   r8   r8   r9   r   ]  s    

r   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   Zgenexpr_id_refr   rJ   r4  r4   rn   genexp_prefixr  r  r   r   r   add)rI   r   r   rU   r8   r8   r9   rJ     s   zComprehensionScope.__init__c                 C   s   d| j | j||f S N%s%s)r2  r   r   r   r8   r8   r9   r     s   zComprehensionScope.mangleNrT   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 )Nr5  T)r   r   r  r   rV   r<  r2  r   r   r   r3  r   r  r  r   r   r   r   r   r   )rI   rU   rV   rW   r7   r~   r   r7  r8  ry   r   r   r8   r8   r9   r     s   
"
zComprehensionScope.declare_varc                 C      | j |||S rF   )r   r   r?  r8   r8   r9   r@    s   z7ComprehensionScope.declare_assignment_expression_targetc                 C   r6  rF   )r   rI  rI   rU   rW   rH  r8   r8   r9   rI     s   z%ComprehensionScope.declare_pyfunctionc                 C   r.  rF   )r   rK  )rI   r   rW   r8   r8   r9   rK    r1  z*ComprehensionScope.declare_lambda_functionc                 C      | j |S rF   )r   rN  rM  r8   r8   r9   rN    rf   z!ComprehensionScope.add_lambda_defc                 C   s   |  |}|s| j|}|S rF   )r  r   rw  ru  r8   r8   r9   rw  
  s   
z6ComprehensionScope.lookup_assignment_expression_target)NrT   FFTNr  )rN   rO   rP   r   r  rJ   r   r   r@  rI  rK  rN  rw  r8   r8   r8   r9   r1    s    

r1  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 r4  )r   rJ   r   Zclosure_scope_prefixZclosure_cname)rI   rU   Z
scope_namer   r   r8   r8   r9   rJ     s   zClosureScope.__init__Fc                 C   s   t j| |||ddS )NrT   rC  )r   rI  r7  r8   r8   r9   rI  "  r{   zClosureScope.declare_pyfunctionc                 C   r=  rF   r>  r?  r8   r8   r9   r@  %  r1  z1ClosureScope.declare_assignment_expression_targetrF   r  )rN   rO   rP   r  rJ   rI  r@  r8   r8   r8   r9   r9    s
    

r9  c                   @   rD   )GeneratorExpressionScopeTc                 C   s   | j |||}| ||S rF   )r   r   r/  )rI   rU   rV   rW   r   r8   r8   r9   r@  ,  rc   z=GeneratorExpressionScope.declare_assignment_expression_targetc                 C   s.   |  |}|s| j|}|r| ||S |S rF   )r  r   rw  r/  ru  r8   r8   r9   rw  0  s   
z<GeneratorExpressionScope.lookup_assignment_expression_targetN)rN   rO   rP   r  r@  rw  r8   r8   r8   r9   r:  )  rQ   r:  c                   @   s4   e Zd ZdddZ			dddZ			dddZdS )r  ?c                 C   s   t j| |d d d d S )N)r   r   r!  r   r8   r8   r9   rJ   <  r  zStructOrUnionScope.__init__NrT   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 )NrT   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')r:   r   r   r)  r<  r  r   r   r   r  r   r  Zneeds_refcounting)rI   rU   rV   rW   r7   r~   r   r7  r8  ry   Zallow_pyobjectZallow_memoryviewZallow_refcountedr   r8   r8   r9   r   ?  s,   


zStructOrUnionScope.declare_varr   r8   c                 C   s"   |
rt |d | j|||||dS )Nz0C struct/union member cannot be declared 'cpdef'rF  )r   r   )rI   rU   rV   rW   r7   r~   r   r7  r  r9  rY  r8   r8   r9   r\  Z  s
   

z$StructOrUnionScope.declare_cfunction)r;  )	NrT   FFFNFFF)NrT   r   r   r   r8   F)rN   rO   rP   rJ   r   r\  r8   r8   r8   r9   r  9  s    

r  c                   @   s,   e Zd ZddgZdd Zdd Zdd Zd	S )

ClassScoperO   rP   c                 C   sJ   |r|  dr|S |r#|dr#|ds#td| jd|f }|S )NZ__pyx_r0   z_%s%s_)lowerr3   endswithr	   
class_namelstripr   r8   r8   r9   r   n  s
   z$ClassScope.mangle_class_private_namec                 C   s    t | ||| || _d | _d S rF   )r   rJ   r@  r   rI   rU   r   r8   r8   r9   rJ   v  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classmethodZ__Pyx_Method_ClassMethodrS   r   ZClassMethodzCythonFunction.cr   )r   r  rR   r   rc  r   rd  r   rt   ru   rv   r,  r   ru  r8   r8   r9   r  {  s    
zClassScope.lookupN)rN   rO   rP   r   r   rJ   r  r8   r8   r8   r9   r<  c  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   NrT   Fc
                 C   sD   |  |}|tu rt}tj| |||||||||	d
}
d|
_d|
_|
S )Nr  r   )r   r   r   r   r   r   r   r6  r8   r8   r9   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+  )r  r   r   r   r`   r  r   r,  r8   r8   r9   r-    s   

zPyClassScope.declare_nonlocalc                 C   r'  r(  r)  rn  r8   r8   r9   r    r*  zPyClassScope.declare_globalc                 C   r8  rF   )r   add_default_value)rI   rV   r8   r8   r9   rE    rf   zPyClassScope.add_default_valuer  )rN   rO   rP   r  r   r-  r  rE  r8   r8   r8   r9   rD    s    
rD  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<  rJ   r   r   Zmethtab_prefixr  Zgstab_prefixZgetset_table_cnameproperty_entriesinherited_var_entriesre  r  r  r  r  )rI   rU   r   r~   re  r8   r8   r9   rJ     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 )NZno_gcFT)	has_cyclic_pyobject_attrsr4  rt  re  r  r   needs_gcr  is_gc_simple)rI   r  r8   r8   r9   rI    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 )NZtrashcanFT)r4  rt  rH  re  r  r   needs_trashcanZbuiltin_trashcan)rI   	directiver  r8   r8   r9   rK    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.
        Zno_gc_clearF)rI  r4  rt  rK   r8   r8   r9   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)r  r   re  Z	is_externr  Zmultiple_basesr  r   )rI   Zcurrent_type_scopeZ	del_entryZcurrent_base_typer8   r8   r9   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 )Nr1   )
r   rV   r  is_closure_class_scoperU   rJ  r   r   Zc_py_buffer_typer  )rI   Zinclude_weakrefZinclude_gc_simpleZpy_attrsZ
py_buffersZmemoryview_slicesr   Zhave_entriesr8   r8   r9   get_refcounted_entries!	  s    


z"CClassScope.get_refcounted_entriesNrT   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.rT   r   r-   r2  Tz#include <new>r1   )rT   r	  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 PythonFr  )+r   r  Zequivalent_typer   r   r  r   r  rP  r   r4  get_special_method_signaturer:   rC   r   Zunicode_structmember_prefixr  r   r   r   ry   rq   rw   r5  r  has_memoryview_attrsZneeds_cpp_constructionr  r   rt   has_cpp_constructable_attrshas_pyobject_attrsr  r   rI  rH  r   Zcan_coerce_to_pyobjectr   r   r   r   r   r6  r8   r8   r9   r   4	  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 )	NZ__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-   rC  r   r   )r   r  r   r   r   r   r4  rR  rD  r   r   r   r   )rI   rU   rW   rH  r  r   Zspecial_sigr8   r8   r9   rI  	  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 )NrV  Z	__cinit__)rP  r	   r<  r  r   re  r  r  ru  r8   r8   r9   r  	  s   
zCClassScope.lookup_herer   r8   c                 C   s8  |  |}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|_'|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)rW  Z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   r_   r   )r~   r9  z2Signature not compatible with previous declarationzOC method '%s' not previously declared in definition part of extension type '%s'r.   Tr  )(r   r   r4  rR  re  r  r   r   r`  Zassignable_fromrV   r  rC   r:   r   Zunicode_vtabentry_prefixr   r`   r   r   r   Zsame_c_signature_asr_  rU  rV  rX  r  Z!same_c_signature_as_resolved_typer   r@  rW   rW  r   rS  rs   r   r   r  rt  r   )rI   rU   rV   rW   r7   r~   r   r7  r  r9  rs   rY  r   r   r8   r8   r9   r\  	  sx   







 zCClassScope.declare_cfunctionc           
   
   C   s4   |  |}tj| |||||||d}	d|	_||	_|	S )Nrk  r   )r  r<  rW  r   r   )
rI   rU   rV   rW   r7   r~   r9  rk  r   r   r8   r8   r9   rW  	  s   
zCClassScope.add_cfunctionc                 C   sT   t |}| j||d |d|d}t||t}||_d|_d|_||_|j|_||_	|S )Nr-   )rW   r7   r~   rs   r   )
r	   r\  rR   r   r   r   r   rs   r   r   )rI   rU   rV   r7   rs   r   r[  r8   r8   r9   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 )NrT   T)class_scope)
r  r  r   r   r   r   PropertyScoper   rF  r   )rI   rU   r   rW   ctypeZproperty_scoper   r8   r8   r9   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[  rW   rI   Nr   )r_  rV  r]  r^  )rU   rV   r7   rs   r~   rW   )r\  r   r\  r   rc  rd  re  )rI   rU   rV   Z
cfunc_namer   rW   r~   r_  rV  r]  r^  rs   Zproperty_entryrm  r8   r8   r9   declare_cproperty
  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  r7   r6   
base_entryr8   r9   adapt3
  ra   z9CClassScope.declare_inherited_c_attributes.<locals>.adaptrT   r   TrX  )rG  r   r  rU   r7   rV   r   r   r}   r   r   rh  Z"get_all_specialized_function_typesr   r   rW  rW   r~   r   r   r   r   r   r   rs   )rI   
base_scoper`  r   r   r7   r[  r   r8   r^  r9   r  /
  sP   



z*CClassScope.declare_inherited_c_attributes)FTr  r  r  rF   r|   )NNr-   FFNFN)rN   rO   rP   r  rP  rU  rS  rT  rH  r  r  rJ   rI  rK  rM  rO  rQ  r   rI  r  r\  rW  r  r\  r]  r  r8   r8   r8   r9   r    sB    


R

A
	

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   rJ   r4  rG  r  r   ZTemplatePlaceholderTyper   )rI   rU   r   r   TZtemplate_entryr8   r8   r9   rJ   f
  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 )NrQ  r   z%s::%sr'  r   )r<  r  rV   rT  rU  rV  r   rX  r   r  r   Zget_fused_typesZempty_declaration_coder   r   r   )rI   rU   rV   rW   r7   r~   r   r7  r8  r  ry   r   r8   r8   r9   r   p
  s$   

zCppClassScope.declare_varr   r8   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   rJ   z%s__init__%sr   c                 S   s.   | j jr| j jst| jt| j | jS | S rF   )rV   rq   Zis_referencer   rd  rU   Z
c_ref_typerW   )r  r8   r8   r9   	maybe_ref
  s
   z2CppClassScope.declare_cfunction.<locals>.maybe_refc                    s   g | ]} |qS r8   r8   r  rd  r8   r9   r  
  s    z3CppClassScope.declare_cfunction.<locals>.<listcomp>Z__dealloc__z%s__dealloc__%s<del>r   rf  zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.)r  r7   r~   )rU   r  r   rS  r	   r   Z	CVoidTyperf  r   Zoriginal_argsr_  rV   r"  r   r  r   rW   r  r   re   rY   rs   r   )rI   rU   rV   rW   r7   r~   r   r7  r  r9  rs   rY  r@  baser_  r   r   r8   re  r9   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  r8   r   )r   rc  r8   r8   r9   r  
  r  zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp>r8   rg  r-   r   r   )r   r9  rs   F)r  )r   r   ri  r   rG  r   rU   r   r  r7   rV   r   r   r   r   r\  rW   r~   r   rs   r   r  )rI   r$  ra  ri  Zbase_templatesr_  r   r8   r8   r9   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   )r  )rs   )rb  rU   r   rV   r   r  r   r  rz  rW   r7   r   re   r\  rs   r   r~   )rI   r  Z
type_entryr   r   r   r8   r8   r9   rz  
  s4   


zCppClassScope.specializerF   )Nr-   FFFFN)Nr-   r   r   r   r8   NF)rN   rO   rP   r  Zdefault_constructorrV   rJ   r   r\  r#  rz  r8   r8   r8   r9   rb  ^
  s    


&&rb  c                   @   s    e Zd Zdd Z	dddZdS )CppScopedEnumScopec                 C   s   t | ||d  d S rF   r!  rB  r8   r8   r9   rJ   
  r{   zCppScopedEnumScope.__init__Nr-   c                 C   s0   |s|}|  || | |||||}d|_|S r.  )r<  r  r   )rI   rU   rV   rW   r7   r~   ry   r   r8   r8   r9   r   
  s   zCppScopedEnumScope.declare_var)Nr-   N)rN   rO   rP   rJ   r   r8   r8   r8   r9   rj  
  s    rj  c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )rZ  r   c                 C   s8   |j r| nd }tj| |||d |j| _|j| _d S )Nr   )r   r   r   rJ   re  r4  )rI   rU   rY  r   r8   r8   r9   rJ   
  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)rf  Zis_voidr   r   rV   r   r   re  rn   r  r   r\  r   )rI   rU   rV   rW   r   kwargsr   r8   r8   r9   r\    s   
"
zPropertyScope.declare_cfunctionFc                 C   s<   t |}|r| ||t|d}d|_||_|S t|d d S )NrT   r   zKOnly __get__, __set__ and __del__ methods allowed in a property declaration)r   r  r   r   rD  r   )rI   rU   rW   rH  rD  r   r8   r8   r9   rI  #  s   
z PropertyScope.declare_pyfunctionNr  )rN   rO   rP   r  rJ   r\  rI  r8   r8   r8   r9   rZ    s
    rZ  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 )NZcv_)r   rJ   rU   r   r   base_type_scoper   is_volatile)rI   rm  r   rn  r8   r8   r9   rJ   3  s   
zCConstOrVolatileScope.__init__c                 C   s<   | j |}|d urt|}t|j| j| j|_|S d S rF   )rm  r  r  r   Zc_const_or_volatile_typerV   r   rn  ru  r8   r8   r9   r  =  s   
z!CConstOrVolatileScope.lookup_hereN)r   r   )rN   rO   rP   rJ   r  r8   r8   r8   r9   rl  1  s    

rl  c                   @   s   e Zd Zdd ZdS )TemplateScopec                 C   s   t | ||d  |j| _d S rF   )r   rJ   r4  rB  r8   r8   r9   rJ   G  rc   zTemplateScope.__init__N)rN   rO   rP   rJ   r8   r8   r8   r9   ro  F  s    ro  rF   )7
__future__r   r   r  r   r  r  ImportErrorZUtilsr   ZErrorsr   r   r   ZStringEncodingr	   rS   r
   r   r   r   r   Z	TypeSlotsr   r   r   r   r   r   r   r5   r:   rC   objectrE   rR   r   r   r  r  Zconst_counterr  r   r1  r9  r:  r  r<  rD  r  rb  rj  rZ  rl  ro  r8   r8   r8   r9   <module>   sr   

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