3
h=                 @   sJ  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d3ddZdd Zdd Zdd Zf fddZd f fd!d"Zd#d$ Zd%d& Zd'd( Zd4d)d*Zi Zyd d+lmZ W n& e k
r,   G d,d- d-e!ZY nX e Z"d.d/ Z#d5d1d2Z$dS )6    )absolute_importN)time   )Errors)
DebugFlags)Options)CompileErrorInternalError
AbortError)Namingc             C   s   t | j  | S )N)printdump)t r   j/var/www/html/CrowdFlow/Picklecon/ble_analysis_env/lib/python3.6/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   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 )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   | 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                s0   x* j j D ]\}\}}| j||dd qW | S )Nr   )stage)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j D ]b}||kr(q|j| |jrh|jrh|j|j x0|jjD ]}|j| 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   r4   B   s    
r4   c                s<   i j  fdd x| D ]} | q W 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>]   s    zIsorted_utility_codes_and_deps.<locals>.calculate_rank.<locals>.<listcomp>g:0yE>)lenr3   min)utilcodeZrankZoriginal_order)r:   get_rankranksr   r   r:   W   s    6z5sorted_utility_codes_and_deps.<locals>.calculate_rank)key)getsorted)	utilcodesr?   r   )r:   r@   rA   r   sorted_utility_codes_and_depsS   s    

rF   c                s:   dd | D  x&| D ]} fdd|j p*f D |_ qW d S )Nc             S   s   i | ]
}||qS r   r   )r8   r?   r   r   r   
<dictcomp>i   s    z"normalize_deps.<locals>.<dictcomp>c                s   g | ]} j ||qS r   )
setdefault)r8   r9   )depsr   r   r;   k   s    z"normalize_deps.<locals>.<listcomp>)r3   )rE   r?   r   )rI   r   normalize_depsh   s    
rJ   c                s    fdd}|S )Nc                s   | j   t j| j | jj}t||d d < t| t }xr|D ]j}||krPqB|j| |j	rx |j	D ]}||krh|j
| qhW |j jd}|rB| j|j |jddd qBW | S )N)cython_scopeZutilityT)r(   Zmerge_scope)Zprepare_utility_coder4   rK   r   utility_code_listrF   rJ   r.   r1   r3   appendZget_treer*   Zwith_compiler_directives)r#   rL   addedr?   r9   r   )r   r   r   inject_utility_code_stageo   s(    


zDinject_utility_code_stage_factory.<locals>.inject_utility_code_stager   )r   rO   r   )r   r   !inject_utility_code_stage_factoryn   s    rP   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_pxdc                s   g | ]}|j  kr|qS r   )	__class__)r8   s)exclude_classesr   r   r;      s    z#create_pipeline.<locals>.<listcomp>)rQ   rR   r   )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   rl   rm   ZFlowControlrn   ZAnalysedTreeTransformsro   ZAutoDocTransformsrp   Optimizerq   rr   rs   rt   ru   rv   rw   rx   ry   rz   Bufferr{   Z
ModuleNoder|   r}   Zcompiler_directives)2r   moder   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   rv   rw   rx   ry   rz   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|	 |j|	j  |jrddlm}
 ddlm	} |
j
|j| _|| ||g}ng }ttjt| gt| ||d|t| t| tg|t||g|S )	NrR   rQ      )TreeAssertVisitor)DebugWriterr   )DebugTransform)r   )Zevaluate_tree_assertionsZ	TestUtilsr   rM   Zcreate_c_file_validatorZ	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_supportZctest_supportr   Ztest_validatorr   r   Zdebug_transformr   r   r   create_pyx_pipeline   s2    


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}	ddlm G fddd}
x0|	D ](}|j| t||rz|jd|
  P qzW  fd	d
}|j| |S )Nr   )ri   r^   rT   rZ   )rw   rq   )StatListNode)r   )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|_| j| |S )Nin_pxdT)hasattrr   Zvisitchildren)selfr   r   r   r   visit_StatNode,  s    

zDcreate_pyx_as_pxd_pipeline.<locals>.SetInPxdTransform.visit_StatNodeN)__name__
__module____qualname__r   Zrecurse_to_childrenZ
visit_Noder   )r   r   r   SetInPxdTransform'  s   r   c                s`   xJ| j jj D ]:}|jsd|_|j|jkr|jdkr|j jt	j
|j|_qW  | jg d| j fS )Nr   Zextern)stats)r   r/   r0   Zin_cincludeZdefined_in_pxdr+   cnameZ
visibilityZmangler   Zfunc_prefixr   )rootr7   )r   r   r   fake_pxd9  s    z,create_pyx_as_pxd_pipeline.<locals>.fake_pxdr<   )r   ri   r^   rT   rZ   r   rw   rq   ZNodesr   r   r$   r   r   rM   
isinstanceinsert)r   r%   ri   r^   rT   rZ   rw   rq   pipelineZpyx_pipeliner   r(   r   r   )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_pipelineD  s    
r   )localc               @   s   e Zd ZdS )_threadlocalN)r   r   r   r   r   r   r   r   a  s    r   c               C   s    yt jS  tk
r   i S X d S )N)threadlocalcython_pipeline_timingsAttributeErrorr   r   r   r   get_timingsf  s    r   Tc          )   C   s  ddl m} tjrt j nd }y
tj}W n tk
rH   i  }t_Y nX dd }d }|}yLyx| D  ]}	|	d krzqj| rt	|	|rqjt
|	dt|	j}
tjrtd|	  yt|
 }W n2 tk
r   td|
 | ||
  }t|
< Y nX t }||	|}t | }y||
 \}}W n tk
r8   d\}}Y nX |t|d	  |d f||
< tjrjtd
|  qjW W n6 tk
r } ztj|dd |}W Y d d }~X nX W n^ tk
r } ztj dkr̂ |}W Y d d }~X n( tk
r } z
|}W Y d d }~X nX ||fS )Nr   )rS   c             S   s   | |S )Nr   )phasedatar   r   r   runv  s    zrun_pipeline.<locals>.runr   zEntering pipeline phase %rz'def %s(phase, data): return phase(data)r   i@B z    %.3f secondsF)Z	use_stack)r   r   )r   rS   r   Zdebug_verbose_pipelineglobalscopyr   r   r   r   getattrtyper   r   _pipeline_entry_pointsKeyErrorexecr   intr   r   Zreport_errorr	   r   r
   )r   sourceZ	printtreerS   Zexec_nsZtimingsr   errorr   r   Z
phase_namer   Zold_tcounterrr   r   r   run_pipelinem  sX    


r   )N)NN)T)%
__future__r   r   r    r   r   r   r   r	   r
   r   r   r   r    r"   r'   r-   r4   rF   rJ   rP   r   r   r   r   r   r   r   	threadingr   r   ImportErrorobjectr   r   r   r   r   r   r   <module>   s>   	
"Z ,
