B
    ž†\†   ã            	   @   s0  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Zd dlZd dl	m
Z
 d dlZd dlZd dlm  mZ d dlmZ e j e j e¡¡Ze j ed¡Ze j ed¡ZeeƒZedd„ e eƒD ƒƒZ!W dQ R X da"dd	„ Z#G d
d„ dej$ƒZ%G dd„ de%ƒZ&G dd„ de&ƒZ'e(dkr,e )¡  dS )é    N)Ú	ccompiler)ÚCygdbÚcodefilezcfuncs.cc             c   s"   | ]\}}|  ¡ |d  fV  qdS )é   N)Ústrip)Ú.0ÚiÚline© r
   úBlib/python3.7/site-packages/Cython/Debugger/Tests/TestLibCython.pyú	<genexpr>   s    r   c           	   C   sB  t d k	rt S da ytjdddgtjd} W n tk
rB   d }Y n&X |  ¡ \}}d}t || dd¡¡}|r.t	t
t| ¡ ƒƒ}|d	d
gkr.da tjddŠ}| d¡ | ¡  tjddd|jgtjd} |  ¡ \}}y0t	t
t| dd¡ ¡ ƒƒ}|d
dgk rda W n tk
r"   da Y nX W d Q R X t s>t d¡ t S )NFÚgdbz-nxz	--version)ÚstdoutzGNU gdb [^\d]*(\d+)\.(\d+)ÚasciiÚignoreé   é   Tzw+)Úmodez8python import sys; print("%s %s" % sys.version_info[:2])z-batchz-xé   z6Skipping gdb tests, need gdb >= 7.2 with Python >= 2.6)Úhave_gdbÚ
subprocessÚPopenÚPIPEÚOSErrorÚcommunicateÚreÚmatchÚdecodeÚlistÚmapÚintÚgroupsÚtempfileZNamedTemporaryFileÚwriteÚflushÚnameÚsplitÚ
ValueErrorÚwarningsÚwarn)ÚpZgdb_versionr   Ú_ZregexZgdb_version_numberZpython_version_scriptZinternal_python_versionr
   r
   r   Útest_gdb   s<    


r,   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚDebuggerTestCasec             C   s–  t ƒ s
dS t ¡ | _tj | jd¡| _tj | jdd¡| _tj | jd¡| _	t 
¡ | _yt | j¡ t t| j¡ t t| j	d ¡ t t dd¡| j	d ¡ t ¡ }|jdgd	d
gd t| jdd}t ¡ }tjf | jdt t¡dœ|—Ž}ttjdƒ}tj}|t_| ¡  zH|j f | jddd	| jdœdœ|—Ž |j!f d| jddgidœ|—Ž W d| "¡  |t_| #¡  X W n   t | j¡ ‚ Y nX dS )z
        Run gdb and have cygdb import the debug information from the code
        defined in TestParseTreeTransforms's setUp method
        Nzcodefile.pyxZcython_debugZcython_debug_info_codefileZcfuncsz.cz.hzcfuncs.cTz-fPIC)ÚdebugZextra_postargsr   )Ztest_directoryÚmoduleF)ÚworkdirZcleanup_workdirZtagsÚw)Z	gdb_debugZ
output_dir)Z	targetdirÚincdirZannotateZextra_compile_optionsZextra_objectszcfuncs.o)r2   r0   Zextra_extension_args)$r,   r"   ZmkdtempÚtempdirÚosÚpathÚjoinZdestfileZ
debug_destZcfuncs_destfileÚgetcwdÚcwdÚchdirÚshutilÚcopyr   Úcfuncs_fileÚreplacer   Znew_compilerÚcompileÚdictÚ	build_extZOptimizationÚruntestsZCythonCompileTestCaseZ
parse_tagsÚopenÚdevnullÚsysÚstderrZdisable_optimizationZ
run_cythonZrun_distutilsZrestore_stateÚclose)ÚselfZcompilerZoptsZoptimization_disablerZcython_compile_testcaseZ
new_stderrrE   r
   r
   r   ÚsetUpH   sb    


zDebuggerTestCase.setUpc             C   s&   t ƒ s
d S t | j¡ t | j¡ d S )N)r,   r4   r9   r8   r:   Zrmtreer3   )rG   r
   r
   r   ÚtearDown    s    zDebuggerTestCase.tearDownN)Ú__name__Ú
__module__Ú__qualname__rH   rI   r
   r
   r
   r   r-   F   s   Xr-   c                   s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚGdbDebuggerTestCasec          	      sü   t ƒ s
d S tt| ƒ ¡  t d¡}t dtjd d… f ¡}t 	| j
|¡| _t| jdƒ}| |¡ W d Q R X ddd| jdd	tjd
dg	}g }tj d¡}|r¦| |¡ | tj tj tj tj¡¡¡¡ ttjtj |¡d}tj|tjtj|d| _d S )Na              python

            import os
            import sys
            import traceback

            def excepthook(type, value, tb):
                traceback.print_exception(type, value, tb)
                sys.stderr.flush()
                sys.stdout.flush()
                os._exit(1)

            sys.excepthook = excepthook

            # Have tracebacks end up on sys.stderr (gdb replaces sys.stderr
            # with an object that calls gdb.write())
            sys.stderr = sys.__stderr__

            end
            z¨            python

            from Cython.Debugger.Tests import test_libcython_in_gdb
            test_libcython_in_gdb.main(version=%r)

            end
            r   Úar   z-batchz-xz-nz--argsz-czimport codefileÚ
PYTHONPATH)rO   )r   rE   Úenv)r,   ÚsuperrM   rH   ÚtextwrapÚdedentrD   Úversion_infoÚcygdbZmake_command_filer3   Úgdb_command_filerB   r#   Ú
executabler4   ÚenvironÚgetÚappendr5   ÚdirnameÚabspathÚCythonÚ__file__r?   Úpathsepr6   r   r   r   r*   )rG   Zprefix_codeÚcodeÚfÚargsÚpathsr5   rP   )Ú	__class__r
   r   rH   ©   s2    
zGdbDebuggerTestCase.setUpc          	      s|   t ƒ s
d S z^tt| ƒ ¡  | jrfy| jj ¡  W n   Y nX y| jj ¡  W n   Y nX | j ¡  W d t	 
| j¡ X d S )N)r,   rQ   rM   rI   r*   r   rF   rE   Úwaitr4   ÚremoverV   )rG   )rd   r
   r   rI   å   s        zGdbDebuggerTestCase.tearDown)rJ   rK   rL   rH   rI   Ú__classcell__r
   r
   )rd   r   rM   §   s   <rM   c               @   s   e Zd Zdd„ ZdS )ÚTestAllc       	      C   s¨   t ƒ s
d S | j ¡ \}}| d¡}| d¡}| jj}|dkrVtj |¡ tj |¡ nN|dkr¤d}d||f }d||f }d||f }d|||||f }tj |¡ d S )	NzUTF-8r   r   z******************************z%s   v INSIDE GDB v   %sz%s   v STDERR v   %sz%s   ^ INSIDE GDB ^   %sz
%s
%s%s
%s%s)r,   r*   r   r   Ú
returncoderD   rE   r#   )	rG   ÚoutÚerrZexit_statusZborderÚstartrE   ÚendÚerrmsgr
   r
   r   Útest_all÷   s     

zTestAll.test_allN)rJ   rK   rL   ro   r
   r
   r
   r   rh   õ   s   rh   Ú__main__)*r4   r   rD   r:   r(   rR   Zunittestr"   r   Z	distutilsr   rA   ZCython.Distutils.extensionr]   ZCython.Distutils.old_build_extZ	DistutilsZold_build_extr@   ZCython.Debuggerr   rU   r5   r[   r\   r^   Úrootr6   r   r<   rB   ra   r?   Ú	enumerateZsource_to_linenor   r,   ZTestCaser-   rM   rh   rJ   Úmainr
   r
   r
   r   Ú<module>   s2   
 )aN
