
    Ǆg                     V    d dl mZ d dlmZmZ d dlmZ  edddg      Z G d d      Zy	)
    )
namedtuple)typesir)	signature	BoundFuncfuncsigc                   J   e Zd ZdZd Zed        Zed        Zed        Zed        Z	i fdZ
ddej                  fd	Zddej                  fd
Zddej                  fdZdej                  fdZi fdej"                  fdZdej&                  fdZdej"                  fdZy)ParforLoweringBuilderz@Helper class for building Numba-IR and lowering for Parfor.
    c                 .    || _         || _        || _        y N)_lowerer_scope_loc)selflowererscopelocs       k/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/numba/parfors/parfor_lowering_utils.py__init__zParforLoweringBuilder.__init__   s    	    c                 .    | j                   j                  S r   )r   contextr   s    r   _contextzParforLoweringBuilder._context   s    }}$$$r   c                 .    | j                   j                  S r   )r   typing_contextr   s    r   
_typingctxz ParforLoweringBuilder._typingctx   s    }}+++r   c                 B    | j                   j                  j                  S r   )r   fndesctypemapr   s    r   _typemapzParforLoweringBuilder._typemap   s    }}##+++r   c                 B    | j                   j                  j                  S r   )r   r    	calltypesr   s    r   
_calltypesz ParforLoweringBuilder._calltypes   s    }}##---r   c                     | j                   }|j                   d}|j                   }| j                  j                  |||      }| j	                  t        j                  |||      ||      }	t        |	|      S )a9  Binds a global function to a variable.

        Parameters
        ----------
        fobj : object
            The function to be bound.
        ftype : types.Type
        args : Sequence[types.Type]
        kws : Mapping[str, types.Type]

        Returns
        -------
        callable: _CallableNode
        _funcr   rhstypname)r   r	   )r   __name__r   resolve_function_typeassignr   Global_CallableNode)
r   fobjftypeargskwsr   varnamegvnamefunc_sigfunc_vars
             r   bind_global_functionz*ParforLoweringBuilder.bind_global_function"   sv     ii]]O5)MM???88cJ;;		&$C0e'  
 (99r   returnc                 h    | j                  t        j                  || j                        ||      S )a$  Makes a constant variable

        Parameters
        ----------
        cval : object
            The constant value
        typ : types.Type
            type of the value
        name : str
            variable name to store to

        Returns
        -------
        res : ir.Var
        r(   r)   )r/   r   Constr   )r   cvalr+   r,   s       r   make_const_variablez)ParforLoweringBuilder.make_const_variable;   s0      {{499-3T  
 	
r   c                    | j                   }|D cg c]  }| j                  |j                      }}t        j                  j                  |      }| j                  t        j                  j                  ||      ||      S c c}w )a  Makes a tuple variable

        Parameters
        ----------
        varlist : Sequence[ir.Var]
            Variables containing the values to be stored.
        name : str
            variable name to store to

        Returns
        -------
        res : ir.Var
        r)   )
r   r"   r,   r   Tuple
from_typesr/   r   Exprbuild_tuple)r   varlistr,   r   xvartystuptys          r   make_tuple_variablez)ParforLoweringBuilder.make_tuple_variableO   st     ii189A$--'99&&v.{{##GS1u4  
 	
 :s    Bc                     | j                   }| j                  j                  ||      }|| j                  |j                  <   t        j                  |||      }| j                  j                  |       |S )a!  Assign a value to a new variable

        Parameters
        ----------
        rhs : object
            The value
        typ : types.Type
            type of the value
        name : str
            variable name to store to

        Returns
        -------
        res : ir.Var
        )	r   r   redefiner"   r,   r   Assignr   
lower_instr   r*   r+   r,   r   varr/   s          r   r/   zParforLoweringBuilder.assignd   s^      iikk""4-"%chh3S)  (
r   c                    | j                   }t        j                  | j                  ||      }t        j                  |||      }| j
                  j                  |j                  |       | j                  j                  |       |S )a@  Assign a value to a new variable or inplace if it already exist

        Parameters
        ----------
        rhs : object
            The value
        typ : types.Type
            type of the value
        name : str
            variable name to store to

        Returns
        -------
        res : ir.Var
        )
r   r   Varr   rL   r"   
setdefaultr,   r   rM   rN   s          r   assign_inplacez$ParforLoweringBuilder.assign_inplace{   sd      iiffT[[$,3S)  3/  (
r   c                     t         j                  j                  |j                  ||| j                        }|j
                  | j                  |<   |S )a=  Call a bound callable

        Parameters
        ----------
        callable_node : _CallableNode
            The callee
        args : Sequence[ir.Var]
        kws : Mapping[str, ir.Var]

        Returns
        -------
        res : ir.Expr
            The expression node for the return value of the call
        r(   )r   rC   callr   r   r	   r%   )r   callable_noder4   r5   rU   s        r   rU   zParforLoweringBuilder.call   sA     ww||M..ctyy|I - 1 1r   c                 f   | j                   }| j                  }t        j                  ||||      }t	        t
        j                  ||j                     ||j                     ||j                           | j                  j                  j                  |<   | j                  j                  |       |S )a  Makes a setitem call

        Parameters
        ----------
        obj : ir.Var
            the object being indexed
        index : ir.Var
            the index
        val : ir.Var
            the value to be stored

        Returns
        -------
        res : ir.SetItem
        r(   )r   r"   r   SetItemr   r   noner,   r   r    r$   rM   )r   objindexvalr   tmsetitems          r   r^   zParforLoweringBuilder.setitem   s      ii]]**S%#62;JJ388bnbl3
&&w/ 	  )r   c                    | j                   }t        j                  j                  ||| j                        }t        |||j                     ||j                           | j                  j                  j                  |<   |S )a*  Makes a getitem call

        Parameters
        ----------
        obj : ir.Var
            the object being indexed
        index : ir.Var
            the index
        val : ir.Var
            the ty

        Returns
        -------
        res : ir.Expr
            the retrieved value
        r(   )
r"   r   rC   getitemr   r   r,   r   r    r$   )r   rZ   r[   r+   r]   r`   s         r   r`   zParforLoweringBuilder.getitem   sf    " ]]''//#u$))/<2;CHHr%**~3
&&w/ r   N)pf_const)pf_tuple)	pf_assign)r-   
__module____qualname____doc__r   propertyr   r   r"   r%   r:   r   rQ   r?   rI   r/   rS   rC   rU   rX   r^   r`    r   r   r   r   
   s    
 % % , , , , . . ;= :2
 
(
rvv 
*BFF . . -/ 277 &"** 2"'' r   r   N)	collectionsr   
numba.corer   r   numba.core.typingr   r1   r   rh   r   r   <module>rl      s,    "   ' ;8J Jr   