B
    Í‹dÆ+ ã               @   s   d dl mZ d dlZejeeeeeeeeeed
 d dlmZ d dlZd dlZd dl	Z	d dl
Z
ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddl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mZmZ ddlmZm Z  ddl!m"Z" ddlm#Z# dd„ Z$dd„ Z%dd„ Z&G dd„ dej'ej(ƒZ)G dd „ d eƒZ*d!d"„ Z+e ,d#d$¡Z-ed%d&d'd(Z.e ,d)¡Z/dS )*é    )Úabsolute_importN)
ÚNamingÚOptionsÚ
PyrexTypesÚ	TypeSlotsÚerrorÚwarningÚpy_object_typeÚUtilityCodeÚEncodedStringÚre)Údefaultdicté   )ÚCPtrType)ÚFuture)ÚAnnotate)ÚCode)r   )ÚNodes)r   )r   )r   )ÚPythran)r   r   )r	   é   )Úopen_new_fileÚreplace_suffixÚdecode_filenameÚbuild_hex_version)r
   ÚIncludeCode)r   )Úhas_np_pythranc             C   s   | j  ¡  | S )N)ÚscopeZcheck_c_classes_pxd)Úmodule_node© r   úg/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/Cython/Compiler/ModuleNode.pyÚcheck_c_declarations_pxd$   s    
r    c             C   s   | j  ¡  | j  ¡  | S )N)r   Zcheck_c_classesZcheck_c_functions)r   r   r   r   Úcheck_c_declarations)   s    

r!   c             C   s0   t js|jrd}n|j}tj|| jd |jdS )NFÚemit_code_comments)Úemit_linenumsr"   Úc_line_in_traceback)r   Úannotater#   r   ZCCodeConfigÚ
directivesr$   )ÚenvÚoptionsr#   r   r   r   Úgenerate_c_code_config/   s    r)   c               @   s  e Zd ZdgZdZdÁdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdÂd5d6„Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgdh„ Z6didj„ Z7dkdl„ Z8dmdn„ Z9dodp„ Z:dqdr„ Z;dsdt„ Z<dudv„ Z=dwdx„ Z>dydz„ Z?d{d|„ Z@d}d~„ ZAdd€„ ZBdd‚„ ZCdƒd„„ ZDd…d†„ ZEd‡dˆ„ ZFd‰dŠ„ ZGd‹dŒ„ ZHddŽ„ ZIdd„ ZJd‘d’„ ZKd“d”„ ZLd•d–„ ZMd—d˜„ ZNd™dš„ ZOd›dœ„ ZPddž„ ZQdŸd „ ZRd¡d¢„ ZSd£d¤„ ZTd¥d¦„ ZUd§d¨„ ZVd©dª„ ZWd«d¬„ ZXd­d®„ ZYd¯d°„ ZZd±d²„ Z[d³d´„ Z\dµd¶„ Z]d·d¸„ Z^d¹dº„ Z_dÃd»d¼„Z`d½d¾„ Zad¿dÀ„ ZbdS )ÄÚ
ModuleNodeÚbodyNFc             C   sÂ   t | jtjƒst‚t |tjƒr0| jj |j¡ n| jj |¡ | jj	 |j	¡ x|j
 ¡ D ]}| j |¡ qZW dd„ }|| jj|jƒ |r¾x&|jD ]}| j|j_d|jjjd< q’W | j |¡ d S )Nc             S   s$   x|D ]}|| kr|   |¡ qW d S )N)Úappend)ZL1ZL2Úxr   r   r   Úextend_if_not_in]   s    
z-ModuleNode.merge_in.<locals>.extend_if_not_inTZinternal)Ú
isinstancer+   r   ZStatListNodeÚAssertionErrorÚstatsÚextendr,   r   Úutility_code_listÚ
c_includesÚvaluesZprocess_includeÚincluded_filesÚc_class_entriesÚfull_module_nameÚtypeÚmodule_namer&   Úmerge_in)ÚselfÚtreer   Zmerge_scopeÚincr.   Úentryr   r   r   r;   I   s    	
zModuleNode.merge_inc             C   s¢   t |ƒrt |¡ | jr$| jd |_tjs8d  |_| _nRtjr‚t	dt
 | j¡ ƒ|_| jd k	rŠt	|jd | j ƒ|_| jj|j_n| j|_| j|_| j |¡ d S )NÚold_style_globalszFile: %s (starting at line %s)Ú
)r   r   Zinclude_pythran_genericr&   r@   r   Z
docstringsÚdocZembed_pos_in_docstringr   r   Zrelative_positionÚposÚencodingr+   Úanalyse_declarations)r<   r'   r   r   r   rE   l   s    

zModuleNode.analyse_declarationsc             C   s`   | j }|jr|  |¡ xDt|j ¡ ƒD ]2\}}|jr&|j |kr&|jr&|jj	r&|j 
|¡ q&W d S )N)r   Úhas_import_starÚ*create_import_star_conversion_utility_codeÚsortedÚentriesÚitemsÚcreate_wrapperÚis_typer9   Úis_enumZcreate_type_wrapper)r<   r'   Únamer?   r   r   r   Úprepare_utility_code~   s    
zModuleNode.prepare_utility_codec             C   s\   | j }tj|_g | _|  || ji ¡ |  |¡ |  |||¡ |  |||¡ |  	|||¡ d S )N)
r   r   Zc_void_typeÚreturn_typeÚreferenced_modulesÚfind_referenced_modulesÚsort_cdef_classesÚgenerate_c_codeÚgenerate_h_codeÚgenerate_api_code)r<   r(   Úresultr'   r   r   r   Úprocess_implementation‰   s    
z!ModuleNode.process_implementationc             C   s.   x(| j D ]}x|jD ]}|jrdS qW qW dS )Nr   r   )rQ   Úcfunc_entriesÚdefined_in_pxd)r<   Úmoduler?   r   r   r   Úhas_imported_c_functions“   s
    z#ModuleNode.has_imported_c_functionsc             C   s¤  ddd„}||j dd}||jƒ}||jƒ}||jƒ}|sH|sH|sH|r t|jdƒ|_t ¡ }	t	||ƒ}
t 
|	| |
¡ |jr˜t|jdƒ|_t |j¡}nd }|	 ¡  tj|  |¡ }|	 |¡ |	 d¡ |	 d	¡ |  ||	¡ |jrò|  |g |	¡ |	 d¡ tj|  |¡ }|	 d
| ¡ |	 d¡ |  |	¡ |	 d¡ |  |	¡ |r„|	 d¡ x0|D ](}|  |j|	¡ |rX|  |j|¡ qXW |r²|	 d¡ x|D ]}|  ||	|¡ qšW |rà|	 d¡ x|D ]}|  ||	|¡ qÈW |	 d¡ |	 d| ¡ |	 d¡ |	 d¡ |	 d¡ |	 d¡ |	 d¡ |	 d|j ¡ |	 d¡ |	 d|  d|¡ ¡ |	 d¡ |	 d¡ |	 d| ¡ t |jƒ}z|	 !|¡ W d | "¡  X d S )Nr   c                s   ‡ ‡fdd„| D ƒS )Nc                s.   g | ]&}|j d ks&ˆ r|js&ˆr|jr|‘qS )Úpublic)Ú
visibilityÚapirZ   )Ú.0r?   )r_   Úpxdr   r   ú
<listcomp>œ   s    

zAModuleNode.generate_h_code.<locals>.h_entries.<locals>.<listcomp>r   )rI   r_   ra   r   )r_   ra   r   Ú	h_entries›   s    z-ModuleNode.generate_h_code.<locals>.h_entriesr   )r_   z.hz.pxiÚ z#include "Python.h"z
#ifndef %sz#endif /* !%s */zP/* WARNING: the interface of the module init function changed in CPython 3.5. */zK/* It now returns a PyModuleDef instance instead of a PyModule instance. */z#if PY_MAJOR_VERSION < 3zPyMODINIT_FUNC init%s(void);z#elsezPyMODINIT_FUNC %s(void);ÚPyInitz#endif)r   r   )#Útype_entriesÚvar_entriesrY   r7   r   Úc_fileÚh_filer   ÚCCodeWriterr)   ÚGlobalStateZgenerate_pxiZi_fileZPyrexCodeWriterÚput_generated_byr   Úh_guard_prefixÚapi_nameÚput_h_guardÚputlnÚgenerate_type_header_codeZcapi_reexport_cincludesÚgenerate_includesÚapi_guard_prefixÚ"generate_extern_c_macro_definitionÚgenerate_dl_import_macroÚgenerate_cclass_header_coder9   Úgenerate_cclass_include_codeÚgenerate_public_declarationr:   Úmod_init_func_cnamer   ÚcopytoÚclose)r<   r'   r(   rW   rc   Zh_typesZh_varsZh_funcsZh_extension_typesÚh_codeÚc_code_configÚi_codeZh_guardÚ	api_guardr?   Úfr   r   r   rU   š   sx    




























zModuleNode.generate_h_codec             C   sB   |  dtj|j |j¡f ¡ |r>|  d|jj|jdd ¡ d S )Nz%s %s;zcdef extern %sr   )Úpyrex)rp   r   Úextern_c_macror9   Údeclaration_codeÚcname)r<   r?   r|   r~   r   r   r   rx   à   s    z&ModuleNode.generate_public_declarationc             C   s   |j  dd¡S )NÚ.Ú__)Úqualified_nameÚreplace)r<   r'   r   r   r   rn   è   s    zModuleNode.api_namec          	   C   sâ  d&dd„}||j ƒ}||jƒ}||jƒ}|s6|s6|rÞt|jdƒ|_t ¡ }t||ƒ}	t 	|| |	¡ | 
¡  tj|  |¡ }
| |
¡ | d¡ | d¡ | d¡ | d¡ |jrÌ| d	tj |j¡ ¡ |r| d
¡ x8|D ]0}|j}| d|j ¡ | d|j|jf ¡ qâW |rx| d
¡ xP|D ]H}t|jƒ}| tj|j¡}| d| |¡ ¡ | d|j|f ¡ q,W |rÚ| d
¡ xP|D ]H}t|jƒ}| tj|j¡}| d| |¡ ¡ | d|j|f ¡ qŽW | t dd¡d ¡ |r| t dd¡d ¡ |r(| t dd¡d ¡ |rZ| t dd¡d ¡ | t dd¡d ¡ | d
¡ | d|  |¡ ¡ | d¡ | d|j  ¡ | d¡ xB|D ]:}| tj|j¡}|j !¡ }| dtj"|j||f ¡ q¢W xB|D ]:}| tj|j¡}|j #¡ }| dtj"|j||f ¡ qæW t$||j did*}x"|D ]}| j%|j||dd q>W W d Q R X | d¡ | d ¡ | d!¡ | d"¡ | d#¡ | d$¡ | d
¡ | d%|
 ¡ t&|jƒ}z| '|¡ W d | (¡  X d S )'Nr   c                s   ‡ fdd„| D ƒS )Nc                s    g | ]}|j sˆ r|jr|‘qS r   )r_   rZ   )r`   r?   )ra   r   r   rb   í   s    zEModuleNode.generate_api_code.<locals>.api_entries.<locals>.<listcomp>r   )rI   ra   r   )ra   r   Úapi_entriesì   s    z1ModuleNode.generate_api_code.<locals>.api_entriesz_api.hz#ifdef __MINGW64__z#define MS_WIN64z#endifz#include "Python.h"z#include "%s"rd   zstatic PyTypeObject *%s = 0;z#define %s (*%s)zstatic %s = 0;z#define %s %sZPyIdentifierFromStringzImportExport.cÚVoidPtrImportr   ÚFunctionImportÚ
TypeImportzstatic int import_%s(void) {zPyObject *module = 0;z%module = PyImport_ImportModule("%s");zif (!module) goto bad;zTif (__Pyx_ImportFunction_%s(module, "%s", (void (**)(void))&%s, "%s") < 0) goto bad;zKif (__Pyx_ImportVoidPtr_%s(module, "%s", (void **)&%s, "%s") < 0) goto bad;r[   )Úimported_modulesz	goto bad;)Ú
error_codezPy_DECREF(module); module = 0;z	return 0;zbad:zPy_XDECREF(module);z
return -1;Ú}z#endif /* !%s */)r   ))rg   rY   r7   r   rh   Zapi_filer   rj   r)   rk   rl   r   rs   rn   ro   rp   ri   ÚosÚpathÚbasenamer9   Útypeptr_cnameÚtypeobj_cnamer   ÚmangleZfunc_prefix_apirN   rƒ   Zvarptr_prefix_apiÚputr
   Úload_as_stringr‡   Úsignature_stringÚ	cyversionÚempty_declaration_codeÚModuleImportGeneratorÚgenerate_type_import_callr   rz   r{   )r<   r'   r(   rW   r‰   Zapi_varsZ	api_funcsZapi_extension_typesr|   r}   r   r?   r9   r„   ÚsigÚimport_generatorr€   r   r   r   rV   ë   sž    

























$







zModuleNode.generate_api_codec             C   s$   |  dtjt dd¡|jf ¡ d S )Nz	%s %s %s;ÚPyTypeObjectÚ	DL_IMPORT)rp   r   r‚   r   Úpublic_declr”   )r<   r9   r|   r   r   r   rv   B  s    
z&ModuleNode.generate_cclass_header_codec             C   sl   |  d|j|jf ¡ | ¡  |jj}|rVx4|D ] }|  d|jj|jdd ¡ q0W n
|  d¡ | 	¡  d S )Nzcdef extern class %s.%s:zcdef %sr   )r   Úpass)
rp   r:   rN   Úindentr   rg   r9   rƒ   r„   Údedent)r<   r9   r~   rg   r?   r   r   r   rw   H  s    

z'ModuleNode.generate_cclass_include_codec             C   s”  | j }tjs|jrt ¡ }nt ¡ }t||ƒ}tj|| ||j	d}| 
¡  |d }|  ||||j|¡ | j|_| j|_| t¡ |d }	|	 d| j ¡ dtj| j dd¡f }
|	 d|
 ¡ |	 d	|
 ¡ |	 d
¡ |	 d|j ¡ |d }	|	 d¡ | j|||	dd |d }	|  ||	¡ |  ||	¡ |  ||	¡ | j ||	¡ |	 d ¡ |  ||	¡ |   ||	¡ |j!rz|  "||	¡ |  #||	¡ |	 t$ %dd¡d  &¡ ¡ |  '|d d… ||d ¡ |  (||d ¡ tj)râ|  *||d ¡ |  +|d ¡ |  ,|||¡ | -d¡ x"|j.d d … D ]}| |¡ qW | /¡  t0|j1ƒ}z| 2|¡ W d | 3¡  X d|_4|j5rr|  6||¡ tjs‚|jr|  7|||¡ d S )N)Zcode_configÚcommon_utility_include_dirr|   Zbefore_global_varz#define __Pyx_MODULE_NAME "%s"z%s%sr…   r†   zextern int %s;zint %s = 0;rd   z/* Implementation of '%s' */Zlate_includesz/* Late includes */F)ÚearlyZall_the_restZSmallCodeConfigzModuleSetupCode.cr   éÿÿÿÿÚinit_moduleZcleanup_moduleÚmain_methodZfilename_tablerA   r   )8rQ   r   r%   r   ZAnnotationCCodeWriterr   rj   r)   rk   r¥   Zinitialize_main_c_codeÚgenerate_module_preambleZembedded_metadatarC   Z
module_posr&   Úuse_utility_codeÚrefnanny_utility_coderp   r8   r   Úmodule_is_mainrˆ   r‡   rr   Zgenerate_cached_builtins_declsZgenerate_lambda_definitionsÚgenerate_variable_definitionsr+   Zgenerate_function_definitionsÚmark_posÚgenerate_typeobj_definitionsÚgenerate_method_tablerF   Úgenerate_import_starÚgenerate_pymoduledef_structr
   r—   ÚstripÚgenerate_module_init_funcÚgenerate_module_cleanup_funcÚembedÚgenerate_main_methodÚgenerate_filename_tableÚ!generate_declarations_for_modulesÚwriter3   Zfinalize_main_c_coder   rh   rz   r{   Zc_file_generatedZ	gdb_debugÚ_serialize_lineno_mapÚ_generate_annotations)r<   r'   r(   rW   ÚmodulesÚ
rootwriterr}   Úglobalstater|   Úcoder­   Zutilcoder€   r   r   r   rT   U  sp    









zModuleNode.generate_c_codec             C   s¼  |   |¡ tjp|j}|r¤tj |¡r¤ydd lm  m} W n& t	k
rb   dd l
m  m} Y nX | |¡ ¡ }t|dƒr†| ¡ }n| ¡ }x|D ]
}d |_q”W nd }|j|j|j|d | jjsÈd S | jjj}	tj tj |j¡¡}
xÎ| jjD ]Â}tj tj |
|¡¡}tj |¡}| |
¡s&qò|	|d| jdd}|s@qò||
kr¤tj |¡s¤yt |¡ W n< tk
r¢ } zdd l }|j |j!kr’‚ W d d }~X Y nX |j|||d qòW d S )Nr   Úiter)Úcoverage_xmlrd   T)Úinclude)"r%   r   Zannotate_coverage_xmlr   r‘   ÚexistsZxml.etree.cElementTreeÚetreeZcElementTreeÚImportErrorZxml.etree.ElementTreeZElementTreeÚparseZgetrootÚhasattrrÂ   ZgetiteratorÚtailZsave_annotationZmain_source_filerh   r   r6   ÚcontextZsearch_include_directoriesÚabspathÚdirnameÚjoinÚ
startswithrC   ÚmakedirsÚOSErrorÚerrnoÚEEXIST)r<   r¿   rW   r(   Zcoverage_xml_filenameÚETrÃ   ÚiteratorÚelZsearch_include_fileÚ
target_dirZincluded_fileZtarget_fileZtarget_file_dirZsource_fileÚerÒ   r   r   r   r½   ¦  sF    




z ModuleNode._generate_annotationsc       	      C   s¤   |j j}|j ¡ }ttƒ}x.t|ƒD ]"\}}|dkr$||  |d ¡ q$W | d¡ x8t	| 
¡ ƒD ](\}}|jdd tt|ƒ¡t|ƒd qbW | d¡ | ¡  d S )Nr   r   ZLineNumberMappingZ
LineNumberú )Ú	c_linenosÚcython_lineno)rË   Zgdb_debug_outputwriterÚbufferZ
allmarkersr   ÚlistÚ	enumerater,   ÚstartrH   rJ   Ú	add_entryrÎ   ÚmapÚstrÚendÚ	serialize)	r<   r'   ZccodewriterÚtbÚmarkersÚdZc_linenorÛ   rÚ   r   r   r   r¼   Ó  s    


z ModuleNode._serialize_lineno_mapc             C   s<   ||kr8d||< x|j D ]}|  |||¡ qW | |¡ d S )Nr   )Úcimported_modulesrR   r,   )r<   r'   Úmodule_listZmodules_seenÚimported_moduler   r   r   rR   æ  s
    z"ModuleNode.find_referenced_modulesc             C   s¦   g }xœt |ƒD ]\}}|| }tƒ }|}	x2|	rZ|	jj}
|
s<P ||
ƒ}| |¡ | |¡}	q*W ||_x:t|ƒD ]$}|| }||jkrl| ||¡ P qlW | 	|¡ qW |S )N)
rÞ   Úsetr9   Ú	base_typeÚaddÚgetZ	base_keysÚrangeÚinsertr,   )r<   Z	type_dictZ
type_orderZgetkeyZ	type_listÚiÚkeyZ	new_entryZ	hierarchyÚbaserì   Zbase_keyÚjr?   r   r   r   Úsort_types_by_inheritanceí  s(    

z$ModuleNode.sort_types_by_inheritancec             C   sV  i g  }}i g  }}x
|D ] }x|j D ]†}|jr*|js*|j}	|	j}
|
sLq*|
|kržddlm} t|j|ƒszt	t
|jƒƒ‚t||
 j|ƒs°t	t
||
 jƒƒ‚q*|||
< | |
¡ q*W ||k}x`|jD ]V}|jrÄ|sØ|jrÄ|j}	|	jrÄ|jsÄ|j}	|	j}
|
|kst	|
ƒ‚|||
< | |
¡ qÄW qW dd„ }|  |||¡}dd„ }|  |||¡}||fS )Nr   )ÚNonManglingModuleScopec             S   s   | j S )N)Úvtabstruct_cname)Ú
entry_typer   r   r   r÷   *  s    z8ModuleNode.sort_type_hierarchy.<locals>.vtabstruct_cnamec             S   s   | j S )N)Úobjstruct_cname)rø   r   r   r   rù   /  s    z7ModuleNode.sort_type_hierarchy.<locals>.objstruct_cname)r7   ÚusedÚin_cincluder9   r÷   r
   rö   r/   r   r0   râ   r,   rf   rZ   Úis_extension_typerù   rõ   )r<   ré   r'   Z	vtab_dictZvtab_dict_orderZvtabslot_dictZvtabslot_dict_orderr[   r?   r9   rò   rö   Zall_defined_herer÷   Ú	vtab_listrù   Úvtabslot_listr   r   r   Úsort_type_hierarchy
  s@    

$

zModuleNode.sort_type_hierarchyc             C   sl   t  d¡}i g  }}x:|jD ]0}||jƒ}||ks:t|ƒ‚|||< | |¡ qW |  |||¡|jd d …< d S )Nrù   )ÚoperatorÚ
attrgetterr7   r9   r0   r,   rõ   )r<   r'   Zkey_funcZ
entry_dictZentry_orderr?   rò   r   r   r   rS   6  s    


zModuleNode.sort_cdef_classesc                s   x|D ]}|   |j|¡ qW t|ƒ‰ tƒ }xŠ|D ]‚}||k}	g }
xR|jD ]H}|jjr||jr||j|kr| |j¡ |
 |¡ qH|	s†|j	rH|
 |¡ qHW ‡ fdd„|
D ƒ}
|  
|
|¡ q0W x&|D ]}|  |j|¡ |  ||¡ q¼W x<|D ]4}|  ||¡ |  ||¡ |  ||¡ |  ||¡ qäW d S )Nc                s   g | ]}|ˆ kr|‘qS r   r   )r`   Út)Úvtabslot_entriesr   r   rb   Q  s    z8ModuleNode.generate_type_definitions.<locals>.<listcomp>)Ú!generate_objstruct_predeclarationr9   rë   rf   Ú	is_ctuplerú   rN   rí   r,   rZ   rq   Úgenerate_objstruct_definitionÚgenerate_typeobj_predeclarationÚgenerate_exttype_vtable_structÚ$generate_exttype_vtabptr_declarationÚ*generate_exttype_final_methods_declaration)r<   r'   r¾   rý   rþ   rÁ   r?   Zctuple_namesr[   Ú
definitionrf   r   )r  r   Úgenerate_type_definitionsA  s0    





z$ModuleNode.generate_type_definitionsc       
      C   sÞ   |d }|  d¡ |  d¡ ddd„ |D ƒkrV|  d¡ |  d¡ |  d	¡ |  d
¡ |  ||¡\}}|  |||||¡ |d }xX|D ]P}||k}	|  d¡ |  d|j ¡ |  |||	¡ |  |||	¡ |  |||	¡ q†W d S )NZtype_declarationsrd   z/*--- Type declarations ---*/zcpython.arrayc             S   s   g | ]
}|j ‘qS r   )r‡   )r`   Úmr   r   r   rb   b  s    z@ModuleNode.generate_declarations_for_modules.<locals>.<listcomp>z#ifndef _ARRAYARRAY_Hzstruct arrayobject;z'typedef struct arrayobject arrayobject;z#endifZmodule_declarationsz#/* Module declarations from '%s' */)rp   rÿ   r  r‡   Úgenerate_c_class_declarationsÚgenerate_cvariable_declarationsÚgenerate_cfunction_declarations)
r<   r'   r¾   rÀ   Útypecoderý   rþ   Z
modulecoder[   Zdefined_herer   r   r   rº   \  s&    







z,ModuleNode.generate_declarations_for_modulesc             C   s   |  t |d¡d ¡ d S )NzModuleSetupCode.cr   )r–   r
   r—   )r<   rÁ   rN   r   r   r   Ú_put_setup_codes  s    zModuleNode._put_setup_codec          	   C   sê  |  ¡  |r@| d¡ | tj|ddd¡ | d¡ | d¡ | d¡ | d¡ | d	¡ x2t|j ¡ tjd
D ]}|j	|j
krt| |¡ qtW | d¡ | d¡ | d¡ | d¡ | d¡ |jd  d¡ ddlm} | d| dd¡ ¡ | dt|ƒ ¡ | dtj|jjk ¡ |  |d¡ |jjjrF|  |d¡ n|  |d¡ |  |d¡ |  |d¡ |jrˆdtjtjtjf }nd}| d¡ | d tjtjtjtjtj|f ¡ | d!¡ | d"¡ | d¡ |  |¡ | d¡ | d#tj  |  !|¡ ¡ | d#tj" |  !|¡ ¡ | d$¡ | j#|||d%d& | d¡ | d'¡ | d(¡ | d)¡ | d¡ |j$d* r¬| d¡ | d+¡ | d,¡ | d)¡ | d¡ | %t& 'd-d.¡d/ ¡ |j$d0 }	|j$d1 }
|	d2krò|
sòt(| j)d3ƒ | d4t*|
d5kƒ ¡ | d6t*|
 d7d¡ +¡ d8kƒ ¡ |
d9kr@| d:¡ n| d;¡ | d<|
 ¡ |	d=krhd>}n|	 ,¡ }| d?| ¡ | d@| ¡ | %t& 'dAdB¡d/ ¡ t-j. /|¡ t-j. 0|¡ t-j1 0|¡ | %t2j3¡ | dC¡ | d¡ | dD|j4 ¡ | dE|j5 ¡ | dEtj6 ¡ | dDtj7 ¡ | dEtj8 ¡ | dEtj9 ¡ | dEtj: ¡ t;j<d k	rr| dEtj= ¡ | dFtj ¡ | dGtj ¡ | dHtj>tj?f ¡ | dItj ¡ | @t& AdJd.¡¡ tB|ƒræ| @t& AdKdL¡¡ d S )MNz/* BEGIN: Cython Metadataé   T)r£   Ú	sort_keyszEND: Cython Metadata */rd   z#ifndef PY_SSIZE_T_CLEANz#define PY_SSIZE_T_CLEANz#endif /* PY_SSIZE_T_CLEAN */)rò   z#ifndef Py_PYTHON_Hzg    #error Python headers needed to compile C extensions, please install development version of Python.zb#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)z6    #error Cython requires Python 2.6+ or Python 3.3+.z#elserã   z#endif /* Py_PYTHON_H */r   )Ú__version__z#define CYTHON_ABI "%s"r…   Ú_z#define CYTHON_HEX_VERSION %sz!#define CYTHON_FUTURE_DIVISION %dZCModulePreambleZCppInitCodeZ	CInitCodeZPythonCompatibilityZMathInitCodez%s = %s; (void)%s; z-#define __PYX_MARK_ERR_POS(f_index, lineno) \z<    { %s = %s[f_index]; (void)%s; %s = lineno; (void)%s; %s}z.#define __PYX_ERR(f_index, lineno, Ln_error) \z:    { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; }z
#define %sz/* Early includes */F)ÚlatezL#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS)z!#define CYTHON_WITHOUT_ASSERTIONSz#endifZccomplexz#if !defined(CYTHON_CCOMPLEX)z#define CYTHON_CCOMPLEX 1ZUtilityFunctionPredeclarationszModuleSetupCode.cr   Úc_string_typeÚc_string_encoding)ÚbytesÚ	bytearrayzGa default encoding must be provided if c_string_type is not a byte typez1#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII %sÚasciiz0#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 %sú-Úutf8Údefaultz2#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 1zq#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8)z*#define __PYX_DEFAULT_STRING_ENCODING "%s"r  Z	ByteArrayz7#define __Pyx_PyObject_FromString __Pyx_Py%s_FromStringzE#define __Pyx_PyObject_FromStringAndSize __Pyx_Py%s_FromStringAndSizeZTypeConversionszTypeConversion.czOstatic CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; }zstatic PyObject *%s = NULL;zstatic PyObject *%s;zstatic int %s;zstatic int %s = 0;zstatic const char * %s= %s;zstatic const char *%s;ZFastTypeChecksZPythranConversionzCppSupport.cpp)Crl   rp   ÚjsonÚdumpsrH   r4   r5   r   ÚsortkeyÚlocationZINITIALr»   rÀ   rd   r  rˆ   r   r   ÚdivisionrË   Zfuture_directivesr  r(   Zcplusr$   r   Zclineno_cnameZline_c_macroZfilename_cnameÚfiletable_cnameZlineno_cnamert   rm   rn   rs   rr   r&   r–   r
   r—   r   rC   ÚintÚlowerÚtitler   Zc_long_typeÚcreate_to_py_utility_codeÚcreate_from_py_utility_codeZ
c_int_typer   Zbranch_prediction_macrosÚmodule_cnameÚmodule_dict_cnameÚbuiltins_cnameÚcython_runtime_cnameÚempty_tupleÚempty_bytesÚempty_unicoder   Ú
pre_importÚpreimport_cnameZcfilenm_cnameZfile_c_macror«   Úload_cachedr   )r<   r'   r(   rè   ÚmetadatarÁ   r>   r  Zcinfor  r  Zc_string_func_namer   r   r   rª   v  sÂ    




































z#ModuleNode.generate_module_preamblec             C   s\   t j}| d| ¡ | d¡ | d| ¡ | d¡ | d| ¡ | d¡ | d¡ d S )Nz
#ifndef %sz  #ifdef __cplusplusz    #define %s extern "C"z  #elsez    #define %s externz  #endifz#endif)r   r‚   rp   )r<   rÁ   rN   r   r   r   rt   ï  s    


z-ModuleNode.generate_extern_c_macro_definitionc             C   s"   |  d¡ |  d¡ |  d¡ d S )Nz#ifndef DL_IMPORTz  #define DL_IMPORT(_T) _Tz#endif)rp   )r<   rÁ   r   r   r   ru   ù  s    

z#ModuleNode.generate_dl_import_macroTc             C   sj   g }xRt |j ¡ tjdD ]:}|j|jkr:|rT| |¡ q|j|jkr|r| |¡ qW |rf| 	d¡ d S )N)rò   z#include <omp.h>)
rH   r4   r5   r   r"  r#  ZEARLYr»   ZLATEZputln_openmp)r<   r'   rè   rÁ   r¦   r  Zincludesr>   r   r   r   rr   þ  s    zModuleNode.generate_includesc             C   s˜   ddl m}m} | d¡ | dtj ¡ |jjr€xV|jjD ]>}| ¡ }||ƒrX||ƒ}| 	dd¡ 	dd¡}| d	| ¡ q<W n
| d
¡ | d¡ d S )Nr   )Úisabsr’   rd   zstatic const char *%s[] = {ú\z\\ú"z\"z"%s",Ú0z};)
Úos.pathr6  r’   rp   r   r%  rÀ   Zfilename_listZget_filenametable_entryrˆ   )r<   rÁ   r6  r’   Zsource_descÚ	file_pathZescaped_filenamer   r   r   r¹   
  s    

z"ModuleNode.generate_filename_tablec             C   s   d S )Nr   )r<   r'   rÁ   r   r   r   Úgenerate_type_predeclarations  s    z(ModuleNode.generate_type_predeclarationsc             C   s
  xj|D ]b}|j s|j}|jrq|js*|jr8|  ||¡ q|jrV|jrV|  |jj|¡ q|j	r|  
||¡ qW x˜|D ]}|j sr|j}|jr–|  ||¡ qr|jrª|  ||¡ qr|jr¾|  ||¡ qr|jrÜ|jrÜ|  |jj|¡ qr|jrð|  ||¡ qr|j	rr|  ||¡ qrW d S )N)rû   r9   Z
is_typedefZis_struct_or_unionÚis_cpp_classÚ$generate_struct_union_predeclarationr  rú   Zstruct_entryrü   r  Úgenerate_typedefrM   Úgenerate_enum_definitionÚ generate_struct_union_definitionÚgenerate_cpp_class_definitionr  )r<   rf   rÁ   r?   r9   r   r   r   rq     s4    

z$ModuleNode.generate_type_header_codec             C   s^   |  d¡ xN|jD ]D}|j}|js|j}| d¡r@|dd … }n|}|  d||f ¡ qW d S )Nrd   Z__pyx_é   z!typedef struct %s __pyx_gcc33_%s;)rp   r7   r9   Útypedef_flagrù   rÏ   )r<   r'   rÁ   r?   r9   rN   rÊ   r   r   r   Úgenerate_gcc33_hack?  s    

zModuleNode.generate_gcc33_hackc             C   sb   |j j}|jr8y|jd }W q< tk
r4   |}Y q<X n|}| |j¡ | d| |j	¡ ¡ d S )NZnumeric_typedefsztypedef %s;)
r9   Ztypedef_base_typeZ
is_numericrÀ   ÚKeyErrorr¯   rC   rp   rƒ   r„   )r<   r?   rÁ   rì   Úwriterr   r   r   r?  M  s    zModuleNode.generate_typedefc             C   s(   |j rd|||||f S d||f S d S )Nz%s %s;
typedef %s %s %s;z%s %s;)rD  )r<   r9   ÚkindrN   r   r   r   Úsue_predeclarationY  s
    zModuleNode.sue_predeclarationc             C   sN   |j }|jr2|jr2| dd dd„ |jD ƒ¡ ¡ | |  ||j|j¡¡ d S )Nztemplate <typename %s>z, typename c             S   s   g | ]}|  ¡ ‘qS r   )rš   )r`   ÚTr   r   r   rb   e  s    zCModuleNode.generate_struct_union_predeclaration.<locals>.<listcomp>)r9   r=  Ú	templatesrp   rÎ   rI  rH  r„   )r<   r?   rÁ   r9   r   r   r   r>  a  s
    
z/ModuleNode.generate_struct_union_predeclarationc             C   s   d||f }d}||fS )Nz%s %s {z};r   )r<   r9   rH  rN   ÚheaderÚfooterr   r   r   Úsue_header_footerh  s    zModuleNode.sue_header_footerc             C   s$  |  |j¡ |j}|j}|r |j}|jo.|j}|rNd|jdf }|j t	¡ |  
|||j¡\}}|r˜| d¡ | d¡ | d¡ | d¡ | d¡ | |¡ |j}	|	s¸t|jdƒ x$|	D ]}
| d	|
j |
j¡ ¡ q¾W | |¡ |r | d¡ | d
¡ | d¡ | d¡ | d¡ d S )Nz%s %sZ__Pyx_PACKEDz#if defined(__SUNPRO_C)z  #pragma pack(1)z#elif !defined(__GNUC__)z  #pragma pack(push, 1)z#endifzOEmpty struct or union definition not allowed outside a 'cdef extern from' blockz%s;z  #pragma pack()z  #pragma pack(pop))r¯   rC   r9   r   rH  Z	is_structÚpackedrÀ   r«   Úpacked_struct_utility_coderN  r„   rp   rg   r   rƒ   )r<   r?   rÁ   r9   r   rH  rO  rL  rM  rg   Úattrr   r   r   rA  m  s<    











z+ModuleNode.generate_struct_union_definitionc             C   sl  |  |j¡ |j}|j}|rh|jrD| dd dd„ |jD ƒ¡ ¡ | d|j ¡ |j	r~d dd„ |j	D ƒ¡}| d| ¡ | d	¡ d
d„ |j
 ¡ D ƒ}d}d }d }	xz|jD ]p}
|
jjrÐ|
jjrÐ| d¡ n8|
jdkrà|
}n(|
jdkrð|
}	n|
jjr| d¡ d}| d|
j |
j¡ ¡ q°W d|jjk}|s<|rt|rÊg }g }xD|jjd t|jjƒ|jj … D ] }| | ¡ ¡ | |j¡ qlW |jjr¼| |jj tj¡¡ | tj¡ |sÔdg}n
dg}g }|rZ| d|jd |¡f ¡ |r | ¡  x|D ]}
|j|
dd qW |r@| d|jd |¡f ¡ |rN| ¡  | d¡ n| d|jd |¡f ¡ |	s†|s†|r|r–| d¡ |r| d|j ¡ |rº| ¡  |	rÐ| d|	j ¡ |rüx|D ]}
|j|
dd qÜW | ¡  | d¡ n| d|j ¡ |r^|r2| d|j|jf ¡ | ¡  x>|jD ]4}
|
jjsJ| d|
j|
jf ¡ |j|
dd qJW | ¡  | d¡ | d|j|jf ¡ | d¡ | ¡  xL|jD ]B}
|
jjsÄ|j|
dd | d|
j|
jf ¡ |j|
dd qÄW | ¡  | d¡ | d ¡ | d¡ n,| d!|j|jf ¡ | d"|j|jf ¡ | d#¡ d S )$Nztemplate <class %s>z, class c             S   s   g | ]}|  ¡ ‘qS r   )rš   )r`   rJ  r   r   r   rb   •  s    z<ModuleNode.generate_cpp_class_definition.<locals>.<listcomp>z	struct %sz	, public c             S   s   g | ]}|  ¡ ‘qS r   )rš   )r`   Z
base_classr   r   r   rb   š  s    z : public %sz {c             S   s   g | ]}|j jr|js|‘qS r   )r9   Úis_pyobjectÚis_inherited)r`   rØ   r   r   r   rb     s    Fzstatic z<init>z<del>zvirtual Tz%s;r¨   Úvoidz%s(%s) {z, )Únannyz%s(%s);r   z~%s() {z%s();z~%s();z%s(const %s& __Pyx_other) {z%s = __Pyx_other.%s;z&%s& operator=(const %s& __Pyx_other) {zif (this != &__Pyx_other) {zreturn *this;z%s(const %s& __Pyx_other);z%%s& operator=(const %s& __Pyx_other);z};) r¯   rC   r9   r   rK  rp   rÎ   r–   r„   Zbase_classesrI   r5   rg   Zis_cfunctionZis_static_methodrN   rƒ   rÀ   ÚpartsZoriginal_argsÚlenÚargsZoptional_arg_countr,   Zop_arg_structr   Zoptional_args_cnameZput_ensure_gilÚput_init_var_to_py_noneZput_release_ensured_gilZput_var_xdecrefZput_var_incref)r<   r?   rÁ   r9   r   Zbase_class_declÚpy_attrsZhas_virtual_methodsÚconstructorZ
destructorrQ  Zis_implementingZ	arg_declsÚ	arg_namesÚargr   r   r   rB  Ž  sÀ    
















z(ModuleNode.generate_cpp_class_definitionc             C   sø   |  |j¡ |j}|jp |jp d}|  |d|¡\}}| |¡ |j}|sVt|jdƒ nz|d }x"|D ]}	|	j	d k	rd|	j	 
|¡ qdW xL|D ]D}	|	j	d krž|	j}
nd|	j|	j	 ¡ f }
|	|k	rÂ|
d7 }
| |
¡ qˆW | |¡ |jjrô| d||f ¡ d S )Nrd   ÚenumzDEmpty enum definition not allowed outside a 'cdef extern from' blockr§   z%s = %sú,ztypedef enum %s %s;)r¯   rC   r9   r„   rN   rN  rp   Úenum_valuesr   Z
value_nodeZgenerate_evaluation_coderW   rD  )r<   r?   rÁ   r9   rN   rL  rM  r`  Z
last_entryZvalue_entryZ
value_coder   r   r   r@  ÷  s0    





z#ModuleNode.generate_enum_definitionc             C   sr   |  d¡ |jj}|rn|jdkrF|jsF|  dtjt dd¡|f ¡ n(|jdkrn|  dtjt dd¡|f ¡ d S )Nrd   Úexternz	%s %s %s;rŸ   r    r]   Ú	DL_EXPORT)	rp   r9   r”   r^   rû   r   r‚   r   r¡   )r<   r?   rÁ   rN   r   r   r   r    s    



z*ModuleNode.generate_typeobj_predeclarationc             C   s²   |j s
d S | |j¡ |j}|j}|  |¡ |jr®| d¡ | d|j ¡ |jrr|jjrr| d|jjt	j
f ¡ x0|jD ]&}|jsz| d|j d|j ¡ ¡ qzW | d¡ d S )Nrd   zstruct %s {zstruct %s %s;z%s;z(*%s)z};)rú   r¯   rC   r9   r   Úspecialize_fused_typesr÷   rp   rì   r   Úobj_base_cnamerY   rS  rƒ   r„   )r<   r?   rÁ   r9   r   Úmethod_entryr   r   r   r  (  s"    

 z)ModuleNode.generate_exttype_vtable_structc             C   s<   |j s
d S | |j¡ |j}|jr8| d|j|jf ¡ d S )Nzstatic struct %s *%s;)rú   r¯   rC   r9   Úvtabptr_cnamerp   r÷   )r<   r?   rÁ   r9   r   r   r   r	  ?  s    z/ModuleNode.generate_exttype_vtabptr_declarationc             C   sl   |j s
d S | |j¡ |j}xJ|jjjD ]<}|js(|jr(|j |j¡}| 	|j
¡}| d||f ¡ q(W d S )Nzstatic %s%s;)rú   r¯   rC   r9   r   rY   rS  Zfinal_func_cnamerƒ   Úbuild_function_modifiersÚfunc_modifiersrp   )r<   r?   rÁ   r9   re  ZdeclarationÚ	modifiersr   r   r   r
  K  s    z5ModuleNode.generate_exttype_final_methods_declarationc             C   s$   |j s
d S | |  |d|j¡¡ d S )NÚstruct)r   rp   rI  rù   )r<   r9   rÁ   r   r   r   r  Y  s    z,ModuleNode.generate_objstruct_predeclarationc       	      C   s  |  |j¡ |jsd S |  |d|j¡\}}| |¡ |j}|rn|j}|dkrPd}| dd|j |tj	f ¡ n
| d¡ |j
r¢|jrŒ|jj
s¢| d|j|j
f ¡ x8|jjD ],}|jr¼t}n|j}| d| |j¡ ¡ q¬W | |¡ |jd k	r| d	|j|jf ¡ d S )
Nrj  rŸ   ZPyHeapTypeObjectz%s%s %s;)zstruct rd   ZPyObject_HEADzstruct %s *%s;z%s;ztypedef struct %s %s;)r¯   rC   r   rN  rù   rp   rì   rD  r   rd  Úvtabslot_cnamer÷   rg   Úis_declared_genericr	   r9   rƒ   r„   Zobjtypedef_cname)	r<   r9   rÁ   rL  rM  rì   Zbasestruct_cnamerQ  Z	attr_typer   r   r   r  ^  s>    

z(ModuleNode.generate_objstruct_definitionc             C   s0   x*|j D ] }|s|jr| d|jj ¡ qW d S )Nzstatic PyTypeObject *%s = 0;)r7   rZ   rp   r9   r“   )r<   r'   rÁ   r  r?   r   r   r   r  †  s    
z(ModuleNode.generate_c_class_declarationsc       
      C   sR  |j r
d S x@|jD ]4}|js|js|jdkr>|js>|js>qd }d }d }|jdkr`tj}d}nJ|jdkr€tj}|rzd}qªd}n*|jdkrªd}d }|j	d k	rª|j
 |j	¡}|j
}|j}	|jrä|säd}d }t|ƒ}| tj|j¡}	d}|rö| d| ¡ | |j|	|d	¡ |d k	r"| d
| ¡ | d¡ |j|	kr| d|j|	f ¡ qW d S )NÚprivatera  r    r]   rb  Ústaticr   z%s )Údll_linkagez = %sú;z#define %s (*%s))Zis_cython_builtinrg   rû   Z
in_closurer^   rZ   rú   r   r‚   Úinitr9   Úliteral_coder„   r   r•   Úvarptr_prefixrN   r–   rƒ   Úput_saferp   )
r<   r'   rÁ   r  r?   Ústorage_classro  rq  r9   r„   r   r   r   r  Œ  sN    







z*ModuleNode.generate_cvariable_declarationsc             C   s8   x2|j D ](}|js"|jdks"|jrt||||ƒ qW d S )Nr]   )rY   rú   r^   r_   Úgenerate_cfunction_declaration)r<   r'   rÁ   r  r?   r   r   r   r  º  s    z*ModuleNode.generate_cfunction_declarationsc             C   sh   xb|j D ]X}|js|jdkr| |j |j¡¡ |jd k	rV|j |j¡}| 	d| ¡ | 
d¡ qW d S )Nr]   z = %srp  )rg   rû   r^   r–   r9   rƒ   r„   rq  rr  rt  rp   )r<   r'   rÁ   r?   rq  r   r   r   r®   ¿  s    
z(ModuleNode.generate_variable_definitionsc             C   s  |j }xú|jD ]î}|jdkr|j}|j}|r|jd sFt| jdƒ |  ||¡ |  	|||¡ |  
||¡ | ¡ r˜|  |||¡ | ¡ r˜|  |||¡ | dg¡r°|  ||¡ | ddg¡rÊ|  ||¡ | ddd	g¡rt| jd
dƒ | d¡ | d¡ | d¡ | dd	g¡r$|  ||¡ | ddg¡r@|  ||¡ | ddg¡r\|  ||¡ | dg¡rv|  ||¡ | ddg¡r’|  ||¡ |js´| dg¡r´|  ||¡ | tj¡rÎ|  ||¡ |  ||¡ |   ||¡ |  !||¡ |  "|||¡ qW d S )Nra  Zc_api_binop_methodszaThe 'c_api_binop_methods' directive is only supported for forward compatibility and must be True.Ú__getitem__Ú__setitem__Ú__delitem__Z__getslice__Ú__setslice__Ú__delslice__z__getslice__, __setslice__, and __delslice__ are not supported by Python 3, use __getitem__, __setitem__, and __delitem__ insteadr   z#if PY_MAJOR_VERSION >= 3zN#error __getslice__, __setslice__, and __delslice__ not supported in Python 3.z#endifÚ__getattr__Ú__getattribute__Ú__setattr__Ú__delattr__Ú__get__Ú__set__Ú
__delete__Ú__dict__)#r‡   r7   r^   r9   r   r&   r   rC   Úgenerate_exttype_vtableÚgenerate_new_functionÚgenerate_dealloc_functionÚneeds_gcÚgenerate_traverse_functionZneeds_tp_clearÚgenerate_clear_functionZdefines_any_specialÚgenerate_getitem_int_functionÚgenerate_ass_subscript_functionr   rp   Úgenerate_ass_slice_functionÚgenerate_getattro_functionÚgenerate_setattro_functionÚgenerate_descr_get_functionÚgenerate_descr_set_functionÚis_closure_class_scopeÚdefines_anyÚgenerate_dict_getter_functionr   Úrichcmp_special_methodsÚgenerate_richcmp_functionÚgenerate_property_accessorsr±   Úgenerate_getset_tableÚgenerate_typeobj_definition)r<   r'   rÁ   r8   r?   r9   r   r   r   r   r°   È  sZ    




z'ModuleNode.generate_typeobj_definitionsc             C   s&   |j }|jr"| d|j|jf ¡ d S )Nzstatic struct %s %s;)Úparent_typeÚvtable_cnamerp   r÷   )r<   r   rÁ   r9   r   r   r   r„  ú  s
    z"ModuleNode.generate_exttype_vtablec             C   s&   |j }| d| d¡| ¡ f ¡ d S )Nz%s = (%s)o;Úp)r™  rp   rƒ   rš   )r<   r   rÁ   r9   r   r   r   Úgenerate_self_cast  s
    zModuleNode.generate_self_castc             C   sb  t  dd¡}| d¡}|j}|j}| ¡ \}\}	}
}|jj}|jrFg }	dd„ |jD ƒ}| 	d¡}|st|rz|j
rz|jszd}nd}|rˆd}n|j dd¡}| tj¡}| tj¡}|jd	 }| d
| ¡ | d¡ |r| d|j |¡|f ¡ | d| ¡ | d¡ | d|||f ¡ |jp8|
p8|p8|	p8|}|rV| d|j d¡ ¡ |rŒt  ||¡}|d kr|d|j }| d| ¡ nâ| d¡ |r*|j t dd¡¡ |r¼d}nd}|jddd}| d|||f ¡ | d||f ¡ | d| ¡ | d¡ | ¡ r | d¡ | d¡ |s:| d¡ | d¡ |sn| d¡ | d tj ¡ | d!¡ | d"¡ |rŽ|sŽ| d!¡ |r¨| d#| d$¡ ¡ d%}|jr
|}x|jrÖ|jjrÖ|j}qºW ||k	rîd&|j }nd}| d'|j||jf ¡ x(|D ] }| d(|j|j  !¡ f ¡ qW xF|	D ]>}|j"d)krfd}| #d*|j|jf ¡ n|j$|d+d%d, q:W x.|D ]&}| d-|j ¡ | d.|j ¡ q‚W x|
D ]}| d/|j ¡ q²W |jd0krâ| d1¡ |r |j
r |jrd2tj }nd3}d}| d4|j%|f ¡ | d5¡ |rT| d6¡ |j&d$t'd%d, | d7¡ | d!¡ d S )8NÚtp_newÚ__new__c             S   s   g | ]}|j jr|‘qS r   )r9   r=  )r`   r?   r   r   r   rb     s    z4ModuleNode.generate_new_function.<locals>.<listcomp>rd   zCYTHON_UNUSED r   ÚfreelistÚdeclszIstatic PyObject *%s(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/zstatic %s[%d];zstatic int %s = 0;zDstatic PyObject *%s(PyTypeObject *t, %sPyObject *a, %sPyObject *k) {z%s;r›  z
%s->tp_newzPyObject *o = %s(t, a, k);zPyObject *o;ZIncludeStringHzStringTools.czH & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0)T)ÚderefzZif (CYTHON_COMPILING_IN_CPYTHON && likely((%s > 0) & (t->tp_basicsize == sizeof(%s))%s)) {zo = (PyObject*)%s[--%s];zmemset(o, 0, sizeof(%s));z(void) PyObject_INIT(o, t);zPyObject_GC_Track(o);z} else {z:if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {zo = (*t->tp_alloc)(t, 0);z4o = (PyObject *) PyBaseObject_Type.tp_new(t, %s, 0);r   zif (unlikely(!o)) return 0;zp = %s;ÚoFz(struct %s*)zp->%s = %s%s;znew((void*)&(p->%s)) %s();rƒ  z5p->%s = PyDict_New(); if (unlikely(!p->%s)) goto bad;zp->%s)rU  zp->%s.data = NULL;zp->%s.memview = NULL;zp->%s.obj = NULL;Ú__pyx_memoryviewslicezp->from_slice.memview = NULL;zo, %s, NULLzo, a, kz#if (unlikely(%s(%s) < 0)) goto bad;z	return o;zbad:zreturn NULL;)(r   ÚConstructorSlotÚmangle_internalr™  rì   Úget_refcounted_entriesÚis_final_typeZis_internalrg   Úlookup_hereZ
is_specialZtrivial_signaturer&   rî   r   Úfreelist_nameÚfreecount_namerÀ   rp   rƒ   rk  Úget_base_slot_functionr“   r«   r
   r4  r‡  r/  Ú	cast_coder÷   rf  r„   r9   rš   rN   r–   rY  Ú
func_cnameÚput_decref_clearr	   )r<   r   rÁ   Úcclass_entryÚtp_slotÚ	slot_funcr9   rì   Úhave_entriesrZ  Ú
py_buffersÚmemoryview_slicesr§  Úcpp_class_attrsZnew_func_entryZunused_markerÚfreelist_sizer©  rª  r   Zneed_self_castr  Útype_safety_checkZ
obj_structZneeds_error_cleanupZvtab_base_typeZstruct_type_castr?   Z
cinit_argsr   r   r   r…  	  sä    



























z ModuleNode.generate_new_functionc          	   C   s4  t  dd¡}| d¡}|jj}| |¡|kr0d S | d¡}| d¡ | d| ¡ |jj}| ¡ }|j	sr| 
d¡nd }	|	|jkr„d }	|j	s”| 
d¡nd }
|
|jkr¦d }
| ¡ \}\}}}dd„ |jD ƒ}|sÜ|sÜ|sÜ|	sÜ|
rè|  ||¡ |s4| d	¡ |rd
}nd}| d| ¡ | d¡ | d¡ | d¡ |rD| d¡ |  ||¡ |	r`| d¡ |
rp| d¡ x|D ]}| d|j ¡ qvW x(|D ] }|jd|j |jddd q–W x"|D ]}|jd|j dd qÀW |r†|j}|r|jr|j ¡ r| d¡ n| d| ¡ t  ||¡}|d k	rD| d| ¡ n@|jr\| d| ¡ n(| d|||f ¡ |j t dd¡¡ n |j d d!¡}|r| tj¡}| tj¡}|r¾d}nd"}|j}| d#|||j ddd$|f ¡ | d%||| !d&¡f ¡ | d'¡ | d(¡ |r&| d¡ | d¡ d S ))NÚ
tp_deallocÚ__dealloc__rd   zstatic void %s(PyObject *o) {Ú__weakref__rƒ  c             S   s   g | ]}|j jr|‘qS r   )r9   r=  )r`   r?   r   r   r   rb   °  s    z8ModuleNode.generate_dealloc_function.<locals>.<listcomp>z#if CYTHON_USE_TP_FINALIZEz!_PyGC_FINALIZED(o)z2(!PyType_IS_GC(Py_TYPE(o)) || !_PyGC_FINALIZED(o))ziif (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && %s) {z1if (PyObject_CallFinalizerFromDealloc(o)) return;r   z#endifzPyObject_GC_UnTrack(o);z.if (p->__weakref__) PyObject_ClearWeakRefs(o);z+if (p->__dict__) PyDict_Clear(p->__dict__);z__Pyx_call_destructor(p->%s);zp->%sFT)rU  Úclear_before_decref)Zhave_gilzPyObject_GC_Track(o);z+if (PyType_IS_GC(%s)) PyObject_GC_Track(o);z%s(o);z%s->tp_dealloc(o);zJif (likely(%s)) %s->tp_dealloc(o); else __Pyx_call_next_tp_dealloc(o, %s);ZCallNextTpDealloczExtensionTypes.crŸ  r   zQ & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0)z^if (CYTHON_COMPILING_IN_CPYTHON && ((%s < %d) & (Py_TYPE(o)->tp_basicsize == sizeof(%s))%s)) {)r¡  z%s[%s++] = %s;r¢  z} else {z(*Py_TYPE(o)->tp_free)(o);)"r   r¤  r¥  r™  rì   Ú	slot_coderp   r§  r‡  r‘  r¨  rg   r¦  rœ  Úgenerate_usr_dealloc_callr„   Úput_xdecref_clearr9   Zput_xdecref_memoryviewslicer“   r   r«  Úis_builtin_typerÀ   r«   r
   r4  r&   rî   r   r©  rª  rƒ   r¬  )r<   r   rÁ   r°  r±  rì   Zslot_func_cnamer§  r‡  Úweakref_slotZ	dict_slotr  rZ  r´  rµ  Zfinalised_checkr?   Ú
base_cnamer¸  r¶  r©  rª  r·  r9   r   r   r   r†  ˜  s¨    




















z$ModuleNode.generate_dealloc_functionc             C   sl   |  d¡}|sd S | d¡ | d¡ | d¡ | d¡ | d|j ¡ | d¡ | d¡ | d	¡ d S )
Nr¹  Ú{zPyObject *etype, *eval, *etb;z!PyErr_Fetch(&etype, &eval, &etb);z&__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);z%s(o);z&__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);z PyErr_Restore(etype, eval, etb);r   )r¨  rp   r­  )r<   r   rÁ   r?   r   r   r   r½    s    






z$ModuleNode.generate_usr_dealloc_callc             C   sœ  t  d¡}| d¡}|jj}| |¡|kr.d S | d¡ | d| ¡ |jdd\}\}}	}
|sd|rn| d¡ |sv|	r‚|  ||¡ |röt  	||¡}|r¦| d| ¡ nP|j
rÆ|j}| d||f ¡ n0|j}| d	||||f ¡ |j t d
d¡¡ xL|D ]D}d|j }t t|j|¡}| d| ¡ | d| ¡ | d¡ qüW x>|	D ]6}|jd }| d| ¡ | d| ¡ | d¡ qJW | d¡ | d¡ d S )NZtp_traverserd   z2static int %s(PyObject *o, visitproc v, void *a) {F)Úinclude_gc_simplezint e;z!e = %s(o, v, a); if (e) return e;zLif (!%s->tp_traverse); else { e = %s->tp_traverse(o,v,a); if (e) return e; }z„e = ((likely(%s)) ? ((%s->tp_traverse) ? %s->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, %s)); if (e) return e;ZCallNextTpTraversezExtensionTypes.czp->%sz	if (%s) {z!e = (*v)(%s, a); if (e) return e;r   z.objzif (p->%s) {z$e = (*v)(p->%s, a); if (e) return e;z	return 0;)r   ZGCDependentSlotr¥  r™  rì   r¼  rp   r¦  rœ  r«  r¿  r“   rÀ   r«   r
   r4  r„   r   Útypecastr	   r9   )r<   r   rÁ   r¯  r°  r±  rì   r²  rZ  r³  r´  Ústatic_callrÁ  r?   Zvar_codeZvar_as_pyobjectr„   r   r   r   rˆ  %  sP    









z%ModuleNode.generate_traverse_functionc             C   sê  t  d¡}| d¡}|jj}| |¡|kr.d S |jdd\}\}}	}
|sP|	sP|rVd}nd}| d¡ | d||f ¡ |rŠtj	rŠ| d¡ |s’|	rž|  
||¡ |rt  ||¡}|rÄ| d| ¡ nP|jrä|j}| d	||f ¡ n0|j}| d
||||f ¡ |j t dd¡¡ tj	r|x~|D ]T}d|j }| d| ¡ |jrX|j|tdd n|j||jdd | d¡ q"W n x|D ]}| d|j ¡ q‚W x|	D ]}| d|j ¡ q¢W |jdkrÒ| d¡ | d¡ | d¡ d S )NZtp_clearF)rÃ  rd   zCYTHON_UNUSED zstatic int %s(%sPyObject *o) {zPyObject* tmp;z%s(o);z)if (!%s->tp_clear); else %s->tp_clear(o);z\if (likely(%s)) { if (%s->tp_clear) %s->tp_clear(o); } else __Pyx_call_next_tp_clear(o, %s);ZCallNextTpClearzExtensionTypes.czp->%sztmp = ((PyObject*)%s);)rU  zPy_XDECREF(tmp);zPy_CLEAR(p->%s);zPy_CLEAR(p->%s.obj);r£  z&__PYX_XDEC_MEMVIEW(&p->from_slice, 1);z	return 0;r   )r   Zget_slot_by_namer¥  r™  rì   r¼  r¦  rp   r   Zclear_to_nonerœ  r«  r¿  r“   rÀ   r«   r
   r4  r„   rl  Zput_init_to_py_noner	   r9   )r<   r   rÁ   r¯  r°  r±  rì   r²  rZ  r³  r´  ZunusedrÅ  rÁ  r?   rN   r   r   r   r‰  b  sZ    










z"ModuleNode.generate_clear_functionc             C   sT   |  d| d¡ ¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ d S )	Nz0static PyObject *%s(PyObject *o, Py_ssize_t i) {Zsq_itemzPyObject *r;z4PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;z2r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);zPy_DECREF(x);z	return r;r   )rp   r¥  )r<   r   rÁ   r   r   r   rŠ  ¦  s    z(ModuleNode.generate_getitem_int_functionc             C   sü   |j j}| d¡}| d¡}| d¡ | d| d¡ ¡ | d¡ |rZ| d|j ¡ n0|  |ddd	|¡ | d
¡ | d¡ | d¡ | d¡ | d¡ |r´| d|j ¡ n0|  |ddd	|¡ | d
¡ | d¡ | d¡ | d¡ | d¡ d S )Nrx  ry  rd   z6static int %s(PyObject *o, PyObject *i, PyObject *v) {Zmp_ass_subscriptzif (v) {zreturn %s(o, i, v);Ztp_as_mappingzo, i, vz'PyErr_Format(PyExc_NotImplementedError,zG  "Subscript assignment not supported by %.200s", Py_TYPE(o)->tp_name);z
return -1;r   zelse {zreturn %s(o, i);zE  "Subscript deletion not supported by %.200s", Py_TYPE(o)->tp_name);)r™  rì   r¨  rp   r¥  r­  Úgenerate_guarded_basetype_call)r<   r   rÁ   rì   Ú	set_entryÚ	del_entryr   r   r   r‹  º  sN    


z*ModuleNode.generate_ass_subscript_functionc             C   sh   |rd|j }|r>| d|||||f ¡ | d||||f ¡ n&| d||f ¡ | d|||f ¡ d S )Nzif (%s->%s && %s->%s->%s)z  return %s->%s->%s(%s);zif (%s->%s)z  return %s->%s(%s);)r“   rp   )r<   rì   ZsubstructureÚslotrX  rÁ   Zbase_tpnamer   r   r   rÆ  è  s    z)ModuleNode.generate_guarded_basetype_callc             C   sü   |j j}| d¡}| d¡}| d¡ | d| d¡ ¡ | d¡ |rZ| d|j ¡ n0|  |ddd	|¡ | d
¡ | d¡ | d¡ | d¡ | d¡ |r´| d|j ¡ n0|  |ddd	|¡ | d
¡ | d¡ | d¡ | d¡ | d¡ d S )Nrz  r{  rd   zEstatic int %s(PyObject *o, Py_ssize_t i, Py_ssize_t j, PyObject *v) {Zsq_ass_slicezif (v) {zreturn %s(o, i, j, v);Ztp_as_sequencez
o, i, j, vz'PyErr_Format(PyExc_NotImplementedError,zM  "2-element slice assignment not supported by %.200s", Py_TYPE(o)->tp_name);z
return -1;r   zelse {zreturn %s(o, i, j);zK  "2-element slice deletion not supported by %.200s", Py_TYPE(o)->tp_name);)r™  rì   r¨  rp   r¥  r­  rÆ  )r<   r   rÁ   rì   rÇ  rÈ  r   r   r   rŒ  û  sR    


z&ModuleNode.generate_ass_slice_functionc             C   s  |  d¡rd S | d¡}| d¡ | d| ¡ | d¡ g }|j}x.|d k	rr|jjdksr| |j¡ |jjj}qFW ||ks€t	‚d }|r¦|jjdkr¦|j
rž|n|jj}d }d}x†tjD ]|}	x"|D ]}
|
  |	¡}|d k	rÀP qÀW q¶|	 d¡ ¡ }| d	| ¡ |	d
kr
|}n|	dkrd}| d|j ¡ | d¡ q¶W |r¼|s¼|s¼| d¡ | d¡ | d|j ¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d¡ |rê|j
rê| d|j
|j
f ¡ | d¡ | d¡ | d¡ | d¡ d S )NZ__richcmp__Ztp_richcomparerd   z9static PyObject *%s(PyObject *o1, PyObject *o2, int op) {zswitch (op) {ra  Fr  zcase Py_%s: {Ú__eq__Ú__ne__Tzreturn %s(o1, o2);r   zcase Py_NE: {zPyObject *ret;zret = %s(o1, o2);z.if (likely(ret && ret != Py_NotImplemented)) {z3int b = __Pyx_PyObject_IsTrue(ret); Py_DECREF(ret);z!if (unlikely(b < 0)) return NULL;zret = (b) ? Py_False : Py_True;zPy_INCREF(ret);zreturn ret;z
default: {zFif (likely(%s->tp_richcompare)) return %s->tp_richcompare(o1, o2, op);z'return __Pyx_NewRef(Py_NotImplemented);)r¨  r¥  rp   r™  r?   r^   r,   r   rì   r0   r“   r   r”  r´   Úupperr­  )r<   r   rÁ   Zrichcmp_cfuncZclass_scopesÚclsZextern_parentZeq_entryZhas_neZ
cmp_methodZclass_scoper?   Zcmp_typer   r   r   r•  +  sf    





















z$ModuleNode.generate_richcmp_functionc                s  d‡ ‡fdd„	‰ ˆ ddd}ˆ dƒ}ˆ dƒ}|  d¡ |  d	ˆ d
¡ ¡ |d k	rd|  d|j ¡ n^|sŠˆjjrŠ|j t dd¡¡ d}n*|r–|dkr°|j t dd¡¡ d}nd}|  d| ¡ |d k	rø|  d¡ |  d¡ |  d|j ¡ |  d¡ |  d¡ |  d¡ d S )Nc                sN   |d krˆj }|j | ¡}|d krJ|jr4|d k	r4|S |jd k	rJˆ | |jƒS |S )N)r™  r   r¨  Úis_externalrì   )ÚnÚtpÚextern_returnÚr)Úlookup_here_or_baser   r   r   rÓ  x  s    
zBModuleNode.generate_getattro_function.<locals>.lookup_here_or_baserƒ  ra  )rÑ  r|  r}  rd   z/static PyObject *%s(PyObject *o, PyObject *n) {Ztp_getattrozPyObject *v = %s(o, n);ZPyObject_GenericGetAttrNoDictzObjectHandling.cZ#__Pyx_PyObject_GenericGetAttrNoDictZPyObject_GenericGetAttrZ__Pyx_PyObject_GenericGetAttrz9if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) {zPyErr_Clear();zv = %s(o, n);r   z	return v;)NN)	rp   r¥  r­  r™  r§  rÀ   r«   r
   r4  )r<   r   rÁ   Zhas_instance_dictZgetattr_entryZgetattribute_entryZgeneric_getattr_cfuncr   )rÓ  r   r   r  q  sJ    


z%ModuleNode.generate_getattro_functionc             C   sÔ   |j j}| d¡}| d¡}| d¡ | d| d¡ ¡ | d¡ |rZ| d|j ¡ n|  |d dd|¡ | d	¡ | d
¡ | d¡ |r | d|j ¡ n|  |d dd|¡ | d¡ | d
¡ | d
¡ d S )Nr~  r  rd   z6static int %s(PyObject *o, PyObject *n, PyObject *v) {Ztp_setattrozif (v) {zreturn %s(o, n, v);zo, n, vz(return PyObject_GenericSetAttr(o, n, v);r   zelse {zreturn %s(o, n);z(return PyObject_GenericSetAttr(o, n, 0);)r™  rì   r¨  rp   r¥  r­  rÆ  )r<   r   rÁ   rì   rÇ  rÈ  r   r   r   rŽ  ­  sB    


z%ModuleNode.generate_setattro_functionc             C   sn   |  d¡}| d¡ | d| d¡ ¡ | d¡ | d¡ | d¡ | d|j ¡ | d	¡ | d
¡ d S )Nr€  rd   z<static PyObject *%s(PyObject *o, PyObject *i, PyObject *c) {Ztp_descr_getzPyObject *r = 0;zif (!i) i = Py_None;zif (!c) c = Py_None;zr = %s(o, i, c);z	return r;r   )r¨  rp   r¥  r­  )r<   r   rÁ   Zuser_get_entryr   r   r   r  Õ  s$    


z&ModuleNode.generate_descr_get_functionc             C   sè   |j j}| d¡}| d¡}| d¡ | d| d¡ ¡ | d¡ |rZ| d|j ¡ n&|  |d dd|¡ | d	¡ | d
¡ | d¡ | d¡ |rª| d|j ¡ n&|  |d dd|¡ | d¡ | d
¡ | d¡ | d¡ d S )Nr  r‚  rd   z6static int %s(PyObject *o, PyObject *i, PyObject *v) {Ztp_descr_setzif (v) {zreturn %s(o, i, v);zo, i, vz6PyErr_SetString(PyExc_NotImplementedError, "__set__");z
return -1;r   zelse {zreturn %s(o, i);z9PyErr_SetString(PyExc_NotImplementedError, "__delete__");)r™  rì   r¨  rp   r¥  r­  rÆ  )r<   r   rÁ   rì   Zuser_set_entryZuser_del_entryr   r   r   r  ñ  sJ    


z&ModuleNode.generate_descr_set_functionc             C   sL   xF|j D ]<}|j}| dg¡r*|  ||¡ | ddg¡r|  ||¡ qW d S )Nr€  r  Ú__del__)Úproperty_entriesr   r’  Úgenerate_property_get_functionÚgenerate_property_set_function)r<   Zcclass_scoperÁ   r?   Úproperty_scoper   r   r   r–    s    z&ModuleNode.generate_property_accessorsc             C   s\   |j }|j tj|j¡|_| d¡}| d¡ | d|j ¡ | d|j	 ¡ | d¡ d S )Nr€  rd   z9static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {zreturn %s(o);r   )
r   Úparent_scoper•   r   Zprop_get_prefixrN   Úgetter_cnamer¨  rp   r­  )r<   Úproperty_entryrÁ   rØ  Z	get_entryr   r   r   rÖ  %  s    



z)ModuleNode.generate_property_get_functionc             C   sÒ   |j }|j tj|j¡|_| d¡}| d¡}| d¡ | d|j ¡ | d¡ |rh| d|j	 ¡ n| d¡ | d¡ | d	¡ | d
¡ |r¦| d|j	 ¡ n| d¡ | d¡ | d	¡ | d	¡ d S )Nr  rÔ  rd   z@static int %s(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {zif (v) {zreturn %s(o, v);z6PyErr_SetString(PyExc_NotImplementedError, "__set__");z
return -1;r   zelse {zreturn %s(o);z6PyErr_SetString(PyExc_NotImplementedError, "__del__");)
r   rÙ  r•   r   Zprop_set_prefixrN   Úsetter_cnamer¨  rp   r­  )r<   rÛ  rÁ   rØ  rÇ  rÈ  r   r   r   r×  4  sF    



z)ModuleNode.generate_property_set_functionc       
      C   sÐ   |j }|j}xtjD ]}| ||¡ qW | d¡ |jdkrBd}nd}| ||j ¡ | d¡ | d| j|j	f ¡ |j
r„|j}n
d|j }| d| ¡ | d	¡ xtjD ]}	|	 ||¡ q®W | d
¡ d S )Nrd   r]   zDL_EXPORT(PyTypeObject) %s = {zstatic PyTypeObject %s = {zPyVarObject_HEAD_INIT(0, 0)z"%s.%s", /*tp_name*/z	struct %szsizeof(%s), /*tp_basicsize*/z0, /*tp_itemsize*/z};)r9   r   r   ZsubstructuresZgenerate_substructurerp   r^   r”   r8   Ú
class_namerD  rù   Z
slot_tableÚgenerate)
r<   Úmodnamer?   rÁ   r9   r   ZsuiterL  Ú	objstructrÉ  r   r   r   r˜  [  s2    



z&ModuleNode.generate_typeobj_definitionc             C   s–   |j r|jsd S |jd }| d¡ | ¡ }| d|j ¡ x.|jD ]$}|jsD|rX|jsD|j|d|d qDW | d¡ | d¡ | 	¡ r’| d¡ d S )NÚbindingrd   zstatic PyMethodDef %s[] = {r_  )Úwrapper_code_writerz{0, 0, 0, 0}z};)
Zis_c_class_scopeZpyfunc_entriesr&   rp   Úinsertion_pointÚmethod_table_cnameZfused_cfunctionZis_overridableZput_pymethoddefÚgetvalue)r<   r'   rÁ   rá  râ  r?   r   r   r   r±   y  s"    


z ModuleNode.generate_method_tablec             C   sœ   |  d¡}|r|jsd S | d¡}|j}| d¡ | d| ¡ |  ||¡ | d| ¡ | d| ¡ | d¡ | d| ¡ | d	| ¡ | d¡ d S )
Nrƒ  Z__dict__getterrd   z9static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {zif (unlikely(!p->%s)){zp->%s = PyDict_New();r   zPy_XINCREF(p->%s);zreturn p->%s;)r¨  Zis_variabler¥  r„   rp   rœ  )r<   r   rÁ   Ú	dict_attrÚ	func_nameZ	dict_namer   r   r   r“    s    




z(ModuleNode.generate_dict_getter_functionc             C   s’   |j rŽ| d¡ | d|j ¡ xX|j D ]N}|j}|rN|jrD| ¡ }| ¡ }nd}| d|j|jpdd|j	pld|f ¡ q(W | d¡ | d¡ d S )Nrd   z"static struct PyGetSetDef %s[] = {r9  z&{(char *)"%s", %s, %s, (char *)%s, 0},z{0, 0, 0, 0, 0}z};)
rÕ  rp   Zgetset_table_cnamerB   Z
is_unicodeZas_utf8_stringZas_c_string_literalrN   rÚ  rÜ  )r<   r'   rÁ   r?   rB   Zdoc_coder   r   r   r—  Ÿ  s,    


z ModuleNode.generate_getset_tablec             C   s@   x:t |j ¡ ƒD ](\}}|jr|jr|jjs|j |¡ qW d S )N)rH   rI   rJ   Ú
is_cglobalrú   r9   rR  r*  )r<   r'   rN   r?   r   r   r   rG   ¸  s    z5ModuleNode.create_import_star_conversion_utility_codec          
   C   sÜ  |  t dd¡¡ | ¡  | ¡  | dtj ¡ | d¡ x.t|j 	¡ ƒD ]\}}|j
rL| d| ¡ qLW | d¡ | d¡ | d¡ | d	¡ | d
¡ | d¡ | d¡ | d¡ | d¡ | d¡ | ¡ }| d¡ d}xNt|j 	¡ ƒD ]:\}}|jrø|jrø|jjsø|d7 }|d dkrJ| d¡ | d¡ | d¡ | d| ¡ |jjrØ|jjsv|jjr˜| d|j d¡| |j¡f ¡ | d¡ |j|j|jdd | d|jt |jtd¡f ¡ nR|j |¡r| |j d|j|j|¡¡ n&| d||jf ¡ | | |j¡¡ | d¡ qøW | d¡ | dtj ¡ | d¡ | d ¡ | |j¡rŒ|  |j¡ | !| j"¡ ||_| d!¡ | d"¡ | d¡ | d#¡ | t #d$d%¡d ¡ | $¡  d S )&NZCStringEqualszStringTools.cz;static int %s(PyObject *o, PyObject* py_name, char *name) {z,static const char* internal_type_names[] = {z"%s",r9  z};z-const char** type_name = internal_type_names;zwhile (*type_name) {z$if (__Pyx_StrEq(name, *type_name)) {zBPyErr_Format(PyExc_TypeError, "Cannot overwrite C type %s", name);z	goto bad;r   ztype_name++;zif (0);r   r   éd   z#ifdef _MSC_VERz)if (0);  /* Workaround for MSVC C1061. */z#endifz#else if (__Pyx_StrEq(name, "%s")) {zif (!(%s)) %s;r¢  zPy_INCREF(o);F)rU  z%s = %s;zGPyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");zelse {z3if (PyObject_SetAttr(%s, py_name, o) < 0) goto bad;z	return 0;zbad:z
return -1;rd   Z
ImportStarzImportExport.c)%r«   r
   r4  rp   Úenter_cfunc_scoper   Zimport_star_setrH   rI   rJ   rL   Znew_error_labelrè  rú   r9   Zis_constrR  rü   r¿  Ztype_test_codeÚ
error_gotorC   Z
put_decrefr„   r   rÄ  r	   r*  Zfrom_py_call_coder+  Ú
label_usedÚerror_labelÚ	put_labelÚput_add_tracebackr8   r—   Úexit_cfunc_scope)r<   r'   rÁ   rN   r?   Zold_error_labelZ
msvc_countr   r   r   r²   À  sx    

























zModuleNode.generate_import_starc          
   C   s   |   | j| j|¡}| | j¡ | d¡ | t dd¡d ¡ d|j }d|  d|¡ }| d¡ | d	| ¡ | |¡ | d
¡ | d	| ¡ | |¡ | d¡ | d¡ | dt	j
 ¡ | d¡ t dd¡d }| |¡ | d¡ | d|  t	j|¡t	jf ¡ | d¡ | d¡ | d¡ | ¡ }|jjd }	|jjd }
|	sV|
rj|j t dd¡¡ | ¡  | d¡ | dt	j ¡ | dt	jt	jf ¡ | d|j ¡ | d¡ | d¡ | d¡ | dt	jt	jf ¡ | d¡ |	sü|
r| ¡  | ¡  t dd¡d }| | ¡ ¡ | |¡ | t dd¡¡ | | jd¡ | d ¡ | d!¡ | d¡ | d"t	j| t	j| j¡f ¡ | d#t	j| t	j| j¡f ¡ | d$t	j| t	j| j¡f ¡ x8d%D ]0}| d&| ¡ | | jd'| ¡ | d¡ qØW | d(¡ |jd) r0| | jd*¡ | d+¡ | d,¡ | d-¡ | d¡ | d.¡ |  ||¡ | d/¡ | | jd0¡ | d1¡ | | jd2¡ | d¡ | d3t	j | j! "d4d5¡f ¡ | | jd6|j| #t$d7ƒ¡| #t$d8ƒ¡f ¡ | d¡ |  %||¡ t&j'r*| d9¡ | | jd:¡ | d;¡ | | jd<¡ | d=¡ |d>ƒ}|  (||¡ W d Q R X |d?ƒ}|  )||¡ W d Q R X |d@ƒ}|  *||¡ W d Q R X |dAƒ}|  +||¡ W d Q R X |dBƒ$}x|D ]}|  ,|||¡ qÜW W d Q R X |dCƒ$}x|D ]}|  -|||¡ qW W d Q R X |dDƒ.}x&|D ]}|  .|¡ |  /|||¡ q@W W d Q R X | dE¡ | 0d ¡ | dF¡ | | jdG¡ | d¡ |	s®|
rÎ|j1|| j|j2j3 dH dI|j2_4| j5 6|¡ |	sæ|
rdJ|j2_4|j7dK|j2j3 dH | ¡  | dL¡ |  8||¡ | ¡  t&j9rZ|j t dMd¡¡ | dN| :| j¡ ¡ | ;|j<¡ | =|j>¡ x$|j2 ?¡ D ]\}}| @||¡ q~W | d|j ¡ | d|jA ¡ | BdO|jC ¡ |j tDjE¡ | d¡ |jF|jtGdJdIdP | dQ¡ | dR|jC ¡ | d¡ | =|j<¡ | H¡  | d¡ | dS|j ¡ | d¡ | dT|j ¡ | d
¡ | dU¡ | d¡ | d¡ | I|j2¡ | J¡  d S )VNrd   ZPyModInitFuncTypezModuleSetupCode.cr   z!__Pyx_PyMODINIT_FUNC init%s(void)z__Pyx_PyMODINIT_FUNC %s(void)re   z#if PY_MAJOR_VERSION < 3z%s CYTHON_SMALL_CODE; /*proto*/z#elsez"#if CYTHON_PEP489_MULTI_PHASE_INITrÂ  zreturn PyModuleDef_Init(&%s);r   ZModuleCreationPEP489r   z-static CYTHON_SMALL_CODE int %s(PyObject *%s)z#endifÚprofileÚ	linetraceZProfilez	Profile.cz	if (%s) {zif (%s == %s) return 0;zrPyErr_SetString(PyExc_RuntimeError, "Module '%s' has already been imported. Re-initialisation is not supported.");z
return -1;z#elif PY_MAJOR_VERSION >= 3z if (%s) return __Pyx_NewRef(%s);ZImportRefnannyAPIZCheckBinaryVersionz__Pyx_check_binary_version()z'#ifdef __Pxy_PyFrame_Initialize_Offsetsz#__Pxy_PyFrame_Initialize_Offsets();z%s = PyTuple_New(0); %sz)%s = PyBytes_FromStringAndSize("", 0); %sz+%s = PyUnicode_FromStringAndSize("", 0); %s)Z
CyFunctionZFusedFunctionÚ	CoroutineÚ	GeneratorZAsyncGenÚStopAsyncIterationz#ifdef __Pyx_%s_USEDz__pyx_%s_init()z)/*--- Library function declarations ---*/Z
np_pythranz_import_array()z'/*--- Threads initialization code ---*/zx#if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADSzPyEval_InitThreads();z /*--- Module creation code ---*/z4/*--- Initialize various global constants etc. ---*/z__Pyx_InitGlobals()zp#if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)z*__Pyx_init_sys_getdefaultencoding_params()zif (%s%s) {r…   r†   zPyObject_SetAttr(%s, %s, %s)Ú__name__Ú__main__z/*--- Builtin init code ---*/z__Pyx_InitCachedBuiltins()z/*--- Constants init code ---*/z__Pyx_InitCachedConstants()z*/*--- Global type/function init code ---*/zGlobal init codezVariable export codezFunction export codezType init codezType import codezVariable import codezFunction import codez/*--- Execution code ---*/zB#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)z__Pyx_patch_abc())ZnogilTFZPy_Nonez/*--- Wrapped vars code ---*/ZRegisterModuleCleanupzif (__Pyx_RegisterCleanup()) %szinit %s)rU  r»  z} else if (!PyErr_Occurred()) {z.PyErr_SetString(PyExc_ImportError, "init %s");zreturn (%s != NULL) ? 0 : -1;z
return %s;zreturn;)KÚmod_init_subfunctionrC   r   rê  rp   r
   r—   r:   ry   r   Úpymoduledef_cnamer–   Úpymodule_exec_func_cnameÚpymodinit_module_argrã  rÀ   r&   r«   r4  Úput_declare_refcount_contextr+  Zput_trace_declarationsZput_trace_frame_initÚrstripÚput_setup_refcount_contextÚloadZput_error_if_negr/  Úerror_goto_if_nullr0  r1  Úgenerate_module_creation_coder­   r8   rˆ   Úintern_identifierr   Úgenerate_module_import_setupr   Úcache_builtinsÚgenerate_global_init_codeÚgenerate_c_variable_export_codeÚgenerate_c_function_export_codeÚgenerate_type_init_codeÚ$generate_type_import_code_for_moduleÚ*generate_c_variable_import_code_for_modulerc  Ú*generate_c_function_import_code_for_moduler¯   Zput_trace_callÚ	funcstateZ	gil_ownedZ	can_tracer+   Zgenerate_execution_codeZput_trace_returnÚgenerate_wrapped_entries_codeÚgenerate_cleanup_coderë  Zput_gotoZreturn_labelrî  rí  Úall_managed_tempsÚput_xdecrefr,  rï  r‡   r   Ztraceback_utility_coder®  r	   Úput_finish_refcount_contextÚput_temp_declarationsrð  )r<   r   r'   rÁ   ZsubfunctionÚheader2Zheader3Zmod_create_funcÚtempdecl_coderñ  rò  Zrefnanny_import_codeÚext_typeZ
inner_coder[   r„   r9   r   r   r   rµ   	  s8   































































z$ModuleNode.generate_module_init_funcc                sD   ˆ  ¡ ‰ˆ d¡ ˆ  ¡ ‰ ˆ  d¡ G ‡ ‡‡‡‡fdd„dtƒ}|S )a‰  
        Return a context manager that allows deviating the module init code generation
        into a separate function and instead inserts a call to it.

        Can be reused sequentially to create multiple functions.
        The functions get inserted at the point where the context manager was created.
        The call gets inserted where the context manager is used (on entry).
        rd   c                   s4   e Zd Zdd„ Z‡ ‡‡‡fdd„Z‡ ‡fdd„ZdS )z;ModuleNode.mod_init_subfunction.<locals>.ModInitSubfunctionc             S   sB   d  | ¡  ¡ ¡}t d|¡s"t‚d| | _|| _d | _d | _	d S )Nr  z^[a-z0-9_]+$z__Pyx_modinit_%s)
rÎ   r'  Úsplitr   Úmatchr0   Ú
cfunc_nameÚdescriptionr  Ú	call_code)r<   Z	code_typer„   r   r   r   Ú__init__ï	  s    
zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__init__c                sj   ˆ  ¡ | _ˆ }| ˆ¡ ˆ d| j ¡ | d| j ¡ | ¡  |  ¡ | _| | j¡ | d| j ¡ |S )Nz0static CYTHON_SMALL_CODE int %s(void); /*proto*/zstatic int %s(void) {z/*--- %s ---*/)	rã  r  rê  rp   r  rü  r  rþ  r  )r<   rÁ   )Úfunction_codeÚ	orig_codeÚ
prototypesr   r   r   Ú	__enter__÷	  s    


zEModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__enter__c                sÖ   ˆ }|  ¡  | d¡ | j |j¡ d | _| |j¡}|r|| |j¡ x"|j ¡ D ]\}}| 	||¡ qRW |  ¡  | d¡ | d¡ | 
¡  | d¡ |rº| j | j d| j ˆ¡¡ n| j d| j ¡ d | _d S )Nz	return 0;z
return -1;r   rd   z%s()z(void)%s();)r  rp   r  r  r  rì  rí  rî  r  r  rð  r  Úerror_goto_if_negr  )r<   rX  rÁ   Zneeds_error_handlingr„   r9   )r  rC   r   r   Ú__exit__
  s(    



zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__exit__N)rö  Ú
__module__Ú__qualname__r  r  r!  r   )r  r  rC   r  r   r   r   ÚModInitSubfunctionî	  s   r$  )rã  rp   Úobject)r<   rC   r   r  r$  r   )r  r  rC   r  r   r   rø  à	  s    	

0zModuleNode.mod_init_subfunctionc             C   s  |j d }|dkr| jd j}|r| d¡ | d|j|j tt|ƒƒ¡j	| 
| j¡f ¡ | d¡ |jrd| d¡ |j td¡}| d||j tttj |¡ƒƒ¡j	| || j¡f ¡ | |¡ | d	|j|| 
| j¡f ¡ | |t¡ |j |¡ | d¡ nX|jrd| d¡ |j t d
d¡¡ | | d|j t| jƒ¡j	 | j¡¡ | d¡ | j}| d¡rˆ|d tdƒ … }| d¡ | d¡ | d| d| j¡ ¡ | d| ¡ | | d||jf | j¡¡ | d¡ | d¡ | d¡ d S )NZset_initial_pathZ
SOURCEFILEr   z&if (!CYTHON_PEP489_MULTI_PHASE_INIT) {z7if (PyObject_SetAttrString(%s, "__file__", %s) < 0) %s;r   Tz!%s = Py_BuildValue("[O]", %s); %sz7if (PyObject_SetAttrString(%s, "__path__", %s) < 0) %s;ZSetPackagePathFromImportLibzImportExport.cz%__Pyx_SetPackagePathFromImportLib(%s)z	.__init__z#if PY_MAJOR_VERSION >= 3rÂ  z0PyObject *modules = PyImport_GetModuleDict(); %sr¾   z+if (!PyDict_GetItemString(modules, "%s")) {z'PyDict_SetItemString(modules, "%s", %s)z#endif)r&   rC   Úfilenamerp   r+  rÀ   Zget_py_string_constr   r   r„   rë  Ú
is_packager  Úallocate_tempr	   r   r‘   rÍ   r   Ú
put_gotrefr®  Úrelease_tempr«   r
   rÿ  r   r8   ÚendswithrW  )r<   r'   rÁ   Úmodule_pathÚtempZfq_module_namer   r   r   r   
  sd    














z'ModuleNode.generate_module_import_setupc             C   s  t js
d S | dtj ¡ | |¡ t jdkr†| d¡ t|jƒ}| ¡  x:|D ]2}|j	dkrP|j
jrP|jrP|j|j|j
ddd qPW | d¡ t jd	krÖ| d
¡ x0t|jt d¡dD ]}|j|j|ddd qºW t jr| d¡ x$|jD ]}|j|jtjddd qðW | d¡ |jtjtjddd xŽ|jD ]„}|j
}|js6|jrTq6|jj dd¡r6|j}|  tj!¡}|  tj"¡}	| d|	 ¡ | d||	f ¡ | d¡ | d¡ q6W t j#d k	rÞ|jtj$tddd x,|j%tj&tj'gD ]}
|j|
tddd qðW d S )Nz.static void %s(CYTHON_UNUSED PyObject *self) {r   z/*--- Global cleanup code ---*/ra  TF)r»  rU  z__Pyx_CleanupGlobals();é   z$/*--- Type import cleanup code ---*/r“   )rò   z /*--- Builtin cleanup code ---*/z/*--- Intern cleanup code ---*/rŸ  r   zwhile (%s > 0) {z"PyObject* o = (PyObject*)%s[--%s];z(*Py_TYPE(o)->tp_free)(o);r   )rU  r»  )(r   r  rp   r   Úcleanup_cnamerê  rÝ   rg   Úreverser^   r9   rR  rú   r¾  r„   rH   Útypes_importedr   r  r“   r  Zcached_builtinsr   r	   r®  r/  r7   rÎ  rì   r   r&   rî   r¥  r©  rª  r2  r3  r,  r.  r-  )r<   r'   rÁ   Zrev_entriesr?   r  Zcclass_typer   r©  rª  r„   r   r   r   r¶   \
  sl    














z'ModuleNode.generate_module_cleanup_funcc             C   s\   dt j| j dd¡f }tjdkr(d}ntj}t dd¡}|j 	|j
|j|tj|d¡ d S )	Nz%s%sr…   r†   ÚmainÚwmainZMainFunctionzEmbed.c)r:   r­   r©   Zwmain_method)r   r­   r8   rˆ   r   r·   r
   r4  rÀ   r«   Z
specializer:   )r<   r'   rÁ   r­   r3  r©   r   r   r   r¸   £
  s    
zModuleNode.generate_main_methodc             C   s   d||j f S )Nz%s_%s)r:   )r<   Úprefixr'   r   r   r   ry   ±
  s    zModuleNode.mod_init_func_cnamec             C   s¾  |j rd| |j ¡ }nd}tjr.dtj }nd}| d¡ | d¡ | d¡ |  tj|¡}| dtj	 ¡ | d	| ¡ | d
tj
 ¡ | dtj	 ¡ | d| ¡ | d¡ | d¡ | d¡ | d¡ | dtj ¡ | d¡ | d|j ¡ | d| ¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d|j ¡ | d¡ | dtj
 ¡ | d¡ | d¡ | d¡ | d¡ | d¡ | d| ¡ | d¡ | d¡ d S )Nz%sr9  z(freefunc)%sZNULLrd   z#if PY_MAJOR_VERSION >= 3z"#if CYTHON_PEP489_MULTI_PHASE_INITz@static PyObject* %s(PyObject *spec, PyModuleDef *def); /*proto*/z*static int %s(PyObject* module); /*proto*/z static PyModuleDef_Slot %s[] = {z{Py_mod_create, (void*)%s},z{Py_mod_exec, (void*)%s},z	{0, NULL}z};z#endifz static struct PyModuleDef %s = {z  PyModuleDef_HEAD_INIT,z  "%s",z  %s, /* m_doc */z  0, /* m_size */z#elsez  -1, /* m_size */z  %s /* m_methods */,z  %s, /* m_slots */z  NULL, /* m_reload */z  NULL, /* m_traverse */z  NULL, /* m_clear */z  %s /* m_free */)rB   Úget_string_constr   r  r   r/  rp   ry   rú  Zpymodule_create_func_cnameZpymoduledef_slots_cnamerù  r:   rä  )r<   r'   rÁ   rB   Zcleanup_funcZexec_func_cnamer   r   r   r³   ´
  sP    




















z&ModuleNode.generate_pymoduledef_structc          	   C   sÌ  |j rd| |j ¡ }nd}| d¡ | d|jtjf ¡ |j|jtdd | d¡ | d¡ | d	|j|j|j	||jf ¡ | d¡ | d
|jtj
f ¡ | d¡ | | |j| j¡¡ | d¡ | d|j|j| |j| j¡f ¡ |j|jtdd | dtj| tj| j¡f ¡ |jtjtdd | dtj| tj| j¡f ¡ |jtjtdd | d|jtj| | j¡f ¡ tjd k	rÈ| dtjtj| tj| j¡f ¡ |jtjtdd d S )Nz%sr9  z"#if CYTHON_PEP489_MULTI_PHASE_INITz%s = %s;F)rU  z#elsez#if PY_MAJOR_VERSION < 3zI%s = Py_InitModule4("%s", %s, %s, 0, PYTHON_API_VERSION); Py_XINCREF(%s);z%s = PyModule_Create(&%s);z#endifz%s = PyModule_GetDict(%s); %sz6%s = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); %sz6%s = PyImport_AddModule((char *) "cython_runtime"); %sz:if (PyObject_SetAttrString(%s, "__builtins__", %s) < 0) %sz!%s = PyImport_AddModule("%s"); %s)rB   r5  rp   r+  r   rû  Z
put_increfr	   r:   rä  rù  r   rC   r,  r-  r.  rë  r   r2  r3  )r<   r'   rÁ   rB   r   r   r   r  ã
  sh    





z(ModuleNode.generate_module_creation_codec             C   s2   x,|j D ]"}|jdkr|jr|j ||¡ qW d S )Nra  )rg   r^   rú   r9   Zglobal_init_code)r<   r'   rÁ   r?   r   r   r   r    s    
z$ModuleNode.generate_global_init_codec          	   C   s²   x¬t |j ¡ ƒD ]š\}}|jr|js|j|kr|j |¡sLt|j	d|j ƒ | 
d¡ | 
d|jj|jf ¡ | 
| d|j	¡¡ | 
d|j|| |j	¡f ¡ | 
d¡ qW d S )Nz$Cannot convert '%s' to Python objectrÂ  zPyObject* wrapped = %s(%s);Úwrappedz6if (PyObject_SetAttrString(%s, "%s", wrapped) < 0) %s;r   )rH   rI   rJ   rK   rL   r   r9   r)  r   rC   rp   Zto_py_functionr„   r   r+  rë  )r<   r'   rÁ   rN   r?   r   r   r   r  '  s"    

z(ModuleNode.generate_wrapped_entries_codec          
   C   s˜   g }x4|j D ]*}|js,|js,tjr|jdks| |¡ qW |r”| t 	dd¡¡ xB|D ]:}|j
 ¡ }| |j¡}| d||j|| | j¡f ¡ qVW d S )Nra  ZVoidPtrExportzImportExport.cz6if (__Pyx_ExportVoidPtr(%s, (void *)&%s, "%s") < 0) %s)rg   r_   rZ   r   Úcimport_from_pyxr^   r,   r«   r
   r4  r9   rš   r  rN   rp   r„   rë  rC   )r<   r'   rÁ   rI   r?   Ú	signaturerN   r   r   r   r  :  s    

z*ModuleNode.generate_c_variable_export_codec          
   C   sŽ   g }x4|j D ]*}|js,|js,tjr|jdks| |¡ qW |rŠ| t 	dd¡¡ x8|D ]0}|j
 ¡ }| d|j|j|| | j¡f ¡ qVW d S )Nra  ZFunctionExportzImportExport.cz@if (__Pyx_ExportFunction("%s", (void (*)(void))%s, "%s") < 0) %s)rY   r_   rZ   r   r7  r^   r,   r«   r
   r4  r9   r˜   rp   rN   r„   rë  rC   )r<   r'   rÁ   rI   r?   r8  r   r   r   r  K  s     

z*ModuleNode.generate_c_function_export_codec          	   C   sD   t |ƒ2}x*|jD ] }|jr|  ||j|j||¡ qW W d Q R X d S )N)r›   r7   rZ   Úgenerate_type_import_coder9   rC   )r<   r[   r'   rÁ   rž   r?   r   r   r   r	  `  s    
z/ModuleNode.generate_type_import_code_for_modulec             C   s.   x(|j dd… D ]}|jjr|j ¡  qW dS )a  
        If fused c(p)def functions are defined in an imported pxd, but not
        used in this implementation file, we still have fused entries and
        not specialized ones. This method replaces any fused entries with their
        specialized ones.
        N)rY   r9   Zis_fusedZ"get_all_specialized_function_types)r<   Zpxd_envr?   r   r   r   rc  i  s    z!ModuleNode.specialize_fused_typesc       	      C   sî   g }x|j D ]}|jr| |¡ qW |rê| t dd¡¡ |jjtdd}| 	d||j
|| | j¡f ¡ | |¡ x\|D ]T}||krŽ|j}n| tj|j¡}|j ¡ }| 	dtj||j||| | j¡f ¡ qzW | |t¡ |j |¡ d S )NrŠ   zImportExport.cT)Ú
manage_refz-%s = PyImport_ImportModule("%s"); if (!%s) %sz@if (__Pyx_ImportVoidPtr_%s(%s, "%s", (void **)&%s, "%s") < 0) %s)rg   rZ   r,   r«   r
   r4  r  r(  r	   rp   r‡   rë  rC   r)  r„   r•   r   rs  rN   r9   rš   r™   r®  r*  )	r<   r[   r'   rÁ   rI   r?   r-  r„   r8  r   r   r   r
  u  s6    



z5ModuleNode.generate_c_variable_import_code_for_modulec             C   sÒ   g }x$|j D ]}|jr|jr| |¡ qW |rÎ| t dd¡¡ |jjt	dd}| 
d||j|| | j¡f ¡ | |¡ x:|D ]2}| 
dtj||j|j|j ¡ | | j¡f ¡ q€W | |t	¡ |j |¡ d S )Nr‹   zImportExport.cT)r:  z-%s = PyImport_ImportModule("%s"); if (!%s) %szIif (__Pyx_ImportFunction_%s(%s, "%s", (void (**)(void))&%s, "%s") < 0) %s)rY   rZ   rú   r,   r«   r
   r4  r  r(  r	   rp   r‡   rë  rC   r)  r   r™   rN   r„   r9   r˜   r®  r*  )r<   r[   r'   rÁ   rI   r?   r-  r   r   r   r  ”  s4    

z5ModuleNode.generate_c_function_import_code_for_modulec          	   C   s€   t |ƒn}xf|jD ]\}|jdkr>|js>|  ||j|j||¡ q|  ||||¡ |  ||¡ |jj	r|  
||¡ qW W d Q R X d S )Nra  )r›   r7   r^   Úutility_code_definitionr9  r9   rC   Úgenerate_base_type_import_codeÚ!generate_exttype_vtable_init_codeZ
early_initÚgenerate_type_ready_code)r<   r'   rÁ   rž   r?   r   r   r   r  ±  s    
z"ModuleNode.generate_type_init_codec             C   s<   |j j}|r8|j|jkr8|js8|js8|  ||| j||¡ d S )N)r9   rì   r:   r‡   r¿  r;  r9  rC   )r<   r'   r?   rÁ   rž   rì   r   r   r   r<  ¾  s    z)ModuleNode.generate_base_type_import_codec          
   C   s   ||j krd S |jtjkr.|j t dd¡¡ | j||||d |j	r€|j t dd¡¡ | 
d|j	|j|j| |j	|¡f ¡ |j  |¡ d S )NrŒ   zImportExport.c)Ú	error_posZ	GetVTablez1%s = (struct %s*)__Pyx_GetVtable(%s->tp_dict); %s)r1  rN   r   Úctypedef_builtins_maprÀ   r«   r
   r4  rœ   rf  rp   r÷   r“   r   rí   )r<   r'   r9   rC   rÁ   rž   r   r   r   r9  Ä  s    
z$ModuleNode.generate_type_import_codec             C   s<  |j r|j}n
d|j }|}|j}d  }	}
|dkr<d| }nd|jtjkrltj|j }| d|j|f ¡ d S d}|jtjkrŒtj|j \}	}
|tj	kr tj	| }|sº|d k	s°t
‚| |¡}| ||¡}| d|jtj||f ¡ |	r8|
r8| d¡ | d|	 ¡ | d	|
 ¡ | d
¡ | d	|j ¡ | d¡ n| d|j ¡ ||kr®|	sb| d¡ | d¡ | d|tj|f ¡ | d
¡ | d|tj|f ¡ | d¡ n| d|tj|f ¡ |jrà|jdkrà|j}n,|jrð|jröd}ntd|j||jf ƒ‚| d| ¡ tjf ¡ | d|j|f ¡ d S )Nz	struct %s)Ú__builtin__Úbuiltinsz"%s"z%s = %s;Z__Pyx_BUILTIN_MODULE_NAMEz %s = __Pyx_ImportType_%s(%s, %s,rd   z#if %sz"%s",z#elsez#endifz "%s", z>#if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000z.sizeof(%s), __PYX_GET_STRUCT_ALIGNMENT_%s(%s),)r   ÚwarnÚignorer   z6invalid value for check_size '%s' when compiling %s.%sz"__Pyx_ImportType_CheckSize_%s_%s);z if (!%s) %s)rD  rù   r:   rN   r   r@  rp   r“   Znon_portable_builtins_mapZbasicsize_builtins_mapr0   rë  rê   r–   r   r™   Ú
check_sizerÎ  Zis_subclassedÚRuntimeErrorr(  )r<   r9   rÁ   rž   rŽ   r?  rà  Zsizeof_objstructr:   Ú	conditionÚreplacementZ	ctypenamer[   rE  r   r   r   rœ   Ù  sn    











z$ModuleNode.generate_type_import_callc             C   s   t j ||¡ d S )N)r   ZCClassDefNoder>  )r<   r?   rÁ   r   r   r   r>     s    z#ModuleNode.generate_type_ready_codec             C   sš   |j }|jr–| d|j|jf ¡ |jrL|jjrL| d|jtj|jjf ¡ dd„ |jjD ƒ}|r–x2|D ]*}|j  	¡ }| d|j|j
||jf ¡ qhW d S )Nz	%s = &%s;z%s.%s = *%s;c             S   s   g | ]}|j r|‘qS r   )r­  )r`   r?   r   r   r   rb   4  s    z@ModuleNode.generate_exttype_vtable_init_code.<locals>.<listcomp>z%s.%s = %s%s;)r9   rš  rp   rf  rì   r   rd  r   rY   Zsignature_cast_stringr„   r­  )r<   r?   rÁ   r9   Zc_method_entriesZ
meth_entryÚcastr   r   r   r=  #  s,    

z,ModuleNode.generate_exttype_vtable_init_code)F)TT)NN)crö  r"  r#  Zchild_attrsr&   r;   rE   rO   rX   r\   rU   rx   rn   rV   rv   rw   rT   r½   r¼   rR   rõ   rÿ   rS   r  rº   r  rª   rt   ru   rr   r¹   r<  rq   rE  r?  rI  r>  rN  rA  rB  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—  rG   r²   rµ   rø  r  r¶   r¸   ry   r³   r  r  r  r  r  r	  rc  r
  r  r  r<  r9  rœ   r>  r=  r   r   r   r   r*   ;   sÄ   
#
FWQ-,y

"!i(.	2 }=D.0F<(,'D ]@<G/<	
Gr*   c               @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )r›   z°
    Helper to generate module import while importing external types.
    This is used to avoid excessive re-imports of external modules when multiple types are looked up.
    Nc             C   s>   || _ i | _|r4x"| ¡ D ]\}}|| jd| < qW g | _d S )Nz"%s")rÁ   ÚimportedrJ   Útemps)r<   rÁ   r   rN   r„   r   r   r   r  F  s    zModuleImportGenerator.__init__c             C   sd   || j kr| j | S | j}|jjtdd}| j |¡ | d||||f ¡ | |¡ || j |< |S )NT)r:  z5%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s)	rJ  rÁ   r  r(  r	   rK  r,   rp   r)  )r<   Zmodule_name_stringrŽ   rÁ   r-  r   r   r   rê   N  s    



z%ModuleImportGenerator.imported_modulec             C   s   | S )Nr   )r<   r   r   r   r  [  s    zModuleImportGenerator.__enter__c             G   s2   | j }x&| jD ]}| |t¡ |j |¡ qW d S )N)rÁ   rK  r®  r	   r  r*  )r<   ÚexcrÁ   r-  r   r   r   r!  ^  s    zModuleImportGenerator.__exit__)N)rö  r"  r#  Ú__doc__r  rê   r  r!  r   r   r   r   r›   A  s
   
r›   c       
      C   sÒ   | j o
| j}| j r| js6| jsÎ|s6| js6| jdks6|rÎ| jdkrLtj}d}n2| jdkrbtj}d }n| jdkrvd}d }nd}d }| j}| jrž|sžd}d }t	|ƒ}|j
| j|d}| | j¡}	| d||	|f ¡ d S )Nra  r    r]   rm  rn  )ro  z%s %s%s; /*proto*/)rú   r;  Zinline_func_in_pxdrû   rZ   r^   r   r‚   r9   r   rƒ   r„   rg  rh  rp   )
r?   r'   rÁ   r  Zfrom_cy_utilityru  ro  r9   rL  ri  r   r   r   rv  e  s4    



rv  ZRefnannyzModuleSetupCode.czj
#if defined(__GNUC__)
#define __Pyx_PACKED __attribute__((__packed__))
#else
#define __Pyx_PACKED
#endif
rd   Zutility_code_proto_before_types)ÚprotoÚimplZproto_blockZCapsule)0Ú
__future__r   ÚcythonZdeclarer%  Úcollectionsr   r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   ZErrorsr   r   r	   ZUtilsr   r   r   r   r
   r   ZStringEncodingr   r   r    r!   r)   ÚNodeZ	BlockNoder*   r›   rv  rÿ  r¬   rP  Zcapsule_utility_coder   r   r   r   Ú<module>   sv   
                        $%