
    z%ia,                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZ d dlmZ ej                  s e j                   d      d Z e       s e j                   d       G d d	e j$                        Zd
 Zd Zd Z e j.                   e       d       e j.                   e       d       ej0                  ddd       G d de j$                                             Zedk(  r e j6                          yy)    N)support)make_scriptassert_python_failureassert_python_ok)temp_dirztest module requires subprocessc                  N    t        j                  d      } | syt        |       dk(  S )NPY_HAVE_PERF_TRAMPOLINEF   )	sysconfigget_config_varint)perf_trampolines    K/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_perf_profiler.pysupports_trampoline_profilingr      s)    ../HIO1$$    z'perf trampoline profiling not supportedc                   N     e Zd Z fdZd	 fdZd Zd Zd Zd Zd Z	d Z
 xZS )
TestPerfTrampolinec                     t         |           t        t        j                  d      j                  d            | _        y Nz/tmp/z
perf-*.mapsupersetUpsetpathlibPathglob
perf_filesself	__class__s    r   r   zTestPerfTrampoline.setUp!   ,    gll7388FGr   c                     t         |           t        t        j                  d      j                  d            | j                  z
  }|D ]  }|j                           y r   r   tearDownr   r   r   r   r   unlinkr   files_to_deletefiler    s      r   r$   zTestPerfTrampoline.tearDown%   R    W%**<89DOOK 	 $ 	DKKM	r   c                    d}t               5 }t        |d|      }t        j                  t        j
                  d|gdt        j                  t        j                        5 }|j                         \  }}d d d        d d d        | j                  d       | j                  d       t        j                  dj                   d      }| j                  |j                                |j                         }|j                         }	d	 d
| d| g}
|
D ]  t!        fd|	D        d       }| j#                  |d d       |j%                  d      d   }| j'                  |j)                  d      d       | j                  t+        |      j-                  t.        j0                        d        y # 1 sw Y   FxY w# 1 sw Y   KxY w)Nzif 1:
                def foo():
                    pass

                def bar():
                    foo()

                def baz():
                    bar()

                baz()
                perftest-XperfTtextstderrstdout 
/tmp/perf-.mappy::foo:py::bar:py::baz:c              3   ,   K   | ]  }|v s|  y w)N ).0lineexpected_symbols     r   	<genexpr>z;TestPerfTrampoline.test_trampoline_works.<locals>.<genexpr>M   s     Ut_PT=TdUs   	zCould not find z in perf file r   0xz&Address should not be prefixed with 0xz*Address should contain only hex characters)r   r   
subprocessPopensys
executablePIPEcommunicateassertEqualr   r   pid
assertTrueexists	read_text
splitlinesnextassertIsNotNonesplitassertFalse
startswithr   issubsetstring	hexdigits)r   code
script_dirscriptprocessr0   r/   	perf_fileperf_file_contents
perf_linesexpected_symbols	perf_line	perf_addrr;   s                @r   test_trampoline_worksz(TestPerfTrampoline.test_trampoline_works-   s    Z 	7: Z>F!!62!!	 7
 !(!4!4!67	7 	$$LL:gkk]$!?@		((*+&002'224
&vh/8F81DQWPXFYZ/ 	uOUzUW[\I  oo=Nm,\]!,Q/IY11$79abOOC	N33F4D4DEGst	u!7 7	7 	7s$   AG"F:6G:G	?GGc                    d}t               5 }t        |d|      }t        j                  t        j
                  d|gdt        j                  t        j                        5 }|j                         \  }}d d d        d d d        | j                  j                  d       | j                  d       t        j                               }t        j                  d|j                   d	      }t        j                  d| d	      }	| j                  |j!                                | j                  |	j!                                |j#                         }
| j%                  d
 |
       | j%                  d| |
       | j%                  d| |
       |	j#                         }| j%                  d| |       | j%                  d| |       | j%                  d| |       y # 1 sw Y   rxY w# 1 sw Y   wxY w)Na  if 1:
                import os, sys

                def foo_fork():
                    pass

                def bar_fork():
                    foo_fork()

                def baz_fork():
                    bar_fork()

                def foo():
                    pid = os.fork()
                    if pid == 0:
                        print(os.getpid())
                        baz_fork()
                    else:
                        _, status = os.waitpid(-1, 0)
                        sys.exit(status)

                def bar():
                    foo()

                def baz():
                    bar()

                baz()
                r+   r,   Tr-   r   r1   r2   r3   r4   r5   r6   zpy::foo_fork:zpy::bar_fork:zpy::baz_fork:)r   r   r?   r@   rA   rB   rC   rD   rE   
returncoder   stripr   r   rF   rG   rH   rI   assertIn)r   rS   rT   rU   rV   r0   r/   	child_pidrW   perf_child_filerX   child_perf_file_contentss               r    test_trampoline_works_with_forksz3TestPerfTrampoline.test_trampoline_works_with_forksS   s   : Z 	7: Z>F!!62!!	 7
 !(!4!4!67	7 	++Q/$'	LL:gkk]$!?@	!,,I;d'CD	((*+..01&002)+=>)+=>)+=>#2#<#<#> fX.0HIfX.0HIfX.0HI17 7	7 	7s$   AG2!G%5G2%G/	*G22G<c                    d}t               5 }t        |d|      }t        j                  t        j
                  |gdt        j                  t        j                        5 }|j                         \  }}d d d        d d d        | j                  d       | j                  d       t        j                  dj                   d      }| j                  |j                                |j                         }| j                  d |       | j!                  d	| |       | j!                  d
| |       | j!                  d| |       y # 1 sw Y   xY w# 1 sw Y   xY w)Na  if 1:
                import sys
                def foo():
                    pass

                def spam():
                    pass

                def bar():
                    sys.deactivate_stack_trampoline()
                    foo()
                    sys.activate_stack_trampoline("perf")
                    spam()

                def baz():
                    bar()

                sys.activate_stack_trampoline("perf")
                baz()
                r+   Tr-   r1   r2   r3   r4   z	py::spam:r5   r6   )r   r   r?   r@   rA   rB   rC   rD   rE   r   r   rF   rG   rH   rI   assertNotInra   )	r   rS   rT   rU   rV   r0   r/   rW   rX   s	            r   test_sys_apizTestPerfTrampoline.test_sys_api   sG   ( Z 	7: Z>F!!(!!	 7
 !(!4!4!67	7 	$$LL:gkk]$!?@		((*+&0028F8,.@A	&*,>?)+=>)+=>#7 7	7 	7s$   AE E4EE	EE$c                      d}t        d|       y )Nzif 1:
                import sys
                sys.activate_stack_trampoline("perf")
                sys.activate_stack_trampoline("perf")
                -cr   r   rS   s     r   %test_sys_api_with_existing_trampolinez8TestPerfTrampoline.test_sys_api_with_existing_trampoline   s    
 	t$r   c                 h    d}t        d|      \  }}}| j                  d|j                                y )Nzjif 1:
                import sys
                sys.activate_stack_trampoline("invalid")
                rj   zinvalid backend: invalid)r   ra   decode)r   rS   rcouterrs        r   $test_sys_api_with_invalid_trampolinez7TestPerfTrampoline.test_sys_api_with_invalid_trampoline   s2     -T48C0#**,?r   c                      d}t        d|       y )Na  if 1:
                import sys
                sys.activate_stack_trampoline("perf")
                assert sys.is_stack_trampoline_active() is True
                sys.deactivate_stack_trampoline()
                assert sys.is_stack_trampoline_active() is False
                rj   rk   rl   s     r   test_sys_api_get_statusz*TestPerfTrampoline.test_sys_api_get_status   s     	t$r   returnN)__name__
__module____qualname__r   r$   r]   re   rh   rm   rs   ru   __classcell__r    s   @r   r   r       s2    H$uL8Jt(?T%@%r   r   c                  :    t        j                  d      } | syd| v S )NPY_CORE_CFLAGSFzno-omit-frame-pointer)r   r   )cflagss    r   is_unwinding_reliabler      s$    %%&67F"f,,r   c                     	 ddg} t        j                  | d      }d|vryt	               5 }	 |dz   }ddd	d
d|dt
        j                  ddf
} t        j                  | |dt         j                        }d|vr
	 d d d        y	 d d d        y# t         j                  t        f$ r Y yw xY w# t         j                  t        f$ r Y d d d        yw xY w# 1 sw Y   yxY w)Nperfz--helpT)r.   Fz	perf.data/perf_output.perfrecord-g--call-graph=fp-o--rj   zprint("hello"))cwdr.   r/   hello)r?   check_outputSubprocessErrorOSErrorr   rA   rB   STDOUT)cmdr0   rT   output_files       r   perf_command_worksr      s   x ((48 &  
 z	$'::K! C  ,,$z7H7HF & - * !+0 C &&0 6 **G4 	' $	%0 s@   B CAB+4CB('B(+CCCCCc                 P   |r0t         j                  j                         }|j                  |       nd }| dz   }ddddd|df}t	        j
                  ||z   t        j                  t        j                  |      }|j                  r-t        |j                         t        d	|j                         d
}t	        j
                  ddd|ft        j                  t        j                  |d      }|j                  j                  dd      |j                  j                  dd      fS )Nr   r   r   r   r   r   r   )r0   r/   envzPerf failed with return code )r   rU   rU   z-iT)r0   r/   r   checkzutf-8replace)osenvironcopyupdater?   runrC   r_   printr/   
ValueErrorr0   ro   )r   argsenv_varsr   r   base_cmdprocs          r   run_perfr     s   jjoo

8++K$(94dSH>>4	D dkk88IJKK!H>>	4-D ;;gy14;;3E3E4  r   zperf command doesn't workzUnwinding is unreliableT)addressmemoryubc                   6     e Zd Z fdZd fdZd Zd Z xZS )TestPerfProfilerc                     t         |           t        t        j                  d      j                  d            | _        y r   r   r   s    r   r   zTestPerfProfiler.setUp$  r!   r   c                     t         |           t        t        j                  d      j                  d            | j                  z
  }|D ]  }|j                           y r   r#   r&   s      r   r$   zTestPerfProfiler.tearDown(  r)   r   c                 @   t               5 }d}t        |d|      }t        |t        j                  d|      \  }}| j                  |d       | j                  d| |       | j                  d| |       | j                  d| |       d d d        y # 1 sw Y   y xY w)N!  if 1:
                def foo(n):
                    x = 0
                    for i in range(n):
                        x += i

                def bar(n):
                    foo(n)

                def baz(n):
                    bar(n)

                baz(10000000)
                r+   r,   r1   r4   r5   r6   )r   r   r   rA   rB   rE   ra   r   rT   rS   rU   r0   r/   s         r   7test_python_calls_appear_in_the_stack_if_perf_activatedzHTestPerfProfiler.test_python_calls_appear_in_the_stack_if_perf_activated0  s    Z 	7:D !Z>F%j#..(FSNFFVR(MMHVH-v6MMHVH-v6MMHVH-v6+	7 	7 	7s   B BBc                 >   t               5 }d}t        |d|      }t        |t        j                  |      \  }}| j                  |d       | j                  d| |       | j                  d| |       | j                  d| |       d d d        y # 1 sw Y   y xY w)Nr   r+   r1   r4   r5   r6   )r   r   r   rA   rB   rE   rg   r   s         r   >test_python_calls_do_not_appear_in_the_stack_if_perf_activatedzOTestPerfProfiler.test_python_calls_do_not_appear_in_the_stack_if_perf_activatedH  s    Z 	::D !Z>F%j#..&INFFVR(xx0&9xx0&9xx0&9+	: 	: 	:s   A?BBrv   )rx   ry   rz   r   r$   r   r   r{   r|   s   @r   r   r      s    H70:r   r   __main__)unittestrQ   r?   rA   r   r   r   testr   test.support.script_helperr   r   r   test.support.os_helperr   has_subprocess_supportSkipTestr   TestCaser   r   r   r   
skipUnlessskip_if_sanitizerr   rx   mainr8   r   r   <module>r      s      
  	   
 , %%
(

=
>>% %&
(

E
FFo%** o%d-%P> ')+FG*,.GH4>;:x(( ;: ? I H;:| zHMMO r   