a
    b6                     @   s   d dl m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m	Z	m
Z
 dd	lmZ d
d Zdd Zdd Zdd Zdd Zdd Zd/ddZdd Zdd Zdd Zd0dd Zd1d"d#Zd$d% Zd&d' Zd(d) Zd2d*d+Zi Zd3d-d.ZdS )4    )absolute_importN)time   )Errors)
DebugFlags)Options)CompileErrorInternalError
AbortError)Namingc                 C   s   t |   | S N)printdump)t r   h/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/Cython/Compiler/Pipeline.pydumptree   s    r   c                 C   s   t jdkrtd| S )Nr   zpipeline break)r   
num_errorsr
   )noder   r   r   abort_on_errors   s    
r   c                    s    fdd}|S )Nc                    sb   | j }| j}|ddf}tjd }t_ j||dd}|t_ j||d|d}| |_||_d|_|S )Nr   r   F)posZneed_pxdpxdfull_module_name)	source_descr   r   Zcimport_from_pyxfind_moduleparsecompilation_sourcescopeis_pxd)Zcompsrcr   r   Zinitial_posZsaved_cimport_from_pyxr   treecontextr   r   r      s    
z"parse_stage_factory.<locals>.parser   )r"   r   r   r!   r   parse_stage_factory   s    r#   c                    s    fdd}|S )Nc                    s"    j | dd}|_d|_|S )NTr   )r   r   r   )r   r    r"   module_namer   r   r   r   *   s    
z&parse_pxd_stage_factory.<locals>.parser   )r"   r   r%   r   r   r$   r   parse_pxd_stage_factory)   s    r&   c                    s    fdd}|S )Nc                    s   |    | j_S r   )Zprocess_implementationr   )module_nodeoptionsresultr   r   generate_pyx_code_stage3   s    z@generate_pyx_code_stage_factory.<locals>.generate_pyx_code_stager   )r)   r*   r+   r   r(   r   generate_pyx_code_stage_factory2   s    r,   c                    s    fdd}|S )Nc                    s(    j  D ]\}\}}| || q
| S r   )Zpxdsitemsmerge_in)r'   nameZstatlistnoder   r!   r   r   inject_pxd_code_stage;   s    z<inject_pxd_code_stage_factory.<locals>.inject_pxd_code_stager   )r"   r0   r   r!   r   inject_pxd_code_stage_factory:   s    r1   c                 C   s|   |d u rt  }| j D ]^}||v r&q|| |jrb|jrb||j |jjD ]}|| qPq|jrt	|j|| qd S r   )
setentriesvaluesaddusedZutility_code_definitionZuse_utility_coderequiresZ	as_moduleuse_utility_code_definitions)r   targetseenentryZrequired_utilityr   r   r   r8   B   s    
r8   c                    sB   i  fdd | D ]} | qdd t  dd dD S )Nc                    sR   | vrJd| < t }dt fdd| jp.dD p8dg |d  | < |  S )Nr   r   c                    s   g | ]} |qS r   r   .0dep)get_rankr   r   
<listcomp>Y       z8sort_utility_codes.<locals>.get_rank.<locals>.<listcomp>r   g:0yE>)lenminr7   )utilcodeZoriginal_orderr?   Zranksr   r   r?   U   s
    2z$sort_utility_codes.<locals>.get_rankc                 S   s   g | ]\}}|qS r   r   )r=   rE   _r   r   r   r@   ]   rA   z&sort_utility_codes.<locals>.<listcomp>c                 S   s   | d S )Nr   r   )kvr   r   r   <lambda>]   rA   z$sort_utility_codes.<locals>.<lambda>)key)sortedr-   Z	utilcodesrE   r   rF   r   sort_utility_codesS   s
    
rM   c                    sJ   i  | D ]}| |< q fdd| D ]}fdd|j p<dD |_ q&d S )Nc                    s    |  v r |  S |  | < | S d S r   r   )r>   )depsr   r   	unify_depe   s    z!normalize_deps.<locals>.unify_depc                    s   g | ]} |qS r   r   r<   )rO   r   r   r@   m   rA   z"normalize_deps.<locals>.<listcomp>r   )r7   rL   r   )rN   rO   r   normalize_deps`   s    
rP   c                    s    fdd}|S )Nc                    s   |    t j| j t| jj| j_t| jj g }| jjD ]r}||v rLq>|| |jr|jD ]&}||vrb|| jjvrb| jj| qb|j	 jd}|r>| j
|j|jdd q>| S )N)cython_scopeT)Zmerge_scope)Zprepare_utility_coder8   rQ   r   rM   Zutility_code_listrP   appendr7   Zget_treer.   body)r'   addedrE   r>   r    r!   r   r   inject_utility_code_stageq   s"    

zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r"   rU   r   r!   r   !inject_utility_code_stage_factoryp   s    rV   r   c           2   (   C   s  |dv sJ ddl m} ddlm}m}m}m} ddlm}m}	m	}
 ddlm
}m} ddlm}m}m} ddlm}m}m} dd	lm}m} dd
lm} ddlm}m} ddlm}m} ddlm}m} ddlm} ddlm} ddl m!} ddl"m#}m$} m%}! ddl"m&}"m'}# ddl"m(}$ ddl"m)}%m*}& ddl"m+}' ddl"m,}( ddl-m.}) ddl/m0}*m1}+ |dkrx|+},|| }-n|*},d }-|dkr|| }.nd }.|| || |-| || | j2|| || || || |.|| |% | || || |	 |
| || || |"| || || || || || |)| |,|$| || || || |!| | | |#| || || |(| |' |&| | g(}/g }0|/D ]}1|1j3|vr|04|1 q|0S )N)pyxpyr   r   	PrintTree)WithTransformNormalizeTree	PostParsePxdPostParse)ForwardDeclareTypesInjectGilHandlingAnalyseDeclarationsTransform)AnalyseExpressionsTransformFindInvalidUseOfFusedTypes)CreateClosureClassesMarkClosureVisitorDecoratorTransform)TrackNumpyAttributesInterpretCompilerDirectivesTransformBuiltinMethods)ExpandInplaceOperatorsParallelRangeTransform) CalculateQualifiedNamesTransform)MarkParallelAssignmentsMarkOverflowingArithmetic)AdjustDefByDirectivesAlignFunctionDefinitions)RemoveUnreachableCodeGilCheck)ControlFlowAnalysis)AutoTestDictTransform)EmbedSignature)FlattenInListTransformSwitchTransformIterationTransform)EarlyReplaceBuiltinCallsOptimizeBuiltinCalls)InlineDefNodeCalls)ConstantFoldingFinalOptimizePhase)DropRefcountingTransform)ConsolidateOverflowCheck)IntroduceBufferAuxiliaryVars)check_c_declarationscheck_c_declarations_pxdr   rX   )5VisitorrZ   ParseTreeTransformsr[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   ZTypeInferencerm   rn   ro   rp   rq   rr   ZFlowControlrs   ZAnalysedTreeTransformsrt   ZAutoDocTransformsru   Optimizerv   rw   rx   ry   rz   r{   r|   r}   r~   r   ZBufferr   Z
ModuleNoder   r   Zcompiler_directives	__class__rR   )2r"   modeexclude_classesrZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   Z_check_c_declarationsZ_specific_post_parseZ_align_function_definitionsZstagesZfiltered_stagessr   r   r   create_pipeline   s    




+r   Fc                 C   s   |r
d}nd}g }|j r0ddlm} ||  |jrlddlm} ddlm}	 |	|j
| _|	| ||g}
ng }
ttt| gt| ||d|t| t| tg|
t||gS )	NrX   rW      )TreeAssertVisitor)DebugWriterr   )DebugTransformr   )Zevaluate_tree_assertionsZ	TestUtilsr   rR   Z	gdb_debugZDebuggerr   r   r   ZCythonDebugWriter
output_dirZgdb_debug_outputwriterlist	itertoolschainr#   r   r1   rV   r   r,   )r"   r)   r*   rX   r   r   Ztest_supportr   r   r   Zdebug_transformr   r   r   create_pyx_pipeline   s4    
r   c                 C   s,   ddl m} t| ||gt| d | g S )Nr   )ExtractPxdCoder   )ZCodeGenerationr   r&   r   )r"   r   r%   r   r   r   r   create_pxd_pipeline  s    
r   c                 C   s   t | ||ddS )NT)rX   )r   )r"   r)   r*   r   r   r   create_py_pipeline  s    r   c              	      s   ddl m}m}m}m} ddlm}m} ddlm	  g }t
| | j||||||gd}	|	D ]}
||
 t|
|rX qvqX fdd}|| |S )Nr   )rp   re   r[   ra   )r|   rv   StatListNoder   c                    s\   | j j D ]:}|jsd|_|j|jkr|jdkr|j t	j
|j|_q | jg d| j fS )Nr   Zextern)stats)r   r3   r4   Zin_cincludeZdefined_in_pxdr/   cnameZ
visibilityZmangler   Zfunc_prefixr   )rootr;   r   r   r   fake_pxd$  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxd)r   rp   re   r[   ra   r   r|   rv   ZNodesr   r   r)   rR   
isinstance)r"   r*   rp   re   r[   ra   r|   rv   pipelineZpyx_pipelineZstager   r   r   r   create_pyx_as_pxd_pipeline  s&    



r   c                 C   s^   |s|sJ |p|}t | D ]\}}t||r q4q|r@|d7 }| d| |g | |d  S )z
    Insert a new transform into the pipeline after or before an instance of
    the given class. e.g.

        pipeline = insert_into_pipeline(pipeline, transform,
                                        after=AnalyseDeclarationsTransform)
    r   N)	enumerater   )r   Z	transformbeforeafterclsir   r   r   r   insert_into_pipeline/  s    
r   Tc              
   C   s  ddl m} tjrt  nd }dd }d }|}zz| D ]}|d ur8|sTt||rTq8tjrt }	td|  t	|dt
|j}
zt|
 }W n0 ty   td|
 | ||
  }t|
< Y n0 |||}tjr8tdt |	   q8W n8 ty } ztj|d	d
 |}W Y d }~n
d }~0 0 W n` tyV } ztjdkr> |}W Y d }~n2d }~0  ty~ } z|}W Y d }~n
d }~0 0 ||fS )Nr   rY   c                 S   s   | |S r   r   )phasedatar   r   r   runN  s    zrun_pipeline.<locals>.runzEntering pipeline phase %r__name__z'def %s(phase, data): return phase(data)z    %.3f secondsF)Z	use_stackr   )r   rZ   r   Zdebug_verbose_pipelineglobalscopyr   r   r   getattrtyper   _pipeline_entry_pointsKeyErrorexecr   r   Zreport_errorr	   r   r
   )r   sourceZ	printtreerZ   Zexec_nsr   errorr   r   r   Z
phase_nameerrr   r   r   run_pipelineJ  sB    
r   )N)r   )Fr   )NN)T)
__future__r   r   r    r   r   r   r   r	   r
   r   r   r   r#   r&   r,   r1   r8   rM   rP   rV   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s2   	

Z

