o
    °ó®gq2  ã                   @   sŽ  d Z ddlZddlZddlZddlZddlZzddlZW n ey'   dZY nw ddlm	Z	m
Z
mZmZ dd„ Zdd„ Zdd	„ ZG d
d„ dejƒZdd„ ZG dd„ dejƒZG dd„ dejƒZeddr·edur·ejZe dej¡ZejZefe_eje_ejZ ej!ejejfe _ej"e _ej#Z$ej!eje %ej¡fe$_ej"e$_da&dd„ Z'ee'ƒZ(ee(ƒZ)G dd„ dejƒZ*ddd„Z+e,dkrÅe+ƒ  dS dS )a¬  This module includes tests of the code object representation.

>>> def f(x):
...     def g(y):
...         return x + y
...     return g
...

>>> dump(f.__code__)
name: f
argcount: 1
posonlyargcount: 0
kwonlyargcount: 0
names: ()
varnames: ('x', 'g')
cellvars: ('x',)
freevars: ()
nlocals: 2
flags: 3
consts: ('None', '<code object g>', "'f.<locals>.g'")

>>> dump(f(4).__code__)
name: g
argcount: 1
posonlyargcount: 0
kwonlyargcount: 0
names: ()
varnames: ('y',)
cellvars: ()
freevars: ('x',)
nlocals: 1
flags: 19
consts: ('None',)

>>> def h(x, y):
...     a = x + y
...     b = x - y
...     c = a * b
...     return c
...

>>> dump(h.__code__)
name: h
argcount: 2
posonlyargcount: 0
kwonlyargcount: 0
names: ()
varnames: ('x', 'y', 'a', 'b', 'c')
cellvars: ()
freevars: ()
nlocals: 5
flags: 67
consts: ('None',)

>>> def attrs(obj):
...     print(obj.attr1)
...     print(obj.attr2)
...     print(obj.attr3)

>>> dump(attrs.__code__)
name: attrs
argcount: 1
posonlyargcount: 0
kwonlyargcount: 0
names: ('print', 'attr1', 'attr2', 'attr3')
varnames: ('obj',)
cellvars: ()
freevars: ()
nlocals: 1
flags: 67
consts: ('None',)

>>> def optimize_away():
...     'doc string'
...     'not a docstring'
...     53
...     0x53

>>> dump(optimize_away.__code__)
name: optimize_away
argcount: 0
posonlyargcount: 0
kwonlyargcount: 0
names: ()
varnames: ()
cellvars: ()
freevars: ()
nlocals: 0
flags: 67
consts: ("'doc string'", 'None')

>>> def keywordonly_args(a,b,*,k1):
...     return a,b,k1
...

>>> dump(keywordonly_args.__code__)
name: keywordonly_args
argcount: 2
posonlyargcount: 0
kwonlyargcount: 1
names: ()
varnames: ('a', 'b', 'k1')
cellvars: ()
freevars: ()
nlocals: 3
flags: 67
consts: ('None',)

>>> def posonly_args(a,b,/,c):
...     return a,b,c
...

>>> dump(posonly_args.__code__)
name: posonly_args
argcount: 3
posonlyargcount: 2
kwonlyargcount: 0
names: ()
varnames: ('a', 'b', 'c')
cellvars: ()
freevars: ()
nlocals: 3
flags: 67
consts: ('None',)

é    N)Úrun_doctestÚrun_unittestÚcpython_onlyÚcheck_impl_detailc                 c   s6    | D ]}t |ƒ}| d¡rd|j V  q|V  qdS )z.Yield a doctest-safe sequence of object reprs.z<code objectz<code object %s>N)ÚreprÚ
startswithÚco_name)ÚtÚeltÚr© r   úD/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_code.pyÚconsts   s   €
ûr   c                 C   s<   dD ]}t d|t| d| ƒf ƒ qt dtt| jƒƒƒ dS )z1Print out a text representation of a code object.)
ÚnameZargcountZposonlyargcountZkwonlyargcountÚnamesÚvarnamesZcellvarsZfreevarsZnlocalsÚflagsz%s: %sZco_zconsts:N)ÚprintÚgetattrÚtupler   Ú	co_consts)ÚcoÚattrr   r   r   Údump–   s   r   c                 C   s   dt ƒ  |¡› S )NzForeign getitem: )ÚsuperÚ__getitem__)ÚselfÚir   r   r   Úexternal_getitem    s   r   c                   @   s<   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	d
„ ZdS )ÚCodeTestc                 C   sD   dd l }| ddd¡}|  |jd¡ |  |jd¡ |  |jd¡ d S )Nr   ÚfilenameÚfuncnameé   )Ú	_testcapiZcode_newemptyÚassertEqualÚco_filenamer   Úco_firstlineno)r   r#   r   r   r   r   Útest_newempty¥   s
   zCodeTest.test_newemptyc                    s¤   ddl m‰  dd„ ‰dd„ ‰‡ ‡‡fdd„}G d	d
„ d
tƒ}||dtƒ |j}|jd j}|  ||¡ |  |j	j
tj@ t|j	j
ƒ¡ |g d¢ƒ}|  |d d¡ d S )Nr   )ÚFunctionTypec                    s   ‡ fdd„j S )Nc                      s   ˆ S ©Nr   r   ©Ú	__class__r   r   Ú<lambda>³   ó    zICodeTest.test_closure_injection.<locals>.create_closure.<locals>.<lambda>)Ú__closure__r*   r   r*   r   Úcreate_closure²   s   z7CodeTest.test_closure_injection.<locals>.create_closurec                 S   s   | j | jd dS )z9A new code object with a __class__ cell added to freevarsr*   )Úco_freevarsN)Úreplacer0   )Úcr   r   r   Únew_codeµ   s   z1CodeTest.test_closure_injection.<locals>.new_codec              	      s6   ˆ|j ƒ}ˆ| ƒ}|j}t| |ˆ |tƒ |||ƒƒ d S r)   )Ú__code__Ú__defaults__ÚsetattrÚglobals)Úclsr   ÚfÚcodeZclosureÚdefaults©r(   r/   r3   r   r   Úadd_foreign_method¹   s   
z;CodeTest.test_closure_injection.<locals>.add_foreign_methodc                   @   s   e Zd ZdS )z-CodeTest.test_closure_injection.<locals>.ListN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚListÀ   s    rA   r   )é   é   é   zForeign getitem: 1)Útypesr(   Úlistr   r   r.   Úcell_contentsZassertIsÚassertFalser4   Úco_flagsÚinspectZ	CO_NOFREEÚhexr$   )r   r=   rA   ÚfunctionZ	class_refÚobjr   r<   r   Útest_closure_injection­   s   
ÿzCodeTest.test_closure_injectionc                 C   s`   dd„ }|j }t|ƒ}||j|j|j|j|j|j|j|j	|j
|j|j|j|j|j|j|jƒ d S )Nc                   S   ó   d S r)   r   r   r   r   r   ÚfuncÓ   r-   z'CodeTest.test_constructor.<locals>.func)r4   ÚtypeÚco_argcountÚco_posonlyargcountÚco_kwonlyargcountÚ
co_nlocalsÚco_stacksizerI   Úco_coder   Úco_namesÚco_varnamesr%   r   r&   Ú	co_lnotabr0   Úco_cellvars)r   rP   r   ÚCodeTyper   r   r   Útest_constructorÒ   s(   ñzCodeTest.test_constructorc                 C   sÆ   dd„ }|j }dd„ }|j }ddddd	d
|jtjB fdd|jfd|jfdd|jfddddd|jffD ].\}}| j||d |j	di ||i¤Ž}|  
t||ƒ|¡ W d   ƒ q21 s[w   Y  q2d S )Nc                  S   ó   d} | S )NrB   r   )Úxr   r   r   rP   ê   ó   z#CodeTest.test_replace.<locals>.funcc                  S   r^   )NrC   r   )Úyr   r   r   Úfunc2ð   r`   z$CodeTest.test_replace.<locals>.func2)rR   r   )rS   r   )rT   r   )rU   r   )rV   r   rI   )r&   éd   rW   r   )rX   )ZmynamerY   )r0   )Zfreevar)r[   )Zcellvar)r%   Znewfilename)r   ZnewnameÚco_linetable)r   Úvaluer   )r4   rI   rJ   ZCO_COROUTINErW   r   rY   rd   ZsubTestr1   r$   r   )r   rP   r:   rb   Úcode2r   re   r3   r   r   r   Útest_replaceé   s4   ðþîzCodeTest.test_replacec                 C   s2   dd„ }|j jdd }}|  t| ¡ ƒg ¡ d S )Nc                   S   rO   r)   r   r   r   r   r   rP     ó   z+CodeTest.test_empty_linetable.<locals>.funcó    )rd   )r4   r1   r$   rF   Úco_lines)r   rP   r3   r:   r   r   r   Útest_empty_linetable  s   zCodeTest.test_empty_linetableN)	r>   r?   r@   r   r'   rN   r]   rg   rk   r   r   r   r   r   £   s    

$"r   c                 C   s   | t  d|  d dd… ¡u S )NÚ_rB   éÿÿÿÿ)ÚsysÚintern)Úsr   r   r   Ú
isinterned  s   rq   c                   @   s`   e Zd Zdd„ Zdd„ Zdd„ Zedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZdS )ÚCodeConstsTestc                 C   s4   |D ]
}||kr|  S q|   ||¡ |  d¡ d S )NzShould never be reached)ZassertInÚfail)r   r   re   Úvr   r   r   Ú
find_const  s   ÿzCodeConstsTest.find_constc                 C   s    t |ƒs|  d|f ¡ d S d S )NzString %r is not interned©rq   rs   ©r   rp   r   r   r   ÚassertIsInterned  ó   ÿzCodeConstsTest.assertIsInternedc                 C   s    t |ƒr|  d|f ¡ d S d S )NzString %r is internedrv   rw   r   r   r   ÚassertIsNotInterned"  ry   z"CodeConstsTest.assertIsNotInternedc                 C   ó(   t dddƒ}|  |jd¡}|  |¡ d S )Nzres = "str_value"ú?ÚexecÚ	str_value©Úcompileru   r   rx   ©r   r   rt   r   r   r   Útest_interned_string&  ó   z#CodeConstsTest.test_interned_stringc                 C   s,   t dddƒ}|  |jd¡}|  |d ¡ d S )Nzres = ("str_value",)r|   r}   ©r~   r   r   r   r   r   r   Útest_interned_string_in_tuple,  s   z,CodeConstsTest.test_interned_string_in_tuplec                 C   s4   t dddƒ}|  |jtdƒ¡}|  t|ƒd ¡ d S )Nzres = a in {"str_value"}r|   r}   r„   r   )r€   ru   r   Ú	frozensetrx   r   r   r   r   r   Ú!test_interned_string_in_frozenset2  s   z0CodeConstsTest.test_interned_string_in_frozensetc                 C   s   ddd„}|   |ƒ ¡ d S )Nr~   c                 S   s   | S r)   r   )Úar   r   r   r9   :  rh   z6CodeConstsTest.test_interned_string_default.<locals>.fr„   )rx   ©r   r9   r   r   r   Útest_interned_string_default8  s   
z+CodeConstsTest.test_interned_string_defaultc                 C   r{   )Nzres = "str\0value!"r|   r}   z
str value!)r€   ru   r   rz   r   r   r   r   Útest_interned_string_with_null>  rƒ   z-CodeConstsTest.test_interned_string_with_nullN)r>   r?   r@   ru   rx   rz   r   r‚   r…   r‡   rŠ   r‹   r   r   r   r   rr     s    



rr   c                   @   s   e Zd Zdd„ ZdS )ÚCodeWeakRefTestc                    sn   i }t dtƒ |ƒ |d }~dˆ _‡ fdd„}t |j|¡}ˆ  t|ƒ ƒ¡ ~ˆ  t|ƒ ƒ¡ ˆ  ˆ j¡ d S )Nzdef f(): passr9   Fc                    s
   dˆ _ d S )NT)Úcalled)r:   ©r   r   r   ÚcallbackP  s   
z,CodeWeakRefTest.test_basic.<locals>.callback)	r}   r7   r   ÚweakrefÚrefr4   Z
assertTrueÚboolrH   )r   Ú	namespacer9   r   Zcoderefr   rŽ   r   Ú
test_basicG  s   zCodeWeakRefTest.test_basicN)r>   r?   r@   r”   r   r   r   r   rŒ   E  s    rŒ   T©Zcpythonc                 C   s   | a d S r)   )Ú
LAST_FREED)Zptrr   r   r   Úmyfreep  s   r—   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚCoExtrac                 C   s   t dƒS )Nz	lambda:42)ÚevalrŽ   r   r   r   Úget_funcx  s   zCoExtra.get_funcc              	   C   s<   |   ¡ }|  ttdtt d¡¡ |  ttdtt d¡¡ d S )Né*   rc   )rš   ÚassertRaisesÚSystemErrorÚSetExtraÚ
FREE_INDEXÚctypesÚc_voidpÚGetExtrar‰   r   r   r   Útest_get_non_code~  s   ÿÿzCoExtra.test_get_non_codec              	   C   sJ   |   ¡ }|  tt|jtd t d¡¡ |  t	|jtd t d¡ƒd¡ d S )Nrc   r   )
rš   rœ   r   rž   r4   rŸ   r    r¡   r$   r¢   r‰   r   r   r   Útest_bad_index†  s   ÿÿÿzCoExtra.test_bad_indexc                 C   s.   |   ¡ }t|jtt d¡ƒ ~|  td¡ d S )Nrc   )rš   rž   r4   rŸ   r    r¡   r$   r–   r‰   r   r   r   Útest_free_called  s   zCoExtra.test_free_calledc                 C   sn   |   ¡ }t ¡ }t|jtt d¡ƒ t|jtt d¡ƒ |  td¡ t ¡ }t|jt|ƒ |  |j	d¡ ~d S )NéÈ   i,  )
rš   r    r¡   rž   r4   rŸ   r$   r–   r¢   re   )r   r9   Úextrar   r   r   Útest_get_set–  s   zCoExtra.test_get_setc                 C   sZ   |   ¡ }G dd„ dtjƒ}t|jtt d¡ƒ ||| ƒ}~| ¡  | 	¡  |  
td¡ d S )Nc                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )z6CoExtra.test_free_different_thread.<locals>.ThreadTestc                    s   t ƒ  ¡  || _|| _d S r)   )r   Ú__init__r9   Útest)r   r9   rª   r*   r   r   r©   «  s   

z?CoExtra.test_free_different_thread.<locals>.ThreadTest.__init__c                 S   s   | ` | j td¡ d S )Néô  )r9   rª   r$   r–   rŽ   r   r   r   Úrun¯  s   z:CoExtra.test_free_different_thread.<locals>.ThreadTest.run)r>   r?   r@   r©   r¬   Ú__classcell__r   r   r*   r   Ú
ThreadTestª  s    r®   r«   )rš   Ú	threadingÚThreadrž   r4   rŸ   r    r¡   ÚstartÚjoinr$   r–   )r   r9   r®   Zttr   r   r   Útest_free_different_thread¦  s   	
z"CoExtra.test_free_different_threadN)	r>   r?   r@   rš   r£   r¤   r¥   r¨   r³   r   r   r   r   r˜   w  s    	r˜   c                 C   sH   ddl m} t|| ƒ tttg}tddrtd ur| t	¡ t
|Ž  d S )Nr   )Ú	test_codeTr•   )rª   r´   r   r   rr   rŒ   r   r    Úappendr˜   r   )Úverboser´   Ztestsr   r   r   Ú	test_main»  s   


r·   Ú__main__r)   )-Ú__doc__rJ   rn   r¯   Zunittestr   r    ÚImportErrorZtest.supportr   r   r   r   r   r   r   ZTestCaser   rq   rr   rŒ   Z	pythonapiÚpyZ	CFUNCTYPEr¡   ZfreefuncZ_PyEval_RequestCodeExtraIndexZRequestCodeExtraIndexÚargtypesZ	c_ssize_tZrestypeZ_PyCode_SetExtrarž   Z	py_objectZc_intZ_PyCode_GetExtrar¢   ZPOINTERr–   r—   Z	FREE_FUNCrŸ   r˜   r·   r>   r   r   r   r   Ú<module>   sT    ÿ	
o0
ÿ
D
ÿ