a
    bo                    @   s  d dl mZ d dlZd dlZd dlZzd dlZW n eyJ   d dlZY n0 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g dZdd ZG dd deZ G dd deZ!G dd de!Z"G dd deZ#G dd de#Z$G dd de#Z%dZ&G dd de#Z'G dd de#Z(G dd  d e#Z)G d!d" d"e(Z*G d#d$ d$e#Z+G d%d& d&e#Z,G d'd( d(e,Z-G d)d* d*e,Z.G d+d, d,e#Z/G d-d. d.e#Z0G d/d0 d0e#Z1G d1d2 d2e#Z2dS )3    )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breakZcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsigned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v r,| tv r6tj|  } | S )N   __)__weakref____dict__)
startswithr	   pyrex_prefixiso_c99_keywordscname r9   f/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/Cython/Compiler/Symtab.pyc_safe_identifier%   s    
r;   c                   @   s    e Zd ZdZdd Zdd ZdS )	BufferAuxFc                 C   s   || _ || _d S N)buflocal_nd_var	rcbuf_var)selfr>   r?   r9   r9   r:   __init__1   s    zBufferAux.__init__c                 C   s
   d| j  S )Nz<BufferAux %r>)r3   r@   r9   r9   r:   __repr__5   s    zBufferAux.__repr__N)__name__
__module____qualname__Zwritable_neededrA   rC   r9   r9   r9   r:   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 r=   )
namer8   typeposinitoverloaded_alternativescf_assignmentscf_referencesinner_entriesdefining_entry)r@   rJ   r8   rK   rL   rM   r9   r9   r:   rA      s    zEntry.__init__c                 C   s   dt | jt| | j| j f S )Nz%s(<%x>, name=%s, type=%s))rK   rD   idrJ   rB   r9   r9   r:   rC      s    zEntry.__repr__c                 C   s   t | jd d S )NPrevious declaration is here)r   rL   rB   r9   r9   r:   already_declared_here   s    zEntry.already_declared_herec                 C   s   t |d| j  |   d S )Nz('%s' does not match previous declaration)r   rJ   rU   )r@   rL   r9   r9   r:   
redeclared   s    zEntry.redeclaredc                 C   s   | g| j  S r=   )rN   rB   r9   r9   r:   all_alternatives   s    zEntry.all_alternativesc                 C   s   | g| j  S r=   )rQ   rB   r9   r9   r:   all_entries   s    zEntry.all_entriesc                 C   s4   t | tr,t |tr,| j| jf|j|jfk S tS d S r=   )
isinstancerG   rJ   r8   NotImplemented)leftrightr9   r9   r:   __lt__   s    zEntry.__lt__)NN)LrD   rE   rF   Zinline_func_in_pxdZborrowedrM   
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_entryrA   rC   rU   rV   rW   rX   r]   r9   r9   r9   r:   rG   9   s   S
rG   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   sn   t | |j|j|j|j || _|| _|}|jr8|j}q*|| _|j	| _	|j
| _
|j| _|j| _| j	|  d S r=   )rG   rA   rJ   r8   rK   rL   r   scoperR   rQ   rO   rP   rN   append)r@   r   r   Zoutermost_entryr9   r9   r:   rA      s     
zInnerEntry.__init__c                 C   s   | drt|t| j|S )Nr1   )r4   AttributeErrorgetattrrR   r@   rJ   r9   r9   r:   __getattr__  s    
zInnerEntry.__getattr__c                 C   s
   | j  S r=   )rR   rX   rB   r9   r9   r:   rX     s    zInnerEntry.all_entriesN)rD   rE   rF   __doc__ru   rA   r   rX   r9   r9   r9   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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   rH   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_)rJ   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@   rJ   r   r   Zmangled_nameZ
qual_scoper9   r9   r:   rA   C  s<    
zScope.__init__c                 C   s   | S r=   r9   )r@   memor9   r9   r:   __deepcopy__f  s    zScope.__deepcopy__Tc           
      C   s   g }|j  D ],\}}|r"||v r|js,|r|||f q| j | dD ]N}t| |}tdd |D }	t||D ]"}|js|rv|j|	vrv|| qvqLd S )N)r   r   r   r   r   r   r   r   c                 s   s   | ]}|j V  qd S r=   rJ   ).0er9   r9   r:   	<genexpr>|      z!Scope.merge_in.<locals>.<genexpr>)r   itemsr   r   updater   r   rJ   )
r@   otherZmerge_unused	whitelistr   rJ   entryattrZself_entriesnamesr9   r9   r:   merge_ini  s    

zScope.merge_inc                 C   s   d| j j| jf S )Nz<%s %s>)	__class__rD   r   rB   r9   r9   r:   __str__  s    zScope.__str__c                 C   s   | j S r=   )r   rB   r9   r9   r:   r     s    zScope.qualifying_scopec                 C   s(   |rd|| j |f S | j|| jS d S )Nz%s%s%s)r   r   manglerJ   r@   prefixrJ   r9   r9   r:   r     s    zScope.manglec                 C   s   dt j|f }| |S )Nz%s%s_)r	   r5   r   )r@   rJ   r   r9   r9   r:   mangle_internal  s    zScope.mangle_internalc                 C   s   | j r| j |S |S r=   )r   mangle_class_private_namer   r9   r9   r:   r     s    zScope.mangle_class_private_namec                 C   s^   |   j}z|| d }W n ty0   d}Y n0 |||< |rR|sF|S d||f S d| S d S )Nr   r   z%s%dz%d)global_scoper   KeyError)r@   rJ   Zcounterscountr9   r9   r:   next_id  s    

zScope.next_idc                 C   s
   | j  S z6 Return the module-level scope containing this scope. )r   r   rB   r9   r9   r:   r     s    zScope.global_scopec                 C   s
   | j  S r   )r   builtin_scoperB   r9   r9   r:   r     s    zScope.builtin_scopec                 c   s0   | V  | j r,t| j tddD ]
}|V  q d S )Nr   )key)r   sortedoperator
attrgetter)r@   r   r9   r9   r:   iter_local_scopes  s    zScope.iter_local_scopesc	                 C   sz  |j rt| tst|d | js@|r@td|r@t|d| d | j}	|r||	v r|s|	| }
d}|j	r|
j
j	r|  r|
 D ]$}||j
kr|dkr|jsd} qqd}|rnZ| jr|	| jrnH|dkrt|d	| | jrd
nd n$|dkrt|d	|  |	|   t||||d}| j|_||_|rN| ||_|sN||	|< |jrjd
dlm} |j|_| |_||_|S )Nz5Buffer types only allowed as function local variablesz
^_[_A-Z]+$z'%s' is a reserved name in C.F<init>Tr   '%s' redeclared r   r   ignore)rL   )
MemoryView)Z	is_bufferrY   
LocalScoper   r}   rematchr   r   rf   rK   is_cpprW   argsis_cpp_class_scoper   rU   rG   create_wrapperr   r   is_memoryviewslicerH   r   Zmemslice_entry_initrM   r   r_   )r@   rJ   r8   rK   rL   r_   shadowrl   r   r   Z	old_entryZcpp_override_allowed	alt_entryr   r   r9   r9   r:   declare  sJ    


zScope.declarec                 C   s   t d| j|f S Nz%s.%s)r   r   r   r9   r9   r:   r     s    zScope.qualify_namerI   c	           
      C   sP   |s*| j s|dks|r|}n| tj|}| j||||||d}	d|	_||	_|	S )Npublic)r   r   )r}   r   r	   Zenum_prefixr   ro   Z
value_node)
r@   rJ   rK   valuerL   r8   r_   r   r   r   r9   r9   r:   declare_const  s    zScope.declare_constr   c
              	   C   sJ   |s|}| j ||||||dd}
d|
_||
_|r<| j|
 |	sF|
|_|
S )NT)rl   r   )r   rl   r   r   r   r   )r@   rJ   rK   rL   r8   r_   r   definingr   templater   r9   r9   r:   declare_type   s    zScope.declare_typec              
   C   s   |s*| j s|dks|r|}n| tj|}z6| jrD| j| jj}nd }t	
||||dk|}W n: ty }	 z"t||	jd  t	j}W Y d }	~	n
d }	~	0 0 | j||||||d}
|
j|_|
S )NrI   r   r   )r_   r   )r}   r   r	   type_prefixr   r   lookuprJ   rK   r
   Zcreate_typedef_type
ValueErrorr   r   
error_typer   r   )r@   rJ   	base_typerL   r8   r_   r   	namespacerK   r   r   r9   r9   r:   declare_typedef  s(    
zScope.declare_typedefFc
              	   C   s  |s*| j s|dks|r|}n| tj|}| |}
|
s|t||||||	}| j|||||||d u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   )r_   r   r   '%s' redeclared  r   2'%s' already defined  (ignoring second definition))r}   r   r	   r   lookup_herer
   ZCStructOrUnionTyper   r   r   r   rl   rK   Zis_struct_or_unionkindr   r   check_previous_typedef_flagcheck_previous_visibilityr   r   r   r   rJ   r   )r@   rJ   r   r   typedef_flagrL   r8   r_   r   packedr   rK   r9   r9   r:   declare_struct_or_union*  s:    

zScope.declare_struct_or_unionr9   r   c           
         s  |d u r*| j s|dkr|}n| tj|}t|}| |}|s|tj|||||d}	| j||	|||d ud}| j	
| n|j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 )NrI   )	templates)r_   r   r   r   r   -Base type does not match previous declarationz5Template parameters do not match previous declarationc                    sJ   |D ]@}|t ju rq|jd u r*td q | |j | jj| qd S )Nz#Cannot inherit from incomplete type)r
   r   r   r   base_classesrK    declare_inherited_cpp_attributes)r   r   
base_classdeclare_inherited_attributesrL   r9   r:   r   s  s    

z=Scope.declare_cpp_class.<locals>.declare_inherited_attributesthis)rJ   r8   rK   rL   )r}   r   r	   r   listr   r
   ZCppClassTyper   r   r   rl   rK   rn   r   rU   r   r   r   r   r   declare_varCPtrTyperL   r   r   r   rJ   r   )
r@   rJ   r   rL   r8   r   r_   r   r   rK   r9   r   r:   declare_cpp_classM  sN    




	
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)rK   r   r   rJ   )r@   r   r   rL   r9   r9   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')r_   r   rJ   )r@   r   r_   rL   r9   r9   r:   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   )r8   r_   r   )r}   r   r	   r   r   r   r   rJ   rK   r
   Z	CEnumTypeZc_anon_enum_typer   r   Zenum_valuesr   r   )r@   rJ   rL   r8   r   r_   r   r   r   rK   r   r9   r9   r:   declare_enum  s*    zScope.declare_enumc                 C   s   | j ||S r=   )r   declare_tuple_type)r@   rL   
componentsr9   r9   r:   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 )NrI   r   r   )
r   r	   
var_prefixrn   check_nullary_constructorr   re   r   r   r   
r@   rJ   rK   rL   r8   r_   r   in_pxdis_cdefr   r9   r9   r:   r     s    
zScope.declare_varc                 C   s   | j ||S r=   )r   declare_builtinr@   rJ   rL   r9   r9   r:   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 declaredrT   r_   )
rK   rf   r   rL   r   r   r   	signaturer   r   )r@   rJ   rL   r_   r   r9   r9   r:   _declare_pyfunction  s    zScope._declare_pyfunctionc                 C   s   |  |}|s | j||||dS |rR|jjr4t|_qd|jturd| j||||dS n| j|t||d | jd t||dd}t||_| ||_	t
|_d|_|S )N)r_   r   r
  rI   r8   r_   T)r   r  rK   is_unspecifiedr   r   r   rJ   r   r   r   r  rk   )r@   rJ   rL   allow_redefiner_   r   r9   r9   r:   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_rI   T)r   r	   Zlambda_func_prefixr   r   r   rJ   r   pymethdef_cnamerx   r   r  rk   )r@   Zlambda_namerL   rx   r  r   r   r9   r9   r:   declare_lambda_function  s    
zScope.declare_lambda_functionc                 C   s   | j | d S r=   )r   r   r@   Zdef_noder9   r9   r:   add_lambda_def  s    zScope.add_lambda_defc                 C   s   | j | d S r=   )r   r   r@   r   r9   r9   r:   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*| D ] }|jr||jkr q*q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r4J d||f |
|_|rrt||t}| ||_d|_d|_|j|_||_||_ |S )NrI   r   Tz6Function '%s' previously declared as '%s', now as '%s'r   z)Function '%s' previously declared as '%s'Zcpdefr   F6Function signature does not match previous declaration3Non-extern C function '%s' declared but not definedz2duplicate utility code definition in entry %s (%s))!r   r	   func_prefixr   r_   r8   rx   r   r   rK   same_aswith_with_gilwith_gilr   rW   add_cfunctionrN   r   compatible_signature_withr   r   r   ry   r   rG   r   r   r   re   rb   r   r|   r   )r@   rJ   rK   rL   r8   r_   r   r  r   	modifiersr   overridabler   Zcan_overrider   temp	var_entryr9   r9   r:   declare_cfunction  s    



zScope.declare_cfunctionc                 C   s   |  |||||}d|_|r"||_|s,|jr:| j| nBt| j}	t| jD ]}
|
js`|
j	jsd qn|	d8 }	qN| j
|	| |S )Nr   )r   rf   ry   is_fusedr   r   r   reversedr   rK   insert)r@   rJ   rK   rL   r8   r_   r  	inheritedr   iZcfunc_entryr9   r9   r:   r  A  s    


zScope.add_cfunctionc                 C   s$   |  |}|r|S t|d|  d S )Nz'%s' is not declared)r   r   r@   rJ   rL   r   r9   r9   r:   findT  s    
z
Scope.findc                 C   sP   | }|D ]B}| ||}|s" d S |jr0|j}qt|dd|   d S q|S )Nz'%s' is not a cimported moduler   )r*  r~   r   join)r@   pathrL   r   rJ   r   r9   r9   r:   find_imported_module\  s    zScope.find_imported_modulec                 C   s    |  |p| jr| j|pd S r=   )r   r   r   r   r9   r9   r:   r   k  s
    
zScope.lookupc                 C   s   | j |d S r=   )r   getr   r9   r9   r:   r   r  s    zScope.lookup_herec                 C   s    |  |}|s| |td }|S r=   r   r   r   r@   rJ   r   r9   r9   r:   lookup_targetv  s    
zScope.lookup_targetc                 C   s:   |  |}|r6|jr6|jjr0| jr0|j| jS |jS d S r=   )r   rl   rK   r$  fused_to_specific
specializer0  r9   r9   r:   lookup_type~  s
    

zScope.lookup_typec                 C   s  |d j jrr|d j }|jd| }|d urrdd |dd  D }tdd |dd  D | }|d urr|S | d| }g }|d ur| }g }	t|dkrtdD ]>}
||
 j jr||
 j }|jd| }|d ur|	| 7 }	q|	s|sd S t	t
|	| }tdd |D |S )	Nr   z
operator%sc                 S   s   g | ]
}|j qS r9   rK   r   argr9   r9   r:   
<listcomp>  r   z)Scope.lookup_operator.<locals>.<listcomp>r   c                 S   s   g | ]
}|j qS r9   r5  r6  r9   r9   r:   r8    r   r0   c                 S   s   g | ]
}|j qS r9   r5  r6  r9   r9   r:   r8    r   )rK   rn   r   r   r
   
best_matchrW   r   ranger   r   )r@   r   operandsZobj_typemethodZ	arg_typesresfunctionZfunction_alternativesZmethod_alternativesnrW   r9   r9   r:   lookup_operator  s8    

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)rD   rE   rF   r9   r9   r9   r:   FakeOperand  s   rB  c                    s   g | ]} |d qS )r5  r9   )r   rK   rB  rL   r9   r:   r8    r   z3Scope.lookup_operator_for_types.<locals>.<listcomp>)ZNodesrA  r@  )r@   rL   r   typesrA  r;  r9   rC  r:   lookup_operator_for_types  s    zScope.lookup_operator_for_typesc                 C   s   |   | d S r=   )r   use_utility_coder@   Znew_coder9   r9   r:   rF    s    zScope.use_utility_codec                 C   s   |   | d S r=   )r   use_entry_utility_coder  r9   r9   r:   rH    s    zScope.use_entry_utility_codec                 C   s   |D ]}|| j v r dS qdS Nr   r   )r   r@   r   rJ   r9   r9   r:   defines_any  s    
zScope.defines_anyc                 C   s*   |D ] }|| j v r| j | jr dS qdS rI  )r   r   rJ  r9   r9   r:   defines_any_special  s    zScope.defines_any_specialc                 C   s   ddl m} | |  d S )Nr   )get_type_inferer)TypeInferencerM  infer_types)r@   rM  r9   r9   r:   rO    s    zScope.infer_typesc                 C   s   | j }|d u rdS | S d S )NF)r   r   )r@   outerr9   r9   r:   r     s    zScope.is_cppc                 C   s   | j ||| d S r=   )r   add_include_file)r@   filenameverbatim_includelater9   r9   r:   rQ    s    zScope.add_include_file)TN)N)N)r   r   r   )NrI   r   r   )NrI   r   r   r   r   )NrI   r   )NrI   r   F)Nr9   r   N)rI   r   r   )NrI   r   r   r   )r   N)Fr   )NrI   r   r   r   r9   NF)F)NF)ArD   rE   rF   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   r}   nogilr2  return_typerA   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  r4  r@  rE  rF  rH  rK  rL  rO  r   rQ  r9   r9   r9   r:   r     s   #



:
  
  
   
$  
6 
  

	
  
P
"r   c                   @   s"   e Zd ZejZdd Zdd ZdS )PreImportScopec                 C   s   t | tjd d  d S r=   )r   rA   r   
pre_importrB   r9   r9   r:   rA     s    zPreImportScope.__init__c                 C   s"   |  ||t|d}d|_d|_|S )NrI   T)r   r   re   rb   r)  r9   r9   r:   r    s    zPreImportScope.declare_builtinN)rD   rE   rF   r	   Zpreimport_cnamenamespace_cnamerA   r  r9   r9   r9   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   sh   t jd u rt| dd d  nt| dt d  i | _t| j D ] \}}|\}}| 	||d | qBd S )N__builtin__)
r   r`  r   rA   r_  
type_namesr   builtin_entriesr   r   )r@   rJ   Z
definitionr8   rK   r9   r9   r:   rA     s    
zBuiltinScope.__init__Nc                 C   s,   |dkr |d u r|dv }|s d}t | |S )Nstr)Nr0   unicode)r   r   )r@   rJ   language_level
str_is_strr9   r9   r:   r     s    zBuiltinScope.lookupc                 C   sL   t t|sH| jd ur"| j||S tjr8t|d|  nt|d| d d S )Nundeclared name not builtin: %sr0   )hasattrbuiltinsr   r  r   error_on_unknown_namesr   r   r	  r9   r9   r:   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   r_   r   *r   )r   r#  rG   r   r   r   re   r`   r   r   r|   )r@   rJ   rK   r8   Zpython_equivr   r   r"  r9   r9   r:   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   r_   boolTr   r
  rK   rJ   rK   rL   r8   )r   r
   ZBuiltinObjectTypeCClassScope
directivesis_final_type	set_scoperd  r   r   rG   rJ   r   rK   rL   typeptr_cnamer   r   re   ra   rw   r`   r   r   cache_builtinsro   r|   )	r@   rJ   r8   r   objstruct_cnamerK   r   r   r"  r9   r9   r:   declare_builtin_type  s4    


z!BuiltinScope.declare_builtin_typec                 C   s   | S r=   r9   rB   r9   r9   r:   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)rK   rq  r#   r$   r   complexbytes	bytearrayrf  rg  tupler   dictr   	frozensetsliceNoneFalseTrue)NN)NN)NN)rD   rE   rF   rU  rA   r   r  rp  rz  r   r   re  r9   r9   r9   r:   rb    s6   
	


rb  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 | _!dD ]}| "t|t#d  q| $t%j&d	dd
 d S )Nr   BuiltinrA   TFrH   r   )	__builtins__rD   __file__r   __path____spec__
__loader____package__
__cached__zPython.h)initial)'rH   r  parent_moduler   r   rA   module_name
is_packager   contextr	   Zmodule_cnameZmoddict_cnameZmodule_dict_cnameZmethtable_cnamemethod_table_cnamer{   Zmoddoc_cnamerq   utility_code_listmodule_entries
c_includesr  rd  Zpxd_file_loadedcimported_modulesr   Ztypes_importedZincluded_filesZhas_extern_classcached_builtinsundeclared_cached_builtinsra  _cached_tuple_typesr   r   process_includer   IncludeCode)r@   rJ   r  r  r  r   var_namer9   r9   r:   rA   s  s@    zModuleScope.__init__c                 C   s   | j S r=   )r  rB   r9   r9   r:   r     s    zModuleScope.qualifying_scopec                 C   s   | S r=   r9   rB   r9   r9   r:   r     s    zModuleScope.global_scopeNc                 C   sn   |  |}|d ur|S |d u r4| jd ur0| jjnd}|d u r\|dkpZ| jd uoZtj| jjv}| jj|||dS )N   r0   )rh  ri  )r   r  rh  r   unicode_literalsZfuture_directivesr   r   )r@   rJ   rh  ri  r   r9   r9   r:   r     s    
zModuleScope.lookupc           
      C   s   t |}z| j| }W n& ty<   t| }| j|< Y n0 |j}| |}|st|}t|D ]\}}|j	d| ||d qb| j
|d d|d||d}	| j|	 |	|_| ||||}||_|S )Nzf%s)rJ   rK   rL   _structr*   T)r   rL   r8   )r~  r  r   r
   Zc_tuple_typer8   r   StructOrUnionScope	enumerater   r   r   removestruct_entryr   r   )
r@   rL   r  ttyper8   r   r   ix	componentr  r9   r9   r:   r    s&    
zModuleScope.declare_tuple_typec                 C   s4  t t|sx|tjvrx|tjvrx| jr6| |t|}|S tj	rLt
|d|  nt|d| d | |d t|d}d|_|S tjr| jD ]}|j|kr|  S q|dkr| js| jdS | d d t|d}tjr|tjvrd|_d|_||_tj| |_| j| | j| nd|_||_|  ||_|S )Nrj  r0   rI   r   globalsZ__Pyx_Globals)rk  rl  r   Znon_portable_builtins_mapZuncachable_builtinshas_import_starr   r   r   rm  r   r   r   r`   rx  r  rJ   old_style_globalsr   r   ro   r	   Zbuiltin_prefixr8   r   r  r   r   r   r)  r9   r9   r:   r    s@    



zModuleScope.declare_builtinr   c                 C   sh   d }d}|d ur:|dkr:| }|dkrL|rL|j }|d8 }qn|dkrL| j }d}|  }|jj||||dS )NFr   r   T)relative_torL   absolute_fallback)r  r   r  find_module)r@   r  rL   Zrelative_levelr  r  Zmodule_scoper9   r9   r:   r    s    zModuleScope.find_modulec                 C   sX   d|v r| dd\}}nd }| |}|sFt|| | jd}|| j|< |rT||}|S )Nr   r   )r  r  )splitlookup_submoduler  r  r  find_submodule)r@   rJ   	submoduler   r9   r9   r:   r    s    


zModuleScope.find_submodulec                 C   sF   d|v r| dd\}}nd }| j|d }|rB|d urB||}|S )Nr   r   )r  r  r.  r  )r@   rJ   r  moduler9   r9   r:   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.
        )rT  N)r   r  r  )r@   rR  rS  rT  incr9   r9   r:   rQ    s    zModuleScope.add_include_filec                 C   s4   |  }|du r| }|| j| | j| }dS )a  
        Add `inc`, which is an instance of `IncludeCode`, to this
        `ModuleScope`. This either adds a new element to the
        `c_includes` dict or it updates an existing entry.

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

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

        One `IncludeCode` object can contain multiple pieces of C code:
        one optional "main piece" for the include file and several other
        pieces for the verbatim code. The `IncludeCode.dict_update`
        method merges the pieces of two different `IncludeCode` objects
        if needed.
        N)Z	mainpieceZsortkeyZdict_updater  )r@   r  r   r9   r9   r:   r    s
    zModuleScope.process_includec                 C   sJ   || j vrF|j D ]}| | q| j | |j D ]}| | q6d S r=   )r  r  valuesr  r   add_imported_module)r@   r   r  mr9   r9   r:   r  >  s    

zModuleScope.add_imported_modulec                 C   s6   |j rd|_|| jvr"|| j|< nt|d| d d S )NTr   r   )rb   re   r   r   )r@   rJ   r   rL   r9   r9   r:   add_imported_entryF  s
    
zModuleScope.add_imported_entryc                 C   s\   |  |}|r4|jr"|j|u r"|S |jr.|jrH|S n| |t|}d|_||_| | |S )Nr   )r   rb   r~   r   r   re   r  )r@   rJ   r   rL   r   r9   r9   r:   declare_moduleO  s    

zModuleScope.declare_modulerI   c	                 C   sR  |dvrt |d|  |s:|tu 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)rI   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   rI   Tr8   r_   r   r  r  )r   r   r   is_pyobjectis_extension_typer   r   r	   r  r   r   rK   r  r_   r   r8   r   r   r   ra   declaration_valuerM   r   r   rb   r   Zcimport_from_pyxr   )r@   rJ   rK   rL   r8   r_   r   r  r  r   r   mangled_cnamer9   r9   r:   r   h  sR    





zModuleScope.declare_varr9   c                 C   s   |sd|	v 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.rI   )r8   r_   r   r  r   r  r   r   )r   r   r	   r  Zoptional_arg_countr   r   r   r_   r  r8   rx   r   r#  )r@   rJ   rK   rL   r8   r_   r   r  r   r  r   r   r   r  r9   r9   r:   r#    s.    




zModuleScope.declare_cfunctionc                 C   s    |  |}|s| |t| d S r=   r/  r)  r9   r9   r:   declare_global  s    
zModuleScope.declare_globalc                 C   s   |d ur| j | d S r=   )r  r   rG  r9   r9   r:   rF    s    zModuleScope.use_utility_codec                 C   s8   |d u rd S |j r | j|j  |jr4| j|j d S r=   )r   r  r   r   r  r9   r9   r:   rH    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urt	|d |r|js||_|r|rt
j||||
dk|d}||_||_|d u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'r0   r   r   )
check_size)r_   r   r   Tz5Object name required for 'public' or 'extern' C class)rJ   r   r_   zC class '%s' already definedz C class '%s' already implementedr   rI   z&Class '%s' previously declared as '%s'z4Object struct name differs from previous declarationz2Type object name differs from previous declarationfinal)+r   r   rK   rl   r  r   definedr   r   r   r
   ZPyExtensionTyperL   buffer_defaultsobjtypedef_cnamer  r   rw  r   r	   Ztypeptr_prefixr   rm   ry  r}   Zobjstruct_prefixattach_var_entry_to_c_classr   r   rs  rt  copydeclare_inherited_c_attributesrv  r   implementedr   r_   r   typeobj_cnamer.  ru  r   )r@   rJ   rL   r   Zimplementingr  r   ry  r  rw  r_   r   r   r  r  r   r  r   rK   r   r9   r9   r:   declare_c_class  s    








zModuleScope.declare_c_classc                 C   s   |j }|jr*|jjr*dtj|jjf |_nV|jr|jjrt|jj}|j}|rx|jrx|t|jjkrfqx|jrpd S |j}qJtj|_|jr| 	tj
|j|_| 	tj|j|_d S r   )rK   r   vtabslot_cnamer	   obj_base_cnamer   r   r   is_builtin_typer   Zvtabstruct_prefixrJ   Zvtabstruct_cnameZvtabptr_prefixZvtabptr_cname)r@   r   rK   Zentry_countr   r9   r9   r:   allocate_vtable_names>  s$    

z!ModuleScope.allocate_vtable_namesc                 C   s*   | j D ]}|jjst|jd|j  qd S )N(C class '%s' is declared but not defined)r   rK   r   r   rL   rJ   r  r9   r9   r:   check_c_classes_pxd[  s    
zModuleScope.check_c_classes_pxdc                 C   s   |j }|j}|j}|js(t|jd|  |dkrF|jsF| tj	||_|jrx|jj
D ]"}|jsT|jsTt|jd|j  qT|jr| tj|j|_d S )Nr  r   z)C method '%s' is declared but not defined)rK   rJ   r_   r   r   rL   r  r   r	   Ztypeobj_prefixr   r   rx   r  Zvtable_prefixZvtable_cname)r@   r   rK   rJ   r_   Zmethod_entryr9   r9   r:   check_c_classk  s    zModuleScope.check_c_classc                 C   s^   d}|rt d| j  | jD ]<}|rNt d|j|f  t d|j t d|j | | qd S )Nr   z&Scope.check_c_classes: checking scope z...entry %s %sz......type = z......visibility = )printr   r   rJ   rK   r_   r  )r@   Zdebug_check_c_classesr   r9   r9   r:   check_c_classes  s    
zModuleScope.check_c_classesc                 C   sT   | j  D ]D\}}|jr
|jr
|j| u r
|jdkr
|js
|js
t|j	d|  q
d S )Nr   r  )
r   r   rf   r   r   r_   r}   r   r   rL   r0  r9   r9   r:   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   r  rr  )rH   r  rG   rJ   Z	type_typerL   rK   rw  r   re   ra   rw   r   r|   )r@   r   r  r"  r9   r9   r:   r    s    z'ModuleScope.attach_var_entry_to_c_classc                 C   s   | j S r=   )cpprB   r9   r9   r:   r     s    zModuleScope.is_cppc                 C   s   ddl m} | |  d S )Nr   )PyObjectTypeInferer)rN  r  rO  )r@   r  r9   r9   r:   rO    s    zModuleScope.infer_types)NN)r   )NF)NrI   r   r   r   )NrI   r   r   r   r9   NF)r   r   NNNNNrI   r   r   NNr   )#rD   rE   rF   r\  r  Zis_cython_builtinr  rA   r   r   r   r  r  r  r  r  rQ  r  r  r  r  r   r#  r  rF  rH  r  r  r  r  r  r  r  r   rO  r9   r9   r9   r:   r  U  sR   &
%

		  
9  
     
p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 u r|}t | ||| d S r=   r   rA   )r@   rJ   r   r   r9   r9   r:   rA     s    zLocalScope.__init__c                 C   s   || S r=   r9   r   r9   r9   r:   r     s    zLocalScope.manglec                 C   sH   |  tj|}| ||||d}d|_|jr2d|_d|_| j	| |S )NrI   r   0)
r   r	   r  r   re   r  rM   rr   r   r   )r@   rJ   rK   rL   r8   r   r9   r9   r:   declare_arg  s    zLocalScope.declare_argrI   r   c	           
      C   sb   |dv rt |d|  tj| ||||||||d	}	|	jjrD|	jj|	_d|	_| j|	_| j	
|	 |	S )Nr   readonlyz$Local variable cannot be declared %sr  r   )r   r   r   rK   r  rM   rs   _in_with_gil_blockr   r   r   r  r9   r9   r:   r     s    
zLocalScope.declare_varc                 C   s4   |  |rt|dd n|  |}|| j|< d S Nr   r   r   r   r   r1  r   r)  r9   r9   r:   r    s    
zLocalScope.declare_globalc                 C   s`   |  |}|r6|j| u r6|js6t|d|  |  n&| |}|d u sN|js\t|d|  d S Nz'%s' redeclared as nonlocalz"no binding for nonlocal '%s' found)r   r   ru   r   rU   r   r@   rJ   rL   Z
orig_entryr   r9   r9   r:   declare_nonlocal  s    


zLocalScope.declare_nonlocalc                 C   sr   t | |}|d urn|j}|jr(|j}q|| urn|jrnt|jdrJtdd|_t	|| }d|_
|| j|< |S |S )NZscope_classz#lookup() after scope class created.T)r   r   r   rY  r   rX  rk  r   rt   r   re   r   )r@   rJ   r   Zentry_scopeZinner_entryr9   r9   r:   r     s    

zLocalScope.lookupc                 C   s   |   D ]}|j D ]r}|jrh|jj}| jr6||_q|tj	rX|t
tj	d d  }d||f |_q|jr|j|_dtj	|jf |_qqd S )Nr0   z%s->%s)r   r   r  ru   r   r8   rZ  r4   r	   Zcur_scope_cnamer   rt   Zoriginal_cname)r@   Zouter_scope_cnamer   r   r8   r9   r9   r:   mangle_closure_cnames  s    z LocalScope.mangle_closure_cnames)N)NrI   r   r   r   )rD   rE   rF   Zhas_with_gil_blockr  rA   r   r  r   r  r  r   r  r9   r9   r9   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   |}|j r|j}q| tj}t| ||| |j| _dtj	t
||f | _|j sb|jsb|jrj|j}qP|j| _|j|  d S )Nz%s%d%s)rY  r   r   r   r	   Zgenexpr_id_refr   rA   rt  r5   r   genexp_prefixrW  rV  r   r   r   add)r@   r   r   rJ   r9   r9   r:   rA   ,  s    z!GeneratorExpressionScope.__init__c                 C   s   d| j | j||f S N%s%s)r  r   r   r   r9   r9   r:   r   =  s    zGeneratorExpressionScope.mangleNrI   r   c	                 C   s   |t u r$| j|}	|	r$|	jr$|	j}d| j| jtj	|p>| 
 f }| |||||}
d|
_| jjrnd|
_nd|
_d|
_| j|
 |
| j|< |
S )Nr  T)r   r   r   re   rK   r  r   r   r	   r  r   r   r\  ra   rs   rv   r   r   r   )r@   rJ   rK   rL   r8   r_   r   r  r  r   r   r9   r9   r:   r   @  s    
"
z$GeneratorExpressionScope.declare_varFc                 C   s   | j |||S r=   )r   r  r@   rJ   rL   r  r9   r9   r:   r  V  s    z+GeneratorExpressionScope.declare_pyfunctionc                 C   s   | j ||S r=   )r   r  )r@   rx   rL   r9   r9   r:   r  Z  s    z0GeneratorExpressionScope.declare_lambda_functionc                 C   s   | j |S r=   )r   r  r  r9   r9   r:   r  ]  s    z'GeneratorExpressionScope.add_lambda_def)NrI   r   r   T)F)rD   rE   rF   r   rY  rA   r   r   r  r  r  r9   r9   r9   r:   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 r  )r   rA   r	   Zclosure_scope_prefixZclosure_cname)r@   rJ   Z
scope_namer   r   r9   r9   r:   rA   e  s    zClosureScope.__init__Fc                 C   s   t j| |||ddS )NrI   r
  )r   r  r  r9   r9   r:   r  r  s    zClosureScope.declare_pyfunction)N)F)rD   rE   rF   rX  rA   r  r9   r9   r9   r:   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 r=   r  r   r9   r9   r:   rA   y  s    zStructOrUnionScope.__init__NrI   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 )NrI   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)r;   rf   r
   r   r   re   r   r   r  r   r   )r@   rJ   rK   rL   r8   r_   r   r  r  Zallow_pyobjectZallow_memoryviewr   r9   r9   r:   r   |  s     



zStructOrUnionScope.declare_varr9   c                 C   s"   |
rt |d | j|||||dS )Nz0C struct/union member cannot be declared 'cpdef'r  )r   r   )r@   rJ   rK   rL   r8   r_   r   r  r   r  r   r9   r9   r:   r#    s
    

z$StructOrUnionScope.declare_cfunction)r  )NrI   r   r   r   FF)NrI   r   r   r   r9   F)rD   rE   rF   rA   r   r#  r9   r9   r9   r:   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 r=   )r   rA   
class_namer{   r@   rJ   r   r9   r9   r:   rA     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_ClassMethodrH   r   ZClassMethodzCythonFunction.cr   )r   r   rG   r
   Z	CFuncTyper   CFuncTypeArgr   UtilityCodeZload_cachedr   rH  rf   r0  r9   r9   r:   r     s     
zClassScope.lookupN)rD   rE   rF   rA   r   r9   r9   r9   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
   |  |S r=   )mangle_special_namer   r9   r9   r:   r     s    z&PyClassScope.mangle_class_private_namec                 C   s4   |r0| dr0|ds0td| jd|f }|S )Nr1   z_%s%s_)r4   endswithr   r  lstripr   r9   r9   r:   r    s    z PyClassScope.mangle_special_namec                 C   s   |  |}t| |S r=   )r  r  r   r   r9   r9   r:   r     s    
zPyClassScope.lookup_hereNrI   r   c	           
      C   sB   |  |}|tu rt}tj| ||||||||d	}	d|	_d|	_|	S )Nr  r   )r  r   r   r   r   rb   rd   r  r9   r9   r:   r     s    
zPyClassScope.declare_varc                 C   sf   |  |}|r6|j| u r6|js6t|d|  |  n,| |}|d u rXt|d|  n
|| j|< d S r  )r   r   ru   r   rU   r   r   r  r9   r9   r:   r    s    


zPyClassScope.declare_nonlocalc                 C   s4   |  |rt|dd n|  |}|| j|< d S r  r  r)  r9   r9   r:   r    s    
zPyClassScope.declare_globalc                 C   s   | j |S r=   )r   add_default_value)r@   rK   r9   r9   r:   r    s    zPyClassScope.add_default_value)NrI   r   r   r   )rD   rE   rF   rV  r   r  r   r   r  r  r  r9   r9   r9   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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 )&rs  r   Fc                 C   sF   t | || |dkr6|tj|| _|tj|| _g | _g | _	d S )Nr   )
r  rA   r   r	   Zmethtab_prefixr  Zgstab_prefixZgetset_table_cnameproperty_entriesinherited_var_entries)r@   rJ   r   r_   r9   r9   r:   rA     s    zCClassScope.__init__c                 C   sN   | j r| jddsdS | jj}|r8|jd ur8|j S | jjrJ| jj S dS )NZno_gcFT)	has_cyclic_pyobject_attrsrt  r.  parent_typer   r   needs_gcr  is_gc_simple)r@   r   r9   r9   r:   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  rt  r.  rB   r9   r9   r:   needs_tp_clear*  s    zCClassScope.needs_tp_clearTc                 C   s   g }g }g }| j D ]b}|jjrJ|s2| js2|jdkrt|s>|jjst|| q|jtjkrb|| q|jj	r|| q|p|p|}||||ffS )Nr2   )
r   rK   r  is_closure_class_scoperJ   r  r   r
   Zc_py_buffer_typer   )r@   Zinclude_weakrefZinclude_gc_simpleZpy_attrsZ
py_buffersZmemoryview_slicesr   Zhave_entriesr9   r9   r:   get_refcounted_entries1  s    
z"CClassScope.get_refcounted_entriesNrI   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	vrt|d
|  |dv rNd|	_| js*|dkr*t|d |jsT|| sTt|d|  nd|	_|	S |tu 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.rI   r   z#include <new>r   Tr2   )rI   r   r  z1Attribute of extension type cannot be declared %sr  z9Special attribute __weakref__ cannot be exposed to Pythonz7C attribute of type '%s' cannot be accessed from PythonFr  z(PyObject *)%s)"r  r   r  r   r;   rn   r  rF  r   r  r   re   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   rc   rb   r  rw  ra  r  r9   r9   r:   r   D  sn    



zCClassScope.declare_varc                 C   s   |t v r"| drLt|d|  n*|dkrLt D ]}| |r.t|d|  q.|dkr^t|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   r
  r   r   )r   r   r   r   r   r   r  r   r   r   r   )r@   rJ   rL   r  r?  r   Zspecial_sigr9   r9   r:   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   rh   r  r  ru  r0  r9   r9   r:   r     s    
zCClassScope.lookup_herer9   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 u 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|	v 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)r   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.r0   rT   r   )r_   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_fromrK   r   r;   rf   r   rx   ri   r   Zsame_c_signature_asr]  r  r  r  r  Z!same_c_signature_as_resolved_typer  rL   r  r   r	   r  r   r   rj   ru  rt  r.  rz   )r@   rJ   rK   rL   r8   r_   r   r  r   r  r   r   r   r   r9   r9   r:   r#    sp    


"


zCClassScope.declare_cfunctionc           
   
   C   s4   |  |}tj| |||||||d}	d|	_||	_|	S )Nr'  r   )r   r  r  rg   r   )
r@   rJ   rK   rL   r8   r_   r  r'  r   r   r9   r9   r:   r    s    
zCClassScope.add_cfunctionc                 C   sT   t |}| j||d |d|d}t||t}||_d|_d|_||_|j|_||_	|S )Nr   rn  r   )
r   r#  rG   r   r   re   r`   r   r   r|   )r@   rJ   rK   r8   r   r   r"  r9   r9   r:   rp    s    z%CClassScope.declare_builtin_cfunctionc                 C   s^   |  |}|d u r$| ||t|d}d|_||_t||  | d|_| j|j_| j	
| |S )NrI   r   )r   r   )r   r   r   rp   r{   PropertyScoper   r   r  r  r   )r@   rJ   r{   rL   r   r9   r9   r:   declare_property	  s    

zCClassScope.declare_propertyc              
      s   fdd}|j |j }|D ]2 |  j| j jd d}d|_| j | q|jd d  D ]  jj	r^ j
  q^|jD ]  j} j}|o|j}|s||}| j j j j| j jdd}d|_ jrd|_ j|_| j|jks|jr j|_|r
d|_||_ jr| j|_q|d S )Nc                    s   dt j jf S r   )r	   r  r8   r7   
base_entryr9   r:   adapt	  s    z9CClassScope.declare_inherited_c_attributes.<locals>.adaptrI   r   Tr  )r  r   r   rJ   r8   rK   re   r   r   r$  Z"get_all_specialized_function_typesr|   r`   r  rL   r_   ry   r   ri   rj   r   rz   rh   r   )r@   
base_scoper
  r   r   r8   r"  r`   r9   r  r:   r  	  sF    


z*CClassScope.declare_inherited_c_attributes)FT)NrI   r   r   r   )F)NrI   r   r   r   r9   NF)F)N)rD   rE   rF   rW  r  r  r   r  r  r  r  rA   r  r  r  r   r  r   r#  r  rp  r  r  r9   r9   r9   r:   rs    s4     
  
>
  
>
	
rs  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   sR   t | ||d  |j| _g | _|d urN|D ]"}| ||t|d d}d|_q*d S )Nr   r   )r   rA   rt  r  r   r
   ZTemplatePlaceholderTyperl   )r@   rJ   r   r   TZtemplate_entryr9   r9   r:   rA   C	  s    zCppClassScope.__init__r   r   c
                 C   s   |s|}|  |}
|	rb|
d u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 )Nr  r   z%s::%sr   r   )r   rK   r  r  r  rf   r  r   r   re   Zget_fused_typesZempty_declaration_coderx   r   r   )r@   rJ   rK   rL   r8   r_   r   r  r  r   r   r9   r9   r:   r   M	  s"    

zCppClassScope.declare_varr9   Fc                    s$  | j dd }||dfv rh|d u rhdtj|f }d}t |_|j|_dd   fdd	|jD |_n,|d
kr|d u rdtj|f }d}t |_|dv r|j	r| j
jD ]2}|j|}|r|j
j	st|d t|jd q| |}| j||||||d}|r|s| |_|
|_||_|S )Nz::r   rA   z%s__init__%sr   c                 S   s2   | j jr*| j js*t| jt| j | jS | S d S r=   )rK   rn   Zis_referencer
   r  rJ   Z
c_ref_typerL   )r7  r9   r9   r:   	maybe_refq	  s
    z2CppClassScope.declare_cfunction.<locals>.maybe_refc                    s   g | ]} |qS r9   r9   r6  r  r9   r:   r8  w	  r   z3CppClassScope.declare_cfunction.<locals>.<listcomp>Z__dealloc__z%s__dealloc__%s<del>r   r  zdConstructor cannot be called without GIL unless all base constructors can also be called without GILzBase constructor defined here.)r   r8   r_   )rJ   r  r	   r  r
   Z	CVoidTyper^  r   Zoriginal_argsr]  rK   r   r   r   r   rL   r   r   rW   rN   r   r   )r@   rJ   rK   rL   r8   r_   r   r  r   r  r   r   r  baser	  r   r   r9   r  r:   r#  f	  s8    





zCppClassScope.declare_cfunctionc                 C   s  |j }|}t|dd r|j}q
t|dd r<dd |jD }nd}|j|j D ]R}|jdv r\qL|j| jv rn|j | |j|j	|j
d d}d|_d|_| j| qL|jD ]2}| j|j|j
|j|j	|jd	|j|jd
}d|_q|jD ]0}|j|vr| |j|j
|j|j	|j}d|_qd S )Ntemplate_typer   c                 S   s   g | ]
}|j qS r9   r   )r   r  r9   r9   r:   r8  	  r   zBCppClassScope.declare_inherited_cpp_attributes.<locals>.<listcomp>r9   r  r   r   r   )r   r  r   )r   r   r  r   r  r   rJ   r   r   r8   rK   re   r   r   r   r#  rL   r_   ry   r   r   r   )r@   r   r  r  Zbase_templatesr	  r   r9   r9   r:   r   	  sD    




z.CppClassScope.declare_inherited_cpp_attributesc              	   C   s   t | j| j}||_| j D ]}|jrL|j|j|j||j	|j
dd q|jjr| D ](}|j|j|j||j	|j
|jd q\q||j|j||j	|j
|j q|S )Nr   )r   )r   )r  rJ   r   rK   r   r  rl   r   r3  rL   r8   rf   rW   r#  r   r   r_   )r@   r  Z
type_entryr   r   r   r9   r9   r:   r3  	  s2    



zCppClassScope.specialize)N)Nr   r   r   r   r   )Nr   r   r   r   r9   NF)rD   rE   rF   r   Zdefault_constructorrK   rA   r   r#  r   r3  r9   r9   r9   r:   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 )NrI   r   zKOnly __get__, __set__ and __del__ methods allowed in a property declaration)r   r   r   r   r  r   )r@   rJ   rL   r  r  r   r9   r9   r:   r  	  s    
z PropertyScope.declare_pyfunctionN)F)rD   rE   rF   r[  r  r9   r9   r9   r:   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   rA   rJ   r   r   const_base_type_scope)r@   r  r9   r9   r:   rA   	  s    zCConstScope.__init__c                 C   s4   | j |}|d ur0t|}t|j|_|S d S r=   )r  r   r  r
   Zc_const_typerK   r0  r9   r9   r:   r   	  s
    
zCConstScope.lookup_hereN)rD   rE   rF   rA   r   r9   r9   r9   r:   r  	  s   r  c                   @   s   e Zd Zdd ZdS )TemplateScopec                 C   s   t | ||d  |j| _d S r=   )r   rA   rt  r  r9   r9   r:   rA   	  s    zTemplateScope.__init__N)rD   rE   rF   rA   r9   r9   r9   r:   r  	  s   r  )3
__future__r   r   r  r   rc  rl  ImportErrorZErrorsr   r   r   ZStringEncodingr   rH   r   r	   r
   r   r   Z	TypeSlotsr   r   r   r   r   r   r   r   r6   r;   objectr<   rG   r   r   r_  rb  Zconst_counterr  r   r  r  r  r  r  rs  r  r  r  r  r9   r9   r9   r:   <module>   sf   		 :#     At    pd<&#<  B 