B
    d6                 @   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   e/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/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 )NT)r   r   )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!   r   r   parse_pxd_stage_factory)   s    r"   c                s    fdd}|S )Nc                s   |    | j_S )N)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%   r   generate_pyx_code_stage_factory2   s    r'   c                s    fdd}|S )Nc                s,   x& j  D ]\}\}}| || qW | S )N)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   r+   r   )r   r   inject_pxd_code_stage_factory:   s    r,   c             C   s   |d krt  }xp| j D ]b}||kr(q|| |jrh|jrh||j x0|jjD ]}|| qTW q|jrt	|j|| qW d S )N)
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   r3   B   s    
r3   c                sF   i  fdd x| D ]} | qW dd t  dd dD S )Nc                sR   | k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   s    z8sort_utility_codes.<locals>.get_rank.<locals>.<listcomp>r   g:0yE>)lenminr2   )utilcodeZoriginal_order)r9   ranksr   r   r9   U   s
    2z$sort_utility_codes.<locals>.get_rankc             S   s   g | ]\}}|qS r   r   )r7   r>   _r   r   r   r:   ]   s    z&sort_utility_codes.<locals>.<listcomp>c             S   s   | d S )Nr   r   )kvr   r   r   <lambda>]       z$sort_utility_codes.<locals>.<lambda>)key)sortedr(   )	utilcodesr>   r   )r9   r?   r   sort_utility_codesS   s
    
rG   c                sR   i  x| D ]}| |< q
W  fddx&| D ]}fdd|j pBdD |_ q,W d S )Nc                s    |  kr |  S |  | < | S d S )Nr   )r8   )depsr   r   	unify_depe   s    z!normalize_deps.<locals>.unify_depc                s   g | ]} |qS r   r   )r7   r8   )rI   r   r   r:   m   s    z"normalize_deps.<locals>.<listcomp>r   )r2   )rF   r>   r   )rH   rI   r   normalize_deps`   s    

rJ   c                s    fdd}|S )Nc                s   |    t j| j t| jj| j_t| jj g }x| jjD ]v}||krNq@|| |jrx0|jD ]&}||krf|| jjkrf| jj| qfW |j	 jd}|r@| j
|j|jdd q@W | S )N)cython_scopeT)Zmerge_scope)Zprepare_utility_coder3   rK   r   rG   Zutility_code_listrJ   appendr2   Zget_treer)   body)r#   addedr>   r8   r   )r   r   r   inject_utility_code_stageq   s"    
zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r   rO   r   )r   r   !inject_utility_code_stage_factoryp   s    rP   r   c       2   (   C   s  |dkst 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l0m1}*m2}+ |dkrx|+},|| }-n|*},d }-|dkr|| }.nd }.|| || |-| || | j3|| || || || |.|| |% | || || |	 |
| || || |"| || || || || || |)| |,|$| || || || |!| | | |#| || || |(| |' |&| | g(}/g }0x$|/D ]}1|1j4|kr|05|1 qW |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   rR   )6AssertionErrorVisitorrS   ParseTreeTransformsrT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   ZTypeInferencerf   rg   rh   ri   rj   rk   ZFlowControlrl   ZAnalysedTreeTransformsrm   ZAutoDocTransformsrn   Optimizero   rp   rq   rr   rs   rt   ru   rv   rw   rx   Bufferry   Z
ModuleNoderz   r{   Zcompiler_directives	__class__rL   )2r   modeexclude_classesrS   rT   rU   rV   rW   rX   rY   rZ   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{   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 )	NrR   rQ      )TreeAssertVisitor)DebugWriterr   )DebugTransform)r   )Zevaluate_tree_assertionsZ	TestUtilsr   rL   Z	gdb_debugZDebuggerr   r~   r   ZCythonDebugWriter
output_dirZgdb_debug_outputwriterlist	itertoolschainr    r   r,   rP   r   r'   )r   r$   r%   rR   r   r   Ztest_supportr   r   r   Zdebug_transformr   r   r   create_pyx_pipeline   s.    
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)rR   )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}	x"|	D ]}
||
 t|
|rZP qZW  fdd}|| |S )Nr   )ri   r^   rT   rZ   )ru   ro   )StatListNode)r   c                s`   xJ| j j D ]:}|jsd|_|j|jkr|jdkr|j t	j
|j|_qW  | jg d| j fS )Nr   Zextern)stats)r   r.   r/   Zin_cincludeZdefined_in_pxdr*   cnameZ
visibilityZmangler   Zfunc_prefixr   )rootr6   )r   r   r   fake_pxd$  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxd)r~   ri   r^   rT   rZ   r   ru   ro   ZNodesr   r   r$   rL   
isinstance)r   r%   ri   r^   rT   rZ   ru   ro   pipelineZpyx_pipelineZstager   r   )r   r   create_pyx_as_pxd_pipeline  s"    





r   c             C   s`   |s|st |p|}x t| D ]\}}t||rP qW |rB|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)r|   	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 }|}yyx| D ]}|d k	r:|sVt||rVq:tjrt }	td|  t	|dt
|j}
yt|
 }W n2 tk
r   td|
 | ||
  }t|
< Y nX |||}tjr:tdt |	   q:W W n6 tk
r } ztj|d	d
 |}W d d }~X Y nX W n\ tk
rX } ztjdkrD |}W d d }~X Y n( tk
r~ } z|}W d d }~X Y nX ||fS )Nr   )rS   c             S   s   | |S )Nr   )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}   rS   r   Zdebug_verbose_pipelineglobalscopyr   r   r   getattrtyper   _pipeline_entry_pointsKeyErrorexecr   r   Zreport_errorr	   r   r
   )r   sourceZ	printtreerS   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'   r,   r3   rG   rJ   rP   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s2   	

Z

