o
    @a                     @   s   d Z ddlZddlZddlZdZG dd deZG dd deZ	dd	 Z
d
d Zdd Zdd Zdd ZdZdd Zdd ZdS )zA This module provides way to convert a Python value into an ast.     N   c                   @      e Zd ZdZdS )ConversionErrorzC Exception raised when conversion from value to ast can't be done. N__name__
__module____qualname____doc__ r
   r
   4/usr/lib/python3/dist-packages/pythran/conversion.pyr          r   c                   @   r   )	ToNotEvalzx
    Exception raised when we don't want to evaluate the value.

    It is case of too long expression for example.
    Nr   r
   r
   r
   r   r      r   r   c                 C   s(   zt tt| W S  ty   |  Y S w N)tuplemaptotuple	TypeError)lr
   r
   r   r      s
   r   c                 C   sP   | dv rt t dt  d d | t  S t t tdt  d d | t  S )N)boolbuiltinsnumpy)ast	AttributeNameLoadmanglenamer
   r
   r   dtype_to_ast"   s   r   c              	   C   s  dd }|| t k rt| trtdd | D t S t| tr.tdd | D t S t| trX| r?t	dd | D S tj
tttdt ddd	t g g d
S t| trudd |  D }dd |  D }t||S t| tjrt| dkrtj
tttdt dddt t| jt| jjgg d
S tj
tttdt dddt tt|  t| jjgg d
S t t )ze
    Convert value to ast expression if size is not too big.

    Converter for sized container.
    c                    s   t t d fdd S )NZflattenc                      s    S r   r
   r
   xr
   r   <lambda>7   s    z6size_container_folding.<locals>.size.<locals>.<lambda>)lengetattrr   r
   r   r   size6   s   z$size_container_folding.<locals>.sizec                 S      g | ]}t |qS r
   to_ast.0eltr
   r
   r   
<listcomp>;       z*size_container_folding.<locals>.<listcomp>c                 S   r%   r
   r&   r(   r
   r
   r   r+   =   r,   c                 S   r%   r
   r&   r(   r
   r
   r   r+   @   r,   r   Nset)funcargskeywordsc                 S   r%   r
   r&   r(   r
   r
   r   r+   I   r,   c                 S   r%   r
   r&   r(   r
   r
   r   r+   J   r,   r   r   emptyZarray)MAX_LEN
isinstancelistr   ZListr   r   ZTupler-   SetZCallr   r   r   dictkeysvaluesZDictnpndarrayr"   r'   shaper   Zdtyper   r   tolistr   r   )valuer$   r7   r8   r
   r
   r   size_container_folding/   sZ   





r>   c                 C   sD   t | tdtfrt| }n| j}ttdt dd|t S )z- Convert builtin function to ast expression. Nr   )	r3   typer   strr   r   r   r   r   )r=   r   r
   r
   r   builtin_foldingc   s   
rA   c              
      s<  t  fddtttfD r3tt}t tr/|j   kr$|jks/n ddl	m
} |dt S t tjr?t  S t tjtttdfrQt dS t tttttjfr`t S t drn jdkrnt S t tttfr|tt S t tj j!rt"t"t#d	t$ ddd
t$ dt$ S t% )z
    Turn a value into ast expression.

    >>> a = 1
    >>> print(ast.dump(to_ast(a)))
    Num(n=1)
    >>> a = [1, 2, 3]
    >>> print(ast.dump(to_ast(a)))
    List(elts=[Num(n=1), Num(n=2), Num(n=3)], ctx=Load())
    c                 3   s    | ]} |u V  qd S r   r
   )r)   tr=   r
   r   	<genexpr>y   s    zto_ast.<locals>.<genexpr>r   )PythranSyntaxErrorz#constant folding results in big intNr   r   r   _globals_NoValueType)&anyr   intfloatr9   iinfor3   minmaxZpythran.syntaxrE   rA   Zgenericr'   itemnumbersNumberr@   r?   r   ZConstantr4   r   r-   r6   r:   r>   hasattrr   filterr   ziprF   rG   r   r   r   r   )r=   rK   rE   r
   rC   r   r'   m   s4   
$r'   Z__pythran_import_c                 C   s   | dkr| S t |  S )z
    Mangle a module name, except the builtins module
    >>> mangle('numpy')
    __pythran_import_numpy
    >>> mangle('builtins')
    builtins
    r   )PYTHRAN_IMPORT_MANGLINGr   r
   r
   r   r      s   r   c                 C   s   |  tr| ttd S | S )z
    Demangle a module name, if needed
    >>> demangle('__pythran_import_numpy')
    numpy
    >>> mangle('numpy')
    numpy
    N)
startswithrT   r"   r   r
   r
   r   demangle   s   
rV   )r	   Zgastr   r   r9   rO   r2   	Exceptionr   r   r   r   r>   rA   r'   rT   r   rV   r
   r
   r
   r   <module>   s    	4
&