a
    ze1                     @   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yN   dZY n0 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rvedurve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 )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   s4   | 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   $/usr/lib/python3.9/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namesZ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                   @   s4   e Zd Zedd Ze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)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   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   rO   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6 |j	f i ||i}| 
t||| W d    qd1 s0    Y  qdd S )Nc                  S   s   d} | S )NrB   r   )xr   r   r   rO      s    z#CodeTest.test_replace.<locals>.funcc                  S   s   d} | S )NrC   r   )yr   r   r   func2   s    z$CodeTest.test_replace.<locals>.func2)rQ   r   )rR   r   )rS   r   )rT   r   )rU   r   rI   )r&   d   rV   r   )rW   )ZmynamerX   )r0   )Zfreevar)rZ   )Zcellvar)r%   Znewfilename)r	   ZnewnamerY   )r   value)r4   rI   rJ   ZCO_COROUTINErV   r   rX   rY   ZsubTestr1   r$   r   )r   rO   r:   r_   code2r   ra   r3   r   r   r   test_replace   s0    zCodeTest.test_replaceN)r>   r?   r@   r   r'   rN   r\   rc   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    ri   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   ra   vr   r   r   
find_const  s
    
zCodeConstsTest.find_constc                 C   s   t |s| d|f  d S )NzString %r is not internedri   rk   r   rh   r   r   r   assertIsInterned  s    zCodeConstsTest.assertIsInternedc                 C   s   t |r| d|f  d S )NzString %r is internedrn   ro   r   r   r   assertIsNotInterned  s    z"CodeConstsTest.assertIsNotInternedc                 C   s(   t ddd}| |jd}| | d S )Nzres = "str_value"?exec	str_valuecompilerm   r   rp   r   r   rl   r   r   r   test_interned_string   s    z#CodeConstsTest.test_interned_stringc                 C   s,   t ddd}| |jd}| |d  d S )Nzres = ("str_value",)rr   rs   rt   r   ru   rw   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"}rr   rs   ry   r   )rv   rm   r   	frozensetrp   r   rw   r   r   r   !test_interned_string_in_frozenset,  s    z0CodeConstsTest.test_interned_string_in_frozensetc                 C   s   ddd}|  |  d S )Nrt   c                 S   s   | S r)   r   )ar   r   r   r9   4  s    z6CodeConstsTest.test_interned_string_default.<locals>.f)rt   )rp   r   r9   r   r   r   test_interned_string_default2  s    
z+CodeConstsTest.test_interned_string_defaultc                 C   s(   t ddd}| |jd}| | d S )Nzres = "str\0value!"rr   rs   z
str value!)rv   rm   r   rq   rw   r   r   r   test_interned_string_with_null8  s    z-CodeConstsTest.test_interned_string_with_nullN)r>   r?   r@   rm   rp   rq   r   rx   rz   r|   r   r   r   r   r   r   rj     s   



rj   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(): passr9   Fc                    s
   d _ d S )NT)called)r:   r   r   r   callbackJ  s    z,CodeWeakRefTest.test_basic.<locals>.callback)
rs   r7   r   weakrefrefr4   Z
assertTrueboolr   rH   )r   	namespacer9   r   Zcoderefr   r   r   
test_basicA  s    zCodeWeakRefTest.test_basicN)r>   r?   r@   r   r   r   r   r   r   ?  s   r   TZcpythonc                 C   s   | a d S r)   )
LAST_FREED)Zptrr   r   r   myfreek  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_funcs  s    zCoExtra.get_funcc              	   C   s<   |   }| ttdttd | ttdttd d S )N*   r`   )r   assertRaisesSystemErrorSetExtra
FREE_INDEXctypesc_voidpGetExtrar~   r   r   r   test_get_non_codey  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 )Nr`   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 )Nr`   )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   ra   )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   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   r  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   rj   r   r   r   appendr   r   )verboser   Ztestsr   r   r   	test_main  s    


r   __main__)N).__doc__rJ   rf   r   Zunittestr   r   ImportErrorZtest.supportr   r   r   r   r   r   r   r   ZTestCaser   ri   rj   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>   sN   
	
i0
D

