U
    {±Ėh·Ł ć                   @   sŽ  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
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mZ ddlmZmZ ddlmZmZm Z m!Z!m"Z" ddlm#Z#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.d d!d"d#d$d"d d!d"d#d$d"d%Z/G d&d' d'ej0ej1Z2G d(d) d)Z3d*d+ Z4e# 5d,d-”Z6e#d.d/d0d1Z7dS )2é    N)
Ś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Śformat_position)r   Śget_all_subtypesé   )Ś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%   ś>/tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/ModuleNode.pyŚreplace_suffix_encoded&   s    
r'   c                 C   s   t | t ” S r!   )r   ŚsysŚgetfilesystemencoding)r#   r%   r%   r&   r"   +   s    r"   c                 C   s   | j  ”  | S r!   )ŚscopeZcheck_c_classes_pxd©Zmodule_noder%   r%   r&   Ścheck_c_declarations_pxd1   s    
r,   c                 C   s   | j  ”  | j  ”  | S r!   )r*   Zcheck_c_classesZcheck_c_functionsr+   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Ś
directivesr0   )ŚenvŚoptionsr/   r%   r%   r&   Śgenerate_c_code_config<   s    
żr7   )Tś&&T)Fś||F)TŚ N)Tr9   F)Fr8   T))Ś__lt__Ś__gt__)r;   Ś__le__)r;   Ś__ge__)r=   r>   )r=   r;   )r=   r<   )r<   r;   )r<   r>   )r<   r=   )r>   r=   )r>   r<   )r>   r;   c                   @   s  e Zd ZdgZdZdZdZedd Zdd Z	dßdd	Z
d
d Zdd Zdd Zdd Zdd ZdąddZdd Zdd Zdd Zd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/d0 Zd1d2 Zd3d4 Ze d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$dį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 Z0dUdV Z1dWdX Z2dYdZ Z3d[d\ Z4d]d^ Z5d_d` Z6dadb Z7dcdd Z8dedf Z9dgdh Z:didj Z;dkdl Z<dmdn Z=dodp Z>dqdr Z?dsdt Z@dudv ZAdwdx ZBdydz ZCd{d| ZDd}d~ ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd  ZVd”d¢ ZWd£d¤ ZXd„d¦ ZYd§dØ ZZd©dŖ Z[d«d¬ Z\d­d® Z]dÆd° Z^d±d² Z_d³d“ Z`dµd¶ Zad·dø Zbd¹dŗ Zcd»d¼ Zdd½d¾ ZedædĄ ZfdĮdĀ ZgdĆdÄ ZhdÅdĘ ZidĒdČ ZjdÉdŹ ZkdĖdĢ ZldĶdĪ ZmdĻdŠ ZndŃdŅ ZodÓdŌ ZpdÕdÖ Zqdād×dŲZrdŁdŚ ZsdŪdÜ ZtdŻdŽ ZudS )ćŚ
ModuleNodeŚbodyNc                 C   s   | j S r!   ©r*   ©Śselfr%   r%   r&   Ślocal_scope   s    zModuleNode.local_scopec                 C   s  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 	d| j” | jj 	d| j” |j
| jj
krtj|j||j
d}|dkr¤| jn| j}t |tjrĘ|j |j” n|j |” | jj |j” |j ” D ]}| j |” qģdd }|| jj|j d S )N)ŚpxdZutility)Śstatsr   )r@   r4   rE   c                 S   s    |D ]}|| kr|   |” qd S r!   )Śappend)ZL1ZL2Śxr%   r%   r&   Śextend_if_not_in©   s    z-ModuleNode.merge_in.<locals>.extend_if_not_in)Ś
isinstancer@   r   ZStatListNodeŚAssertionErrorŚ	pxd_statsŚposŚutility_code_statsrF   Śinsertr4   r*   ŚCompilerDirectivesNodeŚextendrG   Śutility_code_listŚ
c_includesŚvaluesZprocess_includeŚincluded_files)rC   Śtreer*   ZstageZtarget_statsŚincrI   r%   r%   r&   Śmerge_in   s$    
zModuleNode.merge_inTc                 C   s4   |j D ]}| j|j_||jjjd< q| j |” d S )NZinternal)Śc_class_entriesŚfull_module_nameŚtypeŚmodule_namer*   r4   rX   )rC   r*   Zinternalise_c_class_entriesŚentryr%   r%   r&   Śmerge_scope°   s    

zModuleNode.merge_scopec                 C   s   t j| j| j| jd}|S )N)r4   r@   )r   rP   rM   r4   r@   )rC   r@   r%   r%   r&   Świth_compiler_directivesø   s    z#ModuleNode.with_compiler_directivesc                 C   sÄ   t |rt |” | jr$| jd |_tjs8d  |_| _nRtjrt	dt
 | j” |_| jd k	rt	|jd | j |_| jj|j_n| j|_| j|_| j |” | dd ”rĄ| j t dd”” d S )NŚold_style_globalszFile: %s (starting at line %s)Ś
c                 S   s
   | t jkS r!   )r   Zcy_pymutex_type)Śtpr%   r%   r&   Ś<lambda>Ń   ó    z1ModuleNode.analyse_declarations.<locals>.<lambda>ZCythonPyMutexPublicCheckzSynchronization.c)r    r   Zinclude_pythran_genericr4   r`   r   Z
docstringsŚdocZembed_pos_in_docstringr
   r   Zrelative_positionrM   Śencodingr@   Śanalyse_declarationsZfind_shared_usages_of_typer*   Śuse_utility_coder	   Śload_cached©rC   r5   r%   r%   r&   rg   æ   s*    

 ’’zModuleNode.analyse_declarationsc                 C   sd   | j }|jr|  |” t|j ” D ]:\}}|jr$|j |kr$|jr$|jj	sR|jj
r$|j |” q$d S r!   )r*   Śhas_import_starŚ*create_import_star_conversion_utility_codeŚsortedŚentriesŚitemsŚcreate_wrapperŚis_typer[   Śis_enumŚis_cpp_enumZcreate_type_wrapper©rC   r5   Śnamer]   r%   r%   r&   Śprepare_utility_codeŁ   s    
’’’zModuleNode.prepare_utility_codec                 C   s\   | j }tj|_g | _|  || ji ” |  |” |  |||” |  |||” |  	|||” d S r!   )
r*   r   Śc_void_typeŚreturn_typeŚreferenced_modulesŚfind_referenced_modulesŚsort_cdef_classesŚgenerate_c_codeŚgenerate_h_codeŚgenerate_api_code)rC   r6   Śresultr5   r%   r%   r&   Śprocess_implementationä   s    
z!ModuleNode.process_implementationc                 C   s*   | j D ]}|jD ]}|jr  dS qqdS )Nr   r   )ry   Ścfunc_entriesŚdefined_in_pxd)rC   Śmoduler]   r%   r%   r&   Śhas_imported_c_functionsī   s
    

z#ModuleNode.has_imported_c_functionsFc                 C   s*   t ||dds&t| jdt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   rM   Śosr#   Śbasename)rC   r#   r   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|rzt|jd|_|  |j” t 	” }	t
||}
t |	| |
”}| ”  |jd }|jd }|jd	 }|jrŹt|jd
|_t |j”}nd }| ”  |  tj|”}| |” | d” | d” |  ||” |jr$|  |g |” | d” |  tj|”}| d| ” | d” |  || ” ” | d” |  |” |r¶| d” |D ](}|  |j|” |r|   |j|” q|rą| d” |D ]}|  !|||” qŹ|r
| d” |D ]}|  !|||” qō| d” | d| ” | d” | d” | d” | d” |  "d|”}t#d|j$ %” ||f }| d| &d” ” | d| ” | d” | d” | d” | d| %”  ” | d” | d| %”  ” | d” | d| %”  ” | d” | d| ” | d” | d ” | d!|||f ” | d” | d” | d| ” t'|j}|	 (|” W 5 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Śapir   ©Ś.0r]   ©r   rE   r%   r&   Ś
<listcomp>’   s    
  żzAModuleNode.generate_h_code.<locals>.h_entries.<locals>.<listcomp>r%   )rn   r   rE   r%   r   r&   Ś	h_entriesž   s    z-ModuleNode.generate_h_code.<locals>.h_entriesr   )r   z.hŚh_codeŚtype_declarationsŚendz.pxir:   ś#include "Python.h"z
#ifndef %sś#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. */ŚPyInitzBUse 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__ś#elif defined(_MSC_VER)z#__declspec(deprecated(%s)) __inlineś#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_entriesr   rY   r'   Śc_fileŚh_filer   r   ŚCCodeWriterr7   Ś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_coder[   Śgenerate_cclass_include_codeŚgenerate_public_declarationŚmod_init_func_cnamer
   r\   Śas_c_string_literalŚrstripr   Ścopyto)rC   r5   r6   r   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_guardr]   Zpy3_mod_func_nameZwarning_stringŚfr%   r%   r&   r}   ż   s°    






















  ’



’
’


  ’

zModuleNode.generate_h_codec                 C   sB   |  dtj|j |j”f ” |r>|  d|jj|jdd ” d S )Nś%s %s;zcdef extern %sr   ©Zpyrex)r¦   r   Śextern_c_macror[   Śdeclaration_codeŚcname)rC   r]   r   r¶   r%   r%   r&   rÆ   \  s    ž’z&ModuleNode.generate_public_declarationc                 C   s   |   ||j”}| dd”S ©Nr   Ś__)Śpunycode_module_nameŚqualified_nameŚreplace)rC   Śprefixr5   r£   r%   r%   r&   r£   d  s    zModuleNode.api_namec              	      s¶  d(dd}||j }||j}||j}|s8|s8|s8d S t|jd|_|  |j” t ”  t	||}t 
 | |”   ”  |  tj|”}	  |	”   d”   d”   d” d) fd	d
	}
  d” |jrötj |j”}t|}  d| ”  ” |r>  d” |D ]2}|j}  d|j ”   d|j|jf ” q
|r  d” |D ]H}t|j}| tj|j”}  d| |” ”   d|j|f ” qR|rś  d” |D ]H}t|j}| tj|j”}  d| |” ”   d|j|f ” q°|r
|
dd |r|
dd |r*|
dd   d”   d|  d|” ”   d”   d|j  ”  ”   d” |D ]>}| tj|j”}|j !” }  dtj"|j ” ||f ” qv|D ]>}| tj|j”}|j #” }  dtj"|j ” ||f ” qŗt$ |j did(}|D ]}| j%|j |ddd  qW 5 Q R X   d!”   d"”   d#”   d$”   d%”   d&”   d”   d'|	 ” t&|j}z  (|” W 5 | '”  X d S )*Nr   c                    s    fdd| D S )Nc                    s    g | ]}|j s r|jr|qS r%   )r   r   r   ©rE   r%   r&   r   j  s
      ’zEModuleNode.generate_api_code.<locals>.api_entries.<locals>.<listcomp>r%   )rn   rE   r%   rÄ   r&   Śapi_entriesi  s    z1ModuleNode.generate_api_code.<locals>.api_entriesz_api.hz#ifdef __MINGW64__z#define MS_WIN64r   Tc                    s4   t j| ||d\}}|r"  |” |r0  |” d S )N)Śinclude_requires)r	   Śload_as_stringŚput)ru   Zsrc_filerĘ   ŚprotoŚimpl©r   r%   r&   Śput_utility_code  s
    
z6ModuleNode.generate_api_code.<locals>.put_utility_coder   z#include %sr:   zstatic PyTypeObject *%s = 0;ś#define %s (*%s)zstatic %s = 0;ś#define %s %sŚVoidPtrImportśImportExport.cŚ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;r   )Śimported_modulesś	goto bad;)Ś
error_codeŚis_apizPy_DECREF(module); module = 0;ś	return 0;śbad:zPy_XDECREF(module);ś
return -1;r   r   )r   )T))r   r   rY   r'   r   Zapi_filer   r   r   r7   r    r¢   r£   r   r©   r„   r¦   r   r   r#   r   r"   r±   r[   Śtypeptr_cnameŚtypeobj_cnamer   ŚmangleZfunc_prefix_apiru   r¼   Zvarptr_prefix_apirĮ   Śsignature_stringŚ	cyversionŚempty_declaration_codeŚModuleImportGeneratorŚgenerate_type_import_callr   Ścloser³   )rC   r5   r6   r   rÅ   Zapi_varsZ	api_funcsZapi_extension_typesr“   r·   rĢ   Z
h_filenamer]   r[   r½   ŚsigŚimport_generatorrø   r%   rĖ   r&   r~   h  s°    










 ’










’’
’’$







zModuleNode.generate_api_codec                 C   s$   |  dtjt dd”|jf ” d S )Nś	%s %s %s;ŚPyTypeObjectŚ	DL_IMPORT)r¦   r   r»   r   Śpublic_declrÜ   )rC   r[   r   r%   r%   r&   r­   Ė  s
    
żz&ModuleNode.generate_cclass_header_codec                 C   sh   |  d|j|jf ” | ”  |jj}|rR|D ] }|  d|jj|jdd ” q.n
|  d” | 	”  d S )Nzcdef extern class %s.%s:zcdef %sr   rŗ   Śpass)
r¦   r\   ru   Śindentr*   r   r[   r¼   r½   Śdedent)rC   r[   r¶   r   r]   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	 
” }t||}t	j|| ||jd}| ”  |d }	| j|_| j|_|  ||||j|	” | t” |d }
|
 d| j ”  ” |  ” }|
 d	| ” |
 d
| ” |
 d” |
 d|j ”  ” |d }
| j|||
dd |d }
|  ||
” |  ||
” |  ||
” | j  ||
” |d }
|  !||
” |  "||
” |j#r|  $||
” |d  %t& 'dd”” |  (||d ” |  )||d ” |  *||d ” |  +|d d ||d ” |  ,||d ” tj-r|  .||d ” |  /|d ” |  0|||” |	 1d” |j2d d  D ]}| |” qP| 3”  |  4|||” t5|j}z| 7|” W 5 | 6”  X d|_8|j9r¶|  :||” tjsĘ|jrŌ|  ;|||” d S )NT)r   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module_exttypesŚmodule_stateZSmallCodeConfigśModuleSetupCode.cŚmodule_state_clearŚmodule_state_traverseé’’’’Śinit_moduleZcleanup_moduleŚmain_methodZfilename_tablera   r   )<r   r   ry   r   r1   r   ZAnnotationCCodeWriterZcompilation_sourcerī   r   r   r7   r    rļ   Zinitialize_main_c_coderM   Z
module_posr4   Śgenerate_module_preambleZembedded_metadatarh   Śrefnanny_utility_coder¦   rZ   r±   Śis_main_module_flag_cnamerĮ   rØ   Zgenerate_cached_builtins_declsZgenerate_lambda_definitionsŚgenerate_variable_definitionsr@   Zgenerate_function_definitionsŚgenerate_typeobj_definitionsŚgenerate_method_tablerk   Śgenerate_import_starŚput_code_herer	   ŚloadŚgenerate_module_state_startŚ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ŚwriterR   Zfinalize_main_c_codeŚgenerate_module_state_endr   rć   r³   Zc_file_generatedZ	gdb_debugŚ_serialize_lineno_mapŚ_generate_annotations)rC   r5   r6   r   Śmodulesrķ   Ś
rootwriterr“   rµ   r   ŚcodeŚmodule_is_mainZutilcoderø   r%   r%   r&   r|   Ž  s    ž
 ż
’

’


zModuleNode.generate_c_codec                 C   sj  |   |” tjp|j}|r\tj |”r\dd lm  m} | 	|” 
” }| ” D ]
}d |_qNnd }|j|j|j|d | jjsd S | jjj}tj tj |j””}	| jjD ]¼}
tj tj |	|
””}tj |”}| |	”sŚqØ||
| jdd}|sšqØ||	krTtj |”sTzt |” W n< tk
rR } zdd l}|j|jkrB W 5 d }~X Y nX |j|||d qØd S )Nr   )Ścoverage_xmlT)Z
source_posŚinclude)r1   r   Zannotate_coverage_xmlr   r#   ŚexistsŚxml.etree.ElementTreeŚetreeŚElementTreeŚparseŚgetrootŚiterŚtailZsave_annotationZmain_source_filer   r*   rU   ŚcontextZsearch_include_directoriesŚabspathŚdirnameŚjoinŚ
startswithrM   ŚmakedirsŚOSErrorŚerrnoŚEEXIST)rC   r  r   r6   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 ” }tt}t|D ]4\}\}}|dkr"|jd k	r"|||f  |d ” q"| 	d” t
| ” D ]>\\}}}	|jd k	st|jdd tt|	”|jt|d qn| d” | ”  d S )Nr   r   ZLineNumberMappingZ
LineNumberś )Ś	c_linenosZsrc_pathŚ
src_lineno)r  Zgdb_debug_outputwriterŚbufferZ
allmarkersr   ŚlistŚ	enumerateŚfilenamerG   Śstartrm   ro   rK   Ś	add_entryr  ŚmapŚstrr   Ś	serialize)
rC   r5   ZccodewriterŚtbŚmarkersŚdZc_linenoZsrc_descr+  r*  r%   r%   r&   r  a  s"    

ü
z ModuleNode._serialize_lineno_mapc                 C   s8   ||kr4d||< |j D ]}|  |||” q| |” d S )Nr   )Ścimported_modulesrz   rG   )rC   r5   Śmodule_listZmodules_seenŚimported_moduler%   r%   r&   rz   v  s
    
z"ModuleNode.find_referenced_modulesc           	         s    t t|D ]L}| }|jj}|r|}|  |”  |”}|d krNq|jj}q qt g  fdd t|D ]} |  q ”  S )Nc                    sD   | krd S   | ” | j D ]} |  q$ | ” d S r!   )Śaddr[   rG   )ŚuŚv©ŚdfsŚgetkeyr   ŚseenZ
subclassesŚ	type_dictr%   r&   r?    s    
z1ModuleNode.sort_types_by_inheritance.<locals>.dfs)	r   r-  r[   Ś	base_typerG   ŚgetŚsetŚreversedŚreverse)	rC   rB  Z
type_orderr@  ŚkeyZ	new_entryŚbaseZbase_keyZ
base_entryr%   r>  r&   Śsort_types_by_inheritance}  s$    
z$ModuleNode.sort_types_by_inheritancec                 C   sH  i g  }}i g  }}|D  ]ų}|j D ]}|jr$|js$|j}	|	j}
|
sFq$|
|krddlm} t|j|stt	t
|jt||
 j|sŖt	t
||
 jq$|||
< | |
” q$||k}|jD ]V}|jrŗ|sĪ|jrŗ|j}	|	jrŗ|jsŗ|j}	|	j}
|
|k sžt	|
|||
< | |
” qŗqdd }|  |||”}dd }|  |||”}||fS )Nr   )ŚNonManglingModuleScopec                 S   s   | j S r!   )Śvtabstruct_cname©Z
entry_typer%   r%   r&   rL  ½  s    z8ModuleNode.sort_type_hierarchy.<locals>.vtabstruct_cnamec                 S   s   | j S r!   )Śobjstruct_cnamerM  r%   r%   r&   rN  Ā  s    z7ModuleNode.sort_type_hierarchy.<locals>.objstruct_cname)rY   ŚusedŚin_cincluder[   rL  r	   rK  rJ   r*   rK   r3  rG   r   r   Śis_extension_typerN  rJ  )rC   r9  r5   Z	vtab_dictZvtab_dict_orderZvtabslot_dictZvtabslot_dict_orderr   r]   r[   rH  rK  Zall_defined_hererL  Ś	vtab_listrN  Śvtabslot_listr%   r%   r&   Śsort_type_hierarchy  sL    



$
  ’  ’zModuleNode.sort_type_hierarchyc                 C   sh   t  d”}i g  }}|jD ]0}||j}||ks8t||||< | |” q|  |||”|jd d < d S )NrN  )ŚoperatorŚ
attrgetterrY   r[   rK   rG   rJ  )rC   r5   Zkey_funcZ
entry_dictZentry_orderr]   rH  r%   r%   r&   r{   É  s    



  ’zModuleNode.sort_cdef_classesc                    s  |D ]}|   |j|” qt| t }|D ]~}||k}	g }
|jD ]H}|jjrt|jrt|j|kr| |j” |
 |” q@|	s~|j	r@|
 |” q@ fdd|
D }
|  
|
|” q*|D ]}|  |j|” |  ||” q®|D ]4}|  ||” |  ||” |  ||” |  ||” qŅd S )Nc                    s   g | ]}| kr|qS r%   r%   )r   Śt©Zvtabslot_entriesr%   r&   r   ä  s      z8ModuleNode.generate_type_definitions.<locals>.<listcomp>)Ś!generate_objstruct_predeclarationr[   rE  r   Ś	is_ctuplerO  ru   r;  rG   r   r§   Śgenerate_objstruct_definitionŚgenerate_typeobj_predeclarationŚgenerate_exttype_vtable_structŚ$generate_exttype_vtabptr_declarationŚ*generate_exttype_final_methods_declaration)rC   r5   r  rR  rS  r  r]   Zctuple_namesr   Ś
definitionr   r%   rX  r&   Śgenerate_type_definitionsŌ  s0    


z$ModuleNode.generate_type_definitionsc           
      C   są   |d }|  d” |  d” ddd |D krV|  d” |  d” |  d	” |  d
” |  ||”\}}|  |||||” |d }|D ]V}||k}	|  d” |  d|j ”  ” |  |||	|” |  |||	” |  |||	” q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;r   Zmodule_declarationsz!/* Module declarations from %s */)r¦   rT  ra  rĮ   r±   Śgenerate_c_class_declarationsŚgenerate_cvariable_declarationsŚgenerate_cfunction_declarations)
rC   r5   r  rµ   ŚtypecoderR  rS  Z
modulecoder   Zdefined_herer%   r%   r&   r	  ļ  s0    





    ’
z,ModuleNode.generate_declarations_for_modulesc                 C   s   |   t |d”” d S )Nrņ   )r’   r	   r   )r  ru   r%   r%   r&   Ś_put_setup_code  s    zModuleNode._put_setup_codec                 C   sN  |  ”  |r@| d” | tj|ddd” | d” | d” | d” | d” | d	” |  |d
” t|j ” tj	dD ]}|j
|jkr~| |” q~| d” | d” | d” | d” | d” |jd  d” ddlm} | d| dd” d” | dt| ” | dtj|jjk ” |j t dd”” |  |d” |jjjrf|  |d” n|  |d” |  |d ” |  |d!” d"tj d#tj d$tj d%tj d&tj d'tj d(}d)tj d#tj  d*}	d+}
|j!d k	ršt"|j!}
| d,” | d-|
 ” | d.” | d/” | d0” | d.” | d1” | ||	 ” | d” | |d ” | d.” | d2” | d3” | d” |  #|| $” ” | d” | d4|  %tj&|” ” | d4|  %tj'|” ” | d5” | j(|||d6d7 | d” | d8” | d9” | d.” | d” |j)d: r`| d” | d;” | d<” | d.” | d” |j)d= }|j)d> }|d?kr|st*| j+d@ | dAt"|dBk ” | dCt"|dDk ” |dEkrÜ| dF| d” |dGkrģdH}n|dIkrüdJ}n| ,” }| dK| dL” | dM| dN” | -t .dOdP”d+ ” | t /dQdR”” t0j1 2|” t0j1 3|” t0j4 3|” | -t5j6” |  |dS” | d” | dT” | dU|j7 ” t8j9d k	rĢ| dVtj: ” | d.” | dWtj ” | dXtj ” | dYtj;tj<f ” | dZtj ” | t /d[d”” t=|rJ| t /d\d]”” d S )^Nz/* 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©rH  z#ifndef Py_PYTHON_Hzg    #error Python headers needed to compile C extensions, please install development version of Python.z!#elif PY_VERSION_HEX < 0x03080000z'    #error Cython requires Python 3.8+.ś#elser   z#endif /* Py_PYTHON_H */r   )Ś__version__z#define __PYX_ABI_VERSION "r   Ś_ś"z#define CYTHON_HEX_VERSION %sz!#define CYTHON_FUTURE_DIVISION %dZCythonABIVersionrņ   ZCModulePreambleZCppInitCodeZ	CInitCodeZPythonCompatibilityZMathInitCodez/#define __PYX_MARK_ERR_POS(f_index, lineno)  { ś = z[f_index]; (void) z; z = lineno; (void) z;%s (void) z; }r)  ś;r   z)#ifndef CYTHON_CLINE_IN_TRACEBACK_RUNTIMEz*#define CYTHON_CLINE_IN_TRACEBACK_RUNTIME r   z!#ifndef CYTHON_CLINE_IN_TRACEBACKzC#define CYTHON_CLINE_IN_TRACEBACK CYTHON_CLINE_IN_TRACEBACK_RUNTIMEz#if CYTHON_CLINE_IN_TRACEBACKz.#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 1Śc_string_typeŚc_string_encoding)ŚbytesŚ	bytearrayzGa default encoding must be provided if c_string_type is not a byte typez/#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII Śasciiz.#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 Śutf8)rv  rw  z'#define __PYX_DEFAULT_STRING_ENCODING "ru  Z	ByteArrayr3  ZUnicodez*#define __Pyx_PyObject_FromString __Pyx_PyZ_FromStringz1#define __Pyx_PyObject_FromStringAndSize __Pyx_PyZ_FromStringAndSizeZTypeConversionszTypeConversion.cZFormatTypeNamezObjectHandling.cZPretendToInitializeś#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 * const %s = %s;zstatic const char *%s;ZFastTypeChecksZPythranConversionzCppSupport.cpp)>r¢   r¦   ŚjsonŚdumpsrg  rm   rS   rT   r   ŚsortkeyŚlocationZINITIALr
  rµ   r:   rl  rĀ   r   r   Śdivisionr  Zfuture_directivesrh   r	   r   r6   Zcplusr   Zfilename_cnameŚfiletable_cnameZlineno_cnameZclineno_cnameZline_c_macror0   ŚintrŖ   r«   r£   r¤   r©   rØ   r4   r   rM   ŚtitlerČ   rĒ   ri   r   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    )rC   r5   r6   r8  Śmetadatar  rW   rl  Zmark_errpos_codeZ
cline_infoZdefault_cline_runtimerr  rs  Zc_string_func_namer%   r%   r&   rų   
  sŌ    










’
’4’


































z#ModuleNode.generate_module_preamblec                 C   sŚ   t j}| d” | d| ” | d| ” | d| ” | d” | d| ” | d” | d| ” | d	” | d
” |r| d| ” n:| d” | d| ” | d” | d| ” | d” | 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
    #endifrk  z    #define %s extern "C++"z  #ifdef __cplusplusz    #define %s extern "C"z  #elsez    #define %s externz  #endifr   )r   r»   r¦   )rC   r  r«   ru   r%   r%   r&   rŖ     s&    







z-ModuleNode.generate_extern_c_macro_definitionc                 C   s"   |  d” |  d” |  d” d S )Nz#ifndef DL_IMPORTz  #define DL_IMPORT(_T) _Tr   )r¦   ©rC   r  r%   r%   r&   r¬   ¶  s    

z#ModuleNode.generate_dl_import_macroc                 C   sb   t |j ” tjdD ]:}|j|jkr4|rN| |” q|j|jkr|r| |” q|r^| 	d” d S )Nrj  z#include <omp.h>)
rm   rS   rT   r   r{  r|  ZEARLYr
  ZLATEZputln_openmp)rC   r5   r8  r  rš   rq  rW   r%   r%   r&   rØ   »  s    zModuleNode.generate_includesc                 C   s   ddl m}m} | d” | dtj ” |jjr|jjD ]D}| ” }||rV| 	” }t
 |” ” }t|}| d| ”  ” q:n
| d” | d” d S )Nr   )Śisabsr   r:   z!static const char* const %s[] = {ś%s,Ś0ś};)Śos.pathr  r   r¦   r   r~  rµ   Zfilename_listZget_filenametable_entryŚget_descriptionŚpathlibŚPathŚas_posixr"   r±   )rC   r  r  r   rī   Ś	file_pathZescaped_filenamer%   r%   r&   r  Ę  s    

z"ModuleNode.generate_filename_tablec                 C   s   d S r!   r%   ©rC   r5   r  r%   r%   r&   Śgenerate_type_predeclarationsŁ  s    z(ModuleNode.generate_type_predeclarationsc                 C   s  |D ]h}|j s|j}|jrq|js(|jr6|  ||” q|jrZ|jsZ|jrZ|  |jj	|” q|j
r|  ||” q|D ]}|j sr|j}|jr|  ||” qr|js¢|jr°|  ||” qr|jrÄ|  ||” qr|jrč|jsč|jrč|  |jj	|” qr|jrü|  ||” qr|j
rr|  ||” qrd S r!   )rP  r[   Z
is_typedefZis_struct_or_unionŚis_cpp_classŚ$generate_struct_union_predeclarationrZ  Śis_fusedrO  Zstruct_entryrQ  rY  Śgenerate_typedefrr   rs   Śgenerate_enum_definitionŚ generate_struct_union_definitionŚgenerate_cpp_class_definitionr[  )rC   r   r  r]   r[   r%   r%   r&   r§   Ü  s4    z$ModuleNode.generate_type_header_codec                 C   sZ   |  d” |jD ]D}|j}|js|j}| d”r>|dd  }n|}|  d||f ” qd S )Nr:   Z__pyx_é   z!typedef struct %s __pyx_gcc33_%s;)r¦   rY   r[   Śtypedef_flagrN  r   )rC   r5   r  r]   r[   ru   r  r%   r%   r&   Śgenerate_gcc33_hackž  s    


 ’zModuleNode.generate_gcc33_hackc                 C   sn   |j j}|j}|jrD|jsDz|jd }W qH tk
r@   |}Y qHX n|}| |j” | 	d| 
|j” ” d S )NZnumeric_typedefsztypedef %s;)r[   Ztypedef_base_typer*   Z
is_numericZis_cpp_class_scoperµ   ŚKeyErrorŚmark_posrM   r¦   r¼   r½   )rC   r]   r  rC  Zenclosing_scopeŚwriterr%   r%   r&   r    s    zModuleNode.generate_typedefc                 C   s(   |j rd|||||f S d||f S d S )Nz%s %s;
typedef %s %s %s;r¹   )r  )rC   r[   Śkindru   r%   r%   r&   Śsue_predeclaration  s       žzModuleNode.sue_predeclarationc                 C   sN   |j }|jr2|jr2| dd dd |jD ” ” | |  ||j|j”” d S )Nztemplate <typename %s>z, typename c                 S   s   g | ]}|  ” qS r%   ©rą   ©r   ŚTr%   r%   r&   r   %  s     zCModuleNode.generate_struct_union_predeclaration.<locals>.<listcomp>)r[   r  Ś	templatesr¦   r  r¢  r”  r½   ©rC   r]   r  r[   r%   r%   r&   r  !  s    
’z/ModuleNode.generate_struct_union_predeclarationc                 C   s   d||f }d}||fS )Nz%s %s {r  r%   )rC   r[   r”  ru   ŚheaderŚfooterr%   r%   r&   Śsue_header_footer(  s    zModuleNode.sue_header_footerc                 C   s  |  |j” |j}|j}|r|j}|jo.|j}|rNd|jdf }|j t	” |  
|||j”\}}|r| d” | d” | d” | d” | d” | |” |j}	|	D ]}
| d|
j |
j” ” q¬| |” |r| d” | d	” | d” | d
” | d” d S )Nz%s %sZ__Pyx_PACKEDz#if defined(__SUNPRO_C)z  #pragma pack(1)z#elif !defined(__GNUC__)z  #pragma pack(push, 1)r   ś%s;z  #pragma pack()z  #pragma pack(pop))r  rM   r[   r*   r”  Z	is_structŚpackedrµ   rh   Śpacked_struct_utility_coderŖ  r½   r¦   r   r¼   )rC   r]   r  r[   r*   r”  r¬  rØ  r©  r   Śattrr%   r%   r&   r  -  s<    ’





’




z+ModuleNode.generate_struct_union_definitionc           
      C   s¬   |r|  d|jd |”f ” |p.|o.|jj }|r<| ”  |rX|D ]}	|j|	dd qD|rv|  d|jd |”f ” |r| ”  |  d” n|  d|jd |”f ” d S )Nz%s(%s) {ś, F©Śnannyz%s(%s);r   )r¦   r½   r  r[   ZnogilŚput_ensure_gilŚput_init_var_to_py_noneŚput_release_ensured_gil)
rC   Ś	arg_declsŚ	arg_namesŚis_implementingŚpy_attrsŚconstructorr[   r  Z	needs_gilr®  r%   r%   r&   Śgenerate_cpp_constructor_codeL  s    z(ModuleNode.generate_cpp_constructor_codec              
   C   s
  |  |j” |j}|j}|r|jrD| dd dd |jD ” ” | d|j ” |j	r~d dd |j	D ”}| d| ” | d	” |  
|j|” d
d |j ” D }d}d }d }	|jD ]x}
|
jjrÜ|
jjrÜ| d” n@|
jdkrņ| d”}n*|
jdkr|
}	n|
jjr| d” d}| d|
j |
j” ” q¼d|jjk}|sN|r|r | ” D ] }g }g }|jjd t|jj|jj  D ] }| | ” ” | |j” q|jjrÖ| |jj tj”” | tj” |säd}g }|  |||||||” q\ng }g }|  |||||||” |	s0|s0|r¾|r@| d” |r®| d|j ” |rd|  ”  |	rz| d|	j ” |r¢|D ]}
|j!|
dd q| "”  | d” n| d|j ” |rü|rŠ| d|j|jf ” |  ”  |jD ]4}
|
jjsī| d|
j|
jf ” |j#|
dd qī| "”  | d” | d|j|jf ” | d” |  ”  |jD ]B}
|
jjsd|j!|
dd | d|
j|
jf ” |j#|
dd qd| "”  | d” | d” | d” n,| d|j|jf ” | d|j|jf ” | d” d S ) Nztemplate <class %s>z, class c                 S   s   g | ]}|  ” qS r%   r£  r¤  r%   r%   r&   r   d  s     z<ModuleNode.generate_cpp_class_definition.<locals>.<listcomp>ś	struct %sz	, public c                 S   s   g | ]}|  ” qS r%   r£  )r   Z
base_classr%   r%   r&   r   i  s     z : public %sz {c                 S   s   g | ]}|j jr|js|qS r%   )r[   Śis_pyobjectŚis_inherited)r   r(  r%   r%   r&   r   m  s     ’Fzstatic z<init>z<del>zvirtual Tr«  rö   z~%s() {z%s();r°  r   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);r  )$r  rM   r[   r*   r¦  r¦   r  rČ   r½   Zbase_classesr§   r   rn   rT   r   Zis_cfunctionZis_static_methodru   Ślookup_herer¼   rµ   r”   Zall_alternativesZoriginal_argsŚlenŚargsZoptional_arg_countrG   Zop_arg_structr   Zoptional_args_cnamerŗ  r²  Zput_var_xdecrefr“  Zput_var_incref)rC   r]   r  r[   r*   Zbase_class_declrø  Zhas_virtual_methodsr¹  Z
destructorr®  r·  Zconstructor_alternativerµ  r¶  ŚargZdefault_constructorr%   r%   r&   r  ]  sø    
’’




’










z(ModuleNode.generate_cpp_class_definitionc                 C   s   |  |j” |j}|jp |jp d}|jjr.dnd}|  |||”\}}| |” |j}|sft	|jd n|d }	|D ]}
|
j
d k	rr|
j
 |” qr|D ]X}
|
j
d kr²|
j d”d }nd|
j d”d |
j
 ” f }|
|	k	rą|d7 }| |” q| |” |jjr|jjr| 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  rM   r[   r½   ru   rs   rŖ  r¦   Śenum_valuesr   Z
value_nodeZgenerate_evaluation_codeŚsplitr   rr   r  )rC   r]   r  r[   ru   r”  rØ  r©  rÄ  Z
last_entryZvalue_entryZ
value_coder%   r%   r&   r  Ą  s6    


ž


z#ModuleNode.generate_enum_definitionc                 C   sr   |  d” |jj}|rn|jdkrF|jsF|  dtjt dd”|f ” n(|jdkrn|  dtjt dd”|f ” d S )Nr:   Śexternrę   rē   rč   r   Ś	DL_EXPORT)	r¦   r[   rÜ   r   rP  r   r»   r   ré   )rC   r]   r  ru   r%   r%   r&   r\  ć  s    

ż


żz*ModuleNode.generate_typeobj_predeclarationc                 C   s®   |j s
d S | |j” |j}|j}|  |” |jrŖ| d” | d|j ” |jrr|jjrr| d|jjt	j
f ” |jD ]&}|jsx| d|j d|j ” ” qx| d” d S )Nr:   zstruct %s {zstruct %s %s;r«  z(*%s)r  )rO  r  rM   r[   r*   Śspecialize_fused_typesrL  r¦   rC  r   Śobj_base_cnamer   r½  r¼   r½   )rC   r]   r  r[   r*   Śmethod_entryr%   r%   r&   r]  õ  s$    

ž
z)ModuleNode.generate_exttype_vtable_structc                 C   s<   |j s
d S | |j” |j}|jr8| d|j|jf ” d S )Nzstatic struct %s *%s;)rO  r  rM   r[   Śvtabptr_cnamer¦   rL  r§  r%   r%   r&   r^    s    žz/ModuleNode.generate_exttype_vtabptr_declarationc                 C   sb   |j s
d S | |j” |jjjD ]<}|js |jr |j |j”}| 	|j
”}| d||f ” q d S )Nzstatic %s%s;)rO  r  rM   r[   r*   r   r½  Zfinal_func_cnamer¼   Śbuild_function_modifiersŚfunc_modifiersr¦   )rC   r]   r  rŹ  ZdeclarationŚ	modifiersr%   r%   r&   r_    s    ’z5ModuleNode.generate_exttype_final_methods_declarationc                 C   s$   |j s
d S | |  |d|j”” d S )NŚstruct)r*   r¦   r¢  rN  )rC   r[   r  r%   r%   r&   rY  %  s    z,ModuleNode.generate_objstruct_predeclarationc           
      C   s,  |  |j” |jsd S |  |d|j”\}}| |” |j}|rn|j}|dkrPd}| dd|j |tj	f ” n
| d” |j
r¢|jr|jj
s¢| d|j|j
f ” |jjD ]P}|jrŗt}n|j}|jrŌ| |j”}	n| |j”}	|j |” | d|	 ” qŖ| |” |jd k	r(| d	|j|jf ” d S )
NrĻ  rē   ZPyHeapTypeObjectz%s%s %s;)śstruct r:   ZPyObject_HEADzstruct %s *%s;r«  ztypedef struct %s %s;)r  rM   r*   rŖ  rN  r¦   rC  r  r   rÉ  Śvtabslot_cnamerL  r   Śis_declared_genericr   r[   Śis_cpp_optionalŚcpp_optional_declaration_coder½   r¼   Śuse_entry_utility_codeZobjtypedef_cname)
rC   r[   r  rØ  r©  rC  Zbasestruct_cnamer®  Z	attr_typeŚdeclr%   r%   r&   r[  *  sP    ’
ż’’ž’
z(ModuleNode.generate_objstruct_definitionc           
      C   s²   |d }|d }|d }|  ” }|jD ]}	|s4|	jr&| d|	jj ” | d|	jj ” | d|	jj ” |	jjd k	r&| d|	jj ” | d|	jj ” | d|	jj ” q&d S )Nrń   ró   rō   śPyTypeObject *%s;ś!Py_CLEAR(clear_module_state->%s);z$Py_VISIT(traverse_module_state->%s);śPyObject *%s;)Śinsertion_pointrY   r   r¦   r[   rŪ   rÜ   )
rC   r5   r  r`  rµ   rń   ró   rō   Zmodule_state_typeobjr]   r%   r%   r&   rc  V  s:    

’’’’’’’’z(ModuleNode.generate_c_class_declarationsc           
      C   sv  |j r
d S |jD ]^}|js|js|jdkr:|js:|js:qd }d }d }|jdkr\tj}d}nJ|jdkr|tj}|rvd}q¦d}n*|jdkr¦d}d }|j	d k	r¦|j
 |j	”}|j
}|j}	|jrą|sąd}d }t|}| tj|j”}	d}|rņ| d| ” |jr| |j|	|d	” n| |j|	|d	” |d k	r<| d
| ” | d” |j|	krf| d|j|	f ” | |” qd S )NŚprivaterĘ  rč   r   rĒ  Śstaticr   z%s ©Śdll_linkageś = %srp  rĶ   )Zis_cython_builtinr   rP  Z
in_closurer   r   rO  r   r»   Śinitr[   Śliteral_coder½   r   rŻ   Śvarptr_prefixru   rČ   rÓ  rŌ  r¼   Śput_safer¦   rÕ  )
rC   r5   r  r`  r]   Śstorage_classrŽ  rą  r[   r½   r%   r%   r&   rd  m  sh    ’’’




 ’
 ’

z*ModuleNode.generate_cvariable_declarationsc                 C   sJ   |j D ]>}tjo|jdk }|js6|jdks6|js6|rt|||| qd S )NrĘ  r   )r   r   Ścimport_from_pyxr   rO  r   Śgenerate_cfunction_declaration)rC   r5   r  r`  r]   Zfrom_pyxr%   r%   r&   re     s    
’žżz*ModuleNode.generate_cfunction_declarationsc                 C   sd   |j D ]X}|js|jdkr| |j |j”” |jd k	rT|j |j”}| 	d| ” | 
d” qd S )Nr   rß  rp  )r   rP  r   rČ   r[   r¼   r½   rą  rį  rć  r¦   )rC   r5   r  r]   rą  r%   r%   r&   rū   ©  s    

z(ModuleNode.generate_variable_definitionsc                 C   sp  |j }|jD ]\}|jdkr|j}|j}|r|  ||” |  |||” |  ||” |  ||” | 	” r|  
|||” | ” r|  |||” | dg”r¢|  ||” | ddg”r¼|  ||” | dddg”rät| jdd	 | d
” | ddg”r |  ||” | ddg”r|  ||” | ddg”r8|  ||” | dg”rR|  ||” | ddg”rn|  ||” |js|js| dg”r|  ||” | tj”r“|  ||” nd|jkrĪt|j jd t !|j"j”j#D ].}|j$rŽ| |j%”rŽ|  &||||j” qŽ|  '||” |  (||” |  )||” | d” |  *||” | d” |  +|||” | d” qd S )NrĘ  Ś__getitem__Ś__setitem__Ś__delitem__Z__getslice__Z__setslice__Z__delslice__z__getslice__, __setslice__, and __delslice__ are not supported by Python 3, use __getitem__, __setitem__, and __delitem__ insteadr   zN#error __getslice__, __setslice__, and __delslice__ not supported in Python 3.Ś__getattr__Ś__getattribute__Ś__setattr__Ś__delattr__Ś__get__Ś__set__Ś
__delete__Ś__dict__Śtotal_orderingśMtotal_ordering directive used, but no comparison and equality methods definedz#if CYTHON_USE_TYPE_SPECSrk  r   ),rĮ   rY   r   r[   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   rM   r¦   Zgenerate_ass_slice_functionŚgenerate_getattro_functionŚgenerate_setattro_functionŚgenerate_descr_get_functionŚgenerate_descr_set_functionŚis_closure_class_scopeŚis_defaults_class_scopeŚdefines_anyŚgenerate_dict_getter_functionr   Śrichcmp_special_methodsŚgenerate_richcmp_functionr4   Ś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)rC   r5   r  rZ   r]   r[   r*   Śslotr%   r%   r&   rü   ²  sj    
ž
’

z'ModuleNode.generate_typeobj_definitionsc                 C   s&   |j }|jr"| d|j|jf ” d S )Nzstatic struct %s %s;)r  Śvtable_cnamer¦   rL  ©rC   r*   r  r[   r%   r%   r&   rō  ī  s    žz"ModuleNode.generate_exttype_vtablec                 C   s&   |j }| d| d”| ” f ” d S )Nz%s = (%s)o;Śp)r  r¦   r¼   rą   r  r%   r%   r&   Śgenerate_self_castö  s    ž’zModuleNode.generate_self_castc              	      s  t  dd”}  d”}|  ”|kr(d S  j}|j}  ” \}\}	}
} jj} jrXg }	 fdd j	D }  
d”}|r|jsd }|s|r|jsd}nd}|r¦d}n j dd”}  tj”}  tj”}|r"|jd	 }| d” | d
” | d j |”|f ” | d| ” | d” |j tjdd| d| ddd |jpb|
pb|pb|	pb|}|r| d j d” ” |rŅt   |”}|j}|jsŖ| |”}|d krĄd| d}| d| ” n@| d” | d” | d” | d” | d” |rČ|j t dd”” |r*d}nd}|jddd }| d
” | d!| |”||f ” | d"| |”| |”f ” | d#| ” | d$”    ” rŖ| d%” | d&” | d” | d'” |sŲ| d(” | d)” |s| d*” | d+tj!tj"f ” | d,” | d-” |r2|s2| d,” |sB| d” |r\| d.| #d/” ” d0}|jrŗ|}|jr|jj$r|j}ql||k	rd1|j$ }nd}| d2|j||j%f ” |D ]}|j&j'||d3d4 q¾|	D ]>}|j(d5krd}| )d6|j*|j*f ” n|j+|d7d0d8 qÜ|D ]&}| d9|j* ” | d:|j* ” q |
D ]}| d;|j* ” qL|j*d<krz| d=” |r¼|jr d>tj! d?tj" d@}ndA}d}| dB|j,|f ” | dC” |rš| dD” |j-d/t.d0d8 | dE” | d,” | /”  d S )FNŚtp_newZ	__cinit__c                    s   g | ]}|j   ”r|qS r%   )r[   Śneeds_explicit_constructionr   rA   r%   r&   r     s   ’z4ModuleNode.generate_new_function.<locals>.<listcomp>r:   śCYTHON_UNUSED r   ŚfreelistZmodule_state_contentsś#if CYTHON_USE_FREELISTSz%s[%d];zint %s;r   zPyTypeObject *t, zPyObject *a, zPyObject *kT)Zneeds_prototyper«  r  z__Pyx_PyType_GetSlot(z, 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);rk  ZIncludeStringHśStringTools.czU & (int)(!__Pyx_PyType_HasFeature(t, (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))©Z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);śPyObject_GC_Track(o);ś} elseŚ{zBif (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) {zo = (*t->tp_alloc)(t, 0);ś} else {z8o = (PyObject *) PyBaseObject_Type.tp_new(t, %s->%s, 0);r   zif (unlikely(!o)) return 0;zp = %s;ŚoFz(struct %s*)zp->%s = %s%s;śp->©Zextra_access_coderń  z5p->%s = PyDict_New(); if (unlikely(!p->%s)) goto bad;śp->%sr°  zp->%s.data = NULL;zp->%s.memview = NULL;zp->%s.obj = NULL;Ś__pyx_memoryviewslicezp->from_slice.memview = NULL;zo, z->z, NULLzo, a, kz#if (unlikely(%s(%s) < 0)) goto bad;z	return o;rŁ   zreturn NULL;)0r   ŚConstructorSlotŚmangle_internalŚ	slot_coder  rC  Śget_refcounted_entriesŚis_final_typeZis_internalr   r¾  Ś
is_specialZtrivial_signaturer4   rD  r   Śfreelist_nameŚfreecount_namerµ   r¦   r¼   Śstart_slotfuncr   Śpy_objptr_typerŃ  Śget_base_slot_functionrŪ   Śis_builtin_typeŚname_in_slot_module_staterh   r	   ri   rų  Śmodulestateglobal_cnameŚempty_tupleŚ	cast_coderL  rĖ  r[   Śgenerate_explicit_constructionru   rČ   r½   r³  Ś
func_cnameŚput_decref_clearr   Śexit_cfunc_scope)rC   r*   r  Ścclass_entryŚtp_slotŚ	slot_funcr[   rC  Śhave_entriesrø  Ś
py_buffersŚmemoryview_slicesr'  Zexplicitly_constructable_attrsZcinit_func_entryZunused_markerŚfreelist_sizer)  r*  rń   Zneed_self_castr  Zbase_type_typeptr_cnameŚtype_safety_checkZ
obj_structZneeds_error_cleanupZvtab_base_typeZstruct_type_castr]   Z
cinit_argsr%   rA   r&   rõ  ż  s@   
’
’





ž
   ž’ž







’
  ’’ž








 ’





 ž  ’
 ’

 ’’

’z ModuleNode.generate_new_functionc                 C   sŠ   t  d|j”}| d”}| |”|kr*d S | d”}|d ksB|jsFd S | d” |jrf| d|j ” |j	|t
jdddd | d” | d	” | d
|j ” | d” | d” | ”  |jrĢ| d” d S )NZtp_finalizeŚ__del__r:   z#if %sśPyObject *oF©Zneeds_funcstateśPyObject *etype, *eval, *etb;ś!PyErr_Fetch(&etype, &eval, &etb);ś%s(o);ś PyErr_Restore(etype, eval, etb);r   r   )r   Śget_slot_by_namer4   r$  r%  r¾  r(  r¦   Z
used_ifdefr+  r   rw   r4  r6  )rC   r*   r  r8  Śslot_func_cnamer]   r%   r%   r&   rö  ¢  s&    






z ModuleNode.generate_del_functionc              	      sV  t  dd”}  d”} jj}|  ”|kr0d S   d”}|  tjdd”  jj	}  
” }  ” }	 jsz jsz  d”nd }
|
 jkrd }
 js¢ js¢  d”nd }| jkr“d }  ” \}\}}} fdd jD }|sī|sī|sī|
sī|rś|   |” |r
  ” rh| d” |r d	}nd
}| d| ” | d| ” | d” | d” | d” | d” |rx| d” |	r |j t dd”” | d| ” |
r°| d” |   |” |rĢ| d” |D ]}|jj||dd qŠ|| D ]"}|jd|j |jdddd qņ|r|j}|js4| |”}t    |”}|d k	r~|rn|j!rn|j! 
” rn| d” | d| ” n|jrŗ|rŖ|j!rŖ|j! 
” rŖ| d” | d| ” n\|rĪ| d| ” | d ” | d!||f ” | d” | d"| ” |j t d#d”” n j" #d$d%”}|rŠ  t$j%”}  t$j&”}|rRd&}nd'} j}| d(” | d)| |”||j'd&dd*|f ” | d+| |”| |”| (d,”f ” | d-” | d” | d.” | d/” | d0” | d1” | d.” | d2” | d3” | d” | d” |r0| d” |	r@| d4” | d” | )”  d S )5NŚ
tp_deallocŚ__dealloc__r@  Ś__weakref__rń  c                    s   g | ]}|j   ”r|qS r%   )r[   Śneeds_explicit_destructionr   rA   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))z¬if (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   r   zPyObject_GC_UnTrack(o);Z
PyTrashcanśExtensionTypes.cz__Pyx_TRASHCAN_BEGIN(o, %s)z.if (p->__weakref__) PyObject_ClearWeakRefs(o);z+if (p->__dict__) PyDict_Clear(p->__dict__);r  r   r!  FT)r±  Śclear_before_decrefZhave_gilr  rD  z4__Pyx_PyType_GetSlot(%s, tp_dealloc, destructor)(o);z+if (PyType_IS_GC(%s)) PyObject_GC_Track(o);rx  zIif (likely(%s)) __Pyx_PyType_GetSlot(%s, tp_dealloc, destructor)(o); elsez"__Pyx_call_next_tp_dealloc(o, %s);ZCallNextTpDeallocr  r   r:   z^ & (int)(!__Pyx_PyType_HasFeature(Py_TYPE(o), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))r  zIif (((int)(%s < %d) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(%s))%s)) {r  z%s[%s++] = %s;r  r  r  ś#if CYTHON_USE_TYPE_SLOTSś(*Py_TYPE(o)->tp_free)(o);rk  śDfreefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free);śif (tp_free) tp_free(o);Z__Pyx_TRASHCAN_END)*r   r#  r$  r  rC  r%  r+  r   rw   r'  rų  Śneeds_trashcanr  r  r¾  r   r&  r  Zmay_have_finalizer¦   rµ   rh   r	   ri   Śgenerate_usr_dealloc_callr[   Śgenerate_explicit_destructionŚput_xdecref_clearr½   rŪ   r.  r/  r-  r*   r4   rD  r   r)  r*  r¼   r2  r6  )rC   r*   r  r8  r9  rC  rG  r'  rų  rR  Zweakref_slotZ	dict_slotrm  rø  r<  Zexplicitly_destructable_attrsZfinalised_checkr]   Ś
base_cnamerH  r=  r)  r*  r>  r[   r%   rA   r&   r÷  »  sų    




’
’ž’





’

 ’




	
 ’

’’
ü’ż












’z$ModuleNode.generate_dealloc_functionc                 C   sr   |  d”}|r|jsd S | d” | d” | d” | d” | d|j ” | d” | d” | d	” d S )
NrI  r  rB  rC  z&__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);rD  z&__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);rE  r   )r¾  r(  r¦   r4  )rC   r*   r  r]   r%   r%   r&   rS  `  s    







z$ModuleNode.generate_usr_dealloc_callc                 C   sr  t  d”}| d”}|jj}| |”|kr.d S | |tjdd” |j	dd\}\}}	}
| }d}| 
d” |sr|	r~|  ||” |rtt  ||”}|r¤| 
d| ” nŠ|jrę|j}| 
d” | 
d| d	” | 
d
” | 
d” d}n| |j”}| 
d” | 
d” | 
d| ” | 
d| d	” | 
d” | 
d” | 
d” | 
d| ” | 
d” |j t dd”” d}|s|rŹ| 
d” | 
dt|  d” | 
d” | 
d” |j t dd”” |D ]F}d|j }t t|j|”}| 
d| ” | 
d| ” | 
d” qĪ|	D ]6}|jd }| 
d| ” | 
d| ” | 
d” q| 
d ” | 
d” | ”  d S )!NZtp_traversez!PyObject *o, visitproc v, void *aF©Zinclude_gc_simplezint e;z!e = %s(o, v, a); if (e) return e;r  z-traverseproc traverse = __Pyx_PyType_GetSlot(z, tp_traverse, traverseproc);z>if (!traverse); else { e = traverse(o,v,a); if (e) return e; }r   Trx  ze = 0;śif (likely(%s)) {z(if (traverse) { e = traverse(o, v, a); }r  r   z1{ e = __Pyx_call_next_tp_traverse(o, v, a, %s); }zif (e) return e;ZCallNextTpTraverserL  z e = __Pyx_call_type_traverse(o, z, v, a);ZCallTypeTraverser!  ś	if (%s) {z!e = (*v)(%s, a); if (e) return e;z.objzif (p->%s) {z$e = (*v)(p->%s, a); if (e) return e;rŲ   )r   ZGCDependentSlotr$  r  rC  r%  r+  r   Śc_returncode_typer&  r¦   r  r-  r.  rŪ   r/  rµ   rh   r	   ri   r  r½   Śtypecastr   r[   r6  )rC   r*   r  r7  r8  r9  rC  r:  rø  r;  r<  Zneeds_type_traverseZmaybe_needs_type_traverseŚstatic_callrV  r]   Zvar_codeZvar_as_pyobjectr½   r%   r%   r&   rł  p  s    


’


’





’




’



’



z%ModuleNode.generate_traverse_functionc                 C   sL  t  d|j”}| d”}|jj}| |”|kr2d S |jdd\}\}}	}
|sT|	sT|rZd}nd}| |t	j
d| d” |rtjr| d” |s|	r|  ||” |rzt  ||”}|rÄ| d| ” n¶|jr|j}| d	” | d
| d” | d” | d” nv| |j”}| d” | d| ” | d
| d” | d” | d” | d” | d| ” |j t dd”” tjrŽ|D ]T}d|j }| d| ” |jr¼|j|tdd n|j||jdd | d” qn|D ]}| d|j ” qā|	D ]}| d|j ” qž|jdkr,| d” | d” | d” | ”  d S )NZtp_clearFrW  r:   r  r@  zPyObject* tmp;rD  r  z%inquiry clear = __Pyx_PyType_GetSlot(z, tp_clear, inquiry);zif (clear) clear(o);r   rx  rX  r  r   z${ __Pyx_call_next_tp_clear(o, %s); }ZCallNextTpClearrL  r!  z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);rŲ   )r   rF  r4   r$  r  rC  r%  r&  r+  r   rZ  r   Zclear_to_noner¦   r  r-  r.  rŪ   r/  rµ   rh   r	   ri   r½   rŅ  Zput_init_to_py_noner   r[   r6  )rC   r*   r  r7  r8  r9  rC  r:  rø  r;  r<  Zunusedr\  rV  r]   ru   r%   r%   r&   rś  Ē  sj    

’









’



z"ModuleNode.generate_clear_functionc                 C   s   |j |tjdddd | d” | d” | d” | d” | d	” | d
” | d” | d” | d” | d” | ”  d S )NZsq_itemzPyObject *o, Py_ssize_t iFrA  zPyObject *r;z5PyObject *x = PyLong_FromSsize_t(i); if(!x) return 0;z_#if CYTHON_USE_TYPE_SLOTS || (!CYTHON_USE_TYPE_SPECS && __PYX_LIMITED_VERSION_HEX < 0x030A0000)z2r = Py_TYPE(o)->tp_as_mapping->mp_subscript(o, x);rk  zDr = ((binaryfunc)PyType_GetSlot(Py_TYPE(o), Py_mp_subscript))(o, x);r   zPy_DECREF(x);ś	return r;r   )r+  r   r,  r¦   r6  )rC   r*   r  r%   r%   r&   rū    s0    ’’
’


’’’z(ModuleNode.generate_getitem_int_functionc                 C   s8  |j j}| d”}| d”}| |tjdd” | d” |rN| d|j ” nP| d” |  |ddd	d
|” | d” | d” | d” | d” | d” | d” | d” |rČ| d|j ” nP| d” |  |ddd	d
|” | d” | d” | d” | d” | d” | d” | d” | 	”  d S )Nrč  ré  Zmp_ass_subscriptś%PyObject *o, PyObject *i, PyObject *vśif (v) {śreturn %s(o, i, v);z__Pyx_TypeName o_type_name;Ztp_as_mappingZobjobjargprocśo, i, vz=o_type_name = __Pyx_PyType_GetFullyQualifiedName(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);rŚ   r   śelse {śreturn %s(o, i);zJ  "Subscript deletion not supported by " __Pyx_FMT_TYPENAME, o_type_name);©
r  rC  r¾  r+  r   rZ  r¦   r4  Śgenerate_guarded_basetype_callr6  ©rC   r*   r  rC  Ś	set_entryŚ	del_entryr%   r%   r&   rü  .  s     

’’     ’’’’’’’’’’’     ’’’’’’’’z*ModuleNode.generate_ass_subscript_functionc                 C   s~   |rz|  |”}|r<| | d| d| d| d| d
” n"| | d| d| d| d” | d” | d| d” d S )Nz  f = __Pyx_PyType_TryGetSubSlot(rÆ  ś);z f = __Pyx_PyType_TryGetSlot(zif (f)z	return f()Ztypeptr_cname_in_module_stater¦   )rC   rC  Zsubstructurer  ZfunctyperĄ  r  Zbase_tpnamer%   r%   r&   re  f  s    
 ’’
z)ModuleNode.generate_guarded_basetype_callc                    s  |  d”rd S | |tjdd” | d” g }|j}|d k	r`|jjdks`| |j	” |j	jj
}q4||ksltd }|r|jjdkr|jr|n|jj
}d|jk}i  tjD ],}|D ]"}|  |”}	|	d k	r®|	 |<  q¦q®q¦|rX fddtD }
|
s*d	 krd
 krt|jjd nt|jjd d}n.d	 krPd
 krPt|jjd d}t|
}tjD ]&}| d” ” }  |”}	|	d kr|r^|dkrq^| d| ” |	d krj|s¼tt||f \}}}| d” | d | j ” | d” | d” | d” | d” |d k	r.|dkrV| d|r8dnd ” | d” | d” nF|dkr| d|rpdnd ” | d ” | d” ntd!|f d	 kr¬d	}n
d
}| }| d | j ” | d” | d"” | d” | d#” |r| d$” n
| d%” | d&” | d'” | d'” n&|r@| d(” n
| d)” | d&” | d'” | d*” n| d+|	j ” | d'” q^d	 kr$d
 kr$|s$| d,” | d” | d d	 j ” | d” | d-” | d” | d.” | d/” | d&” | d'” | d*” | d'” | d0” |rR|jrR| d1|j|jf ” | d2” | d'” | d'” | d'” | ”  d S )3NZ__richcmp__Ztp_richcomparez"PyObject *o1, PyObject *o2, int opzswitch (op) {rĘ  rņ  c                    s   g | ]\}}| kr|qS r%   r%   )r   Ś	from_nameZto_name©Z
comp_entryr%   r&   r     s      z8ModuleNode.generate_richcmp_function.<locals>.<listcomp>Ś__eq__Ś__ne__ró  z@total_ordering directive used, but no comparison methods definedFz=total_ordering directive used, but no equality method definedrm  )ZNEZ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;r8   zif (%s order_res) {z!!ś!zret = __Pyx_NewRef(Py_False);r  r9   r:   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  r]   r   rG   r*   rC  rK   rŪ   r4   r   r  ŚTOTAL_ORDERINGr   rM   ŚmaxŚstripŚupperrD  r4  r6  )rC   r*   r  Zclass_scopesŚclsZextern_parentrņ  Z
cmp_methodZclass_scoper]   Z
comp_namesZordering_sourceZcmp_typeZinvert_compZcomp_opZinvert_equalsZeq_funcr%   rk  r&   r  u  sŲ    




’’



































 ’



z$ModuleNode.generate_richcmp_functionc                    s®    |j”jd r4  d|j ”f ” d S |jjtjtj	fkrVd}d }n4|jjtj
tjfkrxd}dd}nt|d|  d S fd	d
 fdd}|jjrÜ|jjsÜt|d|jj|jjf    ”  | ” }|rś  |”   ” tt|jj}	tt|jj}
jj}jjrH  |”}  tjdd|j|	|
||jjdd||jjdd|||d
dd ”   ”  |rŖ  d” d S )NZc_api_binop_methodsrĪ   Ś
binaryfuncr:   Zternaryfuncz, extra_argz, PyObject* extra_argz"Unexpected type slot signature: %sc                    s      | ”}|r|jr|jS d S r!   )Ślookupr(  r4  )Śmethod_namer]   rA   r%   r&   Śget_slot_method_cname	  s    
zAModuleNode.generate_binop_function.<locals>.get_slot_method_cnamec                    s>   | }|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))Śname_in_module_stater  rŪ   )rv  rG  r4  ©r  Ś	extra_argŚ	func_namerw  r*   r%   r&   Ścall_slot_method	  s    
żżz<ModuleNode.generate_binop_function.<locals>.call_slot_methodzÅExtension 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	BinopSlotrL  F)rG  T)
r{  Ś	slot_nameŚoverloads_leftŚoverloads_rightZ	call_leftZ
call_rightŚ
type_cnameŚ	slot_typerz  Śextra_arg_decl)r  r   r   )r$  r}  r4   r¦   Z	left_slotr%  Ś	signaturer   rt  ZibinaryfuncZpowternaryfuncZipowternaryfuncr   rv  Z
right_slotr   Zpreprocessor_guard_codeŚenter_cfunc_scoper  Śboolr  rŪ   rQ  rx  r   rĒ   r6  )rC   r*   r  r  rM   r  r  r|  Zpreprocessor_guardr~  r  Zparent_type_cnamer%   ry  r&   r	  	  sj    

žž



 öžó’z"ModuleNode.generate_binop_functionc                    s°   d fdd	  d} d}|j tjdddd |d k	rP| d	|j ” n
| d
” |d k	r| d” | d” | d|j ” | d” | d” | d” | ”  d S )Nc                    sN   |d krj }|j | ”}|d krJ|jr4|d k	r4|S |jd k	rJ | |jS |S r!   )r  r*   r¾  Śis_externalrC  )Śnrb   Zextern_returnŚr©Ślookup_here_or_baser*   r%   r&   r  U	  s    
zBModuleNode.generate_getattro_function.<locals>.lookup_here_or_baserź  rė  Ztp_getattrozPyObject *o, PyObject *nFrA  zPyObject *v = %s(o, n);z,PyObject *v = PyObject_GenericGetAttr(o, n);z9if (!v && PyErr_ExceptionMatches(PyExc_AttributeError)) {zPyErr_Clear();zv = %s(o, n);r   z	return v;)NN)r+  r   r,  r¦   r4  r6  )rC   r*   r  Zgetattr_entryZgetattribute_entryr%   r  r&   rż  N	  sF    ’’’’’’’’’’z%ModuleNode.generate_getattro_functionc                 C   sŌ   |j j}| d”}| d”}| |tjdd” | d” |rN| d|j ” n|  |d ddd|” | d	” | d
” | d” |r| d|j ” n|  |d ddd|” | d” | d
” | d
” | 	”  d S )Nrģ  rķ  Ztp_setattroz%PyObject *o, PyObject *n, PyObject *vr_  zreturn %s(o, n, v);Zsetattrofunczo, n, vz(return PyObject_GenericSetAttr(o, n, v);r   rb  zreturn %s(o, n);z(return PyObject_GenericSetAttr(o, n, 0);rd  rf  r%   r%   r&   rž  |	  sl    

’’’     ’’’’’’     ’’’’z%ModuleNode.generate_setattro_functionc                 C   sn   |  d”}|j|tjdddd | d” | d” | d” | d	|j ” | d
” | d” | ”  d S )Nrī  Ztp_descr_getz%PyObject *o, PyObject *i, PyObject *cFrA  zPyObject *r = 0;zif (!i) i = Py_None;zif (!c) c = Py_None;zr = %s(o, i, c);r]  r   )r¾  r+  r   r,  r¦   r4  r6  )rC   r*   r  Zuser_get_entryr%   r%   r&   r’  £	  s.    
’’’’’’’z&ModuleNode.generate_descr_get_functionc                 C   sč   |j j}| d”}| d”}| |tjdd” | d” |rN| d|j ” n(|  |d ddd|” | d	” | d
” | d” | d” |r | d|j ” n(|  |d ddd|” | d” | d
” | d” | d” | 	”  d S )Nrļ  rš  Ztp_descr_setr^  r_  r`  Zdescrsetfuncra  ś6PyErr_SetString(PyExc_NotImplementedError, "__set__");rŚ   r   rb  rc  z9PyErr_SetString(PyExc_NotImplementedError, "__delete__");rd  )rC   r*   r  rC  Zuser_set_entryZuser_del_entryr%   r%   r&   r   ¾	  sx    

’’’     ’’’’’’’     ’’’’’z&ModuleNode.generate_descr_set_functionc                 C   sH   |j D ]<}|j}| dg”r(|  ||” | ddg”r|  ||” qd S )Nrī  rļ  r?  )Śproperty_entriesr*   r  Śgenerate_property_get_functionŚgenerate_property_set_function)rC   Zcclass_scoper  r]   Śproperty_scoper%   r%   r&   r
  é	  s    
z&ModuleNode.generate_property_accessorsc                 C   s\   |j }|j tj|j”|_| d”}| d” | d|j ” | d|j	 ” | d” d S )Nrī  r:   ś9static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {śreturn %s(o);r   )
r*   Śparent_scoperŻ   r   Zprop_get_prefixru   Śgetter_cnamer¾  r¦   r4  )rC   Śproperty_entryr  r  Z	get_entryr%   r%   r&   r  ń	  s(     ’

’’’’’z)ModuleNode.generate_property_get_functionc                 C   sŅ   |j }|j tj|j”|_| d”}| d”}| d” | d|j ” | d” |rh| d|j	 ” n| d” | d” | d	” | d
” |r¦| d|j	 ” n| d” | d” | d	” | d	” d S )Nrļ  r?  r:   z@static int %s(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {r_  zreturn %s(o, v);r  rŚ   r   rb  r  z6PyErr_SetString(PyExc_NotImplementedError, "__del__");)
r*   r  rŻ   r   Zprop_set_prefixru   Śsetter_cnamer¾  r¦   r4  )rC   r  r  r  rg  rh  r%   r%   r&   r  
  sh     ’


’’’’’’’’’’’’’’’z)ModuleNode.generate_property_set_functionc                 C   sd  |j }|j}t d|jj”}| ||” t d|jj”}| |”sb| d” | 	||” | d” |j
rp|j}n
d|j }|js| d”nd }|r|jrd }t|}	|	r~|j t dd”” | d	|j ” | d
” |rš| d||jf ” | d” | d” | d” |r~t|j}
|
 d}| d” | d” | d| d” | d” | d| d” | d” | d” | d|j ” t |jj”D ]}| ||” q|	rĘ| d|j ” | d” | d” |j ” }| d|j ” | d| j| dd”f ” | d| ” | d” | dt d|j” |” ” | d |j ” | d” d S )!NZ
tp_membersZtp_as_bufferz$#if !CYTHON_COMPILING_IN_LIMITED_APIr   r»  rJ  ZIncludeStructmemberHrņ   z#static PyMemberDef %s_members[] = {z#if !CYTHON_USE_TYPE_SLOTSzB{"__weaklistoffset__", T_PYSSIZET, offsetof(%s, %s), READONLY, 0},ś{0, 0, 0, 0, 0}r  zL: __weakref__ is unsupported in the Limited API when running on Python <3.9.zM#if CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX < 0x03090000z+#if defined(__GNUC__) || defined(__clang__)z
#warning "rn  r   z#pragma message("z")z!static PyType_Slot %s_slots[] = {z#{Py_tp_members, (void*)%s_members},z{0, 0},zstatic PyType_Spec %s_spec = {z"%s.%s",r:   zsizeof(%s),z0,r  Ztp_flagsz	%s_slots,)r[   r*   r   rF  rµ   r4   Zgenerate_substructure_specZis_emptyr¦   Śgenerate_substructurer  rN  r  r¾  r½  r  rh   r	   ri   rÜ   r½   r   rM   r  Zgenerate_specŚ
class_namer±   rZ   rĀ   r%  )rC   r]   r  Śext_typer*   Zmembers_slotZbuffer_slotŚ	objstructZweakref_entryZgenerate_membersŚpositionZweakref_warn_mesager  Ś	classnamer%   r%   r&   r  )
  sn    





’
’



’








z ModuleNode.generate_typeobj_specc                 C   sā   |j }|j}t |jj”jD ]}| ||” q| d” |j	dkrHd}nd}| ||j
 ” | d” |j ” }| d| j|f ” |jr|j}	n
d|j }	| d|	 ” | d	” t |jj”D ]}
|
 ||” qĀ| 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*/r»  zsizeof(%s), /*tp_basicsize*/z0, /*tp_itemsize*/r  )r[   r*   r   r  rµ   r4   Zsubstructuresr  r¦   r   rÜ   r  r±   rZ   r  rN  Śgenerate)rC   Śmodnamer]   r  r[   r*   ZsuiterØ  r  r  r  r%   r%   r&   r  p
  sB    

’
ž’
’’’z&ModuleNode.generate_typeobj_definitionc                 C   s   |j r|jsd S |jd }| d” | ” }| d|j ” |jD ]$}|jsB|rV|jsB|j|d|d qB| d” | d” | 	” r| d” d S )NŚbindingr:   zstatic PyMethodDef %s[] = {rĆ  )Śwrapper_code_writerz{0, 0, 0, 0}r  )
Zis_c_class_scopeZpyfunc_entriesr4   r¦   rŚ  Śmethod_table_cnameZfused_cfunctionZis_overridableZput_pymethoddefŚgetvalue)rC   r5   r  r  r   r]   r%   r%   r&   rż   
  s*    

’’
’’z ModuleNode.generate_method_tablec                 C   sĢ   |  d”}|r|jsd S | d”}|j}| d” | d” | d| ” |  ||” | d| ” | d| ” | d” | d	| ” | d
| ” | d” | d” | d| d” | d” d S )Nrń  Z__dict__getterr:   zM#if CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX < 0x030A0000r  zif (unlikely(!p->%s)){zp->%s = PyDict_New();r   zPy_XINCREF(p->%s);zreturn p->%s;rk  z#define z PyObject_GenericGetDictr   )r¾  Zis_variabler$  r½   r¦   r  )rC   r*   r  Ś	dict_attrr{  Z	dict_namer%   r%   r&   r  ¦
  s$    







z(ModuleNode.generate_dict_getter_functionc                 C   s   |j r| d” | d|j ” |j D ]V}|j}|rP|jrB| ” }d| ”  }nd}| d|j ” |jpjd|j	prd|f ” q&| d” | d” d S )Nr:   z"static struct PyGetSetDef %s[] = {zPyDoc_STR(%s)r  z{%s, %s, %s, %s, 0},r  r  )
r  r¦   Zgetset_table_cnamere   Z
is_unicodeZas_utf8_stringr±   ru   r  r  )rC   r5   r  r]   re   Zdoc_coder%   r%   r&   r  ¾
  s8    
’’
ü’’’z ModuleNode.generate_getset_tablec                 C   s<   t |j ” D ](\}}|jr|jr|jjs|j |” qd S r!   )rm   rn   ro   Ś
is_cglobalrO  r[   r¼  r  rt   r%   r%   r&   rl   ×
  s    z5ModuleNode.create_import_star_conversion_utility_codec              
   C   sÜ  |  t dd”” | dtj dtj dtj d” | d” t	|j
 ” D ]\}}|jrN| d| ” qN| d	” | d
” | d” | d” | d” | d” | d” | d” | d” | d” | ” }| d” d}t	|j
 ” D ]@\}}|jrō|jrō|jjsō|d7 }|d dkrF| d” | d” | d” | d| ” |jjrŚ|jjsr|jjr|j |d”}| d|| |j”f ” | d” |j|j|jdd | d|jt |jtd”f ” nR|j |”r| |j d|j|j|”” n&| d ||jf ” | | |j”” | d” qō| d!” | d"tj ” | d” | d#” |  |j!”r| "|j!” | #t$| j%” ||_!| d$” | d%” | d” | d&” | &t 'd'd(”” | (”  d S ))NZCStringEqualsr  śint ś(ś *z2,PyObject *o, PyObject* py_name, const char *name)z,static const char* internal_type_names[] = {z"%s",r  r  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);rÕ   r   ztype_name++;zif (0);r   r   éd   z#ifdef _MSC_VERz)if (0);  /* Workaround for MSVC C1061. */r   z#else if (__Pyx_StrEq(name, "%s")) {r  zif (!(%s)) %s;zPy_INCREF(o);Fr°  ś%s = %s;zGPyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");rb  z3if (PyObject_SetAttr(%s, py_name, o) < 0) goto bad;rŲ   rŁ   rŚ   r:   Z
ImportStarrŠ   ))rh   r	   ri   Śstart_initcfuncr   Zimport_star_setŚmodulestatetype_cnameŚmodulestatevalue_cnamer¦   rm   rn   ro   rq   Znew_error_labelr¤  rO  r[   Zis_constr¼  rQ  r.  Ztype_test_codeŚ
error_gotorM   Ś
put_decrefr½   r   r[  r   r  Zfrom_py_call_coder  Ś
label_usedŚerror_labelŚ	put_labelŚput_add_tracebackr
   rZ   r’   r   r6  )rC   r5   r  ru   r]   Zold_error_labelZ
msvc_countZ	type_testr%   r%   r&   rž   ß
  s    ’















 ’
ž
ž

   ’ ’






zModuleNode.generate_import_starc                 C   s¾   |  d” |  d|j ” |  dtj ” |  dtj ” |  dtj ” |  dtj ” |  dtj ” tj	d k	r|  dtj
 ” tjD ].\}}|  d| ” |  d| ” |  d” qd S )Nztypedef struct {rŁ  z	#ifdef %sr×  r   )r¦   Śmodule_dict_cnamer   Śbuiltins_cnameŚcython_runtime_cnamer1  Śempty_bytesŚempty_unicoder   r  r  Zused_types_and_macros)rC   r5   r  r  Z	used_namer%   r%   r&   r  &  s    

z&ModuleNode.generate_module_state_startc                 C   s  |d }|d }|d }|  dtj ” |  d” | t dd”” |  d” |  d	” |  d
” |  dtj ” |  d” |  d” |  dtj ” |  d” |  d” |  dtjtjf ” |  d” |  d|jtjf ” |  d” |  dtjtjf ” |  d	” |  d” |  d” |  d” |  d” |  dtjtjtjf ” |  d” |  d” |  d” |  d” |  d” |  d” |  d” d S )NZmodule_state_endró   rō   z} %s;r:   ZMultiPhaseInitModuleStaterņ   ś#if CYTHON_USE_MODULE_STATEś#ifdef __cplusplusśnamespace {zextern struct PyModuleDef %s;ś} /* anonymous namespace */rk  zstatic struct PyModuleDef %s;r   zA#define %s (__Pyx_PyModule_GetState(__Pyx_State_FindModule(&%s)))z(#define %s (__Pyx_State_FindModule(&%s))zstatic %s %s_static =z    {};z    {0};z"static %s * const %s = &%s_static;rŲ   r   )	r¦   r   r«  rh   r	   r   Śpymoduledef_cnamer0  r  )rC   r5   r  rµ   rń   ró   rō   r%   r%   r&   r  6  s`    

’






ž
ž
ž




ż





z$ModuleNode.generate_module_state_endc                 C   s   |  d” |  dtj ” |  tj d” |  d” |  d|j ” |  dtj ” |  dtj ” |  dtj ” |  dtj ” |  dtj	 ” |  d” |  dtj
 ” |  d” |  d” |  dtj ” |  d” |  d	” |  d
” |  d” d S )Nrø  z4static CYTHON_SMALL_CODE int %s_clear(PyObject *m) {z2 *clear_module_state = __Pyx_PyModule_GetState(m);z"if (!clear_module_state) return 0;rŲ  ś#ifdef __Pyx_CyFunction_USEDr   ś#ifdef __Pyx_FusedFunction_USEDś"#if CYTHON_PEP489_MULTI_PHASE_INITz__Pyx_State_RemoveModule(NULL);©r¦   r   r  r«  r³  r“  rµ  r1  r¶  r·  Zcyfunction_type_cnameZfusedfunction_type_cnamer  r%   r%   r&   r  i  sF    

’’’’’’
’

’


z&ModuleNode.generate_module_state_clearc                 C   s  |  d” |  dtj ” |  tj d” |  d” |  d|j d” |  dtj d” |  dtj d” |  dtj d” |  dtj d” |  dtj	 d” |  d” |  dtj
 d” |  d	” |  d
” |  dtj d” |  d	” d S )Nrø  zSstatic CYTHON_SMALL_CODE int %s_traverse(PyObject *m, visitproc visit, void *arg) {z5 *traverse_module_state = __Pyx_PyModule_GetState(m);z%if (!traverse_module_state) return 0;z Py_VISIT(traverse_module_state->ri  z)__Pyx_VISIT_CONST(traverse_module_state->r½  r   r¾  rĄ  r  r%   r%   r&   r    s     




z)ModuleNode.generate_module_state_traversec              
   C   s2	  |   | j| j|”}|  ||” | | j” | d” | t dd”” t	d|j
 }d|  d|” }| d| ” | jjr¦| d” | d	|  d|” ” | d
” |  |j
”}|rŲ| d” | d| ” | d
” | |” | d” | d” | dtj ” | d” t dd”}| |” | d” | d|  ” tjf ” | d
” | d” | d” | d” | d” | d
” | tj dtj d” | ” }	|jjd }
|jjd }|
sŹ|rģ|rŲ| ”  |j t dd”” | ”  | d” | dtj ” | dtjtjf ” | d|j
 ” dd  ” | d ” | d” | d!” | d"tjtjf ” | d
” | d#” |  ||” |
s |r°|	 ”  | ”  t d$d”}| |” |  |” | t d%d”” | t d&d”” | !| jd'” | d(” | d)” | d
” | "tj#”}| d*|| $|| j”f ” | "tj%”}| d+|| $|| j”f ” | "tj&”}| d,|| $|| j”f ” | d-” | !| jd.tj d/” | d0” | !| jd1” d2}| 'd3” |D ]}| 'd4| d5” qä| d” | !| jd6|j d/” | d
” |D ]6}| d7| ” | !| jd8||jf ” | d
” q.| d9” |jd: r| !| jd;” | d|  (”  ” | !| jd<|j| )t	d=”| )t	d>”f ” | d” |  *||” t+j,r
| d?” | !| jd@tj d/” | dA” | !| jdBtj d/” | !| jdCtj d/” | dD” |dE}|  -||” W 5 Q R X |dF}|  .||” W 5 Q R X |dG}|  /||” W 5 Q R X |dH}|  0||” W 5 Q R X |dI }|D ]}|  1|||” qÜW 5 Q R X |dJ }|D ]}|  2|||” q
W 5 Q R X |dK*}|D ]}|  3|” |  4|||” q8W 5 Q R X | dL” | 5d ” |
s|r¦|j6j7st8| 9|| j” dM|j6_:| 5d ” | j; <|” | 5d ” |
sŅ|r dN|j6_:|j6j7sčt8|j=dO| jdP | >”  | ”  | dQ” |  ?||” | ”  t+j@rX|j t dRd”” | dS| A| j” ” | B|jC” | D|jE” |j6 F” D ]\}}| G||” qz|
s|r²| H”  | I| j” | d|j ” | dT| "|jJ” dU” | Kt	dV|jL ” |j tMjN” | d” | dW” |jO|jtPdNdMdX | d!” |jQ|jtPdNdY | dZ” | d[” | d\” | d]tj ” | d^” | d” | d
” | d_” | d`|jL ” dd  ” | d” | D|jC” | R”  | d” | da|j ” | d!” | db|j ” | d
” | d” |	 S|j6” | T”  d S )cNr:   ZPyModInitFuncTyperņ   ZPyInit_z__Pyx_PyMODINIT_FUNC %s(void)r   z%s CYTHON_SMALL_CODE; /*proto*/zc#if !defined(CYTHON_NO_PYINIT_EXPORT) && (defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS))z;__Pyx_PyMODINIT_FUNC PyInit___init__(void) { return %s(); }r   zHvoid %s(void) {} /* workaround for https://bugs.python.org/issue39432 */ræ  r  zreturn PyModuleDef_Init(&%s);r   ZModuleCreationPEP489z-static CYTHON_SMALL_CODE int %s(PyObject *%s)zint stringtab_initialized = 0;rø  zint pystate_addmodule_run = 0;r§  z = NULL;ŚprofileŚ	linetraceZProfilez	Profile.crY  zif (%s == %s) return 0;zrPyErr_SetString(PyExc_RuntimeError, "Module '%s' has already been imported. Re-initialisation is not supported.");r   rõ   rŚ   rk  z if (%s) return __Pyx_NewRef(%s);z /*--- Module creation code ---*/ZImportRefnannyAPIZGetRuntimeVersionZ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); %sz4/*--- Initialize various global constants etc. ---*/z__Pyx_InitConstants(ś)zstringtab_initialized = 1;z__Pyx_InitGlobals())Z
CyFunctionZFusedFunctionŚ	CoroutineŚ	GeneratorZAsyncGenz#if 0z || defined(__Pyx_z_USED)z __pyx_CommonTypesMetaclass_init(z#ifdef __Pyx_%s_USEDz__pyx_%s_init(%s)z)/*--- Library function declarations ---*/Z
np_pythranz_import_array()zPyObject_SetAttr(%s, %s, %s)Ś__name__Ś__main__z/*--- Builtin init code ---*/z__Pyx_InitCachedBuiltins(z/*--- Constants init code ---*/z__Pyx_InitCachedConstants(z__Pyx_CreateCodeObjects(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 ---*/TFZPy_None)rM   z/*--- Wrapped vars code ---*/ZRegisterModuleCleanupzif (__Pyx_RegisterCleanup()) %szif (z && stringtab_initialized) {zinit %srx  ©r±  rM  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;)UŚmod_init_subfunctionrM   r*   Śgenerate_pymoduledef_structr  r¦   r’   r	   r   r
   r\   r°   Ś
is_packageŚwrong_punycode_module_namer   r¼  Śmodule_init_func_cnameŚpymodinit_module_argr«  r¬  rŚ  rµ   r4   Zuse_fast_gil_utility_coderh   ri   Zput_declare_refcount_contextr  r±   Śgenerate_module_creation_codeZput_trace_declarationsZput_trace_frame_initŚput_setup_refcount_contextZput_error_if_negŚ name_in_main_c_code_module_stater1  Śerror_goto_if_nullr¶  r·  rČ   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  Ś	funcstateZ	gil_ownedrK   Zput_trace_startZ	can_tracer@   Zgenerate_execution_codeZput_trace_returnZput_trace_exitŚgenerate_wrapped_entries_codeŚgenerate_cleanup_coder­  Zput_gotoZreturn_labelr±  r°  Śall_managed_tempsŚput_xdecrefZput_trace_exception_propagatingZput_trace_unwindr³  r²  rĮ   r   Ztraceback_utility_coder5  r   r®  Śput_finish_refcount_contextŚput_temp_declarationsr6  )rC   rŌ   r5   r  ZsubfunctionZmodinit_func_nameZheader3rĢ  Zmod_create_funcŚtempdecl_coderĮ  rĀ  Zrefnanny_import_coder1  r¶  r·  Zshared_typesr  Z
inner_coder   r½   r[   r%   r%   r&   r    s®   


’








ž






žž


ž






 ’ ’ ’






ż

ž
žž














’’









’




z$ModuleNode.generate_module_init_funcc                    s$     ”  G  fddd}|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).
        c                       s2   e Zd Zdd Z fddZ fddZdS )z;ModuleNode.mod_init_subfunction.<locals>.ModInitSubfunctionc                 S   sB   d  | ”  ” ”}t d|”s"td| | _|| _d | _d | _	d S )Nrm  z^[a-z0-9_]+$z__Pyx_modinit_%s)
r  ŚlowerrÅ  r   ŚmatchrK   Ś
cfunc_nameŚdescriptionrä  Ś	call_code)rC   Z	code_typer½   r%   r%   r&   Ś__init__ø  s    
zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__init__c                    sz     ” | _ }|jd| j dtj dtj ddd | dtj d” |  ” | _| 	t
| j” | d	| j ” |S )
Nr„  r¦  r§  rĆ  T)ZrefnannyzCYTHON_UNUSED_VAR(ri  z/*--- %s ---*/)rŚ  ré  rŖ  rē  r   r«  r¬  r¦   rä  rŠ  r
   rč  r  )Śfunction_codeŚ	orig_coder*   r%   r&   Ś	__enter__Ą  s    
 ž
zEModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__enter__c                    sŚ    }|  ”  | d” | j |j” d | _| |j”}|rx| |j” |j ” D ]\}}| 	||” qP|  ”  | d” | d” | 
”  |r²| j | j d| jtjf ”” n| j d| j dtj d” d | _d S )NrŲ   rŚ   r   z%s(%s)z(void)r¦  ri  )rā  r¦   rä  rć  rŻ  rÆ  r°  r±  rą  rį  r6  ré  Śerror_goto_if_negrē  r   r¬  )rC   rĄ  r  Zneeds_error_handlingr½   r[   )rė  rM   r%   r&   Ś__exit__Ķ  s6    


 ’’’’zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__exit__N)rĘ  Ś
__module__Ś__qualname__rź  rķ  rļ  r%   ©rė  rģ  rM   r*   r%   r&   ŚModInitSubfunction·  s   ró  )rŚ  )rC   rM   r*   rģ  ró  r%   rņ  r&   rÉ  ¬  s    	1zModuleNode.mod_init_subfunctionc                 C   sš  |j d }|dkr| jd j}|r| d” | d|j| tt|”| | j”f ” | d” |j	rZ| d” |j
 td”}| d|| tttj |””| || j”f ” | |t” | d	|j|| | j”f ” | |t” |j
 |” | d” nT|j	rZ| d” |j t d
d”” | | d| t| j” | j”” | d” | j}| d”rt|d td  }| ” }| d” | d| d| j” ” | d| ” | | d||jf | j”” | d” | d” d S )NZset_initial_pathZ
SOURCEFILEr   z&if (!CYTHON_PEP489_MULTI_PHASE_INIT) {z7if (PyObject_SetAttrString(%s, "__file__", %s) < 0) %s;r   Tz!%s = Py_BuildValue("[O]", %s); %sz7if (PyObject_SetAttrString(%s, "__path__", %s) < 0) %s;ZSetPackagePathFromImportLibrŠ   z%__Pyx_SetPackagePathFromImportLib(%s)z	.__init__r  z0PyObject *modules = PyImport_GetModuleDict(); %sr  z)if (!PyDict_GetItemString(modules, %s)) {z%PyDict_SetItemString(modules, %s, %s))r4   rM   r/  r¦   r  Zget_py_string_constr
   r   r­  rĖ  rŻ  Śallocate_tempr   r   r#   r  rŅ  Ś
put_gotrefr5  Śrelease_temprµ   rh   r	   r   rī  rZ   Śendswithræ  r±   )rC   r5   r  Śmodule_pathŚtempZfq_module_nameZfq_module_name_cstringr%   r%   r&   rŌ  ź  s    


’
ü


’’ū  
’’

 ’’’ü

’
 ’’
z'ModuleNode.generate_module_import_setupc                 C   s  t js
d S | dtj ” | |” | tj dtj d” | d” | dtj d” | d” | tj d” t jd	kr
| d
” t	|j
}| ”  |D ]d}|jdkr¤|jjrī|jrī|jrĪ|j}n| |j”}|j||jddd |j |”r¤|j ||” q¤| dtj d” t jdkrn| d” t|jt d”dD ]$}| |j”}|j||ddd qHt jr¤| d” |jD ]}|j|jtjddd q| d” |j | tj!” tjddd |j"D ]Ö}|j}|j#sŅ|j$ršqŅ|j%j& 'dd”rŅ|j%}	| |	 (tj)””}
| |	 (tj*””}| d” | d| ” | d|
|f ” | d” | d” | d” | d” | d ” | d” | d!” | d” qŅt j+d k	rŹ|j tj,tddd" tj-tj.fD ]"}| |”}|j |tddd" qÖ|j | |j/”tddd" d S )#Nz.static void %s(CYTHON_UNUSED PyObject *self) {r§  rp  rø  zif (!__Pyx_State_FindModule(&z
)) return;r   z! = __Pyx_PyModule_GetState(self);r   z/*--- Global cleanup code ---*/rĘ  TF)rM  r±  z__Pyx_CleanupGlobals(ri  é   z$/*--- Type import cleanup code ---*/rŪ   rj  z /*--- Builtin cleanup code ---*/z/*--- Intern cleanup code ---*/r  r   r  zwhile (%s > 0) {z"PyObject* o = (PyObject*)%s[--%s];rN  rO  rk  rP  rQ  r   rČ  )0r   rß  r¦   r   Ścleanup_cnamer  r«  r¬  r¼  r-  r   rG  r   r[   r¼  rO  r¤  r½   rx  rU  rK  rT  rm   Śtypes_importedrU  rV  rŃ  rŪ   rÕ  Zcached_builtinsr   r   r5  r1  rY   r  rC  r*   r4   rD  r$  r)  r*  r  r  rµ  r“  r³  )rC   r5   r  Zrev_entriesr]   Zentry_cnamer  rŪ   Zcclass_typer*   r)  r*  r½   r%   r%   r&   r  %  s¾    ’





 ż
 ż


 ż

ż

’
’
 ’







 ’

  žz'ModuleNode.generate_module_cleanup_funcc                 C   sL   |   ” }tjdkrd}ntj}t dd”}|j |j|j|tj|d” d S )NŚmainŚwmainZMainFunctionzEmbed.c)r\   r  r÷   Zwmain_method)	rś   r   r  r	   ri   rµ   rh   Z
specializer\   )rC   r5   r  r  rž  r÷   r%   r%   r&   r    s    
ü’zModuleNode.generate_main_methodc                 C   s:   |  ” rd| }nd| d” dd” d” }d||f S )Nrm  ZU_Śpunycodeó   -ó   _rv  z%s%s©ŚisasciiŚencoderĀ   Śdecode)rC   rĆ   ru   r%   r%   r&   rĄ     s    
zModuleNode.punycode_module_namec                 C   s,   |  ” rd S dd|  d” dd” d” S )NZPyInitUrm  r’  r   r  rv  r  )rC   ru   r%   r%   r&   rĢ  ¤  s    z%ModuleNode.wrong_punycode_module_namec                 C   s   |   ||j”S r!   )rĄ   r\   )rC   rĆ   r5   r%   r%   r&   r°   Ŗ  s    zModuleNode.mod_init_func_cnamec                 C   s   | j }|  tj|”S r!   )r*   r°   r   Zpymodule_exec_func_cnamerj   r%   r%   r&   rĶ  ²  s    z!ModuleNode.module_init_func_cnamec                 C   sģ  |j rd| |j ” }nd}tjr.dtj }nd}| d” | d” |  ” }| dtj ” | d| ” | d	tj	 ” | d
tj ” | d| ” | d” |j
d r²dnd}| d| ” | d” | d” dddd |j
d ”}| d| ” | d” | d” | d” |j ” s<| d” | d” | d” | d” | d” | d” | dtj ” | d ” | d!tj ” | d” | d"” | d#” | d$|j ”  ” | d%| ” | d&” | d'tj d(” | d ” | d)” | d” | d*|j ” | d” | d+tj	 ” | d ” | d,” | d” | d&” | d-tj ” | d.tj ” | d/| ” | d ” | d0” | d1” | d/| ” | d” | d” | d” | d2” | d” d S )3Nś%sr  z(freefunc)%sZNULLr:   ræ  z@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},ś-#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADINGŚfreethreading_compatibleŚPy_MOD_GIL_NOT_USEDŚPy_MOD_GIL_USEDz{Py_mod_gil, %s},r   z;#if PY_VERSION_HEX >= 0x030C0000 && CYTHON_USE_MODULE_STATEZ*Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTEDZ&Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTEDZ$Py_MOD_PER_INTERPRETER_GIL_SUPPORTED)ŚnoZ
shared_gilZown_gilZsubinterpreters_compatiblez#{Py_mod_multiple_interpreters, %s},z	{0, NULL}r  z*#else /* CYTHON_PEP489_MULTI_PHASE_INIT */zT#error "Unicode module names are only supported with multi-phase init as per PEP489"r¹  rŗ  zstruct PyModuleDef %s =rk  zstatic struct PyModuleDef %s =r  z  PyModuleDef_HEAD_INIT,z  %s,z  %s, /* m_doc */rø  z	  sizeof(z), /* m_size */z9  (CYTHON_PEP489_MULTI_PHASE_INIT) ? 0 : -1, /* m_size */z  %s /* m_methods */,z  %s, /* m_slots */z  NULL, /* m_reload */z  %s_traverse, /* m_traverse */z  %s_clear, /* m_clear */z  %s /* m_free */z  NULL, /* m_traverse */z  NULL, /* m_clear */r»  )re   Śget_string_constr   rß  r   rū  r¦   rĶ  Zpymodule_create_func_cnameZpymoduledef_slots_cnamer4   rD  r\   r  r¼  r±   r«  r”  r  )rC   r5   r  re   Zcleanup_funcZexec_func_cnameŚ
gil_optionZsubinterp_optionr%   r%   r&   rŹ  ¶  s    

’
’ž

żü




























z&ModuleNode.generate_pymoduledef_structc           	   	   C   sx  |j rd| |j ” }nd}|jjtdd}| d” | d|tjf ” |j|tdd | d” | d	|tj	| 
|| j”f ” | d
” | d” | d” | d|tj	f ” | d|||j ” f ” | | d| j”” | d” | d” | d” | |j d| d” | d
” |j |” | d” |jd rJdnd}| d|j d| d” | d
” | tj dtj d” | d| ” | |j”}| d||j| 
|| j”f ” |j|tdd | tj”}| d|| 
|| j”f ” | tj”}| d|| 
|| j”f ” | d|j|| | j”f ” tjd k	rt| d tjtj| 
tj| j”f ” d S )!Nr  r  F©Z
manage_refræ  r©  r°  rk  z%s = PyModule_Create(&%s); %sr   rø  r  z7int add_module_result = __Pyx_State_AddModule(%s, &%s);z=%s = 0; /* transfer ownership from %s to %s pseudovariable */Zadd_module_resultzpystate_addmodule_run = 1;r   ro  rp  r  r  r	  r
  zPyUnstable_Module_SetGIL(rÆ  ri  zCYTHON_UNUSED_VAR(%s);z%s = PyModule_GetDict(%s); %sz?%s = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); %sz6%s = __Pyx_PyImport_AddModuleRef("cython_runtime"); %sz:if (PyObject_SetAttrString(%s, "__builtins__", %s) < 0) %sz*%s = __Pyx_PyImport_AddModuleRef("%s"); %s)re   r  rŻ  rō  r   r¦   r   rĪ  Z
put_increfr¼  rŅ  rM   r\   r±   rī  r  rö  r4   r¬  r0  rŃ  r³  r“  rµ  r­  r   r  r  )	rC   r5   r  re   Zmodule_tempr  Z
dict_cnamer“  Zruntime_cnamer%   r%   r&   rĻ    sØ    
ž
ż’


 ’  ’




’ž
 ž’ž’ž’
ż’ż’z(ModuleNode.generate_module_creation_codec                 C   sH   |j D ]<}|jdkr|jr(|j ||” |j |”r|j ||” qd S ©NrĘ  )r   r   rO  r[   Zglobal_init_coder  r3  )rC   r5   r  r]   r%   r%   r&   rÖ  U  s    

z$ModuleNode.generate_global_init_codec              	   C   s®   t |j ” D ]\}}|jr|js|j|kr|j |”sJt|j	d|j  | 
d” | 
d|jj|jf ” | 
| d|j	”” | 
d|j|| |j	”f ” | 
d” qd S )Nz$Cannot convert '%s' to Python objectr  zPyObject* wrapped = %s(%s);Śwrappedz6if (PyObject_SetAttrString(%s, "%s", wrapped) < 0) %s;r   )rm   rn   ro   rp   rq   r*   r[   r  r   rM   r¦   Zto_py_functionr½   rŅ  r  r­  )rC   r5   r  ru   r]   r%   r%   r&   rŽ  `  s,    ’ž
ž
ż’z(ModuleNode.generate_wrapped_entries_codec              
   C   s   g }|j D ]*}|js*|js*tjr
|jdks
| |” q
|r| t 	dd”” |D ]:}|j
 ” }| |j”}| d||j|| | j”f ” qPd S )NrĘ  ZVoidPtrExportrŠ   z6if (__Pyx_ExportVoidPtr(%s, (void *)&%s, "%s") < 0) %s)r   r   r   r   rå  r   rG   rh   r	   ri   r[   rą   rÓ  ru   r¦   r½   r­  rM   )rC   r5   r  rn   r]   r  ru   r%   r%   r&   r×  s  s*    
’žž
  
žz*ModuleNode.generate_c_variable_export_codec              
   C   s   g }|j D ]*}|js*|js*tjr
|jdks
| |” q
|r| t 	dd”” |D ]4}|j
 ” }| d|j ” |j|| | j”f ” qPd S )NrĘ  ZFunctionExportrŠ   z>if (__Pyx_ExportFunction(%s, (void (*)(void))%s, "%s") < 0) %s)r   r   r   r   rå  r   rG   rh   r	   ri   r[   rŽ   r¦   ru   r±   r½   r­  rM   )rC   r5   r  rn   r]   r  r%   r%   r&   rŲ    s,    
’žž
’

üz*ModuleNode.generate_c_function_export_codec              	   C   s@   t |.}|jD ] }|jr|  ||j|j||” qW 5 Q R X d S r!   )rį   rY   r   Śgenerate_type_import_coder[   rM   )rC   r   r5   r  rå   r]   r%   r%   r&   rŚ    s    

z/ModuleNode.generate_type_import_code_for_modulec                 C   s*   |j dd D ]}|jjr|j ”  q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)r   r[   r  Z"get_all_specialized_function_types)rC   Zpxd_envr]   r%   r%   r&   rČ  ¢  s    z!ModuleNode.specialize_fused_typesc           	      C   sč   g }|j D ]}|jr
| |” q
|rä| t dd”” |jjtdd}| 	d||j
|| | j”f ” | |t” |D ]T}||kr|j}n| tj|j”}|j ” }| 	dtj||j||| | j”f ” qv| |t” |j |” d S )NrĻ   rŠ   Tr  ś-%s = PyImport_ImportModule("%s"); if (!%s) %sz@if (__Pyx_ImportVoidPtr_%s(%s, "%s", (void **)&%s, "%s") < 0) %s)r   r   rG   rh   r	   ri   rŻ  rō  r   r¦   rĮ   r­  rM   rõ  r½   rŻ   r   rā  ru   r[   rą   rß   r5  rö  )	rC   r   r5   r  rn   r]   rł  r½   r  r%   r%   r&   rŪ  ®  sF    

’
ü’
   
ż’z5ModuleNode.generate_c_variable_import_code_for_modulec                 C   sŠ   g }|j D ]}|jr
|jr
| |” q
|rĢ| t dd”” |jjt	dd}| 
d||j|| | j”f ” | |t	” |D ]6}| 
dtj||j ” |j|j ” | | j”f ” q|| |t	” |j |” d S )NrŃ   rŠ   Tr  r  zGif (__Pyx_ImportFunction_%s(%s, %s, (void (**)(void))&%s, "%s") < 0) %s)r   r   rO  rG   rh   r	   ri   rŻ  rō  r   r¦   rĮ   r­  rM   rõ  r   rß   ru   r±   r½   r[   rŽ   r5  rö  )rC   r   r5   r  rn   r]   rł  r%   r%   r&   rÜ  Ķ  s>    

’
ü’
ś’z5ModuleNode.generate_c_function_import_code_for_modulec              	   C   s|   t |j}|jD ]\}|jdkr<|js<|  ||j|j||” q|  ||||” |  ||” |jj	r|  
||” qW 5 Q R X d S r  )rį   rY   r   Śutility_code_definitionr  r[   rM   Śgenerate_base_type_import_codeŚ!generate_exttype_vtable_init_codeZ
early_initŚgenerate_type_ready_code)rC   r5   r  rå   r]   r%   r%   r&   rŁ  ź  s    

z"ModuleNode.generate_type_init_codec                 C   sB   |j j}|r>|j|jkr>|js>|js>|js>|  ||| j||” d S r!   )	r[   rC  r\   rĮ   r.  Zis_cython_builtin_typer  r  rM   )rC   r5   r]   r  rå   rC  r%   r%   r&   r  ÷  s    ’’žz)ModuleNode.generate_base_type_import_codec              
   C   s   ||j krd S |jtjkr.|j t dd”” | j||||d |j	r|j t dd”” | 
d|j	|j| |j”| |j	|”f ” |j  |” d S )NrŅ   rŠ   )Ś	error_posZ	GetVTablez(%s = (struct %s*)__Pyx_GetVtable(%s); %s)rü  ru   r   Śctypedef_builtins_maprµ   rh   r	   ri   rā   rĖ  r¦   rL  rŃ  rŪ   rŅ  r;  )rC   r5   r[   rM   r  rå   r%   r%   r&   r  ž  s$    

’
’
üz$ModuleNode.generate_type_import_codec                 C   s2  |j r|jn
d|j  }}|j}	|j}
|	dk}|sBd|	 d}	n^|
tjkrt| | |j” dtj|
  d” d S d}	|
tj	krtj	|
 }
|tj
kr tj
| }|sŗ|d k	s°t| |”}| |	|”}|j}|sŚ| |”}| | dtj d| d	|	 d	|j ”  d

” dtj }| d” | d| d| d| d” | d” |rZ| d” n| d| d| d| d” | d” | d| d| d| d” | d” |jrĘ|jdkrĘ|j}n4|jrÖ|jrÜd}ntd|j d|	 d|j | d| ”  dtj d” | d| d| ” d S )NrŠ  )Ś__builtin__Śbuiltinsrn  ro  rp  Z__Pyx_BUILTIN_MODULE_NAMEz = __Pyx_ImportType_r¦  rÆ  rĆ  Z__PYX_GET_STRUCT_ALIGNMENT_z>#if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000zsizeof(z), z),z%#elif CYTHON_COMPILING_IN_LIMITED_APIz0, 0,rk  r   )r   ŚwarnŚignorer   zinvalid value for check_size 'z' when compiling r   Z__Pyx_ImportType_CheckSize_rm  ri  z if (!z) )r  rN  r\   ru   r   r  r¦   rx  rŪ   Zrenamed_py2_builtins_mapZbasicsize_builtins_maprK   r­  r:  rŃ  r   rß   r±   Ś
check_sizer  Zis_subclassedŚRuntimeErrorrČ   r  )rC   r[   r  rå   rÖ   r  r×   Zsizeof_objstructr  r\   Ś	type_nameŚ
is_builtinr   rŪ   Zalignment_funcr  r%   r%   r&   rā     sZ    
’





(’



’z$ModuleNode.generate_type_import_callc                 C   s   t j ||” d S r!   )r   ZCClassDefNoder  )rC   r]   r  r%   r%   r&   r  P  s    z#ModuleNode.generate_type_ready_codec                 C   s   | j  dd”}|  tj|”S r¾   )rZ   rĀ   rĄ   r   r  )rC   rZ   r%   r%   r&   rś   S  s    z$ModuleNode.is_main_module_flag_cnamec                 C   s    |j }|jr| d|j|jf ” |jrL|jjrL| d|jtj|jjf ” dd |jjD }|r|D ]4}|j	pt|j }| 
” }| d|j|j||jf ” qfd S )Nz	%s = &%s;z%s.%s = *%s;c                 S   s   g | ]}|j r|qS r%   )r4  r   r%   r%   r&   r   g  s   ’z@ModuleNode.generate_exttype_vtable_init_code.<locals>.<listcomp>z%s.%s = %s%s;)r[   r  r¦   rĖ  rC  r   rÉ  r*   r   Śvtable_typeZsignature_cast_stringr½   r4  )rC   r]   r  r[   Zc_method_entriesZ
meth_entryr!  Ścastr%   r%   r&   r  W  s>    ž’ż’’ü’z,ModuleNode.generate_exttype_vtable_init_code)T)F)TT)NNF)vrĘ  rš  rń  Zchild_attrsr4   rL   rN   ŚpropertyrD   rX   r^   r_   rg   rv   r   r   r   r}   rÆ   r£   r~   r­   r®   r|   r  r  rz   rJ  rT  r{   ra  r	  Śstaticmethodrg  rų   rŖ   r¬   rØ   r  r  r§   r  r  r¢  r  rŖ  r  rŗ  r  r  r\  r]  r^  r_  rY  r[  rc  rd  re  rū   rü   rō  r  rõ  rö  r÷  rS  rł  rś  rū  rü  re  r  r	  rż  rž  r’  r   r
  r  r  r  r  rż   r  r  rl   rž   r  r  r  r  r  rÉ  rŌ  r  r  rĄ   rĢ  r°   rĶ  rŹ  rĻ  rÖ  rŽ  r×  rŲ  rŚ  rČ  rŪ  rÜ  rŁ  r  r  rā   r  rś   r  r%   r%   r%   r&   r?   o   sņ   
+


_c]& ,
 
"c#,3		< & &WN8 I.'+(G G3  >;iNQ	
=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 | _|r0| ” D ]\}}|| jd| < qg | _d S )Nz"%s")r  Śimportedro   Śtemps)rC   r  rŌ   ru   r½   r%   r%   r&   rź  {  s    zModuleImportGenerator.__init__c                 C   sf   || j kr| j | S | j}|jjtdd}| j |” | d||||f ” | |t” || j |< |S )NTr  z5%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s)	r%  r  rŻ  rō  r   r&  rG   r¦   rõ  )rC   Zmodule_name_stringrÖ   r  rł  r%   r%   r&   r:    s    

   ’
z%ModuleImportGenerator.imported_modulec                 C   s   | S r!   r%   rB   r%   r%   r&   rķ    s    zModuleImportGenerator.__enter__c                 G   s.   | j }| jD ]}| |t” |j |” qd S r!   )r  r&  r5  r   rŻ  rö  )rC   Śexcr  rł  r%   r%   r&   rļ    s    
zModuleImportGenerator.__exit__)N)rĘ  rš  rń  Ś__doc__rź  r:  rķ  rļ  r%   r%   r%   r&   rį   v  s
   
rį   c           
      C   sŅ   | j o
| j}| j r| js6| jsĪ|s6| js6| jdks6|rĪ| jdkrLtj}d}n2| jdkrbtj}d }n| jdkrvd}d }nd}d }| j}| jr|sd}d }t	|}|j
| j|d}| | j”}	| d||	|f ” d S )NrĘ  rč   r   rŪ  rÜ  rŻ  z%s %s%s; /*proto*/)rO  r  Zinline_func_in_pxdrP  r   r   r   r»   r[   r   r¼   r½   rĢ  rĶ  r¦   )
r]   r5   r  r`  Zfrom_cy_utilityrä  rŽ  r[   rØ  rĪ  r%   r%   r&   rę    sH    ’’’’



 ’żrę  ZRefnannyrņ   zj
#if defined(__GNUC__)
#define __Pyx_PACKED __attribute__((__packed__))
#else
#define __Pyx_PACKED
#endif
r:   Zutility_code_proto_before_types)rÉ   rŹ   Zproto_block)8ZcythonZdeclareŚobjectŚcollectionsr   ry  rU  r   r  r   r(   r   r   r:   r   r   r   r   r   r   r   r   ZErrorsr   r   r   r   r   r   ZUtilsr   r   r   r   r   r	   r   r   ZStringEncodingr
   r   r    r'   r"   r,   r-   r7   ro  ŚNodeZ	BlockNoder?   rį   rę  r   rł   r­  r%   r%   r%   r&   Ś<module>   s®       žå                              %$% ś