o
    @ag3                     @   sH  d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
ZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZd!d" e  D ZG d#d$ d$eZG d%d& d&eZdS )'z) Optimization for Python costly pattern.     )mangle)CheckPlaceholder)Transformation)deepcopyNc                   @   s$   e Zd Zdd Zdd Zdd ZdS )Patternc                 C   s   t |t | _| j| jS N)r   dictcheckvisitpatternselfnode r   I/usr/lib/python3/dist-packages/pythran/optimizations/pattern_transform.pymatch   s   zPattern.matchc                 C   s   t | jj|  S r   )PlaceholderReplacer
   placeholdersr   subr   r   r   r   replace   s   zPattern.replacec                 C   s   t t| dg S )Nextra_imports)r   getattrr   r   r   r   imports   s   zPattern.importsN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s    r   c                
   @   |   e Zd Zejejede ddde dejejede ddde dedgg dgg dZ	e
dd	 ZdS )
LenSetPatternbuiltinsNlenvalueattrctxsetr   funcargskeywordsc                	   C   sF   t jt jt jt dt  d d dt  ddt  dtdgg dS )Nr    pythranr"   Zlen_setr   r'   astCall	AttributeNameLoadr   r   r   r   r   r   '   s   
zLenSetPattern.subr   r   r   r-   r.   r/   r0   r1   r   r   staticmethodr   r   r   r   r   r      *    r   c                
   @   r   )
LenRangePatternr    Nr!   r"   ranger   r'   c                   C   s@   t jt jt dt  d d dt  dt dd tdgg dS )Nr    maxr"   r   r'   )r-   r.   r/   r0   r1   Constantr   r   r   r   r   r   A   s   zLenRangePattern.subr2   r   r   r   r   r5   2   r4   r5   c                
   @   r   )
TupleListPatternr    Ntupler"   listr   r'   c                   C   s8   t jt jt jdt  d d ddt  dtdgg dS )Nr    idr%   
annotationtype_commentr:   r"   r   r'   r,   r   r   r   r   r   Z   s   

zTupleListPattern.subr2   r   r   r   r   r9   J   s*    
r9   c                
   @   s   e Zd Zejejejede dddde dejejejde dddde de	dgg d	gg d	Z
ed
d ZdS )AbsSqrPatternnumpyNr<   squarer"   r    absr   r'   c                	   C   sH   t jt jt jt jdt  d d ddt  ddt  dtdgg dS )Nr    r<   r+   r"   Zabssqrr   r'   r,   r   r   r   r   r   x   s   

zAbsSqrPattern.subr   r   r   r-   r.   r/   r0   r   r1   r   r   r3   r   r   r   r   r   r@   e   s0    	r@   c                
   @   s|   e Zd Zejejejede dddde dejejejede dddde de	dgg dgg dZ
dS )	AbsSqrPatternNumpyrA   Nr<   rB   r"   rC   r   r'   )r   r   r   r-   r.   r/   r0   r   r1   r   r   r   r   r   r   rE      s,    
	
rE   c                   @   sZ   e Zd Zejejejede dddde de	de	dgg dZ
ed	d
 ZdS )PowFuncPatternr    Nr<   powr"   r      r'   c                   C   s   t tdt  tdS )Nr   rH   )r-   BinOpr   Powr   r   r   r   r      s   zPowFuncPattern.subrD   r   r   r   r   rF      s    rF   c                   @   P   e Zd Zeede eddZe	dd Z
eededggZdS )SqrtPatternr   g      ?Nc                   C   <   t jt jt jtdt  d d ddt  dtdgg dS )NrA   r<   Zsqrtr"   r   r'   r-   r.   r/   r0   r   r1   r   r   r   r   r   r         
zSqrtPattern.subrA   r   r   r   r-   rI   r   rJ   r8   r   r3   r   ZImportaliasr   r   r   r   r   r   rL      s
    
	rL   c                   @   rK   )CbrtPatternr   gUUUUUU?Nc                   C   rM   )NrA   r<   Zcbrtr"   r   r'   rN   r   r   r   r   r      rO   zCbrtPattern.subrA   rP   r   r   r   r   rR      s
    
	rR   c                   @   s\   e Zd Zejejejde dddde dee	de gg dZ
edd	 ZdS )
TuplePatternr    Nr<   r:   r"   r   r'   c                   C   s   t tdt  S )Nr   )r-   Tupler   r1   r   r   r   r   r      s   zTuplePattern.sub)r   r   r   r-   r.   r/   r0   r1   ZListr   r   r3   r   r   r   r   r   rS      s    rS   c                
   @   s   e Zd Zejejejde dddde dejejejde dddde dedgg dgg dZ	e
d	d
 ZdS )ReversedRangePatternr    Nr<   reversedr"   r6   r   r'   c                	   C   sd   t jt jt jdt  d d ddt  dt jtdt  t dd dt dd t dd gg d	S )
Nr    r<   r6   r"   r   rH   leftoprightr'   )	r-   r.   r/   r0   r1   rI   r   ZSubr8   r   r   r   r   r      s   



zReversedRangePattern.subr2   r   r   r   r   rU      s.    rU   c                   @   s4   e Zd Zejede eddZedd Z	dS )
SqrPatternr   rW   c                   C   s    t jtdt  t dd dS )Nr      rW   )r-   rI   r   rJ   r8   r   r   r   r   r     s   
zSqrPattern.subN)
r   r   r   r-   rI   r   ZMultr   r3   r   r   r   r   r   r\      s    
r\   c                	   @   sR   e Zd Zejejede eededde eddZ	e
dd ZdS )StrJoinPatternr   rH   NrW   r]   c                   C   sd   t jt t t dt  d d dt  dt  t tdd t tdtdgt  gg dS )Nr    strjoinrH   r   r]   r'   )r-   r.   r/   r0   r1   r8   r   rT   r   r   r   r   r     s   zStrJoinPattern.sub)r   r   r   r-   rI   r   ZAddr8   r_   r   r3   r   r   r   r   r   r^     s    r^   c                 C   s   g | ]	}t |d r|qS )r   )hasattr).0xr   r   r   
<listcomp>  s    rd   c                       s,   e Zd ZdZ fddZ fddZ  ZS )r   zB Helper class to replace the placeholder once value is collected. c                    s   || _ tt|   dS )z% Store placeholders value collected. N)r   superr   __init__)r   r   	__class__r   r   rf   %  s   zPlaceholderReplace.__init__c                    s&   t |tr| j|j S tt| |S )z3 Replace the placeholder if it is one or continue. )
isinstancer   r   r=   re   r   r   r   rg   r   r   r   *  s   
zPlaceholderReplace.visit)r   r   r   __doc__rf   r   __classcell__r   r   rg   r   r   !  s    r   c                       s4   e Zd ZdZ fddZdd Z fddZ  ZS )PatternTransformzr
    Replace all known pattern by pythran function call.

    Based on BaseMatcher to search correct pattern.
    c                    s   t t|   dS )z8 Initialize the Basematcher to search for placeholders. N)re   rl   rf   r   rg   r   r   rf   :  s   zPatternTransform.__init__c                 C   s"   g | _ | | | j |j |_|S r   )r   Zgeneric_visitbodyr   r   r   r   visit_Module>  s   
zPatternTransform.visit_Modulec                    sH   t D ]}| }||r| j|  | }d| _qtt| 	|S )z? Try to replace if node match the given pattern or keep going. T)
know_patternr   r   extendr   r   updatere   rl   r   )r   r   r   Zmatcherrg   r   r   r   D  s   
zPatternTransform.visit)r   r   r   rj   rf   rn   r   rk   r   r   rg   r   rl   2  s
    rl   )rj   Zpythran.conversionr   Zpythran.analysesr   r   Zpythran.passmanagerr   copyr   Zgastr-   objectr   r   r5   r9   r@   rE   rF   rL   rR   rS   rU   r\   r^   globalsvaluesro   r   rl   r   r   r   r   <module>   s,     !