o
    í@Ëa‚  ã                   @   s\   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ddlZG dd„ deƒZdS )	z) Replaces **2 by a call to numpy.square. é    )ÚTransformation)Ú
ASTMatcherÚAST_any)Úmangle)ÚisnumNc                
   @   sš   e Zd ZdZe eƒ e ¡ e dd¡¡Z	e 
e e edƒe ¡ dd¡de ¡ ¡eƒ e dd¡gg ¡Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ ZdS )ÚSquareaƒ  
    Replaces **2 by a call to numpy.square.

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse('a**2')
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(Square, node)
    >>> print(pm.dump(backend.Python, node))
    import numpy as __pythran_import_numpy
    __pythran_import_numpy.square(a)
    >>> node = ast.parse('__pythran_import_numpy.power(a,2)')
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(Square, node)
    >>> print(pm.dump(backend.Python, node))
    import numpy as __pythran_import_numpy
    __pythran_import_numpy.square(a)
    é   NÚnumpyZpowerc                 C   s   t  | ¡ d S )N)r   Ú__init__)Úself© r   ú>/usr/lib/python3/dist-packages/pythran/optimizations/square.pyr
   )   s   zSquare.__init__c                 C   sB   d | _ | _t tdƒt ¡ d d ¡}t t |dt ¡ ¡|gg ¡S )NTr	   Zsquare)ÚupdateÚneed_importÚastÚNamer   ÚLoadÚCallÚ	Attribute)r   ÚvalueZmodule_namer   r   r   Úreplace,   s
   ÿzSquare.replacec                 C   sH   d| _ |  |¡ | j r"tjdtdƒd}tj|gd}|j d|¡ |S )NFr	   )ÚnameÚasname)Únamesr   )r   Úgeneric_visitr   Úaliasr   ZImportÚbodyÚinsert)r   ÚnodeZimport_aliasZimportItr   r   r   Úvisit_Module2   s   
zSquare.visit_Modulec                 C   s^   |dkr
t  dd ¡S |dkr|S |  |¡}|  ||d? ¡}|d@ r-t  |t  ¡ t |¡¡S |S )Nr   é   )r   ÚConstantr   Ú
expand_powÚBinOpZMultÚcopyZdeepcopy)r   r   ÚnZnode_squareZnode_powr   r   r   r"   ;   s   
zSquare.expand_powc                 C   sp   |   |¡ ttjƒ |¡r|  |j¡S t|jt	j
ƒr6t|jƒr6|jj}t|ƒ|kr4|dkr4|  |j|¡S |S |S ©Nr   )r   r   r   ÚPOW_PATTERNÚsearchr   ÚleftÚ
isinstanceÚopr   ÚPowr   Úrightr   Úintr"   )r   r   r%   r   r   r   Úvisit_BinOpH   s   
zSquare.visit_BinOpc                 C   s.   |   |¡ ttjƒ |¡r|  |jd ¡S |S r&   )r   r   r   ÚPOWER_PATTERNr(   r   Úargs)r   r   r   r   r   Ú
visit_CallU   s   
zSquare.visit_Call)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r   r,   r!   r'   r   r   r   r   r   r0   r
   r   r   r"   r/   r2   r   r   r   r   r      s"    þû	r   )r6   Zpythran.passmanagerr   Zpythran.analyses.ast_matcherr   r   Zpythran.conversionr   Zpythran.utilsr   Zgastr   r$   r   r   r   r   r   Ú<module>   s    