Ë
    üÇ:jh   ã                   ó^  — d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZ ddlmZ d	Zd
ZdZd„ Z eeed¬«      Z eeed¬«      Zd„ Zi Zd„ Z eej8                  «      d„ «       Z eej8                  «      d„ «       Z ej>                  ej@                  «      d„ «       Z!y)z‚
Implement logic relating to wrapping (box) and unwrapping (unbox) instances
of jitclasses for use inside the python interpreter.
é    )ÚwrapsÚpartial)Úir)ÚtypesÚcgutils)Únjit)ÚboxÚunboxÚNativeValue)Útypeof_impl)Ú_boxz;
def accessor(__numba_self_):
    return __numba_self_.{0}
zN
def mutator(__numba_self_, __numba_val):
    __numba_self_.{0} = __numba_val
zL
def method(__numba_self_, *args):
    return __numba_self_.{method}(*args)
c                 ó\   — |j                  | «      }i }t        ||«       t        ||   «      S )zG
    Generate simple function that get/set a field of the instance
    )ÚformatÚexecr   )ÚfieldÚtemplateÚfnameÚsourceÚglblss        úw/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/numba/experimental/jitclass/boxing.pyÚ_generate_propertyr   !   s0   € ð �_‰_˜UÓ#€FØ€EÜˆ�ÔÜ��e‘ÓÐó    Úaccessor)r   r   Úmutatorc                 ó’   ‡— t         j                  | ¬«      }i }t        ||«       t        |d   «      Št	        |«      ˆfd„«       }|S )zo
    Generate a wrapper for calling a method.  Note the wrapper will only
    accept positional arguments.
    )Úmethodr   c                  ó   •—  ‰| i |¤ŽS ©N© )ÚargsÚkwargsr   s     €r   Úwrapperz!_generate_method.<locals>.wrapper;   s   ø€ á�tÐ&˜vÑ&Ð&r   )Ú_method_code_templater   r   r   r   )ÚnameÚfuncr   r   r"   r   s        @r   Ú_generate_methodr&   1   sR   ø€ ô
 #×)Ñ)°Ð)Ó6€FØ€EÜˆ�ÔÜ�%˜‘/Ó"€Fä
ˆ4ƒ[ó'ó ð'ð €Nr   c                 óÌ  — | t         v r	t         |    S d| | j                  j                  dœ}| j                  D ]'  }t	        |«      }t        |«      }t        ||«      ||<   Œ) | j                  j                  «       D ]m  \  }}d}d}d|v rt	        |«      }d|v rt        |«      }|j                  d«      xs |j                  d«      xs d}t        |dd«      }t        |||¬«      ||<   Œo h d£}| j                  j                  «       D ]O  \  }	}
|	d	k(  rŒ|	j                  d
«      r$|	j                  d
«      r|	|vrt        d|	› d�«      ‚t        |	|
«      ||	<   ŒQ | j                   j                  «       D ]  \  }	}
t        |	|
«      ||	<   Œ t#        | j$                  t&        j(                  f|«      }|t         | <   |j                  «       D ]•  \  }}t+        |t        «      sŒt        ||«      }|j,                  €Œ0|j,                  }|j/                  | f«      }|j1                  «        t3        ||t        ||j4                  |j6                  |j8                  ¬«      «       Œ— |S )z�
    Create a subclass of Box that is specialized to the jitclass.

    This function caches the result to avoid code bloat.
    r   )Ú	__slots__Ú_numba_type_Ú__doc__NÚgetÚsetr*   )Údoc>=   Ú__eq__Ú__ge__Ú__gt__Ú__le__Ú__lt__Ú__ne__Ú__or__Ú__abs__Ú__add__Ú__and__Ú__int__Ú__ior__Ú__len__Ú__mod__Ú__mul__Ú__neg__Ú__pos__Ú__pow__Ú__ror__Ú__str__Ú__sub__Ú__xor__Ú__bool__Ú__hash__Ú__iadd__Ú__iand__Ú__imod__Ú__imul__Ú__ipow__Ú__isub__Ú__ixor__Ú__radd__Ú__rand__Ú__rmod__Ú__rmul__Ú__rpow__Ú__rsub__Ú__rxor__Ú	__float__Ú	__index__Ú
__invert__Ú
__lshift__Ú
__matmul__Ú
__rshift__Ú__complex__Ú__getitem__Ú__ilshift__Ú__imatmul__Ú__irshift__Ú__rlshift__Ú__rmatmul__Ú__rrshift__Ú__setitem__Ú__truediv__Ú__contains__Ú__floordiv__Ú__itruediv__Ú__rtruediv__Ú__ifloordiv__Ú__rfloordiv__Ú__annotate_func__Ú__init__Ú__zMethod 'z' is not supported.)Ú_cache_specialized_boxÚ
class_typeÚ	class_docÚstructÚ_generate_getterÚ_generate_setterÚpropertyÚ	jit_propsÚitemsr+   ÚgetattrÚmethodsÚ
startswithÚendswithÚ	TypeErrorr&   Ústatic_methodsÚtypeÚ	classnamer   ÚBoxÚ
isinstanceÚfgetÚcompileÚdisable_compileÚsetattrÚfsetÚfdelr*   )ÚtypÚdctr   ÚgetterÚsetterÚimpdctÚimpr-   Úsupported_dundersr$   r%   ÚsubclsÚkÚvÚpropr€   Ú	fast_fgets                    r   Ú_specialize_boxr’   E   s_  € ð Ô$Ñ$Ü% cÑ*Ð*ØØØ—n‘n×.Ñ.ñ€Cð
 —‘ò .ˆÜ! %Ó(ˆÜ! %Ó(ˆÜ˜f fÓ-ˆˆEŠ
ð.ð
 Ÿ™×,Ñ,Ó.ò 
7‰ˆˆvØˆØˆØ�F‰?Ü% eÓ,ˆFØ�F‰?Ü% eÓ,ˆFà�j‰j˜ÓÒ< 6§:¡:¨eÓ#4Ò<¸ˆÜ�c˜9 dÓ+ˆÜ˜f f°#Ô6ˆˆEŠ
ð
7ò>Ðð~ —k‘k×'Ñ'Ó)ò 	1‰
ˆˆdØ�:ÒØà�O‰O˜DÔ!Ø—‘˜dÔ#ØÐ-Ñ-ä˜h t fÐ,?Ð@ÓAÐAÜ$ T¨4Ó0ˆˆDŠ	ð	1ð ×(Ñ(×.Ñ.Ó0ò 1‰
ˆˆdÜ$ T¨4Ó0ˆˆDŠ	ð1ô �#—-‘-¤$§(¡( ¨cÓ2€Fà"(Ô˜3Ñð
 —	‘	“ò 	4‰ˆˆ1Ü�aœÕ"Ü˜6 1Ó%ˆDØ�y‰yÑ$Ø—y‘y�Ø ŸL™L¨#¨Ó0�	Ø×$Ñ$Ô&Ü˜ Ü  ¨D¯I©I°t·y±yØ%)§\¡\ô3õ4ð	4ð €Mr   c                 ó‚  ‡‡‡— t        j                  ‰j                  |«      \  }}t        | «      }‰j                  j                  ‰j                  t        |«      d¬«      }‰j                  j                  |‰j                  j                  «      }‰j                  j                  |d«      Št        j                  d«      j                  «       Š‰j                  j                  |‰«      }‰j                  j                  |‰«      }	ˆˆˆfd„}
 |
t        j                  |«        |
t        j                   |	«       ‰S )NÚbox_class_instance)Úinfor   é   c                 ó(  •— ‰j                   j                  t        j                  | «      }t	        j
                  ‰j                  ‰|«      }‰j                  j                  |‰j                  «       «      }‰j                  j                  ||«       y r   )
ÚcontextÚget_constantr   Úuintpr   Úpointer_addÚbuilderÚbitcastÚ
as_pointerÚstore)Úmember_offsetÚvalueÚoffsetÚptrÚcastedr	   ÚcÚ	llvoidptrs        €€€r   Ú
set_memberz'_box_class_instance.<locals>.set_memberà   sf   ø€ à—‘×'Ñ'¬¯©°]ÓCˆÜ×!Ñ! !§)¡)¨S°&Ó9ˆØ—‘×"Ñ" 3¨	×(<Ñ(<Ó(>Ó?ˆØ	�	‰	�‰˜˜vÕ&r   )r   Úunpack_tuplerœ   r’   r˜   Úadd_dynamic_addrÚidr�   ÚpyapiÚpyobjÚcall_function_objargsr   ÚIntTyperž   r   Úbox_meminfoptr_offsetÚbox_dataptr_offset)r†   Úvalr¥   ÚmeminfoÚdataptrÚbox_subclassedÚvoidptr_boxclsÚbox_clsÚaddr_meminfoÚ	addr_datar§   r	   r¦   s     `        @@r   Ú_box_class_instancer¹   Ë   sû   ú€ ä×+Ñ+¨A¯I©I°sÓ;Ñ€GˆWô % SÓ)€Nà—Y‘Y×/Ñ/Ø	�	‰	Ü
ˆ>ÓØ!ð 0ó €Nð
 �i‰i×Ñ °·±·±Ó>€Gà
�'‰'×
'Ñ
'¨°Ó
4€Cô —
‘
˜1“×(Ñ(Ó*€IØ—9‘9×$Ñ$ W¨iÓ8€LØ—	‘	×!Ñ! '¨9Ó5€Iö'ñ Œt×)Ñ)¨<Ô8ÙŒt×&Ñ&¨	Ô2Ø€Jr   c                 ón  ‡‡— ˆˆfd„}t        j                  | «      } |‰j                  ‰j                  «      } |t        j
                  «      } |t        j                  «      }‰j                  j                  ||j                  j                  «      |_        ‰j                  j                  ||j                  j                  «      |_
        |j                  «       }‰j                  j                  j                  ‰j                  | |«       t        |‰j                  j!                  «       ¬«      S )Nc                 ój  •— ‰j                   j                  t        j                  | «      }t	        j
                  d«      j                  «       }t        j                  ‰j                  ‰|«      }‰j                  j                  ||j                  «       «      }‰j                  j                  |«      S )Nr–   )r˜   r™   r   rš   r   r®   rž   r   r›   rœ   r�   Úload)r    r¢   r¦   r£   r¤   r¥   r±   s        €€r   Úaccess_memberz,_unbox_class_instance.<locals>.access_memberî   s}   ø€ à—‘×'Ñ'¬¯©°]ÓCˆÜ—J‘J˜q“M×,Ñ,Ó.ˆ	Ü×!Ñ! !§)¡)¨S°&Ó9ˆØ—‘×"Ñ" 3¨	×(<Ñ(<Ó(>Ó?ˆØ�y‰y�~‰~˜fÓ%Ð%r   )Úis_error)r   Úcreate_struct_proxyr˜   rœ   r   r¯   r°   r�   r²   r|   ÚdataÚ	_getvalueÚnrtÚincrefr   r«   Úc_api_error)	r†   r±   r¥   r½   Ú
struct_clsÚinstÚptr_meminfoÚptr_dataptrÚrets	    ``      r   Ú_unbox_class_instancerÊ   ì   sØ   ù€ õ&ô ×,Ñ,¨SÓ1€JÙ�a—i‘i §¡Ó+€Dñ  ¤× :Ñ :Ó;€KÙ¤× 7Ñ 7Ó8€Kð —9‘9×$Ñ$ [°$·,±,×2CÑ2CÓD€D„LØ—	‘	×!Ñ! +¨t¯y©y¯~©~Ó>€D„Ià
�.‰.Ó
€Cà‡I�I‡M�M×Ñ˜Ÿ™ C¨Ô-ä�s Q§W¡W×%8Ñ%8Ó%:Ô;Ð;r   c                 ó,   — t        t        | «      d«      S )Nr)   )rv   r|   )r±   r¥   s     r   Ú_typeof_jitclass_boxrÌ     s   € ä”4˜“9˜nÓ-Ð-r   N)"r*   Ú	functoolsr   r   Úllvmliter   Ú
numba.corer   r   Únumba.core.decoratorsr   Únumba.core.pythonapir	   r
   r   Únumba.core.typing.typeofr   Únumba.experimental.jitclassr   Ú_getter_code_templateÚ_setter_code_templater#   r   rq   rr   r&   rm   r’   ÚClassInstanceTyper¹   rÊ   Úregisterr~   rÌ   r   r   r   ú<module>rØ      sä   ðñ÷
 %å ç %Ý &ß 8Ñ 8Ý 0Ý ,ðÐ ð
Ð ð
Ð òñ Ð-Ð8MØ!+ô-Ð áÐ-Ð8MØ!*ô,Ð òð" Ð ò@ñL €U×ÑÓñó ðñ@ €u×ÑÓñ<ó  ð<ðH €×Ñ�d—h‘hÓñ.ó  ñ.r   