Your IP : 216.73.216.213


Current Path : /opt/alt/python35/lib64/python3.5/site-packages/Cython/Compiler/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib64/python3.5/site-packages/Cython/Compiler/__pycache__/Symtab.cpython-35.pyc



Z��Z��-@sddlmZddlZddlZddlZyddlZWnek
rdddlZYnXddlm	Z	m
Z
mZddlm
Z
ddlmZmZddlmZddlmZmZdd	lmZmZmZmZmZdd
lmZeddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.g$�Zd/d0�ZGd1d2�d2e�ZGd3d4�d4e�Z Gd5d6�d6e �Z!Gd7d8�d8e�Z"Gd9d:�d:e"�Z#Gd;d<�d<e"�Z$dZ%Gd=d>�d>e"�Z&Gd?d@�d@e"�Z'GdAdB�dBe"�Z(GdCdD�dDe'�Z)GdEdF�dFe"�Z*GdGdH�dHe"�Z+GdIdJ�dJe+�Z,GdKdL�dLe+�Z-GdMdN�dNe"�Z.GdOdP�dPe"�Z/GdQdR�dRe"�Z0GdSdT�dTe"�Z1dS)U�)�absolute_importN�)�warning�error�
InternalError)�
EncodedString)�Options�Naming)�
PyrexTypes)�py_object_type�unspecified_type)�pyfunction_signature�pymethod_signature�richcmp_special_methods�get_special_method_signature�get_property_accessor_signature)�CodeZauto�breakZcase�char�const�continue�defaultZdo�double�else�enum�extern�float�forZgoto�if�int�long�register�return�short�signed�sizeof�static�struct�switch�typedef�unionZunsigned�voidZvolatile�whileZ_Boolz_Complex, _Imaginary�inlineZrestrictcCsR|dd�dkr5|jtj�p1|dksA|tkrNtj|}|S)N��__�__weakref__�__dict__)r0r1)�
startswithr	�pyrex_prefix�iso_c99_keywords)�cname�r6�I/opt/alt/python35/lib64/python3.5/site-packages/Cython/Compiler/Symtab.py�c_safe_identifier$s
(

r8c@s.eZdZdZdd�Zdd�ZdS)�	BufferAuxFcCs||_||_dS)N)�buflocal_nd_var�	rcbuf_var)�selfr:r;r6r6r7�__init__0s	zBufferAux.__init__cCsd|jS)Nz<BufferAux %r>)r1)r<r6r6r7�__repr__4szBufferAux.__repr__N)�__name__�
__module__�__qualname__Zwritable_neededr=r>r6r6r6r7r9-sr9c@s�eZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&gZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDdddd�ZEd	d
�ZFdd�ZGd
d�ZHdd�ZIdd�ZJdd�ZKdS)�EntryFr�N�privateTcCs^||_||_||_||_||_g|_g|_g|_g|_||_	dS)N)
�namer5�type�pos�init�overloaded_alternatives�cf_assignments�
cf_references�
inner_entries�defining_entry)r<rEr5rFrGrHr6r6r7r=�s									zEntry.__init__cCs)dt|�jt|�|j|jfS)Nz%s(<%x>, name=%s, type=%s))rFr?�idrE)r<r6r6r7r>�szEntry.__repr__cCst|jd�dS)NzPrevious declaration is here)rrG)r<r6r6r7�already_declared_here�szEntry.already_declared_herecCs"t|d|j�|j�dS)Nz('%s' does not match previous declaration)rrErO)r<rGr6r6r7�
redeclared�szEntry.redeclaredcCs|g|jS)N)rI)r<r6r6r7�all_alternatives�szEntry.all_alternativescCs|g|jS)N)rL)r<r6r6r7�all_entries�szEntry.all_entriescCsHt|t�r@t|t�r@|j|jf|j|jfkStSdS)N)�
isinstancerBrEr5�NotImplemented)�left�rightr6r6r7�__lt__�s"zEntry.__lt__)Lr?r@rAZinline_func_in_pxdZborrowedrH�
annotation�
visibility�
is_builtin�
is_cglobal�is_pyglobal�	is_member�is_pyclass_attr�is_variable�is_cfunction�
is_cmethod�is_builtin_cmethodZis_unbound_cmethod�is_final_cmethod�is_inline_cmethod�is_anonymous�is_type�	is_cclass�is_cpp_class�is_const�is_property�	doc_cnameZgetter_cnameZsetter_cnameZis_self_arg�is_arg�is_local�
in_closure�from_closure�in_subscopeZis_declared_generic�is_readonlyZpyfunc_cname�
func_cname�func_modifiers�final_func_cname�doc�as_variableZxdecref_cleanup�in_cinclude�	as_module�is_inheritedZpystring_cnameZ
is_identifierZis_interned�used�
is_special�defined_in_pxd�is_implemented�api�utility_code�is_overridableZ
buffer_aux�
prev_entryZmight_overflowZfused_cfunctionZis_fused_specialized�utility_code_definition�needs_property�in_with_gil_blockZfrom_cython_utility_codeZerror_on_uninitializedZcf_used�outer_entryr=r>rOrPrQrRrWr6r6r6r7rB8s�SrBc@s@eZdZdZdZdd�Zdd�Zdd�Zd	S)
�
InnerEntryzK
    An entry in a closure scope that represents the real outer Entry.
    TcCs�tj||j|j|j|j�||_||_|}x|jrU|j}q@W||_|j	|_	|j
|_
|j|_|j|_|j	j
|�dS)N)rBr=rEr5rFrGr��scoperMrLrJrKrI�append)r<r�r�Zoutermost_entryr6r6r7r=�s
		
	zInnerEntry.__init__cCs+|jd�rt|��t|j|�S)Nr/)r2�AttributeError�getattrrM)r<rEr6r6r7�__getattr__
szInnerEntry.__getattr__cCs
|jj�S)N)rMrR)r<r6r6r7rRszInnerEntry.all_entriesN)r?r@rA�__doc__ror=r�rRr6r6r6r7r��s
r�c
@s1eZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdd�Zdd�Zddd	d
�Zdd�Zd
d�Zddd�Zdd�Zdd�Zddd�Zdd�Zdd�Zdd�Zddddd�Zdd �Zdd!ddd"d#�Z dd!dd$ddd%d&�Z!dd!dd'd(�Z"dd!dd)d*d+�Z#dfd,dd-d.�Z$d/d0�Z%d1d2�Z&d!ddd3d4�Z'd5d6�Z(dd!dddd7d8�Z)d9d:�Z*d,dd;d<�Z+d)d,d=d>�Z,d?d@�Z-dAdB�Z.dCdD�Z/dd!dddfdd)dEdF�Z0d)dGdH�Z1dIdJ�Z2dKdL�Z3dMdN�Z4dOdP�Z5dQdR�Z6dSdT�Z7dUdV�Z8dWdX�Z9dYdZ�Z:d[d\�Z;d]d^�Z<d_d`�Z=dadb�Z>dcdd�Z?dedf�Z@dS)g�ScoperrCNcCsG||_||_||_dt|�|jdd�f}|j�}|rt|j|�|_|j||_nt	|�|_||_i|_
t�|_g|_
g|_g|_g|_g|_g|_g|_g|_g|_i|_i|_i|_i|_i|_i|_g|_g|_i|_dS)Nz%d%s_�.Z_dot_)rE�outer_scope�parent_scope�len�replace�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_entriesZdefined_c_classesZimported_c_classesZcname_to_entryZstring_to_entryZidentifier_to_entryZnum_to_entryZobj_to_entryZbuffer_entries�lambda_defs�id_counters)r<rEr�r�Zmangled_nameZ
qual_scoper6r6r7r=Bs<			"																			zScope.__init__cCs|S)Nr6)r<�memor6r6r7�__deepcopy__eszScope.__deepcopy__Tc
Cs�g}xR|jj�D]A\}}|s5||kr|jsD|r|j||f�qW|jj|�x{dD]s}t||�}td	d
�|D��}	xBt||�D]1}|js�|r�|j|	kr�|j|�q�WqrWdS)Nr�r�r�r�r�r�r�r�css|]}|jVqdS)N)rE)�.0�er6r6r7�	<genexpr>{sz!Scope.merge_in.<locals>.<genexpr>)r�r�r�r�r�r�r�r�)r��itemsrzr��updater�r�rE)
r<�otherZmerge_unusedZ	whitelistr�rE�entry�attrZself_entries�namesr6r6r7�merge_inhs&
zScope.merge_incCsd|jj|jfS)Nz<%s %s>)�	__class__r?r�)r<r6r6r7�__str__�sz
Scope.__str__cCs|jS)N)r�)r<r6r6r7r��szScope.qualifying_scopecCs4|rd||j|fS|jj||j�SdS)Nz%s%s%s)r�r��manglerE)r<�prefixrEr6r6r7r��szScope.manglecCs dtj|f}|j|�S)Nz%s%s_)r	r3r�)r<rEr�r6r6r7�mangle_internal�szScope.mangle_internalcCs|jr|jj|�S|S)N)r��mangle_class_private_name)r<rEr6r6r7r��s	zScope.mangle_class_private_namecCsp|j�j}y||d}Wntk
r;d}YnX|||<|rd|sV|Sd||fSd|SdS)Nrrz%s%dz%d)�global_scoper��KeyError)r<rEZcounters�countr6r6r7�next_id�s

z
Scope.next_idcCs
|jj�S)z6 Return the module-level scope containing this scope. )r�r�)r<r6r6r7r��szScope.global_scopecCs
|jj�S)z6 Return the module-level scope containing this scope. )r��
builtin_scope)r<r6r6r7r��szScope.builtin_scopeccs@|V|jr<x+t|jdtjd��D]}|Vq-WdS)N�keyr�)r��sorted�operator�
attrgetter)r<r�r6r6r7�iter_local_scopes�s	%zScope.iter_local_scopesc	Cs|jr&t|t�r&t|d�|jr\|r\tjd|�r\t|d|d�|j}	|rw||	krw|rw|	|}
d}|j	r�|
j
j	r�|j�r�xF|
j�D]2}||j
kr�|dkr�|j
r�d}Pq�Wd}|rnv|jr|	|jrn]|dkrLt|d	||jrBdnd
�n+|dkrwt|d	|�|	|j�t|||d|�}
|j|
_||
_|r�|j|�|
_|s�|
|	|<|jr�dd
lm}|j|
_||
_||
_|
S)Nz5Buffer types only allowed as function local variablesz
^_[_A-Z]+$z'%s' is a reserved name in C.rFz<init>Trz'%s' redeclared r�ignorerG)�
MemoryView���)Z	is_bufferrS�
LocalScoperrw�re�matchrr�r`rF�is_cpprQ�args�is_cpp_class_scoperyrOrB�create_wrapperr�r��is_memoryviewslicerCr�Zmemslice_entry_initrHr�rY)r<rEr5rFrGrY�shadowrfr�r�Z	old_entryZcpp_override_allowed�	alt_entryr�r�r6r6r7�declare�sJ
"	
!&	
			z
Scope.declarecCstd|j|f�S)Nz%s.%s)rr�)r<rEr6r6r7r��szScope.qualify_namerDc	
Csv|s?|js!|dks!|r*|}n|jtj|�}|j|||||d|�}	d|	_||	_|	S)N�publicr�r)rwr�r	Zenum_prefixr�riZ
value_node)
r<rErF�valuerGr5rYr~r�r�r6r6r7�
declare_const�s	!		zScope.declare_constrc
	Csk|s|}|j||||||dd�}
d|
_||
_|rX|jj|
�|	sg|
|_|
S)NrfTr)r�rfr~r�r�r�)r<rErFrGr5rYr~�definingr��templater�r6r6r7�declare_type�s				zScope.declare_typecCs|s?|js!|dks!|r*|}n|jtj|�}yO|jrf|jj|j�j}nd}t	j
||||dk|�}WnBtk
r�}	z"t||	j
d�t	j}WYdd}	~	XnX|j||||d|d|�}
|
j|_|
S)NrDrrrYr~)rwr�r	�type_prefixr�r��lookuprErFr
Zcreate_typedef_type�
ValueErrorrr��
error_typer�r�)r<rE�	base_typerGr5rYr~�	namespacerFr�r�r6r6r7�declare_typedefs$			
zScope.declare_typedefFc
Cs�|s?|js!|dks!|r*|}n|jtj|�}|j|�}
|
s�tj||||||	�}|j||||d|d|d|dk	�}
|jj	|
�|
|_
n�|
jo�|
jj
o�|
jj|ks�t|d|d�nq|r%|
jjr%t|d|d�nH|j|
||�|j|
||�|rm||
j_|jj	|
�|jr�|jj|j�j|
j_|
S)Nr�rYr~r�z'%s' redeclared  rz2'%s' already defined  (ignoring second definition))rwr�r	r��lookup_herer
ZCStructOrUnionTyper�r�r�r�rfrFZis_struct_or_union�kindrr��check_previous_typedef_flag�check_previous_visibilityr�r�r�r�rEr�)r<rEr�r��typedef_flagrGr5rYr~Zpackedr�rFr6r6r7�declare_struct_or_union)s4		zScope.declare_struct_or_unionrc

sC|dkr?|js!|dkr*|}n|jtj|�}t|�}|j|�}|s�tj||||d|�}	|j||	�|d|d|dk	�}|j	j
|�n|jo�|jj
s�t�d|�|j�dS|r|jjrt�d|d�n"|r:||j_|jj
|�|r�|jjrx|jj|krxt�d�|j�n||j_|s�|jjr�||jjkr�t�d	�|j���fd
d��|r�||�|jdd
dd
dtj|j�d|j�|jr?|jj|j�j|j_|S)NrD�	templatesrYr�z'%s' redeclared z2'%s' already defined  (ignoring second definition)rz-Base type does not match previous declarationz5Template parameters do not match previous declarationcsixb|D]Z}|tjkrq|jdkr>t�d�q�||j�|jjj|�qWdS)Nz#Cannot inherit from incomplete type)r
r�r�r�base_classesrF� declare_inherited_cpp_attributes)r�r��
base_class)�declare_inherited_attributesrGr6r7r�rs
z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesrE�thisr5rFrG)rwr�r	r��listr�r
ZCppClassTyper�r�r�rfrFrhrrOr�rr�r�r��declare_var�CPtrTyperGr�r�r�rEr�)
r<rEr�rGr5r�rYr�r�rFr6)r�rGr7�declare_cpp_classLsJ	




	
1	zScope.declare_cpp_classcCs:||jjkr6t|d|jd|jjf�dS)Nz#'%s' previously declared using '%s'�cdef�ctypedef)r�r�)rFr�rrE)r<r�r�rGr6r6r7r��s	z!Scope.check_previous_typedef_flagcCs0|j|kr,t|d|j|jf�dS)Nz '%s' previously declared as '%s')rYrrE)r<r�rYrGr6r6r7r��s	zScope.check_previous_visibilityc
Cs�|r�|sQ|js3|dks3|dks3|r<|}n|jtj|�}|jru|jj|j�j}nd}t	j
||||�}	n	t	j}	|j||	|d|d|d|�}
||
_
g|
_|jj|
�|
S)Nr�rr5rYr~)rwr�r	r�r�r�r�rErFr
Z	CEnumTypeZc_anon_enum_typer�r�Zenum_valuesr�r�)r<rErGr5r�rYr~r�r�rFr�r6r6r7�declare_enum�s"					zScope.declare_enumcCs|jj||�S)N)r��declare_tuple_type)r<rG�
componentsr6r6r7r��szScope.declare_tuple_typec	
Cs�|s6|dks|r!|}n|jtj|�}|jrX|dkrX|j|�|j|||||�}	d|	_|r�|dkr�d|	_d|	_|r�d|	_	d|	_|	S)NrDrr)
r�r	�
var_prefixrh�check_nullary_constructorr�r_r|rzr~)
r<rErFrGr5rYr~�in_pxd�is_cdefr�r6r6r7r��s	
					zScope.declare_varcCs|jj||�S)N)r��declare_builtin)r<rErGr6r6r7r��szScope.declare_builtincCsl|r4|jjr4t|d|�t|jd�|j|t|d|�}t|_|jj	|�|S)Nz'%s' already declaredzPrevious declaration is hererY)
rFr`rrGr�rr
�	signaturer�r�)r<rErGrYr�r6r6r7�_declare_pyfunction�s	zScope._declare_pyfunctioncCs�|j|�}|s1|j||d|d|�S|r}|jjrOt|_q�|jtk	r�|j||d|d|�Sn|j|t|d|�|jdt|d|dd�}t|�|_|j|�|_	t
|_d|_|S)NrYr�r5rDT)
r�r�rFZis_unspecifiedrr�rrEr�r�r
r�re)r<rErG�allow_redefinerYr�r6r6r7�declare_pyfunction�s 		zScope.declare_pyfunctioncCs�|jtjd|�}|jtjd|�}|j|�}|jd|t|d�}||_||_||_||_	t
|_d|_|S)NZfuncdef_Zmethdef_rDT)
r�r	Zlambda_func_prefixr�r�rrEr��pymethdef_cnamerrr
r�re)r<Zlambda_namerGrrr�r�r�r6r6r7�declare_lambda_function�s						zScope.declare_lambda_functioncCs|jj|�dS)N)r�r�)r<�def_noder6r6r7�add_lambda_def�szScope.add_lambda_defcCs|jj|�dS)N)r�r�)r<r�r6r6r7�register_pyfunction�szScope.register_pyfunctioncCsR|s6|dks|r!|}n|jtj|�}|j|�}|r4|r�||jkr�|dkr�d}|j}||_||_|dkr�||jkr�t|d||j|fd�||jkr�t|d||r�dndfd�|j	j
|�r+|j	j|j�|_	qd|dkr�|jdkr�d	}
|j
�rad}
n=|r�x4|j�D] }|js�||jkrtPqtWd}
|
r�|j||||||	�}|j�|_|}q1t|d
d�||_	qd|r$|jr$|j|j	�r$||_	qdt|d
�n0|j||||||	�}||_||_|r|dkrd|_|r�d|_|r�|r�|dkr�t|d|�|r�d|_|	r�|	|_|
r|js�td||f��|
|_|rEt||t�}d|_d|_|j|_||_||_|S)
NrDrTz6Function '%s' previously declared as '%s', now as '%s'rz)Function '%s' previously declared as '%s'Zcpdefr�Fz6Function signature does not match previous declarationz3Non-extern C function '%s' declared but not definedz2duplicate utility code definition in entry %s (%s)) r�r	�func_prefixr�rYr5rrrr�rF�same_as�
with_with_gil�with_gilr�rQ�
add_cfunctionrIr|�compatible_signature_withrr~r}rsr�AssertionErrorrBrr_r\r�rvr�)r<rErFrGr5rYr~r�r��	modifiersr�overridabler�Zcan_overrider��temp�	var_entryr6r6r7�declare_cfunction�sx	"			 			"						 					zScope.declare_cfunctioncCs�|j|||||�}d|_|r3||_|sB|jrU|jj|�n]t|j�}	x8t|j�D]'}
|
js�|
j	jr�P|	d8}	qtW|jj
|	|�|S)Nr)r�r`rs�is_fusedr�r�r��reversedryrF�insert)r<rErFrGr5rYr�	inheritedr��iZcfunc_entryr6r6r7r?s		zScope.add_cfunctioncCs.|j|�}|r|St|d|�dS)Nz'%s' is not declared)r�r)r<rErGr�r6r6r7�findRsz
Scope.findcCsj|}x]|D]U}|j||�}|s/dS|jrD|j}q
t|ddj|��dSq
W|S)Nz'%s' is not a cimported moduler�)rrxr�join)r<�pathrGr�rEr�r6r6r7�find_imported_moduleZs
	zScope.find_imported_modulecCs.|j|�p-|jr*|jj|�p-dS)N)r�r�r�)r<rEr6r6r7r�iszScope.lookupcCs|jj|d�S)N)r��get)r<rEr6r6r7r�pszScope.lookup_herecCs.|j|�}|s*|j|td�}|S)N)r�r�r)r<rEr�r6r6r7�
lookup_targettszScope.lookup_targetcCsQ|j|�}|rM|jrM|jjrF|jrF|jj|j�S|jSdS)N)r�rfrFr
�fused_to_specific�
specialize)r<rEr�r6r6r7�lookup_type|s
zScope.lookup_typecCs�|djjr�|dj}|jjd|�}|dk	r�dd�|dd�D�}tjdd�|dd�D�|j��}|dk	r�|S|jd|�}|dkr�dStjdd�|D�|j��S)Nrz
operator%scSsg|]}|j�qSr6)rF)r��argr6r6r7�
<listcomp>�s	z)Scope.lookup_operator.<locals>.<listcomp>rcSsg|]}|j�qSr6)rF)r�rr6r6r7r�s	cSsg|]}|j�qSr6)rF)r�rr6r6r7r�s	)rFrhr�r�r
�
best_matchrQ)r<r��operandsZobj_type�method�	arg_types�res�functionr6r6r7�lookup_operator�s
 zScope.lookup_operatorcsRddlm}Gdd�d|����fdd�|D�}|j||�S)Nr)�Nodec@seZdZdS)z4Scope.lookup_operator_for_types.<locals>.FakeOperandN)r?r@rAr6r6r6r7�FakeOperand�sr"cs"g|]}��d|��qS)rFr6)r�rF)r"rGr6r7r�s	z3Scope.lookup_operator_for_types.<locals>.<listcomp>)ZNodesr!r )r<rGr��typesr!rr6)r"rGr7�lookup_operator_for_types�szScope.lookup_operator_for_typescCs|j�j|�dS)N)r��use_utility_code)r<�new_coder6r6r7r%�szScope.use_utility_codecCs|j�j|�dS)N)r��use_entry_utility_code)r<r�r6r6r7r'�szScope.use_entry_utility_codecCs(x!|D]}||jkrdSqWdS)Nrr)r�)r<r�rEr6r6r7�defines_any�s
zScope.defines_anycCs8x1|D])}||jkr|j|jrdSqWdS)Nrr)r�r{)r<r�rEr6r6r7�defines_any_special�s
zScope.defines_any_specialcCs$ddlm}|�j|�dS)Nr)�get_type_inferer)�
TypeInferencer*�infer_types)r<r*r6r6r7r,�szScope.infer_typescCs'|j}|dkrdS|j�SdS)NF)r�r�)r<Zouterr6r6r7r��s	zScope.is_cppcCs|jj|�dS)N)r��add_include_file)r<�filenamer6r6r7r-�szScope.add_include_file)Ar?r@rA�is_builtin_scope�is_py_class_scope�is_c_class_scope�is_closure_scope�is_genexpr_scope�is_passthroughr��is_property_scope�is_module_scopeZis_internalr�rw�nogilr�return_typer=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	rrrr�r�rrr r$r%r'r(r)r,r�r-r6r6r6r7r�s�#:
!4	Mr�c@s1eZdZejZdd�Zdd�ZdS)�PreImportScopecCstj|tjdd�dS)N)r�r=r�
pre_import)r<r6r6r7r=�szPreImportScope.__init__cCs1|j||t|d�}d|_d|_|S)NrDT)r�rr_r\)r<rErGr�r6r6r7r��s		zPreImportScope.declare_builtinN)r?r@rAr	Zpreimport_cname�namespace_cnamer=r�r6r6r6r7r9�s	r9c'@sWeZdZdZdd�Zddd�Zdd�Zddd	d
�Zdddd�Zd
d�Z	dde
gdde
gdde
gdde
gdde
gdde
gdde
gdde
gdd e
gd!d"e
gd#d$e
gd%d&e
gd'd(e
gd)d*e
gd+d,e
gd-d.e
gd/d0e
gd1d2e
gd3d4e
giZdS)5�BuiltinScopeTcCs�tjdkr(tj|ddd�ntj|dt�d�i|_xEt|jj��D].\}}|\}}|j	||d|�q`WdS)N�__builtin__)
rr:r�r=r9�
type_namesr��builtin_entriesr�r�)r<rEZ
definitionr5rFr6r6r7r=�s	"zBuiltinScope.__init__NcCs.|dkr|dkrd}tj||�S)N��str�unicode)r�r�)r<rE�language_levelr6r6r7r��szBuiltinScope.lookupcCsftt|�sb|jdk	r1|jj||�StjrNt|d|�nt|d|d�dS)Nzundeclared name not builtin: %sr.)�hasattr�builtinsr�r�r�error_on_unknown_namesrr)r<rErGr6r6r7r��s	zBuiltinScope.declare_builtinc	Cs�t|�}|j||d|ddd|�}|r�|dkrK|}nt|�}t||t�}d|_d|_||_|j|_||_|S)NrYrr�*r)	rr	rBrr_rZrr�rv)r<rErFr5Zpython_equivrr�rr6r6r7�declare_builtin_cfunction�s						z&BuiltinScope.declare_builtin_cfunctionc		Cs#t|�}tj|||�}t|dddd�}i|_|dkrWd|_|j|�d|j|<|j||ddd�}||_	t
d|jd|jd�j
d	|jd
|j
j�}d|_d|_d|_d|_||_	||_tjrd|_||_|S)Nr�rYr�boolTrrErFrGr5)rr
ZBuiltinObjectType�CClassScope�
directives�
is_final_type�	set_scoper>r�rrBrEr�rFrG�
typeptr_cnamer_r[rqrZr�r�cache_builtinsrirv)	r<rEr5r�objstruct_cnamerFr�r�rr6r6r7�declare_builtin_type�s0		

											z!BuiltinScope.declare_builtin_typecCs|S)Nr6)r<r6r6r7r�szBuiltinScope.builtin_scoperFz((PyObject*)&PyType_Type)rIz((PyObject*)&PyBool_Type)rz((PyObject*)&PyInt_Type)r z((PyObject*)&PyLong_Type)rz((PyObject*)&PyFloat_Type)�complexz((PyObject*)&PyComplex_Type)�bytesz((PyObject*)&PyBytes_Type)�	bytearrayz((PyObject*)&PyByteArray_Type)rAz((PyObject*)&PyString_Type)rBz((PyObject*)&PyUnicode_Type)�tuplez((PyObject*)&PyTuple_Type)r�z((PyObject*)&PyList_Type)�dictz((PyObject*)&PyDict_Type)r�z((PyObject*)&PySet_Type)�	frozensetz((PyObject*)&PyFrozenSet_Type)�slicez((PyObject*)&PySlice_Type)�NoneZPy_None�FalseZPy_False�TrueZPy_True)r?r@rAr/r=r�r�rHrQr�rr?r6r6r6r7r<�s4
r<c@s�eZdZdZdZdZdZdd�Zdd�Zdd�Z	d	d
d�Z
dd
�Zdd�Zd>dd�Z
dd�Zdd�Zd	ddd�Zdd�Zdd�Zdd�Zdd �Zd	d!dddd"d#�Zd	d!dddfd	dd$d%�Zd&d'�Zd(d)�Zd*d+�Zddd	d	d	d	d	d!ddd	dd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Z d:d;�Z!d<d=�Z"d	S)?�ModuleScoperrc	Cs�ddlm}||_|j}tj||||�|dkr\|j|_d|_n||_d|_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|_!xBdd	d
ddd
dddg	D]}|j"t|�t#d�qhW|j$t%j&ddd��dS)Nr)�Builtinr=TFrCr�__builtins__r?�__file__r��__path__�__spec__�
__loader__�__package__�
__cached__zPython.h�initial)'rCr]�
parent_moduler�r�r=�module_name�
is_packager�contextr	Zmodule_cnameZ
moddict_cnameZmodule_dict_cnameZmethtable_cname�method_table_cnameruZmoddoc_cnamerk�utility_code_list�module_entries�
c_includesrVr>Zpxd_file_loaded�cimported_modulesr�Ztypes_importedZincluded_filesZhas_extern_class�cached_builtins�undeclared_cached_builtinsr;�_cached_tuple_typesr�r�process_includer�IncludeCode)r<rErfrir]r��var_namer6r6r7r=[sB																zModuleScope.__init__cCs|jS)N)rf)r<r6r6r7r��szModuleScope.qualifying_scopecCs|S)Nr6)r<r6r6r7r��szModuleScope.global_scopeNcCsb|j|�}|dk	r|S|dkrL|jdk	rF|jjnd}|jj|d|�S)Nr@rC)r�rirCr�r�)r<rErCr�r6r6r7r��s!zModuleScope.lookupc
Cst|�}y|j|}Wn,tk
rKtj|�}|j|<YnX|j}|j|�}|st|�}x:t|�D],\}}|j	dd|d|d|�q�W|j
|dd|ddd|d	|�}	|jj|	�|	|_
|j||||�}||_|S)
NrEzf%srFrG�_structr'r�Tr5)rUrqr�r
Zc_tuple_typer5r��StructOrUnionScope�	enumerater�r�r��remove�struct_entryr�r�)
r<rGr�Zttyper5r�r��ixZ	componentryr6r6r7r��s$
	$%		zModuleScope.declare_tuple_typecCs�tt|�r�|tjkr�|tjkr�|jrP|j|t|�}|Stj	rmt
|d|�nt|d|d�|j|dt|d�}d|_
|Stjr�x$|jD]}|j|kr�|Sq�W|dkr�|jr�|jjd�S|jddt|d�}tjr�|tjkr�d|_
d|_||_tj||_|jj|�|jj|�nd|_
||_|S)Nzundeclared name not builtin: %sr.rDr�globalsZ
__Pyx_Globals)rDrErZnon_portable_builtins_mapZuncachable_builtins�has_import_starr�rrrFrrr�rZrOrorE�old_style_globalsr�r�rir	Zbuiltin_prefixr5r�rp)r<rErGr�r6r6r7r��s:									zModuleScope.declare_builtincCs�d}d}|dk	rY|dkrY|}xG|dkrU|rU|j}|d8}q-Wn|dkrt|j}d}|j�}|jj|d|d|d|�S)NFrrT�relative_torG�absolute_fallback)rfr�ri�find_module)r<rgrGZrelative_levelr~rZmodule_scoper6r6r7r��s			zModuleScope.find_modulecCs�d|kr'|jdd�\}}nd}|j|�}|sjt|d|d|j�}||j|<|r|j|�}|S)Nr�rrfri)�split�lookup_submoduler\rirl�find_submodule)r<rE�	submoduler�r6r6r7r��s
zModuleScope.find_submodulecCsgd|kr'|jdd�\}}nd}|jj|d�}|rc|dk	rc|j|�}|S)Nr�r)r�rlrr�)r<rEr��moduler6r6r7r��szModuleScope.lookup_submoduleFcCs)tj||d|�}|j|�dS)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.
        �lateN)rrsrr)r<r.Zverbatim_includer��incr6r6r7r-�szModuleScope.add_include_filecCsH|j�}|dkr$|j�}|j|j|�|j|}dS)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	mainpieceZsortkeyZdict_updaterm)r<r�r�r6r6r7rrs
zModuleScope.process_includecCsk||jkrgx$|jj�D]}|j|�qW|jj|�x|jD]}|j|�qPWdS)N)rnrm�valuesrrr��add_imported_module)r<r�r��mr6r6r7r�"szModuleScope.add_imported_modulecCsI|jrd|_||jkr1||j|<nt|d|d�dS)NTz'%s' redeclared  r)r\r_r�r)r<rEr�rGr6r6r7�add_imported_entry*s
		zModuleScope.add_imported_entrycCs�|j|�}|rK|jr1|j|kr1|S|joA|jsi|Sn|j|t|�}d|_||_|j|�|S)Nr)r�r\rxr�rr_r�)r<rEr�rGr�r6r6r7�declare_module3s		
zModuleScope.declare_modulerDc	Cs�|dkrt|d|�|sT|tkr5t}|joE|jsTtd��|s�|}	|dks|dkr�|	r�|}n|jtj|�}|j	|�}
|
r]|
j
r]|
jj|�s|dkr|
j
dkrt|d|d�||
_|
j
dkrG|jtj|�}|
j|krG|}||
_|
js]d|
_|
Stj||||d	|d
|d|d|d
|�}
|r�d|
_|
jjr�|
jj|
_|jj|
�n	d|
_tjr�d|
_|
S)NrDr�rz+Module-level variable cannot be declared %sz7Non-cdef global variable is not a generic Python objectz6Variable '%s' type does not match previous declarationrTr5rYr~r�r�)rDr�r)rrr�is_pyobject�is_extension_typerr�r	r�r�r|rFr�rYrr5r}r�r�r[�declaration_valuerHr�r�r\rZcimport_from_pyxrz)r<rErFrGr5rYr~r�r�r�r��
mangled_cnamer6r6r7r�LsN										zModuleScope.declare_varcCs<|r#d|	kr#t|dd�|se|dksG|dkrP|rP|}n|jtj|�}|dkr�|jr�t|d�|j|�}|r�|jr�|jdkr�|jtj	|�}
|j
|
kr�|}||_
||_tj
||||d|d	|d
|d|d|d
|	d|
d|�}|S)Nr-z+Declarations should not be declared inline.rrr�z6Extern functions cannot have default arguments values.rDr5rYr~r�r�rrr)rr�r	r�Zoptional_arg_countrr�r|rYr�r5rrr�r	)r<rErFrGr5rYr~r�r�rrrr�r�r6r6r7r	�s,	
			zModuleScope.declare_cfunctioncCs,|j|�}|s(|j|t|�dS)N)r�r�r)r<rErGr�r6r6r7�declare_global�szModuleScope.declare_globalcCs |dk	r|jj|�dS)N)rkr�)r<r&r6r6r7r%�szModuleScope.use_utility_codecCsL|dkrdS|jr,|jj|j�|jrH|jj|j�dS)N)rrkr�r�)r<r�r6r6r7r'�s		z"ModuleScope.use_entry_utility_codec
Cs|rC|
dkrC|
dkp!|s4t|dd�|}d}nd}|j|�}|r|r|j}|jo}|js�d}n�|j}|r�|s�|jr�|j|||�|r�|js�|r�|jr�|r�||jk	r�t	|d�|r|jr||_|s!|rGt
j||||
dk�}||_|
|_
|dk	rf||_|
dkr~||_n|j|_|	r�|	|_n|jtj|�|_|j|||d|
ddd	|�}d
|_|r�||_n4|js|jtj|�|_nt	|jd�|j|�|jj|�|js�|s\|rtd|d
|d|
�}|jj�|_|r�|jr�|j |j�|j!|�|j"j|�nI|r�|jjr�t	|d|�n#|r|jj#rt	|d|�|r d|_$|r/||_|
dkrd|j%|
krdt	|d||j%f�|rsd|_&|r�|jr�|j|kr�t	|d�||_|r�|j'r�|j'|kr�t	|d�||_'|jj(d�r�d
|j_)d
|_*|S)Nrr�z6ctypedef only valid for 'extern' , 'public', and 'api'r.rz-Base type does not match previous declarationrYr�r�Tz5Object name required for 'public' or 'extern' C classrEr�zC class '%s' already definedz C class '%s' already implementedrrDz&Class '%s' previously declared as '%s'z4Object struct name differs from previous declarationz2Type object name differs from previous declaration�final)+rr�rFrfr�r��definedr�r�rr
ZPyExtensionTyperG�buffer_defaults�objtypedef_cnamergr�rNr�r	Ztypeptr_prefixr�rgrPrwZobjstruct_prefix�attach_var_entry_to_c_classr�r�rJrK�copy�declare_inherited_c_attributesrMr��implementedr|rYr~�
typeobj_cnamerrLrz)r<rErGr�Zimplementingrgr�rPr�rNrYr�r~r�r�r�r�rFr�r6r6r7�declare_c_class�s�	
			
	
						
		
				
	
		zModuleScope.declare_c_classcCs|j}|jr=|jjr=dtj|jjf|_n�|jr�|jjr�t|jj�}|j}xC|r�|js�|t|jj�kr�P|jr�dS|j}qpWtj|_|jr�|j	tj
|j�|_|j	tj
|j�|_dS)Nz%s.%s)rFr��vtabslot_cnamer	�obj_base_cnamer�r�r��is_builtin_typer�Zvtabstruct_prefixrEZvtabstruct_cnameZvtabptr_prefixZ
vtabptr_cname)r<r�rFZentry_countr�r6r6r7�allocate_vtable_names s"			"	
	z!ModuleScope.allocate_vtable_namescCs;x4|jD])}|jjs
t|jd|j�q
WdS)Nz(C class '%s' is declared but not defined)r�rFr�rrGrE)r<r�r6r6r7�check_c_classes_pxd=szModuleScope.check_c_classes_pxdcCs�|j}|j}|j}|js8t|jd|�|dkrf|jrf|jtj	|�|_|jr�x?|jj
D]1}|jr||jr|t|jd|j�q|W|j
r�|jtj|j�|_dS)Nz(C class '%s' is declared but not definedrz)C method '%s' is declared but not defined)rFrErYr�rrGr�r�r	Ztypeobj_prefixr�ryrrr�Z
vtable_prefixZvtable_cname)r<r�rFrErYZmethod_entryr6r6r7�
check_c_classMs						zModuleScope.check_c_classcCsd}|rtd|j�x[|jD]P}|rjtd|j|f�td|j�td|j�|j|�q'WdS)Nrz&Scope.check_c_classes: checking scope z...entry %s %sz
......type = z......visibility = )�printr�r�rErFrYr�)r<Zdebug_check_c_classesr�r6r6r7�check_c_classesdszModuleScope.check_c_classescCs|xu|jj�D]d\}}|jr|jr|j|kr|jdkr|jr|jrt|j	d|�qWdS)Nrz3Non-extern C function '%s' declared but not defined)
r�r�r`r|r�rYrwr}rrG)r<rEr�r6r6r7�check_c_functions|s		

zModuleScope.check_c_functionsc	Cstddlm}td|jd|jd|jd|jj�}d|_d|_	d|_
|j|_||_dS)Nr)r]rErFrGr5)
rCr]rBrEZ	type_typerGrFrNr_r[rqr�rv)r<r�r]rr6r6r7r��s					z'ModuleScope.attach_var_entry_to_c_classcCs|jS)N)�cpp)r<r6r6r7r��szModuleScope.is_cppcCs$ddlm}|�j|�dS)Nr)�PyObjectTypeInferer)r+r�r,)r<r�r6r6r7r,�szModuleScope.infer_typesr�)#r?r@rAr6r|Zis_cython_builtinr}r=r�r�r�r�r�r�r�r�r-rrr�r�r�r�r	r�r%r'r�r�r�r�r�r�r�r�r,r6r6r6r7r\=sJ&
$		7	kr\c@s�eZdZdZdZddd�Zdd�Zdd�Zdd	d
d
d
dd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)r�FNcCs,|dkr|}tj||||�dS)N)r�r=)r<rEr�r�r6r6r7r=�szLocalScope.__init__cCs||S)Nr6)r<r�rEr6r6r7r��szLocalScope.manglecCsh|jtj|�}|j||||d�}d|_|jrKd|_d|_|jj	|�|S)NrDr�0)
r�r	r�r�r_r�rHrlr�r�)r<rErFrGr5r�r6r6r7�declare_arg�s				zLocalScope.declare_argrDrc	
Cs�|d
krt|d|�tj||||d|d|d|d|d|�}	|	jjrn|	jj|	_d	|	_|j|	_|j	j
|	�|	S)Nr��readonlyz$Local variable cannot be declared %sr5rYr~r�r�r)r�r�)rr�r�rFr�rHrm�_in_with_gil_blockr�r�r�)
r<rErFrGr5rYr~r�r�r�r6r6r7r��s	zLocalScope.declare_varcCsH|j|�r"t|dd�n"|j�j|�}||j|<dS)Nz'%s' redeclared  r)r�rr�rr�)r<rErGr�r6r6r7r��szLocalScope.declare_globalcCs�|j|�}|rL|j|krL|jrLt|d|�|j�n6|j|�}|dksq|jr�t|d|�dS)Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r�r�rorrOr�)r<rErG�
orig_entryr�r6r6r7�declare_nonlocal�s
zLocalScope.declare_nonlocalcCs�tj||�}|dk	r�|j}x|jr?|j}q*W||k	r�|jr�t|jd�rstd��d|_t	||�}d|_
||j|<|S|S)NZscope_classz#lookup() after scope class created.T)r�r�r�r3r�r2rDrrnr�r_r�)r<rEr�Zentry_scopeZinner_entryr6r6r7r��s	
		
zLocalScope.lookupcCs�x�|j�D]�}x�|jj�D]�}|jr�|jj}|jrS||_q�|jtj	�r�|t
tj	�dd�}d||f|_q#|jr#|j|_dtj	|jf|_q#Wq
WdS)Nr.z%s->%s)
r�r�r�ror�r5r4r2r	Zcur_scope_cnamer�rnZoriginal_cname)r<Zouter_scope_cnamer�r�r5r6r6r7�mangle_closure_cnames�s			z LocalScope.mangle_closure_cnames)
r?r@rAZhas_with_gil_blockr�r=r�r�r�r�r�r�r�r6r6r6r7r��s
r�c@sveZdZdZdZdd�Zdd�Zddd	d	dd
d�Zdd
d�Zdd�Z	dd�Z
dS)�GeneratorExpressionScopez�Scope for generator expressions and comprehensions.  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).
    TcCs�|}x|jr|j}q	W|j�jtj�}tj||||�|j|_dtj	t
|�|f|_x(|js�|js�|j
r�|j}q{W|j|_|jj|�dS)Nz%s%d%s)r3r�r�r�r	Zgenexpr_id_refr�r=rKr3r��
genexp_prefixr1r0r�r�r��add)r<r�r�rEr6r6r7r=
s

z!GeneratorExpressionScope.__init__cCs d|j|jj||�fS)Nz%s%s)r�r�r�)r<r�rEr6r6r7r�szGeneratorExpressionScope.mangleNrDrc	Cs�|tkr6|jj|�}	|	r6|	jr6|	j}d|j|jjtj	|p]|j
��f}|j|||||�}
d|
_|jjr�d|
_
n	d|
_d|
_|jj|
�|
|j|<|
S)Nz%s%sT)rr�r�r_rFr�r�r�r	r�r�r�r6r[rmrpr�r�r�)r<rErFrGr5rYr~r�r�r�r�r6r6r7r�!s	1			
z$GeneratorExpressionScope.declare_varFcCs|jj|||�S)N)r�r�)r<rErGr�r6r6r7r�7s	z+GeneratorExpressionScope.declare_pyfunctioncCs|jj||�S)N)r�r�)r<rrrGr6r6r7r�;sz0GeneratorExpressionScope.declare_lambda_functioncCs|jj|�S)N)r�r�)r<r�r6r6r7r�>sz'GeneratorExpressionScope.add_lambda_def)r?r@rAr�r3r=r�r�r�r�r�r6r6r6r7r�sr�c@s4eZdZdZddd�Zddd�ZdS)�ClosureScopeTNcCs0tj||||�dtj|f|_dS)Nz%s%s)r�r=r	Zclosure_scope_prefixZ
closure_cname)r<rEZ
scope_namer�r�r6r6r7r=FszClosureScope.__init__FcCstj||||dd�S)NrYrD)r�r�)r<rErGr�r6r6r7r�SszClosureScope.declare_pyfunction)r?r@rAr2r=r�r6r6r6r7r�Bs
r�c	@saeZdZddd�Zddddddddd	�Zdddddfdd
d�ZdS)rv�?cCstj||dd�dS)N)r�r=)r<rEr6r6r7r=ZszStructOrUnionScope.__init__NrDrFcCs�|s$|}|dkr$t|�}|jr<tj|�}|j|||||�}d|_|jj|�|jr�|	r�t	|d�n|j
r�|
r�t	|d�|dkr�t	|d|�|S)NrDrz/C struct/union member cannot be a Python objectz-C struct/union member cannot be a memory viewz+C struct/union member cannot be declared %s)r8r`r
r�r�r_r�r�r�rr�)r<rErFrGr5rYr~r�r�Zallow_pyobjectZallow_memoryviewr�r6r6r7r�]s 		
zStructOrUnionScope.declare_varcCs2|
rt|d�|j|||d|d|�S)Nz0C struct/union member cannot be declared 'cpdef'r5rY)rr�)r<rErFrGr5rYr~r�r�rrr6r6r7r	ts
z$StructOrUnionScope.declare_cfunction)r?r@rAr=r�r	r6r6r6r7rvWs	rvc@s(eZdZdd�Zdd�ZdS)�
ClassScopecCs,tj||||�||_d|_dS)N)r�r=�
class_nameru)r<rEr�r6r6r7r=�s	zClassScope.__init__c	Cs�tj||�}|r|S|dkr�tddtjttjdtd�gdd��}tjj	dd�|_
|j|�d|_|S)N�classmethodZ__Pyx_Method_ClassMethodrCrZClassMethodzCythonFunction.cr)
r�r�rBr
Z	CFuncTyper�CFuncTypeArgr�UtilityCodeZload_cachedr�r'r`)r<rEr�r6r6r7r��s$
	zClassScope.lookupN)r?r@rAr=r�r6r6r6r7r�}s	r�c@syeZdZdZdd�Zdd�Zdd�Zdd	d
d
d
dd�Zd
d�Zdd�Z	dd�Z
dS)�PyClassScopercCs
|j|�S)N)�mangle_special_name)r<rEr6r6r7r��sz&PyClassScope.mangle_class_private_namecCsK|rG|jd�rG|jd�rGtd|jjd�|f�}|S)Nr/z_%s%s�_)r2�endswithrr��lstrip)r<rEr6r6r7r��s%"z PyClassScope.mangle_special_namecCs|j|�}tj||�S)N)r�r�r�)r<rEr6r6r7r��szPyClassScope.lookup_hereNrDrc	
Csm|j|�}|tkr!t}tj||||d|d|d|d|d|�}	d|	_d|	_|	S)Nr5rYr~r�r�r)r�rrr�r�r\r^)
r<rErFrGr5rYr~r�r�r�r6r6r7r��s		zPyClassScope.declare_varcCs�|j|�}|rL|j|krL|jrLt|d|�|j�n<|j|�}|dkr{t|d|�n
||j|<dS)Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r�r�rorrOr�r�)r<rErGr�r�r6r6r7r��s
zPyClassScope.declare_nonlocalcCsH|j|�r"t|dd�n"|j�j|�}||j|<dS)Nz'%s' redeclared  r)r�rr�rr�)r<rErGr�r6r6r7r��szPyClassScope.declare_globalcCs|jj|�S)N)r��add_default_value)r<rFr6r6r7r��szPyClassScope.add_default_value)r?r@rAr0r�r�r�r�r�r�r�r6r6r6r7r��sr�c
@seZdZdZdZdZdZdZdZdZ	dZ
dd�Zdd�Zdd�Z
dd	d
d�Zdd
ddddd�Zddd�Zdd�Zdd
dddfdddd�Zddd�Zddd�Zdd�Zdd�ZdS)rJrFcCsetj|||�|dkrO|jtj|�|_|jtj|�|_g|_g|_	dS)Nr)
r�r=r�r	Zmethtab_prefixrjZgstab_prefixZgetset_table_cname�property_entries�inherited_var_entries)r<rEr�rYr6r6r7r=�s	zCClassScope.__init__cCsl|jr#|jjdd�r#dS|jj}|rQ|jdk	rQ|jj�S|jjrh|jjSdS)N�no_gcFT)	�has_cyclic_pyobject_attrsrKr�parent_typer�r��needs_gcr��is_gc_simple)r<r�r6r6r7r��s
zCClassScope.needs_gccCs |j�o|jjdd�S)z�
        Do we need to generate an implementation for the tp_clear slot? Can
        be disabled to keep references for the __dealloc__ cleanup function.
        �no_gc_clearF)r�rKr)r<r6r6r7�needs_tp_clearszCClassScope.needs_tp_clearTcCs�g}g}g}x�|jD]�}|jjro|sL|jsL|jdkr�|s_|jjr�|j|�q|jtjkr�|j|�q|jj	r|j|�qW|p�|p�|}||||ffS)Nr0)
r�rFr��is_closure_class_scoperEr�r�r
Zc_py_buffer_typer�)r<Zinclude_weakrefZinclude_gc_simpleZpy_attrsZ
py_buffersZmemoryview_slicesr�Zhave_entriesr6r6r7�get_refcounted_entriessz"CClassScope.get_refcounted_entriesNrDrc	
CsS|r�|jrt|d�|jrCt|�rCt|d|�|sg|}|dkrgt|�}|jr�|dkr�|j|�|jtj	d��|j
|||||�}	d|	_|jj
|	�|jr�d|_nh|jr�d|_nS|jrP|js|dkrPd|_|jsG|jsG|jj�rPd|_|dkrmt|d|�|dkr�d|	_|jr�|dkr�t|d�|jp�|j|�s�t|d
|�n	d|	_|	S|tkr�t}tj||||d|d|d|d|d|�}	d|	_d|	_d|jj |_!|	SdS)NzVC attributes cannot be added in implementation part of extension type defined in a pxdz/The name '%s' is reserved for a special method.rDrz#include <new>rTr0r�r�z1Attribute of extension type cannot be declared %sz9Special attribute __weakref__ cannot be exposed to Pythonz7C attribute of type '%s' cannot be accessed from PythonFr5rYr~r�r�z(PyObject *)%s)rDr�r�)r�r�)"r�rr�rr8rhr�r%rr�r�r_r�r�r��has_memoryview_attrs�has_cpp_class_attrsr��has_pyobject_attrsr�r�r�r�r�Zcan_coerce_to_pyobjectrrr�r�r]r\r�rNr;)
r<rErFrGr5rYr~r�r�r�r6r6r7r�%s^	
				
		
			zCClassScope.declare_varcCs�|tkr/|jd�rlt|d|�n=|dkrlx.tD]&}|j|�rBt|d|�qBW|dkr�t|d�|j|t|dd�}t|�}|r�||_d|_nt|_d|_|j	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.rYrrr)rr�rr�rrr�r{rr�r�)r<rErGr��nr�Zspecial_sigr6r6r7r�cs&

				zCClassScope.declare_pyfunctioncCsc|jr"|dkr"td�}tj||�}|r_|jr_|jjs_|jjs_dS|S)Nr�Z	__cinit__)r�rr�r�rbr�r�rL)r<rEr�r6r6r7r�~szCClassScope.lookup_herec	Cs�t|�r&|jjr&t|d�|j}|js�|sNt|d�n=|jj|dj�s�t|d|dj||jf�|j|�}
|dkr�t	|�}|
r5|
j
s�t|d|d�qv|r�|
jr�t|d|�|
j
r|
jrt|d�qv|j|
jdd	�rb|j|
jjkrb|
jj|j�|
_qv|j|
jdd	�r|j|
jjkr|jr�|r�|j|
jdd	d
d	�r�t|d||jfd�t|
jd
d�|j||||ddd|	�}
qvt|d�t|
jd
�nA|jrXt|d||jf�|j||||||	�}
|r�|jtj|�|
_|
|
_|
|_d|	kr�d|
_|jjs�|
js�|j j!d�r�d|
_
|
j|
_"|
S)Nz7Special methods must be declared with 'def', not 'cdef'zC method has no self argumentrzCSelf argument (%s) of C method '%s' does not match parent type (%s)z'%s' redeclared  z'%s' already definedz'Overriding final methods is not allowedZ
as_cmethodrZas_pxd_definitionz�Compatible but non-identical C method '%s' not redeclared in definition part of extension type '%s'.  This may cause incorrect vtables to be generated.r.zPrevious declaration is hererYr�rz2Signature not compatible with previous declarationzOC method '%s' not previously declared in definition part of extension type '%s'r-Tr�)#rr�r�rr�Zis_static_methodZassignable_fromrFr�r8r`rrrrcryZsame_c_signature_asr7rrrr�Z!same_c_signature_as_resolved_typer�rGrr�r	r�rr�rdrLrKrrt)r<rErFrGr5rYr~r�r�rrrr�r�r6r6r7r	�s^
				--'
					zCClassScope.declare_cfunctionc

CsL|j|�}tj|||||||d|�}	d|	_||	_|	S)Nr
r)r�r�rrar�)
r<rErFrGr5rYrr
r�r�r6r6r7r�s		zCClassScope.add_cfunctionc	Csvt|�}|j||d|ddd|�}t||t�}d|_d|_||_|j|_||_|S)NrYrrr)	rr	rBrr_rZrr�rv)r<rErFr5rr�rr6r6r7rH�s					z%CClassScope.declare_builtin_cfunctioncCs�|j|�}|dkr6|j||t|d�}d|_||_t|d|j�d|�|_|j|j_|j	j
|�|S)NrDrr�r�)r�r�rrjru�
PropertyScoper�r�r�r�r�)r<rErurGr�r6r6r7�declare_property�s			zCClassScope.declare_propertyc
s��fdd�}|j|j}xQ|D]I�|j�j|�j��jdd�}d|_|jj|�q)Wx4|jdd�D]��jj	r��jj
�q�Wx�|jD]���j}�j}|o�|j}|s�||�}|j
�j�j�j|�j�jdd�}d|_�jrqd|_�j|_|j|jkse|jrq�j|_|r�d|_||_�jr��j|_q�WdS)Ncsdtj�jfS)Nz%s.%s)r	r�r5)r5)�
base_entryr6r7�adapt�sz9CClassScope.declare_inherited_c_attributes.<locals>.adaptrDrr
T)r�r�r�rEr5rFr_r�r�r
Z"get_all_specialized_function_typesrvrZrrGrYrsryrcrdr�rtrbr)r<�
base_scoper�r�r�r5rrZr6)r�r7r��s@
											z*CClassScope.declare_inherited_c_attributes)r?r@rAr1r�r�r�r�r�r�r�r=r�r�r�r�r�r�r	rrHr�r�r6r6r6r7rJ�s.<:	rJc
@s�eZdZdZdZdZddd�Zdddddddd�Zdddddfdd	d
d�Zdd
�Z	dd�Z
dS)�
CppClassScoperNcCsytj|||d�|j|_g|_|dk	rux;|D]3}|j||tj|�dd�}d|_q>WdS)Nrr)r�r=rKr�r�r
ZTemplatePlaceholderTyperf)r<rEr�r��TZtemplate_entryr6r6r7r=!	s	
zCppClassScope.__init__rrc
Cs$|s|}|j|�}
|	r�|
dk	r�|
jj|�rZ|
jj|j�|
_q�|jr�|j|
j�r�||
_q�t|d�n|j|||||�}
d|
_	|jr�|jr�|jj
�s�d|jj�|f|
_|dkr |	s|dkr |j
j|
�|
S)Nz6Function signature does not match previous declarationrz%s::%sr�z<init>)r�rFr�rrr`rrr�r_Zget_fused_typesZempty_declaration_coderrr�r�)r<rErFrGr5rYr~r�r�r�r�r6r6r7r�+	s"	zCppClassScope.declare_varFc
s�|jjd�d}||dfkr�|dkr�dtj|f}d}tj�|_|j|_dd���fdd	�|jD�|_n@|d
kr�|dkr�dtj|f}d}tj�|_|dkrD|j	rDxV|j
jD]H}
|
jj
|�}|r�|j
j	r�t|d
�t|jd�q�W|j|�}|j|||d|d|d|�}|r�|r�|j�|_|
|_||_|S)Nz::rr=z%s__init__%s�<init>cSsF|jjr>|jjr>tj|jtj|j�|j�S|SdS)N)rFrhZis_referencer
r�rEZ
c_ref_typerG)rr6r6r7�	maybe_refO	sz2CppClassScope.declare_cfunction.<locals>.maybe_refcsg|]}�|��qSr6r6)r�r)r�r6r7rU	s	z3CppClassScope.declare_cfunction.<locals>.<listcomp>Z__dealloc__z%s__dealloc__%s�<del>zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.r�r5rYr�)r�r�)rEr�r	r�r
Z	CVoidTyper8r�Z
original_argsr7rFr�r�r�rrGr�r�rQrIrr�)r<rErFrGr5rYr~r�r�rrrr��baser�r�r�r6)r�r7r	D	s6"

		zCppClassScope.declare_cfunctionc
Cs�|j}|}xt|dd�r0|j}qWt|dd�r\dd�|jD�}nf}x�|j|jD]w}|jd
kr�qs|j|jkr�|j|j|j|j	|j
dd�}d|_d|_|jj
|�qsWx\|jD]Q}|j|j|j
|j|j	|jd	d
d|jd|j�}d|_q�WxS|jD]H}|j|krW|j|j|j
|j|j	|j�}d|_qWWdS)N�
template_typer�cSsg|]}|j�qSr6)rE)r�r�r6r6r7rp	s	zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp>�<init>�<del>rrr~rrr)r�r�)r�r�r�r�r�r�rEr�r�r5rFr_ryr�r�r	rGrYrsrr�r�)r<r�r�r�Zbase_templatesr�r�r6r6r7r�j	s>	
			
z.CppClassScope.declare_inherited_cpp_attributesc	Cst|j|j�}||_x�|jj�D]�}|jrq|j|j|jj|�|j	|j
dd�q.|jjr�x||j�D]:}|j
|j|jj|�|j	|j
d|j�q�Wq.|j|j|jj|�|j	|j
|j�q.W|S)Nr�rr)r�rEr�rFr�r�rfr�rrGr5r`rQr	rr�rY)r<r�Z
type_entryr�r�r�r6r6r7r�	s,			
	zCppClassScope.specialize)r?r@rAr�Zdefault_constructorrFr=r�r	r�rr6r6r6r7r�	s$'r�c@s%eZdZdZddd�ZdS)r�rFcCsXt|�}|rC|j||t|d�}d|_||_|St|d�dSdS)NrDrzKOnly __get__, __set__ and __del__ methods allowed in a property declaration)rr�rr{r�r)r<rErGr�r�r�r6r6r7r��	s		
z PropertyScope.declare_pyfunctionN)r?r@rAr5r�r6r6r6r7r��	sr�c@s(eZdZdd�Zdd�ZdS)�CConstScopecCs0tj|d|j|j|j�||_dS)NZconst_)r�r=rEr�r��const_base_type_scope)r<r�r6r6r7r=�	s

zCConstScope.__init__cCsJ|jj|�}|dk	rFtj|�}tj|j�|_|SdS)N)r�r�r�r
Zc_const_typerF)r<rEr�r6r6r7r��	s
zCConstScope.lookup_hereN)r?r@rAr=r�r6r6r6r7r��	sr�c@seZdZdd�ZdS)�
TemplateScopecCs&tj|||d�|j|_dS)N)r�r=rK)r<rEr�r6r6r7r=�	szTemplateScope.__init__N)r?r@rAr=r6r6r6r7r��	sr�)2�
__future__rr�r�r�r=rE�ImportErrorZErrorsrrrZStringEncodingrrCrr	r
rrZ	TypeSlotsr
rrrrrr�r4r8�objectr9rBr�r�r9r<Z
const_counterr\r�r�r�rvr�r�rJr�r�r�r�r6r6r6r7�<module>s\
(	�#���p��gd<&#<�>�