o
    GXh2                     @   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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redure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re,  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_detail
gc_collectc                 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   8/opt/python-3.10.19/usr/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_freevars)replacer1   )cr   r   r   new_code   s   z1CodeTest.test_closure_injection.<locals>.new_codec              	      s@   |j }|jr
J | }|j}t| | |t ||| d S r*   )__code__r/   __defaults__setattrglobals)clsr   fcodeZclosuredefaultsr)   r0   r4   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    rB   r   )         zForeign getitem: 1)typesr)   listr   r   r/   cell_contentsZassertIsassertFalser5   co_flagsinspectZ	CO_NOFREEhexr%   )r   r>   rB   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)r5   typeco_argcountco_posonlyargcountco_kwonlyargcount
co_nlocalsco_stacksizerJ   co_coder   co_namesco_varnamesr&   r	   r'   	co_lnotabr1   co_cellvars)r   rQ   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    n1 s[w   Y  q2d S )Nc                  S      d} | S )NrC   r   )xr   r   r   rQ         z#CodeTest.test_replace.<locals>.funcc                  S   r_   )NrD   r   )yr   r   r   func2   ra   z$CodeTest.test_replace.<locals>.func2)rS   r   )rT   r   )rU   r   )rV   r   )rW   r   rJ   )r'   d   rX   r   )rY   )ZmynamerZ   )r1   )Zfreevar)r\   )Zcellvar)r&   Znewfilename)r	   Znewnameco_linetable)r   valuer   )r5   rJ   rK   ZCO_COROUTINErX   r   rZ   re   ZsubTestr2   r%   r   )r   rQ   r;   rc   code2r   rf   r4   r   r   r   test_replace   s6   zCodeTest.test_replacec                 C   s2   dd }|j jdd }}| t| g  d S )Nc                   S   rP   r*   r   r   r   r   r   rQ        z+CodeTest.test_empty_linetable.<locals>.func    )re   )r5   r2   r%   rG   co_lines)r   rQ   r4   r;   r   r   r   test_empty_linetable  s   zCodeTest.test_empty_linetableN)	r?   r@   rA   r   r(   rO   r^   rh   rl   r   r   r   r   r       s    

$"r    c                 C   s   | t d|  d dd u S )N_rC   )sysintern)sr   r   r   
isinterned  s   rr   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   rf   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rr   rt   r   rq   r   r   r   assertIsInterned     zCodeConstsTest.assertIsInternedc                 C   s    t |r| d|f  d S d S )NzString %r is internedrw   rx   r   r   r   assertIsNotInterned"  rz   z"CodeConstsTest.assertIsNotInternedc                 C   (   t ddd}| |jd}| | d S )Nzres = "str_value"?exec	str_valuecompilerv   r   ry   r   r   ru   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   rv   r   	frozensetry   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   r:   :  ri   z6CodeConstsTest.test_interned_string_default.<locals>.fr   )ry   r   r:   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   rv   r   r{   r   r   r   r   test_interned_string_with_null>  r   z-CodeConstsTest.test_interned_string_with_nullN)r?   r@   rA   rv   ry   r{   r   r   r   r   r   r   r   r   r   r   rs     s    



rs   c                   @   s   e Zd Zdd ZdS )CodeWeakRefTestc                    st   i }t dt | |d }~d _ fdd}t|j|} t|  ~t   	t|    j d S )Nzdef f(): passr:   Fc                    s
   d _ d S )NT)called)r;   r   r   r   callbackP  s   
z,CodeWeakRefTest.test_basic.<locals>.callback)
r~   r8   r   weakrefrefr5   Z
assertTrueboolr   rI   )r   	namespacer:   r   Zcoderefr   r   r   
test_basicG  s   zCodeWeakRefTest.test_basicN)r?   r@   rA   r   r   r   r   r   r   E  s    r   TZcpythonc                 C   s   | a d S r*   )
LAST_FREED)Zptrr   r   r   myfreeq  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_funcy  s   zCoExtra.get_funcc              	   C   s<   |   }| ttdttd | ttdttd d S )N*   rd   )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 )Nrd   r   )
r   r   r   r   r5   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 )Nrd   )r   r   r5   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   r5   r   r%   r   r   rf   )r   r:   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__r:   test)r   r:   r   r+   r   r   r     s   

z?CoExtra.test_free_different_thread.<locals>.ThreadTest.__init__c                 S   s   | ` | jtd d S )N  )r:   r   r%   r   r   r   r   r   run  s   z:CoExtra.test_free_different_thread.<locals>.ThreadTest.run)r?   r@   rA   r   r   __classcell__r   r   r+   r   
ThreadTest  s    r   r   )r   	threadingThreadr   r5   r   r   r   startjoinr%   r   )r   r:   r   ttr   r   r   test_free_different_thread  s   	
z"CoExtra.test_free_different_threadN)	r?   r@   rA   r   r   r   r   r   r   r   r   r   r   r   x  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    rs   r   r   r   appendr   r   )verboser   Ztestsr   r   r   	test_main  s   


r   __main__r*   ).__doc__rK   ro   r   Zunittestr   r   ImportErrorZtest.supportr   r   r   r   r   r   r   r   ZTestCaser    rr   rs   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
