3
h                @   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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mZ ddlmZ ddlmZmZmZm Z m!Z! ddlm"Z"m#Z#m$Z$ ddl%m&Z&m'Z' ddlm(Z( dd Z)dd Z*dd Z+dd Z,dd  Z-d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLiZ.G d*d+ d+ej/ej0Z1G d,d- d-eZ2d.d/ Z3e"j4d0d1Z5e"d2d)d3d4Z6dS )M    )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   CompileError)r	      )open_new_filereplace_suffixdecode_filenamebuild_hex_versionis_cython_generated_file)r
   IncludeCodeTempitaUtilityCode)r   encoded_string_or_bytes_literal)has_np_pythranc             C   s   t | |}t|S )N)r   as_encoded_filename)pathZnewsufnewpath r#   l/var/www/html/CrowdFlow/Picklecon/ble_analysis_env/lib/python3.6/site-packages/Cython/Compiler/ModuleNode.pyreplace_suffix_encoded&   s    
r%   c             C   s   t | tj S )N)r   sysgetfilesystemencoding)r!   r#   r#   r$   r    +   s    r    c             C   s   | j j  | S )N)scopeZcheck_c_classes_pxd)module_noder#   r#   r$   check_c_declarations_pxd1   s    
r*   c             C   s   | j j  | j j  | S )N)r(   Zcheck_c_classesZcheck_c_functions)r)   r#   r#   r$   check_c_declarations6   s    

r+   c             C   sB   t js|jrd}n|j}t|dr*td tj|| jd |jdS )NFemit_code_commentszeWarning: option emit_code_comments is deprecated. Instead, use compiler directive emit_code_comments.)emit_linenumsr,   c_line_in_traceback)	r   annotater-   hasattrprintr   ZCCodeConfig
directivesr.   )envoptionsr-   r#   r#   r$   generate_c_code_config<   s    
r5   __lt____gt__T&&__le__F||__ge__ c               @   s  e Zd ZdgZdZdZdZdddZdd Zdd	 Z	d
d Z
dd Zd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ed0d1 Zd2d3 Zd4d5 Z d6d7 Z!dd9d: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 Z0dWdX Z1dYdZ Z2d[d\ Z3d]d^ Z4d_d` Z5dadb Z6dcdd Z7dedf Z8dgdh Z9didj Z:dkdl Z;dmdn Z<dodp Z=dqdr Z>dsdt Z?dudv Z@dwdx ZAdydz ZBd{d| ZCd}d~ ZDdd 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_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd ZfddĄ ZgddƄ ZhddȄ Ziddʄ Zjdd̄ Zkdd΄ ZlddЄ Zmdd҄ ZnddԄ ZodddքZpdd؄ Zqddڄ Zrdd܄ ZsdS )
ModuleNodebodyNFc       	      C   sZ  t | jtjst|d
kst| jd krttj| jjg d| _tj| jjg d| _| jjj	d| j | jjj	d| j |j
| jj
krtj|j||j
d}|dkr| jn| j}t |tjr|jj|j n|jj| | jjj|j x|jj D ]}| jj| qW dd }|| jj|j |rVx(|jD ]}| j|j_d|jjj
d	< q(W | jj| d S )Npxdutility)statsr   )r>   r2   c             S   s$   x|D ]}|| kr| j | 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)r?   r@   )
isinstancer>   r   ZStatListNodeAssertionError	pxd_statsposutility_code_statsrA   insertr2   r(   CompilerDirectivesNodeextendrB   utility_code_list
c_includesvaluesZprocess_includeincluded_filesc_class_entriesfull_module_nametypemodule_namemerge_in)	selftreer(   ZstageZmerge_scopeZtarget_statsincrD   entryr#   r#   r$   rU      s.    

zModuleNode.merge_inc             C   s   t j| j| j| jd}|S )N)r2   r>   )r   rK   rH   r2   r>   )rV   r>   r#   r#   r$   with_compiler_directives   s    z#ModuleNode.with_compiler_directivesc             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   Zinclude_pythran_genericr2   r[   r   Z
docstringsdocZembed_pos_in_docstringr   r   Zrelative_positionrH   encodingr>   analyse_declarations)rV   r3   r#   r#   r$   r_      s    

zModuleNode.analyse_declarationsc             C   sh   | j }|jr| j| xLt|jj D ]:\}}|jr&|j |kr&|jr&|jj	sT|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_typerS   is_enumis_cpp_enumZcreate_type_wrapper)rV   r3   namerY   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   Zc_void_typereturn_typereferenced_modulesfind_referenced_modulessort_cdef_classesgenerate_c_codegenerate_h_codegenerate_api_code)rV   r4   resultr3   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   )rl   cfunc_entriesdefined_in_pxd)rV   modulerY   r#   r#   r$   has_imported_c_functions   s
    z#ModuleNode.has_imported_c_functionsc             C   s*   t ||dds&t| jdtjj| d S )NT)allow_failedZif_not_foundzVThe output file already exists and does not look like it was generated by Cython: "%s")r   r   rH   osr!   basename)rV   r!   rx   r#   r#   r$   assure_safe_target   s    zModuleNode.assure_safe_targetc          	   C   s  d*dd}||j dd}||j}||j}||j}|sH|sH|sH|rt|jd|_| j|j tj	 }	t
||}
tj|	| |
}|j  |jd }|jd }|jd	 }|jrt|jd
|_tj|j}nd }|j  | jtj|}|j| |jd |jd | j|| |jr$| j|g | |jd | jtj|}|jd|  |jd | j||j  |jd | j| |r|jd x0|D ](}| j|j| |r| j |j| qW |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"j# rt|j"}n |j"j$dddj%d}|jd |jd|  |jd | j&d|}t'd|||f }|jd|j(d  |jd|  |jd |jd |jd |jd |j)   |jd! |jd"|j)   |jd# |jd$|j)   |jd% |jd&|  |jd' |jd( |jd)|||f  |jd% |jd% |jd |jd|  t*|j}|	j+| W d Q R 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apiru   ).0rY   )r~   r?   r#   r$   
<listcomp>   s    

zAModuleNode.generate_h_code.<locals>.h_entries.<locals>.<listcomp>r#   )rc   r~   r?   r#   )r~   r?   r$   	h_entries   s    z-ModuleNode.generate_h_code.<locals>.h_entriesr   )r~   z.hh_codetype_declarationsendz.pxir<   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 < 3asciiignore)errorszutf-8z<#error "Unicode module names are not supported in Python 2";zPyMODINIT_FUNC init%s(void);z#elsePyInitzDUse PyImport_AppendInittab("%s", %s) instead of calling %s directly.z!/* WARNING: %s from Python 3.5 */.zPyMODINIT_FUNC %s(void);z#if PY_VERSION_HEX >= 0x03050000 && (defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) || (defined(__cplusplus) && __cplusplus >= 201402L))z2#if defined(__cplusplus) && __cplusplus >= 201402Lz[[deprecated(%s)]] inlinez-#elif defined(__GNUC__) || defined(__clang__)z;__attribute__ ((__deprecated__(%s), __unused__)) __inline__z#elif defined(_MSC_VER)z#__declspec(deprecated(%s)) __inlinez#endifz>static PyObject* __PYX_WARN_IF_%s_INIT_CALLED(PyObject* res) {zreturn res;}z/#define %s() __PYX_WARN_IF_%s_INIT_CALLED(%s()))r   r   ),type_entriesvar_entriesrt   rQ   r%   c_fileh_filer{   r   CCodeWriterr5   GlobalStateZinitialize_main_h_codepartsZgenerate_pxiZi_fileZPyrexCodeWriterput_generated_byapi_namer   h_guard_prefixput_h_guardputlngenerate_type_header_codeZcapi_reexport_cincludesgenerate_includesapi_guard_prefix"generate_extern_c_macro_definitionis_cppgenerate_dl_import_macrogenerate_cclass_header_coderS   generate_cclass_include_codegenerate_public_declarationrT   isasciiencodedecodemod_init_func_cnamer   rstripas_c_string_literalr   copyto)rV   r3   r4   rr   r   Zh_typesZh_varsZh_funcsZh_extension_typesZh_code_writerc_code_configglobalstateZh_code_startZh_code_mainZ
h_code_endi_codeZh_guard	api_guardrY   py2_mod_nameZpy3_mod_func_nameZwarning_stringfr#   r#   r$   rp      s    







































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_macrorS   declaration_codecname)rV   rY   r   r   r#   r#   r$   r   Y  s    z&ModuleNode.generate_public_declarationc             C   s   | j ||j}|jddS )Nr   __)punycode_module_namequalified_namereplace)rV   prefixr3   r   r#   r#   r$   r   a  s    zModuleNode.api_namec             C   s  d&dd}||j }||j}||j}|s6|s6|rt|jd|_| j|j tj }t	||}	tj
|| |	 |j  | jtj|}
|j|
 |jd |jd |jd |jd |jrtjj|j}t|}|jd	|j   |r0|jd
 x8|D ]0}|j}|jd|j  |jd|j|jf  qW |r|jd
 xP|D ]H}t|j}|jtj|j}|jd|j|  |jd|j|f  qFW |r|jd
 xP|D ]H}t|j}|jtj|j}|jd|j|  |jd|j|f  qW |r|j t!j"ddd  |r,|j t!j"ddd  |r^|j t!j"ddd  |j t!j"ddd  |jd
 |jd| jd|  |jd |jd|j#j   |jd xF|D ]>}|jtj|j}|jj$ }|jdtj%|jj ||f  qW xF|D ]>}|jtj|j}|jj& }|jdtj%|jj ||f  qW t'||j#did*}x"|D ]}| j(|j||dd qPW 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#   )r~   ru   )r   rY   )r?   r#   r$   r   g  s    zEModuleNode.generate_api_code.<locals>.api_entries.<locals>.<listcomp>r#   )rc   r?   r#   )r?   r$   api_entriesf  s    z1ModuleNode.generate_api_code.<locals>.api_entriesz_api.hz#ifdef __MINGW64__z#define MS_WIN64z#endifz#include "Python.h"z#include %sr<   zstatic PyTypeObject *%s = 0;z#define %s (*%s)zstatic %s = 0;z#define %s %sVoidPtrImportzImportExport.cr   FunctionImport
TypeImportzstatic int %s(void) {importzPyObject *module = 0;z#module = PyImport_ImportModule(%s);zif (!module) goto bad;zRif (__Pyx_ImportFunction_%s(module, %s, (void (**)(void))&%s, "%s") < 0) goto bad;zIif (__Pyx_ImportVoidPtr_%s(module, %s, (void **)&%s, "%s") < 0) goto bad;rv   )imported_modulesz	goto bad;)
error_codezPy_DECREF(module); module = 0;z	return 0;zbad:zPy_XDECREF(module);z
return -1;r   z#endif /* !%s */)r   ),r   rt   rQ   r%   r   Zapi_filer{   r   r   r5   r   r   r   r   r   r   r   r   ry   r!   rz   r    r   rS   typeptr_cnametypeobj_cnamer   mangleZfunc_prefix_apiri   r   Zvarptr_prefix_apiputr
   load_as_stringr   signature_string	cyversionempty_declaration_codeModuleImportGeneratorgenerate_type_import_callr   r   close)rV   r3   r4   rr   r   Zapi_varsZ	api_funcsZapi_extension_typesr   r   r   Z
h_filenamerY   rS   r   sigimport_generatorr   r#   r#   r$   rq   e  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   )rV   rS   r   r#   r#   r$   r     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   rT   ri   indentr(   r   rS   r   r   dedent)rV   rS   r   r   rY   r#   r#   r$   r     s    

z'ModuleNode.generate_cclass_include_codec             C   s  | j |jdd | j}tjs"|jrJtjdkp4|jdk}tj|| jjd}nt	j
 }t||}t	j|| ||jd}|j  |d }	| j||||j|	 | j|_| j|_|jt |d }
|
jd| jj   | j }|
jd	|  |
jd
|  |
jd |
jd|jj   |d }
| j|||
dd |d }
| j||
 | j||
 | j||
 | jj ||
 |
j!d  | j"||
 | j#||
 |j$r| j%||
 |
jt&j'ddd j(  | j)||d  | j*||d  | j+||d  | j,||d  | j-|d d ||d  | j.||d  tj/r2| j0||d  | j1|d  | j2||| |	j3d x"|j4d d  D ]}|j| qhW |j5  | j6||| t7|j}z|j8| W d |j9  X d|_:|j;r| j<|| tjs|jr| j=||| d S )NT)rx   Zfullc)show_entire_c_codesource_desc)Zcode_configcommon_utility_include_dirr   Zbefore_global_varz#define __Pyx_MODULE_NAME %szextern int %s;zint %s = 0;r<   z/* Implementation of %s */Zlate_includesF)earlyZmodule_codeZSmallCodeConfigzModuleSetupCode.cr   module_statemodule_state_definesmodule_state_clearmodule_state_traverser   init_moduleZcleanup_modulemain_methodZfilename_tabler\   )>r{   r   rl   r   r/   r   ZAnnotationCCodeWriterZcompilation_sourcer   r   r   r5   r   r   Zinitialize_main_c_codegenerate_module_preambleZembedded_metadatarH   Z
module_posr2   use_utility_coderefnanny_utility_coder   rR   r   is_main_module_flag_cnamer   r   Zgenerate_cached_builtins_declsZgenerate_lambda_definitionsgenerate_variable_definitionsr>   Zgenerate_function_definitionsmark_posgenerate_typeobj_definitionsgenerate_method_tabler`   generate_import_starr
   r   stripgenerate_module_state_startgenerate_module_state_definesgenerate_module_state_cleargenerate_module_state_traversegenerate_module_init_funcgenerate_module_cleanup_funcembedgenerate_main_methodgenerate_filename_table!generate_declarations_for_moduleswriterM   Zfinalize_main_c_codegenerate_module_state_endr   r   r   Zc_file_generatedZ	gdb_debug_serialize_lineno_map_generate_annotations)rV   r3   r4   rr   modulesr   
rootwriterr   r   r   codemodule_is_mainZutilcoder   r#   r#   r$   ro     s    







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||
| jdd}|sq||	krtjj| rytj| W n< tk
r~ } zdd l}|j|jkrn W Y d d }~X nX |j|||d qW d S )Nr   )coverage_xmlT)Z
source_posinclude) r/   r   Zannotate_coverage_xmlry   r!   existsZxml.etree.cElementTreeetreeZcElementTreeImportErrorxml.etree.ElementTreeElementTreeparsegetrootitertailZsave_annotationZmain_source_filer   r(   rP   contextZsearch_include_directoriesabspathdirnamejoin
startswithrH   makedirsOSErrorerrnoEEXIST)rV   r   rr   r4   Zcoverage_xml_filenameETr   elZsearch_include_file
target_dirZincluded_fileZtarget_fileZtarget_file_dirZsource_fileer	  r#   r#   r$   r   /  s@    

z ModuleNode._generate_annotationsc       
      C   s   |j j}|jj }tt}x@t|D ]4\}\}}|dkr$|jd k	r$|||f j|d  q$W |j	d xNt
|j D ]>\\}}}	|jd k	st|jddjtt|	|jt|d qtW |jd |j  d S )Nr   r   ZLineNumberMappingZ
LineNumber )	c_linenosZsrc_path
src_lineno)r  Zgdb_debug_outputwriterbufferZ
allmarkersr   list	enumeratefilenamerB   startrb   rd   rF   	add_entryr  mapstrr   	serialize)
rV   r3   ZccodewritertbmarkersdZc_linenoZsrc_descr  r  r#   r#   r$   r   X  s     


z ModuleNode._serialize_lineno_mapc             C   s<   ||kr8d||< x|j D ]}| j||| qW |j| d S )Nr   )cimported_modulesrm   rB   )rV   r3   module_listZmodules_seenimported_moduler#   r#   r$   rm   m  s
    z"ModuleNode.find_referenced_modulesc       	         s   t txX|D ]P}| }|jj}x:|r\|}| j| j|}|d krRP |jj}q$W qW t g  fdd xt|D ]} |  qW j  S )Nc                sH   | krd S j |  x"| j D ]} |  q&W j|  d S )N)addrS   rB   )uv)dfsgetkeyrr   seen
subclasses	type_dictr#   r$   r$    s    
z1ModuleNode.sort_types_by_inheritance.<locals>.dfs)	r   r  rS   	base_typerB   getsetreversedreverse)	rV   r(  Z
type_orderr%  keyZ	new_entrybaseZbase_keyZ
base_entryr#   )r$  r%  rr   r&  r'  r(  r$   sort_types_by_inheritancet  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$   r2    s    z8ModuleNode.sort_type_hierarchy.<locals>.vtabstruct_cnamec             S   s   | j S )N)objstruct_cname)r3  r#   r#   r$   r4    s    z7ModuleNode.sort_type_hierarchy.<locals>.objstruct_cname)rQ   usedin_cincluderS   r2  r
   r1  rE   r(   rF   r  rB   r   ru   is_extension_typer4  r0  )rV   r  r3   Z	vtab_dictZvtab_dict_orderZvtabslot_dictZvtabslot_dict_orderrv   rY   rS   r.  r1  Zall_defined_herer2  	vtab_listr4  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 )Nr4  )operator
attrgetterrQ   rS   rF   rB   r0  )rV   r3   Zkey_funcZ
entry_dictZentry_orderrY   r.  r#   r#   r$   rn     s    


zModuleNode.sort_cdef_classesc                s   x|D ]}| j |j| qW t| t }x|D ]}||k}	g }
xR|jD ]H}|jjr||jr||j|kr|j|j |
j| qH|	s|j	rH|
j| qHW  fdd|
D }
| j
|
| q0W 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#   )r   t)vtabslot_entriesr#   r$   r     s    z8ModuleNode.generate_type_definitions.<locals>.<listcomp>)!generate_objstruct_predeclarationrS   r+  r   	is_ctupler5  ri   r!  rB   ru   r   generate_objstruct_definitiongenerate_typeobj_predeclarationgenerate_exttype_vtable_struct$generate_exttype_vtabptr_declaration*generate_exttype_final_methods_declaration)rV   r3   r   r8  r9  r   rY   Zctuple_namesrv   
definitionr   r#   )r>  r$   generate_type_definitions  s0    





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 }x^|D ]V}||k}	|j d |j d|jj   | j|||	| | j|||	 | j|||	 qW d S )Nr   r<   z/*--- Type declarations ---*/zcpython.arrayc             S   s   g | ]
}|j qS r#   )r   )r   mr#   r#   r$   r     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 */)r   r:  rG  r   r   generate_c_class_declarationsgenerate_cvariable_declarationsgenerate_cfunction_declarations)
rV   r3   r   r   typecoder8  r9  Z
modulecoderv   Zdefined_herer#   r#   r$   r     s&    







z,ModuleNode.generate_declarations_for_modulesc             C   s   | j tj|dd  d S )NzModuleSetupCode.cr   )r   r
   r   )r   ri   r#   r#   r$   _put_setup_code  s    zModuleNode._put_setup_codec          	   C   s  |j   |r@|jd |jtj|ddd |jd |jd |jd |jd |jd	 | j|d
 x2t|jj tj	dD ]}|j
|jkr|j| qW |jd |jd |jd |jd |jd |jd jd ddlm} |jd |jd |jd |jd |jd |jd|jdd  |jd |jd |jdt|  |jdtj|jjk  | j|d  |jjjr| j|d! n| j|d" | j|d# | j|d$ |jrd%tjtjf }nd}|jd& |jd'tjtjtjtjtj|tjf  |jd( |jd) |jd | j||j   |jd |jd*| j!tj"|  |jd*| j!tj#|  |jd+ | j$|||d,d- |jd |jd. |jd/ |jd |jd |j%d0 r |jd |jd1 |jd2 |jd |jd |j&t'j(d3d4d5  |j%d6 }	|j%d7 }
|	dVkrH|
 rHt)| j*d: |jd;t+|
d<k  |jd=t+|
jd>dj, d?k  |
d@kr|jdA n|jdB |jdC|
  |	d9krdD}n|	j- }|jdE|  |jdF|  |j&t'j(dGdHd5  |j.t'j/dIdJ t0j1j2| t0j1j3| t0j4j3| |j&t5j6 |jdK |jd |jdL |jdM|j7  t8j9d k	r|jdNtj:  |jd |jdOtj  |jdPtj  |jdQtj;tj<f  |jdRtj  |j.t'j/dSd4 t=|r|j.t'j/dTdU d S )WNz/* BEGIN: Cython Metadata   T)r   	sort_keyszEND: Cython Metadata */r<   z#ifndef PY_SSIZE_T_CLEANz#define PY_SSIZE_T_CLEANz#endif /* PY_SSIZE_T_CLEAN */ZInitLimitedAPI)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 < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000)z6    #error Cython requires Python 2.7+ or Python 3.3+.z#elser   z#endif /* Py_PYTHON_H */r   )__version__z5#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_APIz-#define __PYX_EXTRA_ABI_MODULE_NAME "limited"z&#define __PYX_EXTRA_ABI_MODULE_NAME ""z#endifz3#define CYTHON_ABI "%s" __PYX_EXTRA_ABI_MODULE_NAMEr   _z3#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABIz:#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "."z#define CYTHON_HEX_VERSION %sz!#define CYTHON_FUTURE_DIVISION %dZCModulePreambleZCppInitCodeZ	CInitCodeZPythonCompatibilityZMathInitCodez	%s = %s; z-#define __PYX_MARK_ERR_POS(f_index, lineno) \zG    { %s = %s[f_index]; (void)%s; %s = lineno; (void)%s; %s (void)%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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 %sr   z0#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"Z	ByteArrayz7#define __Pyx_PyObject_FromString __Pyx_Py%s_FromStringzE#define __Pyx_PyObject_FromStringAndSize __Pyx_Py%s_FromStringAndSizeZTypeConversionszTypeConversion.cZFormatTypeNamezObjectHandling.czOstatic CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; }z#if !CYTHON_USE_MODULE_STATEz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)rU  rV  )>r   r   jsondumpsrM  rb   rN   rO   r   sortkeylocationZINITIALr   r   r<   rP  r   r   r   divisionr  Zfuture_directivesr4   Zcplusr.   r   Zclineno_cnameZline_c_macroZfilename_cnamefiletable_cnameZlineno_cnamer   r   r   r   r   r   r2   r   r
   r   r   rH   intlowertitler   load_cachedr   Zc_long_typecreate_to_py_utility_codecreate_from_py_utility_codeZ
c_int_typer   Zbranch_prediction_macrosmodule_cnamer   
pre_importpreimport_cnameZcfilenm_cnameZfile_c_macror   )rV   r3   r4   r  metadatar   rX   rP  ZcinforS  rT  Zc_string_func_namer#   r#   r$   r     s    











































z#ModuleNode.generate_module_preamblec             C   s   t j}|jd |jd|  |jd|  |jd|  |jd |jd|  |jd |jd|  |jd	 |jd
 |r|jd|  n:|jd |jd|  |jd |jd|  |jd |jd d S )Nz#ifdef CYTHON_EXTERN_Cz    #undef %sz    #define %s CYTHON_EXTERN_Cz#elif defined(%s)z    #ifdef _MSC_VERzf    #pragma message ("Please do not define the '%s' macro externally. Use 'CYTHON_EXTERN_C' instead.")z	    #elsez[    #warning Please do not define the '%s' macro externally. Use 'CYTHON_EXTERN_C' instead.z
    #endifz#elsez    #define %s extern "C++"z  #ifdef __cplusplusz    #define %s extern "C"z  #elsez    #define %s externz  #endifz#endif)r   r   r   )rV   r   r   ri   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   )rV   r   r#   r#   r$   r     s    

z#ModuleNode.generate_dl_import_macroTc             C   sf   xRt |jj tjdD ]:}|j|jkr6|rP|j| q|j|jkr|r|j| qW |rb|j	d d S )N)r.  z#include <omp.h>)
rb   rN   rO   r   r\  r]  ZEARLYr   ZLATEZputln_openmp)rV   r3   r  r   r   rR  rX   r#   r#   r$   r     s    zModuleNode.generate_includesc             C   s   ddl m}m} |jd |jdtj  |jjrxb|jjD ]J}|j }||rX||}|j	ddj	dd}t
|}|jd	|j   q<W n
|jd
 |jd d S )Nr   )isabsrz   r<   zstatic const char *%s[] = {\z\\"z\"z%s,0z};)os.pathrj  rz   r   r   r_  r   Zfilename_listZget_filenametable_entryr   r    r   )rV   r   rj  rz   r   	file_pathZescaped_filenamer#   r#   r$   r     s    

z"ModuleNode.generate_filename_tablec             C   s   d S )Nr#   )rV   r3   r   r#   r#   r$   generate_type_predeclarations  s    z(ModuleNode.generate_type_predeclarationsc             C   s"  xr|D ]j}|j s|j}|jrq|js*|jr8| j|| q|jr^|j r^|jr^| j|jj	| q|j
r| j|| qW x|D ]}|j sz|j}|jr| j|| qz|js|jr| j|| qz|jr| j|| qz|jr|j r|jr| j|jj	| qz|jr| j|| qz|j
rz| j|| qzW d S )N)r6  rS   Z
is_typedefZis_struct_or_unionis_cpp_class$generate_struct_union_predeclarationr@  is_fusedr5  Zstruct_entryr7  r?  generate_typedefrg   rh   generate_enum_definition generate_struct_union_definitiongenerate_cpp_class_definitionrA  )rV   r   r   rY   rS   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 )Nr<   Z__pyx_   z!typedef struct %s __pyx_gcc33_%s;)r   rQ   rS   typedef_flagr4  r  )rV   r3   r   rY   rS   ri   r  r#   r#   r$   generate_gcc33_hack  s    

zModuleNode.generate_gcc33_hackc             C   sp   |j j}|j}|jrF|j rFy|jd }W qJ tk
rB   |}Y qJX n|}|j|j |j	d|j
|j  d S )NZnumeric_typedefsztypedef %s;)rS   Ztypedef_base_typer(   Z
is_numericZis_cpp_class_scoper   KeyErrorr   rH   r   r   r   )rV   rY   r   r)  Zenclosing_scopewriterr#   r#   r$   rt    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;)ry  )rV   rS   kindri   r#   r#   r$   sue_predeclaration  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   )r   Tr#   r#   r$   r     s    zCModuleNode.generate_struct_union_predeclaration.<locals>.<listcomp>)rS   rq  	templatesr   r  r~  r}  r   )rV   rY   r   rS   r#   r#   r$   rr    s
    
z/ModuleNode.generate_struct_union_predeclarationc             C   s   d||f }d}||fS )Nz%s %s {z};r#   )rV   rS   r}  ri   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}	x$|	D ]}
|jd|
jj|
j  qW |j| |r|jd |jd	 |jd |jd
 |j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#endifz%s;z  #pragma pack()z  #pragma pack(pop))r   rH   rS   r(   r}  Z	is_structpackedr   r   packed_struct_utility_coder  r   r   r   r   )rV   rY   r   rS   r(   r}  r  r  r  r   attrr#   r#   r$   rv    s8    











z+ModuleNode.generate_struct_union_definitionc             C   sz  |j |j |j}|j}|rv|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	 | j
|j| 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}|sJ|r|rg }g }xD|jjd t|jj|jj  D ] }|j|j  |j|j qzW |jjr|j|jjjtj |jtj |sdg}n
dg}g }|rh|jd|jdj|f  |r.|j  x|D ]}
|j|
dd qW |rN|jd|jdj|f  |r\|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  |r
x|D ]}
|j |
dd qW |j  |jd n|jd|j  |rl|r@|jd|j|jf  |j  x>|jD ]4}
|
jjsX|jd|
j|
jf  |j!|
dd qXW |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   )r   r  r#   r#   r$   r   6  s    z<ModuleNode.generate_cpp_class_definition.<locals>.<listcomp>z	struct %sz	, public c             S   s   g | ]}|j  qS r#   )r   )r   Z
base_classr#   r#   r$   r   ;  s    z : public %sz {c             S   s    g | ]}|j jr|j r|qS r#   )rS   is_pyobjectis_inherited)r   r  r#   r#   r$   r   ?  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   rH   rS   r(   r  r   r  r   r   Zbase_classesr   r   rc   rO   r   Zis_cfunctionZis_static_methodri   r   r   r   Zoriginal_argslenargsZoptional_arg_countrB   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)rV   rY   r   rS   r(   Zbase_class_declpy_attrsZhas_virtual_methodsconstructorZ
destructorr  Zis_implementingZ	arg_decls	arg_namesargr#   r#   r$   rw  /  s    
















z(ModuleNode.generate_cpp_class_definitionc             C   s(  |j |j |j}|jp |jp d}|jjr.dnd}| j|||\}}|j| |j}|sft	|jd n|d
 }	x"|D ]}
|
j
d k	rt|
j
j| qtW x`|D ]X}
|
j
d kr|
jjdd }nd|
jjdd |
j
j f }|
|	k	r|d7 }|j| qW |j| |jjr$|jjr$|jd	||f  d S )Nr<   z
enum classenumzDEmpty enum definition not allowed outside a 'cdef extern from' blockr   z::z%s = %s,ztypedef enum %s %s;r   r   r   )r   rH   rS   r   ri   rh   r  r   enum_valuesr   Z
value_nodeZgenerate_evaluation_codesplitrr   rg   ry  )rV   rY   r   rS   ri   r}  r  r  r  Z
last_entryZvalue_entryZ
value_coder#   r#   r$   ru    s4    







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 )Nr<   externz	%s %s %s;r   r   r|   	DL_EXPORT)	r   rS   r   r}   r6  r   r   r   r   )rV   rY   r   ri   r#   r#   r$   rB    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 )Nr<   zstruct %s {zstruct %s %s;z%s;z(*%s)z};)r5  r   rH   rS   r(   specialize_fused_typesr2  r   r)  r   obj_base_cnamert   r  r   r   )rV   rY   r   rS   r(   method_entryr#   r#   r$   rC    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;)r5  r   rH   rS   vtabptr_cnamer   r2  )rV   rY   r   rS   r#   r#   r$   rD    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;)r5  r   rH   rS   r(   rt   r  Zfinal_func_cnamer   build_function_modifiersfunc_modifiersr   )rV   rY   r   rS   r  Zdeclaration	modifiersr#   r#   r$   rE    s    z5ModuleNode.generate_exttype_final_methods_declarationc             C   s$   |j s
d S |j| j|d|j d S )Nstruct)r(   r   r~  r4  )rV   rS   r   r#   r#   r$   r?    s    z,ModuleNode.generate_objstruct_predeclarationc       
      C   s2  |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  x\|jjD ]P}|jrt}n|j}|jr|j|j}	n|j|j}	|jj| |jd	|	  qW |j| |jd k	r.|jd
|j|jf  d S )Nr  r   ZPyHeapTypeObjectz%s%s %s;struct r<   ZPyObject_HEADzstruct %s *%s;z%s;ztypedef struct %s %s;)r  r<   )r   rH   r(   r  r4  r   r)  ry  r   r  vtabslot_cnamer2  r   is_declared_genericr	   rS   is_cpp_optionalcpp_optional_declaration_coder   r   use_entry_utility_codeZobjtypedef_cname)
rV   rS   r   r  r  r)  Zbasestruct_cnamer  Z	attr_typedeclr#   r#   r$   rA    sD    

z(ModuleNode.generate_objstruct_definitionc             C   s<  |d }|d }|d }|d }|j  }	|j  }
x|	|
gD ]}|jd q:W x|jD ]}|sb|jrT|jd|jj  |jd|jjtj|jjf  |jd|jj  |jd	|jj  |jjd k	rT|	jd
|jj  |
jd|jjtj|jjf  |jd|jj  |jd	|jj  qTW x|	|
gD ]}|jd q$W d S )Nr   r   r   r   z#if CYTHON_USE_MODULE_STATEzPyTypeObject *%s;z#define %s %s->%sz!Py_CLEAR(clear_module_state->%s);z$Py_VISIT(traverse_module_state->%s);zPyObject *%s;z#endif)	insertion_pointr   rQ   ru   rS   r   r   modulestateglobal_cnamer   )rV   r3   r   rF  r   r   r   r   r   Zmodule_state_typeobjZmodule_state_defines_typeobjr|  rY   r#   r#   r$   rI  0  sF    
z(ModuleNode.generate_c_class_declarationsc       
      C   s  |j r
d S xn|jD ]b}|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r|j|j|	|d	 n|j|j|	|d	 |d k	rD|jd
|  |jd |j|	krn|jd|j|	f  |j| qW d S )Nprivater  r   r|   r  staticr   z%s )dll_linkagez = %s;z#define %s (*%s))Zis_cython_builtinr   r6  Z
in_closurer}   ru   r5  r   r   initrS   literal_coder   r   r   varptr_prefixri   r   r  r  r   put_safer   r  )
rV   r3   r   rF  rY   storage_classr  r  rS   r   r#   r#   r$   rJ  U  sV    





z*ModuleNode.generate_cvariable_declarationsc             C   sN   xH|j D ]>}tjo|jdk }|js8|jdks8|js8|rt|||| qW d S )Nr  r|   )rt   r   cimport_from_pyxr}   r5  r~   generate_cfunction_declaration)rV   r3   r   rF  rY   Zfrom_pyxr#   r#   r$   rK    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 )Nr|   z = %sr  )r   r6  r}   r   rS   r   r   r  r  r  r   )rV   r3   r   rY   r  r#   r#   r$   r     s    
z(ModuleNode.generate_variable_definitionsc             C   s  |j }x||jD ]p}|jdkr|j}|j}|r| j|| | 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r6| j|| |jddgrR| j|| |jdgrl| j|| |jddgr| j|| |j r|jdgr| j|| |jtjr| j|| nd|jkrt|jjd xBtj |j!jj"D ].}|j#r|j|j$r| j%||||j qW | j&|| | j'|| | j(|| |jd | j)|| |jd | j*||| |jd qW d S )Nr  __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__total_orderingzMtotal_ordering directive used, but no comparison and equality methods definedz#if CYTHON_USE_TYPE_SPECSz#else)+r   rQ   r}   rS   r(   generate_exttype_vtablegenerate_new_functiongenerate_del_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   rH   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_functionr2   parent_typeget_slot_tabler   ZPyNumberMethodsZis_binopZuser_methodsgenerate_binop_functiongenerate_property_accessorsr   generate_getset_tablegenerate_typeobj_specgenerate_typeobj_definition)rV   r3   r   rR   rY   rS   r(   slotr#   r#   r$   r     sj    





z'ModuleNode.generate_typeobj_definitionsc             C   s&   |j }|jr"|jd|j|jf  d S )Nzstatic struct %s %s;)r  vtable_cnamer   r2  )rV   r(   r   rS   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   )rV   r(   r   rS   r#   r#   r$   generate_self_cast  s
    zModuleNode.generate_self_castc             C   s   t jdd}|jd}|j||kr(d S |j}|j}|j \}\}	}
}|jj}|jrXg }	dd |j	D }|j
d}|r|j rd }|s|r|j rd}nd}|rd}n|jjdd}|jtj}|jtj}|jd	 }|jd
|  |jd |r:|jd |jd|jj||f  |jd|  |jd |jd |jd|||f  |jpj|
pj|pj|	pj|}|r|jd|jjd  |rt j||}|d krd|j }|jd|  n(|jd |jd |jd |jd |jd |r|jjtjdd |rd}nd}|jddd}|jd |jd|||f  |jd||f  |jd |  |jd! |j r|jd" |jd# |jd |jd$ |s|jd% |jd& |s|jd' |jd(tj  |jd) |jd* |r
| r
|jd) |s|jd |r4|jd+|jd,  d-}|jr|}x|jrb|jjrb|j}qFW ||k	rzd.|j }nd}|jd/|j||jf  xB|D ]:}|j r|j!j"d}n
|j!j# }|jd0|j$|f  qW xF|	D ]>}|j%d1krd}|j&d2|j$|j$f  n|j'|d3d-d4 qW x.|D ]&}|jd5|j$  |jd6|j$  q(W x|
D ]}|jd7|j$  qXW |j$d8kr|jd9 |r|jrd:tj }nd;}d}|jd<|j(|f  |jd= |r|jd> |j)d,t*d-d4 |jd? |jd) d S )@Ntp_newZ	__cinit__c             S   s   g | ]}|j jr|qS r#   )rS   needs_cpp_construction)r   rY   r#   r#   r$   r     s    z4ModuleNode.generate_new_function.<locals>.<listcomp>r<   zCYTHON_UNUSED r   freelistdeclszIstatic PyObject *%s(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/z#if CYTHON_USE_FREELISTSzstatic %s[%d];zstatic int %s = 0;z#endifzDstatic PyObject *%s(PyTypeObject *t, %sPyObject *a, %sPyObject *k) {z%s;r  z)__Pyx_PyType_GetSlot(%s, tp_new, newfunc)zPyObject *o = %s(t, a, k);zPyObject *o;z##if CYTHON_COMPILING_IN_LIMITED_APIzAallocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc);zo = alloc_func(t, 0);z#elseZIncludeStringHzStringTools.czU & (int)(!__Pyx_PyType_HasFeature(t, (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))T)derefzEif (likely((int)(%s > 0) & (int)(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{zBif (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {zo = (*t->tp_alloc)(t, 0);z} else {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_internal	slot_coder  r)  get_refcounted_entriesis_final_typeZis_internalr   lookup_here
is_specialZtrivial_signaturer2   r*  r   freelist_namefreecount_namer   r   r   r  get_base_slot_functionr   r   r
   rc  r  empty_tuple	cast_coder2  r  r  rS   r  r   r   ri   r   r  
func_cnameput_decref_clearr	   )rV   r(   r   cclass_entrytp_slot	slot_funcrS   r)  have_entriesr  
py_buffersmemoryview_slicesr  Zcpp_constructable_attrsZcinit_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_castrY   Z	decl_codeZ
cinit_argsr#   r#   r$   r    s   






































z ModuleNode.generate_new_functionc             C   s   t jd|j}|jd}|j||kr*d S |jd}|d ksD|j rHd S |jd |jrh|jd|j  |jd|  |jd |jd |jd|j	  |jd	 |jd
 |jr|jd d S )NZtp_finalize__del__r<   z#if %szstatic void %s(PyObject *o) {zPyObject *etype, *eval, *etb;z!PyErr_Fetch(&etype, &eval, &etb);z%s(o);z PyErr_Restore(etype, eval, etb);r   z#endif)
r   get_slot_by_namer2   r  r  r  r  r   Z
used_ifdefr  )rV   r(   r   r  slot_func_cnamerY   r#   r#   r$   r    s$    






z ModuleNode.generate_del_functionc             C   s8  t jdd}|jd}|jj}|j||kr0d S |jd}|jd |jd|  |jj}|j }|j	 }	|j
sz|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|| | s|j r`|jd	 |rd
}nd}|jd|  |jd|  |jd |jd |jd |jd |rp|jd |	r|jjtjdd |jd|  |
r|jd | j|| |r|jd x|D ]}|jd|j  qW x.|| D ]"}|jd|j |jdddd qW |r|j}t j||}|d k	rj|rZ|jrZ|jj rZ|jd |jd|  n|jr|r|jr|jj r|jd |jd|  nl|r|jd |jd ||f  |jd! |jd"|  |jd |jd#|||f  |jjtjd$d n|jjd%d&}|r|jtj}|jtj }|rNd}nd'}|j}|jd( |jd)|||j!ddd*|f  |jd+|||j"d,f  |jd- |jd |jd. |jd/ |jd0 |jd! |jd. |jd1 |jd2 |jd |jd |r|jd |	r*|jd3 |jd d S )4N
tp_dealloc__dealloc__r<   zstatic void %s(PyObject *o) {__weakref__r  c             S   s   g | ]}|j jr|qS r#   )rS   r  )r   rY   r#   r#   r$   r     s    z8ModuleNode.generate_dealloc_function.<locals>.<listcomp>z#if CYTHON_USE_TP_FINALIZEz!!__Pyx_PyObject_GC_IsFinalized(o)z@(!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))zif (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && %s) {z>if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == %s) {z1if (PyObject_CallFinalizerFromDealloc(o)) return;r   z#endifzPyObject_GC_UnTrack(o);Z
PyTrashcanzExtensionTypes.cz__Pyx_TRASHCAN_BEGIN(o, %s)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_decrefZhave_gilzPyObject_GC_Track(o);z%s(o);z4__Pyx_PyType_GetSlot(%s, tp_dealloc, destructor)(o);z#if PY_MAJOR_VERSION < 3z4if (!(%s) || PyType_IS_GC(%s)) PyObject_GC_Track(o);z#elsez+if (PyType_IS_GC(%s)) PyObject_GC_Track(o);zlif (likely(%s)) __Pyx_PyType_GetSlot(%s, tp_dealloc, destructor)(o); else __Pyx_call_next_tp_dealloc(o, %s);ZCallNextTpDeallocr  r   z^ & (int)(!__Pyx_PyType_HasFeature(Py_TYPE(o), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))z#if CYTHON_USE_FREELISTSzIif (((int)(%s < %d) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(%s))%s)) {)r  z%s[%s++] = %s;r  z} elser  z5#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPYz(*Py_TYPE(o)->tp_free)(o);zDfreefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);zif (tp_free) tp_free(o);Z__Pyx_TRASHCAN_END)#r   r  r  r  r)  r  r   r  r  needs_trashcanr  r  r   r  r  Zmay_have_finalizer   r   r
   rc  generate_usr_dealloc_callr   put_xdecref_clearrS   r   r  r(   is_builtin_typer2   r*  r   r  r  r   r  )rV   r(   r   r  r  r)  r   r  r  r  Zweakref_slotZ	dict_slotrQ  r  r  Zcpp_destructable_attrsZfinalised_checkrY   
base_cnamer  r  r  r  r  rS   r#   r#   r$   r    s    



































z$ModuleNode.generate_dealloc_functionc             C   sv   |j d}| s|j rd S |jd |jd |jd |jd |jd|j  |jd |jd |jd	 d S )
Nr  r  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  r  r   r  )rV   r(   r   rY   r#   r#   r$   r  ?  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 )NZtp_traverser<   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;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  r   r  r  r  r  r   r   r   r
   rc  r   r   typecastr	   rS   )rV   r(   r   r  r  r  r)  r  r  r  r  static_callr	  rY   Zvar_codeZvar_as_pyobjectr   r#   r#   r$   r  O  sP    









z%ModuleNode.generate_traverse_functionc             C   s  t jd|j}|jd}|jj}|j||kr2d S |jdd\}\}}	}
|sT|	sT|rZd}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
rx~|D ]T}d|j }|jd|  |jr\|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 )NZtp_clearF)r
  r<   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);)r  zPy_XDECREF(tmp);zPy_CLEAR(p->%s);zPy_CLEAR(p->%s.obj);r  z(__PYX_XCLEAR_MEMVIEW(&p->from_slice, 1);z	return 0;r   )r   r  r2   r  r  r)  r  r  r   r   Zclear_to_noner  r  r  r   r   r   r
   rc  r   r  Zput_init_to_py_noner	   rS   )rV   r(   r   r  r  r  r)  r  r  r  r  Zunusedr  r	  rY   ri   r#   r#   r$   r    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) {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   )r   r  )rV   r(   r   r#   r#   r$   r    s    z(ModuleNode.generate_getitem_int_functionc             C   s8  |j j}|jd}|jd}|jd |jd|jd  |jd |rZ|jd|j  nN|jd | j|d	dd
| |jd |jd |jd |jd |jd |jd |jd |r|jd|j  nN|jd | j|d	dd
| |jd |jd |jd |jd |jd |jd |jd d S )Nr  r  r<   z6static int %s(PyObject *o, PyObject *i, PyObject *v) {Zmp_ass_subscriptzif (v) {zreturn %s(o, i, v);z__Pyx_TypeName o_type_name;Ztp_as_mappingzo, i, vz/o_type_name = __Pyx_PyType_GetName(Py_TYPE(o));z'PyErr_Format(PyExc_NotImplementedError,zL  "Subscript assignment not supported by " __Pyx_FMT_TYPENAME, o_type_name);z#__Pyx_DECREF_TypeName(o_type_name);z
return -1;r   zelse {zreturn %s(o, i);zJ  "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name);)r  r)  r  r   r  r  generate_guarded_basetype_call)rV   r(   r   r)  	set_entry	del_entryr#   r#   r$   r    sf    


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   )rV   r)  Zsubstructurer  r  r   Zbase_tpnamer#   r#   r$   r    s    z)ModuleNode.generate_guarded_basetype_callc             C   s8  |j j}|jd}|jd}|jd |jd|jd  |jd |rZ|jd|j  nN|jd | j|d	dd
| |jd |jd |jd |jd |jd |jd |jd |r|jd|j  nN|jd | j|d	dd
| |jd |jd |jd |jd |jd |jd |jd d S )Nr  r  r<   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__Pyx_TypeName o_type_name;Ztp_as_sequencez
o, i, j, vz/o_type_name = __Pyx_PyType_GetName(Py_TYPE(o));z'PyErr_Format(PyExc_NotImplementedError,zR  "2-element slice assignment not supported by " __Pyx_FMT_TYPENAME, o_type_name);z#__Pyx_DECREF_TypeName(o_type_name);z
return -1;r   zelse {zreturn %s(o, i, j);zP  "2-element slice deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name);)r  r)  r  r   r  r  r  )rV   r(   r   r)  r  r  r#   r#   r$   r  1  sj    


z&ModuleNode.generate_ass_slice_functionc                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|jk}i  x8tjD ].}x(|D ] }	|	j |}
|
d k	r|
 |< P qW qW |rt fdd	tD }|sFd
 kr2d kr2t|jjd nt|jjd d}n.d
 krld krlt|jjd d}t|}x4tjD ](}|jdj } j|}
|
d kr| s~|d4krq~|jd|  |
d kr|st	t||f \}}}|jd |jd | j  |jd |jd |jd |jd |d k	rP|dkrx|jd|rZdnd  |jd |jd nF|d kr|jd|rdnd  |jd! |jd nt	d"|f d
 krd
}n
d}| }|jd | j  |jd |jd# |jd |jd$ |r&|jd% n
|jd& |jd' |jd( |jd( n&|rb|jd) n
|jd* |jd' |jd( |jd+ n|jd,|
j  |jd( q~W d
 krJd krJ| rJ|jd- |jd |jd d
 j  |jd |jd. |jd |jd/ |jd0 |jd' |jd( |jd+ |jd( |jd1 |rx|j
rx|jd2|j
|j
f  |jd3 |jd( |jd( |jd( d S )5NZ__richcmp__Ztp_richcomparer<   z9static PyObject *%s(PyObject *o1, PyObject *o2, int op) {zswitch (op) {r  r  c                s   g | ]\}}| kr|qS r#   r#   )r   	from_nameZto_name)
comp_entryr#   r$   r     s    z8ModuleNode.generate_richcmp_function.<locals>.<listcomp>__eq____ne__zMtotal_ordering directive used, but no comparison and equality methods definedz@total_ordering directive used, but no comparison methods definedFz=total_ordering directive used, but no equality method definedrQ  NEEQzcase Py_%s: {zPyObject *ret;zret = %s(o1, o2);z.if (likely(ret && ret != Py_NotImplemented)) {z+int order_res = __Pyx_PyObject_IsTrue(ret);zPy_DECREF(ret);z)if (unlikely(order_res < 0)) return NULL;z&&zif (%s order_res) {z!!!zret = __Pyx_NewRef(Py_False);z} else {z||zret = __Pyx_NewRef(Py_True);zUnknown op %sz(int eq_res = __Pyx_PyObject_IsTrue(ret);z&if (unlikely(eq_res < 0)) return NULL;z"ret = eq_res ? Py_False : Py_True;z"ret = eq_res ? Py_True : Py_False;zPy_INCREF(ret);r   z%ret = order_res ? Py_False : Py_True;z%ret = order_res ? Py_True : Py_False;zreturn ret;zreturn %s(o1, o2);zcase Py_NE: {z#int b = __Pyx_PyObject_IsTrue(ret);z!if (unlikely(b < 0)) return NULL;zret = (b) ? Py_False : Py_True;z
default: {zFif (likely(%s->tp_richcompare)) return %s->tp_richcompare(o1, o2, op);z'return __Pyx_NewRef(Py_NotImplemented);)r  r  )r  r  r   r  rY   r}   rB   r(   r)  rF   r   r2   r   r  TOTAL_ORDERINGr   rH   maxr   upperr*  r  )rV   r(   r   Zrichcmp_cfuncZclass_scopesclsZextern_parentr  Z
cmp_methodZclass_scoperY   Z
comp_namesZordering_sourceZcmp_typeZinvert_compZcomp_opZinvert_equalsZeq_funcr#   )r  r$   r  m  s    














































z$ModuleNode.generate_richcmp_functionc                s  j |jjd r4|jd|jjf  d S |j  |j }|rR|j| |jjtj	tj
fkrtd}d  }n4|jjtjtjfkrd}d d}nt|d|  d S fd	d
 fdd}|jjr|jj rt|d|jj|jjf  tt|jj}	tt|jj}
|jtjdd|j|	|
||jjdd||jjddjj| |d
dd  |r|jd d S )NZc_api_binop_methodsz#define %s %s
binaryfuncr<   Zternaryfuncz, extra_argz, PyObject* extra_argz"Unexpected type slot signature: %sc                s    j | }|r|jr|jS d S )N)lookupr  r  )method_namerY   )r(   r#   r$   get_slot_method_cname	  s    
zAModuleNode.generate_binop_function.<locals>.get_slot_method_cnamec                s8   | }|r"d||rdnd f S dj j f S d S )Nz%s(%s%s)zright, leftzleft, rightzT%s_maybe_call_slot(__Pyx_PyType_GetSlot(%s, tp_base, PyTypeObject*), left, right %s))r  r   )r  r-  r  )	extra_arg	func_namer  r(   r#   r$   call_slot_method	  s    
z<ModuleNode.generate_binop_function.<locals>.call_slot_methodzExtension type implements %s() but not %s(). The behaviour has changed from previous Cython versions to match Python semantics. You can implement both special methods in a backwards compatible way.Z	BinopSlotzExtensionTypes.cF)r-  T)
r   	slot_nameoverloads_leftoverloads_rightZ	call_leftZ
call_right
type_cname	slot_typer  extra_arg_decl)r  r   z#endif)r  r"  r2   r   Z	left_slotr  Zpreprocessor_guard_code	signaturer   r  ZibinaryfuncZpowternaryfuncZipowternaryfuncr   r  Z
right_slotr   r`  boolr   r   r  r   )rV   r(   r  r   rH   Zpreprocessor_guardr&  r'  r!  r#  r$  r#   )r  r   r  r(   r$   r    sR    



z"ModuleNode.generate_binop_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(   r  is_externalr)  )ntpextern_returnr)lookup_here_or_baser(   r#   r$   r/  H	  s    
zBModuleNode.generate_getattro_function.<locals>.lookup_here_or_baser  r  )r-  r  r  r<   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)	r   r  r  r  r  r   r   r
   rc  )rV   r(   r   Zhas_instance_dictZgetattr_entryZgetattribute_entryZgeneric_getattr_cfuncr#   )r/  r(   r$   r  A	  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  r<   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  r   r  r  r  )rV   r(   r   r)  r  r  r#   r#   r$   r  }	  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  r<   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  r   r  r  )rV   r(   r   Zuser_get_entryr#   r#   r$   r  	  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  r<   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  r   r  r  r  )rV   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}|jdgr*| j|| |jddgr| j|| qW d S )Nr  r  r  )property_entriesr(   r  generate_property_get_functiongenerate_property_set_function)rV   Zcclass_scoper   rY   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  r<   z9static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {zreturn %s(o);r   )
r(   parent_scoper   r   Zprop_get_prefixri   getter_cnamer  r   r  )rV   property_entryr   r3  Z	get_entryr#   r#   r$   r1  	  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  r<   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(   r4  r   r   Zprop_set_prefixri   setter_cnamer  r   r  )rV   r6  r   r3  r  r  r#   r#   r$   r2  
  sF    



z)ModuleNode.generate_property_set_functionc       
      C   sL  |j }|j}tjd|jj}|j|| tjd|jj}|j|sb|jd |j	|| |jd |jd|j
  x"tj|jjD ]}|j|| qW |jd |jd |jr|j}n
d|j }|jj }	|jd	|j
  |jd
| j|	jddf  |jd|  |jd |jdtjd|jj|  |jd|j
  |jd d S )NZ
tp_membersZtp_as_bufferz$#if !CYTHON_COMPILING_IN_LIMITED_APIz#endifz!static PyType_Slot %s_slots[] = {z{0, 0},z};z	struct %szstatic PyType_Spec %s_spec = {z"%s.%s",rl  r<   zsizeof(%s),z0,z%s,Ztp_flagsz	%s_slots,)rS   r(   r   r  r   r2   Zgenerate_substructure_specZis_emptyr   generate_substructurer   r  Zgenerate_specry  r4  
class_namer   rR   r   r  )
rV   rY   r   ext_typer(   Zmembers_slotZbuffer_slotr  	objstruct	classnamer#   r#   r$   r  +
  s2    







z ModuleNode.generate_typeobj_specc             C   s   |j }|j}x$tj|jjjD ]}|j|| qW |jd |j	dkrLd}nd}|j||j
  |jd |jj }|jd| j|f  |jr|j}	n
d|j }	|jd|	  |jd	 x"tj|jjD ]}
|
j|| qW |jd
 d S )Nr<   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};)rS   r(   r   r  r   r2   Zsubstructuresr8  r   r}   r   r9  r   rR   ry  r4  generate)rV   modnamerY   r   rS   r(   Zsuiter  r<  r;  r  r#   r#   r$   r  K
  s6    





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bindingr<   zstatic PyMethodDef %s[] = {r  )wrapper_code_writerz{0, 0, 0, 0}z};)
Zis_c_class_scopeZpyfunc_entriesr2   r   r  method_table_cnameZfused_cfunctionZis_overridableZput_pymethoddefgetvalue)rV   r3   r   r?  r@  rY   r#   r#   r$   r   k
  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  Z__dict__getterr<   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   r   r  )rV   r(   r   	dict_attrr   Z	dict_namer#   r#   r$   r  
  s    



z(ModuleNode.generate_dict_getter_functionc             C   s   |j r|jd |jd|j  x`|j D ]V}|j}|rR|jrD|j }d|j  }nd}|jd|jj |jpld|j	ptd|f  q(W |jd |jd d S )Nr<   z"static struct PyGetSetDef %s[] = {zPyDoc_STR(%s)rm  z${(char *)%s, %s, %s, (char *)%s, 0},z{0, 0, 0, 0, 0}z};)
r0  r   Zgetset_table_cnamer]   Z
is_unicodeZas_utf8_stringr   ri   r5  r7  )rV   r3   r   rY   r]   Z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)rb   rc   rd   
is_cglobalr5  rS   r  re  )rV   r3   ri   rY   r#   r#   r$   ra   
  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!t"| j# ||_|jd! |jd" |jd |jd# |jtj$d$d%d  |j%  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",rm  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)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;r<   Z
ImportStarzImportExport.c)&r   r
   rc  r   enter_cfunc_scoper   Zimport_star_setrb   rc   rd   rf   Znew_error_labelrD  r5  rS   Zis_constr  r7  r  Ztype_test_code
error_gotorH   
put_decrefr   r   r  r	   re  Zfrom_py_call_coderf  
label_usederror_label	put_labelput_add_tracebackr   rR   r   exit_cfunc_scope)rV   r3   r   ri   rY   Zold_error_labelZ
msvc_countr#   r#   r$   r   
  sx    

























zModuleNode.generate_import_starc             C   s   |j d |j d|j  |j dtj  |j dtj  |j dtj  |j dtj  |j dtj  tj	d k	r|j dtj
  x8tjD ].\}}|j d|  |j d|  |j d qW d S )Nztypedef struct {zPyObject *%s;z	#ifdef %szPyTypeObject *%s;z#endif)r   module_dict_cnamer   builtins_cnamecython_runtime_cnamer  empty_bytesempty_unicoder   rg  rh  used_types_and_macros)rV   r3   r   r%  	used_namer#   r#   r$   r   
  s    

z&ModuleNode.generate_module_state_startc             C   s  |d }|d }|d }|d }|j dtj  |j d |j d |j d |j d	 |j d
tj  |j d |j d |j dtj  |j d |j d |j dtjtjf  |j d |j dtjtjtjf  |j d |j d|jtjf  |j d |j dtjtjf  |j d |j d |j d |j d |j d |j dtjtjtjf  |j d |j d |j d |j d |j d |j d |j d d S )Nr   r   r   r   z} %s;r<   z#if CYTHON_USE_MODULE_STATEz#ifdef __cplusplusznamespace {zextern struct PyModuleDef %s;z} /* anonymous namespace */z#elsezstatic struct PyModuleDef %s;z#endifz0#define %s(o) ((%s *)__Pyx_PyModule_GetState(o))z(#define %s (%s(PyState_FindModule(&%s)))z$#define %s (PyState_FindModule(&%s))zstatic %s %s_static =z    {};z    {0};zstatic %s *%s = &%s_static;z	return 0;r   )r   r   modulestate_cnamepymoduledef_cnamer  rf  )rV   r3   r   r   r   r   r   r   r#   r#   r$   r     s^    





















z$ModuleNode.generate_module_state_endc             C   s  |j d|jtj|jf  |j dtjtjtjf  |j dtjtjtjf  |j dtjtjtjf  |j dtjtjtjf  |j dtjtjtjf  t	j
d k	r|j dtjtjtjf  x@tjD ]6\}}|j d|  |j d|tj|f  |j d qW d S )Nz#define %s %s->%sz	#ifdef %sz#endif)r   rN  r   r  rO  rP  r  rQ  rR  r   rg  rh  rS  )rV   r3   r   r   rT  r#   r#   r$   r   ;  sH    

z(ModuleNode.generate_module_state_definesc             C   s   |j d |j dtj  |j dtjtjf  |j d |j d|j  |j dtj  |j dtj  |j dtj  |j dtj  |j dtj	  |j d |j dtj
  |j d |j d |j dtj  |j d d S )	Nz#if CYTHON_USE_MODULE_STATEz"static int %s_clear(PyObject *m) {z%s *clear_module_state = %s(m);z"if (!clear_module_state) return 0;z!Py_CLEAR(clear_module_state->%s);z#ifdef __Pyx_CyFunction_USEDz#endifz#ifdef __Pyx_FusedFunction_USED)r   r   rf  rU  rN  rO  rP  r  rQ  rR  cyfunction_type_cnamefusedfunction_type_cname)rV   r3   r   r#   r#   r$   r   a  s4    












z&ModuleNode.generate_module_state_clearc             C   s   |j d |j dtj  |j dtjtjf  |j d |j d|j  |j dtj  |j dtj  |j dtj  |j dtj  |j dtj	  |j d |j dtj
  |j d |j d |j dtj  |j d d S )	Nz#if CYTHON_USE_MODULE_STATEzAstatic int %s_traverse(PyObject *m, visitproc visit, void *arg) {z"%s *traverse_module_state = %s(m);z%if (!traverse_module_state) return 0;z$Py_VISIT(traverse_module_state->%s);z#ifdef __Pyx_CyFunction_USEDz#endifz#ifdef __Pyx_FusedFunction_USED)r   r   rf  rU  rN  rO  rP  r  rQ  rR  rW  rX  )rV   r3   r   r#   r#   r$   r   }  s4    












z)ModuleNode.generate_module_state_traversec          7   C   sf	  | j | j| j|}| j|| |j| j |jd |jtjddd  |jj	 r`|j}d}nd}|jj
ddd	jd
}d| }d| jd| }t|}|jd |jd|  |r|jd | jjr|jd |jd|  |jd |j| |jd |jd|  | jjr@|jd |jd| jd|  |jd | j|j}	|	rt|jd |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f  |jd |jd |jd |jd |jd |jd  |jd |j }|jjd! }|jjd" }|sZ|r||rh|j  |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dn   |jd( |jd |jd) |jd*tjtjf  |jd |jd+ | j|| |s0|r@|j  |j   tjd,dd }|j|j!  |j"| |jtj#d-d |j$| jd. |jd/ |jd0 |jd |jd1tj%|j&tj%| jf  |jd2tj'|j&tj'| jf  |jd3tj(|j&tj(| jf  x>doD ]6}|jd:|  |j$| jd;||jf  |jd qW |jd< |jd= rj|j$| jd> |jd? |jd@ |jdA |jd |jdB |j$| jdC |jdD |j$| jdE |jdF |j$| jdG |jd |jd%| j)   |j$| jdH|j|j*tdI|j*tdJf  |jd | j+|| t,j-rZ|jdK |j$| jdL |jdM |j$| jdN |jdO |dP}| j.|| W d Q R X |dQ}| j/|| W d Q R X |dR}| j0|| W d Q R X |dS}| j1|| W d Q R X |dT$}x|D ]}| j2||| qW W d Q R X |dU$}x|D ]}| j3||| q>W W d Q R X |dV.}x&|D ]}| j4| | j5||| qpW W d Q R X |jdW |j6d  |jdX |j$| jdY |jd |s|r|j7|| j|j8j9 dZ d|j8_:|j6d  | j;j<| |j6d  |s*|rFd|j8_:|j=d[|j8j9 dZ |j  |jd\ | j>|| |j  t,j?r|jjtjd]d |jd^|j@| j  |jA|jB |jC|jD x$|j8jE D ]\}}|jF|| qW |jd%|j  |jd_|jG  |jHtd`|jI  |jjtJjK |jd |jda |jL|jtMdddb |jd |jN|jtMddc |jdd |jde |jdf |jdgtj  |jdh |jd |jd |jdi |jdj|jIj ddp   |jd |jC|jB |jO  |jd |jdk|j  |jd) |jdl|j  |jd |jdm |jd |jd |jP|j8 |jQ  d S )qNr<   ZPyModInitFuncTypezModuleSetupCode.cr   FTr   r   )r   rX  z!__Pyx_PyMODINIT_FUNC init%s(void)z__Pyx_PyMODINIT_FUNC %s(void)r   z#if PY_MAJOR_VERSION < 3z%s CYTHON_SMALL_CODE; /*proto*/z<#error "Unicode module names are not supported in Python 2";zc#if !defined(CYTHON_NO_PYINIT_EXPORT) && (defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS))z5__Pyx_PyMODINIT_FUNC init__init__(void) { init%s(); }z#endifz#elsez;__Pyx_PyMODINIT_FUNC PyInit___init__(void) { return %s(); }zHvoid %s(void) {} /* workaround for https://bugs.python.org/issue39432 */z"#if CYTHON_PEP489_MULTI_PHASE_INITr  zreturn PyModuleDef_Init(&%s);r   ZModuleCreationPEP489r   z-static CYTHON_SMALL_CODE int %s(PyObject *%s)zint stringtab_initialized = 0;z#if CYTHON_USE_MODULE_STATEzint pystate_addmodule_run = 0;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 /*--- Module creation code ---*/ZImportRefnannyAPIZCheckBinaryVersionzs__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API)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(%s)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();z4/*--- Initialize various global constants etc. ---*/z__Pyx_InitConstants()zstringtab_initialized = 1;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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nogilZPy_Nonez/*--- Wrapped vars code ---*/ZRegisterModuleCleanupzif (__Pyx_RegisterCleanup()) %sz"if (%s && stringtab_initialized) {zinit %sz#if !CYTHON_USE_MODULE_STATE)r  r  )r  zif (pystate_addmodule_run) {zPyObject *tp, *value, *tb;zPyErr_Fetch(&tp, &value, &tb);zPyState_RemoveModule(&%s);zPyErr_Restore(tp, value, tb);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_  r`  r   )Rmod_init_subfunctionrH   r(   generate_pymoduledef_structrF  r   r
   r   rT   r   r   r   r   r   
is_packagewrong_punycode_module_namer   rV  r   module_init_func_cnamepymodinit_module_argr  r   r2   Zuse_fast_gil_utility_coder   rc  put_declare_refcount_contextrf  r   generate_module_creation_codeZput_trace_declarationsZput_trace_frame_initr   put_setup_refcount_contextloadZput_error_if_negr  error_goto_if_nullrQ  rR  r   intern_identifier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   Zput_trace_call	funcstateZ	gil_ownedZ	can_tracer>   Zgenerate_execution_codeZput_trace_returngenerate_wrapped_entries_codegenerate_cleanup_coderG  Zput_gotoZreturn_labelrK  rJ  all_managed_tempsput_xdecrefrN  rL  r   r   Ztraceback_utility_coder  r	   rH  put_finish_refcount_contextput_temp_declarationsrM  )rV   r   r3   r   Zsubfunctionr   Zfail_compilation_in_py2Zheader2Zheader3rf  Zmod_create_functempdecl_coderY  rZ  Zrefnanny_import_coder:  Z
inner_coderv   r   rS   r#   r#   r$   r     s   





















































































z$ModuleNode.generate_module_init_funcc                sD   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).
        r<   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 )NrQ  z^[a-z0-9_]+$z__Pyx_modinit_%s)
r  ra  r  r   matchrF   
cfunc_namedescriptionr  	call_code)rV   Z	code_typer   r#   r#   r$   __init__  s    
zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__init__c                sn   j  | _ }|j jd| j  |jd| j  |j  |j  | _|jt| j |jd| j	  |S )Nz0static CYTHON_SMALL_CODE int %s(void); /*proto*/zstatic int %s(void) {z/*--- %s ---*/)
r  r  rF  r   r  ri  r  rk  r   r  )rV   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d| j  n| jjd| j  d | _d S )Nz	return 0;z
return -1;r   r<   z%s()z(void)%s();)r}  r   r  r~  rx  rI  rJ  rK  r{  r|  rM  r  error_goto_if_negr  )rV   r  r   Zneeds_error_handlingr   rS   )r  rH   r#   r$   __exit__  s(    



zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__exit__N)ra  
__module____qualname__r  r  r  r#   )r  r  rH   r  r(   r#   r$   ModInitSubfunction  s   r  )r  r   object)rV   rH   r(   r  r  r#   )r  r  rH   r  r(   r$   rc    s    	

0z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rf|jd |jjtd}|jd||jjtttjj|j	|j|| jf  |j|t |jd	|j||j
| jf  |j|t |jj| |jd nX|jrf|jd |jjtjd
d |j|jd|jjt| jj	 | j |jd | j}|jdrt|d td  }|j }|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 )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)r2   rH   r  r   rf  r   Zget_py_string_constr   r   r   rG  re  rx  allocate_tempr	   ry   r!   r  rm  
put_gotrefr  release_tempr   r
   rl  r  rR   endswithr  r   )rV   r3   r   module_pathtempZfq_module_nameZfq_module_name_cstringr#   r#   r$   ro    sf    













z'ModuleNode.generate_module_import_setupc             C   sf  t js
d S |jdtj  |j| t jdkr|jd t|j}|j  x:|D ]2}|j	dkrP|j
jrP|jrP|j|j|j
ddd qPW |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s6|jrTq6|jjjddr6|j}|j tj!}|j tj"}	|jd |jd|	  |jd||	f  |jd |jd |jd |jd |jd |jd |jd |jd q6W t j#d k	r$|jtj$tddd x(tj%tj&gD ]}
|j|
tddd q2W |j|j'tddd d S )Nz.static void %s(CYTHON_UNUSED PyObject *self) {r   z/*--- Global cleanup code ---*/r  TF)r  r  z__Pyx_CleanupGlobals();   z$/*--- Type import cleanup code ---*/r   )r.  z /*--- Builtin cleanup code ---*/z/*--- Intern cleanup code ---*/r  r   z#if CYTHON_USE_FREELISTSzwhile (%s > 0) {z"PyObject* o = (PyObject*)%s[--%s];z5#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPYz(*Py_TYPE(o)->tp_free)(o);z#elsezDfreefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);zif (tp_free) tp_free(o);z#endifr   )r  r  )(r   rz  r   r   cleanup_cnamerF  r  r   r-  r}   rS   r  r5  r  r   rb   types_importedr;  r<  r   rp  Zcached_builtinsr   r	   r  r  rQ   r*  r)  r(   r2   r*  r  r  r  rg  rh  rP  rO  rN  )rV   r3   r   Zrev_entriesrY   r:  Zcclass_typer(   r  r  r   r#   r#   r$   r   0  s|    





















z'ModuleNode.generate_module_cleanup_funcc             C   sL   | j  }tjdkrd}ntj}tjdd}|jj|j|j|tj|d d S )NmainwmainZMainFunctionzEmbed.c)rT   r   r   Zwmain_method)	r   r   r   r
   rc  r   r   Z
specializerT   )rV   r3   r   r   r  r   r#   r#   r$   r     s    
zModuleNode.generate_main_methodc             C   sV   yd|j djd }W n0 tk
rH   d|j djddjd }Y nX d||f S )NrQ  r   ZU_punycode   -   _z%s%s)r   r   UnicodeEncodeErrorr   )rV   r   ri   r#   r#   r$   r     s
    "zModuleNode.punycode_module_namec             C   sD   y|j d d S  tk
r>   dd| j djddjd S X d S )Nr   ZPyInitUrQ  r  r  r  )r   r  r   r   )rV   ri   r#   r#   r$   rf    s
    
z%ModuleNode.wrong_punycode_module_namec             C   s   | j ||jS )N)r   rT   )rV   r   r3   r#   r#   r$   r     s    zModuleNode.mod_init_func_cnamec             C   s   | j }| jtj|S )N)r(   r   r   Zpymodule_exec_func_cname)rV   r3   r#   r#   r$   rg    s    z!ModuleNode.module_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 }|jdtj  |jd	|  |jd
tj	  |jdtj  |jd|  |jd |jd |j
j s|jd |jd |jd |jd |jd |jd |jdtj  |jd |jdtj  |jd |jd |jd |jd|j
j   |jd|  |jd |jd |jd |jdtj  |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#tj  |jd$tj  |jd%|  |jd |jd& |jd' |jd%|  |jd |jd |jd |jd( |jd |jd d S ))Nz%srm  z(freefunc)%sZNULLr<   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*#else /* CYTHON_PEP489_MULTI_PHASE_INIT */zT#error "Unicode module names are only supported with multi-phase init as per PEP489"z#endifz#ifdef __cplusplusznamespace {zstruct PyModuleDef %s =z#elsezstatic struct PyModuleDef %s =r  z  PyModuleDef_HEAD_INIT,z  %s,z  %s, /* m_doc */z  0, /* m_size */z#elif CYTHON_USE_MODULE_STATEz  sizeof(%s), /* m_size */z  -1, /* m_size */z  %s /* m_methods */,z  %s, /* m_slots */z  NULL, /* m_reload */z#if CYTHON_USE_MODULE_STATEz  %s_traverse, /* m_traverse */z  %s_clear, /* m_clear */z  %s /* m_free */z  NULL, /* m_traverse */z  NULL, /* m_clear */z} /* anonymous namespace */)r]   get_string_constr   rz  r   r  r   rg  Zpymodule_create_func_cnameZpymoduledef_slots_cnamerT   r   rV  r   rU  rA  rf  )rV   r3   r   r]   Zcleanup_funcZexec_func_cnamer#   r#   r$   rd    sx    



































z&ModuleNode.generate_pymoduledef_structc             C   sd  |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
||jf  |j|j|j| j |jd
 |jjtdd}|jd|tj|j|| jf  |jd |jd|tjf  |jd|||jj	 f  |j|jd| j |jd |jd |jj| |jd |jd|jtjf  |j|j|j| j |jd |jd |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dtj|jtj| jf  |jd|jtj|j| jf  tjd k	r`|jdtjtj|jtj| jf  d S )Nz%srm  z"#if CYTHON_PEP489_MULTI_PHASE_INITz%s = %s;F)r  z#elsez#if PY_MAJOR_VERSION < 3zG%s = Py_InitModule4(%s, %s, %s, 0, PYTHON_API_VERSION); Py_XINCREF(%s);z#elif CYTHON_USE_MODULE_STATE)
manage_refz%s = PyModule_Create(&%s); %sr  z3int add_module_result = PyState_AddModule(%s, &%s);z=%s = 0; /* transfer ownership from %s to %s pseudovariable */Zadd_module_resultzpystate_addmodule_run = 1;r   z%s = PyModule_Create(&%s);z#endifzCYTHON_UNUSED_VAR(%s);z%s = PyModule_GetDict(%s); %sz?%s = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); %szE%s = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); %sz:if (PyObject_SetAttrString(%s, "__builtins__", %s) < 0) %sz*%s = __Pyx_PyImport_AddModuleRef("%s"); %s)r]   r  r   rf  r   rh  Z
put_increfr	   rT   r   rA  rm  rH   rx  r  rV  r  r  rN  rO  rP  rG  r   rg  rh  )rV   r3   r   r]   Zmodule_tempr#   r#   r$   rj    s    









z(ModuleNode.generate_module_creation_codec             C   s2   x,|j D ]"}|jdkr|jr|jj|| qW d S )Nr  )r   r}   r5  rS   Zglobal_init_code)rV   r3   r   rY   r#   r#   r$   rq  ?  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 objectr  zPyObject* wrapped = %s(%s);wrappedz6if (PyObject_SetAttrString(%s, "%s", wrapped) < 0) %s;r   )rb   rc   rd   re   rf   r(   rS   rd  r   rH   r   Zto_py_functionr   rm  rf  rG  )rV   r3   r   ri   rY   r#   r#   r$   ry  G  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  ZVoidPtrExportzImportExport.cz6if (__Pyx_ExportVoidPtr(%s, (void *)&%s, "%s") < 0) %s)r   r~   ru   r   r  r}   rB   r   r
   rc  rS   r   rn  ri   r   r   rG  rH   )rV   r3   r   rc   rY   r(  ri   r#   r#   r$   rr  Z  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 x<|D ]4}|j
j }|jd|jj |j||j| jf  qXW d S )Nr  ZFunctionExportzImportExport.cz>if (__Pyx_ExportFunction(%s, (void (*)(void))%s, "%s") < 0) %s)rt   r~   ru   r   r  r}   rB   r   r
   rc  rS   r   r   ri   r   r   rG  rH   )rV   r3   r   rc   rY   r(  r#   r#   r$   rs  k  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   rQ   ru   generate_type_import_coderS   rH   )rV   rv   r3   r   r   rY   r#   r#   r$   ru    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)rt   rS   rs  Z"get_all_specialized_function_types)rV   Zpxd_envrY   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  |j|t x\|D ]T}||kr|j}n|jtj|j}|jj }|j	dtj||j|||j| jf  q|W |j|t |jj| d S )Nr   zImportExport.cT)r  z-%s = PyImport_ImportModule("%s"); if (!%s) %sz@if (__Pyx_ImportVoidPtr_%s(%s, "%s", (void **)&%s, "%s") < 0) %s)r   ru   rB   r   r
   rc  rx  r  r	   r   r   rG  rH   r  r   r   r   r  ri   rS   r   r   r  r  )	rV   rv   r3   r   rc   rY   r  r   r(  r#   r#   r$   rv    s6    


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  |j|t	 x>|D ]6}|j
dtj||jj |j|jj |j| jf  qW |j|t	 |jj| d S )Nr   zImportExport.cT)r  z-%s = PyImport_ImportModule("%s"); if (!%s) %szGif (__Pyx_ImportFunction_%s(%s, %s, (void (**)(void))&%s, "%s") < 0) %s)rt   ru   r5  rB   r   r
   rc  rx  r  r	   r   r   rG  rH   r  r   r   ri   r   r   rS   r   r  r  )rV   rv   r3   r   rc   rY   r  r#   r#   r$   rw    s4    
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   rQ   r}   utility_code_definitionr  rS   rH   generate_base_type_import_code!generate_exttype_vtable_init_codeZ
early_initgenerate_type_ready_code)rV   r3   r   r   rY   r#   r#   r$   rt    s    
z"ModuleNode.generate_type_init_codec             C   sF   |j j}|rB|j|jkrB|jp"|j rB|j rB| j||| j|| d S )N)	rS   r)  rT   r   r  Zis_cython_builtin_typer  r  rH   )rV   r3   rY   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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_posZ	GetVTablez(%s = (struct %s*)__Pyx_GetVtable(%s); %s)r  ri   r   ctypedef_builtins_mapr   r   r
   rc  r   r  r   r2  r   rm  r!  )rV   r3   rS   rH   r   r   r#   r#   r$   r    s    
z$ModuleNode.generate_type_import_codec             C   sb  |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tj||f  |jj }|	o|
r>|jd |jd	|	  |jd
|
  |jd |jd|  |jd n|jd|  ||kr|	sf|jd |jd |jd|tj|f  |jd |jd|tj|f  |jd |jd|tj|f  |jd n|jd|tj|f  |jr|jdkr|j}n.|j s|jrd}ntd|j||jf |jd|j tjf  |j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,r<   z#if %sz"%s",z#elsez%s,z#endifz %s, z>#if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000z.sizeof(%s), __PYX_GET_STRUCT_ALIGNMENT_%s(%s),z%#elif CYTHON_COMPILING_IN_LIMITED_APIr   warnr   z6invalid value for check_size '%s' when compiling %s.%sz"__Pyx_ImportType_CheckSize_%s_%s);z if (!%s) %s)r  r  )r   r  r   )ry  r4  rT   ri   r   r  r   r   Znon_portable_builtins_mapZbasicsize_builtins_maprF   rG  r   r   r   r   r   
check_sizer*  Zis_subclassedRuntimeErrorrb  )rV   rS   r   r   r   r  r;  Zsizeof_objstructrT   	conditionreplacementZ	ctypenamerv   	type_namer  r#   r#   r$   r     sv    














z$ModuleNode.generate_type_import_callc             C   s   t jj|| d S )N)r   ZCClassDefNoder  )rV   rY   r   r#   r#   r$   r  F  s    z#ModuleNode.generate_type_ready_codec             C   s   | j jdd}| jtj|S )Nr   r   )rR   r   r   r   r   )rV   rR   r#   r#   r$   r   I  s    z$ModuleNode.is_main_module_flag_cnamec             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 }|rx<|D ]4}|j	pv|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#   )r  )r   rY   r#   r#   r$   r   ^  s    z@ModuleNode.generate_exttype_vtable_init_code.<locals>.<listcomp>z%s.%s = %s%s;)rS   r  r   r  r)  r   r  r(   rt   vtable_typeZsignature_cast_stringr   r  )rV   rY   r   rS   Zc_method_entriesZ
meth_entryr  castr#   r#   r$   r  M  s.    
z,ModuleNode.generate_exttype_vtable_init_code)F)F)TT)NN)tra  r  r  Zchild_attrsr2   rG   rI   rU   rZ   r_   rj   rs   rw   r{   rp   r   r   rq   r   r   ro   r   r   rm   r0  r:  rn   rG  r   staticmethodrM  r   r   r   r   r   rp  r   rz  rt  r~  rr  r  rv  rw  ru  rB  rC  rD  rE  r?  rA  rI  rJ  rK  r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1  r2  r  r  r   r  r  ra   r   r   r   r   r   r   r   rc  ro  r   r   r   rf  r   rg  rd  rj  rq  ry  rr  rs  ru  r  rv  rw  rt  r  r  r   r  r   r  r#   r#   r#   r$   r=   o   s   
3

h[\) , 
"j#,%3		> # !=D:< C<(,'  D5&  @=PDQ	
L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   importedrd   temps)rV   r   r   ri   r   r#   r#   r$   r  q  s    zModuleImportGenerator.__init__c             C   sf   || j kr| j | S | j}|jjtdd}| jj| |jd||||f  |j|t || j |< |S )NT)r  z5%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s)	r  r   rx  r  r	   r  rB   r   r  )rV   Zmodule_name_stringr   r   r  r#   r#   r$   r   y  s    


z%ModuleImportGenerator.imported_modulec             C   s   | S )Nr#   )rV   r#   r#   r$   r    s    zModuleImportGenerator.__enter__c             G   s2   | j }x&| jD ]}|j|t |jj| qW d S )N)r   r  r  r	   rx  r  )rV   excr   r  r#   r#   r$   r    s    zModuleImportGenerator.__exit__)N)ra  r  r  __doc__r  r   r  r  r#   r#   r#   r$   r   l  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   r|   r  r  )r  z%s %s%s; /*proto*/)r5  r  Zinline_func_in_pxdr6  ru   r}   r   r   rS   r   r   r   r  r  r   )
rY   r3   r   rF  Zfrom_cy_utilityr  r  rS   r  r  r#   r#   r$   r    s4    


r  ZRefnannyzModuleSetupCode.czj
#if defined(__GNUC__)
#define __Pyx_PACKED __attribute__((__packed__))
#else
#define __Pyx_PACKED
#endif
Zutility_code_proto_before_types)protoimplZproto_block)r6   r7   )Tr8   T)r6   r9   )Fr:   F)r6   r;   )Tr<   N)r9   r;   )Tr:   F)r9   r6   )Fr8   T)r9   r7   )Tr<   N)r7   r6   )Tr8   T)r7   r;   )Fr:   F)r7   r9   )Tr<   N)r;   r9   )Tr:   F)r;   r7   )Fr8   T)r;   r6   )Tr<   N)7
__future__r   ZcythonZdeclarer  collectionsr   rZ  r;  ry   r   r&   r   r   r<   r   r   r   r   r   r   r   r   ZErrorsr   r   r   r	   ZUtilsr   r   r   r   r   r
   r   r   ZStringEncodingr   r   r   r%   r    r*   r+   r5   r  NodeZ	BlockNoder=   r   r  rl  r   r  r#   r#   r#   r$   <module>   s   
                              $%