o
    í@ËaÅ  ã                   @   sX   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
ddlZG dd„ deƒZdS )z. Inlinable list function that may be inlined. é    )ÚModuleAnalysis)ÚIdentifiers)ÚPureExpressionsNc                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú	Inlinablez‰ Determine set of inlinable function.

    A function can be inlined if it has only one statement and doesn't
    recurse on itself.
    c                    s   t ƒ | _tt| ƒ t¡ d S )N)ÚdictÚresultÚsuperr   Ú__init__r   )Úself©Ú	__class__© ú</usr/lib/python3/dist-packages/pythran/analyses/inlinable.pyr	      s   zInlinable.__init__c                 C   s~   t |jƒdkr	dS |jd }t|tjtjfƒsdS t |tj¡r'|| j	vr'dS |  
t|¡}|j|vr=t |¡| j|j< dS dS )z4 Determine this function definition can be inlined. é   Nr   )ÚlenÚbodyÚ
isinstanceÚastZCallZReturnÚmetadataÚgetZStaticReturnZpure_expressionsZgatherr   ÚnameÚcopyZdeepcopyr   )r
   ZnodeZsbodyZidsr   r   r   Úvisit_FunctionDef   s   


ÿzInlinable.visit_FunctionDef)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   Ú__classcell__r   r   r   r   r      s    r   )r   Zpythran.passmanagerr   Zpythran.analysesr   Z!pythran.analyses.pure_expressionsr   Zpythran.metadatar   Zgastr   r   r   r   r   r   r   Ú<module>   s    