U
    {h                    @   s  d dl Z d dlZd dlZd dlZ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 dd Zd9ddZG dd dZG dd dZG dd deZG dd d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*Z+G d-d. d.e*Z,G d/d0 d0e Z-G d1d2 d2e Z.G d3d4 d4e Z/G d5d6 d6e Z0G d7d8 d8e Z1dS ):    N   )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)
DebugFlags)Codec                 C   s<   | d d dkr$|  tjs$| dkr.| tjkr8tj|  } | S )Nr   __)__weakref____dict__)
startswithr   pyrex_prefixZreserved_cnamescname r   :/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/Symtab.pyc_safe_identifier   s    
r   c                 C   sX   |   r| S | dddd} |r6d|| f } n| tjrT| tjtjd} | S )Npunycode   -   _asciiz%s_%sr   )isasciiencodereplacedecoder   r   r   Zpyunicode_identifier_prefix)r   Zmangle_withr   r   r   punycodify_name"   s     r(   c                   @   s    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)selfr+   r,   r   r   r   __init__:   s    zBufferAux.__init__c                 C   s
   d| j  S )Nz<BufferAux %r>r   r-   r   r   r   __repr__>   s    zBufferAux.__repr__N)__name__
__module____qualname__Zwritable_neededr.   r1   r   r   r   r   r)   7   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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ZMd ddZNeOjPr`eQd	d
 ZReRjSdd
 ZRdd ZTdd ZUdd ZVdd ZWd!ddZXdd ZYdd ZZeQdd Z[dd Z\dd Z]dS )"EntryFr    NprivateTc                 C   s@   || _ || _|| _|| _|| _g | _g | _g | _g | _| | _	d S r*   )
namer   typeposinitoverloaded_alternativescf_assignmentscf_referencesinner_entriesdefining_entry)r-   r8   r   r9   r:   r;   r   r   r   r.      s    zEntry.__init__c                 C   s
   | j d S )Nr9   r/   r0   r   r   r   r9      s    z
Entry.typec              	   C   s:   t d| j d| j d| jd d|  || jd< d S )NzENTRY [z] TYPE: r9   z -> )printr8   r   r   get)r-   new_typer   r   r   r9     s    ,c                 C   s   dt | jt| | j| j f S )Nz%s(<%x>, name=%s, type=%s))r9   r2   idr8   r0   r   r   r   r1     s    zEntry.__repr__c                 C   s   t | jd d S )NPrevious declaration is here)r   r:   r0   r   r   r   already_declared_here	  s    zEntry.already_declared_herec                 C   s   t |d| j  |   d S )Nz('%s' does not match previous declaration)r   r8   rG   )r-   r:   r   r   r   
redeclared  s    zEntry.redeclaredc                 C   s   | g| j  S r*   )r<   r0   r   r   r   all_alternatives  s    zEntry.all_alternativesc                 C   sb   d }| j d k	r|  ||}|d kr^| jjrD| j }dd |D }n|  }tj||||d}|S )Nc                 S   s   g | ]
}|j qS r   )entry).0fr   r   r   
<listcomp>  s     z-Entry.best_function_match.<locals>.<listcomp>)fail_if_emptyarg_is_lvalue_array)specialiserr9   is_fused"get_all_specialized_function_typesrI   r   
best_match)r-   scope	arg_typesrN   rO   Z
func_entryZ	functypesZalternativesr   r   r   best_function_match  s    

   zEntry.best_function_matchc                 C   s   | g| j  S r*   )r?   r0   r   r   r   all_entries!  s    zEntry.all_entriesc                 C   s4   t | tr,t |tr,| j| jf|j|jfk S tS d S r*   )
isinstancer5   r8   r   NotImplemented)leftrightr   r   r   __lt__$  s    zEntry.__lt__c                 C   s   t | jdkS Nr   )lenr=   r0   r   r   r   cf_is_reassigned*  s    zEntry.cf_is_reassignedc                 C   s0   | j jstd| _| jrttjdd| _d S )NTZOptionalLocalsCppSupport.cpp)	r9   is_cpp_classAssertionErroris_cpp_optionalutility_coder   UtilityCodeload_cachedutility_code_definitionr0   r   r   r   make_cpp_optional.  s    
zEntry.make_cpp_optionalc                 C   s   | j r|| j kS dS NF)pytyping_modifiers)r-   Zmodifier_namer   r   r   declared_with_pytyping_modifier4  s    z%Entry.declared_with_pytyping_modifier)NN)FN)^r2   r3   r4   inline_func_in_pxdZborrowedr;   
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_cclassis_cclass_var_entryra   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apird   rP   is_overridableZ
buffer_aux
prev_entryZmight_overflowZfused_cfunctionZis_fused_specializedrg   needs_propertyin_with_gil_blockZfrom_cython_utility_codeZerror_on_uninitializedZcf_usedouter_entry
is_cgetterrc   known_standard_library_importrj   Zenum_int_valuevtable_typer.   r   Zdebug_verbose_entry_typespropertyr9   setterr1   rG   rH   rI   rV   rW   r\   r_   rh   rk   r   r   r   r   r5   B   s   a




r5   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   sv   t | |j|j|j|j || _|| _|}|jr8|j}q*|| _|j	| _	|j
| _
|j| _|j| _|j| _| j	|  d S r*   )r5   r.   r8   r   r9   r:   r   rT   r@   r?   r=   r>   r<   rc   append)r-   r   rT   Zoutermost_entryr   r   r   r.   >  s"    
zInnerEntry.__init__c                 C   s   | drt|t| j|S )Nr   )r   AttributeErrorgetattrr@   r-   r8   r   r   r   __getattr__R  s    
zInnerEntry.__getattr__c                 C   s
   | j  S r*   )r@   rW   r0   r   r   r   rW   X  s    zInnerEntry.all_entriesN)r2   r3   r4   __doc__r   r.   r   rW   r   r   r   r   r   8  s
   r   c                   @   sj  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i Zdd Zdd	 Zdd
dZdd Zdd ZdddZdd Zdd ZdddZ e!dd Z"dd Z#dd Z$dd Z%e&dd d!Z'dd"d#Z(dd$d%Z)d&d' Z*dd)d*Z+dd,d-Z,dd.d/Z-dd0d1Z.dd4d5Z/d6d7 Z0d8d9 Z1dd:d;Z2d<d= Z3dd>d?Z4dd@dAZ5dBdC Z6dDdE Z7ddFdGZ8ddHdIZ9dJdK Z:dLdM Z;dNdO Z<ddPdQZ=ddRdSZ>ddTdUZ?dVdW Z@dXdY ZAdZd[ ZBd\d] ZCd^d_ ZDd`da ZEdbdc ZFddde ZGdfdg ZHdhdi ZIdjdk ZJdldm ZKdndo ZLdpdq ZMdrds ZNdtdu ZOdvdw ZPdxdy ZQddzd{ZRd|d} ZSdd~dZTdS )Scoper   Fr6   NTc                 C   s   || _ || _|| _dt||ddf }|  }|rP||| _|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 qd S )Nz%d%s_.Z_dot_r:   )!r8   outer_scopeparent_scoper^   r&   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   )r-   r8   r   r   mangled_nameZ
qual_scopevar_namer   r   r   r.     s>    

zScope.__init__c                 C   s   | S r*   r   )r-   memor   r   r   __deepcopy__  s    zScope.__deepcopy__c           
      C   s   g }|j  D ],\}}|r"||kr|js,|r|||f q| j | dD ]J}t| |}dd |D }	t||D ]"}|js|rr|j|	krr|| qrqLd S )N)r   r   r   r   r   r   r   r   c                 S   s   h | ]
}|j qS r   r8   )rK   er   r   r   	<setcomp>  s     z!Scope.merge_in.<locals>.<setcomp>)r   itemsr   r   updater   r8   )
r-   otherZmerge_unusedZ	allowlistr   r8   rJ   attrZself_entriesnamesr   r   r   merge_in  s    

zScope.merge_inc                 C   s   d| j j| jf S )Nz<%s %s>)	__class__r2   r   r0   r   r   r   __str__  s    zScope.__str__c                 C   s   | j S r*   r   r0   r   r   r   r     s    zScope.qualifying_scopec                 C   s,   |rt d|| j|f S | j|| jS d S )Nz%s%s%s)r(   r   r   mangler8   r-   prefixr8   r   r   r   r     s    zScope.manglec                 C   s   dt j|f }| |S )Nz%s%s_)r   r   r   )r-   r8   r   r   r   r   mangle_internal  s    zScope.mangle_internalc                 C   s   | j r| j |S |S r*   )r   mangle_class_private_namer   r   r   r   r     s    zScope.mangle_class_private_namec                 C   s`   |   j}z|| d }W n tk
r2   d}Y nX |||< |rT|sH|S d||f S d| S d S )Nr   r   z%s%dz%d)global_scoper   KeyError)r-   r8   Zcounterscountr   r   r   next_id  s    

zScope.next_idc                 C   s
   |   jS r*   )r   contextr0   r   r   r   r     s    zScope.contextc                 C   s
   | j  S z6 Return the module-level scope containing this scope. )r   r   r0   r   r   r   r     s    zScope.global_scopec                 C   s
   | j  S r   )r   builtin_scoper0   r   r   r   r     s    zScope.builtin_scopec                 c   s*   | V  | j r&t| j tddE d H  d S )Nr   )key)r   sortedoperator
attrgetterr0   r   r   r   iter_local_scopes
  s    zScope.iter_local_scopesc                 c   s$   | j }|d k	r|| _ d V  || _ d S r*   )in_c_type_context)r-   r   Zold_c_type_contextr   r   r   new_c_type_context  s
    zScope.new_c_type_contextc                 C   s   d}| j }|| }	d}
|jr|	jjr|  r|	 D ]`}||jr4|dkrX|jsXd}
n
|jrbd}
|
r|}|rxt|}||_d|_||_	||_
 qq4d}
|
rnX|| jrnL|dkrt|d| | jrdnd n$|d	krt|d|  | j |   dS |S )
a  
        Returns an entry or None

        If it returns an entry, it makes sense for "declare" to keep using that
        entry and not to declare its own.

        May be overridden (e.g. for builtin scope,
        which always allows redeclarations)
        NF<init>Textern'%s' redeclared r   r   ignore)r   ru   r9   is_cpprI   compatible_signature_withargsr   copyr   r:   r   r   r   rG   )r-   r8   r   r9   r:   rn   
copy_entryrJ   r   Z	old_entryZcpp_override_allowed	alt_entryr   r   r   handle_already_declared_name  s@    


z"Scope.handle_already_declared_namec	                 C   s   |j rt| tst|d | js@|r@td|r@t|d| d | j}	d }
|rl||	krl|sl| 	|||||}
|
st
||||d}
| j|
_||
_|r| ||
_|s||	kr|  r|jr|	| js|	| j|
 n|
|	|< |jr|j|
_| |
_||
_|
S )Nz5Buffer types only allowed as function local variablesz
^_[_A-Z]+$z'%s' is a reserved name in C.r   )Z	is_bufferrX   
LocalScoper   r   rematchr   r   r   r5   create_wrapperr   r   r   ru   rv   r<   r   is_memoryviewslicedefault_valuer;   rT   rn   )r-   r8   r   r9   r:   rn   shadowr{   r   r   rJ   r   r   r   declareV  s.    
 zScope.declarec                 C   s   t d| j|f S Nz%s.%s)r	   r   r   r   r   r   r   z  s    zScope.qualify_namer7   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)
r-   r8   r9   valuer:   r   rn   r   r   rJ   r   r   r   declare_const}  s    zScope.declare_constr   c
              	   C   sZ   |s|}| j ||||||dd}
d|
_||
_|r<| j|
 |	sVt|dd d krV|
|_|
S )NT)r{   r   rJ   )r   r{   r   r   r   r   rJ   )r-   r8   r9   r:   r   rn   r   definingr   templaterJ   r   r   r   declare_type  s    zScope.declare_typec              
   C   s   |s*| j s|dks|r|}n| tj|}z6| jrD| j| jj}nd }t	
||||dk|}W n8 tk
r }	 zt||	jd  t	j}W 5 d }	~	X Y nX | j||||||d}
|
j|_|
S )Nr7   r   r   )rn   r   )r   r   r   type_prefixis_cpp_class_scoper   lookupr8   r9   r   Zcreate_typedef_type
ValueErrorr   r   
error_typer   r   )r-   r8   	base_typer:   r   rn   r   	namespacer9   r   rJ   r   r   r   declare_typedef  s*    
 zScope.declare_typedefc
              	   C   s(  |s*| j s|dks|r|}n| tj|}| |}
|
s|  }tj||||||	|d}| j|||||||d k	d}
| j	
|
 |
|_n|
jr|
jjr|
jj|kst|d| d nT|r|
jjrt|d| d n6| |
|| | |
|| |r||
j_| j
|
 | jr$| j| jj|
j_|
S )Nr   )in_cpp)rn   r   r   '%s' redeclared  r   2'%s' already defined  (ignoring second definition))r   r   r   r   lookup_herer   r   ZCStructOrUnionTyper   r   r   rJ   r{   r9   Zis_struct_or_unionkindr   rT   check_previous_typedef_flagcheck_previous_visibilityr   r   r   r   r8   r  )r-   r8   r  rT   typedef_flagr:   r   rn   r   packedrJ   r  r9   r   r   r   declare_struct_or_union  sJ    
      
zScope.declare_struct_or_unionr   r   c           
         s  |d kr*| j s|dkr|}n| tj|}t|}| |}|s|tj|||||d}	| j||	|||d k	d}| j	
| n|jr|jjstd|  |  d S |r|jjrtd| d n|r||j_| j
| |r|jjr|jj|krtd |  n||j_|s$|jjrD||jjkrDtd |   fd	d
 |r~ || |jddt|j|jd | jr| j| jj|j_|S )Nr7   )	templates)rn   r   r   r  r   -Base type does not match previous declarationz5Template parameters do not match previous declarationc                    sJ   |D ]@}|t jkrq|jd kr*td q | |j | jj| qd S )Nz#Cannot inherit from incomplete type)r   r   rT   r   base_classesr9    declare_inherited_cpp_attributes)rJ   r  
base_classdeclare_inherited_attributesr:   r   r   r    s    

z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesthis)r8   r   r9   r:   )r   r   r   r   listr  r   ZCppClassTyper   r   r   r{   r9   ra   r   rG   rT   r   r   r  r  r   CPtrTyper:   r   r   r   r8   r  )
r-   r8   rT   r:   r   r  rn   r  rJ   r9   r   r  r   declare_cpp_class  sX    
     


	
zScope.declare_cpp_classc                 C   s,   ||j jkr(t|d|jd|j j f  d S )Nz#'%s' previously declared using '%s')cdefZctypedef)r9   r  r   r8   )r-   rJ   r  r:   r   r   r   r	    s
     
z!Scope.check_previous_typedef_flagc                 C   s$   |j |kr t|d|j|j f  d S )Nz '%s' previously declared as '%s')rn   r   r8   )r-   rJ   rn   r:   r   r   r   r
    s
    
 zScope.check_previous_visibilityc
                 C   s   |r|s6| j s"|dks"|dks"|r(|}n| tj|}| jrN| j| jj}
nd }
|rjt	j
|||
|	d}qt	j||||
|	d}nt	j}| j||||||d}|rtjdd|_| | ||_g |_| j| |S )Nr   r   )r   )r   rn   r   ZEnumClassDeclr`   )r   r   r   r   r   r   r   r8   r9   r   ZCppScopedEnumTypeZ	CEnumTypeZc_anon_enum_typer   r   re   rf   rd   use_entry_utility_coder   Zenum_valuesr   r   )r-   r8   r:   r   scopedr  rn   r   r   r   r  r9   rJ   r   r   r   declare_enum  s6     
zScope.declare_enumc                 C   s   | j ||S r*   )r   declare_tuple_type)r-   r:   
componentsr   r   r   r  8  s    zScope.declare_tuple_typec
                 C   s   |s$|dks|r|}n|  tj|}| |||||}
d|
_|jrh|dkrh| jd r^|
  n
|| |r|dkrd|
_	d|
_
|rd|
_d|
_
|	r|	|
_|
S )Nr7   r   r   
cpp_locals)r   r   
var_prefixr   rt   ra   
directivesrh   check_nullary_constructorr   r   r   rj   r-   r8   r9   r:   r   rn   r   in_pxdis_cdefrj   rJ   r   r   r   r   ;  s&    


zScope.declare_varc                 C   s,   |sd S |D ]}||krt |d|  qd S )Nz"Modifier '%s' is not allowed here.)r   )r-   r:   	modifiersallowedmodifierr   r   r   _reject_pytyping_modifiersU  s
    z Scope._reject_pytyping_modifiersc                 C   s   |  |||S r*   r   r-   r8   r9   r:   r   r   r   $declare_assignment_expression_target\  s    z*Scope.declare_assignment_expression_targetc                 C   s   |  |}| j||S r*   )r   r   declare_builtinr-   r8   r:   r   r   r   r-  a  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 declaredrF   rn   )
r9   ru   r   r:   r   r   r   	signaturer   r   )r-   r8   r:   rn   rJ   r   r   r   _declare_pyfunctione  s    zScope._declare_pyfunctionc                 C   s   |  |}|s | j||||dS |rR|jjr4t|_qd|jtk	rd| j||||dS n| j|t||d | jd t||dd}t||_| ||_	t
|_d|_|S )N)rn   rJ   r/  r7   r   rn   T)r  r1  r9   is_unspecifiedr   r   r	   r8   r   r   r   r0  rz   )r-   r8   r:   allow_redefinern   rJ   r   r   r   declare_pyfunctionn  s$    


 
zScope.declare_pyfunctionc                 C   sl   |  tjd |}|  tjd |}| |}| d |t|d}t||_||_||_	||_
t|_d|_|S )NZfuncdef_Zmethdef_r7   T)r   r   Zlambda_func_prefixr   r   r   r	   r8   r   pymethdef_cnamer   r   r0  rz   )r-   Zlambda_namer:   r   r6  r   rJ   r   r   r   declare_lambda_function  s    

zScope.declare_lambda_functionc                 C   s   | j | d S r*   )r   r   r-   Zdef_noder   r   r   add_lambda_def  s    zScope.add_lambda_defc                 C   s   | j | d S r*   )r   r   r-   rJ   r   r   r   register_pyfunction  s    zScope.register_pyfunctionc                 C   sH  |s$|dks|r|}n|  tj|}d|	ko2|o2|}|r<d}| |}|r|sx||jkrx|dkrxd}|j}||_||_|dkr||jkrt|d||j|f d ||jkrt|d||rd	nd
f d |j	
|r|j	|j|_	q(|dkr|jdkr| j}|  rd}n:|rN|sN| D ] }|jr@||jkr( qNq(d}|r| ||||||	}| |_|jd k	r|j|_|}nt|dd ||_	nf|s|jr||j	r|j	jr|j	jd kr|jrt|jd|j d|  ||_	n
t|d n | ||||||	}||_||_|r4d|_|rJ|dkrJd|_|rVd|_|sz|sz|dkrzt|d|  |rd|_|	r|	|_|
r|jrt d||f |
|_|rt!||t"}| #||_$d|_%d|_&|j'|_'||_(||_)|j*rD|jd krD|jrD|d j+sD|rD|sD|sDt,j-|| ||j.j/d |S )Nr7   inlineFr   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 declarationz!No exception value declared for 'z' 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   )Zfunction_nameZvoid_return)0r   r   func_prefixr  rn   r   r   r   r   r9   same_aswith_with_gilwith_gilis_builtin_scoper   rI   add_cfunctionr<   rP   r   r   nogilexception_valuer   r:   r8   r   rl   r   r   r   rd   rb   r5   r   r   r   rt   rq   rT   r   rJ   exception_checkZin_utility_coder   Zwrite_noexcept_performance_hintreturn_typeis_void)r-   r8   r9   r:   r   rn   r   r$  r   r&  rd   overridableZinline_in_pxdrJ   Zcan_overrider   temp	var_entryr   r   r   declare_cfunction  s    
  
 



    zScope.declare_cfunctionc              	   K   sd   t dd |D sttj|td| jd gf|}	| j||	|d |||d}
d|
_|d k	r`||
_|
S )Nc                 s   s   | ]}|d kV  qdS ))rF  rG  rE  rB  Zis_const_methodis_static_methodNr   )rK   kr   r   r   	<genexpr>  s   z(Scope.declare_cgetter.<locals>.<genexpr>r-   )r   rn   r&  r   T)	allrb   r   	CFuncTypeCFuncTypeArgparent_typerM  r   r   )r-   r8   rH  r:   r   rn   r&  r   Zcfunc_type_configZ
cfunc_typerJ   r   r   r   declare_cgetter  s,          zScope.declare_cgetterc                 C   s   |  |||||}d|_|r"||_|s,|jr:| j| nBt| j}	t| jD ]}
|
js`|
j	jsd qn|	d8 }	qN| j
|	| |S r]   )r   ru   r   rQ   r   r   r^   reversedr   r9   insert)r-   r8   r9   r:   r   rn   r&  	inheritedrJ   icfunc_entryr   r   r   rD    s    


zScope.add_cfunctionc                 C   s$   |  |}|r|S t|d|  d S )Nz'%s' is not declared)r   r   r-   r8   r:   rJ   r   r   r   find%  s    
z
Scope.findc                 C   sP   | }|D ]B}| ||}|s" d S |jr0|j}qt|dd|   d S q|S )Nz'%s' is not a cimported moduler   )r\  r   r   join)r-   pathr:   rT   r8   rJ   r   r   r   find_imported_module-  s    zScope.find_imported_modulec                 C   sd   |  |}| |p(| jr&| j|p(d }|r2|S | jrD| j|pFd }|r`|jr`| |j| |S r*   )r   r  r   r   rq   _emit_class_private_warningr:   )r-   r8   r   rJ   r   r   r   r   <  s    


zScope.lookupc                 C   s*   | j | |d }|r|S | j |d S r*   )r   rC   r   r-   r8   rJ   r   r   r   r  N  s    zScope.lookup_herec                 C   s   | j |d S r*   )r   rC   r   r   r   r   lookup_here_unmangledY  s    zScope.lookup_here_unmangledc                 C   s
   |  |S r*   )r  r   r   r   r   #lookup_assignment_expression_target\  s    z)Scope.lookup_assignment_expression_targetc                 C   sF   |  |}|s0| |}|r0|jr0| |j| |sB| |td }|S r*   )r  rb  rq   r`  r:   r   r   ra  r   r   r   lookup_targeta  s    


zScope.lookup_targetc                 C   s0   |r,|j r,|jjr&| jr&|j| jS |jS d S r*   )r{   r9   rQ   fused_to_specific
specializer:  r   r   r   $_type_or_specialized_type_from_entrym  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   rg  r   Builtinrh  )r-   r8   rJ   tprh  r   r   r   lookup_types  s    



zScope.lookup_typec                 C   s  |d j jr`|d j }|jd| }|d k	r`dd |dd  D }t|| }|d k	r`|S | d| }g }|d k	r| }g }	t|dkrtdD ]>}
||
 j jr||
 j }|jd| }|d k	r|	| 7 }	q|	s|sd S t	t
|	| }tdd |D |S )Nr   z
operator%sc                 S   s   g | ]
}|j qS r   r9   rK   argr   r   r   rM     s     z)Scope.lookup_operator.<locals>.<listcomp>r   r   c                 S   s   g | ]
}|j qS r   rl  rm  r   r   r   rM     s     )r9   ra   rT   r   r   rS   rI   r^   ranger  r   )r-   r   operandsZobj_typemethodrU   resfunctionZfunction_alternativesZmethod_alternativesnrI   r   r   r   lookup_operator  s4    

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)r2   r3   r4   r   r   r   r   FakeOperand  s   rw  c                    s   g | ]} |d qS )rl  r   )rK   r9   rw  r:   r   r   rM     s     z3Scope.lookup_operator_for_types.<locals>.<listcomp>)ZNodesrv  ru  )r-   r:   r   typesrv  rp  r   rx  r   lookup_operator_for_types  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 Python 'class private name' rules. This may change in a future release.r   )r   )r-   r:   r8   r   r   r   r`    s
    z!Scope._emit_class_private_warningc                 C   s   |   | d S r*   )r   use_utility_coder-   Znew_coder   r   r   r{    s    zScope.use_utility_codec                 C   s   |   | d S r*   )r   r  r:  r   r   r   r    s    zScope.use_entry_utility_codec                 C   s   |D ]}|| j kr dS qdS Nr   r   )r   r-   r   r8   r   r   r   defines_any  s    
zScope.defines_anyc                 C   s*   |D ] }|| j kr| j | jr dS qdS r}  )r   r   r~  r   r   r   defines_any_special  s    zScope.defines_any_specialc                 C   s   ddl m} | |  d S )Nr   )get_type_inferer)TypeInferencer  infer_types)r-   r  r   r   r   r    s    zScope.infer_typesc                 C   s   | j }|d krdS | S d S ri   )r   r   )r-   outerr   r   r   r     s    zScope.is_cppc                 C   s   | j ||| d S r*   )r   add_include_file)r-   filenameverbatim_includelater   r   r   r    s    zScope.add_include_filec                 C   s   t j d| S )Nz->)r   Zmodulestateglobal_cname)r-   r   r   r   r   name_in_module_state  s    zScope.name_in_module_statec                    s   |d krt  }| j }| j D ]}|s@|js@|jdks@|js@q t|j	}t
 fdd|D rh dS t|j	dd }|d ks ||krq || | |r  dS q dS )Nr   c                 3   s   | ]} |V  qd S r*   r   )rK   Zsub_tptype_check_predicater   r   rP    s     z3Scope.find_shared_usages_of_type.<locals>.<genexpr>TrT   F)r   is_module_scoper   valuesr   rn   r   r   Zget_all_subtypesr9   anyr   addfind_shared_usages_of_type)r-   r  Z_seen_scopesZinclude_all_entriesrJ   Zentry_subtypesZ
type_scoper   r  r   r    s     
z Scope.find_shared_usages_of_type)TN)N)N)N)F)r   r   r   )Nr7   r   r   )Nr7   r   r   r   r   )Nr7   r   )Nr7   r   F)Nr   r   N)r7   r   r   N)Nr7   FFFN)r   )r   N)Fr   )Nr7   r   r   r   r   NF)NNr7   r   F)F)NF)N)Ur2   r3   r4   rC  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_scoper  is_c_dataclass_scopeis_internalr   r   rE  re  rH  r   r   Znode_positions_to_offsetr.   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  r   r)  r,  r-  r1  r5  r7  r9  r;  rM  rU  rD  r\  r_  r   r  rb  rc  rd  rg  rk  ru  rz  r`  r{  r  r  r  r  r   r  r  r  r   r   r   r   r   \  s   $$




?
$
          
    
     
&      
6       
          


	
              
j      

!
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 r*   )r   r.   r
   
pre_importr0   r   r   r   r.     s    zPreImportScope.__init__c                 C   s"   |  ||t|d}d|_d|_|S )Nr7   T)r   r   rt   rq   r[  r   r   r   r-    s    zPreImportScope.declare_builtinN)r2   r3   r4   r   Zpreimport_cnamenamespace_cnamer.   r-  r   r   r   r   r    s   r  c                   @   sV   e Zd ZdZdd ZdddZdd Zdd	d
Zdej	fddZ
dd ZdddZdS )BuiltinScopeTc                 C   s8   t jd krt| dd d  nt| dt d  i | _d S )N__builtin__)r
   r  r   r.   r  
type_namesr0   r   r   r   r.     s    
zBuiltinScope.__init__Nc                 C   s6   |dks|dkrd}n|dkr*|dkr*d}t | |S )Nunicode
basestringstrlongr   int)r   r   )r-   r8   language_levelr   r   r   r     s
    zBuiltinScope.lookupc                 C   sL   |t jkrH| jd k	r"| j||S tjr8t|d|  nt|d| d d S )Nundeclared name not builtin: %sr   )r   KNOWN_PYTHON_BUILTINSr   r-  r
   error_on_unknown_namesr   r   r.  r   r   r   r-    s    

zBuiltinScope.declare_builtinc           	      C   s   t |}| j||d |d|d}|d k	r,||_|r~|dkr>|}nt |}t||t}| ||_d|_d|_||_	|j
|_
||_|S )Nr   )rn   rd   *r   )r	   rM  rP   r5   r   r   r   rt   ro   rd   rT   r   )	r-   r8   r9   r   Zpython_equivrd   rP   rJ   rL  r   r   r   declare_builtin_cfunction  s     z&BuiltinScope.declare_builtin_cfunctionc           	      C   s   t |}||||}t|d d|d}i |_|| d| j|< | j||d dd}t|j| dj	|j
|j	jd}| ||_d|_d|_d|_d|_| |_tjrd|_||_|S )Nr   )r   rn   rT  r   r/  r9   r8   r9   r:   r   T)r	   CClassScoper!  	set_scoper  r   r5   r8   r   r9   r:   typeptr_cnamer   r   rt   rp   r   ro   rT   r
   cache_builtinsr~   r   )	r-   r8   r   objstruct_cnameZ
type_classr9   rT   rJ   rL  r   r   r   declare_builtin_type-  s.    


z!BuiltinScope.declare_builtin_typec                 C   s   | S r*   r   r0   r   r   r   r   I  s    zBuiltinScope.builtin_scopeFc                 C   s   d S r*   r   r-   r8   r   r9   r:   rn   r   r   r   r   r   L  s    z)BuiltinScope.handle_already_declared_name)N)NNN)F)r2   r3   r4   rC  r.   r   r-  r  r   ZBuiltinObjectTyper  r   r   r   r   r   r   r    s   



 
r  c                   @   s:  e Zd ZdZdZdZdZdZdddddd	d
ddg	ZdMddZ	dd Z
edd Zdd ZdNddZdd Zdd Zdd ZdOdd ZdPd!d"Zd#d$ ZdQd%d&Zd'd( Zd)d* Zd+d, Zd-d. ZdRd0d1ZdSd3d4Zd5d6 Zd7d8 Zd9d: ZdTd;d<Zd=d> Z d?d@ Z!dAdB Z"dCdD Z#dEdF Z$dGdH Z%dIdJ Z&dKdL Z'dS )UModuleScoper   r   F__builtins__r2   __file__r   __path____spec__
__loader____package__
__cached__c                 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 | _!i | _"| #t$j%ddd d S )Nr   ri  r6   r   zPython.hT)initial)&r6   ri  parent_moduler   r   r.   
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 _cached_defaults_c_class_entriesprocess_includer   IncludeCode)r-   r8   r  r   r  ri  r   r   r   r   r.   u  s8    zModuleScope.__init__c                 C   s   | j S r*   )r  r0   r   r   r   r     s    zModuleScope.qualifying_scopec                 C   s   | j S r*   )r  r0   r   r   r   r     s    zModuleScope.contextc                 C   s   | S r*   r   r0   r   r   r   r     s    zModuleScope.global_scopeNc                 C   sD   |  |}|d k	r|S |d kr4| jd k	r0| jjnd}| jj||dS )N   )r  )r  r   r  r   r   )r-   r8   r  rJ   r   r   r   r     s    
zModuleScope.lookupc           
      C   s   t |}z| j| }W n( tk
r>   t| }| j|< Y nX |j}| |}|st|}t|D ]\}}|j	d| ||d qd| j
|d d|d||d}	| j|	 |	|_| ||||}||_|S )Nzf%s)r8   r9   r:   _structstructT)r  r:   r   )tupler  r   r   Zc_tuple_typer   r  StructOrUnionScope	enumerater   r  r   removestruct_entryr   rJ   )
r-   r:   r  ttyper   rJ   rT   ix	componentr  r   r   r   r    s0    
     zModuleScope.declare_tuple_typec                 C   s   t |}z| j| W S  tk
r(   Y nX | tj}t|}| j||dd|d }| j|< | | d|j	_
|j	j}d|_d|_ttt|}d| j}t|D ]&\}}	t||}
|j|
|	d dd q|S )NT)r   implementingr  zarg{:0>%dd})r:   r%  )r  r  r   r   r   Zdefaults_struct_prefixr	   declare_c_classcheck_c_classr9   is_final_typerT   r  is_defaults_class_scoper^   r  formatr  r   )r-   r:   r  r   rJ   rT   Z	num_zerosZbuild_argnamert  type_Zarg_namer   r   r   declare_defaults_c_class  s2       

z$ModuleScope.declare_defaults_c_classc                 C   s4  |t jkrx|t jkrx|t jkrx| jr6| |t|}|S tjrLt	|d|  nt
|d| d | |d t|d}d|_|S tjr| jD ]}|j|kr|  S q|dkr| js| jdS | d d t|d}tjr|t jkrd|_d|_||_tj| |_| j| | j| nd|_||_|  ||_|S )Nr  r   r7   r   globalsZ__Pyx_Globals)r   r  Zrenamed_py2_builtins_mapZuncachable_builtinshas_import_starr   r   r
   r  r   r   r   ro   r  r  r8   old_style_globalsr   r   r~   r   Zbuiltin_prefixr   r   r  r   r   r   r[  r   r   r   r-    s@    



zModuleScope.declare_builtinr   c           	      C   s   |d k	o|dk}d }d}|d k	rX|dkrX| }| j r6dnd}||krj|rj|j}|d8 }q:n|dkrj| j}d}|  }|jj|||||dS )Nr   Fr   T)from_moduler:   absolute_fallbackZrelative_import)r  r  r   r   find_module)	r-   r  r:   Zrelative_levelZis_relative_importr  r  Z	top_levelZmodule_scoper   r   r   r    s(        zModuleScope.find_modulec                 C   sf   d|kr| dd\}}nd }| |}|sPt|| | j|r>dn|d}|| j|< |rb|j||d}|S )Nr   r   T)r  r   r  )
as_package)splitlookup_submoduler  r   r  find_submodule)r-   r8   r  	submodulerT   r   r   r   r    s    

zModuleScope.find_submodulec                 C   sF   d|kr| dd\}}nd }| j|d }|rB|d k	rB||}|S )Nr   r   )r  r  rC   r  )r-   r8   r  moduler   r   r   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  )r-   r  r  r  incr   r   r   r  3  s    zModuleScope.add_include_filec                 C   s4   |  }|dk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  )r-   r  r   r   r   r   r  <  s
    zModuleScope.process_includec                 C   sJ   || j krF|j D ]}| | q| j | |j D ]}| | q6d S r*   )r  r  r  r  r   add_imported_module)r-   rT   r  mr   r   r   r  [  s    

zModuleScope.add_imported_modulec                 C   s6   |j rd|_|| jkr"|| j|< nt|d| d d S )NTr  r   )rq   rt   r   r   )r-   r8   rJ   r:   r   r   r   add_imported_entryc  s
    
zModuleScope.add_imported_entryc                 C   s\   |  |}|r4|jr"|j|kr"|S |jr.|jrH|S n| |t|}d|_||_| | |S )Nr   )r  rq   r   r   r   rt   r  )r-   r8   rT   r:   rJ   r   r   r   declare_modulel  s    

zModuleScope.declare_moduler7   c
                 C   s  |dkrt |d|  | ||	d |sH|tkr4t}|jr@|jrHtd|r|dkr| jd dkrd}
d}|jrxd	}
d
}t|d| d|
 d|
rdnd  |s| }|dks|dkr|r|}n| 	t
j|}| |}|rb|jrb|j|s |dkr |jdkr t|d| d ||_|jdkrP| 	t
j|}|j|krP|}||_|jsbd|_|S tj| |||||||||	d
}|rd|_|jjr|jj|_| j| nd|_tjrd|_|S )N)r7   r   r   z+Module-level variable cannot be declared %s)ztyping.Optionalz7Non-cdef global variable is not a generic Python objectr   Zsubinterpreters_compatiblenor6   z9
Python objects should not be shared between interpreterszPython zGlobal cdef zvariable used with subinterpreter support enabled.
This variable is not currently in the per-interpreter module state but this will likely change in future releases.r   r   r   r   z6Variable '%s' type does not match previous declarationr7   Tr   rn   r   r$  r%  rj   )r   r)  r   r   is_pyobjectis_extension_typer   r!  r   r   r   r   r  r   r9   r@  rn   r   r   r   r   rp   declaration_valuer;   r   r   rq   r
   Zcimport_from_pyxr   )r-   r8   r9   r:   r   rn   r   r$  r%  rj   Zextra_warningZpyobject_warningr   rJ   mangled_cnamer   r   r   r     sz    

    

zModuleScope.declare_varr   c                 C   s   |sd|	krt |dd |sD|dks0|dkr6|r6|}n| tj|}|dkr\|jr\t|d | |}|r|jr|jdkr| tj|}|j	|kr|}||_	||_
tj| |||||||||	|
|d}|S )	Nr<  z+Declarations should not be declared inline.r   r   r   z6Extern functions cannot have default arguments values.r7   )r   rn   r   r$  r   r&  rd   rJ  )r   r   r   r?  Zoptional_arg_countr   r  r   rn   r   r   r   rM  )r-   r8   r9   r:   r   rn   r   r$  r   r&  rd   rJ  rJ   r  r   r   r   rM    s>    




        zModuleScope.declare_cfunctionc                 C   s    |  |}|s| |t| d S r*   )r  r   r   r[  r   r   r   declare_global  s    
zModuleScope.declare_globalc                 C   s   |d k	r| j | d S r*   )r  r   r|  r   r   r   r{    s    zModuleScope.use_utility_codec                 C   s8   |d krd S |j r | j|j  |jr4| j|j d S r*   )rd   r  r   rg   r:  r   r   r   r    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rV|js\d }n^|j}|r~|rp|jr~| ||| |r|js|r|jr|r||jk	rt	|d |r|js||_|r|rt
j||||
dk|d}||_||_|d k	r||_|
dkr||_n| j|_|	r|	|_n| tj||_| j||||
d|d}d	|_|rX||_n&|jsr| tj||_nt	|jd
 | | | j| |js|s|r4t|| |
|d}| j |_|r|jr| |j |!| | j"| n>|r|jjrt	|d|  n|r4|jj#r4t	|d|  |r@d|_$|rL||_|
dkrv|j%|
krvt	|d||j%f  |rd|_&|r|jr|j|krt	|d ||_|r|j'r|j'|krt	|d ||_'| j(drd	|j_)| j(d}|r ddl*m+} t,| |s t	|d |dkr2d	|j_-d	|_.|S )Nr   r   z6ctypedef only valid for 'extern' , 'public', and 'api'r   r   r  )
check_size)rn   r   r   Tz5Object name required for 'public' or 'extern' C class)r8   r   rn   rT  zC class '%s' already definedz C class '%s' already implementedr   r7   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  r9   r{   r  rT   definedr	  r  r   r   ZPyExtensionTyper:   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  r!  r   declare_inherited_c_attributesr  r   implementedr   rn   r   typeobj_cnamerC   r  re   r  rX   Zhas_sequence_flagr   )r-   r8   r:   r   r  r  r  r  r  r  rn   r  r   r  r  r   r   rJ   r9   rT   r  r  r   r   r   r    s    



    
 





zModuleScope.declare_c_classc                 C   s   |j }|jr*|jjr*dtj|jjf |_nV|jr|jjrt|jj}|j}|rx|jrx|t|jjkrfqx|jrpd S |j}qJtj|_|jr| 	tj
|j|_| 	tj|j|_d S r   )r9   r  vtabslot_cnamer   obj_base_cnamerT   r   r^   is_builtin_typer   Zvtabstruct_prefixr8   Zvtabstruct_cnameZvtabptr_prefixZvtabptr_cname)r-   rJ   r9   Zentry_countr  r   r   r   allocate_vtable_namest  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   r9   rT   r   r:   r8   r:  r   r   r   check_c_classes_pxd  s    
zModuleScope.check_c_classes_pxdc                 C   s   |j }|j}|j}|js(t|jd|  |dkrF|jsF| tj	||_|jrx|jj
D ]"}|jsT|jsTt|jd|j  qT|jr| tj|j|_d S )Nr	  r   z)C method '%s' is declared but not defined)r9   r8   rn   rT   r   r:   r  r   r   Ztypeobj_prefixr   r   r   r  Zvtable_prefixZvtable_cname)r-   rJ   r9   r8   rn   Zmethod_entryr   r   r   r    s    zModuleScope.check_c_classc                 C   s^   d}|rt d| j  | jD ]<}|rNt 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 = )rB   r   r   r8   r9   rn   r  )r-   Zdebug_check_c_classesrJ   r   r   r   check_c_classes  s    
zModuleScope.check_c_classesc                 C   sT   | j  D ]D\}}|jr
|jr
|j| kr
|jdkr
|js
|js
t|j	d|  q
d S )Nr   r>  )
r   r   ru   r   rT   rn   r   r   r   r:   ra  r   r   r   check_c_functions  s    zModuleScope.check_c_functionsc                 C   sX   ddl m} t|j|j|j|jjd}|j|_d|_	d|_
d|_d|_|j|_||_d S )Nr   r  r  T)r6   ri  r5   r8   Z	type_typer:   r9   r  r   rt   rp   r   r}   rT   r   )r-   rJ   ri  rL  r   r   r   r    s    z'ModuleScope.attach_var_entry_to_c_classc                 C   s   | j S r*   )cppr0   r   r   r   r     s    zModuleScope.is_cppc                 C   s   ddl m} | |  d S )Nr   )PyObjectTypeInferer)r  r  r  )r-   r  r   r   r   r    s    zModuleScope.infer_types)F)N)r   )F)NF)Nr7   FFFN)Nr7   r   r   r   r   NF)r   r   NNNNNr7   r   r   NNr   )(r2   r3   r4   r  r  Zis_cython_builtinr  namespace_cname_is_typer   r.   r   r   r   r   r   r  r  r-  r  r  r  r  r  r  r  r  r   rM  r  r{  r  r  r  r
  r  r  r  r  r   r  r   r   r   r   r  S  s          


	%


		          
H              
                   
zr  c                   @   sd   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 kr|}t | ||| d S r*   r   r.   )r-   r8   r   r   r   r   r   r.     s    zLocalScope.__init__c                 C   s   t || S r*   )r(   r   r   r   r   r     s    zLocalScope.manglec                 C   sR   |  |}| tj|}| ||||d}d|_|jr<d|_d|_| j	
| |S )Nr7   r   0)r   r   r   r   r   rt   r  r;   r   r   r   )r-   r8   r9   r:   r   rJ   r   r   r   declare_arg	  s    
zLocalScope.declare_argr7   c
                 C   sn   |  |}|dkr t|d|  tj| |||||||||	d
}
|
jjrP|
jj|
_d|
_| j|
_	| j
|
 |
S )Nr   readonlyz$Local variable cannot be declared %sr  r   )r   r   r   r   r9   r  r;   r   _in_with_gil_blockr   r   r   r#  r   r   r   r     s"    
    
zLocalScope.declare_varc                 C   s4   |  |rt|dd n|  |}|| j|< d S Nr  r   r  r   r   rd  r   r[  r   r   r   r  (  s    
zLocalScope.declare_globalc                 C   s`   |  |}|r6|j| kr6|js6t|d|  |  n&| |}|d ksN|js\t|d|  d S Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r  rT   r   r   rG   r   r-   r8   r:   Z
orig_entryrJ   r   r   r   declare_nonlocal0  s    


zLocalScope.declare_nonlocalc                 C   s$   d|_ t|| }d|_|| j|< |S NT)r   r   rt   r   )r-   r8   rJ   Zinner_entryr   r   r   _create_inner_entry_for_closure;  s
    

z*LocalScope._create_inner_entry_for_closurec                 C   sZ   t | |}|d k	rV|j}|jr(|j}q|| k	rV|jrVt|jdrJtd| ||S |S )NZscope_classz#lookup() after scope class created.)	r   r   rT   r  r   r  hasattrr   r  )r-   r8   rJ   Zentry_scoper   r   r   r   B  s    zLocalScope.lookupc                 C   s   |   D ]}|j D ]}|jrh|jj}| jr6||_q|tj	rX|t
tj	d d  }d||f |_q|jr|j|_dtj	|jf |_|jjr|jjd r|  qqd S )Nr   z%s->%sr  )r   r   r  r   r   r   r  r   r   Zcur_scope_cnamer^   r   Zoriginal_cnamer9   ra   rT   r!  rh   )r-   Zouter_scope_cnamerT   rJ   r   r   r   r   mangle_closure_cnamesS  s    z LocalScope.mangle_closure_cnames)N)Nr7   FFFN)r2   r3   r4   r  Zhas_with_gil_blockr  r.   r   r  r   r  r  r  r   r  r   r   r   r   r     s$   
          
r   c                   @   sX   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}q| tj}t| ||| |j| _dtj	t
||f | _|j sb|jsb|jrj|j}qP|j| _|j|  d S )Nz%s%d%s)r  r   r   r   r   Zgenexpr_id_refr   r.   r!  r   r^   genexp_prefixr  r  r   r   r   r  )r-   r   r   r8   r   r   r   r.   l  s    zComprehensionScope.__init__c                 C   s   d| j | j||f S N%s%s)r   r   r   r   r   r   r   r   }  s    zComprehensionScope.mangleNr7   Fc
                 C   s   |t kr$| j|}
|
r$|
jr$|
j}| ||	 d| j| jt	j
|pJ|  f }| |||||}d|_| jjrzd|_nd|_d|_| j| || j|< |S )Nr"  T)r   r   r   rt   r9   r)  r   r   r   r   r   r   r   r  rp   r   r   r   r   r   )r-   r8   r9   r:   r   rn   r   r$  r%  rj   r   rJ   r   r   r   r     s    
"
zComprehensionScope.declare_varc                 C   s   | j |||S r*   )r   r   r+  r   r   r   r,    s    z7ComprehensionScope.declare_assignment_expression_targetc                 C   s   | j |||S r*   )r   r5  r-   r8   r:   r4  r   r   r   r5    s
      z%ComprehensionScope.declare_pyfunctionc                 C   s   | j ||S r*   )r   r7  )r-   r   r:   r   r   r   r7    s    z*ComprehensionScope.declare_lambda_functionc                 C   s   | j |S r*   )r   r9  r8  r   r   r   r9    s    z!ComprehensionScope.add_lambda_defc                 C   s   |  |}|s| j|}|S r*   )r  r   rc  ra  r   r   r   rc    s    
z6ComprehensionScope.lookup_assignment_expression_target)Nr7   FFTN)F)r2   r3   r4   r   r  r.   r   r   r,  r5  r7  r9  rc  r   r   r   r   r  e  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!  )r   r.   r   Zclosure_scope_prefixZclosure_cname)r-   r8   Z
scope_namer   r   r   r   r   r.     s    zClosureScope.__init__Fc                 C   s   t j| |||ddS )Nr7   r/  )r   r5  r#  r   r   r   r5    s    zClosureScope.declare_pyfunctionc                 C   s   |  |||S r*   r*  r+  r   r   r   r,    s    z1ClosureScope.declare_assignment_expression_target)N)F)r2   r3   r4   r  r.   r5  r,  r   r   r   r   r$    s   

r$  c                   @   s    e Zd ZdZdd Zdd ZdS )GeneratorExpressionScopeTc                 C   s   | j |||}| ||S r*   )r   r   r  )r-   r8   r9   r:   rJ   r   r   r   r,    s    z=GeneratorExpressionScope.declare_assignment_expression_targetc                 C   s.   |  |}|s*| j|}|r*| ||S |S r*   )r  r   rc  r  ra  r   r   r   rc    s    
z<GeneratorExpressionScope.lookup_assignment_expression_targetN)r2   r3   r4   r  r,  rc  r   r   r   r   r%    s   r%  c                	   @   s*   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   r   r   r   r.     s    zStructOrUnionScope.__init__Nr7   Fc                 C   s   |s|}|dkrt |}|jr(t|}| ||	 | |||||}d|_| j| |j	rn|
st
|d n.|jr|st
|d n|jr|st
|d|  |S )Nr7   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   ru   r   r  r)  r   rt   r   r   r  r   r   Zneeds_refcounting)r-   r8   r9   r:   r   rn   r   r$  r%  rj   Zallow_pyobjectZallow_memoryviewZallow_refcountedrJ   r   r   r   r     s(    
zStructOrUnionScope.declare_varr   r   c                 C   s"   |
rt |d | j|||||dS )Nz0C struct/union member cannot be declared 'cpdef'r2  )r   r   )r-   r8   r9   r:   r   rn   r   r$  r   r&  rJ  r   r   r   rM    s    

 z$StructOrUnionScope.declare_cfunction)r&  )	Nr7   FFFNFFF)Nr7   r   r   r   r   F)r2   r3   r4   r.   r   rM  r   r   r   r   r    s&   
               
            r  c                   @   s,   e Zd ZddgZdd Zdd Zdd Zd	S )

ClassScoper3   r4   c                 C   sJ   |r|  dr|S |rF|drF|dsFtd| jd|f }|S )NZ__pyx_r   z_%s%s_)lowerr   endswithr	   
class_namelstripr   r   r   r   r   		  s
    z$ClassScope.mangle_class_private_namec                 C   s    t | ||| || _d | _d S r*   )r   r.   r+  r   r-   r8   r   r   r   r   r.   	  s    zClassScope.__init__c                 C   sn   t | |}|r|S |dkrjtddtttdtd gdd}tj	dd|_
| | d|_|  |_|S )NclassmethodZ__Pyx_Method_ClassMethodr6   r   ZClassMethodzCythonFunction.cr   )r   r   r5   r   rR  r   rS  r   re   rf   rg   r  ru   r   rT   ra  r   r   r   r   	  s&      

zClassScope.lookupN)r2   r3   r4   r   r   r.   r   r   r   r   r   r'    s   	r'  c                   @   s6   e Zd ZdZdZdddZdd Zd	d
 Zdd ZdS )PyClassScoper   FNr7   c
                 C   sD   |  |}|tkrt}tj| |||||||||	d
}
d|
_d|
_|
S )Nr  r   )r   r   r   r   r   rq   rs   r#  r   r   r   r   4	  s    
    zPyClassScope.declare_varc                 C   sf   |  |}|r6|j| kr6|js6t|d|  |  n,| |}|d krXt|d|  n
|| j|< d S r  )r  rT   r   r   rG   r   r   r  r   r   r   r  B	  s    


zPyClassScope.declare_nonlocalc                 C   s4   |  |rt|dd n|  |}|| j|< d S r  r  r[  r   r   r   r  Q	  s    
zPyClassScope.declare_globalc                 C   s   | j |S r*   )r   add_default_value)r-   r9   r   r   r   r0  Y	  s    zPyClassScope.add_default_value)Nr7   FFFN)	r2   r3   r4   r  r  r   r  r  r0  r   r   r   r   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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d0d#d$Zd%d& Zd1 fd'd(	Z  ZS )2r  r   Fc                 C   sn   t | || |dkr6|tj|| _|tj|| _g | _g | _	|| _
|jsT|jrj|jrj| j
j| _d| _d S )Nr   T)r'  r.   r   r   Zmethtab_prefixr  Zgstab_prefixZgetset_table_cnameproperty_entriesinherited_var_entriesrT  r  r  r  r  r  )r-   r8   r   rn   rT  r   r   r   r.   z	  s    
zCClassScope.__init__c                 C   sb   | j r| jddsdS | jjr,| jjs,dS | jj}|rL|jd k	rL|j S | jjr^| jj	 S dS )NZno_gcFT)
has_cyclic_pyobject_attrsr!  rC   rT  is_externalr  r  rT   needs_gcis_gc_simple)r-   r  r   r   r   r5  	  s    

zCClassScope.needs_gcc                 C   sN   | j d}|dkrdS |r&| jr&dS | jj}|rF|jd k	rF|j S | jjS )NZtrashcanFT)r!  rC   r3  rT  r  rT   needs_trashcanZbuiltin_trashcan)r-   	directiver  r   r   r   r7  	  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)r5  r!  rC   r0   r   r   r   needs_tp_clear	  s    zCClassScope.needs_tp_clearc                 C   sV   | }|rR| d}|r |jr dS |jjs6|jr6|jjr:dS |jj}|rL|jnd}q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   rT  r4  r  Zmultiple_basesr  rT   )r-   Zcurrent_type_scopeZ	del_entryZcurrent_base_typer   r   r   may_have_finalize	  s    

zCClassScope.may_have_finalizeTc                 C   s   g }g }g }| j D ]b}|jjrJ|s2| js2|jdkrt|s>|jjst|| q|jtjkrb|| q|jj	r|| q|p|p|}||||ffS )Nr   )
r   r9   r  is_closure_class_scoper8   r6  r   r   Zc_py_buffer_typer   )r-   Zinclude_weakrefZinclude_gc_simpleZpy_attrsZ
py_buffersZmemoryview_slicesrJ   Zhave_entriesr   r   r   get_refcounted_entries	  s    
z"CClassScope.get_refcounted_entriesNr7   c
                 C   sB  |  |}|	rXd|	kr@d}|js@|js:t|d|  t}n|j}d|	krX| jsXt|d |r| jrnt|d | jst	| j
|rt|d|  |s|}| jjs| jjjs| jjjdkst|}t|tj}| |||||}
d	|
_| j|
 |	|
_|jr*|d
kr*| j
d r |
  n
|| |jr:d| _nV|| rNd| _ nB|jr| jsh|dkrd| _!|j"r|j#r|j#$ rd| _%|dkrt|d|  |dkrd|
_&| js|dkrt|d |js|'| st|d|  nd|
_&|
S |t(krt}t)j*| |||||||||	d
}
d	|
_+d	|
_,|
S 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.r   r   r   r  Tr   )r7   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  r<  r   r!  get_special_method_signaturerT  r4  rJ   r   rn   r   r(   r   Zunicode_structmember_prefixr   rt   r   r   rj   ra   rh   r"  r   has_memoryview_attrsZneeds_explicit_construction"has_explicitly_constructable_attrshas_pyobject_attrsr  rT   r5  r3  r   Zcan_coerce_to_pyobjectr   r   r   rr   rq   r#  r   r   r   r   	  s    







    zCClassScope.declare_varc                 C   s   |t kr"| drLt|d|  n*|dkrLt D ]}| |r.t|d|  q.|dkr^t|d | j|t|dd}t| j|}|r||_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   r/  r   r   )r   r  r   r   r   r   r!  r>  r0  r   r   r   r   )r-   r8   r:   r4  rt  rJ   Zspecial_sigr   r   r   r5  )
  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 )NrB  Z	__cinit__)r<  r	   r'  r  rw   rT  r  r  ra  r   r   r   r  D
  s    
zCClassScope.lookup_herer   r   c                 C   sb  |  |}t| j|r,| jjs,t|d |j}|jsv|sHt|d n.| j	|d j
svt|d|d j
|| jf  | |}|d krtt|tj}|r|jst|d|  |  n|r|jrt|d|  |jr|jrt|d n|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 n0| jrt|d|| jf  | ||||||	}|r|  tj!||_|
|_"||_#d|	k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)rC  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   rF   r   )rn   r&  z2Signature not compatible with previous declarationzOC method '%s' not previously declared in definition part of extension type '%s'r<  Tr  )*r   r   r!  r>  rT  r  r   r   rN  Zassignable_fromr9   r  r(   r   r   Zunicode_vtabentry_prefixru   rG   r   rx   r   Zsame_c_signature_asrE  rA  rB  r   r  Z!same_c_signature_as_resolved_typer   r+  r:   rD  r   r?  rd   rJ   ry   r  rC   r   rQ   r   )r-   r8   r9   r:   r   rn   r   r$  r   r&  rd   rJ  r   rJ   r   r   r   rM  S
  s    




""   

 zCClassScope.declare_cfunctionc           
   
   C   s4   |  |}tj| |||||||d}	d|	_||	_|	S )NrX  r   )r  r'  rD  rv   r   )
r-   r8   r9   r:   r   rn   r&  rX  r   rJ   r   r   r   rD  
  s    
       zCClassScope.add_cfunctionc                 C   sT   t |}| j||d |d|d}t||t}||_d|_d|_||_|j|_||_	|S )Nr   )r:   r   rn   rd   r   )
r	   rM  r5   r   r   rt   ro   rd   rT   r   )r-   r8   r9   r   rd   rJ   rL  r   r   r   r  
  s"         z%CClassScope.declare_builtin_cfunctionc                 C   sx   |  |}|d kr0| |||d kr&tn||d}d|_|d k	rDd|_||_|d krbt|| d|_n||_| j	| |S )Nr7   T)class_scope)
r  r   r   r   r   r   PropertyScoperT   r1  r   )r-   r8   r   r:   ctypeZproperty_scoperJ   r   r   r   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   rG  r:   r-   Nr   )rE  rB  rF  rG  )r8   r9   r   rd   rn   r:   )rH  rT   rM  r   rR  rS  rT  )r-   r8   r9   Z
cfunc_namer   r:   rn   rE  rB  rF  rG  rd   Zproperty_entryrZ  r   r   r   declare_cproperty
  s"    zCClassScope.declare_cpropertyc              
      s2   fdd}|j |j }|D ]@ |  j| j jd d}d|_d|_ j|_| j 	| q|j
d d  D ]  jjrl j  ql|j
D ]  j} j}|o|j}|s||}| j j j j| j jdd}d|_ jrd|_ j|_| j|jks|jr j|_|rd|_||_ jr j|_qd S )Nc                    s   dt j jf S r   )r   r  r   r   
base_entryr   r   adapt
  s    z9CClassScope.declare_inherited_c_attributes.<locals>.adaptr7   r   TrD  )r2  r   r   r8   r   r9   rt   r   rm   r   r   rQ   rR   r   ro   rD  r:   rn   r   rx   ry   r   r   rw   rd   )r-   
base_scoperL  r   rJ   r   rL  ro   r   rJ  r   r  
  sZ       

     z*CClassScope.declare_inherited_c_attributesc                    s   t  |||||| d S r*   )superr   r  r   r   r   r     s    z(CClassScope.handle_already_declared_name)FT)Nr7   FFFN)F)Nr7   r   r   r   r   NF)F)N)NN)NNr   FFNFN)T)r2   r3   r4   r  r<  r  rA  r?  r@  r3  r  r  r.   r5  r7  r9  r;  r=  r   r5  r  rM  rD  r  rH  rI  r  r   __classcell__r   r   rO  r   r  ]	  s^     
          
R
              
D
	

         
/r  c                       s^   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
 fddZdd Z  ZS )CppClassScoper   Nc                 C   sR   t | ||d  |j| _g | _|d k	rN|D ]"}| ||t|d d}d|_q*d S )Nr   r   )r   r.   r!  r2  r   r   ZTemplatePlaceholderTyper{   )r-   r8   r   r  TZtemplate_entryr   r   r   r.     s        zCppClassScope.__init__r   Fc                 C   s   |s|}|  ||
 | |}|	rn|d k	rn|jrD| |||||}q|j|rb|j|j|_qt|d n"| |||||}|jr|	sd|_	d|_
|jrd|_| jr| j sd| j |f |_|dkr|	s|dkr| j| |S )Nr=  r   z%s::%sr  r   )r)  r  ru   r   r9   r@  rA  rB  r   r   rt   Zget_fused_typesZempty_declaration_coder   r   r   )r-   r8   r9   r:   r   rn   r   r$  r%  r   rj   rJ   r   r   r   r     s*    

zCppClassScope.declare_varr   r   c                    s  | j dd }||dfkrl|d krldtj|f }td}t |_|j|_	dd   fdd	|jD |_n0|d
kr|d krdtj|f }td}t |_|dkr|j
r| jjD ]2}|j|}|r|jj
st|d t|jd q| j||||||d}|
|_||_|S )Nz::r   r.   z%s__init__%sr   c                 S   s2   | j jr*| j js*t| jt| j | jS | S d S r*   )r9   ra   Zis_referencer   rS  r8   Z
c_ref_typer:   )rn  r   r   r   	maybe_refB  s     
 z2CppClassScope.declare_cfunction.<locals>.maybe_refc                    s   g | ]} |qS r   r   rm  rS  r   r   rM   H  s     z3CppClassScope.declare_cfunction.<locals>.<listcomp>__dealloc__z%s__dealloc__%s<del>r   rV  zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.)r   r   rn   )r8   r  r   r?  r	   r   Z	CVoidTyperH  r   Zoriginal_argsrE  r9   r  rT   r   r   r:   r   rd   rJ   )r-   r8   r9   r:   r   rn   r   r$  r   r&  rd   rJ  r+  baserK  rJ   r   rT  r   rM  7  s4    



 zCppClassScope.declare_cfunctionc                 C   s.  |j }|}t|dd r|j}q
t|dd r<dd |jD }nd}|j|j D ]f}|jdkr\qL|j| jkrn|j | |j|j	|j
d d}d|_d|_|jrd|_|j|_| j| qL|jD ]2}| j|j|j
|j|j	|jd	|j|jd
}d|_q|jD ]4}|j|kr| j|j|j
|j|j	|jdd}d|_qd S )Ntemplate_typer  c                 S   s   g | ]
}|j qS r   r   )rK   rR  r   r   r   rM   a  s     zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp>r   rW  r   r   r   )r   r&  rd   F)r   )rT   r   rY  r  r2  r   r8   r   r   r   r9   rt   r   ru   r   r   r   rM  r:   rn   r   rd   r   r   )r-   r  rM  rY  Zbase_templatesrK  rJ   r   r   r   r  [  sT    
  
  

  z.CppClassScope.declare_inherited_cpp_attributesc              	   C   s   t | j| j}||_| j D ]}|jrL|j|j|j||j	|j
dd q|jjr| D ](}|j|j|j||j	|j
|jd q\q||j|j||j	|j
|j q|S )Nr   )r   )rd   )rQ  r8   r   r9   r   r  r{   r   rf  r:   r   ru   rI   rM  rd   r   rn   )r-   r  Z
type_entryrT   rJ   r   r   r   r   rf    s2    



zCppClassScope.specializec                    s*   |dkrd}n|dkrd}t t| |S )Nr.   r   rU  rV  )rN  rQ  r  r   rO  r   r   r    s
    zCppClassScope.lookup_herec                 C   s   dS r  r   r0   r   r   r   r     s    zCppClassScope.is_cpp)N)Nr   FFFFN)Nr   r   r   r   r   NF)r2   r3   r4   r   Zdefault_constructorr9   r.   r   rM  r  rf  r  r   rP  r   r   rO  r   rQ    s2   
            
              
$)rQ  c                   @   s   e Zd Zdd ZdddZdS )CppScopedEnumScopec                 C   s   t | ||d  d S r*   r  r-  r   r   r   r.     s    zCppScopedEnumScope.__init__Nr   c                 C   s0   |s|}|  || | |||||}d|_|S r  )r)  r   rt   )r-   r8   r9   r:   r   rn   rj   rJ   r   r   r   r     s    zCppScopedEnumScope.declare_var)Nr   N)r2   r3   r4   r.   r   r   r   r   r   rZ    s
        rZ  c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )rF  r   c                 C   s8   |j r| nd }tj| |||d |j| _|j| _d S )Nr   )r   r   r   r.   rT  r!  )r-   r8   rE  r   r   r   r   r.     s    zPropertyScope.__init__c                 O   s   |j jrt|d |jr:|jd jtkr:| jj|jd _nFt|jdkrTt|d n,|jd jj	s|jd j| jjkst|d t
j| |||f||}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)rH  rI  r   r   r9   r   r   rT  r^   r  r   rM  r   )r-   r8   r9   r:   r   kwargsrJ   r   r   r   rM    s    
"
zPropertyScope.declare_cfunctionFc                 C   s@   t |}|r.| ||t|d}d|_||_|S t|d d S d S )Nr7   r   zKOnly __get__, __set__ and __del__ methods allowed in a property declaration)r   r   r   r   r0  r   )r-   r8   r:   r4  r0  rJ   r   r   r   r5    s    
z PropertyScope.declare_pyfunctionN)F)r2   r3   r4   r  r.   rM  r5  r   r   r   r   rF    s   rF  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   r.   r8   r   r   base_type_scoper~   is_volatile)r-   r]  r~   r^  r   r   r   r.     s    zCConstOrVolatileScope.__init__c                 C   s<   | j |}|d k	r8t|}t|j| j| j|_|S d S r*   )r]  r  r   r   Zc_const_or_volatile_typer9   r~   r^  ra  r   r   r   r    s    
  z!CConstOrVolatileScope.lookup_hereN)r   r   )r2   r3   r4   r.   r  r   r   r   r   r\    s   

r\  c                   @   s   e Zd Zdd ZdS )TemplateScopec                 C   s   t | ||d  |j| _d S r*   )r   r.   r!  r-  r   r   r   r.     s    zTemplateScope.__init__N)r2   r3   r4   r.   r   r   r   r   r_     s   r_  )N)2r   r   r   mathZUtilsr   ZErrorsr   r   r   r   ZStringEncodingr	   r6   r
   r   r   r   r   Z	TypeSlotsr   r   r   r   r   r   r   r   r(   r)   r5   r   r   r  r  Zconst_counterr  r   r  r$  r%  r  r'  r/  r  rQ  rZ  rF  r\  r_  r   r   r   r   <module>   sh   	
 w$       Y     *mG*.1   . $/