B
    do             %   @   sN  d dl mZ d dlZd dlZd dlZyd dlZW n ek
rL   d dlZY nX ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZmZmZmZmZ dd
lmZ ddlmZ eddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/g$Zd0d1 ZG d2d3 d3eZ G d4d5 d5eZ!G d6d7 d7e!Z"G d8d9 d9eZ#G d:d; d;e#Z$G d<d= d=e#Z%dZ&G d>d? d?e#Z'G d@dA dAe#Z(G dBdC dCe#Z)G dDdE dEe(Z*G dFdG dGe#Z+G dHdI dIe#Z,G dJdK dKe,Z-G dLdM dMe,Z.G dNdO dOe#Z/G dPdQ dQe#Z0G dRdS dSe#Z1G dTdU dUe#Z2dS )V    )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)Future)CodeautobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforZgotoifintlongregisterreturnshortsignedZsizeofZstaticstructswitchZtypedefunionZunsignedvoidZvolatilewhileZ_Boolz_Complex, _ImaginaryinlineZrestrictc             C   s:   | d d dkr$|  tjs$| dkr,| tkr6tj|  } | S )N   __)__weakref____dict__)
startswithr	   pyrex_prefixiso_c99_keywords)cname r7   c/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/Cython/Compiler/Symtab.pyc_safe_identifier%   s
    
r9   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<   r7   r7   r8   __init__1   s    zBufferAux.__init__c             C   s
   d| j  S )Nz<BufferAux %r>)r2   )r=   r7   r7   r8   __repr__5   s    zBufferAux.__repr__N)__name__
__module____qualname__Zwritable_neededr>   r?   r7   r7   r7   r8   r:   .   s   r:   c               @   sN  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&g Z'dZ(d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ddZEd	d
 ZFdd ZGdd ZHdd ZIdd ZJdd ZKdS )EntryFr    NprivateTc             C   s@   || _ || _|| _|| _|| _g | _g | _g | _g | _| | _	d S )N)
namer6   typeposinitoverloaded_alternativescf_assignmentscf_referencesinner_entriesdefining_entry)r=   rF   r6   rG   rH   rI   r7   r7   r8   r>      s    zEntry.__init__c             C   s   dt | jt| | j| j f S )Nz%s(<%x>, name=%s, type=%s))rG   r@   idrF   )r=   r7   r7   r8   r?      s    zEntry.__repr__c             C   s   t | jd d S )NzPrevious declaration is here)r   rH   )r=   r7   r7   r8   already_declared_here   s    zEntry.already_declared_herec             C   s   t |d| j  |   d S )Nz('%s' does not match previous declaration)r   rF   rP   )r=   rH   r7   r7   r8   
redeclared   s    zEntry.redeclaredc             C   s   | g| j  S )N)rJ   )r=   r7   r7   r8   all_alternatives   s    zEntry.all_alternativesc             C   s   | g| j  S )N)rM   )r=   r7   r7   r8   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 )N)
isinstancerC   rF   r6   NotImplemented)leftrightr7   r7   r8   __lt__   s    zEntry.__lt__)NN)Lr@   rA   rB   Zinline_func_in_pxdZborrowedrI   
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_cpp_classis_constis_property	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apiutility_codeis_overridableZ
buffer_aux
prev_entryZmight_overflowZfused_cfunctionZis_fused_specializedutility_code_definitionneeds_propertyin_with_gil_blockZfrom_cython_utility_codeZerror_on_uninitializedZcf_usedouter_entryr>   r?   rP   rQ   rR   rS   rX   r7   r7   r7   r8   rC   9   s   S
rC   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   sr   t | |j|j|j|j || _|| _|}x|jr:|j}q,W || _|j	| _	|j
| _
|j| _|j| _| j	|  d S )N)rC   r>   rF   r6   rG   rH   r   scoperN   rM   rK   rL   rJ   append)r=   r   r   Zoutermost_entryr7   r7   r8   r>      s    

zInnerEntry.__init__c             C   s   | drt|t| j|S )Nr0   )r3   AttributeErrorgetattrrN   )r=   rF   r7   r7   r8   __getattr__  s    
zInnerEntry.__getattr__c             C   s
   | j  S )N)rN   rS   )r=   r7   r7   r8   rS     s    zInnerEntry.all_entriesN)r@   rA   rB   __doc__rp   r>   r   rS   r7   r7   r7   r8   r      s
   r   c               @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdd Zdd Zdhd	d
Zdd Zdd ZdiddZdd Zdd ZdjddZdd Zdd Zdd ZdkddZdd  Zdld"d#Z dmd%d&Z!dnd'd(Z"dod*d+Z#dpd.d/Z$d0d1 Z%d2d3 Z&dqd4d5Z'd6d7 Z(drd8d9Z)d:d; Z*dsd<d=Z+dtd>d?Z,d@dA Z-dBdC Z.dDdE Z/dudFdGZ0dvdHdIZ1dJdK Z2dLdM Z3dNdO Z4dPdQ Z5dRdS Z6dTdU Z7dVdW Z8dXdY Z9dZd[ Z:d\d] Z;d^d_ Z<d`da Z=dbdc Z>ddde Z?dwdfdgZ@dS )xScoper   rD   Nc             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 | _i | _g | _g | _i | _d S )Nz%d%s_.Z_dot_)rF   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_entriesZdefined_c_classesZimported_c_classesZcname_to_entryZstring_to_entryZidentifier_to_entryZnum_to_entryZobj_to_entryZbuffer_entrieslambda_defsid_counters)r=   rF   r   r   Zmangled_nameZ
qual_scoper7   r7   r8   r>   C  s<    
zScope.__init__c             C   s   | S )Nr7   )r=   memor7   r7   r8   __deepcopy__f  s    zScope.__deepcopy__Tc       
      C   s   g }x:|j  D ],\}}|r$||kr|js.|r|||f qW | j | xZdD ]R}t| |}tdd |D }	x0t||D ]"}|js|r~|j|	kr~|| q~W qRW d S )N)r   r   r   r   r   r   r   r   c             s   s   | ]}|j V  qd S )N)rF   ).0er7   r7   r8   	<genexpr>|  s    z!Scope.merge_in.<locals>.<genexpr>)r   itemsr{   r   updater   r   rF   )
r=   otherZmerge_unused	whitelistr   rF   entryattrZself_entriesnamesr7   r7   r8   merge_ini  s    


zScope.merge_inc             C   s   d| j j| jf S )Nz<%s %s>)	__class__r@   r   )r=   r7   r7   r8   __str__  s    zScope.__str__c             C   s   | j S )N)r   )r=   r7   r7   r8   r     s    zScope.qualifying_scopec             C   s(   |rd|| j |f S | j|| jS d S )Nz%s%s%s)r   r   manglerF   )r=   prefixrF   r7   r7   r8   r     s    zScope.manglec             C   s   dt j|f }| |S )Nz%s%s_)r	   r4   r   )r=   rF   r   r7   r7   r8   mangle_internal  s    zScope.mangle_internalc             C   s   | j r| j |S |S )N)r   mangle_class_private_name)r=   rF   r7   r7   r8   r     s    zScope.mangle_class_private_namec             C   s`   |   j}y|| 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=   rF   Zcounterscountr7   r7   r8   next_id  s    

zScope.next_idc             C   s
   | j  S )z6 Return the module-level scope containing this scope. )r   r   )r=   r7   r7   r8   r     s    zScope.global_scopec             C   s
   | j  S )z6 Return the module-level scope containing this scope. )r   builtin_scope)r=   r7   r7   r8   r     s    zScope.builtin_scopec             c   s4   | V  | j r0x"t| j tddD ]
}|V  q"W d S )Nr   )key)r   sortedoperator
attrgetter)r=   r   r7   r7   r8   iter_local_scopes  s    zScope.iter_local_scopesc	             C   s|  |j rt| tst|d | js@|r@td|r@t|d| d | j}	|r||	kr|s|	| }
d}|j	r|
j
j	r|  rx2|
 D ]"}||j
kr|dkr|jsd}P qW d}|rnZ| jr|	| jrnH|dkrt|d	| | jrd
nd n$|dkrt|d	|  |	|   t||||d}| j|_||_|rP| ||_|sP||	|< |jrld
dlm} |j|_| |_||_|S )Nz5Buffer types only allowed as function local variablesz
^_[_A-Z]+$z'%s' is a reserved name in C.Fz<init>Tr   z'%s' redeclared r   r   ignore)rH   )
MemoryView)Z	is_bufferrT   
LocalScoper   rx   rematchr   r   ra   rG   is_cpprR   argsis_cpp_class_scoperz   rP   rC   create_wrapperr   r   is_memoryviewslicerD   r   Zmemslice_entry_initrI   r   rZ   )r=   rF   r6   rG   rH   rZ   shadowrg   r   r   Z	old_entryZcpp_override_allowed	alt_entryr   r   r7   r7   r8   declare  sJ    


zScope.declarec             C   s   t d| j|f S )Nz%s.%s)r   r   )r=   rF   r7   r7   r8   r     s    zScope.qualify_namerE   c	       
      C   sP   |s*| j s|dks|r|}n| tj|}| j||||||d}	d|	_||	_|	S )Npublic)r   r   )rx   r   r	   Zenum_prefixr   rj   Z
value_node)
r=   rF   rG   valuerH   r6   rZ   r   r   r   r7   r7   r8   declare_const  s    zScope.declare_constr   c
          	   C   sJ   |s|}| j ||||||dd}
d|
_||
_|r<| j|
 |	sF|
|_|
S )NT)rg   r   )r   rg   r   r   r   r   )r=   rF   rG   rH   r6   rZ   r   definingr   templater   r7   r7   r8   declare_type   s    zScope.declare_typec          
   C   s   |s*| j s|dks|r|}n| tj|}y6| jrD| j| jj}nd }t	
||||dk|}W n8 tk
r }	 zt||	jd  t	j}W d d }	~	X Y nX | j||||||d}
|
j|_|
S )NrE   r   r   )rZ   r   )rx   r   r	   type_prefixr   r   lookuprF   rG   r
   Zcreate_typedef_type
ValueErrorr   r   
error_typer   r   )r=   rF   	base_typerH   r6   rZ   r   	namespacerG   r   r   r7   r7   r8   declare_typedef  s$    


zScope.declare_typedefFc
          	   C   s  |s*| j s|dks|r|}n| tj|}| |}
|
s|t||||||	}| j|||||||d k	d}
| j	|
 |
|_
n~|
jr|
jjr|
jj|kst|d| d nR|r|
jjrt|d| d n4| |
|| | |
|| |r||
j_| j	|
 | jr| j| jj|
j_|
S )Nr   )rZ   r   r   z'%s' redeclared  r   z2'%s' already defined  (ignoring second definition))rx   r   r	   r   lookup_herer
   ZCStructOrUnionTyper   r   r   r   rg   rG   Zis_struct_or_unionkindr   r   check_previous_typedef_flagcheck_previous_visibilityr   r   r   r   rF   r   )r=   rF   r   r   typedef_flagrH   r6   rZ   r   packedr   rG   r7   r7   r8   declare_struct_or_union*  s4    
zScope.declare_struct_or_unionr7   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 )NrE   )	templates)rZ   r   z'%s' redeclared z2'%s' already defined  (ignoring second definition)r   z-Base type does not match previous declarationz5Template parameters do not match previous declarationc                sN   xH|D ]@}|t jkrq|jd kr,td q | |j | jj| qW d S )Nz#Cannot inherit from incomplete type)r
   r   r   r   base_classesrG    declare_inherited_cpp_attributes)r   r   
base_class)declare_inherited_attributesrH   r7   r8   r   s  s    


z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesthis)rF   r6   rG   rH   )rx   r   r	   r   listr   r
   ZCppClassTyper   r   r   rg   rG   ri   r   rP   r   r   r   r   r   declare_varCPtrTyperH   r   r   r   rF   r   )
r=   rF   r   rH   r6   r   rZ   r   r   rG   r7   )r   rH   r8   declare_cpp_classM  sJ    



	
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)rG   r   r   rF   )r=   r   r   rH   r7   r7   r8   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')rZ   r   rF   )r=   r   rZ   rH   r7   r7   r8   r     s    
zScope.check_previous_visibilityc             C   s   |rd|s6| j s"|dks"|dks"|r(|}n| tj|}| jrN| j| jj}nd }t	
||||}	nt	j}	| j||	||||d}
||
_g |
_| j|
 |
S )Nr   r   )r6   rZ   r   )rx   r   r	   r   r   r   r   rF   rG   r
   Z	CEnumTypeZc_anon_enum_typer   r   Zenum_valuesr   r   )r=   rF   rH   r6   r   rZ   r   r   r   rG   r   r7   r7   r8   declare_enum  s"    
zScope.declare_enumc             C   s   | j ||S )N)r   declare_tuple_type)r=   rH   
componentsr7   r7   r8   r     s    zScope.declare_tuple_typec	       
      C   s   |s$|dks|r|}n|  tj|}|jr<|dkr<|| | |||||}	d|	_|rl|dkrld|	_d|	_|r|d|	_	d|	_|	S )NrE   r   r   )
r   r	   
var_prefixri   check_nullary_constructorr   r`   r}   r{   r   )
r=   rF   rG   rH   r6   rZ   r   in_pxdis_cdefr   r7   r7   r8   r     s    
zScope.declare_varc             C   s   | j ||S )N)r   declare_builtin)r=   rF   rH   r7   r7   r8   r     s    zScope.declare_builtinc             C   sN   |r&|j js&t|d|  t|jd | j|t||d}t|_| j	| |S )Nz'%s' already declaredzPrevious declaration is here)rZ   )
rG   ra   r   rH   r   r   r   	signaturer   r   )r=   rF   rH   rZ   r   r7   r7   r8   _declare_pyfunction  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)rZ   r   )rZ   rE   )r6   rZ   T)r   r   rG   is_unspecifiedr   r   r   rF   r   r   r   r   rf   )r=   rF   rH   allow_redefinerZ   r   r7   r7   r8   declare_pyfunction  s     




zScope.declare_pyfunctionc             C   sh   |  tjd |}|  tjd |}| |}| d |t|d}||_||_||_||_	t
|_d|_|S )NZfuncdef_Zmethdef_rE   T)r   r	   Zlambda_func_prefixr   r   r   rF   r   pymethdef_cnamers   r   r   rf   )r=   Zlambda_namerH   rs   r   r   r   r7   r7   r8   declare_lambda_function  s    
zScope.declare_lambda_functionc             C   s   | j | d S )N)r   r   )r=   def_noder7   r7   r8   add_lambda_def  s    zScope.add_lambda_defc             C   s   | j | d S )N)r   r   )r=   r   r7   r7   r8   register_pyfunction  s    zScope.register_pyfunctionc             C   s|  |s$|dks|r|}n|  tj|}| |}|r|s`||jkr`|dkr`d}|j}||_||_|dkr||jkrt|d||j|f d ||jkrt|d||rdndf d |j	
|r|j	|j|_	n|dkrh|jdkrhd	}|  rd}n4|r*x,| D ]}|jr||jkrP qW d}|rT| ||||||	}| |_|}nt|d
d ||_	n.|s|jr||j	r||_	n
t|d
 n | ||||||	}||_||_|r|dkrd|_|rd|_|s|s|dkrt|d|  |r
d|_|	r|	|_|
r:|jr4td||f |
|_|rrt||t}| ||_d|_d|_|j|_||_ ||_!|S )NrE   r   Tz6Function '%s' previously declared as '%s', now as '%s'r   z)Function '%s' previously declared as '%s'Zcpdefr   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   rZ   r6   rs   r   r   rG   same_aswith_with_gilwith_gilr   rR   add_cfunctionrJ   r}   compatible_signature_withr   r   r~   rt   r   AssertionErrorrC   r   r   r   r`   r]   r   rw   r   )r=   rF   rG   rH   r6   rZ   r   r   r   	modifiersr   overridabler   Zcan_overrider   temp	var_entryr7   r7   r8   declare_cfunction  sz    


zScope.declare_cfunctionc             C   s   |  |||||}d|_|r"||_|s,|jr:| j| nDt| j}	x*t| jD ]}
|
jsb|
j	jsdP |	d8 }	qPW | j
|	| |S )Nr   )r   ra   rt   is_fusedr   r   r   reversedrz   rG   insert)r=   rF   rG   rH   r6   rZ   r  	inheritedr   iZcfunc_entryr7   r7   r8   r  A  s    

zScope.add_cfunctionc             C   s$   |  |}|r|S t|d|  d S )Nz'%s' is not declared)r   r   )r=   rF   rH   r   r7   r7   r8   findT  s    
z
Scope.findc             C   sP   | }xF|D ]>}| ||}|s"d S |jr0|j}q
t|dd|  d S q
W |S )Nz'%s' is not a cimported moduler   )r  ry   r   join)r=   pathrH   r   rF   r   r7   r7   r8   find_imported_module\  s    
zScope.find_imported_modulec             C   s    |  |p| jr| j|pd S )N)r   r   r   )r=   rF   r7   r7   r8   r   k  s    
zScope.lookupc             C   s   | j |d S )N)r   get)r=   rF   r7   r7   r8   r   r  s    zScope.lookup_herec             C   s    |  |}|s| |td }|S )N)r   r   r   )r=   rF   r   r7   r7   r8   lookup_targetv  s    
zScope.lookup_targetc             C   s:   |  |}|r6|jr6|jjr0| jr0|j| jS |jS d S )N)r   rg   rG   r  fused_to_specific
specialize)r=   rF   r   r7   r7   r8   lookup_type~  s
    

zScope.lookup_typec             C   s"  |d j jrr|d j }|jd| }|d k	rrdd |dd  D }tdd |dd  D | }|d k	rr|S | d| }g }|d k	r| }g }	t|dkrxJtdD ]>}
||
 j jr||
 j }|jd| }|d k	r|	| 7 }	qW |	s|sd S t	t
|	| }tdd |D |S )	Nr   z
operator%sc             S   s   g | ]
}|j qS r7   )rG   )r   argr7   r7   r8   
<listcomp>  s    z)Scope.lookup_operator.<locals>.<listcomp>r   c             S   s   g | ]
}|j qS r7   )rG   )r   r  r7   r7   r8   r    s    r/   c             S   s   g | ]
}|j qS r7   )rG   )r   r  r7   r7   r8   r    s    )rG   ri   r   r   r
   
best_matchrR   r   ranger   r   )r=   r   operandsobj_typemethodZ	arg_typesresfunctionZfunction_alternativesZmethod_alternativesnrR   r7   r7   r8   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)r@   rA   rB   r7   r7   r7   r8   FakeOperand  s   r'  c                s   g | ]} |d qS ))rG   r7   )r   rG   )r'  rH   r7   r8   r    s    z3Scope.lookup_operator_for_types.<locals>.<listcomp>)ZNodesr&  r%  )r=   rH   r   typesr&  r  r7   )r'  rH   r8   lookup_operator_for_types  s    zScope.lookup_operator_for_typesc             C   s   |   | d S )N)r   use_utility_code)r=   new_coder7   r7   r8   r*    s    zScope.use_utility_codec             C   s   |   | d S )N)r   use_entry_utility_code)r=   r   r7   r7   r8   r,    s    zScope.use_entry_utility_codec             C   s    x|D ]}|| j krdS qW dS )Nr   r   )r   )r=   r   rF   r7   r7   r8   defines_any  s    

zScope.defines_anyc             C   s,   x&|D ]}|| j kr| j | jrdS qW dS )Nr   r   )r   r|   )r=   r   rF   r7   r7   r8   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/  r7   r7   r8   r1    s    zScope.infer_typesc             C   s   | j }|d krdS | S d S )NF)r   r   )r=   outerr7   r7   r8   r     s    zScope.is_cppc             C   s   | j ||| d S )N)r   add_include_file)r=   filenameverbatim_includelater7   r7   r8   r3    s    zScope.add_include_file)TN)N)N)r   r   r   )NrE   r   r   )NrE   r   r   r   r   )NrE   r   )NrE   r   F)Nr7   r   N)rE   r   r   )NrE   r   r   r   )r   N)Fr   )NrE   r   r   r   r7   NF)F)NF)Ar@   rA   rB   is_builtin_scopeis_py_class_scopeis_c_class_scopeis_closure_scopeis_genexpr_scopeis_passthroughr   is_property_scopeis_module_scopeZis_internalr   rx   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  r  r  r  r   r   r  r  r%  r)  r*  r,  r-  r.  r1  r   r3  r7   r7   r7   r8   r     s   #



:
 
 
  
! 
4
 

	
 
N
"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 )N)r   r>   r   
pre_import)r=   r7   r7   r8   r>     s    zPreImportScope.__init__c             C   s"   |  ||t|d}d|_d|_|S )NrE   T)r   r   r`   r]   )r=   rF   rH   r   r7   r7   r8   r     s    zPreImportScope.declare_builtinN)r@   rA   rB   r	   Zpreimport_cnamenamespace_cnamer>   r   r7   r7   r7   r8   rA    s   rA  c               @   s   e Zd ZdZdd Zd#ddZdd Zd$d	d
Zd%ddZdd Z	de
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gde
gd e
gd!e
gd"ZdS )&BuiltinScopeTc             C   sl   t jd krt| dd d  nt| dt d  i | _x2t| j D ] \}}|\}}| 	||d | qDW d S )N__builtin__)
r   rB  r   r>   rA  
type_namesr   builtin_entriesr   r   )r=   rF   Z
definitionr6   rG   r7   r7   r8   r>     s    
zBuiltinScope.__init__Nc             C   s,   |dkr |d kr|dk}|s d}t | |S )Nstr)Nr/   unicode)r   r   )r=   rF   language_level
str_is_strr7   r7   r8   r     s    zBuiltinScope.lookupc             C   sL   t t|sH| jd k	r"| j||S tjr8t|d|  nt|d| d d S )Nzundeclared name not builtin: %sr/   )hasattrbuiltinsr   r   r   error_on_unknown_namesr   r   )r=   rF   rH   r7   r7   r8   r     s    

zBuiltinScope.declare_builtinc             C   st   t |}| j||d |d|d}|rp|dkr0|}nt |}t||t}| ||_d|_d|_||_|j	|_	||_
|S )Nr   )rZ   r   *r   )r   r  rC   r   r   r   r`   r[   r   r   rw   )r=   rF   rG   r6   Zpython_equivr   r   r  r7   r7   r8   declare_builtin_cfunction  s    z&BuiltinScope.declare_builtin_cfunctionc       	      C   s   t |}t|||}t|d dd}i |_|dkr8d|_|| d| j|< | j||d dd}||_	t
|j| dj|j|jjd}| ||_d|_d|_d|_d|_||_	| |_tjrd|_||_|S )	Nr   )r   rZ   boolTr   )rZ   rG   )rF   rG   rH   r6   )r   r
   ZBuiltinObjectTypeCClassScope
directivesis_final_type	set_scoperF  r   r   rC   rF   r   rG   rH   typeptr_cnamer   r   r`   r\   rr   r[   r   r   cache_builtinsrj   rw   )	r=   rF   r6   r   objstruct_cnamerG   r   r   r  r7   r7   r8   declare_builtin_type  s2    


z!BuiltinScope.declare_builtin_typec             C   s   | S )Nr7   )r=   r7   r7   r8   r   3  s    zBuiltinScope.builtin_scopez((PyObject*)&PyType_Type)z((PyObject*)&PyBool_Type)z((PyObject*)&PyInt_Type)z((PyObject*)&PyLong_Type)z((PyObject*)&PyFloat_Type)z((PyObject*)&PyComplex_Type)z((PyObject*)&PyBytes_Type)z((PyObject*)&PyByteArray_Type)z((PyObject*)&PyString_Type)z((PyObject*)&PyUnicode_Type)z((PyObject*)&PyTuple_Type)z((PyObject*)&PyList_Type)z((PyObject*)&PyDict_Type)z((PyObject*)&PySet_Type)z((PyObject*)&PyFrozenSet_Type)z((PyObject*)&PySlice_Type)ZPy_NoneZPy_FalseZPy_True)rG   rQ  r#   r$   r    complexbytes	bytearrayrH  rI  tupler   dictr   	frozensetsliceNoneFalseTrue)NN)NN)NN)r@   rA   rB   r7  r>   r   r   rP  rY  r   r   rG  r7   r7   r7   r8   rD    s4   
	


rD  c               @   s  e Zd ZdZdZdZdZdd Zdd Zdd Z	d@d
dZ
dd Zdd ZdAddZdd Zdd ZdBddZdd Zdd Zdd Zd d! ZdCd#d$ZdDd&d'Zd(d) Zd*d+ Zd,d- ZdEd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d	S )FModuleScoper   r   c             C   s  ddl m} || _|j}t| ||| |dkr@|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 | _!xdD ]}| "t|t#d  qW | $t%j&d	dd
 d S )Nr   )Builtinr>   TFrD   r   )	__builtins__r@   __file__r   __path____spec__
__loader____package__
__cached__zPython.h)initial)'rD   re  parent_moduler   r   r>   module_name
is_packager   contextr	   Zmodule_cnameZmoddict_cnameZmodule_dict_cnameZmethtable_cnamemethod_table_cnamerv   Zmoddoc_cnamerl   utility_code_listmodule_entries
c_includesr^  rF  Zpxd_file_loadedcimported_modulesr   Ztypes_importedZincluded_filesZhas_extern_classcached_builtinsundeclared_cached_builtinsrC  _cached_tuple_typesr   r   process_includer   IncludeCode)r=   rF   rn  rq  re  r   var_namer7   r7   r8   r>   s  s@    
zModuleScope.__init__c             C   s   | j S )N)rn  )r=   r7   r7   r8   r     s    zModuleScope.qualifying_scopec             C   s   | S )Nr7   )r=   r7   r7   r8   r     s    zModuleScope.global_scopeNc             C   sn   |  |}|d k	r|S |d kr4| jd k	r0| jjnd}|d kr\|dkpZ| jd k	oZtj| jjk}| jj|||dS )N   r/   )rJ  rK  )r   rq  rJ  r   unicode_literalsZfuture_directivesr   r   )r=   rF   rJ  rK  r   r7   r7   r8   r     s    
zModuleScope.lookupc       
      C   s   t |}y| j| }W n( tk
r>   t| }| j|< Y nX |j}| |}|st|}x(t|D ]\}}|j	d| ||d qfW | j
|d d|d||d}	| j|	 |	|_| ||||}||_|S )Nzf%s)rF   rG   rH   _structr)   T)r   rH   r6   )r]  ry  r   r
   Zc_tuple_typer6   r   StructOrUnionScope	enumerater   r   r   removestruct_entryr   r   )
r=   rH   r   ttyper6   r   r   Zix	componentr  r7   r7   r8   r     s$    
zModuleScope.declare_tuple_typec             C   s4  t t|sx|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rx| jD ]}|j|kr|S qW |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 )Nzundeclared name not builtin: %sr/   rE   r   globalsZ__Pyx_Globals)rL  rM  r   Znon_portable_builtins_mapZuncachable_builtinshas_import_starr   r   r   rN  r   r   r   r[   rW  rw  rF   old_style_globalsr   r   rj   r	   Zbuiltin_prefixr6   r   rx  r   r   r   )r=   rF   rH   r   r7   r7   r8   r     s<    



zModuleScope.declare_builtinr   c             C   sl   d }d}|d k	r>|dkr>| }x2|dkr:|r:|j }|d8 }qW n|dkrP| j }d}|  }|jj||||dS )NFr   r   T)relative_torH   absolute_fallback)rn  r   rq  find_module)r=   ro  rH   Zrelative_levelr  r  Zmodule_scoper7   r7   r8   r    s    zModuleScope.find_modulec             C   sX   d|kr| dd\}}nd }| |}|sFt|| | jd}|| j|< |rT||}|S )Nr   r   )rn  rq  )splitlookup_submodulerd  rq  rt  find_submodule)r=   rF   	submoduler   r7   r7   r8   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  rt  r  r  )r=   rF   r  moduler7   r7   r8   r    s    
zModuleScope.lookup_submoduleFc             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.
        )r6  N)r   r{  rz  )r=   r4  r5  r6  incr7   r7   r8   r3    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_updateru  )r=   r  r   r7   r7   r8   rz    s
    zModuleScope.process_includec             C   sR   || j krNx|j D ]}| | qW | j | x|j D ]}| | q<W d S )N)rv  ru  valuesrz  r   add_imported_module)r=   r   r  mr7   r7   r8   r  >  s    
zModuleScope.add_imported_modulec             C   s6   |j rd|_|| jkr"|| j|< nt|d| d d S )NTz'%s' redeclared  r   )r]   r`   r   r   )r=   rF   r   rH   r7   r7   r8   add_imported_entryF  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   r]   ry   r   r   r`   r  )r=   rF   r   rH   r   r7   r7   r8   declare_moduleO  s    

zModuleScope.declare_modulerE   c	             C   sR  |dkrt |d|  |s:|tkr&t}|jr2|jr:td|sl| }	|dksX|dkr^|	r^|}n| tj|}| 	|}
|
r|
j
r|
j|s|dkr|
jdkrt|d| d ||
_|
jdkr| tj|}|
j|kr|}||
_|
jsd	|
_|
S tj| ||||||||d
	}
|r:d|
_|
jjr,|
jj|
_| j|
 nd|
_tjrNd|
_|
S )N)rE   r   r   z+Module-level variable cannot be declared %sz7Non-cdef global variable is not a generic Python objectr   r   z6Variable '%s' type does not match previous declarationr   rE   T)r6   rZ   r   r   r   )r   r   r   is_pyobjectis_extension_typer   r   r	   r   r   r}   rG   r  rZ   r   r6   r~   r   r   r\   declaration_valuerI   r   r   r]   r   Zcimport_from_pyxr{   )r=   rF   rG   rH   r6   rZ   r   r   r   r   r   mangled_cnamer7   r7   r8   r   h  sN    





zModuleScope.declare_varr7   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.rE   )r6   rZ   r   r   r   r  r   r	  )r   r   r	   r  Zoptional_arg_countr   r   r}   rZ   r   r6   rs   r   r  )r=   rF   rG   rH   r6   rZ   r   r   r   r  r   r	  r   r  r7   r7   r8   r    s,    




zModuleScope.declare_cfunctionc             C   s    |  |}|s| |t| d S )N)r   r   r   )r=   rF   rH   r   r7   r7   r8   declare_global  s    
zModuleScope.declare_globalc             C   s   |d k	r| j | d S )N)rs  r   )r=   r+  r7   r7   r8   r*    s    zModuleScope.use_utility_codec             C   s8   |d krd S |j r | j|j  |jr4| j|j d S )N)r   rs  r   r   )r=   r   r7   r7   r8   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|r2t|| |
d}| j |_|r|jr| |j |!| | j"| n>|r|jjrt	|d|  n|r2|jj#r2t	|d|  |r>d|_$|rJ||_|
dkrt|j%|
krtt	|d||j%f  |rd|_&|r|jr|j|krt	|d ||_|r|j'r|j'|krt	|d ||_'| j(drd	|j_)d	|_*|S )Nr   r   z6ctypedef only valid for 'extern' , 'public', and 'api'r/   r   z-Base type does not match previous declaration)
check_size)rZ   r   r   Tz5Object name required for 'public' or 'extern' C class)rF   r   rZ   zC class '%s' already definedz C class '%s' already implementedr   rE   z&Class '%s' previously declared as '%s'z4Object struct name differs from previous declarationz2Type object name differs from previous declarationfinal)+r   r   rG   rg   r  r   definedr   r   r   r
   ZPyExtensionTyperH   buffer_defaultsobjtypedef_cnamero  r   rV  r   r	   Ztypeptr_prefixr   rh   rX  rx   Zobjstruct_prefixattach_var_entry_to_c_classr   r   rR  rS  copydeclare_inherited_c_attributesrU  r   implementedr}   rZ   r   typeobj_cnamer  rT  r{   )r=   rF   rH   r   Zimplementingro  r   rX  r  rV  rZ   r   r   r  r  r   r  r   rG   r   r7   r7   r8   declare_c_class  s    









zModuleScope.declare_c_classc             C   s   |j }|jr*|jjr*dtj|jjf |_nZ|jr|jjrt|jj}|j}x0|rz|jrf|t|jjkrhP |jrrd S |j}qLW tj|_|jr| 	tj
|j|_| 	tj|j|_d S )Nz%s.%s)rG   r   vtabslot_cnamer	   obj_base_cnamer   r   r   is_builtin_typer   Zvtabstruct_prefixrF   Zvtabstruct_cnameZvtabptr_prefixZvtabptr_cname)r=   r   rG   Zentry_countr   r7   r7   r8   allocate_vtable_names>  s"    
z!ModuleScope.allocate_vtable_namesc             C   s.   x(| j D ]}|jjst|jd|j  qW d S )Nz(C class '%s' is declared but not defined)r   rG   r   r   rH   rF   )r=   r   r7   r7   r8   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r|x.|jj
D ]"}|jsV|jsVt|jd|j  qVW |jr| tj|j|_d S )Nz(C class '%s' is declared but not definedr   z)C method '%s' is declared but not defined)rG   rF   rZ   r   r   rH   r  r   r	   Ztypeobj_prefixr   rz   rs   r  Zvtable_prefixZvtable_cname)r=   r   rG   rF   rZ   Zmethod_entryr7   r7   r8   check_c_classk  s    zModuleScope.check_c_classc             C   sb   d}|rt d| j  xF| jD ]<}|rPt d|j|f  t d|j t d|j | | qW d S )Nr   z&Scope.check_c_classes: checking scope z...entry %s %sz......type = z......visibility = )printr   r   rF   rG   rZ   r  )r=   Zdebug_check_c_classesr   r7   r7   r8   check_c_classes  s    zModuleScope.check_c_classesc             C   sX   xR| j  D ]D\}}|jr|jr|j| kr|jdkr|js|jst|j	d|  qW d S )Nr   z3Non-extern C function '%s' declared but not defined)
r   r   ra   r}   r   rZ   rx   r~   r   rH   )r=   rF   r   r7   r7   r8   check_c_functions  s    

zModuleScope.check_c_functionsc             C   sR   ddl m} t|j|j|j|jjd}|j|_d|_	d|_
d|_|j|_||_d S )Nr   )re  )rF   rG   rH   r6   )rD   re  rC   rF   Z	type_typerH   rG   rV  r   r`   r\   rr   r   rw   )r=   r   re  r  r7   r7   r8   r    s    z'ModuleScope.attach_var_entry_to_c_classc             C   s   | j S )N)cpp)r=   r7   r7   r8   r     s    zModuleScope.is_cppc             C   s   ddl m} | |  d S )Nr   )PyObjectTypeInferer)r0  r  r1  )r=   r  r7   r7   r8   r1    s    zModuleScope.infer_types)NN)r   )NF)NrE   r   r   r   )NrE   r   r   r   r7   NF)r   r   NNNNNrE   r   r   NNr   )#r@   rA   rB   r>  r  Zis_cython_builtinr  r>   r   r   r   r   r   r  r  r  r3  rz  r  r  r  r   r  r  r*  r,  r  r  r  r  r  r  r  r   r1  r7   r7   r7   r8   rd  U  sL   &
%

		 
7 
    
lrd  c               @   sX   e 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S )r   FNc             C   s    |d kr|}t | ||| d S )N)r   r>   )r=   rF   r   r   r7   r7   r8   r>     s    zLocalScope.__init__c             C   s   || S )Nr7   )r=   r   rF   r7   r7   r8   r     s    zLocalScope.manglec             C   sH   |  tj|}| ||||d}d|_|jr2d|_d|_| j	| |S )NrE   r   0)
r   r	   r   r   r`   r  rI   rm   r   r   )r=   rF   rG   rH   r6   r   r7   r7   r8   declare_arg  s    zLocalScope.declare_argrE   r   c	       
      C   sb   |dkrt |d|  tj| ||||||||d	}	|	jjrD|	jj|	_d|	_| j|	_| j	
|	 |	S )N)r   readonlyz$Local variable cannot be declared %s)r6   rZ   r   r   r   r   )r   r   r   rG   r  rI   rn   _in_with_gil_blockr   r   r   )
r=   rF   rG   rH   r6   rZ   r   r   r   r   r7   r7   r8   r     s    
zLocalScope.declare_varc             C   s4   |  |rt|dd n|  |}|| j|< d S )Nz'%s' redeclared  r   )r   r   r   r  r   )r=   rF   rH   r   r7   r7   r8   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   r   rp   r   rP   r   )r=   rF   rH   
orig_entryr   r7   r7   r8   declare_nonlocal  s    


zLocalScope.declare_nonlocalc             C   sv   t | |}|d k	rr|j}x|jr*|j}qW || k	rr|jrrt|jdrNtdd|_t	|| }d|_
|| j|< |S |S )NZscope_classz#lookup() after scope class created.T)r   r   r   r;  r   r:  rL  r   ro   r   r`   r   )r=   rF   r   Zentry_scopeZinner_entryr7   r7   r8   r     s    


zLocalScope.lookupc             C   s   x|   D ]}x|j D ]r}|jrl|jj}| jr:||_q|tj	r\|t
tj	d d  }d||f |_q|jr|j|_dtj	|jf |_qW q
W d S )Nr/   z%s->%s)r   r   r  rp   r   r6   r<  r3   r	   Zcur_scope_cnamer   ro   Zoriginal_cname)r=   Zouter_scope_cnamer   r   r6   r7   r7   r8   mangle_closure_cnames  s    z LocalScope.mangle_closure_cnames)N)NrE   r   r   r   )r@   rA   rB   Zhas_with_gil_blockr  r>   r   r  r   r  r  r   r  r7   r7   r7   r8   r     s   
 
r   c               @   sH   e Zd ZdZdZdd Zdd Zdd
dZdddZdd Z	dd Z
dS )GeneratorExpressionScopezScope 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).
    Tc             C   s   |}x|j r|j}qW | tj}t| ||| |j| _dtj	t
||f | _x|j sh|jsh|jrp|j}qVW |j| _|j|  d S )Nz%s%d%s)r;  r   r   r   r	   Zgenexpr_id_refr   r>   rS  r4   r   genexp_prefixr9  r8  r   r   r   add)r=   r   r   rF   r7   r7   r8   r>   ,  s    

z!GeneratorExpressionScope.__init__c             C   s   d| j | j||f S )Nz%s%s)r  r   r   )r=   r   rF   r7   r7   r8   r   =  s    zGeneratorExpressionScope.mangleNrE   r   c	             C   s   |t kr$| j|}	|	r$|	jr$|	j}d| j| jtj	|p>| 
 f }| |||||}
d|
_| jjrnd|
_nd|
_d|
_| j|
 |
| j|< |
S )Nz%s%sT)r   r   r   r`   rG   r  r   r   r	   r   r   r   r>  r\   rn   rq   r   r   r   )r=   rF   rG   rH   r6   rZ   r   r   r   r   r   r7   r7   r8   r   @  s    
"
z$GeneratorExpressionScope.declare_varFc             C   s   | j |||S )N)r   r   )r=   rF   rH   r   r7   r7   r8   r   V  s    z+GeneratorExpressionScope.declare_pyfunctionc             C   s   | j ||S )N)r   r   )r=   rs   rH   r7   r7   r8   r   Z  s    z0GeneratorExpressionScope.declare_lambda_functionc             C   s   | j |S )N)r   r   )r=   r   r7   r7   r8   r   ]  s    z'GeneratorExpressionScope.add_lambda_def)NrE   r   r   T)F)r@   rA   rB   r   r;  r>   r   r   r   r   r   r7   r7   r7   r8   r  %  s    

r  c               @   s$   e Zd ZdZdddZd	ddZdS )
ClosureScopeTNc             C   s$   t | ||| dtj|f | _d S )Nz%s%s)r   r>   r	   Zclosure_scope_prefixZclosure_cname)r=   rF   Z
scope_namer   r   r7   r7   r8   r>   e  s    zClosureScope.__init__Fc             C   s   t j| |||ddS )NrE   )rZ   )r   r   )r=   rF   rH   r   r7   r7   r8   r   r  s    zClosureScope.declare_pyfunction)N)F)r@   rA   rB   r:  r>   r   r7   r7   r7   r8   r  a  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 | |d d  d S )N)r   r>   )r=   rF   r7   r7   r8   r>   y  s    zStructOrUnionScope.__init__NrE   r   Fc             C   s   |s|}|dkrt |}|jr(t|}| |||||}d|_| j| |jrb|	sbt	|d n|j
rv|
svt	|d |dkrt	|d|  |S )NrE   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 declared %s)r9   ra   r
   r   r   r`   r   r   r  r   r   )r=   rF   rG   rH   r6   rZ   r   r   r   Zallow_pyobjectZallow_memoryviewr   r7   r7   r8   r   |  s     



zStructOrUnionScope.declare_varr7   c             C   s"   |
rt |d | j|||||dS )Nz0C struct/union member cannot be declared 'cpdef')r6   rZ   )r   r   )r=   rF   rG   rH   r6   rZ   r   r   r   r  r	  r7   r7   r8   r    s    

z$StructOrUnionScope.declare_cfunction)r  )NrE   r   r   r   FF)NrE   r   r   r   r7   F)r@   rA   rB   r>   r   r  r7   r7   r7   r8   r  v  s   
  
 r  c               @   s   e Zd Zdd Zdd ZdS )
ClassScopec             C   s    t | ||| || _d | _d S )N)r   r>   
class_namerv   )r=   rF   r   r7   r7   r8   r>     s    zClassScope.__init__c             C   sd   t | |}|r|S |dkr`tddtttdtd gdd}tj	dd|_
| | d|_|S )NclassmethodZ__Pyx_Method_ClassMethodrD   r   ZClassMethodzCythonFunction.cr   )r   r   rC   r
   Z	CFuncTyper   CFuncTypeArgr   UtilityCodeZload_cachedr   r,  ra   )r=   rF   r   r7   r7   r8   r     s    
zClassScope.lookupN)r@   rA   rB   r>   r   r7   r7   r7   r8   r    s   	r  c               @   sJ   e Zd ZdZdd Zdd Zdd ZdddZdd Zdd Z	dd Z
dS )PyClassScoper   c             C   s
   |  |S )N)mangle_special_name)r=   rF   r7   r7   r8   r     s    z&PyClassScope.mangle_class_private_namec             C   s4   |r0| dr0|ds0td| jd|f }|S )Nr0   z_%s%s_)r3   endswithr   r  lstrip)r=   rF   r7   r7   r8   r    s    z PyClassScope.mangle_special_namec             C   s   |  |}t| |S )N)r  r  r   )r=   rF   r7   r7   r8   r     s    
zPyClassScope.lookup_hereNrE   r   c	       
      C   sB   |  |}|tkrt}tj| ||||||||d	}	d|	_d|	_|	S )N)r6   rZ   r   r   r   r   )r  r   r   r   r   r]   r_   )
r=   rF   rG   rH   r6   rZ   r   r   r   r   r7   r7   r8   r     s    
zPyClassScope.declare_varc             C   sf   |  |}|r6|j| kr6|js6t|d|  |  n,| |}|d krXt|d|  n
|| j|< d S )Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r   r   rp   r   rP   r   r   )r=   rF   rH   r  r   r7   r7   r8   r    s    


zPyClassScope.declare_nonlocalc             C   s4   |  |rt|dd n|  |}|| j|< d S )Nz'%s' redeclared  r   )r   r   r   r  r   )r=   rF   rH   r   r7   r7   r8   r    s    
zPyClassScope.declare_globalc             C   s   | j |S )N)r   add_default_value)r=   rG   r7   r7   r8   r    s    zPyClassScope.add_default_value)NrE   r   r   r   )r@   rA   rB   r8  r   r  r   r   r  r  r  r7   r7   r7   r8   r    s    
r  c               @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dd Zdd Zdd Zd d
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 Zdd ZdS )&rR  r   Fc             C   sF   t | || |dkr6|tj|| _|tj|| _g | _g | _	d S )Nr   )
r  r>   r   r	   Zmethtab_prefixrr  Zgstab_prefixZgetset_table_cnameproperty_entriesinherited_var_entries)r=   rF   r   rZ   r7   r7   r8   r>     s    zCClassScope.__init__c             C   sN   | j r| jddsdS | jj}|r8|jd k	r8|j S | jjrJ| jj S dS )NZno_gcFT)	has_cyclic_pyobject_attrsrS  r  parent_typer   r   needs_gcr  is_gc_simple)r=   r   r7   r7   r8   r    s    

zCClassScope.needs_gcc             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)r  rS  r  )r=   r7   r7   r8   needs_tp_clear*  s    zCClassScope.needs_tp_clearTc             C   s   g }g }g }xl| j D ]b}|jjrL|s4| js4|jdkrv|s@|jjsv|| q|jtjkrd|| q|jj	r|| qW |p|p|}||||ffS )Nr1   )
r   rG   r  is_closure_class_scoperF   r  r   r
   Zc_py_buffer_typer   )r=   Zinclude_weakrefZinclude_gc_simpleZpy_attrsZ
py_buffersZmemoryview_slicesr   Zhave_entriesr7   r7   r8   get_refcounted_entries1  s    z"CClassScope.get_refcounted_entriesNrE   r   c	       
      C   s  |rX| j rt|d | js2t|r2t|d|  |sJ|}|dkrJt|}|jrr|dkrr|| | t	d | 
|||||}	d|	_| j|	 |jrd| _nD|jrd| _n6|jr| js|dkrd| _|jr|jr|j rd| _|d	krt|d
|  |dkrNd|	_| js*|dkr*t|d |jsT|| sTt|d|  nd|	_|	S |tkrft}tj| ||||||||d	}	d|	_d|	_d| jj  | _!|	S d S )NzVC attributes cannot be added in implementation part of extension type defined in a pxdz/The name '%s' is reserved for a special method.rE   r   z#include <new>r   Tr1   )rE   r   r  z1Attribute of extension type cannot be declared %s)r   r  z9Special attribute __weakref__ cannot be exposed to Pythonz7C attribute of type '%s' cannot be accessed from PythonF)r6   rZ   r   r   r   z(PyObject *)%s)"r  r   r  r   r9   ri   r   r*  r   r  r   r`   r   r   r   has_memoryview_attrshas_cpp_class_attrsr  has_pyobject_attrsr  r   r  r  r   Zcan_coerce_to_pyobjectr   r   r   r   r^   r]   r  rV  rC  )
r=   rF   rG   rH   r6   rZ   r   r   r   r   r7   r7   r8   r   D  s^    




zCClassScope.declare_varc             C   s   |t kr"| drPt|d|  n.|dkrPx$t D ]}| |r0t|d|  q0W |dkrbt|d | j|t|dd}t|}|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   )rZ   r   r   )r   r   r   r   r   r   r   r|   r   r   r   )r=   rF   rH   r   r$  r   Zspecial_sigr7   r7   r8   r     s&    




zCClassScope.declare_pyfunctionc             C   sD   | j s|dkrtd}t| |}|r@|jr@| jjs@| jjs@d S |S )Nr  Z	__cinit__)r  r   r  r   rc   r  r  rT  )r=   rF   r   r7   r7   r8   r     s    
zCClassScope.lookup_herer7   c             C   s(  t |r| jjst|d |j}|jsd|s6t|d n.| j|d jsdt|d|d j|| jf  | |}|d kr~t	|}|r|j
st|d| 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rd|sd|j|jddd
sdt|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rd|_| jjs|js| j !dr$d|_|j|_"|S )Nz7Special methods must be declared with 'def', not 'cdef'zC method has no self argumentr   zCSelf argument (%s) of C method '%s' does not match parent type (%s)z'%s' redeclared  z'%s' already definedz'Overriding final methods is not allowedr   )
as_cmethod)r  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/   zPrevious declaration is herer   )rZ   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   r   Zis_static_methodZassignable_fromrG   r   r9   ra   r   rs   rd   rz   Zsame_c_signature_asr?  r  r  r  r  Z!same_c_signature_as_resolved_typer  rH   r  r   r	   r  r   r   re   rT  rS  r  ru   )r=   rF   rG   rH   r6   rZ   r   r   r   r  r   r	  r   r   r7   r7   r8   r    s^    


"

zCClassScope.declare_cfunctionc       
   
   C   s4   |  |}tj| |||||||d}	d|	_||	_|	S )N)r  r   )r   r  r  rb   r   )
r=   rF   rG   rH   r6   rZ   r  r  r   r   r7   r7   r8   r    s    
zCClassScope.add_cfunctionc             C   sT   t |}| j||d |d|d}t||t}||_d|_d|_||_|j|_||_	|S )Nr   )rZ   r   r   )
r   r  rC   r   r   r`   r[   r   r   rw   )r=   rF   rG   r6   r   r   r  r7   r7   r8   rP    s    z%CClassScope.declare_builtin_cfunctionc             C   s^   |  |}|d kr$| ||t|d}d|_||_t||  | d|_| j|j_| j	
| |S )NrE   r   )r   r   )r   r   r   rk   rv   PropertyScoper   r   r  r  r   )r=   rF   rv   rH   r   r7   r7   r8   declare_property	  s    

zCClassScope.declare_propertyc          
      s.   fdd}|j |j }x:|D ]2 |  j| j jd d}d|_| j | qW x(|jd d  D ]  jj	rd j
  qdW x|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|_qW d S )Nc                s   dt j jf S )Nz%s.%s)r	   r  r6   )r6   )
base_entryr7   r8   adapt	  s    z9CClassScope.declare_inherited_c_attributes.<locals>.adaptrE   r   T)r  )r  r   r   rF   r6   rG   r`   r   r   r  Z"get_all_specialized_function_typesrw   r[   r  rH   rZ   rt   rz   rd   re   r   ru   rc   r   )r=   
base_scoper  r   r   r6   r  r[   r7   )r  r8   r  	  s@    

z*CClassScope.declare_inherited_c_attributes)FT)NrE   r   r   r   )F)NrE   r   r   r   r7   NF)F)N)r@   rA   rB   r9  r  r  r  r  r  r  r  r>   r  r  r  r   r   r   r  r  rP  r  r  r7   r7   r7   r8   rR    s.    
 
<
 
<
	
rR  c               @   sF   e Zd ZdZdZdZdddZdddZdddZdd Z	dd Z
dS )CppClassScoper   Nc             C   sV   t | ||d  |j| _g | _|d k	rRx*|D ]"}| ||t|d d}d|_q,W d S )Nr   r   )r   r>   rS  r  r   r
   ZTemplatePlaceholderTyperg   )r=   rF   r   r   TZtemplate_entryr7   r7   r8   r>   C	  s    
zCppClassScope.__init__r   r   c
             C   s   |s|}|  |}
|	rb|
d k	rb|
j|r<|
j|j|
_qt|jrV||
jrV||
_qtt|d n| |||||}
d|
_	|jr| jr| j
 sd| j |f |
_|dkr|	s|dkr| j|
 |
S )Nz6Function signature does not match previous declarationr   z%s::%sr   z<init>)r   rG   r  r  r  ra   r  r   r   r`   Zget_fused_typesZempty_declaration_coders   r   r   )r=   rF   rG   rH   r6   rZ   r   r   r   r   r   r7   r7   r8   r   M	  s"    

zCppClassScope.declare_varr7   Fc                s(  | j dd }||dfkrh|d krhdtj|f }d}t |_|j|_dd   fdd	|jD |_n,|d
kr|d krdtj|f }d}t |_|dkr|j	rx>| j
jD ]2}|j|}|r|j
j	st|d t|jd qW | |}| j||||||d}|r|s| |_|
|_||_|S )Nz::r   r>   z%s__init__%sz<init>c             S   s2   | j jr*| j js*t| jt| j | jS | S d S )N)rG   ri   Zis_referencer
   r  rF   Z
c_ref_typerH   )r  r7   r7   r8   	maybe_refq	  s    z2CppClassScope.declare_cfunction.<locals>.maybe_refc                s   g | ]} |qS r7   r7   )r   r  )r  r7   r8   r  w	  s    z3CppClassScope.declare_cfunction.<locals>.<listcomp>Z__dealloc__z%s__dealloc__%sz<del>)z<init>z<del>zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.)r   r6   rZ   )rF   r  r	   r  r
   Z	CVoidTyper@  r   Zoriginal_argsr?  rG   r   r   r   r   rH   r   r   rR   rJ   r   r   )r=   rF   rG   rH   r6   rZ   r   r   r   r  r   r	  r  baser  r   r   r7   )r  r8   r  f	  s6    






zCppClassScope.declare_cfunctionc             C   s&  |j }|}xt|dd r |j}qW t|dd r@dd |jD }nd}xb|j|j D ]R}|jdkrbqR|j| jkrt|j | |j|j	|j
d d}d|_d|_| j| qRW x<|jD ]2}| j|j|j
|j|j	|jd	|j|jd
}d|_qW x:|jD ]0}|j|kr| |j|j
|j|j	|j}d|_qW d S )Ntemplate_typer   c             S   s   g | ]
}|j qS r7   )rF   )r   r  r7   r7   r8   r  	  s    zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp>r7   )z<init>z<del>r   r   r   )r   r  r   )r   r   r  r   r  r   rF   r   r   r6   rG   r`   rz   r   r   r  rH   rZ   rt   r   r   r   )r=   r   r  r  Zbase_templatesr  r   r7   r7   r8   r   	  s>    




z.CppClassScope.declare_inherited_cpp_attributesc          	   C   s   t | j| j}||_x| j D ]}|jrN|j|j|j||j	|j
dd q |jjrxX| D ](}|j|j|j||j	|j
|jd q`W q ||j|j||j	|j
|j q W |S )Nr   )r   )r   )r  rF   r   rG   r   r  rg   r   r  rH   r6   ra   rR   r  r   r   rZ   )r=   r  Z
type_entryr   r   r   r7   r7   r8   r  	  s,    



zCppClassScope.specialize)N)Nr   r   r   r   r   )Nr   r   r   r   r7   NF)r@   rA   rB   r   Zdefault_constructorrG   r>   r   r  r   r  r7   r7   r7   r8   r  ;	  s   
 
 
$'r  c               @   s   e Zd ZdZdddZdS )r  r   Fc             C   s@   t |}|r.| ||t|d}d|_||_|S t|d d S d S )NrE   r   zKOnly __get__, __set__ and __del__ methods allowed in a property declaration)r   r   r   r|   r   r   )r=   rF   rH   r   r   r   r7   r7   r8   r   	  s    
z PropertyScope.declare_pyfunctionN)F)r@   rA   rB   r=  r   r7   r7   r7   r8   r  	  s   r  c               @   s   e Zd Zdd Zdd ZdS )CConstScopec             C   s$   t | d|j |j|j || _d S )NZconst_)r   r>   rF   r   r   const_base_type_scope)r=   r  r7   r7   r8   r>   	  s    zCConstScope.__init__c             C   s4   | j |}|d k	r0t|}t|j|_|S d S )N)r  r   r  r
   Zc_const_typerG   )r=   rF   r   r7   r7   r8   r   	  s
    
zCConstScope.lookup_hereN)r@   rA   rB   r>   r   r7   r7   r7   r8   r  	  s   r  c               @   s   e Zd Zdd ZdS )TemplateScopec             C   s   t | ||d  |j| _d S )N)r   r>   rS  )r=   rF   r   r7   r7   r8   r>   	  s    zTemplateScope.__init__N)r@   rA   rB   r>   r7   r7   r7   r8   r  	  s   r  )3
__future__r   r   r  r   rE  rM  ImportErrorZErrorsr   r   r   ZStringEncodingr   rD   r   r	   r
   r   r   Z	TypeSlotsr   r   r   r   r   r   r   r   r5   r9   objectr:   rC   r   r   rA  rD  Zconst_counterrd  r   r  r  r  r  r  rR  r  r  r  r  r7   r7   r7   r8   <module>   sn   	 :#     At    pd<&#<  B 