o
    @a                     @   s   d 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
 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d
S )z; Expand some builtins implementation when it is profitable.    )Aliases)PureExpressions)Transformation)MODULES)FunctionIntr)path_to_attrpath_to_node)PythranSyntaxError)deepcopyNc                   @   sp   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )InlineBuiltinsa(  
    Replace some builtins by their bodies.

    This may trigger some extra optimizations later on!

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> pm = passmanager.PassManager("test")
    >>> node = ast.parse('''
    ... def foo(a):
    ...     return  a + 1
    ... def bar(b):
    ...     return builtins.map(bar, (1, 2))''')
    >>> _, node = pm.apply(InlineBuiltins, node)
    >>> print(pm.dump(backend.Python, node))
    def foo(a):
        return (a + 1)
    def bar(b):
        return [bar(1), bar(2)]
    c                 C   s   t | tt d S N)r   __init__r   r   )self r   G/usr/lib/python3/dist-packages/pythran/optimizations/inline_builtins.pyr   &   s   zInlineBuiltins.__init__c                    st   d| _ g }tdd jdd  D }t|D ] | fddjdd  D  qtfdd|D t S )NTc                 s   s    | ]}t |jV  qd S r   )lenelts.0nr   r   r   	<genexpr>-   s    z4InlineBuiltins.inlineBuiltinsXMap.<locals>.<genexpr>   c                    s   g | ]}|j   qS r   )r   r   )ir   r   
<listcomp>/   s    z5InlineBuiltins.inlineBuiltinsXMap.<locals>.<listcomp>c                    s    g | ]}t  jd  |g qS r   )astCallargs)r   elt)noder   r   r   0   s     )updateminr   rangeappendr   ListLoad)r   r   r   Zneltsr   )r   r   r   inlineBuiltinsXMap)   s   $z!InlineBuiltins.inlineBuiltinsXMapc                 C   s   t |tjs|S | j|j }t|dkr|S tt|}|td d ur&|S t	dd |j
dd  D s6|S | j|j
d  }t|dkrF|S tt|}t |tjtfsV|S | |S )Nr   builtinsmapc                 s   s"    | ]}t |tjtjfV  qd S r   )
isinstancer   r$   Tuple)r   argr   r   r   r   @   s    z3InlineBuiltins.inlineBuiltinsMap.<locals>.<genexpr>r   )r)   r   r   aliasesfuncr   nextiterr   allr   ZFunctionDefr   r&   )r   r   func_aliasesobjZmapped_func_aliasesr   r   r   inlineBuiltinsMap3   s&   
z InlineBuiltins.inlineBuiltinsMapc                 C      |  |}| |}|S r   )generic_visitr3   r   r   r   r   r   
visit_CallO      

zInlineBuiltins.visit_Callc                 C   s:   t |tjrt|jd S |dkrt|jd S |j| S )Nr   r   )r)   r   Constantvaluer
   r   )r   basesizeindexr   r   r   make_array_indexT   s
   
zInlineBuiltins.make_array_indexc                 C   s   t |tjr
|dfS t |tjtjfr|t|jfS t |tjs"dS | j|j	 }t|dkr0dS t
t|}|td d td d fvrFdS t|jdkrOdS t |jd tjtjfrh|jd t|jd jfS dS )Nr   )Nr   numpyarrayZasarrayr   )r)   r   r9   r$   r*   r   r   r   r,   r-   r.   r/   r   r   )r   r   r1   r2   r   r   r   fixedSizeArray[   s"   zInlineBuiltins.fixedSizeArrayc                    s   t jt jt jf}tj|rtj|rS j\ j\ r*s,S dkr=dkr=kr=tdd_	 fddt
tD }t tdt |t  gg }tdhj|j< |S )Nr   Invalid numpy broadcastingTc                    s6   g | ]}t  |tj |qS r   )r   ZBinOpr>   typeopr   r   ZlbaseZlsizer   ZrbaseZrsizer   r   r   r      s    
z<InlineBuiltins.inlineFixedSizeArrayBinOp.<locals>.<listcomp>r?   r@   )r   r$   r*   r9   r)   leftrightrA   r	   r    r"   maxr   r   r%   r   r,   r-   )r   r   alikeoperandsresr   rF   r   inlineFixedSizeArrayBinOpu   s&   

z(InlineBuiltins.inlineFixedSizeArrayBinOpc                 C   r4   r   )r5   rN   r6   r   r   r   visit_BinOp   r8   zInlineBuiltins.visit_BinOpc                    s   t jtjtjtjfrS j\  sS d_ fddtD }t	t
dt|t gg }tdhj|j< |S )NTc              
      s*   g | ]}t tj  |qS r   )r   ZUnaryOprC   rD   r>   rE   r;   r   r   r<   r   r   r      s
    z>InlineBuiltins.inlineFixedSizeArrayUnaryOp.<locals>.<listcomp>rG   )r)   operandr   r9   r$   r*   rA   r    r"   r   r   r%   r   r,   r-   )r   r   rL   rM   r   rP   r   inlineFixedSizeArrayUnaryOp   s   
z*InlineBuiltins.inlineFixedSizeArrayUnaryOpc                 C   r4   r   )r5   rR   r6   r   r   r   visit_UnaryOp   r8   zInlineBuiltins.visit_UnaryOpc                    s   t jdkr	S jd }tjtjtjf}tj|r#t||r#S j\ |\ r6s8S dkrIdkrIkrIt	dd_
 fddttD }ttdt|t gg }tdhj|j< |S )Nr   r   rB   Tc                    s>   g | ]}t  |tjd   g|gqS r   )r   ZComparer>   rC   opsrE   rF   r   r   r      s    z>InlineBuiltins.inlineFixedSizeArrayCompare.<locals>.<listcomp>rG   )r   comparatorsr   r9   r$   r*   r)   rH   rA   r	   r    r"   rJ   r   r   r%   r   r,   r-   )r   r   Z
node_rightrK   rL   rM   r   rF   r   inlineFixedSizeArrayCompare   s,   


z*InlineBuiltins.inlineFixedSizeArrayComparec                 C   r4   r   )r5   rV   r6   r   r   r   visit_Compare   r8   zInlineBuiltins.visit_CompareN)__name__
__module____qualname____doc__r   r&   r3   r7   r>   rA   rN   rO   rR   rS   rV   rW   r   r   r   r   r      s    
r   )r[   Zpythran.analysesr   Z!pythran.analyses.pure_expressionsr   Zpythran.passmanagerr   Zpythran.tablesr   Zpythran.intrinsicr   Zpythran.utilsr   r   Zpythran.syntaxr	   copyr
   Zgastr   r   r   r   r   r   <module>   s    