3
=]&                @   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j,d#d$Z-ed%d&d'd(Z.ej,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 j  | S )N)scopecheck_c_classes_pxd)module_node r   j/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Compiler/ModuleNode.pycheck_c_declarations_pxd$   s    
r!   c             C   s   | j j  | j j  | S )N)r   check_c_classes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   CCodeConfig
directivesr'   )envoptionsr&   r   r   r    generate_c_code_config/   s    r-   c               @   s  e Zd ZdgZdZdd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dd5d6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 ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dddZ`dd Zadd ZbdS )
ModuleNodebodyNFc             C   s   t | jtjstt |tjr0| jjj|j n| jjj| | jj	j|j	 x|j
j D ]}| jj| qZW dd }|| jj|j |rx&|jD ]}| j|j_d|jjjd< qW | jj| d S )Nc             S   s$   x|D ]}|| kr| j | qW d S )N)append)L1L2xr   r   r    extend_if_not_in]   s    
z-ModuleNode.merge_in.<locals>.extend_if_not_inTinternal)
isinstancer/   r   StatListNodeAssertionErrorstatsextendr0   r   utility_code_list
c_includesvaluesprocess_includeincluded_filesc_class_entriesfull_module_nametypemodule_namer*   merge_in)selftreer   merge_scopeincr4   entryr   r   r    rD   I   s    	
zModuleNode.merge_inc             C   s   t |rtj| | jr$| jd |_tjs8d  |_| _nRtjrt	dt
j| j |_| jd k	rt	|jd | j |_| jj|j_n| j|_| j|_| jj| d S )Nold_style_globalszFile: %s (starting at line %s)
)r   r   include_pythran_genericr*   rJ   r   
docstringsdocembed_pos_in_docstringr   r   relative_positionposencodingr/   analyse_declarations)rE   r+   r   r   r    rS   l   s    

zModuleNode.analyse_declarationsc             C   s`   | j }|jr| j| xDt|jj D ]2\}}|jr&|j |kr&|jr&|jj	r&|jj
| q&W d S )N)r   has_import_star*create_import_star_conversion_utility_codesortedentriesitemscreate_wrapperis_typerB   is_enumcreate_type_wrapper)rE   r+   namerI   r   r   r    prepare_utility_code~   s    
zModuleNode.prepare_utility_codec             C   s\   | j }tj|_g | _| j|| ji  | j| | j||| | j||| | j	||| d S )N)
r   r   c_void_typereturn_typereferenced_modulesfind_referenced_modulessort_cdef_classesgenerate_c_codegenerate_h_codegenerate_api_code)rE   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   )ra   cfunc_entriesdefined_in_pxd)rE   modulerI   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|rt|jd|_tj }	t	||}
tj
|	| |
 |jrt|jd|_tj|j}nd }|	j  tj| j| }|	j| |	jd |	jd	 | j||	 |jr| j|g |	 |	jd tj| j| }|	jd
|  |	jd | j|	 |	jd | j|	 |r|	jd x0|D ](}| j|j|	 |rX| j|j| qXW |r|	jd x|D ]}| j||	| qW |r|	jd x|D ]}| j||	| qW |	jd |	jd|  |	jd |	jd |	jd |	jd |	jd |	jd|j  |	jd |	jd| jd|  |	jd |	jd |	jd|  t |j}z|	j!| W d |j"  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apirj   ).0rI   )ro   pxdr   r    
<listcomp>   s    

zAModuleNode.generate_h_code.<locals>.h_entries.<locals>.<listcomp>r   )rW   ro   rq   r   )ro   rq   r    	h_entries   s    z-ModuleNode.generate_h_code.<locals>.h_entriesr   )ro   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_entriesri   r@   r   c_fileh_filer   CCodeWriterr-   GlobalStategenerate_pxii_filePyrexCodeWriterput_generated_byr   h_guard_prefixapi_nameput_h_guardputlngenerate_type_header_codecapi_reexport_cincludesgenerate_includesapi_guard_prefix"generate_extern_c_macro_definitiongenerate_dl_import_macrogenerate_cclass_header_coderB   generate_cclass_include_codegenerate_public_declarationrC   mod_init_func_cnamer   copytoclose)rE   r+   r,   rg   rs   h_typesh_varsh_funcsh_extension_typesh_codec_code_configi_codeh_guard	api_guardrI   fr   r   r    re      sx    




























zModuleNode.generate_h_codec             C   sB   |j dtj|jj|jf  |r>|j d|jj|jdd  d S )Nz%s %s;zcdef extern %sr   )pyrex)r   r   extern_c_macrorB   declaration_codecname)rE   rI   r   r   r   r   r    r      s    z&ModuleNode.generate_public_declarationc             C   s   |j jddS )N.__)qualified_namereplace)rE   r+   r   r   r    r      s    zModuleNode.api_namec             C   s  d&dd}||j }||j}||j}|s6|s6|rt|jd|_tj }t||}	tj	|| |	 |j
  tj| j| }
|j|
 |jd |jd |jd |jd |jr|jd	tjj|j  |r|jd
 x8|D ]0}|j}|jd|j  |jd|j|jf  qW |rx|jd
 xP|D ]H}t|j}|jtj|j}|jd|j|  |jd|j|f  q,W |r|jd
 xP|D ]H}t|j}|jtj|j}|jd|j|  |jd|j|f  qW |jtjddd  |r|jtjddd  |r(|jtjddd  |rZ|jtjddd  |jtjddd  |jd
 |jd| j|  |jd |jd|j   |jd x>|D ]6}|jtj|j}|jj! }|jd|j||f  qW x>|D ]6}|jtj|j}|jj" }|jd|j||f  qW t#||j did*}x"|D ]}| j$|j||dd q6W W d Q R X |jd |jd  |jd! |jd" |jd# |jd$ |jd
 |jd%|
  t%|j}z|j&| W d |j'  X d S )'Nr   c                s    fdd| D S )Nc                s    g | ]}|j s r|jr|qS r   )ro   rj   )rp   rI   )rq   r   r    rr      s    zEModuleNode.generate_api_code.<locals>.api_entries.<locals>.<listcomp>r   )rW   rq   r   )rq   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"rt   zstatic PyTypeObject *%s = 0;z#define %s (*%s)zstatic %s = 0;z#define %s %s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;zQif (__Pyx_ImportFunction(module, "%s", (void (**)(void))&%s, "%s") < 0) goto bad;zHif (__Pyx_ImportVoidPtr(module, "%s", (void **)&%s, "%s") < 0) goto bad;rk   )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   )(rw   ri   r@   r   rx   api_filer   rz   r-   r{   r   r   r   r   r   r   ry   ospathbasenamerB   typeptr_cnametypeobj_cnamer   manglefunc_prefix_apir]   r   varptr_prefix_apiputr
   load_as_stringr   signature_stringempty_declaration_codeModuleImportGeneratorgenerate_type_import_callr   r   r   )rE   r+   r,   rg   r   api_vars	api_funcsapi_extension_typesr   r   r   rI   rB   r   sigimport_generatorr   r   r   r    rf      s    

























$







zModuleNode.generate_api_codec             C   s$   |j dtjtjdd|jf  d S )Nz	%s %s %s;PyTypeObject	DL_IMPORT)r   r   r   r   public_declr   )rE   rB   r   r   r   r    r   B  s    
z&ModuleNode.generate_cclass_header_codec             C   sl   |j d|j|jf  |j  |jj}|rVx4|D ] }|j d|jj|jdd  q0W n
|j d |j	  d S )Nzcdef extern class %s.%s:zcdef %sr   )r   pass)
r   rC   r]   indentr   rw   rB   r   r   dedent)rE   rB   r   rw   rI   r   r   r    r   H  s    

z'ModuleNode.generate_cclass_include_codec             C   s  | j }tjs|jrtj }ntj }t||}tj|| ||j	d}|j
  |d }| j||||j| | j|_| j|_|jt |d }	|	jd| j  dtj| jjddf }
|	jd|
  |	jd	|
  |	jd
 |	jd|j  |d }	|	jd | j|||	dd |d }	| j||	 | j||	 | j||	 | jj||	 |	jd  | j||	 | j ||	 |j!rz| j"||	 | j#||	 |	jt$j%ddd j&  | j'|d d ||d  | j(||d  tj)r| j*||d  | j+|d  | j,||| |j-d x"|j.d d  D ]}|j| qW |j/  t0|j1}z|j2| W d |j3  X d|_4|j5rr| j6|| tjs|jr| j7||| d S )N)code_configcommon_utility_include_dirr   before_global_varz#define __Pyx_MODULE_NAME "%s"z%s%sr   r   zextern int %s;zint %s = 0;rt   z/* Implementation of '%s' */late_includesz/* Late includes */F)earlyall_the_restSmallCodeConfigzModuleSetupCode.cr   r   init_modulecleanup_modulemain_methodfilename_tablerK   )8ra   r   r(   r   AnnotationCCodeWriterr   rz   r-   r{   r   initialize_main_c_codegenerate_module_preambleembedded_metadatarQ   
module_posr*   use_utility_coderefnanny_utility_coder   rA   r   module_is_mainr   r   r   generate_cached_builtins_declsgenerate_lambda_definitionsgenerate_variable_definitionsr/   generate_function_definitionsmark_posgenerate_typeobj_definitionsgenerate_method_tablerT   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writer;   finalize_main_c_coder   rx   r   r   c_file_generated	gdb_debug_serialize_lineno_map_generate_annotations)rE   r+   r,   rg   modules
rootwriterr   globalstater   coder   utilcoder   r   r   r    rd   U  sp    









zModuleNode.generate_c_codec             C   s  | j | tjp|j}|rtjj|rydd ljj}W n  t	k
rV   dd l
jj}Y nX |j|j }x|j D ]
}d |_qpW nd }|j|j|j|d | jjsd S | jjj}tjjtjj|j}	x| jjD ]}
tjjtjj|	|
}tjj|}|j|	sq||
d| jdd}|sq||	krtjj| rytj| W n< tk
r } zdd l}|j|jkrp W Y d d }~X nX |j|||d qW d S )Nr   )coverage_xmlrt   T)include) r(   r   annotate_coverage_xmlr   r   existsxml.etree.cElementTreeetreecElementTreeImportErrorxml.etree.ElementTreeElementTreeparsegetrootgetiteratortailsave_annotationmain_source_filerx   r   r?   contextsearch_include_directoriesabspathdirnamejoin
startswithrQ   makedirsOSErrorerrnoEEXIST)rE   r   rg   r,   coverage_xml_filenameETr   elsearch_include_file
target_dirincluded_filetarget_filetarget_file_dirsource_fileer  r   r   r    r     s@    

z ModuleNode._generate_annotationsc       	      C   s   |j j}|jj }tt}x.t|D ]"\}}|dkr$|| j|d  q$W |jd x8t	|j
 D ](\}}|jddjtt|t|d qbW |jd |j  d S )Nr   r   LineNumberMapping
LineNumber )	c_linenoscython_lineno)r  gdb_debug_outputwriterbuffer
allmarkersr   list	enumerater0   startrV   rX   	add_entryr  mapstrend	serialize)	rE   r+   ccodewritertbmarkersdc_linenor  r  r   r   r    r     s    


z ModuleNode._serialize_lineno_mapc             C   s<   ||kr8d||< x|j D ]}| j||| qW |j| d S )Nr   )cimported_modulesrb   r0   )rE   r+   module_listmodules_seenimported_moduler   r   r    rb     s
    z"ModuleNode.find_referenced_modulesc             C   s   g }xt |D ]\}}|| }t }|}	x2|	rZ|	jj}
|
s<P ||
}|j| |j|}	q*W ||_x:t|D ]$}|| }||jkrl|j|| P qlW |j	| qW |S )N)
r   setrB   	base_typeaddget	base_keysrangeinsertr0   )rE   	type_dict
type_ordergetkey	type_listikey	new_entry	hierarchybaser1  base_keyjrI   r   r   r    sort_types_by_inheritance  s(    

z$ModuleNode.sort_types_by_inheritancec             C   sZ  i g  }}i g  }}x|D ]}x|j D ]}|jr*|j r*|j}	|	j}
|
sNq*|
|krddlm} t|j|s|t	t
|jt||
 j|st	t
||
 jq*|||
< |j|
 q*W ||k}xb|jD ]X}|jo|s|jr|j}	|	jo|j r|j}	|	j}
|
|kst	|
|||
< |j|
 qW qW dd }| j|||}dd }| j|||}||fS )Nr   )NonManglingModuleScopec             S   s   | j S )N)vtabstruct_cname)
entry_typer   r   r    rD  &  s    z8ModuleNode.sort_type_hierarchy.<locals>.vtabstruct_cnamec             S   s   | j S )N)objstruct_cname)rE  r   r   r    rF  +  s    z7ModuleNode.sort_type_hierarchy.<locals>.objstruct_cname)r@   usedin_cincluderB   rD  r
   rC  r6   r   r8   r$  r0   rv   rj   is_extension_typerF  rB  )rE   r-  r+   	vtab_dictvtab_dict_ordervtabslot_dictvtabslot_dict_orderrk   rI   rB   r<  rC  all_defined_hererD  	vtab_listrF  vtabslot_listr   r   r    sort_type_hierarchy  s@    

$

zModuleNode.sort_type_hierarchyc             C   sl   t jd}i g  }}x:|jD ]0}||j}||ks:t||||< |j| qW | j||||jd d < d S )NrF  )operator
attrgetterr@   rB   r8   r0   rB  )rE   r+   key_func
entry_dictentry_orderrI   r<  r   r   r    rc   2  s    


zModuleNode.sort_cdef_classesc       
         s   x|D ]}| j |j| qW t| xb|D ]Z}||k}|rB|j}	n$g }	x|jD ]}|jrN|	j| qNW  fdd|	D }	| j|	| q*W x&|D ]}| j|j| | j|| qW x<|D ]4}| j|| | j	|| | j
|| | j|| qW d S )Nc                s   g | ]}| kr|qS r   r   )rp   t)vtabslot_entriesr   r    rr   K  s    z8ModuleNode.generate_type_definitions.<locals>.<listcomp>)!generate_objstruct_predeclarationrB   r0  rv   rj   r0   r   generate_objstruct_definitiongenerate_typeobj_predeclarationgenerate_exttype_vtable_struct$generate_exttype_vtabptr_declaration*generate_exttype_final_methods_declaration)
rE   r+   r   rO  rP  r   rI   rk   
definitionrv   r   )rX  r    generate_type_definitions=  s*    



z$ModuleNode.generate_type_definitionsc       
      C   s   |d }|j d |j d ddd |D krV|j d |j d |j d	 |j d
 | j||\}}| j||||| |d }xX|D ]P}||k}	|j d |j d|j  | j|||	 | j|||	 | j|||	 qW d S )Ntype_declarationsrt   z/*--- Type declarations ---*/zcpython.arrayc             S   s   g | ]
}|j qS r   )r   )rp   mr   r   r    rr   \  s    z@ModuleNode.generate_declarations_for_modules.<locals>.<listcomp>z#ifndef _ARRAYARRAY_Hzstruct arrayobject;z'typedef struct arrayobject arrayobject;z#endifmodule_declarationsz#/* Module declarations from '%s' */)r   rQ  r`  r   generate_c_class_declarationsgenerate_cvariable_declarationsgenerate_cfunction_declarations)
rE   r+   r   r   typecoderO  rP  
modulecoderk   defined_herer   r   r    r   V  s&    







z,ModuleNode.generate_declarations_for_modulesc             C   s   |j tj|dd  d S )NzModuleSetupCode.cr   )r   r
   r   )rE   r   r]   r   r   r    _put_setup_codem  s    zModuleNode._put_setup_codec             C   s  |j   |r@|jd |jtj|ddd |jd |jd |jd x2t|jj tjdD ]}|j	|j
kr`|j| q`W |jd	 |jd
 |jd |jd |jd |jd jd ddlm} |jd|jdd  |jdt|  |jdtj|jjk  | j|d |jjjr2| j|d n| j|d | j|d | j|d |jrpdtjtjf }nd}|jdtjtjtj|f  |jd | j | |jd |jdtj! | j"|  |jdtj# | j"|  |jd | j$|||d d! |jd |jd" |jd# |jd$ |jd |j%d% rn|jd |jd& |jd' |jd$ |jd |jt&j'd(d)d*  |j%d+ }	|j%d, }
|	dHkr|
 rt(| j)d/ |jd0t*|
d1k  |jd2t*|
jd3dj+ d4k  |
d5kr|jd6 n|jd7 |jd8|
  |	d.kr,d9}n|	j, }|jd:|  |jd;|  |jt&j'd<d=d*  t-j.j/| t-j.j0| t-j1j0| |jt2j3 |jd> |jd |jd?|j4  |jd@|j5  |jd@tj6  |jd?tj7  |jd@tj8  |jd@tj9  |jd@tj:  t;j<d k	r6|jd@tj=  |jdAtj  |jdBtj  |jdCtj>tj?f  |jdDtj  |j@t&jAdEd) tB|r|j@t&jAdFdG d S )INz/* BEGIN: Cython Metadata   T)r   	sort_keyszEND: Cython Metadata */rt   z#define 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 %dCModulePreambleCppInitCode	CInitCodePythonCompatibilityMathInitCodez	%s = %s; zj
#define __PYX_ERR(f_index, lineno, Ln_error) \
{ \
  %s = %s[f_index]; %s = lineno; %sgoto Ln_error; \
}
z
#define %sz/* Early includes */F)latezL#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS)z!#define CYTHON_WITHOUT_ASSERTIONSz#endifccomplexz#if !defined(CYTHON_CCOMPLEX)z#define CYTHON_CCOMPLEX 1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"	ByteArrayz7#define __Pyx_PyObject_FromString __Pyx_Py%s_FromStringzE#define __Pyx_PyObject_FromStringAndSize __Pyx_Py%s_FromStringAndSize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;FastTypeChecksPythranConversionzCppSupport.cpp)ry  rz  )Cr   r   jsondumpsrV   r<   r=   r   sortkeylocationINITIALr   r   rt   rm  r   r   r   divisionr  future_directivesrj  r,   cplusr'   r   clineno_cnameline_c_macror   filename_cnamefiletable_cnamelineno_cnamer   r   r   r   r   r*   r
   r   r   rQ   intlowertitler   c_long_typecreate_to_py_utility_codecreate_from_py_utility_code
c_int_typer   branch_prediction_macrosmodule_cnamemodule_dict_cnamebuiltins_cnamecython_runtime_cnameempty_tupleempty_bytesempty_unicoder   
pre_importpreimport_cnamecfilenm_cnamefile_c_macror   load_cachedr   )rE   r+   r,   r,  metadatar   rH   rm  cinforw  rx  c_string_func_namer   r   r    r   p  s    






























z#ModuleNode.generate_module_preamblec             C   s\   t j}|jd|  |jd |jd|  |jd |jd|  |jd |jd d S )Nz
#ifndef %sz  #ifdef __cplusplusz    #define %s extern "C"z  #elsez    #define %s externz  #endifz#endif)r   r   r   )rE   r   r]   r   r   r    r     s    


z-ModuleNode.generate_extern_c_macro_definitionc             C   s"   |j d |j d |j d d S )Nz#ifndef DL_IMPORTz  #define DL_IMPORT(_T) _Tz#endif)r   )rE   r   r   r   r    r     s    

z#ModuleNode.generate_dl_import_macroTc             C   sj   g }xRt |jj tjdD ]:}|j|jkr:|rT|j| q|j|jkr|r|j| qW |rf|j	d d S )N)r<  z#include <omp.h>)
rV   r<   r=   r   r  r  EARLYr   LATEputln_openmp)rE   r+   r,  r   r   rt  includesrH   r   r   r    r     s    zModuleNode.generate_includesc             C   s   ddl m}m} |jd |jdtj  |jjrxV|jjD ]>}|j }||rX||}|j	ddj	dd}|jd	|  q<W n
|jd
 |jd d S )Nr   )isabsr   rt   zstatic const char *%s[] = {\z\\"z\"z"%s",0z};)
os.pathr  r   r   r   r  r   filename_listget_filenametable_entryr   )rE   r   r  r   source_desc	file_pathescaped_filenamer   r   r    r     s    

z"ModuleNode.generate_filename_tablec             C   s   d S )Nr   )rE   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| j|| q|jrV|jrV| j|jj| q|j	r| j
|| qW x|D ]}|j sr|j}|jr| j|| qr|jr| j|| qr|jr| j|| qr|jr|jr| j|jj| qr|jr| j|| qr|j	rr| j|| qrW d S )N)rH  rB   
is_typedefis_struct_or_unionis_cpp_class$generate_struct_union_predeclaration	is_ctuplerG  struct_entryrI  rY  generate_typedefr[   generate_enum_definition generate_struct_union_definitiongenerate_cpp_class_definitionrZ  )rE   rv   r   rI   rB   r   r   r    r     s4    

z$ModuleNode.generate_type_header_codec             C   s^   |j d xN|jD ]D}|j}|js|j}|jdr@|dd  }n|}|j d||f  qW d S )Nrt   __pyx_   z!typedef struct %s __pyx_gcc33_%s;)r   r@   rB   typedef_flagrF  r  )rE   r+   r   rI   rB   r]   r   r   r   r    generate_gcc33_hack3  s    

zModuleNode.generate_gcc33_hackc             C   sb   |j j}|jr8y|jd }W q< tk
r4   |}Y q<X n|}|j|j |jd|j|j	  d S )Nnumeric_typedefsztypedef %s;)
rB   typedef_base_type
is_numericr   KeyErrorr   rQ   r   r   r   )rE   rI   r   r1  writerr   r   r    r  A  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;)r  )rE   rB   kindr]   r   r   r    sue_predeclarationM  s
    zModuleNode.sue_predeclarationc             C   sN   |j }|jr2|jr2|jddjdd |jD   |j| j||j|j d S )Nztemplate <typename %s>z, typename c             S   s   g | ]}|j  qS r   )r   )rp   Tr   r   r    rr   Y  s    zCModuleNode.generate_struct_union_predeclaration.<locals>.<listcomp>)rB   r  	templatesr   r  r  r  r   )rE   rI   r   rB   r   r   r    r  U  s
    
z/ModuleNode.generate_struct_union_predeclarationc             C   s   d||f }d}||fS )Nz%s %s {z};r   )rE   rB   r  r]   headerfooterr   r   r    sue_header_footer\  s    zModuleNode.sue_header_footerc             C   s$  |j |j |j}|j}|r |j}|jo.|j}|rNd|jdf }|jjt	 | j
|||j\}}|r|jd |jd |jd |jd |jd |j| |j}	|	st|jd x$|	D ]}
|jd	|
jj|
j  qW |j| |r |jd |jd
 |jd |jd |jd d S )Nz%s %s__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   rQ   rB   r   r  	is_structpackedr   r   packed_struct_utility_coder  r   r   rw   r   r   )rE   rI   r   rB   r   r  r  r  r  rw   attrr   r   r    r  a  s<    











z+ModuleNode.generate_struct_union_definitionc             C   sl  |j |j |j}|j}|rh|jrD|jddjdd |jD   |jd|j  |j	r~djdd |j	D }|jd|  |jd	 d
d |j
j D }d}d }d }	xz|jD ]p}
|
jjr|
jjr|jd n8|
jdkr|
}n(|
jdkr|
}	n|
jjr|jd d}|jd|
jj|
j  qW d|jjk}|s<|rt|rg }g }xD|jjd t|jj|jj  D ] }|j|j  |j|j qlW |jjr|j|jjjtj |jtj |sdg}n
dg}g }|rZ|jd|jdj|f  |r |j  x|D ]}
|j|
dd qW |r@|jd|jdj|f  |rN|j  |jd n|jd|jdj|f  |	s|s|r|r|jd |r|jd|j  |r|j  |	r|jd|	j  |rx|D ]}
|j|
dd qW |j  |jd n|jd|j  |r^|r2|jd|j|jf  |j  x>|jD ]4}
|
jjsJ|jd|
j|
jf  |j|
dd qJW |j  |jd |jd|j|jf  |jd |j  xL|jD ]B}
|
jjs|j|
dd |jd|
j|
jf  |j|
dd qW |j  |jd |jd  |jd n,|jd!|j|jf  |jd"|j|jf  |jd# d S )$Nztemplate <class %s>z, class c             S   s   g | ]}|j  qS r   )r   )rp   r  r   r   r    rr     s    z<ModuleNode.generate_cpp_class_definition.<locals>.<listcomp>z	struct %sz	, public c             S   s   g | ]}|j  qS r   )r   )rp   
base_classr   r   r    rr     s    z : public %sz {c             S   s    g | ]}|j jr|j r|qS r   )rB   is_pyobjectis_inherited)rp   r  r   r   r    rr     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   rQ   rB   r   r  r   r  r   r   base_classesrW   r=   rw   is_cfunctionis_static_methodr]   r   r   partsoriginal_argslenargsoptional_arg_countr0   op_arg_structr   optional_args_cnameput_ensure_gilput_init_var_to_py_noneput_release_ensured_gilput_var_xdecrefput_var_incref)rE   rI   r   rB   r   base_class_declpy_attrshas_virtual_methodsconstructor
destructorr  is_implementing	arg_decls	arg_namesargr   r   r    r    s    
















z(ModuleNode.generate_cpp_class_definitionc             C   s   |j |j |j}|jp |jp d}| j|d|\}}|j| |j}|sVt|jd nz|d }x"|D ]}	|	j	d k	rd|	j	j
| qdW xL|D ]D}	|	j	d kr|	j}
nd|	j|	j	j f }
|	|k	r|
d7 }
|j|
 qW |j| |jjr|jd||f  d S )	Nrt   enumzDEmpty enum definition not allowed outside a 'cdef extern from' blockr   z%s = %s,ztypedef enum %s %s;r   )r   rQ   rB   r   r]   r  r   enum_valuesr   
value_nodegenerate_evaluation_coderg   r  )rE   rI   r   rB   r]   r  r  r  
last_entryvalue_entry
value_coder   r   r    r    s0    





z#ModuleNode.generate_enum_definitionc             C   st   |j d |jj}|rp|jdkrH|j rH|j dtjtjdd|f  n(|jdkrp|j dtjtjdd|f  d S )Nrt   externz	%s %s %s;r   r   rm   	DL_EXPORT)	r   rB   r   rn   rH  r   r   r   r   )rE   rI   r   r]   r   r   r    r[  
  s    



z*ModuleNode.generate_typeobj_predeclarationc             C   s   |j s
d S |j|j |j}|j}| j| |jr|jd |jd|j  |jrr|jjrr|jd|jjt	j
f  x0|jD ]&}|jsz|jd|jjd|j   qzW |jd d S )Nrt   zstruct %s {zstruct %s %s;z%s;z(*%s)z};)rG  r   rQ   rB   r   specialize_fused_typesrD  r   r1  r   obj_base_cnameri   r  r   r   )rE   rI   r   rB   r   method_entryr   r   r    r\    s"    

 z)ModuleNode.generate_exttype_vtable_structc             C   s<   |j s
d S |j|j |j}|jr8|jd|j|jf  d S )Nzstatic struct %s *%s;)rG  r   rQ   rB   vtabptr_cnamer   rD  )rE   rI   r   rB   r   r   r    r]  3  s    z/ModuleNode.generate_exttype_vtabptr_declarationc             C   sn   |j s
d S |j|j |j}xL|jjjD ]>}|j r(|jr(|jj|j}|j	|j
}|jd||f  q(W d S )Nzstatic %s%s;)rG  r   rQ   rB   r   ri   r  final_func_cnamer   build_function_modifiersfunc_modifiersr   )rE   rI   r   rB   r  declaration	modifiersr   r   r    r^  ?  s    z5ModuleNode.generate_exttype_final_methods_declarationc             C   s$   |j s
d S |j| j|d|j d S )Nstruct)r   r   r  rF  )rE   rB   r   r   r   r    rY  M  s    z,ModuleNode.generate_objstruct_predeclarationc       	      C   s  |j |j |jsd S | j|d|j\}}|j| |j}|rn|j}|dkrPd}|jdd|j |tj	f  n
|jd |j
r|jo|jj
 r|jd|j|j
f  x8|jjD ],}|jrt}n|j}|jd	|j|j  qW |j| |jd k	r
|jd
|j|jf  d S )Nr  r   PyHeapTypeObjectz%s%s %s;struct rt   PyObject_HEADzstruct %s *%s;z%s;ztypedef struct %s %s;)r  rt   )r   rQ   r   r  rF  r   r1  r  r   r  vtabslot_cnamerD  rw   is_declared_genericr	   rB   r   r   objtypedef_cname)	rE   rB   r   r  r  r1  basestruct_cnamer  	attr_typer   r   r    rZ  R  s>    

z(ModuleNode.generate_objstruct_definitionc             C   s0   x*|j D ] }|s|jr|jd|jj  qW d S )Nzstatic PyTypeObject *%s = 0;)r@   rj   r   rB   r   )rE   r+   r   r_  rI   r   r   r    rd  z  s    
z(ModuleNode.generate_c_class_declarationsc       
      C   sV  |j r
d S xD|jD ]8}|js|js|jdkr@|jp:|j r@qd }d }d }|jdkrbtj}d}nJ|jdkrtj}|r|d}qd}n*|jdkrd}d }|j	d k	r|j
j|j	}|j
}|j}	|jr| rd}d }t|}|jtj|j}	d}|r|jd|  |j|j|	|d	 |d k	r&|jd
|  |jd |j|	kr|jd|j|	f  qW d S )Nprivater  r   rm   r  staticr   z%s )dll_linkagez = %s;z#define %s (*%s))is_cython_builtinrw   rH  
in_closurern   rj   rG  r   r   initrB   literal_coder   r   r   varptr_prefixr]   r   r   put_safer   )
rE   r+   r   r_  rI   storage_classr  r  rB   r   r   r   r    re    sN    






z*ModuleNode.generate_cvariable_declarationsc             C   s8   x2|j D ](}|js"|jdks"|jrt|||| qW d S )Nrm   )ri   rG  rn   ro   generate_cfunction_declaration)rE   r+   r   r_  rI   r   r   r    rf    s    z*ModuleNode.generate_cfunction_declarationsc             C   sj   xd|j D ]Z}|j r|jdkr|j|jj|j |jd k	rX|jj|j}|j	d|  |j
d qW d S )Nrm   z = %sr  )rw   rH  rn   r   rB   r   r   r  r  r  r   )rE   r+   r   rI   r  r   r   r    r     s    
z(ModuleNode.generate_variable_definitionsc             C   s  |j }x|jD ]}|jdkr|j}|j}|r| j|| | j||| | j|| |j r| j	||| |j
 r| j||| |jdgr| j|| |jddgr| j|| |jdddgrt| jdd	 |jd
 |jd |jd |jddgr| j|| |jddgr(| j|| |jddgrD| j|| |jdgr^| j|| |jddgrz| j|| |j r|jdgr| j|| |jtjr| j|| | j|| | j|| | j|| | j ||| qW d S )Nr  __getitem____setitem____delitem____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   r@   rn   rB   r   generate_exttype_vtablegenerate_new_functiongenerate_dealloc_functionneeds_gcgenerate_traverse_functionneeds_tp_cleargenerate_clear_functiondefines_any_specialgenerate_getitem_int_functiongenerate_ass_subscript_functionr   rQ   r   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)rE   r+   r   rA   rI   rB   r   r   r   r    r     sT    



z'ModuleNode.generate_typeobj_definitionsc             C   s&   |j }|jr"|jd|j|jf  d S )Nzstatic struct %s %s;)parent_typevtable_cnamer   rD  )rE   r   r   rB   r   r   r    r(    s
    z"ModuleNode.generate_exttype_vtablec             C   s&   |j }|jd|jd|j f  d S )Nz%s = (%s)o;p)r?  r   r   r   )rE   r   r   rB   r   r   r    generate_self_cast  s
    zModuleNode.generate_self_castc             C   sf  t jdd}|jd}|j}|j}|j \}\}	}
}|jj}|jrFg }	dd |jD }|j	d}|sv|r||j
r||j r|d}nd}|rd}n|jjdd}|jtj}|jtj}|jd	 }|jd
|  |jd |r
|jd|jj||f  |jd|  |jd |jd|||f  |jp:|
p:|p:|	p:|}|rX|jd|jjd  |rt j||}|d kr~d|j }|jd|  n|jd |r,|jjtjdd |rd}nd}|jddd}|jd|||f  |jd||f  |jd|  |jd |j r"|jd |jd |s<|jd |jd |sp|jd |jd tj  |jd! |jd" |r| r|jd! |r|jd#|jd$  d%}|jr|}x|jr|jjr|j}qW ||k	rd&|j }nd}|jd'|j||jf  x(|D ] }|jd(|j|j j! f  qW xF|	D ]>}|j"d)krjd}|j#d*|j|jf  n|j$|d+d%d, q>W x.|D ]&}|jd-|j  |jd.|j  qW x|
D ]}|jd/|j  qW |jd0kr|jd1 |r$|j
r$|jrd2tj }nd3}d}|jd4|j%|f  |jd5 |rX|jd6 |j&d$t'd%d, |jd7 |jd! d S )8Ntp_new__new__c             S   s   g | ]}|j jr|qS r   )rB   r  )rp   rI   r   r   r    rr     s    z4ModuleNode.generate_new_function.<locals>.<listcomp>rt   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;rA  z
%s->tp_newzPyObject *o = %s(t, a, k);zPyObject *o;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)r  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?  r1  get_refcounted_entriesis_final_typeis_internalrw   lookup_here
is_specialtrivial_signaturer*   r3  r   freelist_namefreecount_namer   r   r   r	  get_base_slot_functionr   r   r
   r  r+  r  	cast_coderD  r  r   rB   r   r]   r   r  
func_cnameput_decref_clearr	   )rE   r   r   cclass_entrytp_slot	slot_funcrB   r1  have_entriesr  
py_buffersmemoryview_slicesrN  cpp_class_attrsnew_func_entryunused_markerfreelist_sizerS  rT  rF  need_self_castrC  type_safety_check
obj_structneeds_error_cleanupvtab_base_typestruct_type_castrI   
cinit_argsr   r   r    r)    s    



























z ModuleNode.generate_new_functionc             C   sP  t jdd}|jd}|jj}|j||kr0d S |jd}|jd |jd|  |jj}|j }|j	sr|j
dnd }	|	|jkrd }	|j	s|j
dnd }
|
|jkrd }
|j \}\}}}dd |jD }|s|s|s|	s|
r| j|| |s4|jd	 |rd
}nd}|jd|  |jd |jd |jd |rD|jd | j|| |	r`|jd |
rp|jd x|D ]}|jd|j  qvW x(|D ] }|jd|j |jddd qW x"|D ]}|jd|j dd qW |r|r2|jr
|jj r
|jd n(|jd |jd |jd |jd t j||}|d k	rX|jd|  nH|jrr|jd|j  n.|j}|jd|||f  |jjtjdd  n|jjd!d"}|r(|jtj}|jtj}|rd}nd#}|j}|jd$|||j ddd%|f  |jd&|||j!d'f  |jd( |jd) |rB|jd |jd d S )*N
tp_dealloc__dealloc__rt   zstatic void %s(PyObject *o) {__weakref__r'  c             S   s   g | ]}|j jr|qS r   )rB   r  )rp   rI   r   r   r    rr     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)r  clear_before_decref)have_gilzPyObject_GC_Track(o);z#if CYTHON_USE_TYPE_SLOTSz&if (PyType_IS_GC(Py_TYPE(o)->tp_base))z%s(o);z%s->tp_dealloc(o);zJif (likely(%s)) %s->tp_dealloc(o); else __Pyx_call_next_tp_dealloc(o, %s);CallNextTpDealloczExtensionTypes.crE  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)) {)rH  z%s[%s++] = %s;rI  z} else {z(*Py_TYPE(o)->tp_free)(o);)"r   rK  rL  r?  r1  	slot_coder   rN  r+  r7  rP  rw   rM  rB  generate_usr_dealloc_callr   put_xdecref_clearrB   put_xdecref_memoryviewslicer   rU  is_builtin_typer   r   r   r
   r  r*   r3  r   rS  rT  r   rV  )rE   r   r   rZ  r[  r1  slot_func_cnamerN  r+  weakref_slot	dict_slotrn  r  r^  r_  finalised_checkrI   rj  
base_cnamerb  rS  rT  rd  rB   r   r   r    r*    s    
























z$ModuleNode.generate_dealloc_functionc             C   sl   |j d}|sd S |jd |jd |jd |jd |jd|j  |jd |jd |jd	 d S )
Nrk  {zPyObject *etype, *eval, *etb;z!PyErr_Fetch(&etype, &eval, &etb);z++Py_REFCNT(o);z%s(o);z--Py_REFCNT(o);z PyErr_Restore(etype, eval, etb);r   )rP  r   rW  )rE   r   r   rI   r   r   r    rq    s    






z$ModuleNode.generate_usr_dealloc_callc             C   s  t jd}|jd}|jj}|j||kr.d S |jd |jd|  |jdd\}\}}	}
|sd|rn|jd |sv|	r| j|| |rt j	||}|r|jd|  nP|j
r|j}|jd||f  n0|j}|jd	||||f  |jjtjd
d xL|D ]D}d|j }tjt|j|}|jd|  |jd|  |jd qW x>|	D ]6}|jd }|jd|  |jd|  |jd qJW |jd |jd d S )Ntp_traversert   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; }ze = ((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;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   GCDependentSlotrL  r?  r1  rp  r   rM  rB  rU  rt  r   r   r   r
   r  r   r   typecastr	   rB   )rE   r   r   rY  rZ  r[  r1  r\  r  r]  r^  static_callry  rI   var_codevar_as_pyobjectr   r   r   r    r,    sP    









z%ModuleNode.generate_traverse_functionc             C   s  t jd}|jd}|jj}|j||kr.d S |jdd\}\}}	}
|sP|	sP|rVd}nd}|jd |jd||f  |rtj	r|jd |s|	r| j
|| |rt j||}|r|jd|  nP|jr|j}|jd	||f  n0|j}|jd
||||f  |jjtjdd tj	r|x~|D ]T}d|j }|jd|  |jrX|j|tdd n|j||jdd |jd q"W n x|D ]}|jd|j  qW x|	D ]}|jd|j  qW |jdkr|jd |jd |jd d S )Ntp_clearF)r|  rt   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);CallNextTpClearzExtensionTypes.czp->%sztmp = ((PyObject*)%s);)r  zPy_XDECREF(tmp);zPy_CLEAR(p->%s);zPy_CLEAR(p->%s.obj);rJ  z&__PYX_XDEC_MEMVIEW(&p->from_slice, 1);z	return 0;r   )r   get_slot_by_namerL  r?  r1  rp  rM  r   r   clear_to_nonerB  rU  rt  r   r   r   r
   r  r   r
  put_init_to_py_noner	   rB   )rE   r   r   rY  rZ  r[  r1  r\  r  r]  r^  unusedr  ry  rI   r]   r   r   r    r.  S  sZ    










z"ModuleNode.generate_clear_functionc             C   sT   |j d|jd  |j d |j d |j d |j d |j d |j d d S )	Nz0static PyObject *%s(PyObject *o, Py_ssize_t i) {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   )r   rL  )rE   r   r   r   r   r    r0    s    z(ModuleNode.generate_getitem_int_functionc             C   s   |j j}|jd}|jd}|jd |jd|jd  |jd |rZ|jd|j  n0| j|ddd	| |jd
 |jd |jd |jd |jd |r|jd|j  n0| j|ddd	| |jd
 |jd |jd |jd |jd d S )Nr  r  rt   z6static int %s(PyObject *o, PyObject *i, PyObject *v) {mp_ass_subscriptzif (v) {zreturn %s(o, i, v);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?  r1  rP  r   rL  rW  generate_guarded_basetype_call)rE   r   r   r1  	set_entry	del_entryr   r   r    r1    sN    


z*ModuleNode.generate_ass_subscript_functionc             C   sh   |rd|j }|r>|jd|||||f  |jd||||f  n&|jd||f  |j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   r   )rE   r1  substructureslotr  r   base_tpnamer   r   r    r    s    z)ModuleNode.generate_guarded_basetype_callc             C   s   |j j}|jd}|jd}|jd |jd|jd  |jd |rZ|jd|j  n0| j|ddd	| |jd
 |jd |jd |jd |jd |r|jd|j  n0| j|ddd	| |jd
 |jd |jd |jd |jd d S )Nr  r  rt   zEstatic int %s(PyObject *o, Py_ssize_t i, Py_ssize_t j, PyObject *v) {sq_ass_slicezif (v) {zreturn %s(o, i, j, v);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?  r1  rP  r   rL  rW  r  )rE   r   r   r1  r  r  r   r   r    r2    sR    


z&ModuleNode.generate_ass_slice_functionc             C   s  |j drd S |jd}|jd |jd|  |jd g }|j}x0|d k	rt|jjdk rt|j|j |jjj}qFW ||kst	d }|r|jjdkr|j
r|n|jj}d }d}xtjD ]|}	x"|D ]}
|
j |	}|d k	rP qW q|	jdj }|jd	|  |	d
kr|}n|	dkrd}|jd|j  |jd qW |r| r| r|jd |jd |jd|j  |jd |jd |jd |jd |jd |jd |jd |jd |jd |r|j
r|jd|j
|j
f  |jd |jd |jd |jd d S )N__richcmp__tp_richcomparert   z9static PyObject *%s(PyObject *o1, PyObject *o2, int op) {zswitch (op) {r  Frn  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);)rP  rL  r   r?  rI   rn   r0   r   r1  r8   r   r   r:  r   upperrW  )rE   r   r   richcmp_cfuncclass_scopesclsextern_parenteq_entryhas_ne
cmp_methodclass_scoperI   cmp_typer   r   r    r;    sf    





















z$ModuleNode.generate_richcmp_functionc                s  d fdd	  ddd} d} d}|j d |j d	jd
  |d k	rd|j d|j  nb| rjjr|jjtjdd d}n,| s|dkr|jjtjdd d}nd}|j d|  |d k	 r|j d |j d |j d|j  |j d |j d |j d d S )Nc                sN   |d krj }|jj| }|d krJ|jr4|d k	r4|S |jd k	rJ | |jS |S )N)r?  r   rP  is_externalr1  )ntpextern_returnr)lookup_here_or_baser   r   r    r  i  s    
zBModuleNode.generate_getattro_function.<locals>.lookup_here_or_baser'  r  )r  r   r!  rt   z/static PyObject *%s(PyObject *o, PyObject *n) {tp_getattrozPyObject *v = %s(o, n);PyObject_GenericGetAttrNoDictzObjectHandling.c#__Pyx_PyObject_GenericGetAttrNoDictPyObject_GenericGetAttr__Pyx_PyObject_GenericGetAttrz9if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) {zPyErr_Clear();zv = %s(o, n);r   z	return v;)NN)	r   rL  rW  r?  rN  r   r   r
   r  )rE   r   r   has_instance_dictgetattr_entrygetattribute_entrygeneric_getattr_cfuncr   )r  r   r    r3  b  sJ    



z%ModuleNode.generate_getattro_functionc             C   s   |j j}|jd}|jd}|jd |jd|jd  |jd |rZ|jd|j  n| j|d dd| |jd	 |jd
 |jd |r|jd|j  n| j|d dd| |jd |jd
 |jd
 d S )Nr"  r#  rt   z6static int %s(PyObject *o, PyObject *n, PyObject *v) {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?  r1  rP  r   rL  rW  r  )rE   r   r   r1  r  r  r   r   r    r4    sB    


z%ModuleNode.generate_setattro_functionc             C   sn   |j d}|jd |jd|jd  |jd |jd |jd |jd|j  |jd	 |jd
 d S )Nr$  rt   z<static PyObject *%s(PyObject *o, PyObject *i, PyObject *c) {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   )rP  r   rL  rW  )rE   r   r   user_get_entryr   r   r    r5    s$    


z&ModuleNode.generate_descr_get_functionc             C   s   |j j}|jd}|jd}|jd |jd|jd  |jd |rZ|jd|j  n&| j|d dd| |jd	 |jd
 |jd |jd |r|jd|j  n&| j|d dd| |jd |jd
 |jd |jd d S )Nr%  r&  rt   z6static int %s(PyObject *o, PyObject *i, PyObject *v) {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?  r1  rP  r   rL  rW  r  )rE   r   r   r1  user_set_entryuser_del_entryr   r   r    r6    sJ    


z&ModuleNode.generate_descr_set_functionc             C   sL   xF|j D ]<}|j}|jdgr*| j|| |jddgr| j|| qW d S )Nr$  r%  __del__)property_entriesr   r8  generate_property_get_functiongenerate_property_set_function)rE   cclass_scoper   rI   property_scoper   r   r    r<    s    z&ModuleNode.generate_property_accessorsc             C   s\   |j }|jjtj|j|_|jd}|jd |jd|j  |jd|j	  |jd d S )Nr$  rt   z9static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {zreturn %s(o);r   )
r   parent_scoper   r   prop_get_prefixr]   getter_cnamerP  r   rW  )rE   property_entryr   r  	get_entryr   r   r    r    s    



z)ModuleNode.generate_property_get_functionc             C   s   |j }|jjtj|j|_|jd}|jd}|jd |jd|j  |jd |rh|jd|j	  n|jd |jd |jd	 |jd
 |r|jd|j	  n|jd |jd |jd	 |jd	 d S )Nr%  r  rt   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   prop_set_prefixr]   setter_cnamerP  r   rW  )rE   r  r   r  r  r  r   r   r    r  %  sF    



z)ModuleNode.generate_property_set_functionc       
      C   s   |j }|j}xtjD ]}|j|| qW |jd |jdkrBd}nd}|j||j  |jd |jd| j|j	f  |j
r|j}n
d|j }|jd|  |jd	 xtjD ]}	|	j|| qW |jd
 d S )Nrt   rm   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};)rB   r   r   substructuresgenerate_substructurer   rn   r   rA   
class_namer  rF  
slot_tablegenerate)
rE   modnamerI   r   rB   r   suiter  	objstructr  r   r   r    r>  L  s2    



z&ModuleNode.generate_typeobj_definitionc             C   s   |j r|j rd S |jd }|jd |j }|jd|j  x2|jD ](}|j rF|oZ|j rF|j|d|d qFW |jd |jd |j	 r|jd d S )Nbindingrt   zstatic PyMethodDef %s[] = {r  )wrapper_code_writerz{0, 0, 0, 0}z};)
is_c_class_scopepyfunc_entriesr*   r   insertion_pointmethod_table_cnamefused_cfunctionis_overridableput_pymethoddefgetvalue)rE   r+   r   r  r  rI   r   r   r    r   j  s"    


z ModuleNode.generate_method_tablec             C   s   |j d}| s|j rd S |jd}|j}|jd |jd|  | j|| |jd|  |jd|  |jd |jd|  |jd	|  |jd d S )
Nr'  __dict__getterrt   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;)rP  is_variablerL  r   r   rB  )rE   r   r   	dict_attr	func_name	dict_namer   r   r    r9    s    



z(ModuleNode.generate_dict_getter_functionc             C   s   |j r|jd |jd|j  xX|j D ]N}|j}|rN|jrD|j }|j }nd}|jd|j|jpdd|j	pld|f  q(W |jd |jd d S )Nrt   z"static struct PyGetSetDef %s[] = {r  z&{(char *)"%s", %s, %s, (char *)%s, 0},z{0, 0, 0, 0, 0}z};)
r  r   getset_table_cnamerN   
is_unicodeas_utf8_stringas_c_string_literalr]   r  r  )rE   r+   r   rI   rN   doc_coder   r   r    r=    s,    


z ModuleNode.generate_getset_tablec             C   s@   x:t |jj D ](\}}|jr|jr|jjs|jj| qW d S )N)rV   rW   rX   
is_cglobalrG  rB   r  r  )rE   r+   r]   rI   r   r   r    rU     s    z5ModuleNode.create_import_star_conversion_utility_codec             C   s  |j tjdd |j  |j  |jdtj  |jd x.t|jj	 D ]\}}|j
rL|jd|  qLW |jd |jd |jd |jd	 |jd
 |jd |jd |jd |jd |jd |j }|jd d}xPt|jj	 D ]<\}}|jr|jr|jj r|d7 }|d dkrL|jd |jd |jd |jd|  |jjr|jjsx|jjr|jd|jjd|j|jf  |jd |j|j|jdd |jd|jtj|jtdf  nR|jj|r|j|jjd|j|j| n&|jd||jf  |j|j|j |jd qW |jd |jdtj  |jd |jd  |j|jr|j |j |j!| j" ||_|jd! |jd" |jd |jd# |jtj#d$d%d  |j$  d S )&NCStringEqualszStringTools.cz;static int %s(PyObject *o, PyObject* py_name, char *name) {z,static const char* internal_type_names[] = {z"%s",r  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;rI  zPy_INCREF(o);F)r  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;rt   
ImportStarzImportExport.c)%r   r
   r  r   enter_cfunc_scoper   import_star_setrV   rW   rX   rZ   new_error_labelr  rG  rB   is_constr  rI  rt  type_test_code
error_gotorQ   
put_decrefr   r   r  r	   r  from_py_call_coder  
label_usederror_label	put_labelput_add_tracebackrA   r   exit_cfunc_scope)rE   r+   r   r]   rI   old_error_label
msvc_countr   r   r    r     sx    

























zModuleNode.generate_import_starc          7   C   s  | j | j|}|j| j |jd |jtjddd  d|j }d| jd| }|jd |jd	|  |j| |jd
 |jd	|  |j| |jd |jd |jdtj	  |jd tjddd }|j
| |jd |jd| jtj|tjf  |jd |jd |jd |j }|jjd }	|jjd }
|	sR|
rf|jjtjdd |j  |jd |jdtj  |jdtjtjf  |jd|j  |jd |jd |jd |jdtjtjf  |jd |	s|
r|j  |j  tjddd }|j|j  |j| |jtjdd |j| jd |jd  |jd! |jd |jd"tj|jtj| jf  |jd#tj|jtj| jf  |jd$tj|jtj| jf  x8d\D ]0}|jd+|  |j| jd,|  |jd qW |jd- |jd. r,|j| jd/ |jd0 |jd1 |jd2 |jd3 |jd |jd |jd4 | j|| |jd5 |j| jd6 |jd7 |j| jd8 |jd |jd9tj | j!j"d:d;f  |j| jd<|j|j#t$d=|j#t$d>f  |jd | j%|| t&j'r8|jd? |jd d@ |jdA |jd dB |jdC |dD}| j(|| W d Q R X |dE}| j)|| W d Q R X |dF}| j*|| W d Q R X |dG}| j+|| W d Q R X |dH$}x|D ]}| j,||| qW W d Q R X |dI$}x|D ]}| j-||| qW W d Q R X |dJ.}x&|D ]}| j.| | j/||| qLW W d Q R X |jdK |j0d  |jdL |j| jdM |jd |	s|
r|j1|| j|j2j3 dN dO|j2_4| j5j6| |	s|
rdP|j2_4|j7dQ|j2j3 dN |j  |jdR | j8|| |j  t&j9rf|jjtjdSd |jdT|j:| j  |j;|j< |j=|j> x$|j2j? D ]\}}|j@|| qW |jd|j  |jd|jA  |jBdU|jC  |jjtDjE |jd |jF|jtGdPdOdV |jdW |jdX|jC  |jd |j=|j< |jH  |jd |jdY|j  |jd |jdZ|j  |jd
 |jd[ |jd |jd |jI|j2 |jJ  d S )]Nrt   PyModInitFuncTypezModuleSetupCode.cr   z!__Pyx_PyMODINIT_FUNC init%s(void)z__Pyx_PyMODINIT_FUNC %s(void)ru   z#if PY_MAJOR_VERSION < 3z%s CYTHON_SMALL_CODE; /*proto*/z#elsez"#if CYTHON_PEP489_MULTI_PHASE_INITrz  zreturn PyModuleDef_Init(&%s);r   ModuleCreationPEP489r   z-static CYTHON_SMALL_CODE int %s(PyObject *%s)z#endifprofile	linetrace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);ImportRefnannyAPI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
CyFunctionFusedFunction	Coroutine	GeneratorAsyncGenStopAsyncIterationz#ifdef __Pyx_%s_USEDz__pyx_%s_init()z)/*--- Library function declarations ---*/
np_pythranz_import_array()z'/*--- Threads initialization code ---*/zA#if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADSz=#ifdef WITH_THREAD /* Python build with threading support? */z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())nogilTFPy_Nonez/*--- Wrapped vars code ---*/RegisterModuleCleanupz if (__Pyx_RegisterCleanup()) %s;zinit %s)r  rm  z} else if (!PyErr_Occurred()) {z.PyErr_SetString(PyExc_ImportError, "init %s");zreturn (%s != NULL) ? 0 : -1;z
return %s;zreturn;)r  r  r  r  r  r  )Kmod_init_subfunctionr   r  r   r
   r   rC   r   r   pymoduledef_cnamer   pymodule_exec_func_cnamepymodinit_module_argr  r   r*   r   r  put_declare_refcount_contextr  put_trace_declarationsput_trace_frame_initrstripput_setup_refcount_contextloadput_error_if_negrQ   r  error_goto_if_nullr  r  generate_module_creation_coder   rA   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_moduler  *generate_c_function_import_code_for_moduler   put_trace_call	funcstate	gil_owned	can_tracer/   generate_execution_codeput_trace_returngenerate_wrapped_entries_codegenerate_cleanup_coder  put_gotoreturn_labelr  r  all_managed_tempsput_xdecrefr  r  r   r   traceback_utility_coderX  r	   put_finish_refcount_contextput_temp_declarationsr  )rE   r   r+   r   subfunctionheader2header3mod_create_functempdecl_coder  r  refnanny_import_codeext_type
inner_coderk   r   rB   r   r   r    r     s<   

































































z$ModuleNode.generate_module_init_funcc                sB   j  jd j    j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).
        rt   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j |j j }tjd|s"td| | _|| _d | _d | _	d S )Nrn  z^[a-z0-9_]+$z__Pyx_modinit_%s)
r  r  splitr   matchr8   
cfunc_namedescriptionr0  	call_code)rE   	code_typer   r   r   r    __init__	  s    
zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__init__c                sj   j  | _ }|j jd| j  |jd| j  |j  |j  | _|j| j |jd| j  |S )Nz0static CYTHON_SMALL_CODE int %s(void); /*proto*/zstatic int %s(void) {z/*--- %s ---*/)	r  r8  r  r   r6  r
  r0  r  r7  )rE   r   )function_code	orig_code
prototypesr   r   r    	__enter__	  s    


zEModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__enter__c                s    }|j   |jd | jj|j d | _|j|j}|r||j|j x"|jj D ]\}}|j	|| qRW |j   |jd |jd |j
  |jd |r| jjj | jjd| jjf  n| jjd| j  d | _d S )Nz	return 0;z
return -1;r   rt   z!if (unlikely(%s() != 0)) goto %s;z(void)%s();)r*  r   r0  r+  r  r  r  r  r'  r(  r  r8  	use_labelr6  )rE   r  r   needs_error_handlingr   rB   )r;  r<  r   r    __exit__	  s*    



zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__exit__N)r  
__module____qualname__r:  r>  rA  r   )r;  r<  r=  r   r   r    ModInitSubfunction	  s   rD  )r  r   object)rE   r   r<  rD  r   )r;  r<  r=  r   r    r  	  s    	

1zModuleNode.mod_init_subfunctionc       	      C   s>  |j d }|dkr| jd j}|r|jd |jd|j|jjtt|j	|j
| jf  |jd |jr|jd |jjtd}|jd||jjtttjj|j	|j|| jf  |j| |jd	|j||j
| jf  |j|t |jj| |jd n|jr|jd | jjd
d\}}d
|krRd|jd
dd f }nd}|jjtjdd |j|jd||jjt|jj	f | j |jd | j}|jdr|d td  }|jd |jd |jd|jd| j  |jd|  |j|jd||jf | j |jd |jd |jd d S )Nset_initial_path
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;r   r   z"%s"NULLSetPackagePathFromImportLibzImportExport.cz)__Pyx_SetPackagePathFromImportLib(%s, %s)z	.__init__z#if PY_MAJOR_VERSION >= 3rz  z0PyObject *modules = PyImport_GetModuleDict(); %sr   z+if (!PyDict_GetItemString(modules, "%s")) {z'PyDict_SetItemString(modules, "%s", %s)z#endif)r*   rQ   filenamer   r  r   get_py_string_constr   r   r   r  
is_packager  allocate_tempr	   r   r   r  r  
put_gotrefrX  release_temprA   rsplitr   r
   r  error_goto_if_negrC   endswithr  )	rE   r+   r   module_pathtemppackage_namern  parent_namefq_module_namer   r   r    r  
  sn    















z'ModuleNode.generate_module_import_setupc             C   s  t js
d S |jdtj  t jdkr||jd t|j}|j  x:|D ]2}|jdkrF|j	j
rF|jrF|j|j|j	ddd qFW |jd t jd	kr|jd
 x0t|jtjddD ]}|j|j|ddd qW t jr|jd x$|jD ]}|j|jtjddd qW |jd |jtjtjddd x|jD ]}|j	}|js,|jrJq,|jjjddr,|j}|jtj }|jtj!}	|jd|	  |jd||	f  |jd |jd q,W 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 qW d S )Nz.static void %s(CYTHON_UNUSED PyObject *self) {r   z/*--- Global cleanup code ---*/r  TF)rm  r  z__Pyx_CleanupGlobals();   z$/*--- Type import cleanup code ---*/r   )r<  z /*--- Builtin cleanup code ---*/z/*--- Intern cleanup code ---*/rE  r   zwhile (%s > 0) {z"PyObject* o = (PyObject*)%s[--%s];z(*Py_TYPE(o)->tp_free)(o);r   )r  rm  )'r   r$  r   r   cleanup_cnamer  rw   reversern   rB   r  rG  rr  r   rV   types_importedrR  rS  r   r  cached_builtinsr   r	   rX  r  r@   r  r1  r   r*   r3  rL  rS  rT  r  r  r  r  r  )rE   r+   r   rev_entriesrI   r2  cclass_typer   rS  rT  r   r   r   r    r   U
  sj    













z'ModuleNode.generate_module_cleanup_funcc             C   s\   dt j| jjddf }tjdkr(d}ntj}tjdd}|jj	|j
|j|tj|d d S )	Nz%s%sr   r   mainwmainMainFunctionzEmbed.c)rC   r   r   wmain_method)r   r   rA   r   r   r   r
   r  r   r   
specializerC   )rE   r+   r   r   r`  r   r   r   r    r   
  s    
zModuleNode.generate_main_methodc             C   s   d||j f S )Nz%s_%s)rC   )rE   prefixr+   r   r   r    r   
  s    zModuleNode.mod_init_func_cnamec             C   s  |j rd|j|j  }nd}tjr.dtj }nd}|jd |jd |jd | jtj|}|jdtj	  |jd	|  |jd
tj
  |jdtj	  |jd|  |jd |jd |jd |jd |jdtj  |jd |jd|j  |jd|  |jd |jd |jd |jd |jd |jd|j  |jd |jdtj
  |jd |jd |jd |jd |jd |jd|  |jd |jd d S )Nz%sr  z(freefunc)%srH  rt   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 */)rN   get_string_constr   r$  r   rY  r   r   r  pymodule_create_func_cnamepymoduledef_slots_cnamer  rC   r  )rE   r+   r   rN   cleanup_funcexec_func_cnamer   r   r    r   
  sP    




















z&ModuleNode.generate_pymoduledef_structc             C   s  |j rd|j|j  }nd}|jd |jd|jtjf  |j|jtdd |jd |jd |jd	|j|j|j	||jf  |jd |jd
|jtj
f  |jd |j|j|j| j |jd |jd|j|j|j|j| jf  |j|jtdd |jdtj|jtj| jf  |jtjtdd |jdtj|jtj| jf  |jtjtdd |jd|jtj|j| jf  tjd k	r|jdtjtj|jtj| jf  |jtjtdd d S )Nz%sr  z"#if CYTHON_PEP489_MULTI_PHASE_INITz%s = %s;F)r  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) %s;z!%s = PyImport_AddModule("%s"); %s)rN   re  r   r  r   r	  
put_increfr	   rC   r  r  r  rQ   r  r  r  r  r   r  r  )rE   r+   r   rN   r   r   r    r  
  sh    





z(ModuleNode.generate_module_creation_codec             C   s2   x,|j D ]"}|jdkr|jr|jj|| qW d S )Nr  )rw   rn   rG  rB   global_init_code)rE   r+   r   rI   r   r   r    r    s    
z$ModuleNode.generate_global_init_codec             C   s   xt |jj D ]\}}|jr|j r|j|kr|jj|sNt|j	d|j  |j
d |j
d|jj|jf  |j
|jd|j	 |j
d|j||j|j	f  |j
d qW d S )Nz$Cannot convert '%s' to Python objectrz  zPyObject* wrapped = %s(%s);wrappedz6if (PyObject_SetAttrString(%s, "%s", wrapped) < 0) %s;r   )rV   rW   rX   rY   rZ   r   rB   r  r   rQ   r   to_py_functionr   r  r  r  )rE   r+   r   r]   rI   r   r   r    r#    s"    

z(ModuleNode.generate_wrapped_entries_codec             C   s   g }x6|j D ],}|js.|js.tjr|jdk r|j| qW |r|jtj	dd xB|D ]:}|j
j }|j|j}|jd||j||j| jf  qXW d S )Nr  VoidPtrExportzImportExport.cz6if (__Pyx_ExportVoidPtr(%s, (void *)&%s, "%s") < 0) %s)rw   ro   rj   r   cimport_from_pyxrn   r0   r   r
   r  rB   r   r  r]   r   r   r  rQ   )rE   r+   r   rW   rI   	signaturer]   r   r   r    r  1  s    

z*ModuleNode.generate_c_variable_export_codec             C   s   g }x6|j D ],}|js.|js.tjr|jdk r|j| qW |r|jtj	dd x8|D ]0}|j
j }|jd|j|j||j| jf  qXW d S )Nr  FunctionExportzImportExport.cz@if (__Pyx_ExportFunction("%s", (void (*)(void))%s, "%s") < 0) %s)ri   ro   rj   r   ro  rn   r0   r   r
   r  rB   r   r   r]   r   r  rQ   )rE   r+   r   rW   rI   rp  r   r   r    r  B  s     

z*ModuleNode.generate_c_function_export_codec             C   sD   t |2}x*|jD ] }|jr| j||j|j|| qW W d Q R X d S )N)r   r@   rj   generate_type_import_coderB   rQ   )rE   rk   r+   r   r   rI   r   r   r    r  W  s    
z/ModuleNode.generate_type_import_code_for_modulec             C   s.   x(|j dd D ]}|jjr|j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)ri   rB   is_fused"get_all_specialized_function_types)rE   pxd_envrI   r   r   r    r  `  s    z!ModuleNode.specialize_fused_typesc       	   	   C   s   g }x|j D ]}|jr|j| qW |r|jtjdd |jjtdd}|j	d||j
||j| jf  xX|D ]P}||kr|j}n|jtj|j}|jj }|j	d||j|||j| jf  qpW |j	d||f  d S )Nr   zImportExport.cT)
manage_refz-%s = PyImport_ImportModule("%s"); if (!%s) %sz=if (__Pyx_ImportVoidPtr(%s, "%s", (void **)&%s, "%s") < 0) %szPy_DECREF(%s); %s = 0;)rw   rj   r0   r   r
   r  r  rM  r	   r   r   r  rQ   r   r   r   r  r]   rB   r   )	rE   rk   r+   r   rW   rI   rT  r   rp  r   r   r    r  l  s0    


z5ModuleNode.generate_c_variable_import_code_for_modulec          	   C   s   g }x$|j D ]}|jr|jr|j| qW |r|jtjdd |jjt	dd}|j
d||j||j| jf  x6|D ].}|j
d||j|j|jj |j| jf  qvW |j
d||f  d S )Nr   zImportExport.cT)rv  z-%s = PyImport_ImportModule("%s"); if (!%s) %szFif (__Pyx_ImportFunction(%s, "%s", (void (**)(void))&%s, "%s") < 0) %szPy_DECREF(%s); %s = 0;)ri   rj   rG  r0   r   r
   r  r  rM  r	   r   r   r  rQ   r]   r   rB   r   )rE   rk   r+   r   rW   rI   rT  r   r   r    r    s.    
z5ModuleNode.generate_c_function_import_code_for_modulec             C   s   t |p}xh|jD ]^}|jdkr@|j r@| j||j|j|| q| j|||| | j|| |jj	r| j
|| qW W d Q R X d S )Nr  )r   r@   rn   utility_code_definitionrr  rB   rQ   generate_base_type_import_code!generate_exttype_vtable_init_code
early_initgenerate_type_ready_code)rE   r+   r   r   rI   r   r   r    r    s    
z"ModuleNode.generate_type_init_codec             C   s@   |j j}|r<|j|jkr<|j r<|j r<| j||| j|| d S )N)rB   r1  rC   r   rt  rw  rr  rQ   )rE   r+   rI   r   r   r1  r   r   r    rx    s    z)ModuleNode.generate_base_type_import_codec             C   s   ||j krd S |jtjkr.|jjtjdd | j||||d |j	r|jjtjdd |j
d|j	|j|j|j|j	|f  |j j| d S )Nr   zImportExport.c)	error_pos	GetVTablez1%s = (struct %s*)__Pyx_GetVtable(%s->tp_dict); %s)r[  r]   r   ctypedef_builtins_mapr   r   r
   r  r   r  r   rD  r   r  r2  )rE   r+   rB   rQ   r   r   r   r   r    rr    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 }|jd|j|f  d S d}|jtjkrtj|j \}	}
|tj	krtj	| }|s|d k	st
|j|}|j||}|jd|j||f  |	o|
r2|jd |jd	|	  |jd
|
  |jd |jd
|j  |jd n|jd|j  ||kr|	s\|jd |jd |jd|  |jd |jd|  |jd n|jd|  |jr|jdkr|j}n.|j s|jrd}ntd|j||jf |jd|j   |jd|j|f  d S )Nz	struct %s__builtin__builtinsz"%s"z%s = %s;__Pyx_BUILTIN_MODULE_NAMEz%s = __Pyx_ImportType(%s, %s,rt   z#if %sz"%s",z#elsez#endifz "%s", z>#if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000zsizeof(%s),zsizeof(%s), r   warnignorez6invalid value for check_size '%s' when compiling %s.%sz__Pyx_ImportType_CheckSize_%s);z if (!%s) %s)r  r  )r   r  r  )r  rF  rC   r]   r   r~  r   r   non_portable_builtins_mapbasicsize_builtins_mapr8   r  r/  r   
check_sizer  is_subclassedRuntimeErrorr  )rE   rB   r   r   r   r|  r  sizeof_objstructrC   	conditionreplacement	ctypenamerk   r  r   r   r    r     sd    












z$ModuleNode.generate_type_import_callc             C   s   t jj|| d S )N)r   CClassDefNoder{  )rE   rI   r   r   r   r    r{    s    z#ModuleNode.generate_type_ready_codec             C   s   |j }|jr|jd|j|jf  |jrL|jjrL|jd|jtj|jjf  dd |jjD }|rx2|D ]*}|j j	 }|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   )rW  )rp   rI   r   r   r    rr      s    z@ModuleNode.generate_exttype_vtable_init_code.<locals>.<listcomp>z%s.%s = %s%s;)rB   r@  r   r  r1  r   r  r   ri   signature_cast_stringr   rW  )rE   rI   r   rB   c_method_entries
meth_entrycastr   r   r    ry    s,    

z,ModuleNode.generate_exttype_vtable_init_code)F)TT)NN)cr  rB  rC  child_attrsr*   rD   rS   r^   rh   rl   re   r   r   rf   r   r   rd   r   r   rb   rB  rQ  rc   r`  r   rj  r   r   r   r   r   r  r   r  r  r  r  r  r  r  r  r[  r\  r]  r^  rY  rZ  rd  re  rf  r   r   r(  rB  r)  r*  rq  r,  r.  r0  r1  r  r2  r;  r3  r4  r5  r6  r<  r  r  r>  r   r9  r=  rU   r   r   r  r  r   r   r   r   r  r  r#  r  r  r  r  r  r  r  rx  rr  r   r{  ry  r   r   r   r    r.   ;   s   
#
FWQ),s

"!i(.	.  =D.0F<(,'D ^ABE/<	
B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"|j D ]\}}|| jd| < qW g | _d S )Nz"%s")r   importedrX   temps)rE   r   r   r]   r   r   r   r    r:  2  s    zModuleImportGenerator.__init__c             C   sd   || j kr| j | S | j}|jjtdd}| jj| |jd||||f  |j| || j |< |S )NT)rv  z5%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s)	r  r   r  rM  r	   r  r0   r   rN  )rE   module_name_stringr   r   rT  r   r   r    r/  :  s    



z%ModuleImportGenerator.imported_modulec             C   s   | S )Nr   )rE   r   r   r    r>  G  s    zModuleImportGenerator.__enter__c             G   s2   | j }x&| jD ]}|j|t |jj| qW d S )N)r   r  rX  r	   r  rO  )rE   excr   rT  r   r   r    rA  J  s    zModuleImportGenerator.__exit__)N)r  rB  rC  __doc__r:  r/  r>  rA  r   r   r   r    r   -  s
   
r   c       
      C   s   | j o
| j}| j r| js8| j r|s8| js8| jdks8|r| jdkrNtj}d}n2| jdkrdtj}d }n| jdkrxd}d }nd}d }| j}| jr| rd}d }t	|}|j
| j|d}|j| j}	|jd||	|f  d S )Nr  r   rm   r  r  )r  z%s %s%s; /*proto*/)rG  rw  inline_func_in_pxdrH  rj   rn   r   r   rB   r   r   r   r  r  r   )
rI   r+   r   r_  from_cy_utilityr  r  rB   r  r  r   r   r    r  Q  s4    


r  RefnannyzModuleSetupCode.czj
#if defined(__GNUC__)
#define __Pyx_PACKED __attribute__((__packed__))
#else
#define __Pyx_PACKED
#endif
rt   utility_code_proto_before_types)protoimplproto_blockCapsule)0
__future__r   cythondeclarerE  collectionsr   r  rR  r   r   r   r   rt   r   r   r   r   r   r   r   r   Errorsr   r   r	   Utilsr   r   r   r   r
   r   StringEncodingr   r   r!   r$   r-   Node	BlockNoder.   r   r  r  r   r  capsule_utility_coder   r   r   r    <module>   sv   
                        
$%