U
    {hf?                     @   sH  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 Zd7ddZdd Zdd Zd8ddZd9d!d"Zd:d$d%Zd&d' Zd(d) Zd*d+ Zd;d,d-Zzd d.lmZ W n$ ek
r   G d/d0 d0ZY nX e Zd1d2 Z i Z!d3d4 Z"d<d5d6Z#dS )=    N)time   )Errors)
DebugFlags)Options)CompileErrorInternalError
AbortError)Namingc                 C   s   t |   | S N)printdump)t r   </tmp/pip-unpacked-wheel-fhl22ezh/Cython/Compiler/Pipeline.pydumptree   s    r   c                 C   s   t  dkrtd| S )Nr   zpipeline break)r   get_errors_countr	   )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_stage1   s    z@generate_pyx_code_stage_factory.<locals>.generate_pyx_code_stager   )r(   r)   r*   r   r'   r   generate_pyx_code_stage_factory0   s    r+   c                    s    fdd}|S )Nc                    s(    j  D ]\}}| j||dd q
| S Nr   stage)Zutility_pxdsvaluesmerge_in)r&   statlistnoder   r    r   r   inject_utility_pxd_code_stage9   s    zLinject_utility_pxd_code_stage_factory.<locals>.inject_utility_pxd_code_stager   )r!   r2   r   r    r   %inject_utility_pxd_code_stage_factory7   s    r3   c                    s    fdd}|S )Nc                    s,    j  D ]\}\}}| j||dd q
| S r,   )Zpxdsitemsr0   )r&   namer1   r   r    r   r   inject_pxd_code_stageB   s    z<inject_pxd_code_stage_factory.<locals>.inject_pxd_code_stager   )r!   r6   r   r    r   inject_pxd_code_stage_factory@   s    r7   c                 C   s|   |d krt  }| j D ]^}||kr&q|| |jrb|jrb||j |jjD ]}|| qPq|jrt	|j|| qd S r   )
setentriesr/   addusedZutility_code_definitionZuse_utility_coderequiresZ	as_moduleuse_utility_code_definitions)r   targetseenentryZrequired_utilityr   r   r   r=   I   s    
r=   c                    s8   i j  fdd | D ]} | qtdS )Nc                    sZ   | }|d krVd| < t }d| jr@t fdd| jD nd |d   }| < |S )Nr   r   c                    s   g | ]} |qS r   r   .0dep)calculate_rankr   r   
<listcomp>d   s     zIsorted_utility_codes_and_deps.<locals>.calculate_rank.<locals>.<listcomp>g:0yE>)lenr<   min)utilcodeZrankZoriginal_orderrD   Zget_rankZranksr   r   rD   ^   s     z5sorted_utility_codes_and_deps.<locals>.calculate_rank)key)getsortedZ	utilcodesrI   r   rJ   r   sorted_utility_codes_and_depsZ   s    

rO   c                    s6   dd | D  | D ]} fdd|j p(dD |_ qd S )Nc                 S   s   i | ]
}||qS r   r   )rB   rI   r   r   r   
<dictcomp>p   s      z"normalize_deps.<locals>.<dictcomp>c                    s   g | ]}  ||qS r   )
setdefaultrA   depsr   r   rE   r   s     z"normalize_deps.<locals>.<listcomp>r   )r<   rN   r   rR   r   normalize_depso   s    rT   Tc                    s    fdd}|S )Nc                    s   |    t j| j | j}|j}t||d d < t| t }|D ]}||krRqD|| |j	r|j	D ]}||krh|
| qh|j jd }r| j| |jdd | j|jd qD|j jd }rD|j
| qD| S )N)cython_scopeZutilityr-   )internalise_c_class_entries)Zprepare_utility_coder=   rU   r   utility_code_listrO   rT   r8   r:   r<   appendZget_treer0   Zwith_compiler_directivesZmerge_scopeZget_shared_library_scopeZcimported_modules)r&   Zmodule_scoperW   addedrI   rC   r   Zshared_library_scoper!   rV   r   r   inject_utility_code_stagev   s0    


 zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r!   rV   r[   r   rZ   r   !inject_utility_code_stage_factoryu   s    r\   r   c           2   *      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}m} ddlm}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l0m1}+ ddl2m3},m4}- |dkr|-}.|| }/n|,}.d }/|dkr|| }0nd }0|| || |/| || | j5|| | || |0|| || || |' |! || || |	 |
| || | | |$| || || || || || |+| |.|&| || | || |#| |"| |%| || || |*| |) |(| || | g*}1 r fdd|1D }1|1S )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AutoCpdefFunctionDefinitions)RemoveUnreachableCodeGilCheckCoerceCppTemps)ControlFlowAnalysis)AutoTestDictTransform)EmbedSignature)FlattenInListTransformSwitchTransformIterationTransform)EarlyReplaceBuiltinCallsOptimizeBuiltinCalls)InlineDefNodeCalls)ConstantFoldingFinalOptimizePhase)DropRefcountingTransform)ConsolidateOverflowCheck)IntroduceBufferAuxiliaryVars)check_c_declarationscheck_c_declarations_pxdr   r^   c                    s   g | ]}|j  kr|qS r   )	__class__)rB   sexclude_classesr   r   rE      s     
 z#create_pipeline.<locals>.<listcomp>)6AssertionErrorVisitorr`   ParseTreeTransformsra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   ZTypeInferencers   rt   ru   rv   rw   rx   ry   rz   ZFlowControlr{   ZAnalysedTreeTransformsr|   ZAutoDocTransformsr}   Optimizer~   r   r   r   r   r   r   r   r   r   ZBufferr   Z
ModuleNoder   r   Zcompiler_directives)2r!   moder   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   r   r   r   r   r   r   r   r   Z_check_c_declarationsZ_specific_post_parseZ_align_function_definitionsZstagesr   r   r   create_pipeline   s    




-r   Fc                 C   s   |rdnd}g }g }|j rDddlm} | }	||	 ||	  |jrddlm}
 ddlm	} |

|j| _|| ||g}ng }ttt| gt| ||d|t| t| t| tg|t||g|S )	Nr^   r]      )TreeAssertVisitor)DebugWriterr   )DebugTransformr   )Zevaluate_tree_assertionsZ	TestUtilsr   rX   Zcreate_c_file_validatorZ	gdb_debugZDebuggerr   r   r   ZCythonDebugWriter
output_dirZgdb_debug_outputwriterlist	itertoolschainr"   r   r7   r\   r3   r   r+   )r!   r(   r)   r^   r   r   Ztest_supportZctest_supportr   Ztest_validatorr   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)r^   )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dlm G fddd}
|	D ]*}|| t||rx|d	|
   qqx fd
d}|| |S )Nr   )rv   rk   ra   rg   )r   r~   StatListNoder   VisitorTransformc                       s   e Zd Zdd Z jZdS )z5create_pyx_as_pxd_pipeline.<locals>.SetInPxdTransformc                 S   s   t |drd|_| | |S )Nin_pxdT)hasattrr   Zvisitchildren)selfr   r   r   r   visit_StatNode8  s    

zDcreate_pyx_as_pxd_pipeline.<locals>.SetInPxdTransform.visit_StatNodeN)__name__
__module____qualname__r   Zrecurse_to_childrenZ
visit_Noder   r   r   r   SetInPxdTransform3  s   r   rF   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   extern)stats)r   r9   r/   Zin_cincludeZdefined_in_pxdr5   cnameZ
visibilityZmangler
   Zfunc_prefixr   )rootr@   r   r   r   fake_pxdE  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxd)r   rv   rk   ra   rg   r   r   r~   ZNodesr   r   r(   r   r   rX   
isinstanceinsert)r!   r)   rv   rk   ra   rg   r   r~   pipelineZpyx_pipeliner   r.   r   r   )r   r   r   create_pyx_as_pxd_pipeline$  s,    



r   c                 C   s^   |s|st |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)r   	enumerater   )r   Z	transformbeforeafterclsir   r   r   r   insert_into_pipelineP  s    
r   )localc                   @   s   e Zd ZdS )_threadlocalN)r   r   r   r   r   r   r   r   k  s    r   c                   C   s&   zt jW S  tk
r    i  Y S X d S r   )threadlocalcython_pipeline_timingsAttributeErrorr   r   r   r   get_timingsp  s    r   c                 C   s@   z
t |  W S  tk
r   Y nX dd }|  |_|_|t | < |S )Nc                 S   s   | |S r   r   phasedatar   r   r   run  s    z%_make_debug_phase_runner.<locals>.run)_pipeline_entry_pointsKeyErrorr   r   )
phase_namer   r   r   r   _make_debug_phase_runnery  s    
r   c              
   C   s  ddl m} z
tj}W n tk
r4   i  }t_Y nX dd }d }|}zz| D ]}|d kr^qP|snt||rnqPt|dt|j}	t	j
rtd|  t|	}t }
|||}t |
 }
z||	 \}}W n tk
r   d\}}Y nX |t|
d  |d f||	< t	j
rPtd	|
  qPW n6 tk
rJ } ztj|d
d |}W 5 d }~X Y nX W n^ tk
r } zt dkrr |}W 5 d }~X Y n( tk
r } z|}W 5 d }~X Y nX ||fS )Nr   r_   c                 S   s   | |S r   r   r   r   r   r   r     s    zrun_pipeline.<locals>.runr   zEntering pipeline phase %r)r   r   i@B z    %.3f secondsF)Z	use_stackr   )r   r`   r   r   r   r   getattrtyper   r   Zdebug_verbose_pipeliner   r   r   r   intr   r   Zreport_errorr   r   r	   )r   sourceZ	printtreer`   Ztimingsr   errorr   r   r   r   Zold_tcounterrr   r   r   run_pipeline  sN    


r   )N)T)r   )Fr   )NN)T)$r   r    r   r   r   r   r   r	   r
   r   r   r"   r%   r+   r3   r7   r=   rO   rT   r\   r   r   r   r   r   r   	threadingr   r   ImportErrorr   r   r   r   r   r   r   r   r   <module>   s@   			

$
Z
#,
