o
    gµ„iõ  ã                   @   sh   d dl mZ d dlmZmZ G dd„ deƒZG dd„ deƒZdd„ Zd	Z	d
Z
dZdZG dd„ deƒZdS )é    )Údeque)ÚtypesÚcgutilsc                   @   s:   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ ZdS )Ú
DataPackerz¨
    A helper to pack a number of typed arguments into a data structure.
    Omitted arguments (i.e. values with the type `Omitted`) are automatically
    skipped.
    c                    sp   ˆ | _ || _‡ fdd„|D ƒ| _g | _g | _t|ƒD ]\}}t|tjƒs5| j 	|¡ | j 	| j|  
¡ ¡ qd S )Nc                    s   g | ]}ˆ   |¡‘qS © )Úlookup©Ú.0Úty©Údmmr   úN/home/kuhnn/.local/lib/python3.10/site-packages/numba/core/datamodel/packer.pyÚ
<listcomp>   s    z'DataPacker.__init__.<locals>.<listcomp>)Ú_dmmÚ	_fe_typesÚ_modelsÚ	_pack_mapÚ	_be_typesÚ	enumerateÚ
isinstancer   ÚOmittedÚappendÚget_data_type)Úselfr   Úfe_typesÚir
   r   r   r   Ú__init__   s   €ýzDataPacker.__init__c                    s$   ‡ ‡‡fdd„ˆj D ƒ}t ˆ |¡S )zE
        Return the given values packed as a data structure.
        c                    s"   g | ]}ˆj |  ˆ ˆ| ¡‘qS r   )r   Úas_data)r	   r   ©Úbuilderr   Úvaluesr   r   r      s    ÿz&DataPacker.as_data.<locals>.<listcomp>)r   r   Úmake_anonymous_struct)r   r   r    Úelemsr   r   r   r      s   ÿzDataPacker.as_dataNc           	      C   sd   g }t | jƒD ](\}}t ||d|¡}| j|  ||¡}|d u r+| | j| |f¡ q|||< q|S ©Nr   )r   r   r   Úgep_inboundsr   Úload_from_data_pointerr   r   )	r   r   ÚptrÚformal_listÚresr   Úi_formalÚelem_ptrÚvalr   r   r   Ú_do_load#   s   
zDataPacker._do_loadc                 C   s   |   ||¡S )zK
        Load the packed values and return a (type, value) tuples.
        ©r,   )r   r   r&   r   r   r   Úload.   s   zDataPacker.loadc                 C   s   |   |||¡ dS )zƒ
        Load the packed values into a sequence indexed by formal
        argument number (skipping any Omitted position).
        Nr-   )r   r   r&   r'   r   r   r   Ú	load_into4   s   zDataPacker.load_into©N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r,   r.   r/   r   r   r   r   r      s    
r   c                   @   sF   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Ze	dd„ ƒZ
dS )Ú	ArgPackera  
    Compute the position for each high-level typed argument.
    It flattens every composite argument into primitive types.
    It maintains a position map for unflattening the arguments.

    Since struct (esp. nested struct) have specific ABI requirements (e.g.
    alignment, pointer address-space, ...) in different architecture (e.g.
    OpenCL, CUDA), flattening composite argument types simplifes the call
    setup from the Python side.  Functions are receiving simple primitive
    types and there are only a handful of these.
    c                 C   sl   || _ || _t|ƒ| _g | _g }|D ]}| j  |¡}| j |¡ | | ¡ ¡ qt|ƒ| _	t
t|ƒƒ| _d S r0   )r   Ú_fe_argsÚlenÚ_nargsÚ_dm_argsr   r   Úget_argument_typeÚ_UnflattenerÚ_unflattenerÚlistÚ_flattenÚ_be_args)r   r   Úfe_argsÚargtysr
   Údmr   r   r   r   I   s   

zArgPacker.__init__c                    sV   t |ƒ| jkrtd| jt |ƒf ƒ‚|sdS ‡ fdd„t| j|ƒD ƒ}tt|ƒƒ}|S )z$Flatten all argument values
        z+invalid number of args: expected %d, got %dr   c                    ó   g | ]
\}}|  ˆ |¡‘qS r   )Úas_argument©r	   rB   r+   ©r   r   r   r   a   ó    ÿz*ArgPacker.as_arguments.<locals>.<listcomp>)r7   r8   Ú	TypeErrorÚzipr9   Útupler>   )r   r   r    Úargsr   rF   r   Úas_argumentsW   s   ÿ

ÿzArgPacker.as_argumentsc                    s*   | j  |¡}‡ fdd„t| j|ƒD ƒ}|S )z&Unflatten all argument values
        c                    rC   r   )Úfrom_argumentrE   rF   r   r   r   m   rG   z,ArgPacker.from_arguments.<locals>.<listcomp>)r<   Ú	unflattenrI   r9   )r   r   rK   Úvaltreer    r   rF   r   Úfrom_argumentsh   s
   

ÿzArgPacker.from_argumentsc                 C   s0   | j  |¡}t||ƒD ]
\}}|  ||¡ qdS )z9Assign names for each flattened argument values.
        N)r<   rN   rI   Ú_assign_names)r   rK   ÚnamesrO   ÚavalÚanamer   r   r   Úassign_namess   s   ÿzArgPacker.assign_namesr   c                 C   sh   t |ttfƒrt|ƒD ]\}}| j||||f d qd S d tt|ƒ¡}||g}d tt	|ƒ¡|_
d S )N)ÚdepthÚ.)r   rJ   r=   r   rQ   ÚjoinÚmapÚstrÚfilterÚboolÚname)r   Úval_or_nestedr]   rV   ÚposrS   ÚpostfixÚpartsr   r   r   rQ   {   s   ÿzArgPacker._assign_namesc                 C   s   t dd„ | jD ƒƒS )z\Return a list of LLVM types that are results of flattening
        composite types.
        c                 s   s    | ]	}|d kr|V  qdS )r   Nr   r   r   r   r   Ú	<genexpr>‰   s   € z+ArgPacker.argument_types.<locals>.<genexpr>)rJ   r?   )r   r   r   r   Úargument_types„   s   zArgPacker.argument_typesN)r   )r1   r2   r3   r4   r   rL   rP   rU   rQ   Úpropertyrc   r   r   r   r   r5   <   s    
	r5   c                    s   ‡ fdd„‰ ˆ | ƒS )z3
    Flatten nested iterable of (tuple, list).
    c                 3   s:    | D ]}t |ttfƒrˆ |ƒD ]}|V  qq|V  qd S r0   )r   rJ   r=   )Úiterabler   Új©Úrecr   r   rh      s   €ÿûz_flatten.<locals>.recr   )re   r   rg   r   r>   Œ   s   r>   é   é   é   é   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r;   zè
    An object used to unflatten nested sequences after a given pattern
    (an arbitrarily nested sequence).
    The pattern shows the nested sequence shape desired when unflattening;
    the values it contains are irrelevant.
    c                 C   s   |   |¡| _d S r0   )Ú_build_unflatten_codeÚ_code)r   Úpatternr   r   r   r   §   s   z_Unflattener.__init__c                    s   g ‰ ‡ ‡fdd„‰ˆ|ƒ ˆ S )zzBuild the unflatten opcode sequence for the given *iterable* structure
        (an iterable of nested sequences).
        c                    s\   | D ])}t |ttfƒr&t|ƒdkr ˆ  t¡ ˆ|ƒ ˆ  t¡ qˆ  t¡ qˆ  t¡ qd S r#   )	r   rJ   r=   r7   r   Ú
_PUSH_LISTÚ_POPÚ_APPEND_EMPTY_TUPLEÚ_APPEND_NEXT_VALUE)re   r   ©Úcoderh   r   r   rh   ¯   s   
÷z/_Unflattener._build_unflatten_code.<locals>.recr   )r   re   r   rt   r   rm   ª   s   z"_Unflattener._build_unflatten_codec                 C   sž   t |ƒ}g }|}g }| jD ]3}|tu r"| |¡ | g ¡ |d }q|tu r.| | ¡ ¡ q|tu r8| d¡ q|tu r@| ¡ }q|rGJ |ƒ‚|rMJ |ƒ‚|S )z*Rebuild a nested tuple structure.
        éÿÿÿÿr   )	r   rn   rp   r   rs   Úpopleftrr   rq   Úpop)r   ÚflatiterÚvalsr(   ÚcurÚstackÚopr   r   r   rN   ¾   s&   



€z_Unflattener.unflattenN)r1   r2   r3   r4   r   rm   rN   r   r   r   r   r;   Ÿ   s
    r;   N)Úcollectionsr   Ú
numba.corer   r   Úobjectr   r5   r>   rp   rs   rr   rq   r;   r   r   r   r   Ú<module>   s    5P