o
    í@ËaW  ã                   @   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	Z
ed d ed d	 ed d
 ed d fZed d d fZdd„ Zdd„ ZG dd„ deƒZdS )zH TupleToShap transforms some Tuple node into shape nodes when relevant. é    )ÚAliases)ÚMODULES)ÚTransformation)Úpythran_builtin_attrNZnumpyZfullZonesZzerosÚemptyZndarrayZreshapec                 C   s   t | tjƒS )N)Ú
isinstanceÚastZTuple)Únode© r
   úF/usr/lib/python3/dist-packages/pythran/optimizations/tuple_to_shape.pyÚistuple   s   r   c                 C   s   t dƒ}t || jg ¡S )NZ
make_shape)r   r   ZCallÚelts)r	   Úbr
   r
   r   Útoshape   s   r   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚTupleToShapea»  
    Replace tuple nodes by shape when relevant

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse("def foo(n): import numpy; return numpy.ones((n,4))")
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(TupleToShape, node)
    >>> print(pm.dump(backend.Python, node))
    def foo(n):
        import numpy
        return numpy.ones(builtins.pythran.make_shape(n, 4))
    c                    s   d| _ tt| ƒ t¡ d S )NF)ÚupdateÚsuperr   Ú__init__r   )Úself©Ú	__class__r
   r   r   *   s   zTupleToShape.__init__c                 C   sž   | j  |jd ¡}|d urJ| t¡r&t|jd ƒr%d| _t|jd ƒ|jd< n$| t	¡rJt
|jƒdkrJd| _tt |jdd … t ¡ ¡ƒg|jdd …< |  |¡S )Nr   Té   é   )ÚaliasesÚgetÚfuncÚissubsetÚpatternsr   Úargsr   r   Úreshape_patternsÚlenr   ZListZLoadZgeneric_visit)r   r	   Zfunc_aliasesr
   r
   r   Ú
visit_Call.   s   
€
ÿ
zTupleToShape.visit_Call)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   Ú__classcell__r
   r
   r   r   r      s    r   )r%   Zpythran.analysesr   Zpythran.tablesr   Zpythran.passmanagerr   Zpythran.utilsr   Zgastr   r   r   r   r   r   r
   r
   r
   r   Ú<module>   s    



ý