o
    ÕjRś ć                   @   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 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*m+Z+ ddlm,Z, dd Z-dd Z.dd Z/dd Z0dd  Z1d!d"d#d$d%d#d!d"d#d$d%d#d&Z2G d'd( d(Z3G d)d* d*ej4ej5Z6d+d, Z7d-ej8fd.d/Z9d-ej8fd0d1Z:d2d3 Z;G d4d5 d5Z<d6d7 Z=e% >d8d9”Z?e%d:d;d<d=Z@dS )>é    N)
ŚNamingŚOptionsŚ
PyrexTypesŚ	TypeSlotsŚerrorŚwarningŚpy_object_typeŚUtilityCodeŚEncodedStringŚre)Śdefaultdict)ŚSequenceé   )Ś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
   Śbytes_literalŚencoded_string_or_bytes_literal)Śhas_np_pythranc                 C   s   t | |}t|S ©N)r   Śas_encoded_filename)ŚpathZnewsufŚnewpath© r'   ś[/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/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_pxd2   s   
r.   c                 C   s   | j  ”  | j  ”  | S r#   )r,   Zcheck_c_classesZcheck_c_functionsr-   r'   r'   r(   Ścheck_c_declarations7   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_linenumsr0   Śc_line_in_traceback)	r   Śannotater1   ŚhasattrŚprintr   ZCCodeConfigŚ
directivesr2   )ŚenvŚoptionsr1   r'   r'   r(   Śgenerate_c_code_config=   s   
żr9   )Tś&&T)Fś||F)TŚ N)Tr;   F)Fr:   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Zdd Zdeej defddZ	deej defdd	Z
d
d Zdd Zdeej fddZdeej fddZdeej fddZdeej fddZdd ZdS )ŚSharedUtilityExportera¼  
    Class responsible for generating code that imports and exports shared utility functions.

    Mark the positions where the functions should be called with `call_import_code()`/`call_export_code()`.
    The function calls and import/export functions are generated when `generate_exporting_functions()`
    is called. This approach is needed because the list of the shared functions is only known in the later
    stages of compilation.
    c                 C   s@   t |jj| _t |jj| _|| _|| _|d| _|d| _	d S )NzShared function import codezShared function export code)
ŚboolŚcontextZshared_c_file_pathŚin_shared_utility_moduleŚshared_utility_qualified_nameŚusing_shared_utility_moduleŚposr,   Śimport_codeŚexport_code)ŚselfrG   Śmod_init_subfunctionr,   r'   r'   r(   Ś__init__x   s   
zSharedUtilityExporter.__init__Śshared_func_definitionsŚreturnc                 C   ó   t | jo|S r#   )rB   rD   ©rJ   rM   r'   r'   r(   Śhas_shared_exports   ó   z(SharedUtilityExporter.has_shared_exportsc                 C   rO   r#   )rB   rF   rP   r'   r'   r(   Śhas_shared_imports   rR   z(SharedUtilityExporter.has_shared_importsc                 C   ó   | j  |” d S r#   )rH   Śset_call_code©rJ   Ścoder'   r'   r(   Ścall_import_code   ó   z&SharedUtilityExporter.call_import_codec                 C   rT   r#   )rI   rU   rV   r'   r'   r(   Ścall_export_code   rY   z&SharedUtilityExporter.call_export_codeŚshared_function_definitionsc                 C   s8   dd |D }|j  t dd”” t|| j|dd d S )Nc                 S   ó*   g | ]}|j  d |j d|j|jfqS ©ś(ś)©ŚretŚparamsŚname©Ś.0Zshared_func_defr'   r'   r(   Ś
<listcomp>   ó    ’’zQSharedUtilityExporter._generate_c_shared_function_export_code.<locals>.<listcomp>ŚFunctionExportśImportExport.cŚ__Pyx_ExportFunctionśvoid (*{name})(void))ŚglobalstateŚuse_utility_coder	   Śload_cachedŚ_generate_export_coderG   )rJ   rW   r[   Śexportsr'   r'   r(   Ś'_generate_c_shared_function_export_code   s   ž
’z=SharedUtilityExporter._generate_c_shared_function_export_codeŚfunction_definitionsc                 C   sT   dd |D }|j  t dd”” t| jjj}dtj	 }t
|| j|||d d S )Nc                 S   r\   r]   r`   rd   r'   r'   r(   rf      rg   z\SharedUtilityExporter._generate_c_shared_function_import_code_for_module.<locals>.<listcomp>ŚFunctionImportri   Ś__Pyx_ImportFunction_śvoid (**{name})(void))rl   rm   r	   rn   r
   r,   rC   rE   r   Ś	cyversionŚ_generate_import_coderG   )rJ   rW   rr   ŚimportsrE   Śimport_funcr'   r'   r(   Ś2_generate_c_shared_function_import_code_for_module   s   ž
’’zHSharedUtilityExporter._generate_c_shared_function_import_code_for_moduleŚshared_utility_functionsc                 C   óF   |   |”r!| j}|  ||” W d    d S 1 sw   Y  d S d S r#   )rQ   rI   rq   ©rJ   r{   Ś
inner_coder'   r'   r(   Ś_generate_exports¦   ó   
ž"’’z'SharedUtilityExporter._generate_exportsc                 C   r|   r#   )rS   rH   rz   r}   r'   r'   r(   Ś_generate_imports®   r   z'SharedUtilityExporter._generate_importsc                 C   s4   |j j}| | j” |  |” |  |” | ”  d S r#   )rl   r{   Śenter_cfunc_scoper,   r   r   Śexit_cfunc_scope)rJ   rW   r{   r'   r'   r(   Śgenerate_exporting_functions¶   s
   

z2SharedUtilityExporter.generate_exporting_functionsN)Ś__name__Ś
__module__Ś__qualname__Ś__doc__rL   r   r   ZSharedFunctionDeclrB   rQ   rS   rX   rZ   rq   rz   r   r   r   r'   r'   r'   r(   rA   o   s    rA   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>e 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ŃdŅZodÓdŌ ZpdÕdÖ Zqd×dŲ ZrdŁdŚ ZsdŪdÜ ZtdčdŻdŽZudßdą Zvdįdā Zwdćdä ZxdS )éŚ
ModuleNodeŚbodyNc                 C   ó   | j S r#   ©r,   ©rJ   r'   r'   r(   Ślocal_scopeĻ   s   zModuleNode.local_scopec                 C   s  t | jtjs	J |dv sJ | jd u r:tj| jjg d| _tj| jjg d| _| jj d| j” | jj d| j” |j	| j
j	krKtj|j||j	d}|dkrR| jn| j}t |tjrc|j |j” n|j |” | j
j |j” |j ” D ]}| j
 |” qvdd }|| j
j|j d S )N)ŚpxdZutility)Śstatsr   )r   r6   r   c                 S   s    |D ]}|| v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Ś	pxd_statsrG   Śutility_code_statsr   Śinsertr6   r,   ŚCompilerDirectivesNodeŚextendr   Śutility_code_listŚ
c_includesŚvaluesZprocess_includeŚincluded_files)rJ   Śtreer,   ZstageZtarget_statsŚincr   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,   r6   r    )rJ   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)r6   r   )r   r   rG   r6   r   )rJ   r   r'   r'   r(   Świth_compiler_directives  s   z#ModuleNode.with_compiler_directivesc                 C   sĢ   t |r	t |” | jr| jd |_tjsd  |_| _n)tjrAt	dt
 | j” |_| jd ur@t	|jd | j |_| jj|j_n| j|_| j|_| j |” t ” }| |”rd| j t dd”” d S d S )NŚold_style_globalszFile: %s (starting at line %s)Ś
ZCythonPyMutexPublicCheckzSynchronization.c)r"   r   Zinclude_pythran_genericr6   rØ   r   Z
docstringsŚdocZembed_pos_in_docstringr
   r   Zrelative_positionrG   Śencodingr   Śanalyse_declarationsr   Zget_cy_pymutex_typeZfind_shared_usages_of_typer,   rm   r	   rn   )rJ   r7   Zcy_pymutex_typer'   r'   r(   r¬     s.   


’’żzModuleNode.analyse_declarationsc                 C   sd   | j }|jr|  |” t|j ” D ]\}}|jr/|j |u r/|jr/|jj	s)|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©rJ   r7   rc   r„   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)rJ   r8   Śresultr7   r'   r'   r(   Śprocess_implementation4  s   
z!ModuleNode.process_implementationc                 C   s*   | j D ]}|jD ]	}|jr  dS qqdS )Nr   r   )rŗ   Ścfunc_entriesŚdefined_in_pxd)rJ   Ś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   rG   Śosr%   Śbasename)rJ   r%   rĘ   r'   r'   r(   Śassure_safe_targetE  s   
’’žzModuleNode.assure_safe_targetc                 C   sŖ  d"dd}||j dd}||j}||j}||j}|s$|s$|s$|rÓt|jd|_|  |j” t 	” }	t
||}
t |	| |
”}| ”  |jd }|jd }|jd	 }|jret|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 d    d S 1 sĢw   Y  d S 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Ć   ©re   r„   ©rĢ   r   r'   r(   rf   O  s    
’’žž’zAModuleNode.generate_h_code.<locals>.h_entries.<locals>.<listcomp>r'   )r°   rĢ   r   r'   rĪ   r(   Ś	h_entriesN  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Ā   r”   r)   Śc_fileŚh_filerÉ   r   ŚCCodeWriterr9   ŚGlobalStateŚ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Śuse_entry_utility_codeŚgenerate_public_declarationŚmod_init_func_cnamer
   r¤   Śas_c_string_literalŚrstripr   Ścopyto)rJ   r7   r8   rĄ   rĻ   Zh_typesZh_varsZh_funcsZh_extension_typesZh_code_writerŚc_code_configrl   Z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¾   M  s²   






















’



’
’


’

$’¬zModuleNode.generate_h_codec                 C   sF   |  dtj|j |j”f ” |r!|  d|jj|jdd ” d S d S )Nś%s %s;zcdef extern %sr   ©Śpyrex)rę   r   Śextern_c_macror£   Śdeclaration_codeŚcname)rJ   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)rJ   Śprefixr7   rć   r'   r'   r(   rć   ·  s   zModuleNode.api_namec              	      sō  d(dd}||j }||j}||j}|s|s|sd 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 ]}|j}  d|j ”   d|j|jf ”  j |” q|rŚ  d” |D ])}t|j}| tj|j ”}  d| !|” ”   d|j |f ”  j |” q°|r  d” |D ])}t|j}| tj"|j ”}  d| !|” ”   d|j |f ”  j |” 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 ” qL|D ]}| tj"|j ”}|j &” }  dtj%|j  ” ||f ” qnt' |j#did}|D ]}| j(|j |ddd  qW d    n	1 s“w   Y    d!”   d"”   d#”   d$”   d%”   d&”   d”   d'|
 ” t)|j}z  *|” W | +”  d S | +”  w )*Nr   c                    s    fdd| D S )Nc                    s    g | ]}|j s r|jr|qS r'   )rĢ   rĆ   rĶ   ©r   r'   r(   rf   ½  s    ’’
’zEModuleNode.generate_api_code.<locals>.api_entries.<locals>.<listcomp>r'   )r°   r   r'   r  r(   Śapi_entries¼  ó   z1ModuleNode.generate_api_code.<locals>.api_entriesz_api.hz#ifdef __MINGW64__z#define MS_WIN64rŲ   Tc                    s8   t j| ||d\}}|r  |” |r  |” d S d S )N)Śinclude_requires)r	   Śload_as_stringŚput)rc   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ŚVoidPtrImportri   rs   Ś
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Ā   r”   r)   rÜ   Zapi_filerÉ   r   rŽ   r9   rß   rą   rā   rć   r   ré   rå   rę   rŻ   rĒ   r%   rČ   r$   rņ   r£   Śtypeptr_cnameŚtypeobj_cnamerl   rļ   r   ŚmangleZfunc_prefix_apirc   rż   Zvarptr_prefix_apir  Śsignature_stringrv   Śempty_declaration_codeŚModuleImportGeneratorŚgenerate_type_import_callr   rō   Śclose)rJ   r7   r8   rĄ   r  Zapi_varsZ	api_funcsZapi_extension_typesrõ   rl   r÷   r  Z
h_filenamer„   r£   rž   ŚsigŚimport_generatorrų   r'   r  r(   ræ   »  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  )rJ   r£   rŠ   r'   r'   r(   rķ   "  s
   
żz&ModuleNode.generate_cclass_header_codec                 C   sh   |  d|j|jf ” | ”  |jj}|r)|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¤   rc   Śindentr,   rŪ   r£   rż   rž   Śdedent)rJ   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r%tjdkp|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 ” t+| j|  ,| j| j-|d ”| j-}|  .|d d |||d ” |  /||d ” tj0r|  1||d ” |  2|d ” |  3|||” |	 4d” |j5d d  D ]}| |” q9| 6|
” | 7”  |  8|||” t9|j}z| :|” W | ;”  n| ;”  w d|_<|j=ru|  >||” tjs}|jr|  ?|||” d S 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_moduleé’’’’Zcleanup_moduleŚmain_methodZfilename_tabler©   r   )@rÉ   rÜ   rŗ   r   r3   r   ZAnnotationCCodeWriterZcompilation_sourcer.  r   rŽ   r9   rß   r/  Zinitialize_main_c_coderG   Z
module_posr6   Śgenerate_module_preambleZembedded_metadatarm   Śrefnanny_utility_coderę   r¢   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_tabler­   Śgenerate_import_starŚput_code_herer	   ŚloadŚgenerate_module_state_startŚgenerate_module_state_clearŚgenerate_module_state_traverserA   rK   r,   Śgenerate_module_init_funcŚgenerate_module_cleanup_funcŚembedŚgenerate_main_methodŚgenerate_filename_tableŚ!generate_declarations_for_modulesŚwriter   r   Zfinalize_main_c_codeŚgenerate_module_state_endr   rō   r#  Zc_file_generatedZ	gdb_debugŚ_serialize_lineno_mapŚ_generate_annotations)rJ   r7   r8   rĄ   Śmodulesr-  Ś
rootwriterrõ   rl   rŠ   rW   Śmodule_is_mainŚshared_utility_exporterZutilcoderų   r'   r'   r(   r½   5  s   ž
ż
’

’ż’


’zModuleNode.generate_c_codec                 C   sd  |   |” tjp
|j}|r.tj |”r.dd lm  m} | 	|” 
” }| ” D ]}d |_q'n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 |”}| |	”smqT||
| jdd}|sxqT||	kr§tj |”s§zt |” W n ty¦ } zdd l}|j|jkr W Y d }~nd }~ww |j|||d qTd S )Nr   )Ścoverage_xmlT)Z
source_posŚinclude)r3   r   Zannotate_coverage_xmlrĒ   r%   ŚexistsZxml.etree.ElementTreeŚetreeZElementTreeŚparseZgetrootŚiterŚtailZsave_annotationZmain_source_filerÜ   r,   r   rC   Zsearch_include_directoriesŚabspathŚdirnameŚjoinŚ
startswithrG   ŚmakedirsŚOSErrorŚerrnoŚEEXIST)rJ   rO  rĄ   r8   Zcoverage_xml_filenameŚETrR  ŚelZsearch_include_fileŚ
target_dirZincluded_fileŚtarget_fileZtarget_file_dirŚsource_fileŚer_  r'   r'   r(   rM    sD   
’

’žšz ModuleNode._generate_annotationsc           
      C   sÄ   |j j}|j ” }tt}t|D ]\}\}}|dkr+|jd ur+|||f  |d ” q| 	d” t
| ” D ]\\}}}	|jd usDJ |jdd tt|	”|jt|d q7| d” | ”  d S )Nr   r   ZLineNumberMappingZ
LineNumberś )Ś	c_linenosZsrc_pathŚ
src_lineno)rC   Zgdb_debug_outputwriterŚbufferZ
allmarkersr   ŚlistŚ	enumerateŚfilenamer   ŚstartrÆ   r±   Ś	add_entryr[  ŚmapŚstrrŅ   Ś	serialize)
rJ   r7   ZccodewriterŚtbŚmarkersŚdZc_linenoZsrc_descri  rh  r'   r'   r(   rL  Ć  s$   

ü
z ModuleNode._serialize_lineno_mapc                 C   s<   ||vrd||< |j D ]	}|  |||” q| |” d S d S )Nr   )Ścimported_modulesr»   r   )rJ   r7   Śmodule_listZmodules_seenŚimported_moduler'   r'   r(   r»   Ų  s   
üz"ModuleNode.find_referenced_modulesc           	         s¢   t t|D ]'}| }|jj}|r-|}|  |”  |”}|d u r'n|jj}|sqt g  fdd t|D ]} |  qB ”  S )Nc                    sD   | v rd S   | ” | j D ]} |  q | ” d S r#   )Śaddr£   r   )ŚuŚv©ŚdfsŚgetkeyrĄ   ŚseenZ
subclassesŚ	type_dictr'   r(   r}  ń  s   
z1ModuleNode.sort_types_by_inheritance.<locals>.dfs)	r   rk  r£   Ś	base_typer   ŚgetŚsetŚreversedŚreverse)	rJ   r  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   sD  i g }}i g }}|D ]{}|j D ]C}|jrT|jsT|j}	|	j}
|
s"q|
|v rKddlm} t|j|s9J t	|jt||
 j|sJJ t	||
 jq|||
< | 
|
” q||u }|jD ]*}|jr|sf|jr|j}	|	jr|js|j}	|	j}
|
|vs}J |
|||
< | 
|
” q\qdd }|  |||”}dd }|  |||”}||fS )Nr   )ŚNonManglingModuleScopec                 S   r   r#   )Śvtabstruct_cname©Z
entry_typer'   r'   r(   r    ó   z8ModuleNode.sort_type_hierarchy.<locals>.vtabstruct_cnamec                 S   r   r#   )Śobjstruct_cnamer  r'   r'   r(   r  $  r  z7ModuleNode.sort_type_hierarchy.<locals>.objstruct_cname)r”   ŚusedŚin_cincluder£   r  r	   r  r   r,   rq  r   rŚ   rĆ   Śis_extension_typer  r  )rJ   rw  r7   Z	vtab_dictZvtab_dict_orderZvtabslot_dictZvtabslot_dict_orderrÄ   r„   r£   r  r  Zall_defined_herer  Ś	vtab_listr  Śvtabslot_listr'   r'   r(   Śsort_type_hierarchy’  sJ   


$


ų
’’zModuleNode.sort_type_hierarchyc                 C   sh   t  d”}i g }}|jD ]}||j}||vsJ ||||< | |” q|  |||”|jd d < d S )Nr  )ŚoperatorŚ
attrgetterr”   r£   r   r  )rJ   r7   Zkey_funcZ
entry_dictZentry_orderr„   r  r'   r'   r(   r¼   +  s   



’zModuleNode.sort_cdef_classesc                    s  |D ]	}|   |j|” qt| t }|D ]?}||u }	g }
|jD ]$}|jjr:|jr:|j|vr9| |j” |
 |” q |	s?|j	rD|
 |” q  fdd|
D }
|  
|
|” q|D ]}|  |j|” |  ||” qW|D ]}|  ||” |  ||” |  ||” |  ||” qid S )Nc                    s   g | ]}| vr|qS r'   r'   )re   Śt©Zvtabslot_entriesr'   r(   rf   F  s    z8ModuleNode.generate_type_definitions.<locals>.<listcomp>)Ś!generate_objstruct_predeclarationr£   r  rŚ   Ś	is_ctupler  rc   ry  r   rĆ   rē   Śgenerate_objstruct_definitionŚgenerate_typeobj_predeclarationŚgenerate_exttype_vtable_structŚ$generate_exttype_vtabptr_declarationŚ*generate_exttype_final_methods_declaration)rJ   r7   rN  r  r  rW   r„   Zctuple_namesrÄ   Ś
definitionrŚ   r'   r  r(   Śgenerate_type_definitions6  s6   




üz$ModuleNode.generate_type_definitionsc           
      C   są   |d }|  d” |  d” ddd |D v r+|  d” |  d” |  d	” |  d
” |  ||”\}}|  |||||” |d }|D ]+}||u }	|  d” |  d|j ”  ” |  |||	|” |  |||	” |  |||	” qBd S )NrŃ   r<   z/*--- Type declarations ---*/zcpython.arrayc                 S   s   g | ]}|j qS r'   )r  )re   Śmr'   r'   r(   rf   W  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ę   r  r   r  rņ   Śgenerate_c_class_declarationsŚgenerate_cvariable_declarationsŚgenerate_cfunction_declarations)
rJ   r7   rN  rl   Śtypecoder  r  Z
modulecoderÄ   Zdefined_herer'   r'   r(   rI  Q  s*   






’
śz,ModuleNode.generate_declarations_for_modulesc                 C   s   |   t |d”” d S )Nr2  )r?  r	   r@  )rW   rc   r'   r'   r(   Ś_put_setup_codeh  s   zModuleNode._put_setup_codec                 C   sę  |  ”  |r | d” | tj|ddd” | d” | d” | d” | d” | d	” |  |d
” t|j ” tj	dD ]}|j
|jkrL| |” q?| d” | d” | d” | d” | d” |jd  d” ddlm} | d| dd” d” | dt| ” | dtj|jjv  ” |j t dd”” |  |d” |jjjr²|  |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 u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” | d=” | d>” | d?” | d” | d@” | d.” | d” |j)dA rŁdBndC}| dD| ” | d.” |j)dE }|j)dF }|dGvr |s t*| j+dH | dIt"|dJk ” | dKt"|dLk ” |dMvr&| dN| d” |dOkr.dP}n|dQkr6dR}n| ,” }| dS| dT” | dU| dV” | -t .dWdX”d+ ” | t /dYdZ”” t0j1 2|” t0j1 3|” t0j4 3|” | -t5j6” |  |d[” | d” | d\” | d]|j7 ” t8j9d ur| d^tj: ” | d.” | d_tj ” | d`tj ” | datj;tj<f ” | dbtj ” | t /dcd”” | t ddd”” | t /ded”” t=|rń| t /dfdg”” d S d S )hNz/* BEGIN: Cython Metadataé   T)r+  Ś	sort_keyszEND: Cython Metadata */r<   z#ifndef PY_SSIZE_T_CLEANz#define PY_SSIZE_T_CLEANz#endif /* PY_SSIZE_T_CLEAN */ZInitLimitedAPI©r  z#ifndef Py_PYTHON_Hzg    #error Python headers needed to compile C extensions, please install development version of Python.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CythonABIVersionr2  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; }rg  ś;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 1z&#ifdef CYTHON_FREETHREADING_COMPATIBLEz##if CYTHON_FREETHREADING_COMPATIBLEz:#define __Pyx_FREETHREADING_COMPATIBLE Py_MOD_GIL_NOT_USEDz6#define __Pyx_FREETHREADING_COMPATIBLE Py_MOD_GIL_USEDŚfreethreading_compatibleŚPy_MOD_GIL_NOT_USEDŚPy_MOD_GIL_USEDz'#define __Pyx_FREETHREADING_COMPATIBLE Ś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)rø  r¹  z'#define __PYX_DEFAULT_STRING_ENCODING "r·  Z	ByteArrayrq  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GetRuntimeVersionZAddModuleRefZPythranConversionzCppSupport.cpp)>rā   rę   ŚjsonŚdumpsr¦  rÆ   r   r   r   ŚsortkeyŚlocationZINITIALrJ  rl   r<   r«  r  r   r   ŚdivisionrC   Zfuture_directivesrm   r	   r@  r8   Zcplusr   Zfilename_cnameŚfiletable_cnameZlineno_cnameZclineno_cnameZline_c_macror2   Śintrź   rė   rć   rä   ré   rč   r6   r   rG   Śtitler
  r	  rn   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"   )rJ   r7   r8   rv  ŚmetadatarW   r   r«  Zmark_errpos_codeZ
cline_infoZdefault_cline_runtimeZft_compatibler“  rµ  Zc_string_func_namer'   r'   r(   r8  l  s  











’
’
’’žżüś’











































’z#ModuleNode.generate_module_preamblec                 C   sŚ   t j}| d” | d| ” | d| ” | d| ” | d” | d| ” | d” | d| ” | d	” | d
” |rI| 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
    #endifrŖ  z    #define %s extern "C++"z  #ifdef __cplusplusz    #define %s extern "C"z  #elsez    #define %s externz  #endifrŲ   )r   rü   rę   )rJ   rW   rė   rc   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ę   rV   r'   r'   r(   rģ   %  s   

z#ModuleNode.generate_dl_import_macroc                 C   sf   t |j ” tjdD ]}|j|jkr|r| |” q
|j|jkr'|r'| |” q
|r1| 	d” d S d S )Nr©  z#include <omp.h>)
rÆ   r   r   r   r½  r¾  ZEARLYrJ  ZLATEZputln_openmp)rJ   r7   rv  rW   r0  r°  r   r'   r'   r(   rč   *  s   

’zModuleNode.generate_includesc                 C   s   ddl m}m} | d” | dtj ” |jjrA|jjD ]"}| ” }||r+| 	” }t
 |” ” }t|}| d| ”  ” qn| d” | d” d S )Nr   )ŚisabsrČ   r<   z!static const char* const %s[] = {ś%s,Ś0ś};)Zos.pathrÉ  rČ   rę   r   rĄ  rl   Zfilename_listZget_filenametable_entryŚget_descriptionŚpathlibŚPathŚas_posixr$   rņ   )rJ   rW   rÉ  rČ   r.  Ś	file_pathZescaped_filenamer'   r'   r(   rH  5  s   
ų
z"ModuleNode.generate_filename_tablec                 C   s   d S r#   r'   ©rJ   r7   rW   r'   r'   r(   Śgenerate_type_predeclarationsH  ó   z(ModuleNode.generate_type_predeclarationsc                 C   s:  |D ]4}|j s6|j}|jrq|js|jr|  ||” q|jr-|js-|jr-|  |jj	|” q|j
r6|  ||” q|D ]a}|j s|j}|jrK|  ||” n<|jsQ|jrX|  ||” n/|jrb|  ||” n%|jrt|jst|jrt|  |jj	|” n|jr~|  ||” n	|j
r|  ||” t|dd r|jjD ]}|j |” qq9d S )Nr,   )r  r£   Z
is_typedefZis_struct_or_unionŚis_cpp_classŚ$generate_struct_union_predeclarationr  Śis_fusedr  Zstruct_entryr  r  Śgenerate_typedefr“   rµ   Śgenerate_enum_definitionŚ generate_struct_union_definitionŚgenerate_cpp_class_definitionr  Śgetattrr,   rŪ   rl   rļ   )rJ   rŚ   rW   r„   r£   Z	var_entryr'   r'   r(   rē   K  s@   īz$ModuleNode.generate_type_header_codec                 C   sZ   |  d” |j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ę   r”   r£   Śtypedef_flagr  r\  )rJ   r7   rW   r„   r£   rc   rX  r'   r'   r(   Śgenerate_gcc33_hackp  s   


’ųzModuleNode.generate_gcc33_hackc                 C   sj   |j j}|j}|jr |js z|jd }W n ty   |}Y nw |}| |j” | 	d| 
|j” ” d S )NZnumeric_typedefsztypedef %s;)r£   Ztypedef_base_typer,   Z
is_numericZis_cpp_class_scoperl   ŚKeyErrorŚmark_posrG   rę   rż   rž   )rJ   r„   rW   r  Zenclosing_scopeŚwriterr'   r'   r(   rŲ  ~  s   ’zModuleNode.generate_typedefc                 C   s$   |j rd|||||f S d||f S )Nz%s %s;
typedef %s %s %s;rł   )rŽ  )rJ   r£   Śkindrc   r'   r'   r(   Śsue_predeclaration  s   žzModuleNode.sue_predeclarationc                 C   sN   |j }|jr|jr| dd dd |jD ” ” | |  ||j|j”” d S )Nztemplate <typename %s>z, typename c                 S   ó   g | ]}|  ” qS r'   ©r   ©re   ŚTr'   r'   r(   rf     ó    zCModuleNode.generate_struct_union_predeclaration.<locals>.<listcomp>)r£   rÕ  Ś	templatesrę   r[  rä  rć  rž   ©rJ   r„   rW   r£   r'   r'   r(   rÖ    s   
’z/ModuleNode.generate_struct_union_predeclarationc                 C   s   d||f }d}||fS )Nz%s %s {rĢ  r'   )rJ   r£   rć  rc   ŚheaderŚfooterr'   r'   r(   Śsue_header_footer  s   zModuleNode.sue_header_footerc                 C   s  |  |j” |j}|j}|r|j}|jo|j}|r&d|jdf }|j t	” |  
|||j”\}}|rK| d” | d” | d” | d” | d” | |” |j}	|	D ]}
| d|
j |
j” ” qU| |” |r| d” | d	” | d” | d
” | d” d S d S 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į  rG   r£   r,   rć  Z	is_structŚpackedrl   rm   Śpacked_struct_utility_coderī  rž   rę   rŪ   rż   )rJ   r„   rW   r£   r,   rć  rš  rģ  rķ  rŪ   Śattrr'   r'   r(   rŚ    s@   ’





’




ēz+ModuleNode.generate_struct_union_definitionc           
      C   s®   |rH|  d|jd |”f ” |p|o|jj }|r| ”  |r,|D ]	}	|j|	dd q"|r;|  d|jd |”f ” |rA| ”  |  d” d S |  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)
rJ   Ś	arg_declsŚ	arg_namesŚis_implementingŚpy_attrsŚconstructorr£   rW   Z	needs_gilrņ  r'   r'   r(   Śgenerate_cpp_constructor_code¾  s   z(ModuleNode.generate_cpp_constructor_codec              
   C   sž  |  |j” |j}|j}|rż|jr"| 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 ]:}
|
jjrn|
jjrn| d” n|
jdkry| d”}n|
jdkr|
}	n|
jjr| d” d}| d|
j |
j” ” q^d|jjv }|s¤|r|rų| ” D ]L}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 }|  |||||||” |	s|s|rW|r| d” |rO| d|j ” |r*|  ”  |	r5| d|	j ” |rI|D ]
}
|j!|
dd q:| "”  | d” n| d|j ” |rö|rą| d|j|jf ” |  ”  |jD ]}
|
jjs| d|
j|
jf ” |j#|
dd qo| "”  | d” | d|j|jf ” | d” |  ”  |jD ]!}
|
jjsŹ|j!|
dd | d|
j|
jf ” |j#|
dd qŖ| "”  | d” | d” | d” n| d|j|jf ” | d|j|jf ” | d” d S d S ) Nztemplate <class %s>z, class c                 S   rå  r'   rę  rē  r'   r'   r(   rf   Ö  ré  z<ModuleNode.generate_cpp_class_definition.<locals>.<listcomp>ś	struct %sz	, public c                 S   rå  r'   rę  )re   Z
base_classr'   r'   r(   rf   Ū  ré  z : public %sz {c                 S   s   g | ]}|j jr|js|qS r'   )r£   Śis_pyobjectŚis_inherited)re   rf  r'   r'   r(   rf   ß  s
    ’
’Fzstatic z<init>z<del>zvirtual Trļ  r5  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į  rG   r£   r,   rź  rę   r[  r
  rž   Zbase_classesrē   rŚ   r°   r   rŪ   Zis_cfunctionZis_static_methodrc   Ślookup_hererż   rl   rį   Zall_alternativesZoriginal_argsŚlenŚargsZoptional_arg_countr   Zop_arg_structr   Zoptional_args_cnamerž  rö  Zput_var_xdecrefrų  Zput_var_incref)rJ   r„   rW   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}|s3t	|jd nC|d }	|D ]}
|
j
d urF|
j
 |” q9|D ],}
|
j
d u rY|
j d”d }nd|
j d”d |
j
 ” f }|
|	urp|d7 }| |” qI| |” |jjr|jjr| d	||f ” d S d S d S )
Nr<   z
enum classŚenumzDEmpty enum definition not allowed outside a 'cdef extern from' blockr6  z::z%s = %sś,ztypedef enum %s %s;)rį  rG   r£   rž   rc   rµ   rī  rę   Śenum_valuesr   Z
value_nodeZgenerate_evaluation_codeŚsplitrĄ   r“   rŽ  )rJ   r„   rW   r£   rc   rć  rģ  rķ  r  Z
last_entryZvalue_entryZ
value_coder'   r'   r(   rŁ  2  s<   


ž
żz#ModuleNode.generate_enum_definitionc                 C   s|   |  d” |jj}|r:|jdkr$|js$|  dtjt dd”|f ” d S |jdkr<|  dtjt dd”|f ” d S d S d S )Nr<   Śexternr&  r'  r(  rŹ   Ś	DL_EXPORT)	rę   r£   r  rĖ   r  r   rü   r   r)  )rJ   r„   rW   rc   r'   r'   r(   r  U  s"   

ż

żłz*ModuleNode.generate_typeobj_predeclarationc                 C   s²   |j sd S | |j” |j}|j}|  |” |jrW| d” | d|j ” |jr9|jjr9| d|jjt	j
f ” |jD ]}|jsO| d|j d|j ” ” q<| d” d S d S )Nr<   zstruct %s {zstruct %s %s;rļ  z(*%s)rĢ  )r  rį  rG   r£   r,   Śspecialize_fused_typesr  rę   r  r   Śobj_base_cnamerĀ   r  rż   rž   )rJ   r„   rW   r£   r,   Śmethod_entryr'   r'   r(   r  g  s(   

ž
öz)ModuleNode.generate_exttype_vtable_structc                 C   s@   |j sd S | |j” |j}|jr| d|j|jf ” d S d S )Nzstatic struct %s *%s;)r  rį  rG   r£   Śvtabptr_cnamerę   r  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;)r  rį  rG   r£   r,   rĀ   r  Zfinal_func_cnamerż   Śbuild_function_modifiersŚfunc_modifiersrę   )rJ   r„   rW   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ä  r  )rJ   r£   rW   r'   r'   r(   r    s   z,ModuleNode.generate_objstruct_predeclarationc           
      C   s.  |  |j” |jsd S |  |d|j”\}}| |” |j}|r7|j}|dkr(d}| dd|j |tj	f ” n| d” |j
rQ|jrF|jj
sQ| d|j|j
f ” |jjD ](}|jr]t}n|j}|jrj| |j”}	n| |j”}	|j |” | d|	 ” qU| |” |jd ur| d	|j|jf ” d S d S )
Nr  r'  ZPyHeapTypeObjectz%s%s %s;)śstruct r<   ZPyObject_HEADzstruct %s *%s;rļ  ztypedef struct %s %s;)rį  rG   r,   rī  r  rę   r  rŽ  r   r  Śvtabslot_cnamer  rŪ   Śis_declared_genericr   r£   Śis_cpp_optionalŚcpp_optional_declaration_coderž   rż   rl   rļ   Zobjtypedef_cname)
rJ   r£   rW   rģ  rķ  r  Zbasestruct_cnamerņ  Z	attr_typeŚdeclr'   r'   r(   r    sR   ’
ż’’ž’

žz(ModuleNode.generate_objstruct_definitionc           
      C   s²   |d }|d }|d }|  ” }|jD ]C}	|s|	jrV| d|	jj ” | d|	jj ” | d|	jj ” |	jjd urV| d|	jj ” | d|	jj ” | d|	jj ” qd S )Nr1  r3  r4  zPyTypeObject *%s;ś!Py_CLEAR(clear_module_state->%s);z$Py_VISIT(traverse_module_state->%s);śPyObject *%s;)Śinsertion_pointr”   rĆ   rę   r£   r  r  )
rJ   r7   rW   r  rl   r1  r3  r4  Zmodule_state_typeobjr„   r'   r'   r(   r¢  Č  s>   

’’’’’’’’ņz(ModuleNode.generate_c_class_declarationsc           
      C   sp  |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}n%|jdkr=tj}|r:d}nd}n|jdkrRd}d }|j	d urR|j
 |j	”}|j
}|j}	|jro|sod}d }t|}| tj|j”}	d}|rx| d| ” |jr| |j|	|d	” n
| |j|	|d	” |d ur| d
| ” | d” |j|	krÆ| d|j|	f ” |j |” qd S )NŚprivater
  r(  rŹ   r  Śstaticr   z%s ©Śdll_linkageś = %srÆ  r  )Zis_cython_builtinrŪ   r  Z
in_closurerĖ   rĆ   r  r   rü   Śinitr£   Śliteral_coderž   r   r  Śvarptr_prefixrc   r
  r  r  rż   Śput_saferę   rl   rļ   )
rJ   r7   rW   r  r„   Śstorage_classr   r"  r£   rž   r'   r'   r(   r£  ß  s\   






’’

Ņz*ModuleNode.generate_cvariable_declarationsc                 C   sJ   |j D ]}tjo|jdk }|js|jdks|js|r"t|||| qd S )Nr
  rŹ   )rĀ   r   Ścimport_from_pyxrĖ   r  rĢ   Śgenerate_cfunction_declaration)rJ   r7   rW   r  r„   Zfrom_pyxr'   r'   r(   r¤    s   

’žśz*ModuleNode.generate_cfunction_declarationsc                 C   sd   |j D ],}|js/|jdkr/| |j |j”” |jd ur*|j |j”}| 	d| ” | 
d” qd S )NrŹ   r!  rÆ  )rŪ   r  rĖ   r
  r£   rż   rž   r"  r#  r%  rę   )rJ   r7   rW   r„   r"  r'   r'   r(   r;    s   


śz(ModuleNode.generate_variable_definitionsc                 C   sX  |j }|jD ]"}|jdkr)|j}|j}|r)|  ||” |  |||” |  ||” |  ||” | 	” rG|  
|||” | ” rG|  |||” | dg”rS|  ||” | ddg”r`|  ||” | g d¢”rst| jdd | d” | d	d
g”r|  ||” | ddg”r|  ||” | ddg”r|  ||” | dg”r¦|  ||” | ddg”r³|  ||” |jsÅ|jsÅ| dg”rÅ|  ||” | tj”rŅ|  ||” nd|jv 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__Ś__setslice__Ś__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.r,  r-  Ś__getattr__Ś__getattribute__Ś__setattr__Ś__delattr__Ś__get__Ś__set__Ś
__delete__Ś__dict__Śtotal_orderingśMtotal_ordering directive used, but no comparison and equality methods definedś#if CYTHON_USE_TYPE_SPECSrŖ  rŲ   ),r  r”   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   rG   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_functionr6   Śparent_typeŚget_slot_tablerl   ZPyNumberMethodsZis_binopZuser_methodsŚgenerate_binop_functionŚgenerate_property_accessorsr=  Śgenerate_getset_tableŚgenerate_typeobj_specŚgenerate_typeobj_definition)rJ   r7   rW   r¢   r„   r£   r,   Śslotr'   r'   r(   r<  $  sp   ž

’


Čz'ModuleNode.generate_typeobj_definitionsc                 C   s*   |j }|jr| d|j|jf ” d S d S )Nzstatic struct %s %s;)rL  Śvtable_cnamerę   r  ©rJ   r,   rW   r£   r'   r'   r(   r9  `  s   ž’z"ModuleNode.generate_exttype_vtablec                 C   s&   |j }| d| d”| ” f ” d S )Nz%s = (%s)o;Śp)rL  rę   rż   r   rU  r'   r'   r(   Śgenerate_self_casth  s   ž’zModuleNode.generate_self_castc                 C   sl   | j  t dd”” |jrd}nd}|jddd}|  |j”}|  d| d	| d
| d| d| d” d S )NZCheckTypeForFreelistsśExtensionTypes.cZ$__PYX_CHECK_FINAL_TYPE_FOR_FREELISTSZ__PYX_CHECK_TYPE_FOR_FREELISTSr<   T©Zderefzif (likely((int)(z) & r^   ró  z	, sizeof(z)))))	rl   rm   r	   rn   Śis_final_typerż   Śname_in_slot_module_stater  rę   )rW   Z
size_checkŚ
type_cnamer£   Zfreelist_checkŚ
obj_structr  r'   r'   r(   Śgenerate_freelist_conditiono  s   
’"’z&ModuleNode.generate_freelist_conditionc              	      sģ  t  dd”}  d”}|  ”|krd S  j}|j}  ” \}\}	}
} jj} jr,g }	 fdd j	D }  
d”}|rB|jsBd }|sI|rL|jsLd}nd}|rSd}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p¬|
pŖ|pŖ|	p¬|}|rŗ| d j d” ” |rßt   |”}|j}|jsĶ| |”}|d u r×d| d}| d| ” n| d” |rh|j t dd”” | d
” | |”}| |”}|   || dd|” | d” | d||f ” |jddd}| d ” | d!” | d” | d"| ” | d#” | d$” | d%” | d&” | d”   !” rY| d'” | d(” | d” | d” |j t d)d*”” | d+|d,d-” | d.” |r|s| d/” |r| d0| "d1” ” d2}|jrĻ|}|jr¶|jj#r¶|j}|jr¶|jj#sŖ||urĮd3|j# }nd}| d4|j||j$f ” |D ]}|j%j&||d5d6 qŃ|	D ] }|j'd7kr÷d}| (d8|j)|j)f ” qą|j*|d9d2d: qą|D ]}| d;|j) ” | d<|j) ” q|
D ]}| d=|j) ” q|j)d>kr0| d?” |rQ|jrCd@tj+ dAtj, dB}ndC}d}| dD|j-|f ” | dE” |rk| dF” |j.d1t/d2d: | dG” | d/” | 0”  d S )HNŚtp_newZ	__cinit__c                    ó   g | ]
}|j   ”r|qS r'   )r£   Śneeds_explicit_constructionrĶ   r   r'   r(   rf     ó    
ž’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ļ  rV  z__Pyx_PyType_GetSlot(z, tp_new, newfunc)zPyObject *o = %s(t, a, k);zPyObject *o;ŚIncludeStringHśStringTools.cz > 0r  Ś{zo = (PyObject*)%s[--%s];rY  r8  zPy_DECREF(Py_TYPE(o));zmemset(o, 0, sizeof(%s));z##if CYTHON_COMPILING_IN_LIMITED_APIz(void) PyObject_Init(o, t);rŖ  z(void) PyObject_INIT(o, t);śPyObject_GC_Track(o);ś} elseZAllocateExtensionTyperX  z#o = __Pyx_AllocateExtensionType(t, ru  ś);zif (unlikely(!o)) return 0;rŁ   zp = %s;ŚoFz(struct %s*)zp->%s = %s%s;śp->©Zextra_access_coder5  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;)1r   ŚConstructorSlotŚmangle_internalŚ	slot_coderL  r  Śget_refcounted_entriesrZ  Zis_internalrŪ   r  Ś
is_specialZtrivial_signaturer6   r  r   Śfreelist_nameŚfreecount_namerl   rę   rż   Śstart_slotfuncr   Śpy_objptr_typer  Śget_base_slot_functionr  Śis_builtin_typer[  rm   r	   rn   r^  r=  Ś	cast_coder  r  r£   Śgenerate_explicit_constructionrc   r
  rž   r÷  Śmodulestateglobal_cnameŚempty_tupleŚ
func_cnameŚput_decref_clearr   r   )rJ   r,   rW   Ścclass_entryŚtp_slotŚ	slot_funcr£   r  Śhave_entriesrü  Ś
py_buffersŚmemoryview_slicesrZ  Zexplicitly_constructable_attrsZcinit_func_entryZunused_markerŚfreelist_sizerv  rw  r1  Zneed_self_castr_  Zbase_type_typeptr_cnamer]  Zneeds_error_cleanupZvtab_base_typeZstruct_type_castr„   Z
cinit_argsr'   r   r(   r:  |  s  
’
’





ž
ž
’ž


’



ž













’

’
ž
’’
’’

’z ModuleNode.generate_new_functionc                 C   sŌ   t  d|j”}| d”}| |”|krd S | d”}|d u s!|js#d S | d” |jr3| d|j ” |j	|t
jdddd | d” | d	” | d
|j ” | d” | d” | ”  |jrh| d” d S 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_namer6   rr  rs  r  ru  rę   Z
used_ifdefrx  r   rø   r  r   )rJ   r,   rW   r  Śslot_func_cnamer„   r'   r'   r(   r;    s(   






’z ModuleNode.generate_del_functionc                    sX  t  dd”}  d”} jj}|  ”|krd S   d”}|  tjdd”  jj	}  
” }  ” }	 js= js=  d”nd }
|
 jvrFd }
 jsQ jsQ  d”nd }| jvrZd }  ” \}\}}} fdd jD }|sw|sw|sw|
sw|r}|   |” |r  ” r±| d” |rd	}nd
}| d| ” | d| ” | d” | d” | d” | d” |rø| 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s| |”}t    |”}|d ur6|r.|j!r.|j! 
” r.| d” | d| ” nć|jrT|rL|j!rL|j! 
” rL| d” | d| ” nÅ|r^| d| ” | d ” | d!||f ” | d” | d"| ” |j t d#d”” n j" #d$d%”}|rÕ|   t$j%””}|   t$j&””} j}| d&” |  '|| d'| d(|” | d)” | d*||| (d+”f ” | d,” | d” | d)” | d-” | d.” | d/” | d0” | d)” | d1” | d2” | d” | d” | d3” | d4” | d” |r| d” |	r!| d5” | d” | )”  d S )6NŚ
tp_deallocŚ__dealloc__r  Ś__weakref__r5  c                    r`  r'   )r£   Śneeds_explicit_destructionrĶ   r   r'   r(   rf   O  rb  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))zIif (unlikely(__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
PyTrashcanrX  z__Pyx_TRASHCAN_BEGIN(o, %s)z.if (p->__weakref__) PyObject_ClearWeakRefs(o);z+if (p->__dict__) PyDict_Clear(p->__dict__);rm  rn  ro  FT)rõ  Śclear_before_decrefZhave_gilri  r  z4__Pyx_PyType_GetSlot(%s, tp_dealloc, destructor)(o);z+if (PyType_IS_GC(%s)) PyObject_GC_Track(o);rŗ  zIif (likely(%s)) __Pyx_PyType_GetSlot(%s, tp_dealloc, destructor)(o); elsez"__Pyx_call_next_tp_dealloc(o, %s);ZCallNextTpDeallocrd  r   re  z < z
Py_TYPE(o)rh  z%s[%s++] = %s;rl  rj  śPyTypeObject *tp = Py_TYPE(o);ś#if CYTHON_USE_TYPE_SLOTSś(*tp->tp_free)(o);rŖ  ś<freefunc tp_free = (freefunc)PyType_GetSlot(tp, Py_tp_free);śif (tp_free) tp_free(o);r8  śPy_DECREF(tp);Z__Pyx_TRASHCAN_END)*r   rq  rr  rL  r  rs  rx  r   rø   rZ  r=  Śneeds_trashcanrF  rG  r  rŪ   rt  rW  Zmay_have_finalizerę   rl   rm   r	   rn   Śgenerate_usr_dealloc_callr£   Śgenerate_explicit_destructionŚput_xdecref_clearrž   r  r{  r[  rz  r,   r6   r  r   rv  rw  r^  r|  r   )rJ   r,   rW   r  r  r  r  rZ  r=  r  Zweakref_slotZ	dict_slotr¬  rü  r  Zexplicitly_destructable_attrsZfinalised_checkr„   Ś
base_cnamer  r  rv  rw  r£   r'   r   r(   r<  8  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 )
Nr  rh  r  r  z&__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);r  z&__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);r  rŁ   )r  ru  rę   r  )rJ   r,   rW   r„   r'   r'   r(   r  Ü  s   







z$ModuleNode.generate_usr_dealloc_callc                 C   sj  t  d”}| d”}|jj}| |”|krd S | |tjdd” |j	dd\}\}}	}
| }d}| 
d” |s9|	r?|  ||” |r¹t  ||”}|rQ| 
d| ” nh|jrr|j}| 
d” | 
d| d	” | 
d
” | 
d” d}nG| |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 ]"}d|j }t t|j|”}| 
d| ” | 
d| ” | 
d” qä|	D ]}|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;rh  z-traverseproc traverse = __Pyx_PyType_GetSlot(z, tp_traverse, traverseproc);z>if (!traverse); else { e = traverse(o,v,a); if (e) return e; }rŁ   Trŗ  ze = 0;śif (likely(%s)) {z(if (traverse) { e = traverse(o, v, a); }rj  rŲ   z1{ e = __Pyx_call_next_tp_traverse(o, v, a, %s); }zif (e) return e;ZCallNextTpTraverserX  z e = __Pyx_call_type_traverse(o, z, v, a);ZCallTypeTraversero  ś	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GCDependentSlotrr  rL  r  rs  rx  r   Śc_returncode_typert  rę   rW  rz  r{  r  r[  rl   rm   r	   rn   rĮ  rž   Śtypecastr   r£   r   )rJ   r,   rW   r  r  r  r  r  rü  r  r  Zneeds_type_traverseZmaybe_needs_type_traverseŚstatic_callr”  r„   Zvar_codeZvar_as_pyobjectrž   r'   r'   r(   r>  ģ  s   


’


’





’




’



’



z%ModuleNode.generate_traverse_functionc                 C   s>  t  d|j”}| d”}|jj}| |”|krd S |jdd\}\}}	}
|s*|	s*|r-d}nd}| |t	j
d| d” |rEtjrE| d” |sI|	rO|  ||” |r»t  ||”}|ra| d| ” nZ|jr|j}| d	” | d
| d” | d” | d” n;| |j”}| d” | d| ” | d
| d” | d” | d” | d” | d| ” |j t dd”” tjrź|D ](}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_clearFr¢  r<   rc  r  zPyObject* tmp;r  rh  z%inquiry clear = __Pyx_PyType_GetSlot(z, tp_clear, inquiry);zif (clear) clear(o);rŁ   rŗ  r£  rj  rŲ   z${ __Pyx_call_next_tp_clear(o, %s); }ZCallNextTpClearrX  ro  ztmp = ((PyObject*)%s);rō  zPy_XDECREF(tmp);zPy_CLEAR(p->%s);zPy_CLEAR(p->%s.obj);rp  z(__PYX_XCLEAR_MEMVIEW(&p->from_slice, 1);r  )r   r  r6   rr  rL  r  rs  rt  rx  r   r„  r   Zclear_to_nonerę   rW  rz  r{  r  r[  rl   rm   r	   rn   rž   r  Zput_init_to_py_noner   r£   r   )rJ   r,   rW   r  r  r  r  r  rü  r  r  Zunusedr§  r”  r„   rc   r'   r'   r(   r?  C  sl   

’









’
ł	


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 iFr  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);rŖ  zDr = ((binaryfunc)PyType_GetSlot(Py_TYPE(o), Py_mp_subscript))(o, x);rŲ   zPy_DECREF(x);ś	return r;rŁ   )rx  r   ry  rę   r   )rJ   r,   rW   r'   r'   r(   r@    s0   ’’
’


’’’z(ModuleNode.generate_getitem_int_functionc                 C   s8  |j j}| d”}| d”}| |tjdd” | d” |r'| d|j ” n(| d” |  |ddd	d
|” | d” | d” | d” | d” | d” | d” | d” |rd| d|j ” n(| 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);©
rL  r  r  rx  r   r„  rę   r  Śgenerate_guarded_basetype_callr   ©rJ   r,   rW   r  Ś	set_entryŚ	del_entryr'   r'   r(   rA  Ŗ  s   

’’’’’’’’’’’’’’’’’’’’’z*ModuleNode.generate_ass_subscript_functionc                 C   s   |r?|  |”}|r| | d| d| d| d| d
” n| | d| d| d| d” | d” | d| d” d S d S )Nz  f = __Pyx_PyType_TryGetSubSlot(ró  rk  z f = __Pyx_PyType_TryGetSlot(zif (f)z	return f()Ztypeptr_cname_in_module_staterę   )rJ   r  ZsubstructurerS  Zfunctyper  rW   Zbase_tpnamer'   r'   r(   r°  ā  s   
 ’’
õz)ModuleNode.generate_guarded_basetype_callc                    s  |  d”rd S | |tjdd” | d” g }|j}|d ur9|jjdks9| |j	” |j	jj
}|d ur9|jjdkr$||v s?J d }|rR|jjdkrR|jrN|n|jj
}d|jv }i  tjD ]}|D ]}|  |”}	|	d urq|	 |<  nq`q\|rÆ fddtD }
|
sd	 vrd
 vrt|jjd nt|jjd d}nd	 vr«d
 vr«t|jjd d}t|
}tjD ]}| d” ” }  |”}	|	d u rĢ|rĖ|dv rĢq²| d| ” |	d u r³|sÜJ t||f \}}}| d” | d | j ” | d” | d” | d” | d” |d ur|dkr)| d|rdnd ” | d” | d” n#|dkrE| d|r6dnd ” | d ” | d” ntd!|f d	 v rTd	}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	 v rd
 vr|s| d,” | d” | d d	 j ” | d” | d-” | d” | d.” | d/” | d&” | d'” | d*” | d'” | d0” |r&|jr&| d1|j|jf ” | d2” | d'” | d'” | d'” | ”  d S )3NZ__richcmp__Ztp_richcomparez"PyObject *o1, PyObject *o2, int opzswitch (op) {r
  r6  c                    s   g | ]
\}}| v r|qS r'   r'   )re   Ś	from_nameZto_name©Z
comp_entryr'   r(   rf   	  ó    z8ModuleNode.generate_richcmp_function.<locals>.<listcomp>Ś__eq__Ś__ne__r7  z@total_ordering directive used, but no comparison methods definedFz=total_ordering directive used, but no equality method definedr¬  )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;r:   zif (%s order_res) {z!!ś!zret = __Pyx_NewRef(Py_False);z} else {r;   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  rx  r   ry  rę   rL  r„   rĖ   r   r,   r  r  r6   r   rJ  ŚTOTAL_ORDERINGr   rG   ŚmaxŚstripŚupperr  r  ŚAssertionErrorr   )rJ   r,   rW   Zclass_scopesŚclsZextern_parentr6  Z
cmp_methodZclass_scoper„   Z
comp_namesZordering_sourceZcmp_typeZinvert_compZcomp_opZinvert_equalsZeq_funcr'   rµ  r(   rK  ń  sÜ   


ž


ž’’


































’



z$ModuleNode.generate_richcmp_functionc                    s®    |j”jd r  d|j ”f ” d S |jjtjtj	fv r+d}d }n|jjtj
tjfv r<d}dd}n	t|d|  d S fd	d
 fdd}|jjrn|jjsnt|d|jj|jjf    ”  | ” }|r}  |”   ” tt|jj}	tt|jj}
jj}jjr£  |”}  tjdd|j|	|
||jjdd||jjdd|||d
dd ”   ”  |rÕ  d” d S 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#   )Ślookupru  r  )Śmethod_namer„   r   r'   r(   Śget_slot_method_cname	  s   
zAModuleNode.generate_binop_function.<locals>.get_slot_method_cnamec                    s@   | }|rd||rdf S df S d   jj”f 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_staterL  r  )rĀ  r  r  ©rW   Ś	extra_argŚ	func_namerĆ  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	BinopSlotrX  F)r  T)
rĒ  Ś	slot_nameŚoverloads_leftŚoverloads_rightZ	call_leftZ
call_rightr\  Ś	slot_typerĘ  Śextra_arg_decl©rC   r   rŲ   )rr  rÉ  r6   rę   Z	left_slotrs  Ś	signaturer   rĄ  ZibinaryfuncZpowternaryfuncZipowternaryfuncr   rĀ  Z
right_slotr   Zpreprocessor_guard_coder   rĮ  rB   rL  r  r  rÄ  r   r	  r   )rJ   r,   rS  rW   rG   rĢ  rĶ  rČ  Zpreprocessor_guardrŹ  rĖ  Zparent_type_cnamer'   rÅ  r(   rN  	  sj   

žž


öžó’’z"ModuleNode.generate_binop_functionc                    s°   d fdd	  d} d}|j tjdddd |d ur(| d	|j ” n| d
” |d urH| d” | d” | d|j ” | d” | d” | d” | ”  d S )Nc                    sN   |d u rj }|j | ”}|d u r%|jr|d ur|S |jd ur% | |jS |S r#   )rL  r,   r  Śis_externalr  )ŚnŚtpZextern_returnŚr©Ślookup_here_or_baser,   r'   r(   rÕ  Ń	  s   
zBModuleNode.generate_getattro_function.<locals>.lookup_here_or_baser.  r/  Ztp_getattrozPyObject *o, PyObject *nFr  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)rx  r   ry  rę   r  r   )rJ   r,   rW   Zgetattr_entryZgetattribute_entryr'   rŌ  r(   rB  Ź	  sF   ’’’’’’’’’’z%ModuleNode.generate_getattro_functionc                 C   sŌ   |j j}| d”}| d”}| |tjdd” | d” |r'| d|j ” n|  |d ddd|” | d	” | d
” | d” |rK| d|j ” n|  |d ddd|” | d” | d
” | d
” | 	”  d S )Nr0  r1  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Ł   r­  zreturn %s(o, n);z(return PyObject_GenericSetAttr(o, n, 0);rÆ  r±  r'   r'   r(   rC  ų	  sX   

’’’’’’’’’’’’’z%ModuleNode.generate_setattro_functionc                 C   sn   |  d”}|j|tjdddd | d” | d” | d” | d	|j ” | d
” | d” | ”  d S )Nr2  Ztp_descr_getz%PyObject *o, PyObject *i, PyObject *cFr  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  rx  r   ry  rę   r  r   )rJ   r,   rW   Zuser_get_entryr'   r'   r(   rD  
  s.   
’’’’’’’z&ModuleNode.generate_descr_get_functionc                 C   sč   |j j}| d”}| d”}| |tjdd” | d” |r'| d|j ” n|  |d ddd|” | d	” | d
” | d” | d” |rP| d|j ” n|  |d ddd|” | d” | d
” | d” | d” | 	”  d S )Nr3  r4  Ztp_descr_setr©  rŖ  r«  Zdescrsetfuncr¬  ś6PyErr_SetString(PyExc_NotImplementedError, "__set__");r  rŁ   r­  r®  z9PyErr_SetString(PyExc_NotImplementedError, "__delete__");rÆ  )rJ   r,   rW   r  Zuser_set_entryZuser_del_entryr'   r'   r(   rE  :
  sd   

’’’’’’’’’’’’’’’z&ModuleNode.generate_descr_set_functionc                 C   sH   |j D ]}|j}| dg”r|  ||” | ddg”r!|  ||” qd S )Nr2  r3  r  )Śproperty_entriesr,   rH  Śgenerate_property_get_functionŚgenerate_property_set_function)rJ   Zcclass_scoperW   r„   Śproperty_scoper'   r'   r(   rO  e
  s   
ūz&ModuleNode.generate_property_accessorsc                 C   s\   |j }|j tj|j”|_| d”}| d” | d|j ” | d|j	 ” | d” d S )Nr2  r<   ś9static PyObject *%s(PyObject *o, CYTHON_UNUSED void *x) {śreturn %s(o);rŁ   )
r,   Śparent_scoper  r   Zprop_get_prefixrc   Śgetter_cnamer  rę   r  )rJ   Śproperty_entryrW   rŚ  Z	get_entryr'   r'   r(   rŲ  m
  s&   ’

’’’’’z)ModuleNode.generate_property_get_functionc                 C   sŅ   |j }|j tj|j”|_| d”}| d”}| d” | d|j ” | d” |r4| d|j	 ” n
| d” | d” | d	” | d
” |rS| d|j	 ” n
| d” | d” | d	” | d	” d S )Nr3  r  r<   z@static int %s(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {rŖ  zreturn %s(o, v);rÖ  r  rŁ   r­  rÜ  z6PyErr_SetString(PyExc_NotImplementedError, "__del__");)
r,   rŻ  r  r   Zprop_set_prefixrc   Śsetter_cnamer  rę   r  )rJ   rß  rW   rŚ  r²  r³  r'   r'   r(   rŁ  }
  sf   ’


’’’’’’’’’’’’’’’z)ModuleNode.generate_property_set_functionc                 C   s\  |j }|j}t d|jj”}| ||” t d|jj”}| |”s1| d” | 	||” | d” |j
r8|j}nd|j }|jsE| d”nd }|rN|jrNd }t|}	|	r½|j t dd”” | d	|j ” | d
” |rw| 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’  r  ZIncludeStructmemberHr2  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 "r­  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   r  rl   r6   Zgenerate_substructure_specZis_emptyrę   Śgenerate_substructurerŽ  r  rF  r  r  rB   rm   r	   rn   r  rž   r   rG   rM  Zgenerate_specŚ
class_namerņ   r¢   r  rs  )rJ   r„   rW   Śext_typer,   Zmembers_slotZbuffer_slotŚ	objstructZweakref_entryZgenerate_membersŚpositionZweakref_warn_mesagerS  Ś	classnamer'   r'   r(   rQ  „
  sn   





’
’



’








z ModuleNode.generate_typeobj_specc                 C   sā   |j }|j}t |jj”jD ]}| ||” q| d” |j	dkr$d}nd}| ||j
 ” | d” |j ” }| d| j|f ” |jrI|j}	nd|j }	| d|	 ” | d	” t |jj”D ]}
|
 ||” qa| 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   rM  rl   r6   Zsubstructuresrā  rę   rĖ   r  rć  rņ   r¢   rŽ  r  Śgenerate)rJ   Śmodnamer„   rW   r£   r,   Zsuiterģ  rē  rå  rS  r'   r'   r(   rR  ģ
  sB   

’
ž’
’’’z&ModuleNode.generate_typeobj_definitionc                 C   s   |j r|jsd S |jd }| d” | ” }| d|j ” |jD ]}|js3|r+|js3|j|d|d q!| d” | d” | 	” rI| d” d S d S )NŚbindingr<   zstatic PyMethodDef %s[] = {r  )Śwrapper_code_writerz{0, 0, 0, 0}rĢ  )
Zis_c_class_scopeZpyfunc_entriesr6   rę   r  Śmethod_table_cnameZfused_cfunctionZis_overridableZput_pymethoddefŚgetvalue)rJ   r7   rW   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 )Nr5  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;rŖ  z#define z PyObject_GenericGetDictrŲ   )r  Zis_variablerr  rž   rę   rW  )rJ   r,   rW   Ś	dict_attrrĒ  Z	dict_namer'   r'   r(   rI  "  s$   







z(ModuleNode.generate_dict_getter_functionc                 C   s   |j rK| d” | d|j ” |j D ]+}|j}|r(|jr!| ” }d| ”  }nd}| d|j ” |jp5d|j	p9d|f ” q| d” | d” d S 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_cnamerŖ   Z
is_unicodeZas_utf8_stringrņ   rc   rŽ  rą  )rJ   r7   rW   r„   rŖ   Zdoc_coder'   r'   r(   rP  :  s:   
’’
ü’’’ėz ModuleNode.generate_getset_tablec                 C   s<   t |j ” D ]\}}|jr|jr|jjs|j |” qd S r#   )rÆ   r°   r±   Ś
is_cglobalr  r£   r   rÄ  r¶   r'   r'   r(   r®   S  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r5| d| ” q'| 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r¤| d” | d” | d” | d| ” |jjrė|jjs·|jjrĖ|j |d”}| d|| |j”f ” | d” |j|j|jdd | d|jt |jtd”f ” n)|j |”r| |j d|j|j|”” n| d ||jf ” | | |j”” | d” qz| d!” | d"tj ” | d” | d#” |  |j!”rF| "|j!” | #t$| j%” ||_!| d$” | d%” | d” | d&” | &t 'd'd(”” | (”  d S ))NZCStringEqualsrg  śint r^   ś *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")) {rl  zif (!(%s)) %s;zPy_INCREF(o);Frō  ś%s = %s;zGPyErr_Format(PyExc_TypeError, "Cannot convert Python object %s to %s");r­  z3if (PyObject_SetAttr(%s, py_name, o) < 0) goto bad;r  r  r  r<   Z
ImportStarri   ))rm   r	   rn   Śstart_initcfuncr   Zimport_star_setŚmodulestatetype_cnameŚmodulestatevalue_cnamerę   rÆ   r°   r±   r³   Znew_error_labelrļ  r  r£   Zis_constr   r  r{  Ztype_test_codeŚ
error_gotorG   Ś
put_decrefrž   r   r¦  r   rÄ  Zfrom_py_call_coderÅ  Ś
label_usedŚerror_labelŚ	put_labelŚput_add_tracebackr
   r¢   r?  r@  r   )rJ   r7   rW   rc   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 urD|  dtj
 ” d S d S )Nztypedef struct {r  )rę   Śmodule_dict_cnamer   Śbuiltins_cnameŚcython_runtime_cnamer  Śempty_bytesŚempty_unicoder   rĘ  rĒ  rŅ  r'   r'   r(   rA  ¢  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_endZmodule_state_clear_endZmodule_state_traverse_endz} %s;r<   ZMultiPhaseInitModuleStater2  ś#if CYTHON_USE_MODULE_STATEś#ifdef __cplusplusśnamespace {zextern struct PyModuleDef %s;ś} /* anonymous namespace */rŖ  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õ  rm   r	   r@  Śpymoduledef_cnamer~  rÅ  )rJ   r7   rN  rl   r1  r3  r4  r'   r'   r(   rK  ®  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” |  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  ś"#if CYTHON_PEP489_MULTI_PHASE_INITz__Pyx_State_RemoveModule(NULL);rŲ   ©
rę   r   rÅ  rõ  rż  rž  r’  r  r   r  rŅ  r'   r'   r(   rB  į  s2   

’’’’’’

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 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->rk  z)__Pyx_VISIT_CONST(traverse_module_state->r  rŅ  r'   r'   r(   rC  ų  s   

z)ModuleNode.generate_module_state_traversec              
   C   s 	  |   | j| j|”}|  ||” | | j” | d” | t dd”” t	d|j
 }d|  d|” }| d| ” | jjrS| d” | d	|  d|” ” | d
” |  |j
”}|rl| 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#” |  ||” |sM|rU|
 ”  | ”  t d$d”}| |” |  |” | d%” | t d&d”” | !| jd'” | "tj#”}| d(|| $|| j”f ” | "tj%”}| d)|| $|| j”f ” | "tj&”}| d*|| $|| j”f ” | d+” |jd, rČ| !| jd-” | d.” | !| jd/tj d0” | d1” | !| jd2” | d|  '”  ” | !| jd3|j| (t	d4”| (t	d5”f ” | d” |  )||” t*j+r%| d6” | !| jd7tj d0” | d8” | !| jd9tj d0” | !| jd:tj d0” | d;” |d<}|  ,||” W d    n	1 s]w   Y  |d=}|  -||” W d    n	1 sxw   Y  |d>}|  .||” W d    n	1 sw   Y  | /|” |d?}|  0||” W d    n	1 s³w   Y  |d@}|D ]
}|  1|||” qæW d    n	1 sÕw   Y  |dA}|D ]
}|  2|||” qįW d    n	1 s÷w   Y  |dB}|D ]}|  3|” |  4|||” qW d    n	1 sw   Y  | 5|” | dC” | 6d ” |s8|rJ|j7j8s?J | 9|| j” dD|j7_:| 6d ” | j; <|” | 6d ” |s`|rwdE|j7_:|j7j8skJ |j=dF| jdG | >”  | ”  | dH” |  ?||” | ”  t*j@r£|j t dId”” | dJ| A| j” ” | B|jC” | D|jE” |j7 F” D ]\}}| G||” q“|sĘ|rŠ| H”  | I| j” | d|j ” | dK| "|jJ” dL” | Kt	dM|jL ” |j tMjN” | d” | dN” |jO|jtPdEdDdO | d!” |jQ|jtPdEdP | dQ” | dR” | dS” | dTtj ” | dU” | d” | d
” | dV” | dW|jL ” dd  ” | d” | D|jC” | R”  | d” | dX|j ” | d!” | dY|j ” | d
” | d” |
 S|j7” | T”  d S )ZNr<   ZPyModInitFuncTyper2  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  rh  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.cr¤  zif (%s == %s) return 0;zrPyErr_SetString(PyExc_RuntimeError, "Module '%s' has already been imported. Re-initialisation is not supported.");r   r6  r  rŖ  z if (%s) return __Pyx_NewRef(%s);z /*--- Module creation code ---*/ZImportRefnannyAPIz__Pyx_init_runtime_version();ZCheckBinaryVersionzs__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API)z%s = PyTuple_New(0); %sz)%s = PyBytes_FromStringAndSize("", 0); %sz+%s = PyUnicode_FromStringAndSize("", 0); %sz)/*--- Library function declarations ---*/Z
np_pythranz_import_array()z4/*--- Initialize various global constants etc. ---*/z__Pyx_InitConstants(r_   zstringtab_initialized = 1;z__Pyx_InitGlobals()zPyObject_SetAttr(%s, %s, %s)r   Ś__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)rG   z/*--- Wrapped vars code ---*/ZRegisterModuleCleanupzif (__Pyx_RegisterCleanup()) %szif (z && stringtab_initialized) {zinit %srŗ  ©rõ  r  rō  zif (pystate_addmodule_run) {zPyObject *tp, *value, *tb;zPyErr_Fetch(&tp, &value, &tb);zPyState_RemoveModule(&%s);zPyErr_Restore(tp, value, tb);z} else if (!PyErr_Occurred()) {z.PyErr_SetString(PyExc_ImportError, "init %s");zreturn (%s != NULL) ? 0 : -1;z
return %s;)UrK   rG   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  rl   r6   Zuse_fast_gil_utility_coderm   rn   Zput_declare_refcount_contextrÅ  rņ   Śgenerate_module_creation_codeZput_trace_declarationsZput_trace_frame_initŚput_setup_refcount_contextŚput_error_if_negŚ name_in_main_c_code_module_stater  Śerror_goto_if_nullr   r  r:  Zintern_identifierŚgenerate_module_import_setupr   Ścache_builtinsŚgenerate_global_init_codeŚgenerate_c_variable_export_codeŚgenerate_c_function_export_coderZ   Śgenerate_type_init_codeŚ$generate_type_import_code_for_moduleŚ*generate_c_variable_import_code_for_moduler  Ś*generate_c_function_import_code_for_modulerX   rį  Ś	funcstateZ	gil_ownedZ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_coder  r   rų  Śput_finish_refcount_contextŚput_temp_declarationsr   )rJ   r  rQ  r7   rW   ZsubfunctionZmodinit_func_nameZheader3r  Zmod_create_funcŚtempdecl_coder	  r
  Zrefnanny_import_coder  r   r  r~   rÄ   rž   r£   r'   r'   r(   rD    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                       s:   e Zd Zd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J d| | _|| _d | _d | _d S )Nr¬  z^[a-z0-9_]+$z__Pyx_modinit_%s)	r[  Ślowerr	  r   ŚmatchŚ
cfunc_nameŚdescriptionr'  Ś	call_code)rJ   Z	code_typerž   r'   r'   r(   rL     s   

zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__init__c                 S   s   |  ” | _d S r#   )r  r,  rV   r'   r'   r(   rU     rR   zIModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.set_call_codec                    s   | j d u r
 ” | _  }|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(rk  z/*--- %s ---*/)r,  r  rō  r*  r   rõ  rö  rę   r'  r  r
   r+  rV   )Śfunction_codeŚ	orig_coder,   r'   r(   Ś	__enter__"  s   

ž
zEModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__enter__c                    sņ   |d urd  | _ | _d S  }| ”  | d” | j  |j” d | _ | |j”}|rH| |j” |j 	” D ]
\}}| 
||” q4| ”  | d” | d” | ”  |re| 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^   rk  )r'  r,  r%  rę   r&  r   rł  rś  rū  r#  r$  r   Śerror_goto_if_negr*  r   rö  )rJ   Śexc_typeŚ	exc_valueŚexc_tbrW   Zneeds_error_handlingrž   r£   )r-  rG   r'   r(   Ś__exit__0  s:   


’’’’
zDModuleNode.mod_init_subfunction.<locals>.ModInitSubfunction.__exit__N)r   r   r   rL   rU   r/  r4  r'   ©r-  r.  rG   r,   r'   r(   ŚModInitSubfunction  s
    r6  )r  )rJ   rG   r,   r.  r6  r'   r5  r(   rK     s   	:zModuleNode.mod_init_subfunctionc                 C   sč  |j d }|dkr| jd j}|r| d” | d|j| tt|”| | j”f ” | d” |j	r| d” |j
 td”}| d|| tttj |””| || j”f ” | |t” | d	|j|| | j”f ” | |t” |j
 |” | d” n)|j	rŖ| 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SetPackagePathFromImportLibri   z%__Pyx_SetPackagePathFromImportLib(%s)z	.__init__rh  z0PyObject *modules = PyImport_GetModuleDict(); %srN  z)if (!PyDict_GetItemString(modules, %s)) {z%PyDict_SetItemString(modules, %s, %s))r6   rG   rm  rę   rÅ  Śget_py_string_constr
   r   r÷  r  r   Śallocate_tempr   rĒ   r%   rZ  r  Ś
put_gotrefr  Śrelease_temprl   rm   r	   r@  r0  r¢   Śendswithr  rņ   )rJ   r7   rW   Śmodule_pathŚtempZfq_module_nameZfq_module_name_cstringr'   r'   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 ]2}|jdkr|jjrv|jrv|jrf|j}n| |j”}|j||jddd |j |”r|j ||” qQ| dtj d” t jdkr“| d” t|jt d”dD ]}| |j”}|j||ddd q¢t 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"” | d#” | d” | d$” | d” qät j+d urp|j tj,tddd% tj-tj.fD ]}| |”}|j |tddd% qv|j | |j/”tddd% d S )&Nz.static void %s(CYTHON_UNUSED PyObject *self) {rń  rÆ  r  zif (!__Pyx_State_FindModule(&z
)) return;rŲ   z! = __Pyx_PyModule_GetState(self);r   z/*--- Global cleanup code ---*/r
  TF)r  rõ  z__Pyx_CleanupGlobals(rk  é   z$/*--- Type import cleanup code ---*/r  r©  z /*--- Builtin cleanup code ---*/z/*--- Intern cleanup code ---*/rd  r   re  zwhile (%s > 0) {z"PyObject* o = (PyObject*)%s[--%s];r  r  r  rŖ  r  r  r8  r  rŁ   r  )0r   r"  rę   r   Ścleanup_cnamer   rõ  rö  r  rk  rŪ   r  rĖ   r£   r   r  rļ  rž   rÄ  r   r  r  rÆ   Śtypes_importedr  r  r  r  r  Zcached_builtinsr   r   r  r  r”   rŠ  r  r,   r6   r  rr  rv  rw  rĘ  rĒ  r’  rž  rż  )rJ   r7   rW   Zrev_entriesr„   Zentry_cnamerä  r  Zcclass_typer,   rv  rw  rž   r'   r'   r(   rE    s¼   ’






ż

ż

ż
ż

’
’
’












’


žz'ModuleNode.generate_module_cleanup_funcc              	   C   sT   |   ” }tjdkrd}ntj}tjdd|j|tj|ttjdd}|j 	|” d S )NŚmainŚwmainZMainFunctionzEmbed.c)r¤   rP  r7  Zwmain_methodŚembed_modulesrĪ  )
r:  r   rF  r   rn   r¤   ŚtuplerC  rl   rm   )rJ   r7   rW   rP  rB  r7  r'   r'   r(   rG  ū  s   
ūžzModuleNode.generate_main_methodc                 C   s:   |  ” r	d| }nd| d” dd” d” }d||f S )Nr¬  ZU_Śpunycodeó   -ó   _rø  z%s%s©ŚisasciiŚencoder  Śdecode)rJ   r  rc   r'   r'   r(   r    s   
zModuleNode.punycode_module_namec                 C   s,   |  ” rd S dd|  d” dd” d” S )NZPyInitUr¬  rE  rF  rG  rø  rH  )rJ   rc   r'   r'   r(   r    s    z%ModuleNode.wrong_punycode_module_namec                 C   s   |   ||j”S r#   )r  r¤   )rJ   r  r7   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_cname)rJ   r7   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” | 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” | d-” | d.” | d,| ” | d” | d” | d” | d/” | d” d S )0Nś%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_FREETHREADINGz-{Py_mod_gil, __Pyx_FREETHREADING_COMPATIBLE},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 =rŖ  zstatic struct PyModuleDef %s =rh  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  )rŖ   Śget_string_constr   r"  r   r?  rę   r  Zpymodule_create_func_cnameZpymoduledef_slots_cnamer  r6   r¤   rI  r  rņ   rõ  rģ  rÅ  )rJ   r7   rW   rŖ   Zcleanup_funcZexec_func_cnameZsubinterp_optionr'   r'   r(   r  %  s   

’



żü





























z&ModuleNode.generate_pymoduledef_structc           	   	   C   sz  |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 r¤d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 ur;| d tjtj| 
tj| j”f ” d S d S )!NrL  rĖ  F©Z
manage_refr  ró  rō  rŖ  z%s = PyModule_Create(&%s); %srŲ   r  rh  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Ł   r®  rÆ  rM  r±  r²  r³  zPyUnstable_Module_SetGIL(ró  rk  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)rŖ   rO  r   r8  r   rę   r   r  Z
put_increfr  r  rG   r¤   rņ   r0  rÅ  r:  r6   rö  r~  r  rż  rž  r’  r÷  r   rĘ  rĒ  )	rJ   r7   rW   rŖ   Zmodule_tempZ
gil_optionZ
dict_cnamerž  Zruntime_cnamer'   r'   r(   r  p  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Ė   r  r£   Zglobal_init_codera  r}  )rJ   r7   rW   r„   r'   r'   r(   r  Į  s   

śz$ModuleNode.generate_global_init_codec              	   C   s®   t |j ” D ]M\}}|jrT|jsT|j|u rT|j |”s%t|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 objectrh  zPyObject* wrapped = %s(%s);Śwrappedz6if (PyObject_SetAttrString(%s, "%s", wrapped) < 0) %s;rŁ   )rÆ   r°   r±   r²   r³   r,   r£   rĆ  r   rG   rę   Zto_py_functionrž   r  rÅ  r÷  )rJ   r7   rW   rc   r„   r'   r'   r(   r!  Ģ  s.   ’

ž
ż’
šz(ModuleNode.generate_wrapped_entries_codec                 C   s   dd |D S )Nc                 S   s,   g | ]}|j s|jstjr|jd kr|qS )r
  )rĢ   rĆ   r   r'  rĖ   rĶ   r'   r'   r(   rf   ą  s    žžž
’z7ModuleNode._select_exported_entries.<locals>.<listcomp>r'   )rJ   Śall_entriesr'   r'   r(   Ś_select_exported_entriesß  s   ’z#ModuleNode._select_exported_entriesc                 C   óL   |   |j”}|s
dS dd |D }|j t dd”” t|| j|dd dS )śOGenerate code to create PyCFunction wrappers for exported C functions.
        Nc                 S   ó    g | ]}|j  ” |j|jfqS r'   )r£   r   rc   rž   rĶ   r'   r'   r(   rf   ģ  ó    ’žz>ModuleNode.generate_c_variable_export_code.<locals>.<listcomp>ZVoidPtrExportri   Z__Pyx_ExportVoidPtrzvoid *{name})rT  rŪ   rl   rm   r	   rn   ro   rG   ©rJ   r7   rW   r°   rp   r'   r'   r(   r  å  ó   ż
’z*ModuleNode.generate_c_variable_export_codec                 C   rU  )rV  Nc                 S   rW  r'   ©r£   r  rc   rž   rĶ   r'   r'   r(   rf   ż  rX  z>ModuleNode.generate_c_function_export_code.<locals>.<listcomp>rh   ri   rj   rk   )rT  rĀ   rl   rm   r	   rn   ro   rG   rY  r'   r'   r(   r  ö  rZ  z*ModuleNode.generate_c_function_export_codec              	   C   sV   t |}|jD ]}|jr|  ||j|j||” qW d    d S 1 s$w   Y  d S r#   )r!  r”   rĆ   Śgenerate_type_import_coder£   rG   )rJ   rÄ   r7   rW   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)rJ   Zpxd_envr„   r'   r'   r(   r    s
   
żz!ModuleNode.specialize_fused_typesc                    s    fdd|D S )Nc                    s    g | ]}|j r r|jr|qS r'   )rĆ   r  rĶ   ©Ś	used_onlyr'   r(   rf     s    žžž’z7ModuleNode._select_imported_entries.<locals>.<listcomp>r'   )rJ   rS  r^  r'   r]  r(   Ś_select_imported_entries  s   
’z#ModuleNode._select_imported_entriesc                    sj   | j jdd}|sdS |u   fdd|D }|j t dd”” t|| j|jdt	j
 d	 dS )
śQGenerate import code for all exported C functions in a cimported module.
        Fr]  Nc                    s4   g | ]}|j  ” |j r|jn tj|j”fqS r'   )r£   r   rc   rž   r  r   r$  rĶ   ©Zis_module_scoperÄ   r'   r(   rf   *  s    żžžzIModuleNode.generate_c_variable_import_code_for_module.<locals>.<listcomp>r  ri   Z__Pyx_ImportVoidPtr_zvoid **{name})r_  rŪ   rl   rm   r	   rn   rw   rG   r  r   rv   ©rJ   rÄ   r7   rW   r°   rx   r'   ra  r(   r  "  s   ū
’’z5ModuleNode.generate_c_variable_import_code_for_modulec                 C   s\   | j |jdd}|sdS dd |D }|j t dd”” t|| j||jdt	j
 d	 dS )
r`  Tr]  Nc                 S   rW  r'   r[  rĶ   r'   r'   r(   rf   >  rX  zIModuleNode.generate_c_function_import_code_for_module.<locals>.<listcomp>rs   ri   rt   ru   )r_  rĀ   rl   rm   r	   rn   rw   rG   r  r   rv   rb  r'   r'   r(   r  7  s   ż
’’z5ModuleNode.generate_c_function_import_code_for_modulec              	   C   s   t |;}|jD ].}|jdkr|js|  ||j|j||” q|  ||||” |  ||” |jj	r6|  
||” qW d    d S 1 sBw   Y  d S rQ  )r!  r”   rĖ   Śutility_code_definitionr\  r£   rG   Śgenerate_base_type_import_codeŚ!generate_exttype_vtable_init_codeZ
early_initŚgenerate_type_ready_code)rJ   r7   rW   r%  r„   r'   r'   r(   r  I  s   

ł"’z"ModuleNode.generate_type_init_codec                 C   sV   |j j}|r!|j|jkr#|js%|js'|js)|  ||| j||” d S d S d S d S d S d S r#   )	r£   r  r¤   r  r{  Zis_cython_builtin_typerc  r\  rG   )rJ   r7   r„   rW   r%  r  r'   r'   r(   rd  V  s   ’’žżz)ModuleNode.generate_base_type_import_codec              
   C   s   ||j v rd S |jtjvr|j t dd”” | j||||d |j	rC|j t dd”” | 
d|j	|j| |j”| |j	|”f ” |j  |” d S )Nr  ri   )Ś	error_posZ	GetVTablez(%s = (struct %s*)__Pyx_GetVtable(%s); %s)r@  rc   r   Śctypedef_builtins_maprl   rm   r	   rn   r"  r  rę   r  r  r  r  ry  )rJ   r7   r£   rG   rW   r%  r'   r'   r(   r\  ]  s$   

’
’
üz$ModuleNode.generate_type_import_codec                 C   s(  |j r|jnd|j  }}|j}	|j}
|	dv }|s!d|	 d}	n/|
tjv r:| | |j” dtj|
  d” d S d}	|
tj	v rFtj	|
 }
|tj
v rPtj
| }|s]|d usXJ | |”}| |	|”}|j}|sm| |”}| | dtj d| d	|	 d	|j ”  d

” dtj }| d” | d| d| d| d” | d” |r¬| d” n| d| d| d| d” | d” | d| d| d| d” | d” |jrą|jdv rą|j}n|jrę|jréd}ntd|j d|	 d|j | d| ”  dtj d” | d| d| ” d S )Nr  )Ś__builtin__Śbuiltinsr­  r®  rÆ  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,rŖ  rŲ   )r   ŚwarnŚignorer   zinvalid value for check_size 'z' when compiling rÖ   Z__Pyx_ImportType_CheckSize_r¬  rk  z if (!z) )rŽ  r  r¤   rc   r   rh  rę   rÄ  r  Zrenamed_py2_builtins_mapZbasicsize_builtins_mapr÷  rx  r  r   rv   rņ   Ś
check_sizerŠ  Zis_subclassedŚRuntimeErrorr
  rĀ  )rJ   r£   rW   r%  r  rg  r  Zsizeof_objstructrå  r¤   Ś	type_nameŚ
is_builtinrÄ   r  Zalignment_funcrm  r'   r'   r(   r"  r  sf   
’





’’’’



’z$ModuleNode.generate_type_import_callc                 C   s   t j ||” d S r#   )r   ZCClassDefNoderf  )rJ   r„   rW   r'   r'   r(   rf  Æ  r  z#ModuleNode.generate_type_ready_codec                 C   s   | j  dd”}|  tj|”S r’   )r¢   r  r  r   rP  )rJ   r¢   r'   r'   r(   r:  ²  s   z$ModuleNode.is_main_module_flag_cnamec                 C   sØ   |j }|jrN| d|j|jf ” |jr&|jjr&| d|jtj|jjf ” dd |jjD }|rP|D ]}|j	p:|j }| 
” }| d|j|j||jf ” q3d S d S d S )Nz	%s = &%s;z%s.%s = *%s;c                 S   s   g | ]}|j r|qS r'   )r  rĶ   r'   r'   r(   rf   Ę  s    ž’z@ModuleNode.generate_exttype_vtable_init_code.<locals>.<listcomp>z%s.%s = %s%s;)r£   rT  rę   r  r  r   r  r,   rĀ   Śvtable_typeZsignature_cast_stringrž   r  )rJ   r„   rW   r£   Zc_method_entriesZ
meth_entryrq  Ścastr'   r'   r(   re  ¶  sD   ž’ż’’ü’ķz,ModuleNode.generate_exttype_vtable_init_coder  )F)TT)NNF)yr   r   r   Zchild_attrsr6   r   r   Śpropertyr   r    r¦   r§   r¬   r·   rĮ   rÅ   rÉ   r¾   rš   rć   ræ   rķ   rī   r½   rM  rL  r»   r  r  r¼   r   rI  Śstaticmethodr¦  r8  rź   rģ   rč   rH  rÓ  rē   rß  rŲ  rä  rÖ  rī  rŚ  rž  rŪ  rŁ  r  r  r  r  r  r  r¢  r£  r¤  r;  r<  r9  rW  r^  r:  r;  r<  r  r>  r?  r@  rA  r°  rK  rN  rB  rC  rD  rE  rO  rŲ  rŁ  rQ  rR  r=  rI  rP  r®   r>  rA  rK  rB  rC  rD  rK   r  rE  rG  r  r  rń   r  r  r  r  r!  rT  r  r  r  r  r_  r  r  r  rd  r\  r"  rf  r:  re  r'   r'   r'   r(   r   ¾   sü    

+

bgh& ,
 #
%c#,3		<
 $ %WN8 I.'+(G G3  	G;nKQ	

=r   c                 C   sP   t t|  \}}}t|}d }t|D ]\}}||kr d||< q|}q|||fS )Nr<   )ŚziprÆ   rk  rl  )Zitem_tuplesŚ
signaturesŚnamesr±   Zlast_sigŚirĻ  r'   r'   r(   Ś_deduplicate_inout_signatures×  s   

ry  rW   c                    s2  t |\}}	}
tj |rdnd d}|jdd d |” d”}d |	” d”} fdd	|
D }t|d
 | d}|rc|  d| d|  |” d” |  d” |  |  	| d|”” |  d” n|  d| d| 
”  d” |  d| d| dt|d  d” |  |jd| dd dd |” d  d” | j t dd”” |  |jd| dd d | d!” |  d"| d#| d$” |  d%| d&” |  || d'| d| d(| d)| d*
” |  d+| d,” |  | d-| d.” |  | d/| d0” |  d1| d2| d#| d$” |  d3” d S )4Nr  Zexportr¬  r<   )rc   ś zutf-8c                    s   g | ]
}d   d| qS )r^   z)&r'   )re   Z
item_cname©Zpointer_castr'   r(   rf   ļ  r¶  z0_generate_import_export_code.<locals>.<listcomp>ó    zconst char * z#signature = __Pyx_PyBytes_AsString(rk  z#if !CYTHON_ASSUME_SAFE_MACROSrĻ  rŲ   zsignature = rÆ  zname = zsignature + r   zconst z
pointers[]z = {ró  z, (z) NULL};rf  rg  zconst *Śpointerr®  z	pointers;zconst char *zcurrent_signature = z
signature;zwhile (*z
pointer) {r^   zname, *z	pointer, zcurrent_signature)z++zpointer;zname = strchr(zname, '\0') + 1;zsignature = strchr(zsignature, '\0') + 1;zif (*zsignature != '\0') rŁ   )ry  r   Zpyrex_prefixŚformatr[  rJ  r    rę   r7  r  rņ   r  rl   rm   r	   rn   r  )rW   rG   Zinout_item_tuplesZper_item_funcŚtargetŚpointer_declŚuse_pybytesŚ	is_importrv  rw  Zinout_itemsŚpyxZ	sig_bytesZnames_bytesZpointersZsigs_and_names_bytesr'   r{  r(   Ś_generate_import_export_codeē  s<   
&2
’& žr  c              
   C   s   |   d” | jjtdd}| j t dd”” |   | d|  ||” ” |  	|t” t
| |||||ddd |  |t” | j |” |   d	” d
S )zqGenerate function/pointer export code.

    'exports' is a list of (signature, name, exported_cname) tuples.
    rh  TrP  Z
GetApiDictri   z! = __Pyx_ApiExport_GetApiDict(); F©r  r  rŁ   N)rę   r   r8  r   rl   rm   r	   rn   r  r9  r  r  r:  )rW   rG   rp   Zexport_funcr  Zapi_dictr'   r'   r(   ro     s   

’
’’ro   c              
   C   s   |   d” | jjtdd}|   | d| ”  d|  ||” ” |  |t” t| |||||ddd |  |t” | j 	|” |   d” dS )	zqGenerate function/pointer import code.

    'imports' is a list of (signature, name, imported_cname) tuples.
    rh  TrP  z = PyImport_ImportModule(z); r  rŁ   N)
rę   r   r8  r   rņ   r  r9  r  r  r:  )rW   rG   rx   Zqualified_module_namery   r  Z
module_refr'   r'   r(   rw   )  s   

’’rw   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 | _|r| ” D ]\}}|| jd| < qg | _d S )Nz"%s")rW   Śimportedr±   Śtemps)rJ   rW   r  rc   rž   r'   r'   r(   rL   F  s   
zModuleImportGenerator.__init__c                 C   sf   || j v r
| j | S | j}|jjtdd}| j |” | d||||f ” | |t” || j |< |S )NTrP  z5%s = PyImport_ImportModule(%s); if (unlikely(!%s)) %s)	r  rW   r   r8  r   r  r   rę   r9  )rJ   Zmodule_name_stringr  rW   r=  r'   r'   r(   rx  N  s   

’
z%ModuleImportGenerator.imported_modulec                 C   s   | S r#   r'   r   r'   r'   r(   r/  [  rŌ  zModuleImportGenerator.__enter__c                 G   s.   | j }| jD ]}| |t” |j |” qd S r#   )rW   r  r  r   r   r:  )rJ   ŚexcrW   r=  r'   r'   r(   r4  ^  s
   
žzModuleImportGenerator.__exit__r#   )r   r   r   r   rL   rx  r/  r4  r'   r'   r'   r(   r!  A  s    
r!  c           
      C   sę   | j o| j}| j r| js| jso|s| js| jdks|rq| jdkr&tj}d}n| jdkr1tj}d }n| jdkr;d}d }nd}d }| j}| jrO|sOd}d }t	|}|j
| j|d}| | j”}	| d||	|f ” |j | ” d S d S d S )Nr
  r(  rŹ   r  r  r  z%s %s%s; /*proto*/)r  rc  Zinline_func_in_pxdr  rĆ   rĖ   r   rü   r£   r   rż   rž   r  r  rę   rl   rļ   )
r„   r7   rW   r  Zfrom_cy_utilityr&  r   r£   rģ  r  r'   r'   r(   r(  e  sF   ’’



’żär(  ZRefnannyr2  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)AŚcythonZdeclareŚobjectŚcollectionsr   r»  r  rĒ   rĪ  r   r*   Śtypingr   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.   r/   r9   rŗ  rA   ŚNodeZ	BlockNoder   ry  rŽ   r  ro   rw   r!  r(  r@  r9  rń  r'   r'   r'   r(   Ś<module>   s²   žåO                              7*$&
ś