§
    ƒÛg!  ã                   ó†   — d dl mZmZ d dl Zd dlmZmZmZ  G d„ de¦  «        Z	 G d„ de¦  «        Z
 G d„ d	e¦  «        ZdS )
é    )ÚConstantÚ	IRBuilderN)ÚtypesÚconfigÚcgutilsc                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú_ArgManagerzA
    A utility class to handle argument unboxing and cleanup
    c                 óh   — || _         || _        || _        || _        d| _        g | _        || _        d S )Nr   )ÚcontextÚbuilderÚapiÚenv_managerÚ	arg_countÚcleanupsÚnextblk)Úselfr   r   r   r   ÚendblkÚnargss          úL/granary/edev/quantum/lib/python3.11/site-packages/numba/core/callwrapper.pyÚ__init__z_ArgManager.__init__   s8   € ØˆŒØˆŒØˆŒØ&ˆÔØˆŒØˆŒØˆŒˆˆó    c                 ób  ‡ ‡‡— ‰ j                              ‰|¦  «        Št          j        ‰ j        ‰j        ¦  «        5  ‰ j                             ‰ j        ¦  «         ddd¦  «         n# 1 swxY w Y   ˆˆ ˆfd„}‰ j         	                    |¦  «         ‰ j         
                    d‰ j        z  ¦  «        }‰ j                             |¦  «        5   |¦   «          ‰ j                             ‰ j        ¦  «         ddd¦  «         n# 1 swxY w Y   |‰ _        ‰ xj        dz  c_        ‰j        S )ak  
        Unbox argument and emit code that handles any error during unboxing.
        Args are cleaned up in reverse order of the parameter list, and
        cleanup begins as soon as unboxing of any argument fails. E.g. failure
        on arg2 will result in control flow going through:

            arg2.err -> arg1.err -> arg0.err -> arg.end (returns)
        Nc                  óü   •— ‰j                              ‰‰ j        ‰j        ¦  «         ‰ j        �‰                      ¦   «          ‰j        j        r-‰j        j                             ‰j	        ‰‰ j        ¦  «         d S d S ©N)
r   Úreflect_native_valueÚvaluer   Úcleanupr   Ú
enable_nrtÚnrtÚdecrefr   )Únativer   Útys   €€€r   Úcleanup_argz(_ArgManager.add_arg.<locals>.cleanup_arg&   s   ø€ àŒH×)Ò)¨"¨f¬l¸DÔ<LÑMÔMÐMð Œ~Ð)Ø—’Ñ Ô Ð ð
 Œ|Ô&ð HØ”Ô ×'Ò'¨¬°b¸&¼,ÑGÔGÐGÐGÐGðHð Hr   z	arg%d.erré   )r   Úto_native_valuer   Úif_unlikelyr   Úis_errorÚbranchr   r   ÚappendÚappend_basic_blockr   Ú
goto_blockr   )r   Úobjr"   r#   Ú
cleanupblkr!   s   ` `  @r   Úadd_argz_ArgManager.add_arg   s¸  øøø€ ð ”×)Ò)¨"¨cÑ2Ô2ˆõ Ô  ¤¨v¬Ñ?Ô?ð 	.ð 	.ØŒL×Ò ¤Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð	Hð 	Hð 	Hð 	Hð 	Hð 	Hð 	Hð 	Œ×Ò˜[Ñ)Ô)Ð)ð ”\×4Ò4Ø˜$œ.Ñ(ñ*ô *ˆ
àŒ\×$Ò$ ZÑ0Ô0ð 	.ð 	.ØˆK‰MŒMˆMàŒL×Ò ¤Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð
 "ˆŒØˆŒ˜!ÑˆŒØŒ|Ðs#   ¾ A*Á*A.Á1A.Ã*DÄDÄDc                 ó.   — | j         D ]} |¦   «          ŒdS )zR
        Emit the cleanup code after returning from the wrapped function.
        N)r   )r   Údtors     r   Úemit_cleanupz_ArgManager.emit_cleanupB   s,   € ð ”Mð 	ð 	ˆDØˆD‰FŒFˆFˆFð	ð 	r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r.   r1   © r   r   r	   r	      sL   € € € € € ðð ðð ð ð,ð ,ð ,ð\ð ð ð ð r   r	   c                   ó   — e Zd ZdZd„ Zd„ ZdS )Ú_GilManagerzY
    A utility class to handle releasing the GIL and then re-acquiring it
    again.
    c                 ób   — || _         || _        || _        |                     ¦   «         | _        d S r   )r   r   ÚargmanÚsave_threadÚthread_state)r   r   r   r:   s       r   r   z_GilManager.__init__P   s/   € ØˆŒØˆŒØˆŒØŸOšOÑ-Ô-ˆÔÐÐr   c                 óv   — | j                              | j        ¦  «         | j                             ¦   «          d S r   )r   Úrestore_threadr<   r:   r1   )r   s    r   r1   z_GilManager.emit_cleanupV   s5   € ØŒ×Ò Ô 1Ñ2Ô2Ð2ØŒ× Ò Ñ"Ô"Ð"Ð"Ð"r   N)r2   r3   r4   r5   r   r1   r6   r   r   r8   r8   J   s<   € € € € € ðð ð
.ð .ð .ð#ð #ð #ð #ð #r   r8   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚPyCallWrapperc                 óZ   — || _         || _        || _        || _        || _        || _        d S r   )r   ÚmoduleÚfuncÚfndescÚenvÚrelease_gil)r   r   rB   rC   rD   rE   Úcall_helperrF   s           r   r   zPyCallWrapper.__init__\   s3   € àˆŒØˆŒØˆŒ	ØˆŒØˆŒØ&ˆÔÐÐr   c                 óè  — | j         j        }| j                             t          j        ¦  «        }t          j                             ||||g¦  «        }t          j         	                    | j
        ||¬¦  «        }t          |                     d¦  «        ¦  «        }|j        \  }}}d|_        d|_        d|_        | j                             |¦  «        }	|                      |	||||¦  «         ||	fS )N)ÚnameÚentryÚ
py_closureÚpy_argsÚpy_kws)rD   Úllvm_cpython_wrapper_namer   Úget_argument_typer   ÚpyobjectÚllvmliteÚirÚFunctionTypeÚFunctionrB   r   r*   ÚargsrI   Úget_python_apiÚbuild_wrapper)
r   ÚwrapnameÚpyobjÚwraptyÚwrapperr   ÚclosurerU   Úkwsr   s
             r   ÚbuildzPyCallWrapper.builde   sÜ   € Ø”;Ô8ˆð ”×.Ò.­u¬~Ñ>Ô>ˆÝ”×)Ò)¨%°%¸ÀÐ1FÑGÔGˆÝ”+×&Ò& t¤{°FÀÐ&ÑJÔJˆå˜G×6Ò6°wÑ?Ô?Ñ@Ô@ˆð %œ\Ñˆ��sØ#ˆŒØˆŒ	ØˆŒàŒl×)Ò)¨'Ñ2Ô2ˆØ×Ò˜3 ¨°$¸Ñ<Ô<Ð<à˜ˆ|Ðr   c                 ó(  ‡— t          | j        j        ¦  «        }ˆfd„t          |¦  «        D ¦   «         } ‰j        || j        j        ||g|¢R Ž }|                     d|t          |j        d ¦  «        ¦  «        }	t          j
        ||	¦  «        5  |                     ‰                     ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   |                     d¦  «        }
|                     |
¦  «        5  |                     ‰                     ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      ‰|¦  «        }t!          | j        |‰||
|¦  «        }g }t%          || j        j        ¦  «        D ]s\  }}t'          |t(          j        ¦  «        r|                     d ¦  «         Œ5|                     |                     |¦  «        |¦  «        }|                     |¦  «         Œt| j        rt5          |‰|¦  «        }| j        j                             || j        | j        j        | j        j        |d¬¦  «        \  }}|                      |d¦  «         |                      ¦   «          |                      |d¦  «         | !                    |j"        d¬	¦  «        5  | !                    |j#        ¦  «        5  ‰ $                    ¦   «          d d d ¦  «         n# 1 swxY w Y   |  %                    ¦   «         }‰ &                    |||¦  «        }|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   | j        j         '                    |‰|¦  «         |                     ‰                     ¦   «         ¦  «         d S )
Nc                 ó8   •— g | ]}‰                      ¦   «         ‘ŒS r6   )Ú
alloca_obj)Ú.0Ú_r   s     €r   ú
<listcomp>z/PyCallWrapper.build_wrapper.<locals>.<listcomp>�   s#   ø€ Ð7Ð7Ð7 Q�—’Ñ Ô Ð7Ð7Ð7r   z==zarg.end)Únoinline)Úattrsz# callwrapper: emit_cleanupz# callwrapper: emit_cleanup endT)Úlikely)(ÚlenrD   ÚargtypesÚrangeÚunpack_tupleÚqualnameÚicmp_unsignedr   Útyper   r&   ÚretÚget_null_objectr*   r+   Úget_envr	   r   ÚzipÚ
isinstancer   ÚOmittedr)   r.   ÚloadrF   r8   Ú	call_convÚcall_functionrC   ÚrestypeÚdebug_printr1   Úif_thenÚis_okÚis_noneÚreturn_noneÚ_simplified_return_typeÚfrom_native_returnÚraise_error)r   r   r   r\   rU   r]   r   ÚobjsÚparseokÚpredr   r   Úcleanup_managerÚ	innerargsr,   r"   ÚvalÚstatusÚretvalÚrettys    `                  r   rW   zPyCallWrapper.build_wrapper~   sy  ø€ Ý�D”KÔ(Ñ)Ô)ˆà7Ð7Ð7Ð7­%°©,¬,Ð7Ñ7Ô7ˆØ"�#Ô" 4¨¬Ô)=Ø#(¨%ð8Ø26ð8ð 8ð 8ˆð ×$Ò$ØØÝ�W”\ 4Ñ(Ô(ñ*ô *ˆõ Ô  ¨$Ñ/Ô/ð 	/ð 	/Ø�KŠK˜×+Ò+Ñ-Ô-Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð ×+Ò+¨IÑ6Ô6ˆØ×Ò Ñ'Ô'ð 	/ð 	/Ø�KŠK˜×+Ò+Ñ-Ô-Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð —l’l 3¨Ñ0Ô0ˆå% d¤l°G¸SØ&1°6¸5ñBô Bˆð ˆ	Ý˜4 ¤Ô!5Ñ6Ô6ð 	&ð 	&‰GˆC�Ý˜"�eœmÑ,Ô,ð &à× Ò  Ñ&Ô&Ð&Ð&à%×-Ò-¨g¯lªl¸3Ñ.?Ô.?ÀÑDÔD�Ø× Ò  Ñ%Ô%Ð%Ð%àÔð 	IÝ)¨'°3¸ÑHÔHˆOð œÔ/×=Ò=Ø�T”Y ¤Ô 3°T´[Ô5IØ˜]ð >ñ ,ô ,‰ˆ�ð 	×Ò˜Ð"?Ñ@Ô@Ð@Ø×$Ò$Ñ&Ô&Ð&Ø×Ò˜Ð"CÑDÔDÐDð �_Š_˜Vœ\°$ˆ_Ñ7Ô7ð 	ð 	à—’ ¤Ñ0Ô0ð "ð "Ø—’Ñ!Ô!Ð!ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð ×0Ò0Ñ2Ô2ˆEØ×(Ò(¨°¸ÑDÔDˆCØ�KŠK˜ÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ŒÔ×*Ò*¨7°C¸Ñ@Ô@Ð@Ø�Š�C×'Ò'Ñ)Ô)Ñ*Ô*Ð*Ð*Ð*s[   Â(CÃCÃCÃ9(D-Ä-D1Ä4D1Ê,L?ËK(ËL?Ë(K,	Ë,L?Ë/K,	Ë0AL?Ì?MÍMc                 ó`  — | j                              | j        ¦  «        }| j                              |j        |¦  «        }|                     |¦  «        }| j                              ||¦  «        }|                     |d| j        j        ¬¦  «         | 	                    | j
        ||¦  «        }|S )zpGet the Environment object which is declared as a global
        in the module of the wrapped function.
        T)Úreturn_pyobjectÚ	debug_msg)r   Úget_env_namerD   Údeclare_env_globalrB   ru   Úget_env_bodyÚemit_environment_sentryÚenv_nameÚget_env_managerrE   )r   r   r   ÚenvnameÚgvptrÚenvptrÚenv_bodyr   s           r   rq   zPyCallWrapper.get_envÅ   s§   € ð ”,×+Ò+¨D¬KÑ8Ô8ˆØ”×/Ò/°´ÀÑHÔHˆØ—’˜eÑ$Ô$ˆà”<×,Ò,¨W°fÑ=Ô=ˆà×#Ò# F¸DØ.2¬kÔ.Bð 	$ñ 	Dô 	Dð 	Dà×)Ò)¨$¬(°H¸fÑEÔEˆØÐr   c                 ó`   — | j         j        }t          |t          j        ¦  «        r|j        S |S )z…
        The NPM callconv has already converted simplified optional types.
        We can simply use the value type from it.
        )rD   rx   rs   r   ÚOptionalrn   )r   rx   s     r   r~   z%PyCallWrapper._simplified_return_typeÔ   s/   € ð
 ”+Ô%ˆå�g�uœ~Ñ.Ô.ð 	Ø”<ÐàˆNr   c                 ó~   — t           j        r0| j                             |d                     |¦  «        ¦  «         d S d S )NzDEBUGJIT: {0})r   Ú	DEBUG_JITr   ry   Úformat)r   r   Úmsgs      r   ry   zPyCallWrapper.debug_printà   sF   € ÝÔð 	KØŒL×$Ò$ W¨o×.DÒ.DÀSÑ.IÔ.IÑJÔJÐJÐJÐJð	Kð 	Kr   N)	r2   r3   r4   r   r^   rW   rq   r~   ry   r6   r   r   r@   r@   [   sw   € € € € € ð'ð 'ð 'ðð ð ð2E+ð E+ð E+ðNð ð ð
ð 
ð 
ðKð Kð Kð Kð Kr   r@   )Úllvmlite.irr   r   rQ   Ú
numba.corer   r   r   Úobjectr	   r8   r@   r6   r   r   ú<module>r       sì   ðØ +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð à -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ð@ð @ð @ð @ð @�&ñ @ô @ð @ðF#ð #ð #ð #ð #�&ñ #ô #ð #ð"GKð GKð GKð GKð GK�Fñ GKô GKð GKð GKð GKr   