§
    2@Äj{!  ã                   óh  — 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j        ¦  «        d„ ¦   «         Z eej        ¦  «        d„ ¦   «         Z ej        ej         ¦  «        d„ ¦   «         Z!dS )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                 óz   — |                      | ¦  «        }i }t          ||¦  «         t          ||         ¦  «        S )zG
    Generate simple function that get/set a field of the instance
    )ÚformatÚexecr   )ÚfieldÚtemplateÚfnameÚsourceÚglblss        úSC:\Projects\Historical\venv\Lib\site-packages\numba/experimental/jitclass/boxing.pyÚ_generate_propertyr   !   s<   € ð �_Š_˜UÑ#Ô#€FØ€EÝˆ�ÑÔÐÝ��e”ÑÔÐó    Úaccessor)r   r   Úmutatorc                 óÀ   ‡— t                                | ¬¦  «        }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   ø€ àˆv�tÐ&˜vÐ&Ð&Ð&r   )Ú_method_code_templater   r   r   r   )ÚnameÚfuncr   r   r"   r   s        @r   Ú_generate_methodr&   1   sq   ø€ õ
 #×)Ò)°Ð)Ñ6Ô6€FØ€EÝˆ�ÑÔÐÝ�%˜”/Ñ"Ô"€Få
ˆ4�[„[ð'ð 'ð 'ð 'ñ „[ð'ð €Nr   c                 ó  — | t           v rt           |          S d| | j        j        dœ}| j        D ]3}t	          |¦  «        }t          |¦  «        }t          ||¦  «        ||<   Œ4| j                             ¦   «         D ]�\  }}d}d}d|v rt	          |¦  «        }d|v rt          |¦  «        }| 	                    d¦  «        p| 	                    d¦  «        pd}t          |dd¦  «        }t          |||¬¦  «        ||<   Œ‚h d£}| j                             ¦   «         D ]`\  }	}
|	d	k    rŒ|	                     d
¦  «        r,|	                     d
¦  «        r|	|vrt          d|	› d�¦  «        ‚t          |	|
¦  «        ||	<   Œa| j                             ¦   «         D ]\  }	}
t          |	|
¦  «        ||	<   Œt#          | j        t&          j        f|¦  «        }|t           | <   |                     ¦   «         D ]“\  }}t+          |t          ¦  «        ryt          ||¦  «        }|j        �b|j        }|                     | f¦  «        }|                     ¦   «          t3          ||t          ||j        |j        |j        ¬¦  «        ¦  «         Œ”|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Ô.ðð €Cð
 ”ð .ð .ˆÝ! %Ñ(Ô(ˆÝ! %Ñ(Ô(ˆÝ˜f fÑ-Ô-ˆˆE‰
ˆ
àœ×,Ò,Ñ.Ô.ð 
7ð 
7‰ˆˆvØˆØˆØ�Fˆ?ˆ?Ý% eÑ,Ô,ˆFØ�Fˆ?ˆ?Ý% eÑ,Ô,ˆFà�jŠj˜ÑÔÐ< 6§:¢:¨eÑ#4Ô#4Ð<¸ˆÝ�c˜9 dÑ+Ô+ˆÝ˜f f°#Ð6Ñ6Ô6ˆˆE‰
ˆ
ð>ð >ð >Ðð~ ”k×'Ò'Ñ)Ô)ð 	1ð 	1‰
ˆˆdØ�:ÒÐØà�OŠO˜DÑ!Ô!ð	Bà—’˜dÑ#Ô#ð	Bð Ð-Ð-Ð-åÐ@ tÐ@Ð@Ð@ÑAÔAÐAÝ$ T¨4Ñ0Ô0ˆˆD‰	ˆ	ð Ô(×.Ò.Ñ0Ô0ð 1ð 1‰
ˆˆdÝ$ T¨4Ñ0Ô0ˆˆD‰	ˆ	õ �#”-¥$¤( ¨cÑ2Ô2€Fà"(Õ˜3Ñð
 —	’	‘”ð 	4ð 	4‰ˆˆ1Ý�a�Ñ"Ô"ð 	4Ý˜6 1Ñ%Ô%ˆDØŒyÐ$Ø”y�Ø ŸLšL¨#¨Ñ0Ô0�	Ø×$Ò$Ñ&Ô&Ð&Ý˜ Ý  ¨D¬I°t´yØ%)¤\ð3ñ 3ô 3ñ4ô 4ð 4øð €Mr   c                 ó`  ‡‡‡— t          j        ‰j        |¦  «        \  }}t          | ¦  «        }‰j                             ‰j        t          |¦  «        d¬¦  «        }‰j                             |‰j        j	        ¦  «        }‰j         
                    |d¦  «        Št          j        d¦  «                             ¦   «         Š‰j                             |‰¦  «        }‰j                             |‰¦  «        }	ˆˆˆfd„}
 |
t          j        |¦  «          |
t          j        |	¦  «         ‰S )NÚbox_class_instance)Úinfor   é   c                 ó  •— ‰j                              t          j        | ¦  «        }t	          j        ‰j        ‰|¦  «        }‰j                             |‰                     ¦   «         ¦  «        }‰j         	                    ||¦  «         d S 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à   sq   ø€ à”×'Ò'­¬°]ÑCÔCˆÝÔ! !¤)¨S°&Ñ9Ô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°sÑ;Ô;Ñ€GˆWõ % SÑ)Ô)€Nà”Y×/Ò/Ø	Œ	Ý
ˆ>ÑÔØ!ð 0ñ ô €Nð
 Œi×Ò °´´Ñ>Ô>€Gà
Œ'×
'Ò
'¨°Ñ
4Ô
4€Cõ ”
˜1‘”×(Ò(Ñ*Ô*€IØ”9×$Ò$ W¨iÑ8Ô8€LØ”	×!Ò! '¨9Ñ5Ô5€Ið'ð 'ð 'ð 'ð 'ð 'ð 'ð €J�tÔ)¨<Ñ8Ô8Ð8Ø€J�tÔ&¨	Ñ2Ô2Ð2Ø€Jr   c                 ó&  ‡‡— ˆˆfd„}t          j        | ¦  «        } |‰j        ‰j        ¦  «        } |t          j        ¦  «        } |t          j        ¦  «        }‰j                             ||j        j	        ¦  «        |_        ‰j                             ||j
        j	        ¦  «        |_
        |                     ¦   «         }‰j        j                             ‰j        | |¦  «         t          |‰j                             ¦   «         ¬¦  «        S )Nc                 ó^  •— ‰j                              t          j        | ¦  «        }t	          j        d¦  «                             ¦   «         }t          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ÔCˆÝ”J˜q‘M”M×,Ò,Ñ.Ô.ˆ	ÝÔ! !¤)¨S°&Ñ9Ô9ˆØ”×"Ò" 3¨	×(<Ò(<Ñ(>Ô(>Ñ?Ô?ˆØŒ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Ô1€JØˆ:�a”i ¤Ñ+Ô+€Dð  �-¥Ô :Ñ;Ô;€KØ�-¥Ô 7Ñ8Ô8€Kð ”9×$Ò$ [°$´,Ô2CÑDÔD€D„LØ”	×!Ò! +¨t¬y¬~Ñ>Ô>€D„Ià
�.Š.Ñ
Ô
€Cà„I„M×Ò˜œ C¨Ñ-Ô-Ð-å�s Q¤W×%8Ò%8Ñ%:Ô%:Ð;Ñ;Ô;Ð;r   c                 ó<   — t          t          | ¦  «        d¦  «        S )Nr)   )rv   r|   )r±   r¥   s     r   Ú_typeof_jitclass_boxrÌ     s   € å•4˜‘9”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Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ðÐ ð
Ð ð
Ð ðð ð ð �7Ð-Ð8MØ!+ð-ñ -ô -Ð à�7Ð-Ð8MØ!*ð,ñ ,ô ,Ð ðð ð ð" Ð ð@ð @ð @ðL €€UÔÑÔðð ñ Ôðð@ €€uÔÑÔð<ð <ñ  Ôð<ðH €Ô�d”hÑÔð.ð .ñ  Ôð.ð .ð .r   