3
\             -   @   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forgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile_Boolz_Complex, _Imaginaryinlinerestrictc             C   s<   | d d dkr&| j tjp"| dk s.| tkr8tj|  } | S )N   ____weakref____dict__)r9   r:   )
startswithr	   pyrex_prefixiso_c99_keywords)cname r?   f/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Compiler/Symtab.pyc_safe_identifier%   s
    

rA   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)selfrC   rD   r?   r?   r@   __init__1   s    zBufferAux.__init__c             C   s
   d| j  S )Nz<BufferAux %r>)r:   )rE   r?   r?   r@   __repr__5   s    zBufferAux.__repr__N)__name__
__module____qualname__writable_neededrF   rG   r?   r?   r?   r@   rB   .   s   rB   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)
namer>   typeposinitoverloaded_alternativescf_assignmentscf_referencesinner_entriesdefining_entry)rE   rO   r>   rP   rQ   rR   r?   r?   r@   rF      s    zEntry.__init__c             C   s   dt | jt| | j| j f S )Nz%s(<%x>, name=%s, type=%s))rP   rH   idrO   )rE   r?   r?   r@   rG      s    zEntry.__repr__c             C   s   t | jd d S )NzPrevious declaration is here)r   rQ   )rE   r?   r?   r@   already_declared_here   s    zEntry.already_declared_herec             C   s   t |d| j  | j  d S )Nz('%s' does not match previous declaration)r   rO   rY   )rE   rQ   r?   r?   r@   
redeclared   s    zEntry.redeclaredc             C   s   | g| j  S )N)rS   )rE   r?   r?   r@   all_alternatives   s    zEntry.all_alternativesc             C   s   | g| j  S )N)rV   )rE   r?   r?   r@   all_entries   s    zEntry.all_entriesc             C   s4   t | tr,t |tr,| j| jf|j|jfk S tS d S )N)
isinstancerL   rO   r>   NotImplemented)leftrightr?   r?   r@   __lt__   s    zEntry.__lt__)NN)LrH   rI   rJ   inline_func_in_pxdborrowedrR   
annotation
visibility
is_builtin
is_cglobalis_pyglobal	is_memberis_pyclass_attris_variableis_cfunction
is_cmethodis_builtin_cmethodis_unbound_cmethodis_final_cmethodis_inline_cmethodis_anonymousis_type	is_cclassis_cpp_classis_constis_property	doc_cnamegetter_cnamesetter_cnameis_self_argis_argis_local
in_closurefrom_closurein_subscopeis_declared_genericis_readonlypyfunc_cname
func_cnamefunc_modifiersfinal_func_cnamedocas_variablexdecref_cleanupin_cinclude	as_moduleis_inheritedpystring_cnameis_identifieris_internedused
is_specialdefined_in_pxdis_implementedapiutility_codeis_overridable
buffer_aux
prev_entrymight_overflowfused_cfunctionis_fused_specializedutility_code_definitionneeds_propertyin_with_gil_blockfrom_cython_utility_codeerror_on_uninitializedcf_usedouter_entryrF   rG   rY   rZ   r[   r\   ra   r?   r?   r?   r@   rL   9   s   S
rL   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|j || _|| _|}x|jr:|j}q,W || _|j	| _	|j
| _
|j| _|j| _| j	j|  d S )N)rL   rF   rO   r>   rP   rQ   r   scoperW   rV   rT   rU   rS   append)rE   r   r   outermost_entryr?   r?   r@   rF      s    

zInnerEntry.__init__c             C   s   |j drt|t| j|S )Nr8   )r;   AttributeErrorgetattrrW   )rE   rO   r?   r?   r@   __getattr__  s    
zInnerEntry.__getattr__c             C   s
   | j j S )N)rW   r\   )rE   r?   r?   r@   r\     s    zInnerEntry.all_entriesN)rH   rI   rJ   __doc__r   rF   r   r\   r?   r?   r?   r@   r      s
   r   c               @   s  e Zd ZdZdZdZdZdZd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dgd	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dd ZdjddZdd  Zdkd"d#Z dld%d&Z!dmd'd(Z"dnd*d+Z#df d,dfd-d.Z$d/d0 Z%d1d2 Z&dod3d4Z'd5d6 Z(dpd7d8Z)d9d: Z*dqd;d<Z+drd=d>Z,d?d@ Z-dAdB Z.dCdD Z/dd!dddf dd)fdEdFZ0dsdGdHZ1dIdJ Z2dKdL Z3dMdN Z4dOdP Z5dQdR Z6dSdT Z7dUdV Z8dWdX Z9dYdZ Z:d[d\ Z;d]d^ Z<d_d` Z=dadb Z>dcdd Z?dtdedfZ@dS )uScoper   rM   Nc             C   s   || _ || _|| _dt||jddf }| j }|rP|j|| _|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_._dot_)rO   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_entriesdefined_c_classesimported_c_classescname_to_entrystring_to_entryidentifier_to_entrynum_to_entryobj_to_entrybuffer_entrieslambda_defsid_counters)rE   rO   r   r   mangled_name
qual_scoper?   r?   r@   rF   C  s<    
zScope.__init__c             C   s   | S )Nr?   )rE   memor?   r?   r@   __deepcopy__f  s    zScope.__deepcopy__Tc       
      C   s   g }x<|j j D ].\}}| s&||kr|js0|r|j||f qW | j j| xZdD ]R}t| |}td	d
 |D }	x0t||D ]"}|js|r|j|	kr|j| qW qTW d S )Nr   r   r   r   r   r   r   r   c             s   s   | ]}|j V  qd S )N)rO   ).0er?   r?   r@   	<genexpr>|  s    z!Scope.merge_in.<locals>.<genexpr>)r   r   r   r   r   r   r   r   )r   itemsr   r   updater   r   rO   )
rE   othermerge_unused	whitelistr   rO   entryattrself_entriesnamesr?   r?   r@   merge_ini  s&    
      
zScope.merge_inc             C   s   d| j j| jf S )Nz<%s %s>)	__class__rH   r   )rE   r?   r?   r@   __str__  s    zScope.__str__c             C   s   | j S )N)r   )rE   r?   r?   r@   r     s    zScope.qualifying_scopec             C   s(   |rd|| j |f S | jj|| jS d S )Nz%s%s%s)r   r   manglerO   )rE   prefixrO   r?   r?   r@   r     s    zScope.manglec             C   s   dt j|f }| j|S )Nz%s%s_)r	   r<   r   )rE   rO   r   r?   r?   r@   mangle_internal  s    zScope.mangle_internalc             C   s   | j r| j j|S |S )N)r   mangle_class_private_name)rE   rO   r?   r?   r@   r     s    zScope.mangle_class_private_namec             C   s`   | j  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)rE   rO   counterscountr?   r?   r@   next_id  s    

zScope.next_idc             C   s
   | j j S )z6 Return the module-level scope containing this scope. )r   r   )rE   r?   r?   r@   r     s    zScope.global_scopec             C   s
   | j j S )z6 Return the module-level scope containing this scope. )r   builtin_scope)rE   r?   r?   r@   r     s    zScope.builtin_scopec             c   s4   | V  | j r0x"t| j tjddD ]
}|V  q"W d S )Nr   )key)r   sortedoperator
attrgetter)rE   r   r?   r?   r@   iter_local_scopes  s    zScope.iter_local_scopesc	             C   s  |j rt| t rt|d | j rD|rDtjd|rDt|d| d | j}	|oZ||	koZ| r|	| }
d}|j	r|
j
j	r| j rx4|
j D ]$}||j
kr|dkr|j rd}P qW d}|rnZ| jr|	| jrnH|dkrt|d	| | jrdnd
 n$|dkrt|d	|  |	| j  t||||d}| j|_||_|rT| j||_|sT||	|< |jrpddlm} |j|_| |_||_|S )Nz5Buffer types only allowed as function local variablesz
^_[_A-Z]+$z'%s' is a reserved name in C.r   Fz<init>Tr   z'%s' redeclared r   ignore)rQ   )
MemoryView)	is_bufferr]   
LocalScoper   r   rematchr   r   rl   rP   is_cppr[   argsis_cpp_class_scoper   rY   rL   create_wrapperr   r   is_memoryviewslicerM   r   memslice_entry_initrR   r   re   )rE   rO   r>   rP   rQ   re   shadowrs   r   r   	old_entrycpp_override_allowed	alt_entryr   r   r?   r?   r@   declare  sJ    


zScope.declarec             C   s   t d| j|f S )Nz%s.%s)r   r   )rE   rO   r?   r?   r@   r     s    zScope.qualify_namerN   c	       
      C   sP   |s*| j s|dks|r|}n| jtj|}| j||||||d}	d|	_||	_|	S )Npublic)r   r   )r   r   r	   enum_prefixr   rv   
value_node)
rE   rO   rP   valuerQ   r>   re   r   r   r   r?   r?   r@   declare_const  s    zScope.declare_constr   c
          	   C   sJ   |s|}| j ||||||dd}
d|
_||
_|r<| jj|
 |	sF|
|_|
S )NT)rs   r   )r   rs   r   r   r   r   )rE   rO   rP   rQ   r>   re   r   definingr   templater   r?   r?   r@   declare_type   s    zScope.declare_typec             C   s   |s*| j s|dks|r|}n| jtj|}y6| jrD| jj| jj}nd }t	j
||||dk|}W n8 tk
r }	 zt||	jd  t	j}W Y d d }	~	X nX | j||||||d}
|
j|_|
S )NrN   r   r   )re   r   )r   r   r	   type_prefixr   r   lookuprO   rP   r
   create_typedef_type
ValueErrorr   r   
error_typer  r   )rE   rO   	base_typerQ   r>   re   r   	namespacerP   r   r   r?   r?   r@   declare_typedef  s$    


zScope.declare_typedefFc
          	   C   s  |s*| j s|dks|r|}n| jtj|}| j|}
|
s|tj||||||	}| j|||||||d k	d}
| jj	|
 |
|_
n|
jo|
jjo|
jj|kst|d| d nT|r|
jjrt|d| d n6| j|
|| | j|
|| | r||
j_| jj	|
 | jr| jj| jj|
j_|
S )Nr   )re   r   r  z'%s' redeclared  r   z2'%s' already defined  (ignoring second definition))r   r   r	   r  lookup_herer
   CStructOrUnionTyper  r   r   r   rs   rP   is_struct_or_unionkindr   r   check_previous_typedef_flagcheck_previous_visibilityr   r   r   r  rO   r  )rE   rO   r  r   typedef_flagrQ   r>   re   r   packedr   rP   r?   r?   r@   declare_struct_or_union*  s4    
zScope.declare_struct_or_unionr   c       
         s  |d kr*| j s|dkr|}n| jtj|}t|}| j|}|s|tj|||||d}	| j||	|||d k	d}| j	j
| n|jo|jjstd|  |j  d S |r|jjrtd| d n|r||j_| jj
| |r|jjo|jj|kr
td |j  n||j_|s"|jjrB||jjkrBtd |j   fd	d
 |r| || |jddtj|j|jd | jr| jj| jj|j_|S )NrN   )	templates)re   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j| qW d S )Nz#Cannot inherit from incomplete type)r
   r  r   r   base_classesrP    declare_inherited_cpp_attributes)r   r  
base_class)declare_inherited_attributesrQ   r?   r@   r  s  s    


z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesthis)rO   r>   rP   rQ   )r   r   r	   r  listr  r
   CppClassTyper  r   r   rs   rP   ru   r   rY   r   r   r   r  r  declare_varCPtrTyperQ   r   r   r  rO   r  )
rE   rO   r   rQ   r>   r  re   r  r   rP   r?   )r  rQ   r@   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'cdefctypedef)r#  r$  )rP   r  r   rO   )rE   r   r  rQ   r?   r?   r@   r    s    z!Scope.check_previous_typedef_flagc             C   s$   |j |kr t|d|j|j f  d S )Nz '%s' previously declared as '%s')re   r   rO   )rE   r   re   rQ   r?   r?   r@   r    s    
zScope.check_previous_visibilityc             C   s   |rd|s6| j s"|dks"|dks"|r(|}n| jtj|}| jrN| jj| jj}nd }t	j
||||}	nt	j}	| j||	||||d}
||
_g |
_| jj|
 |
S )Nr   r   )r>   re   r   )r   r   r	   r  r   r   r  rO   rP   r
   	CEnumTypec_anon_enum_typer  r   enum_valuesr   r   )rE   rO   rQ   r>   r  re   r   r   r  rP   r   r?   r?   r@   declare_enum  s"    
zScope.declare_enumc             C   s   | j j||S )N)r   declare_tuple_type)rE   rQ   
componentsr?   r?   r@   r)    s    zScope.declare_tuple_typec	       
      C   s   |s$|dks|r|}n| j tj|}|jr<|dkr<|j| | j|||||}	d|	_|rl|dkrld|	_d|	_|r|d|	_	d|	_|	S )NrN   r   r   )
r   r	   
var_prefixru   check_nullary_constructorr   rk   r   r   r   )
rE   rO   rP   rQ   r>   re   r   in_pxdis_cdefr   r?   r?   r@   r     s    
zScope.declare_varc             C   s   | j j||S )N)r   declare_builtin)rE   rO   rQ   r?   r?   r@   r/    s    zScope.declare_builtinc             C   sP   |r(|j j r(t|d|  t|jd | j|t||d}t|_| jj	| |S )Nz'%s' already declaredzPrevious declaration is here)re   )
rP   rl   r   rQ   r   r   r   	signaturer   r   )rE   rO   rQ   re   r   r?   r?   r@   _declare_pyfunction  s    zScope._declare_pyfunctionc             C   s   | j |}|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||_| j||_	t
|_d|_|S )N)re   r   )re   rN   )r>   re   T)r  r1  rP   is_unspecifiedr   r   r   rO   r   r   r   r0  rr   )rE   rO   rQ   allow_redefinere   r   r?   r?   r@   declare_pyfunction  s     




zScope.declare_pyfunctionc             C   sh   | j tjd |}| j tjd |}| j|}| jd |t|d}||_||_||_||_	t
|_d|_|S )Nfuncdef_methdef_rN   T)r   r	   lambda_func_prefixr   r   r   rO   r   pymethdef_cnamer   r   r0  rr   )rE   lambda_namerQ   r   r8  r   r   r?   r?   r@   declare_lambda_function  s    
zScope.declare_lambda_functionc             C   s   | j j| d S )N)r   r   )rE   def_noder?   r?   r@   add_lambda_def  s    zScope.add_lambda_defc             C   s   | j j| d S )N)r   r   )rE   r   r?   r?   r@   register_pyfunction  s    zScope.register_pyfunctionc             C   sz  |s$|dks|r|}n| j tj|}| j|}|r| rb||jkrb|dkrbd}|j}||_||_|dkr||jkrt|d||j|f d ||jkrt|d||rdndf d |j	j
|r|j	j|j|_	n|dko|jdkrjd	}| j rd}n6|r,x.|j D ]}|j s ||jkrP qW d}|rV| j||||||	}|j |_|}nt|d
d ||_	n0| r|jr|j|j	r||_	n
t|d
 n | j||||||	}||_||_|r|dkrd|_|rd|_| r| r|dkrt|d|  |rd|_|	r|	|_|
rD|j s>td||f |
|_|rpt||t}d|_d|_|j|_||_||_|S )NrN   r   Tz6Function '%s' previously declared as '%s', now as '%s'r   z)Function '%s' previously declared as '%s'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  re   r>   r   r   r   rP   same_aswith_with_gilwith_gilr   r[   add_cfunctionrS   r   compatible_signature_withr   r   r   r   r   AssertionErrorrL   r   rk   rh   r   r   r   )rE   rO   rP   rQ   r>   re   r   r-  r  	modifiersr   overridabler   can_overrider   temp	var_entryr?   r?   r@   declare_cfunction  sx    


zScope.declare_cfunctionc             C   s   | j |||||}d|_|r"||_|s,|jr:| jj| nFt| j}	x,t| jD ]}
|
jsd|
j	j rfP |	d8 }	qPW | jj
|	| |S )Nr   )r   rl   r   is_fusedr   r   r   reversedr   rP   insert)rE   rO   rP   rQ   r>   re   rF  	inheritedr   icfunc_entryr?   r?   r@   rC  @  s    

zScope.add_cfunctionc             C   s$   | j |}|r|S t|d|  d S )Nz'%s' is not declared)r  r   )rE   rO   rQ   r   r?   r?   r@   findS  s    
z
Scope.findc             C   sP   | }xF|D ]>}|j ||}|s"d S |jr0|j}q
t|ddj|  d S q
W |S )Nz'%s' is not a cimported moduler   )rR  r   r   join)rE   pathrQ   r   rO   r   r?   r?   r@   find_imported_module[  s    
zScope.find_imported_modulec             C   s    | j |p| jr| jj|pd S )N)r  r   r  )rE   rO   r?   r?   r@   r  j  s    
zScope.lookupc             C   s   | j j|d S )N)r   get)rE   rO   r?   r?   r@   r  q  s    zScope.lookup_herec             C   s    | j |}|s| j|td }|S )N)r  r   r   )rE   rO   r   r?   r?   r@   lookup_targetu  s    
zScope.lookup_targetc             C   s:   | j |}|r6|jr6|jjr0| jr0|jj| jS |jS d S )N)r  rs   rP   rL  fused_to_specific
specialize)rE   rO   r   r?   r?   r@   lookup_type}  s
    

zScope.lookup_typec             C   s(  |d j jrr|d j }|jjd| }|d k	rrdd |dd  D }tjdd |dd  D |j }|d k	rr|S | jd| }g }|d k	r|j }g }	t|dkrxJtdD ]>}
||
 j jr||
 j }|jjd| }|d k	r|	|j 7 }	qW |	 o| rd S t	t
|	| }tjdd |D |S )	Nr   z
operator%sc             S   s   g | ]
}|j qS r?   )rP   )r   argr?   r?   r@   
<listcomp>  s    z)Scope.lookup_operator.<locals>.<listcomp>r   c             S   s   g | ]
}|j qS r?   )rP   )r   r[  r?   r?   r@   r\    s    r7   c             S   s   g | ]
}|j qS r?   )rP   )r   r[  r?   r?   r@   r\    s    )rP   ru   r   r  r
   
best_matchr[   r   ranger  r   )rE   r   operandsobj_typemethod	arg_typesresfunctionfunction_alternativesmethod_alternativesnr[   r?   r?   r@   lookup_operator  s4    


zScope.lookup_operatorc                s<   ddl m} G dd d|  fdd|D }| j||S )Nr   )Nodec               @   s   e Zd ZdS )z4Scope.lookup_operator_for_types.<locals>.FakeOperandN)rH   rI   rJ   r?   r?   r?   r@   FakeOperand  s   rj  c                s   g | ]} |d qS ))rP   r?   )r   rP   )rj  rQ   r?   r@   r\    s    z3Scope.lookup_operator_for_types.<locals>.<listcomp>)Nodesri  rh  )rE   rQ   r   typesri  r_  r?   )rj  rQ   r@   lookup_operator_for_types  s    zScope.lookup_operator_for_typesc             C   s   | j  j| d S )N)r   use_utility_code)rE   new_coder?   r?   r@   rn    s    zScope.use_utility_codec             C   s   | j  j| d S )N)r   use_entry_utility_code)rE   r   r?   r?   r@   rp    s    zScope.use_entry_utility_codec             C   s    x|D ]}|| j krdS qW dS )Nr   r   )r   )rE   r   rO   r?   r?   r@   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   )rE   r   rO   r?   r?   r@   defines_any_special  s    
zScope.defines_any_specialc             C   s   ddl m} | j|  d S )Nr   )get_type_inferer)TypeInferencers  infer_types)rE   rs  r?   r?   r@   ru    s    zScope.infer_typesc             C   s   | j }|d krdS |j S d S )NF)r   r   )rE   outerr?   r?   r@   r     s    zScope.is_cppc             C   s   | j j||| d S )N)r   add_include_file)rE   filenameverbatim_includelater?   r?   r@   rw    s    zScope.add_include_file)TN)N)N)r   r   r   )NrN   r   r   )NrN   r   r   r   r   )NrN   r   )NrN   r   F)rN   r   r   )NrN   r   r   r   )r   N)Fr   )F)NF)ArH   rI   rJ   is_builtin_scopeis_py_class_scopeis_c_class_scopeis_closure_scopeis_genexpr_scopeis_passthroughr   is_property_scopeis_module_scopeis_internalr   r   nogilrX  return_typerF   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  r4  r:  r<  r=  rK  rC  rR  rU  r  r  rW  rZ  rh  rm  rn  rp  rq  rr  ru  r   rw  r?   r?   r?   r@   r     s   #



:
 
 
  
!4
 

	
M
"r   c               @   s"   e Zd ZejZdd Zdd ZdS )PreImportScopec             C   s   t j| tjd d  d S )N)r   rF   r   
pre_import)rE   r?   r?   r@   rF     s    zPreImportScope.__init__c             C   s"   | j ||t|d}d|_d|_|S )NrN   T)r   r   rk   rh   )rE   rO   rQ   r   r?   r?   r@   r/    s    zPreImportScope.declare_builtinN)rH   rI   rJ   r	   preimport_cnamenamespace_cnamerF   r/  r?   r?   r?   r@   r    s   r  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j| dd d  ntj| dt d  i | _x2t| jj D ] \}}|\}}| j	||d | qDW d S )N__builtin__)
r   r  r   rF   r  
type_namesr   builtin_entriesr   r   )rE   rO   
definitionr>   rP   r?   r?   r@   rF     s    
zBuiltinScope.__init__Nc             C   s,   |dkr |d kr|dk}|s d}t j| |S )Nstrr7   unicode)Nr7   )r   r  )rE   rO   language_level
str_is_strr?   r?   r@   r    s    zBuiltinScope.lookupc             C   sL   t t|sH| jd k	r"| jj||S tjr8t|d|  nt|d| d d S )Nzundeclared name not builtin: %sr7   )hasattrbuiltinsr   r/  r   error_on_unknown_namesr   r   )rE   rO   rQ   r?   r?   r@   r/    s    

zBuiltinScope.declare_builtinc             C   sh   t |}| j||d |d|d}|rd|dkr0|}nt |}t||t}d|_d|_||_|j|_||_|S )Nr   )re   r   *r   )	r   rK  rL   r   rk   rf   r   r   r   )rE   rO   rP   r>   python_equivr   r   rJ  r?   r?   r@   declare_builtin_cfunction  s    z&BuiltinScope.declare_builtin_cfunctionc       	      C   s   t |}tj|||}t|d dd}i |_|dkr8d|_|j| d| j|< | j||d dd}||_	t
|j| jdj|j|jjd}d|_d|_d|_d|_||_	| |_tjrd|_||_|S )	Nr   )r   re   boolTr   )re   rP   )rO   rP   rQ   r>   )r   r
   BuiltinObjectTypeCClassScope
directivesis_final_type	set_scoper  r  r   rL   rO   r  rP   rQ   typeptr_cnamerk   rg   r   rf   r   r   cache_builtinsrv   r   )	rE   rO   r>   r   objstruct_cnamerP   r   r   rJ  r?   r?   r@   declare_builtin_type  s0    


z!BuiltinScope.declare_builtin_typec             C   s   | S )Nr?   )rE   r?   r?   r@   r   0  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)Py_NonePy_FalsePy_True)rP   r  r$   r%   r    complexbytes	bytearrayr  r  tupler  dictr   	frozensetsliceNoneFalseTrue)NN)NN)NN)rH   rI   rJ   r{  rF   r  r/  r  r  r   r   r  r?   r?   r?   r@   r    s4   
	


r  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d@ddZdd Zdd ZdAddZdd Zdd Zdd Zdd  ZdBd"d#Zd	d!dddf d	dfd$d%Zd&d' Zd(d) Zd*d+ ZdCd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<d= Z"d	S )DModuleScoper   r   c          	   C   s  ddl m} || _|j}tj| ||| |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 ]}| j"t|t#d  qW | j$t%j&ddd d S )Nr   )BuiltinrF   TFrM   r   __builtins__rH   __file__r   __path____spec__
__loader____package__
__cached__zPython.h)initial)	r  rH   r  r   r  r  r  r  r  )'rM   r  parent_moduler   r   rF   module_name
is_packager   contextr	   module_cnamemoddict_cnamemodule_dict_cnamemethtable_cnamemethod_table_cnamer   moddoc_cnamerx   utility_code_listmodule_entries
c_includesr  r  pxd_file_loadedcimported_modulesr   types_importedincluded_fileshas_extern_classcached_builtinsundeclared_cached_builtinsr  _cached_tuple_typesr   r   process_includer   IncludeCode)rE   rO   r  r  r  r   var_namer?   r?   r@   rF   p  sB    zModuleScope.__init__c             C   s   | j S )N)r  )rE   r?   r?   r@   r     s    zModuleScope.qualifying_scopec             C   s   | S )Nr?   )rE   r?   r?   r@   r     s    zModuleScope.global_scopeNc             C   sn   | j |}|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   r7   )r  r  )r  r  r  r   unicode_literalsfuture_directivesr   r  )rE   rO   r  r  r   r?   r?   r@   r    s    
zModuleScope.lookupc       
      C   s   t |}y| j| }W n( tk
r>   tj| }| j|< Y nX |j}| j|}|st|}x(t|D ]\}}|j	d| ||d qfW | j
|d d|d||d}	| jj|	 |	|_| j||||}||_|S )Nzf%s)rO   rP   rQ   _structr,   T)r  rQ   r>   )r  r  r   r
   c_tuple_typer>   r  StructOrUnionScope	enumerater   r  r   removestruct_entryr  r   )
rE   rQ   r*  ttyper>   r   r   ix	componentr  r?   r?   r@   r)    s$    
zModuleScope.declare_tuple_typec             C   s&  t t| rz|tjkrz|tjkrz| jr8| j|t|}|S tj	rNt
|d|  nt|d| d | j|d t|d}d|_|S tjrx| jD ]}|j|kr|S qW |dkr| j r| jjdS | jd d t|d}tjo|tjkrd|_d|_||_tj| |_| jj| | jj| nd|_||_|S )Nzundeclared name not builtin: %sr7   rN   r   globals__Pyx_Globals)r  r  r   non_portable_builtins_mapuncachable_builtinshas_import_starr   r   r   r  r   r   r   rf   r  r  rO   old_style_globalsr   r  rv   r	   builtin_prefixr>   r   r  )rE   rO   rQ   r   r?   r?   r@   r/    s:    


zModuleScope.declare_builtinc             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j||||dS )NFr   r   T)relative_torQ   absolute_fallback)r  r   r  find_module)rE   r  rQ   relative_levelr  r  module_scoper?   r?   r@   r    s    zModuleScope.find_modulec             C   sX   d|kr|j dd\}}nd }| j|}|sFt|| | jd}|| j|< |rT|j|}|S )Nr   r   )r  r  )splitlookup_submoduler  r  r  find_submodule)rE   rO   	submoduler   r?   r?   r@   r    s    


zModuleScope.find_submodulec             C   sF   d|kr|j dd\}}nd }| jj|d }|rB|d k	rB|j|}|S )Nr   r   )r  r  rV  r  )rE   rO   r  moduler?   r?   r@   r    s    
zModuleScope.lookup_submoduleFc             C   s   t j|||d}| j| 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.
        )rz  N)r   r  r  )rE   rx  ry  rz  incr?   r?   r@   rw    s    zModuleScope.add_include_filec             C   s4   |j  }|dkr|j }|j| j| | j| }dS )a  
        Add `inc`, which is an instance of `IncludeCode`, to this
        `ModuleScope`. This either adds a new element to the
        `c_includes` dict or it updates an existing entry.

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

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

        One `IncludeCode` object can contain multiple pieces of C code:
        one optional "main piece" for the include file and several other
        pieces for the verbatim code. The `IncludeCode.dict_update`
        method merges the pieces of two different `IncludeCode` objects
        if needed.
        N)	mainpiecesortkeydict_updater  )rE   r  r   r?   r?   r@   r    s
    zModuleScope.process_includec             C   sR   || j krNx|jj D ]}| j| qW | j j| x|j D ]}| j| q<W d S )N)r  r  valuesr  r   add_imported_module)rE   r   r  mr?   r?   r@   r  :  s    
zModuleScope.add_imported_modulec             C   s6   |j rd|_|| jkr"|| j|< nt|d| d d S )NTz'%s' redeclared  r   )rh   rk   r   r   )rE   rO   r   rQ   r?   r?   r@   add_imported_entryB  s
    
zModuleScope.add_imported_entryc             C   s^   | j |}|r6|jr"|j|kr"|S |jo.|j sJ|S n| j|t|}d|_||_| j| |S )Nr   )r  rh   r   r   r   rk   r  )rE   rO   r   rQ   r   r?   r?   r@   declare_moduleK  s    

zModuleScope.declare_modulerN   c	             C   sX  |d
krt |d|  |s<|tkr&t}|jo2|j s<td|sn| }	|dksZ|dkr`|	r`|}n| jtj|}| j	|}
|
o|
j
 r|
jj|s|dkr|
jdkrt|d| d ||
_|
jdkr| jtj|}|
j|kr|}||
_|
j sd|
_|
S tj| ||||||||d		}
|r@d|
_|
jjr2|
jj|
_| jj|
 nd|
_tjrTd|
_|
S )NrN   r   r   z+Module-level variable cannot be declared %sz7Non-cdef global variable is not a generic Python objectz6Variable '%s' type does not match previous declarationr   T)r>   re   r   r-  r.  )rN   r   r   )r   r   r   is_pyobjectis_extension_typer   r   r	   r+  r  r   rP   r@  re   r   r>   r   r   r   rg   declaration_valuerR   r   r   rh   r   cimport_from_pyxr   )rE   rO   rP   rQ   r>   re   r   r-  r.  r  r   mangled_cnamer?   r?   r@   r   d  sN    




zModuleScope.declare_varc             C   s   | rd|	krt |dd |sF|dks2|dkr8|r8|}n| jtj|}|dkr^|jr^t|d | j|}|r|jr|jdkr| jtj	|}|j
|kr|}||_
||_tj| |||||||||	|
|d}|S )	Nr5   z+Declarations should not be declared inline.r   r   r   z6Extern functions cannot have default arguments values.rN   )r>   re   r   r-  r  rF  r   rG  )r   r   r	   r?  optional_arg_countr   r  r   re   r+  r>   r   r   rK  )rE   rO   rP   rQ   r>   re   r   r-  r  rF  r   rG  r   r  r?   r?   r@   rK    s,    




zModuleScope.declare_cfunctionc             C   s    | j |}|s| j|t| d S )N)r  r   r   )rE   rO   rQ   r   r?   r?   r@   declare_global  s    
zModuleScope.declare_globalc             C   s   |d k	r| j j| d S )N)r  r   )rE   ro  r?   r?   r@   rn    s    zModuleScope.use_utility_codec             C   s8   |d krd S |j r | jj|j  |jr4| jj|j d S )N)r   r  r   r   )rE   r   r?   r?   r@   rp    s    z"ModuleScope.use_entry_utility_codec             C   s  |r.|
dkr.|
dkp|s$t |dd |}d}nd }| j|}|r| r|j}|joV|js^d }nb|j}|r| st|jr| j||| |r|js|r|jr|r||jk	rt	|d |r|j r||_| s|rt
j||||
dk|d}||_||_|d k	r ||_|
dkr||_n| j|_|	r(|	|_n| jtj||_| j||||
d|d}d	|_|rb||_n&|js|| jtj||_nt	|jd
 | j| | jj| |js|s|r<t|| |
d}| jj |_|r|jr|j |j |j!| | j"j| n>|r|jjrt	|d|  n|r<|jj#r<t	|d|  |rHd|_$|rT||_|
dkr~|j%|
kr~t	|d||j%f  |rd|_&|r|jr|j|krt	|d ||_|r|j'r|j'|krt	|d ||_'| jj(drd	|j_)d	|_*|S )Nr   r   z6ctypedef only valid for 'extern' , 'public', and 'api'r7   r   z-Base type does not match previous declaration)
check_size)re   r  r   Tz5Object name required for 'public' or 'extern' C class)rO   r   re   zC class '%s' already definedz C class '%s' already implementedr   rN   z&Class '%s' previously declared as '%s'z4Object struct name differs from previous declarationz2Type object name differs from previous declarationfinal)+r   r  rP   rs   r  r   definedr  r  r   r
   PyExtensionTyperQ   buffer_defaultsobjtypedef_cnamer  r   r  r   r	   typeptr_prefixr  rt   r  r   objstruct_prefixattach_var_entry_to_c_classr   r   r  r  copydeclare_inherited_c_attributesr  r   implementedr   re   r   typeobj_cnamerV  r  r   )rE   rO   rQ   r  implementingr  r  r  r  r  re   r  r   r  r  r   r  r   rP   r   r?   r?   r@   declare_c_class  s    









zModuleScope.declare_c_classc             C   s   |j }|jr*|jjr*dtj|jjf |_n\|jr|jjrt|jj}|j}x2|r||j sh|t|jjkrjP |jrtd S |j}qLW tj|_|jr| j	tj
|j|_| j	tj|j|_d S )Nz%s.%s)rP   r  vtabslot_cnamer	   obj_base_cnamer   r   r   is_builtin_typer   vtabstruct_prefixrO   vtabstruct_cnamevtabptr_prefixvtabptr_cname)rE   r   rP   entry_countr  r?   r?   r@   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   rP   r   r   rQ   rO   )rE   r   r?   r?   r@   check_c_classes_pxdW  s    zModuleScope.check_c_classes_pxdc             C   s   |j }|j}|j}|js(t|jd|  |dkrH|j rH| jtj	||_|jrx2|jj
D ]&}|j rX|j rXt|jd|j  qXW |jr| jtj|j|_d S )Nz(C class '%s' is declared but not definedr   z)C method '%s' is declared but not defined)rP   rO   re   r   r   rQ   r  r   r	   typeobj_prefixr   r   r   r  vtable_prefixvtable_cname)rE   r   rP   rO   re   method_entryr?   r?   r@   check_c_classg  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 | j| qW d S )Nr   z&Scope.check_c_classes: checking scope z...entry %s %sz......type = z......visibility = )printr   r   rO   rP   re   r  )rE   debug_check_c_classesr   r?   r?   r@   check_c_classes~  s    zModuleScope.check_c_classesc             C   s\   xV| j j D ]H\}}|jr|jr|j| kr|jdkr|j r|j rt|j	d|  qW d S )Nr   z3Non-extern C function '%s' declared but not defined)
r   r   rl   r   r   re   r   r   r   rQ   )rE   rO   r   r?   r?   r@   check_c_functions  s    

zModuleScope.check_c_functionsc             C   sJ   ddl m} t|j|j|j|jjd}d|_d|_	d|_
|j|_||_d S )Nr   )r  )rO   rP   rQ   r>   )rM   r  rL   rO   	type_typerQ   rP   r  rk   rg   r   r   r   )rE   r   r  rJ  r?   r?   r@   r    s    z'ModuleScope.attach_var_entry_to_c_classc             C   s   | j S )N)cpp)rE   r?   r?   r@   r     s    zModuleScope.is_cppc             C   s   ddl m} | j|  d S )Nr   )PyObjectTypeInferer)rt  r#  ru  )rE   r#  r?   r?   r@   ru    s    zModuleScope.infer_types)NNr   )r   )NF)NrN   r   r   r   )r   r   NNNNNrN   r   r   NNr   )#rH   rI   rJ   r  r  is_cython_builtinr  rF   r   r   r  r)  r/  r  r  r  rw  r  r  r  r  r   rK  r  rn  rp  r  r  r  r  r  r   r  r   ru  r?   r?   r?   r@   r  R  sL   &
$

		 
7    
lr  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 j| ||| d S )N)r   rF   )rE   rO   r   r   r?   r?   r@   rF     s    zLocalScope.__init__c             C   s   || S )Nr?   )rE   r   rO   r?   r?   r@   r     s    zLocalScope.manglec             C   sH   | j tj|}| j||||d}d|_|jr2d|_d|_| jj	| |S )NrN   r   0)
r   r	   r+  r   rk   r  rR   r|   r   r   )rE   rO   rP   rQ   r>   r   r?   r?   r@   declare_arg  s    zLocalScope.declare_argrN   r   c	       
      C   sb   |dkrt |d|  tj| ||||||||d	}	|	jjrD|	jj|	_d|	_| j|	_| j	j
|	 |	S )Nr   readonlyz$Local variable cannot be declared %s)r>   re   r   r-  r.  r   )r   r'  )r   r   r   rP   r  rR   r}   _in_with_gil_blockr   r   r   )
rE   rO   rP   rQ   r>   re   r   r-  r.  r   r?   r?   r@   r     s    
zLocalScope.declare_varc             C   s4   | j |rt|dd n| j j|}|| j|< d S )Nz'%s' redeclared  r   )r  r   r   rW  r   )rE   rO   rQ   r   r?   r?   r@   r    s    
zLocalScope.declare_globalc             C   sd   | j |}|r8|j| kr8|j r8t|d|  |j  n(| j|}|d ksR|j r`t|d|  d S )Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r  r   r   r   rY   r  )rE   rO   rQ   
orig_entryr   r?   r?   r@   declare_nonlocal  s    


zLocalScope.declare_nonlocalc             C   sv   t j| |}|d k	rr|j}x|jr*|j}qW || k	rr|jrrt|jdrNtdd|_t	|| }d|_
|| j|< |S |S )Nscope_classz#lookup() after scope class created.T)r   r  r   r  r   r~  r  r   r~   r   rk   r   )rE   rO   r   entry_scopeinner_entryr?   r?   r@   r    s    


zLocalScope.lookupc             C   s   x| j  D ]}x|jj D ]r}|jrl|jj}| jr:||_q|j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 )Nr7   z%s->%s)r   r   r  r   r   r>   r  r;   r	   cur_scope_cnamer   r~   original_cname)rE   outer_scope_cnamer   r   r>   r?   r?   r@   mangle_closure_cnames  s    z LocalScope.mangle_closure_cnames)N)NrN   r   r   r   )rH   rI   rJ   has_with_gil_blockr(  rF   r   r&  r   r  r*  r  r1  r?   r?   r?   r@   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 |j jtj}tj| ||| |j| _dtj	t
||f | _x|j sh|jsh|jrp|j}qVW |j| _|jj|  d S )Nz%s%d%s)r  r   r   r   r	   genexpr_id_refr   rF   r  r<   r   genexp_prefixr}  r|  r   r   r   add)rE   r   r   rO   r?   r?   r@   rF   '  s    

z!GeneratorExpressionScope.__init__c             C   s   d| j | jj||f S )Nz%s%s)r5  r   r   )rE   r   rO   r?   r?   r@   r   8  s    zGeneratorExpressionScope.mangleNrN   r   c	             C   s   |t kr$| jj|}	|	r$|	jr$|	j}d| j| jjtj	|p>| j
 f }| j|||||}
d|
_| jjrnd|
_nd|
_d|
_| jj|
 |
| j|< |
S )Nz%s%sT)r   r   r  rk   rP   r5  r   r   r	   r+  r   r   r  rg   r}   r   r   r   r   )rE   rO   rP   rQ   r>   re   r   r-  r.  r   r   r?   r?   r@   r   ;  s    
"
z$GeneratorExpressionScope.declare_varFc             C   s   | j j|||S )N)r   r4  )rE   rO   rQ   r3  r?   r?   r@   r4  Q  s    z+GeneratorExpressionScope.declare_pyfunctionc             C   s   | j j||S )N)r   r:  )rE   r   rQ   r?   r?   r@   r:  U  s    z0GeneratorExpressionScope.declare_lambda_functionc             C   s   | j j|S )N)r   r<  )rE   r;  r?   r?   r@   r<  X  s    z'GeneratorExpressionScope.add_lambda_def)NrN   r   r   T)F)rH   rI   rJ   r   r  rF   r   r   r4  r:  r<  r?   r?   r?   r@   r3     s    

r3  c               @   s$   e Zd ZdZdddZd	ddZdS )
ClosureScopeTNc             C   s$   t j| ||| dtj|f | _d S )Nz%s%s)r   rF   r	   closure_scope_prefixclosure_cname)rE   rO   
scope_namer   r   r?   r?   r@   rF   `  s    zClosureScope.__init__Fc             C   s   t j| |||ddS )NrN   )re   )r   r4  )rE   rO   rQ   r3  r?   r?   r@   r4  m  s    zClosureScope.declare_pyfunction)N)F)rH   rI   rJ   r~  rF   r4  r?   r?   r?   r@   r7  \  s   
r7  c               @   s8   e Zd ZdddZddd	Zdddddf dfd
dZdS )r  ?c             C   s   t j| |d d  d S )N)r   rF   )rE   rO   r?   r?   r@   rF   t  s    zStructOrUnionScope.__init__NrN   r   Fc             C   s   |s|}|dkrt |}|jr(tj|}| j|||||}d|_| jj| |jrd|	 rdt	|d n|j
rz|
 rzt	|d |dkrt	|d|  |S )NrN   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)rA   rl   r
   r!  r   rk   r   r   r  r   r   )rE   rO   rP   rQ   r>   re   r   r-  r.  allow_pyobjectallow_memoryviewr   r?   r?   r@   r   w  s     

zStructOrUnionScope.declare_varc             C   s"   |
rt |d | j|||||dS )Nz0C struct/union member cannot be declared 'cpdef')r>   re   )r   r   )rE   rO   rP   rQ   r>   re   r   r-  r  rF  rG  r?   r?   r@   rK    s    

z$StructOrUnionScope.declare_cfunction)r;  )NrN   r   r   r   FF)rH   rI   rJ   rF   r   rK  r?   r?   r?   r@   r  q  s   
  
r  c               @   s   e Zd Zdd Zdd ZdS )
ClassScopec             C   s    t j| ||| || _d | _d S )N)r   rF   
class_namer   )rE   rO   r   r?   r?   r@   rF     s    zClassScope.__init__c          	   C   sd   t j| |}|r|S |dkr`tddtjttjdtd gdd}tjj	dd|_
| j| d|_|S )Nclassmethod__Pyx_Method_ClassMethodrM   r   ClassMethodzCythonFunction.cr   )r   r  rL   r
   	CFuncTyper   CFuncTypeArgr   UtilityCodeload_cachedr   rp  rl   )rE   rO   r   r?   r?   r@   r    s    
zClassScope.lookupN)rH   rI   rJ   rF   r  r?   r?   r?   r@   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
   | j |S )N)mangle_special_name)rE   rO   r?   r?   r@   r     s    z&PyClassScope.mangle_class_private_namec             C   s6   |r2|j dr2|jd r2td| jjd|f }|S )Nr8   z_%s%s_)r;   endswithr   r?  lstrip)rE   rO   r?   r?   r@   rH    s    z PyClassScope.mangle_special_namec             C   s   | j |}tj| |S )N)rH  r>  r  )rE   rO   r?   r?   r@   r    s    
zPyClassScope.lookup_hereNrN   r   c	       
      C   sB   | j |}|tkrt}tj| ||||||||d	}	d|	_d|	_|	S )N)r>   re   r   r-  r.  r   )rH  r   r   r   r   rh   rj   )
rE   rO   rP   rQ   r>   re   r   r-  r.  r   r?   r?   r@   r     s    
zPyClassScope.declare_varc             C   sh   | j |}|r8|j| kr8|j r8t|d|  |j  n,| j|}|d krZt|d|  n
|| j|< d S )Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r  r   r   r   rY   r  r   )rE   rO   rQ   r)  r   r?   r?   r@   r*    s    


zPyClassScope.declare_nonlocalc             C   s4   | j |rt|dd n| j j|}|| j|< d S )Nz'%s' redeclared  r   )r  r   r   rW  r   )rE   rO   rQ   r   r?   r?   r@   r    s    
zPyClassScope.declare_globalc             C   s   | j j|S )N)r   add_default_value)rE   rP   r?   r?   r@   rL    s    zPyClassScope.add_default_value)NrN   r   r   r   )rH   rI   rJ   r|  r   rH  r  r   r*  r  rL  r?   r?   r?   r@   rG    s    
rG  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ddf ddfddZd"ddZd#ddZdd Zdd ZdS )$r  r   Fc             C   sF   t j| || |dkr6|jtj|| _|jtj|| _g | _g | _	d S )Nr   )
r>  rF   r   r	   methtab_prefixr  gstab_prefixgetset_table_cnameproperty_entriesinherited_var_entries)rE   rO   r   re   r?   r?   r@   rF     s    zCClassScope.__init__c             C   sP   | j r| jjdd rdS | jj}|r:|jd k	r:|jj S | jjrL| jj S dS )Nno_gcFT)	has_cyclic_pyobject_attrsr  rV  parent_typer  r   needs_gcr  is_gc_simple)rE   r  r?   r?   r@   rU    s    

zCClassScope.needs_gcc             C   s   | j  o| jjdd S )z
        Do we need to generate an implementation for the tp_clear slot? Can
        be disabled to keep references for the __dealloc__ cleanup function.
        no_gc_clearF)rU  r  rV  )rE   r?   r?   r@   needs_tp_clear%  s    zCClassScope.needs_tp_clearTc             C   s   g }g }g }xn| j D ]d}|jjrN|s4| js4|jdkrx|sB|jj rx|j| q|jtjkrf|j| q|jj	r|j| qW |p|p|}||||ffS )Nr9   )
r   rP   r  is_closure_class_scoperO   rV  r   r
   c_py_buffer_typer   )rE   include_weakrefinclude_gc_simplepy_attrs
py_buffersmemoryview_slicesr   have_entriesr?   r?   r@   get_refcounted_entries,  s    z"CClassScope.get_refcounted_entriesNrN   r   c	       
      C   s  |rb| j rt|d | j r4t|r4t|d|  |sL|}|dkrLt|}|jrt|dkrt|j| | jtj	d | j
|||||}	d|	_| jj|	 |jrd| _nH|jrd| _n:|jr| js|dkrd| _|j s|j s|jj rd| _|dkrt|d|  |dkrXd|	_| j r4|dkr4t|d |jpD|j| s^t|d|  nd|	_|	S |tkrpt}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.rN   r   z#include <new>r   Tr9   r   r'  z1Attribute of extension type cannot be declared %sz9Special attribute __weakref__ cannot be exposed to Pythonz7C attribute of type '%s' cannot be accessed from PythonF)r>   re   r   r-  r.  z(PyObject *)%s)rN   r   r'  )r   r'  )"r  r   rY  r   rA   ru   r,  rn  r   rE  r   rk   r   r   r   has_memoryview_attrshas_cpp_class_attrsr  has_pyobject_attrsr  r   rU  rS  r   can_coerce_to_pyobjectr   r   r   r   ri   rh   rT  r  r  )
rE   rO   rP   rQ   r>   re   r   r-  r.  r   r?   r?   r@   r   ?  s^    





zCClassScope.declare_varc             C   s   |t kr"| jdrPt|d|  n.|dkrPx$t D ]}| j|r0t|d|  q0W |dkrbt|d | j|t|dd}t|}|r||_d|_nt|_d|_| j	j
| |S )	N__richcmp__z$Cannot define both % and __richcmp____new__zv__new__ method of extension type will change semantics in a future version of Pyrex and Cython. Use __cinit__ instead.r   )re   r   r   )r   r  r   r   r   r   r0  r   r   r   r   )rE   rO   rQ   r3  rg  r   special_sigr?   r?   r@   r4  }  s&    




zCClassScope.declare_pyfunctionc             C   sF   | j  r|dkrtd}tj| |}|rB|jrB| jjsB| jjsBd S |S )Nrg  	__cinit__)rY  r   r>  r  rn   rT  r  r  )rE   rO   r   r?   r?   r@   r    s    
zCClassScope.lookup_herec             C   s0  t |r| jj rt|d |j}|jsf|s8t|d n.| jj|d jsft|d|d j|| jf  | j|}|d krt	|}|r|j
st|d| d n|r|jrt|d|  |jr|jrt|d n|j|jdd	o|j|jjkr |jj|j|_n|j|jdd	r|j|jjkr| jrl| rl|j|jddd
 rlt|d|| jf d t|jdd | j||||d|	d}nt|d t|jd n0| jrt|d|| jf  | j||||||	}|r| jtj||_|
|_||_d|	krd|_| jjs|js| j 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)rj  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.r7   zPrevious declaration is herer   )re   rF  z2Signature not compatible with previous declarationzOC method '%s' not previously declared in definition part of extension type '%s'r5   Tr   )#r   rT  r  r   r   is_static_methodassignable_fromrP   r  rA   rl   r   r   rp   r   same_c_signature_asr  rA  rB  rD  r  !same_c_signature_as_resolved_typer?  rQ   rC  r   r	   r?  r   r   rq   r  r  rV  r   )rE   rO   rP   rQ   r>   re   r   r-  r  rF  r   rG  r   r   r?   r?   r@   rK    s^    


 "

zCClassScope.declare_cfunctionc       
   
   C   s4   | j |}tj| |||||||d}	d|	_||	_|	S )N)rO  r   )r  r>  rC  rm   r   )
rE   rO   rP   rQ   r>   re   rF  rO  r   r   r?   r?   r@   rC    s    
zCClassScope.add_cfunctionc             C   sN   t |}| j||d |d|d}t||t}d|_d|_||_|j|_||_|S )Nr   )re   r   r   )	r   rK  rL   r   rk   rf   r   r   r   )rE   rO   rP   r>   r   r   rJ  r?   r?   r@   r    s    z%CClassScope.declare_builtin_cfunctionc             C   s^   | j |}|d kr$| j||t|d}d|_||_t|| j | d|_| j|j_| j	j
| |S )NrN   r   )r   r   )r  r   r   rw   r   PropertyScoper   r   rT  rP  r   )rE   rO   r   rQ   r   r?   r?   r@   declare_property  s    

zCClassScope.declare_propertyc          
      s.   fdd}|j |j }x:|D ]2 | j j| j jd d}d|_| j j| qW x(|jd d  D ]  jj	rd j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p|jr j|_|rd|_||_ jr j|_qW d S )Nc                s   dt j jf S )Nz%s.%s)r	   r  r>   )r>   )
base_entryr?   r@   adapt	  s    z9CClassScope.declare_inherited_c_attributes.<locals>.adaptrN   r   T)rO  )rQ  r   r   rO   r>   rP   rk   r   r   rL  "get_all_specialized_function_typesr   rf   rC  rQ   re   r   r   rp   rq   r   r   rn   r   )rE   
base_scopers  r   r   r>   rJ  rf   r?   )rr  r@   r	  	  s@    

z*CClassScope.declare_inherited_c_attributes)FT)NrN   r   r   r   )F)F)N)rH   rI   rJ   r}  rY  rd  rb  rc  rS  r  r
  rF   rU  rX  ra  r   r4  r  rK  rC  r  rq  r	  r?   r?   r?   r@   r    s.    
 
<
<
	
r  c               @   sV   e Zd ZdZdZdZdddZdddZdddddf dd	fd
dZdd Z	dd Z
dS )CppClassScoper   Nc             C   sV   t j| ||d  |j| _g | _|d k	rRx*|D ]"}| j||tj|d d}d|_q,W d S )Nr   r   )r   rF   r  rQ  r   r
   TemplatePlaceholderTypers   )rE   rO   r   r  Ttemplate_entryr?   r?   r@   rF   =	  s    
zCppClassScope.__init__r   r   c
             C   s   |s|}| j |}
|	rb|
d k	rb|
jj|r<|
jj|j|
_qt|jrV|j|
jrV||
_qtt|d n| j|||||}
d|
_	|jr| jr| jj
 sd| jj |f |
_|dkr|	s|dkr| jj|
 |
S )Nz6Function signature does not match previous declarationr   z%s::%sr  z<init>)r  rP   r@  rA  rB  rl   rD  r   r   rk   get_fused_typesempty_declaration_coder   r   r   )rE   rO   rP   rQ   r>   re   r   r-  r.  r  r   r?   r?   r@   r   G	  s"    

zCppClassScope.declare_varFc                s,  | j jdd }||dfkrh|d krhdtj|f }d}tj |_|j|_dd   fdd	|jD |_n,|d
kr|d krdtj|f }d}tj |_|dkr|j	rx@| j
jD ]4}|jj|}|r|j
j	 rt|d t|jd qW | j|}| j||||||d}|r| r|j |_|
|_||_|S )Nz::r   rF   z%s__init__%s<init>c             S   s4   | j jr,| j j r,tj| jtj| j | jS | S d S )N)rP   ru   is_referencer
   rD  rO   
c_ref_typerQ   )r[  r?   r?   r@   	maybe_refk	  s    z2CppClassScope.declare_cfunction.<locals>.maybe_refc                s   g | ]} |qS r?   r?   )r   r[  )r  r?   r@   r\  q	  s    z3CppClassScope.declare_cfunction.<locals>.<listcomp>__dealloc__z%s__dealloc__%s<del>zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.)r  r>   re   r   )r|  r  )rO   r  r	   r?  r
   	CVoidTyper  r   original_argsr  rP   r  r   r  r   rQ   r  r   r[   rS   r   r   )rE   rO   rP   rQ   r>   re   r   r-  r  rF  r   rG  r?  baserr  r   r   r?   )r  r@   rK  `	  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f }xb|j|j D ]R}|jdkrbqR|j| jkrt|j | j|j|j	|j
d d}d|_d|_| j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	|j}d|_qW d S )Ntemplate_typer  c             S   s   g | ]
}|j qS r?   )rO   )r   rx  r?   r?   r@   r\  	  s    zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp><init><del>r   r   r   )r   rF  r   )r  r  )r   r   r  r  rQ  r   rO   r   r   r>   rP   rk   r   r   r   rK  rQ   re   r   r   r   r  )rE   r  ru  r  base_templatesrr  r   r?   r?   r@   r  	  s>    




z.CppClassScope.declare_inherited_cpp_attributesc          	   C   s   t | j| j}||_x| jj D ]}|jrN|j|j|jj||j	|j
dd q |jjrxX|j D ](}|j|j|jj||j	|j
|jd q`W q |j|j|jj||j	|j
|j q W |S )Nr   )r  )r   )rv  rO   r   rP   r   r  rs   r  rY  rQ   r>   rl   r[   rK  r   r   re   )rE   r  
type_entryr   r   r   r?   r?   r@   rY  	  s,    



zCppClassScope.specialize)N)Nr   r   r   r   r   )rH   rI   rJ   r   default_constructorrP   rF   r   rK  r  rY  r?   r?   r?   r@   rv  5	  s   
 
$'rv  c               @   s   e Zd ZdZdddZdS )rp  r   Fc             C   s@   t |}|r.| j||t|d}d|_||_|S t|d d S d S )NrN   r   zKOnly __get__, __set__ and __del__ methods allowed in a property declaration)r   r   r   r   r0  r   )rE   rO   rQ   r3  r0  r   r?   r?   r@   r4  	  s    
z PropertyScope.declare_pyfunctionN)F)rH   rI   rJ   r  r4  r?   r?   r?   r@   rp  	  s   rp  c               @   s   e Zd Zdd Zdd ZdS )CConstScopec             C   s$   t j| d|j |j|j || _d S )Nconst_)r   rF   rO   r   r   const_base_type_scope)rE   r  r?   r?   r@   rF   	  s    zCConstScope.__init__c             C   s4   | j j|}|d k	r0tj|}tj|j|_|S d S )N)r  r  r  r
   c_const_typerP   )rE   rO   r   r?   r?   r@   r  	  s
    
zCConstScope.lookup_hereN)rH   rI   rJ   rF   r  r?   r?   r?   r@   r  	  s   r  c               @   s   e Zd Zdd ZdS )TemplateScopec             C   s   t j| ||d  |j| _d S )N)r   rF   r  )rE   rO   r   r?   r?   r@   rF   	  s    zTemplateScope.__init__N)rH   rI   rJ   rF   r?   r?   r?   r@   r  	  s   r  )3
__future__r   r   r  r   r  r  ImportErrorErrorsr   r   r   StringEncodingr   rM   r   r	   r
   r   r   	TypeSlotsr   r   r   r   r   r   r   r   r=   rA   objectrB   rL   r   r   r  r  const_counterr  r   r3  r7  r  r>  rG  r  rv  rp  r  r  r?   r?   r?   r@   <module>   sn   	 :#     @r    nd<&#<  A 