B
    \6                 @   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   7lib/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
   )Z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addZusedZutility_code_definitionZuse_utility_coderequiresZ	as_moduleuse_utility_code_definitions)r   targetseenentryZrequired_utilityr   r   r   r1   B   s    
r1   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minr0   )utilcodeZoriginal_order)r7   ranksr   r   r7   U   s
    2z$sort_utility_codes.<locals>.get_rankc             S   s   g | ]\}}|qS r   r   )r5   r<   _r   r   r   r8   ]   s    z&sort_utility_codes.<locals>.<listcomp>c             S   s   | d S )Nr   r   )Zkvr   r   r   <lambda>]   s    z$sort_utility_codes.<locals>.<lambda>)key)sortedr'   )	utilcodesr<   r   )r7   r=   r   sort_utility_codesS   s
    
rC   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   )r6   )depsr   r   	unify_depe   s    z!normalize_deps.<locals>.unify_depc                s   g | ]} |qS r   r   )r5   r6   )rE   r   r   r8   m   s    z"normalize_deps.<locals>.<listcomp>r   )r0   )rB   r<   r   )rD   rE   r   normalize_deps`   s    

rF   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_coder1   rG   r   rC   Zutility_code_listrF   appendr0   Zget_treer(   Zbody)r"   Zaddedr<   r6   r   )r   r   r   inject_utility_code_stageq   s"    
zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r   rI   r   )r   r   !inject_utility_code_stage_factoryp   s    rJ   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   rL   )6AssertionErrorVisitorrM   ParseTreeTransformsrN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   ZTypeInferencer`   ra   rb   rc   rd   re   ZFlowControlrf   ZAnalysedTreeTransformsrg   ZAutoDocTransformsrh   Optimizeri   rj   rk   rl   rm   rn   ro   rp   rq   rr   ZBufferrs   Z
ModuleNodert   ru   Zcompiler_directives	__class__rH   )2r   modeexclude_classesrM   rN   rO   rP   rQ   rR   rS   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   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 )	NrL   rK      )TreeAssertVisitor)DebugWriterr   )DebugTransform)r|   )Zevaluate_tree_assertionsZ	TestUtilsr   rH   Z	gdb_debugZDebuggerr   rx   r   ZCythonDebugWriterZ
output_dirZgdb_debug_outputwriterlist	itertoolschainr   r~   r+   rJ   r   r&   )r   r#   r$   rL   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)rL   )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   )rc   rX   rN   rT   )ro   ri   )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)Zstats)r   r-   r.   Zin_cincludeZdefined_in_pxdr)   ZcnameZ
visibilityZmangler   Zfunc_prefixr   )rootr4   )r   r   r   fake_pxd$  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxd)rx   rc   rX   rN   rT   ry   ro   ri   ZNodesr   r   r#   rH   
isinstance)r   r$   rc   rX   rN   rT   ro   ri   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)rv   	enumerater   )r   Z	transformZbeforeZ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   )rM   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   )rw   rM   r   Zdebug_verbose_pipelineglobalscopyr   r   r   getattrtyper   _pipeline_entry_pointsKeyErrorexecr   r   Zreport_errorr	   r   r
   )r   sourceZ	printtreerM   Zexec_nsr   errorr   r   r   Z
phase_nameerrr   r   r   run_pipelineJ  sB    

r   )N)r   )Fr   )NN)T)Z
__future__r   r   r    r   r   r   r   r	   r
   r   r   r   r   r!   r&   r+   r1   rC   rF   rJ   r~   r   r   r   r   r   r   r   r   r   r   r   <module>   s2   	

Z

