B
    ž†\•¯  ã               @   sÐ  d Z ddlmZ yeZW n ek
r,   Y nX 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yeZeZW n ek
rŽ   eZeZY nX yddlmZ dZW nš ek
r>   dZyddlmZ W nn ek
r8   yddlmZ W nF ek
r2   yddlZW n" ek
r,   ddlmZ Y nX Y nX Y nX Y nX yddlZddlZW n& ek
rz   dZej d	¡ Y nX eed
ƒr–ddlm Z  nddl!m"Z  ddl#m$Z$ dZ%dZ&e'e%e&dZ(e )¡ pÎdZ*dd„ Z+dpdd„Z,dd„ Z-dqdd„Z.dd„ Z/dd„ Z0G dd„ de1ƒZ2G d d!„ d!e1ƒZ3G d"d#„ d#e3ƒZ4G d$d%„ d%e1ƒZ5G d&d'„ d'e1ƒZ6G d(d)„ d)ej7ƒZ8G d*d+„ d+e8ƒZ9G d,d-„ d-e9ƒZ:G d.d/„ d/ej;ƒZ<G d0d1„ d1e<ƒZ=G d2d3„ d3e<ƒZ>G d4d5„ d5e<ƒZ?G d6d7„ d7e1ƒZ@e@ƒ ZAG d8d9„ d9ejBe5ƒZCG d:d;„ d;eCƒZDG d<d=„ d=eCƒZEG d>d?„ d?eCƒZFG d@dA„ dAe5e$jGƒZHG dBdC„ dCeCe$jIƒZJG dDdE„ dEeJe$jKƒZLG dFdG„ dGeLƒZMG dHdI„ dIeJƒZNG dJdK„ dKeJƒZOG dLdM„ dMeJƒZPG dNdO„ dOeCƒZQG dPdQ„ dQeQƒZRG dRdS„ dSeCƒZSG dTdU„ dUeCƒZTG dVdW„ dWeCƒZUG dXdY„ dYeCƒZVdZd[„ ZWG d\d]„ d]eCƒZXG d^d_„ d_eXƒZYG d`da„ dae1ƒZZG dbdc„ dceCe$j[eZƒZ\G ddde„ deeCƒZ]G dfdg„ dgej^e5ƒZ_G dhdi„ die_ƒZ`G djdk„ dkej^e5ƒZaG dldm„ dmej^e5eZƒZbeHƒ ZceD d¡ Zeeeec_edndo„ Zfefƒ  dS )rz)
GDB extension that adds Cython support.
é    )Úprint_functionN)ÚetreeTF)ÚcElementTree)ÚElementTreez,Install pygments for colorized source code.
Ústring_to_argv)r   )Úsplit)Ú	libpythonÚCObjectÚPythonObject)r	   r
   zUTF-8c                s   t  ˆ ¡‡ fdd„ƒ}|S )z*sigh*, readlinec                 s.   y
ˆ | |ŽS  t k
r(   t ¡  ‚ Y nX d S )N)Ú	ExceptionÚ	tracebackÚ	print_exc)ÚargsÚkwargs)Úfunction© ú8lib/python3.7/site-packages/Cython/Debugger/libcython.pyÚwrapperJ   s
    
z%dont_suppress_errors.<locals>.wrapper)Ú	functoolsÚwraps)r   r   r   )r   r   Údont_suppress_errorsH   s    r   c                s   ‡ fdd„}|S )Nc                s   t  ˆ ¡d‡‡ fdd„	ƒ}|S )Nc                sX   y|pt  ¡ }W n tk
r.   t  d¡‚Y nX ˆ rF| ¡ d krFtƒ ‚ˆ| |f|ž|ŽS )NzNo frame is currently selected.)ÚgdbÚselected_frameÚRuntimeErrorÚGdbErrorÚnameÚNoFunctionNameInFrameError)ÚselfÚframer   r   )Úerrr   r   r   r   W   s    z>default_selected_gdb_frame.<locals>.decorator.<locals>.wrapper)N)r   r   )r   r   )r   )r   r   Ú	decoratorV   s    
z-default_selected_gdb_frame.<locals>.decoratorr   )r   r    r   )r   r   Údefault_selected_gdb_frameU   s    r!   c                s   t  ˆ ¡t‡ fdd„ƒƒ}|S )Nc                s6   |  d¡pt ¡ }|  |¡s&t d¡‚ˆ | f|ž|ŽS )Nr   zHSelected frame does not correspond with a Cython function we know about.)Úgetr   r   Úis_cython_functionr   )r   r   r   r   )r   r   r   r   g   s    

z%require_cython_frame.<locals>.wrapper)r   r   Úrequire_running_program)r   r   r   )r   r   Úrequire_cython_framef   s    r%   c                s   ‡ ‡fdd„}|S )Nc                s   t  ˆ ¡‡‡ ‡fdd„ƒ}|S )Nc                s`   |   ¡ }|  ¡ }|s|r.ˆs.ˆ| f|ž|Ž n.|r>t ˆ¡ n|  ¡ rRt ˆ ¡ n
t d¡‚d S )NzFNot a function cygdb knows about. Use the normal GDB commands instead.)r#   Úis_python_functionr   ÚexecuteÚis_relevant_functionr   )r   r   r   Zis_cyZis_py)Ú	c_commandr   Úpython_commandr   r   r   t   s    z5dispatch_on_frame.<locals>.decorator.<locals>.wrapper)r   r   )r   r   )r)   r*   )r   r   r    s   s    z$dispatch_on_frame.<locals>.decoratorr   )r)   r*   r    r   )r)   r*   r   Údispatch_on_framer   s    r+   c                s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                 s6   yt  ¡  W n tk
r*   t  d¡‚Y nX ˆ | |ŽS )NzNo frame is currently selected.)r   r   r   r   )r   r   )r   r   r   r   ˆ   s
    z(require_running_program.<locals>.wrapper)r   r   )r   r   r   )r   r   r$   ‡   s    r$   c                s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                s&   t |tjƒr| ¡ }ˆ | |f|ž|ŽS )N)Ú
isinstancer   ZValueÚstring)r   r-   r   r   )r   r   r   r   ”   s    z.gdb_function_value_to_unicode.<locals>.wrapper)r   r   )r   r   r   )r   r   Úgdb_function_value_to_unicode“   s    r.   c               @   s   e Zd Zdd„ ZdS )ÚCythonModulec             C   s.   || _ || _|| _i | _i | _i | _i | _d S )N)r   ÚfilenameÚ
c_filenameÚglobalsÚlineno_cy2cÚlineno_c2cyÚ	functions)r   Zmodule_namer0   r1   r   r   r   Ú__init__¡   s    zCythonModule.__init__N)Ú__name__Ú
__module__Ú__qualname__r6   r   r   r   r   r/       s   r/   c               @   s   e Zd Zdd„ ZdS )ÚCythonVariablec             C   s&   || _ || _|| _|| _t|ƒ| _d S )N)r   ÚcnameÚqualified_nameÚtypeÚintÚlineno)r   r   r;   r<   r=   r?   r   r   r   r6   ¯   s
    zCythonVariable.__init__N)r7   r8   r9   r6   r   r   r   r   r:   ­   s   r:   c                   s"   e Zd Zedf‡ fdd„	Z‡  ZS )ÚCythonFunctionÚFalsec	       	         sF   t t| ƒ |||||¡ || _|| _|dk| _i | _g | _tƒ | _	d S )NÚTrue)
Úsuperr@   r6   ÚmoduleÚpf_cnameÚis_initmodule_functionÚlocalsÚ	argumentsÚsetÚstep_into_functions)	r   rD   r   r;   rE   r<   r?   r=   rF   )Ú	__class__r   r   r6   ¸   s    	
zCythonFunction.__init__)r7   r8   r9   r	   r6   Ú__classcell__r   r   )rK   r   r@   ·   s   r@   c               @   sÈ   e Zd Zedddd„ ƒZedddd„ ƒZeƒ dd„ ƒZeƒ d	d
„ ƒZeƒ dd„ ƒZeƒ dd„ ƒZ	eƒ dd„ ƒZ
eƒ dd„ ƒZeƒ dd„ ƒZeddd!dd„ƒZdd„ Zdd„ Zd"dd„Zdd „ ZdS )#Ú
CythonBaseF)r   c             C   s   |  ¡ | jjkS )N)r   ÚcyÚfunctions_by_cname)r   r   r   r   r   r#   Ò   s    zCythonBase.is_cython_functionc             C   s,   |  ¡ dkr(t |¡ ¡ }|o&| ¡  S dS )z˜
        Tells if a frame is associated with a Python function.
        If we can't read the Python frame information, don't regard it as such.
        ÚPyEval_EvalFrameExF)r   r   ÚFrameÚget_pyopÚis_optimized_out)r   r   Úpyframer   r   r   r&   Ö   s    zCythonBase.is_python_functionc             C   s   |  ¡ S )N)r   )r   r   r   r   r   Úget_c_function_nameá   s    zCythonBase.get_c_function_namec             C   s
   |  ¡ jS )N)Úfind_salÚline)r   r   r   r   r   Úget_c_linenoå   s    zCythonBase.get_c_linenoc             C   s$   | j j | ¡ ¡}|d kr tƒ ‚|S )N)rN   rO   r"   r   ÚNoCythonFunctionInFrameError)r   r   Úresultr   r   r   Úget_cython_functioné   s    zCythonBase.get_cython_functionc             C   s    |   |¡}|jj |  |¡d¡S )z„
        Get the current Cython line number. Returns 0 if there is no
        correspondence between the C and Cython code.
        r   )r[   rD   r4   r"   rX   )r   r   Úcyfuncr   r   r   Úget_cython_linenoñ   s    
zCythonBase.get_cython_linenoc             C   sØ   d  } }}|   |¡rB|  |¡jj}|  |¡}trÊtjjdd}nˆ|  |¡rŒt	 
|¡ ¡ }|sht d¡‚| ¡ }| ¡ }trÊtjjdd}n>| ¡ }|rž|js¨d }d}n"|j ¡ }|j}trÊtjjdd}t||ƒ|fS )NF)Zstripallz*Unable to read information on python framer   )r#   r[   rD   r0   r]   ÚpygmentsZlexersZCythonLexerr&   r   rQ   rR   r   r   Zcurrent_line_numZPythonLexerrV   ZsymtabÚfullnamerW   ZCLexerÚSourceFileDescriptor)r   r   r0   r?   ÚlexerZpyframeobjectZsymbol_and_line_objr   r   r   Úget_source_descú   s0    




zCythonBase.get_source_descc             C   s   |   ¡ \}}| |¡S )N)rb   Ú
get_source)r   r   Úsource_descr?   r   r   r   Úget_source_line  s    zCythonBase.get_source_linec             C   sN   |  ¡ }| ¡ }|  |¡s$|  |¡r(dS |rJ|  |¡rJ|  |¡}||jkS dS )zl
        returns whether we care about a frame on the user-level when debugging
        Cython code
        TF)r   Úolderr#   r&   r[   rJ   )r   r   r   Zolder_frameÚcython_funcr   r   r   r(      s    

zCythonBase.is_relevant_functionc                sâ  t  ¡ }ˆ  ¡  yˆ ˆ ¡\}}W n  tk
rB   td| ƒ dS X |sˆ ˆ ¡rt ˆ ¡ 	¡ }|dksp| 
¡ r€ˆjˆ |ddS |j}d}	g }
nRˆ ˆ ¡rÄˆ ˆ ¡}‡ ‡fdd„}|j}|j}	g }
nˆ ˆ ¡\}}ˆ  ¡ }|}	g }
yt  |	¡}W n tk
r
   d}Y n>X |j}t|tƒsHt|ttfƒs6t|ƒ}t| ¡ d dƒ}d	 d
d„ |
D ƒ¡}tj d||||f ¡ |jdk	r–tj d|j|f ¡ tj d¡ ytj d| |¡ ¡ W n t jk
rÔ   Y nX | ¡  dS )zk
        Print a C, Cython or Python stack frame and the line of source code
        if available.
        z%#%-2d Unknown Frame (compile with -g)NT)Úis_crP   c                s   ˆj jj| ˆ dS )N)r   )rN   Ú	cy_cvalueÚinvoke)Úarg)r   r   r   r   Ú<lambda>M  s    z-CythonBase.print_stackframe.<locals>.<lambda>r   z, c             s   s   | ]\}}d ||f V  qdS )z%s=%sNr   )Ú.0r   Úvalr   r   r   ú	<genexpr>d  s    z.CythonBase.print_stackframe.<locals>.<genexpr>z#%-2d 0x%016x in %s(%s)z	 at %s:%sÚ
z    ) r   r   Úselectrb   r   Úprintr&   r   rQ   rR   rS   Úprint_stackframeÚco_namer#   r[   r   r;   Úparse_and_evalr   Zaddressr,   r>   ÚstrÚbytesr   ÚjoinÚsysÚstdoutÚwriter0   rc   r   )r   r   Úindexrh   r   rd   r?   rT   Z	func_nameZ
func_cnameZ	func_argsr\   ÚfZ	gdb_valueZfunc_addressÚar   )r   r   r   rs   1  sV    


zCythonBase.print_stackframec             C   sT   t  d¡}yt  d¡}W n$ tk
r<   t  t d¡¡‚Y nX | | ¡ ¡}|d S )NZ__pyx_mÚPyModuleObjectzy                Unable to lookup type PyModuleObject, did you compile python
                with debugging support (-g)?Zmd_dict)	r   ru   Zlookup_typer   r   ÚtextwrapÚdedentÚcastZpointer)r   Úmr   r   r   r   Úget_remote_cython_globals_dicts  s    
z)CythonBase.get_remote_cython_globals_dictc             C   sF   |   ¡ }tj |¡}i }tƒ }x"| ¡ D ]\}}||| |¡< q(W |S )zk
        Get the Cython globals dict where the remote names are turned into
        local strings.
        )r„   r   ZPyObjectPtrZfrom_pyobject_ptrrI   ÚitemsZproxyval)r   Zremote_dictZpyobject_dictrZ   ÚseenÚkÚvr   r   r   Úget_cython_globals_dict  s    z"CythonBase.get_cython_globals_dictNÚ c             C   sT   t  |¡rd}nd|jf }|d kr:td||||f ƒ ntd|||||f ƒ d S )NrŠ   z(%s) z%s%s = %s%sz%s%-*s = %s%s)r   Zpretty_printer_lookupr=   rr   )r   r   ÚvalueÚmax_name_lengthÚprefixÚtypenamer   r   r   Úprint_gdb_value  s    
zCythonBase.print_gdb_valuec             C   sR   |j | }|  ¡ }d|jkrH||jkrD|jtkr@tt |j¡ƒS dS dS ||jkS )Nz->TF)	rG   r]   r;   r?   r=   r
   r>   r   ru   )r   rg   Z
local_nameÚcyvarZ
cur_linenor   r   r   Úis_initialized›  s    



zCythonBase.is_initialized)F)NrŠ   )r7   r8   r9   r!   r#   r&   rU   rX   r[   r]   rb   re   r(   rs   r„   r‰   r   r‘   r   r   r   r   rM   Ð   s   	!A
rM   c               @   s8   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zddd„ZdS )r`   Nc             C   s   || _ || _|| _d S )N)r0   ra   Ú	formatter)r   r0   ra   r’   r   r   r   r6   «  s    zSourceFileDescriptor.__init__c             C   s
   | j d k	S )N)r0   )r   r   r   r   Úvalid°  s    zSourceFileDescriptor.validc             C   sL   t rH| jrHtjrHtjj}| jd kr2t jj|d}n| j}t  	|| j|¡S |S )N)Úbg)
r^   ra   Ú
parametersÚcolorize_codeÚterminal_backgroundr‹   r’   Z
formattersZTerminalFormatterZ	highlight)r   Úcoder”   r’   r   r   r   Úlex³  s    
zSourceFileDescriptor.lexc          	   c   s    t | jƒŒ}|r&|r&|  | ¡ ¡ ¡ }t ||d |d ¡}xTt|ƒD ]H\}}	|| |kr`d}
nd}
|rv|sv|  |	¡}	d|
|| |	 ¡ f V  qFW W d Q R X d S )Né   ú>ú z%s %4d    %s)	Úopenr0   r™   ÚreadÚ
splitlinesÚ	itertoolsÚisliceÚ	enumerateÚrstrip)r   ÚstartÚstopÚ
lex_sourceÚ	mark_lineÚ
lex_entirer}   ÚsliceÚidxrW   r   r   r   r   Ú_get_source¿  s    
z SourceFileDescriptor._get_sourceTr   Fc          	   C   sd   t  d¡}| js|‚t|dƒ}|d kr.|d }yd |  |||||¡¡S  tk
r^   |‚Y nX d S )NzUnable to retrieve source coderš   rp   )r   r   r0   Úmaxrx   r«   ÚIOError)r   r¤   r¥   r¦   r§   r¨   Úexcr   r   r   rc   Õ  s    

zSourceFileDescriptor.get_source)N)NTr   F)r7   r8   r9   r6   r“   r™   r«   rc   r   r   r   r   r`   ª  s   
 r`   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú
CyGDBErrorz6
    Base class for Cython-command related errors
    c                s    |p
| j f}tt| ƒj|Ž  d S )N)ÚmsgrC   r¯   r6   )r   r   )rK   r   r   r6   î  s    zCyGDBError.__init__)r7   r8   r9   Ú__doc__r6   rL   r   r   )rK   r   r¯   é  s   r¯   c               @   s   e Zd ZdZdZdS )rY   z]
    raised when the user requests the current cython function, which is
    unavailable
    z7Current function is a function cygdb doesn't know aboutN)r7   r8   r9   r±   r°   r   r   r   r   rY   ó  s   rY   c               @   s   e Zd ZdZdZdS )r   zi
    raised when the name of the C function could not be determined
    in the current C stack frame
    zDC function name could not be determined in the current C stack frameN)r7   r8   r9   r±   r°   r   r   r   r   r   û  s   r   c                   s.   e Zd ZdZd‡ fdd„	Zdd„ ZeZ‡  ZS )ÚCythonParameterz*
    Base class for cython parameters
    Nc                s6   | j j | _| _tt| ƒ |||¡ |d k	r2|| _d S )N)rK   r±   Zshow_docZset_docrC   r²   r6   r‹   )r   r   Úcommand_classZparameter_classÚdefault)rK   r   r   r6     s
    zCythonParameter.__init__c             C   s
   t | jƒS )N)Úboolr‹   )r   r   r   r   Ú__bool__  s    zCythonParameter.__bool__)N)r7   r8   r9   r±   r6   r¶   Z__nonzero__rL   r   r   )rK   r   r²     s   r²   c               @   s   e Zd ZdZdS )Ú CompleteUnqualifiedFunctionNameszH
    Have 'cy break' complete unqualified function or method names.
    N)r7   r8   r9   r±   r   r   r   r   r·     s   r·   c               @   s   e Zd ZdZdS )ÚColorizeSourceCodez5
    Tell cygdb whether to colorize source code.
    N)r7   r8   r9   r±   r   r   r   r   r¸     s   r¸   c               @   s   e Zd ZdZdS )ÚTerminalBackgroundzJ
    Tell cygdb about the user's terminal background (light or dark).
    N)r7   r8   r9   r±   r   r   r   r   r¹   %  s   r¹   c               @   s   e Zd ZdZdd„ ZdS )ÚCythonParametersz–
    Simple container class that might get more functionality in the distant
    future (mostly to remind us that we're dealing with parameters).
    c             C   s@   t dtjtjdƒ| _tdtjtjdƒ| _tdtjtj	dƒ| _
d S )NZcy_complete_unqualifiedTZcy_colorize_codeZcy_terminal_background_colorZdark)r·   r   ÚCOMMAND_BREAKPOINTSZPARAM_BOOLEANÚcomplete_unqualifiedr¸   ÚCOMMAND_FILESr–   r¹   ZPARAM_STRINGr—   )r   r   r   r   r6   1  s    zCythonParameters.__init__N)r7   r8   r9   r±   r6   r   r   r   r   rº   +  s   rº   c               @   s.   e Zd ZdZejZedd„ ƒZedd„ ƒZ	dS )ÚCythonCommandz(
    Base class for Cython commands
    c             C   s:   t | dƒs| || jf|ž|ŽS | || j| jf|ž|ŽS d S )NÚcompleter_class)Úhasattrr³   r¿   )ÚclsZclsnamer   r   r   r   r   Ú	_registerN  s    
zCythonCommand._registerc             O   s0   t | dd ƒ}|r |  | j||¡ |  | j||¡S )NÚalias)ÚgetattrrÂ   rÃ   r   )rÁ   r   r   rÃ   r   r   r   ÚregisterV  s    zCythonCommand.registerN)
r7   r8   r9   r±   r   ÚCOMMAND_NONEr³   ÚclassmethodrÂ   rÅ   r   r   r   r   r¾   G  s   r¾   c                   s0   e Zd ZdZdZejZejZ	‡ fdd„Z
‡  ZS )ÚCyCyaa  
    Invoke a Cython command. Available commands are:

        cy import
        cy break
        cy step
        cy next
        cy run
        cy cont
        cy finish
        cy up
        cy down
        cy select
        cy bt / cy backtrace
        cy list
        cy print
        cy set
        cy locals
        cy globals
        cy exec
    rN   c                sø   t t| ƒj|||dd tt ¡ t ¡ t ¡ t ¡ t	 ¡ t
 ¡ t ¡ t ¡ t ¡ t ¡ t ¡ t ¡ t ¡ t ¡ t ¡ t dd¡t ¡ t ¡ tdƒtdƒtdƒtdƒd	}x&| ¡ D ]\}}| |_t| ||ƒ q²W | | _i | _i | _ i | _!t" #t$¡| _%d S )
NT)r   zcy execz-cy-execÚcy_cnameri   Ú	cy_linenoÚcy_eval)Úimport_Zbreak_ÚstepÚnextÚrunÚcontÚfinishÚupÚdownrq   ZbtÚlistÚprint_rG   r2   Zexec_Ú_execrI   rÉ   ri   rÊ   rË   )&rC   r¾   r6   ÚdictÚCyImportrÅ   ÚCyBreakÚCyStepÚCyNextÚCyRunÚCyContÚCyFinishÚCyUpÚCyDownÚCySelectÚCyBacktraceÚCyListÚCyPrintÚCyLocalsÚ	CyGlobalsr   ZFixGdbCommandÚCyExecÚCySetÚCyCNameÚCyCValueÚCyLineÚCyEvalr…   rN   ÚsetattrÚcython_namespaceÚfunctions_by_qualified_namerO   ÚcollectionsÚdefaultdictrÔ   Úfunctions_by_name)r   r   r³   r¿   ZcommandsZcommand_nameÚcommand)rK   r   r   r6   z  sB    

zCyCy.__init__)r7   r8   r9   r±   r   r   rÆ   r³   ZCOMPLETE_COMMANDr¿   r6   rL   r   r   )rK   r   rÈ   _  s
   rÈ   c               @   s(   e Zd ZdZdZejZejZ	dd„ Z
dS )rØ   zb
    Import debug information outputted by the Cython compiler
    Example: cy import FILE...
    z	cy importc             C   s*  t |tƒr| t¡}xt|ƒD ] }yt|ƒ}W n: tk
rl } zt d||j	d f ¡‚W d d }~X Y nX t
 |¡}x¦| ¡ D ]˜}tf |jŽ}|| jj|j< x,| d¡D ]}	|	j}
tf |
Ž|j|
d < q°W xæ| d¡D ]Ø}tf d|i|j—Ž}|j}|j}| jj|  |¡ || jj|j< || jj|j< | }
|j|< x.| d¡D ] }|j}
tf |
Ž|j|
d < qJW x*| d¡D ]}|j}
|j |
d ¡ qzW |j  !d	d
„ | d¡D ƒ¡ qÞW xb| d¡D ]T}t"|jd ƒ}t#t$t"|jd  %¡ ƒƒ}t&|ƒ|j'|< x|D ]}||j(|< qW qÆW q„W q W d S )NzUnable to open file %r: %srš   ZGlobalsr   Z	FunctionsrD   ZLocalsZStepIntoFunctionsc             s   s   | ]}|j V  qd S )N)Útag)rm   Zfuncargr   r   r   ro   æ  s    z"CyImport.invoke.<locals>.<genexpr>Z	ArgumentsZLineNumberMappingÚcython_linenoÚ	c_linenos))r,   ÚBYTESÚdecodeÚ_filesystemencodingr   r   ÚOSErrorr   r   r   r   ÚparseZgetrootr/   ZattribrN   rî   r   Úfindr:   r2   r@   r<   rò   Úappendrï   rO   r;   r5   rG   rJ   ÚaddrH   Úextendr>   rÔ   Úmapr   Úminr3   r4   )r   r   Úfrom_ttyrk   r}   ÚeÚtrD   Úcython_moduleZvariableÚdr   Úcython_functionr   ÚqnameZlocalZstep_into_funcZmarkerrõ   rö   Úc_linenor   r   r   rj   º  sJ    

*



zCyImport.invokeN)r7   r8   r9   r±   r   r   ZCOMMAND_STATUSr³   ZCOMPLETE_FILENAMEr¿   rj   r   r   r   r   rØ   °  s
   rØ   c               @   s>   e Zd ZdZdZejZdd„ Zdd„ Z	dd„ Z
ed	d
„ ƒZdS )rÙ   a  
    Set a breakpoint for Cython code using Cython qualified name notation, e.g.:

        cy break cython_modulename.ClassName.method_name...

    or normal notation:

        cy break function_or_method_name...

    or for a line number:

        cy break cython_module:lineno...

    Set a Python breakpoint:
        Break on any function or method named 'func' in module 'modname'

            cy break -p modname.func...

        Break on any function or method named 'func'

            cy break -p func...
    zcy breakc             C   st   |  d¡\}}}t|ƒ}|r*| jj| }n
|  ¡ j}||jkrf|j| }d|j|f }t 	d| ¡ n
t 
d¡‚d S )Nú:z%s:%szbreak z5Not a valid line number. Does it contain actual code?)Ú	partitionr>   rN   rî   r[   rD   r3   r1   r   r'   r   )r   r   Z
modulenameÚ_r?   r  r	  Ú
breakpointr   r   r   Ú
_break_pyx  s    


zCyBreak._break_pyxc             C   sx  | j j |¡}|r|jrd }|g}|s<| j j |¡p8g }dd„ |D ƒ}|s^t d| ¡ d S t|ƒdkr2tdƒ x&t	|ƒD ]\}}td||j
f ƒ q~W xžytdƒ}W n tk
r¾   d S X | ¡ dkrÐd S | ¡ d	krä|}P qž| ¡ r$d
t|ƒ  krt|ƒk r$n n|t|ƒ g}P qžtdƒ qžW n
|d
 g}x6|D ].}t d|j ¡ |jrBt d|j ¡ qBW d S )Nc             S   s   g | ]}|j s|‘qS r   )rF   )rm   r}   r   r   r   ú
<listcomp>%  s    z+CyBreak._break_funcname.<locals>.<listcomp>zbreak rš   z"There are multiple such functions:z%3d) %szMSelect a function, press 'a' for all functions or press 'q' or '^D' to quit: Úqr~   r   zNot understood...zbreak %s)rN   rï   r"   rF   rò   r   r'   Úlenrr   r¢   r<   ÚinputÚEOFErrorÚlowerÚisdigitr>   r;   rE   )r   ÚfuncnameÚfuncZbreak_funcsZfuncsrª   rZ   r   r   r   Ú_break_funcname  sF    


$

zCyBreak._break_funcnamec             C   s€   t |tƒr| t¡}t|ƒ}| d¡r8|dd … }d}nd}x>|D ]6}|rZt d| ¡ qBd|krn|  |¡ qB|  	|¡ qBW d S )Nz-prš   TFzpy-break %sr
  )
r,   r÷   rø   rù   r   Ú
startswithr   r'   r  r  )r   Zfunction_namesr  ÚargvZpython_breakpointsr  r   r   r   rj   L  s    



zCyBreak.invokec                sÞ   dd„ | j j ¡ D ƒ}dd„ | j j ¡ D ƒ}tjr@t ||¡}n|}| ¡  	¡ }|r`d|d krŽt
|d tˆƒ …  	¡ ƒ‰‡‡fdd„|D ƒS |d ‰ ‡ fdd„|D ƒ}tˆ ƒtˆƒkrÚtˆ ƒtˆƒ ‰‡fdd„|D ƒ}|S )	Nc             S   s&   g | ]\}}t d d„ |D ƒƒr|‘qS )c             s   s   | ]}|j  V  qd S )N)rF   )rm   r}   r   r   r   ro   c  s    z.CyBreak.complete.<locals>.<listcomp>.<genexpr>)Úany)rm   ÚnÚLr   r   r   r  b  s    z$CyBreak.complete.<locals>.<listcomp>c             S   s   g | ]\}}|j s|‘qS r   )rF   )rm   r  r}   r   r   r   r  d  s    Ú.éÿÿÿÿc                s"   g | ]}|  ˆ¡r|ˆ kr|‘qS r   )r  )rm   r  )r†   Úwordr   r   r  p  s    c                s   g | ]}|  ˆ ¡r|‘qS r   )r  )rm   r  )Úlastwordr   r   r  u  s    c                s   g | ]}|ˆ d … ‘qS )Nr   )rm   r  )Ústrip_prefix_lengthr   r   r  {  s    )rN   rò   r…   rï   r•   r¼   r    ÚchainÚstripr   rI   r  )r   Útextr   ÚnamesZqnamesZ	all_namesZwordsZcomplr   )r!  r†   r"  r   r   Úcomplete^  s    zCyBreak.completeN)r7   r8   r9   r±   r   r   r»   r³   r  r  rj   r   r'  r   r   r   r   rÙ   ð  s   1rÙ   c                   sH   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡ fdd„Zdd	„ Zd
d„ Z‡  Z	S )Ú
CythonInfozM
    Implementation of the interface dictated by libpython.LanguageInfo.
    c                s$   |   |¡r|  |¡S tt| ƒ |¡S )N)r#   r]   rC   r(  r?   )r   r   )rK   r   r   r?   …  s    

zCythonInfo.linenoc                s<   yt t| ƒ |¡}W n tjk
r*   d S X | ¡ p6d S d S )N)rC   r(  re   r   r   r$  )r   r   rW   )rK   r   r   re   Ž  s
    zCythonInfo.get_source_linec                s   | j rtt| ƒ |¡S d S )N)r&   rC   r(  Úexc_info)r   r   )rK   r   r   r)  –  s    zCythonInfo.exc_infoc             C   s   |   ¡ r|  ¡ jS dS )Nr   )r#   r[   rJ   )r   r   r   r   Úruntime_break_functionsš  s    
z"CythonInfo.runtime_break_functionsc             C   s   dg}|  | jj¡ |S )NrP   )rÿ   rN   rO   )r   rZ   r   r   r   Ústatic_break_functionsŸ  s    z!CythonInfo.static_break_functions)
r7   r8   r9   r±   r?   re   r)  r*  r+  rL   r   r   )rK   r   r(  €  s   	r(  c               @   s   e Zd Zedd„ ƒZdS )ÚCythonExecutionControlCommandc             C   s   | | j tƒS )N)r   Úcython_info)rÁ   r   r   r   rÅ   ¨  s    z&CythonExecutionControlCommand.registerN)r7   r8   r9   rÇ   rÅ   r   r   r   r   r,  ¥  s   r,  c               @   s    e Zd ZdZdZdZdd„ ZdS )rÚ   z&Step through Cython, Python or C code.zcy -stepTc             C   sV   |   ¡ r|  | j¡ n<|  ¡ sD| jr*d}nd}|  tj|dd¡ n| j| jd d S )NrÍ   rÎ   T)Ú	to_string)Ústepinto)r&   Zpython_stepr/  r#   Zfinish_executingr   r'   rÍ   )r   r   r  ró   r   r   r   rj   ³  s    zCyStep.invokeN)r7   r8   r9   r±   r   r/  rj   r   r   r   r   rÚ   ­  s   rÚ   c               @   s   e Zd ZdZdZdZdS )rÛ   z#Step-over Cython, Python or C code.zcy -nextFN)r7   r8   r9   r±   r   r/  r   r   r   r   rÛ   Á  s   rÛ   c               @   s   e Zd ZdZdZejZdS )rÜ   z
    Run a Cython program. This is like the 'run' command, except that it
    displays Cython or Python source lines as well
    zcy runN)r7   r8   r9   r±   r   r,  rÏ   rj   r   r   r   r   rÜ   È  s   rÜ   c               @   s   e Zd ZdZdZejZdS )rÝ   z‡
    Continue a Cython program. This is like the 'run' command, except that it
    displays Cython or Python source lines as well.
    zcy contN)r7   r8   r9   r±   r   r,  rÐ   rj   r   r   r   r   rÝ   Ó  s   rÝ   c               @   s   e Zd ZdZdZejZdS )rÞ   z-
    Execute until the function returns.
    z	cy finishN)r7   r8   r9   r±   r   r,  rÑ   rj   r   r   r   r   rÞ   Ý  s   rÞ   c               @   s    e Zd ZdZdZdZdd„ ZdS )rß   z5
    Go up a Cython, Python or relevant C frame.
    zcy uprÒ   c          
   G   s¢   y8t j| jdd x"|  t  ¡ ¡s4t j| jdd qW W n. tk
rf } zt j|jŽ ‚W d d }~X Y nX t  ¡ }d}x|rŒ| ¡ }|d7 }qvW | j	|d d d S )NT)r.  r   rš   )r|   )
r   r'   Ú_commandr(   r   r   r   r   rf   rs   )r   r   r  r   r|   r   r   r   rj   í  s    zCyUp.invokeN)r7   r8   r9   r±   r   r0  rj   r   r   r   r   rß   æ  s   rß   c               @   s   e Zd ZdZdZdZdS )rà   z7
    Go down a Cython, Python or relevant C frame.
    zcy downrÓ   N)r7   r8   r9   r±   r   r0  r   r   r   r   rà   þ  s   rà   c               @   s   e Zd ZdZdZdd„ ZdS )rá   z—
    Select a frame. Use frame numbers as listed in `cy backtrace`.
    This command is useful because `cy backtrace` prints a reversed backtrace.
    z	cy selectc          
   C   sª   yt |ƒ}W n$ tk
r0   t d|f ¡‚Y nX t ¡ }x| ¡ rN| ¡ }q<W t |¡}yt d|| d f ¡ W n. t	k
r¤ } ztj|j
Ž ‚W d d }~X Y nX d S )NzNot a valid number: %rz	select %drš   )r>   Ú
ValueErrorr   r   r   Únewerr   Ú
stackdepthr'   r   r   )r   Zstacknor  r   r3  r  r   r   r   rj     s    

zCySelect.invokeN)r7   r8   r9   r±   r   rj   r   r   r   r   rá     s   rá   c               @   s0   e Zd ZdZdZdZejZej	Z
edd„ ƒZdS )râ   zPrint the Cython stackzcy btzcy backtracec             C   s„   t  ¡ }x| ¡ r| ¡ }q
W |dk}d}xT|r~y|  |¡}W n tk
rV   d}Y nX |s`|rl|  ||¡ |d7 }| ¡ }q,W d S )Nz-ar   Frš   )r   r   rf   r(   r¯   rs   r2  )r   r   r  r   Z	print_allr|   Zis_relevantr   r   r   rj   )  s    

zCyBacktrace.invokeN)r7   r8   r9   r±   r   rÃ   r   ÚCOMMAND_STACKr³   ÚCOMPLETE_NONEr¿   r$   rj   r   r   r   r   râ   !  s   râ   c               @   s(   e Zd ZdZdZejZejZ	dd„ Z
dS )rã   za
    List Cython source code. To disable to customize colouring see the cy_*
    parameters.
    zcy listc             C   s2   |   ¡ \}}|j|d |d |dd}t|ƒ d S )Né   T)r§   r¨   )rb   rc   rr   )r   r  r  Zsdr?   Úsourcer   r   r   rj   K  s    zCyList.invokeN)r7   r8   r9   r±   r   r   r½   r³   r5  r¿   rj   r   r   r   r   rã   @  s
   rã   c               @   s,   e Zd ZdZdZejZddd„Zdd„ Z	dS )	rä   zT
    Print a Cython variable using 'cy-print x' or 'cy-print module.function.x'
    zcy printNc             C   sv   |   ¡ rt d| ¡S |  ¡ rd| jj | d¡¡}x |D ]}|dkrN| ¡ }q8P q8W |  	|||¡ nt d| ¡ d S )Nz	py-print Ú*zprint )
r&   r   r'   r#   rN   ri   rj   ÚlstripZdereferencer   )r   r   r  rŒ   r‹   Úcr   r   r   rj   Z  s    

zCyPrint.invokec             C   s,   |   ¡ r$|  ¡ }tt |j|j¡ƒS g S d S )N)r#   r[   rÔ   r    r#  rG   r2   )r   r}   r   r   r   r'  i  s    zCyPrint.complete)N)
r7   r8   r9   r±   r   r   ÚCOMMAND_DATAr³   rj   r'  r   r   r   r   rä   R  s
   
rä   c             C   s   | d   ¡ S )Nr   )r  )Úitemr   r   r   rl   q  s    rl   c               @   s4   e Zd ZdZdZejZejZ	e
ddddd„ ƒZdS )	rå   z8
    List the locals from the current Cython frame.
    z	cy localszinfo localsz	py-locals)r)   r*   c       	      C   s   |   ¡ }|jr"| jj ||¡ d S |j}tt|tdƒ}xRt| 	¡ t
dD ]>\}}|  |   ¡ |j¡rJt |j¡}|jsJ|  |j||d¡ qJW d S )N)ÚkeyrŠ   )r[   rF   rN   r2   rj   rG   r  r¬   Úsortedr…   Úsortkeyr‘   r   r   ru   r;   rS   r   )	r   r   r  r  Zlocal_cython_varsrŒ   r   r   r‹   r   r   r   rj   }  s    
zCyLocals.invokeN)r7   r8   r9   r±   r   r   r4  r³   r5  r¿   r+   rj   r   r   r   r   rå   t  s
   rå   c               @   s4   e Zd ZdZdZejZejZ	e
ddddd„ ƒZdS )	ræ   z:
    List the globals from the current Cython module.
    z
cy globalszinfo variablesz
py-globals)r)   r*   c          	   C   s  |   ¡ }|  ¡ jj}d}d}|r0tt|tdƒ}|r@tt|ƒƒ}t||ƒ}tƒ }tdƒ xDt| 	¡ t
dD ]0\}	}
|
 tj¡}
| |	¡ td||	|
f ƒ qjW tdƒ xbt| 	¡ t
dD ]N\}}||kr¸yt |j¡}W n tk
rì   Y q¸X |js¸|  |j||d¡ q¸W d S )Nr   )r=  zPython globals:z    %-*s = %sz
C globals:z    )r‰   r[   rD   r2   r  r¬   rI   rr   r>  r…   r?  Zget_truncated_reprr   ZMAX_OUTPUT_LENrþ   r   ru   r;   r   rS   r   r   )r   r   r  Zglobal_python_dictÚmodule_globalsZmax_globals_lenZmax_globals_dict_lenrŒ   r†   r‡   rˆ   r   r   r‹   r   r   r   rj   ˜  s2    


zCyGlobals.invokeN)r7   r8   r9   r±   r   r   r4  r³   r5  r¿   r+   rj   r   r   r   r   ræ     s
   ræ   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚEvaluateOrExecuteCodeMixinzð
    Evaluate or execute Python code in a Cython or Python frame. The 'evalcode'
    method evaluations Python code, prints a traceback if an exception went
    uncaught, and returns any return value as a gdb.Value (NULL on exception).
    c       	   
   C   s¸   |   ¡ }xª|j ¡ D ]œ\}}|jtkr|  ||¡ryt |j¡}W n t	k
rX   wY n
X |j
rbq| |¡}d|||jf }z&t |¡dk r t d¡ t d¡‚W d| |¡ X qW dS )zBFill a remotely allocated dict with values from the Cython C stackz½
                    (PyObject *) PyDict_SetItem(
                        (PyObject *) %d,
                        (PyObject *) %d,
                        (PyObject *) %s)
                r   zPyErr_Print()zUnable to execute Python code.N)r[   rG   r…   r=   r
   r‘   r   ru   r;   r   rS   Zalloc_pystringr   Úxdecref)	r   ÚexecutorZlocal_dict_pointerrg   r   r   rn   Z	pystringpr˜   r   r   r   Ú_fill_locals_dictÁ  s     

z,EvaluateOrExecuteCodeMixin._fill_locals_dictc             C   sH   t  ¡ }x0|r8|  |¡s"|  |¡r.| ¡  |S | ¡ }q
W t  d¡‚d S )Nz0There is no Cython or Python frame on the stack.)r   r   r#   r&   rq   rf   r   )r   r   r   r   r   Ú"_find_first_cython_or_python_frameß  s    

z=EvaluateOrExecuteCodeMixin._find_first_cython_or_python_framec             C   sf   t  ¡ T t d¡}t d¡}z&|  |t  |¡¡ | ||||¡}W d | t  |¡¡ X W d Q R X |S )Nz&(PyObject *) PyModule_GetDict(__pyx_m)z(PyObject *) PyDict_New())r   ZFetchAndRestoreErrorr   ru   rD  ZpointervalueÚevalcoderB  )r   rC  r˜   Ú
input_typeZglobal_dictZ
local_dictrZ   r   r   r   Ú_evalcode_cythonë  s    



z+EvaluateOrExecuteCodeMixin._evalcode_cythonc             C   s6   |   ¡ }t ¡ }|  |¡r(t |||¡S |  |||¡S )zi
        Evaluate `code` in a Python or Cython stack frame using the given
        `input_type`.
        )rE  r   ÚPythonCodeExecutorr&   Z_evalcode_pythonrH  )r   r˜   rG  r   rC  r   r   r   rF  ý  s
    
z#EvaluateOrExecuteCodeMixin.evalcodeN)r7   r8   r9   r±   rD  rE  rH  rF  r   r   r   r   rA  º  s
   rA  c               @   s(   e Zd ZdZdZejZejZ	dd„ Z
dS )rç   zD
    Execute Python code in the nearest Python or Cython frame.
    z-cy-execc             C   s.   |   |¡\}}t ¡ }| |  ||j¡¡ d S )N)Zreadcoder   rI  rB  rF  ZPy_single_input)r   Úexprr  rG  rC  r   r   r   rj     s    zCyExec.invokeN)r7   r8   r9   r±   r   r   r4  r³   r5  r¿   rj   r   r   r   r   rç   	  s
   rç   c               @   s,   e Zd ZdZdZejZejZ	e
dd„ ƒZdS )rè   zï
    Set a Cython variable to a certain value

        cy set my_cython_c_variable = 10
        cy set my_cython_py_variable = $cy_eval("{'doner': 'kebab'}")

    This is equivalent to

        set $cy_value("my_cython_variable") = 10
    zcy setc             C   sR   |  dd¡}t|ƒdkr"t d¡‚|\}}| jj | ¡ ¡}t d||f ¡ d S )Nú=rš   é   z,Invalid expression. Use 'cy set var = expr'.zset %s = %s)	r   r  r   r   rN   rÉ   rj   r$  r'   )r   rJ  r  Zname_and_exprZvarnamer;   r   r   r   rj   (  s    
zCySet.invokeN)r7   r8   r9   r±   r   r   r;  r³   r5  r¿   r%   rj   r   r   r   r   rè     s
   
rè   c               @   s"   e Zd ZdZeeddd„ƒƒZdS )ré   zË
    Get the C name of a Cython variable in the current context.
    Examples:

        print $cy_cname("function")
        print $cy_cname("Class.method")
        print $cy_cname("module.function")
    Nc             C   sª   |p
t  ¡ }d }|  |¡r‚|  |¡}||jkr<|j| j}nF||jjkrX|jj| j}n*d|jj|f }||jj	kr‚|jj	| j}|s”| j
j |¡}|s¦t  d| ¡‚|S )Nz%s.%szNo such Cython variable: %s)r   r   r#   r[   rG   r;   rD   r2   r   r5   rN   rï   r"   r   )r   Úcynamer   r;   r  r  r   r   r   rj   ?  s     


zCyCName.invoke)N)r7   r8   r9   r±   r%   r.   rj   r   r   r   r   ré   5  s   ré   c                   s*   e Zd ZdZeed‡ fdd„	ƒƒZ‡  ZS )rê   z-
    Get the value of a Cython variable.
    Nc                s`   |   ¡ }|  |¡}|  ||¡r<tt| ƒj||d}t |¡S ||krN|| jS t 	d| ¡‚d S )N)r   zVariable %s is not initialized.)
r‰   r[   r‘   rC   rê   rj   r   ru   Z_gdbvalr   )r   rM  r   Zglobals_dictr  r;   )rK   r   r   rj   ^  s    


zCyCValue.invoke)N)r7   r8   r9   r±   r%   r.   rj   rL   r   r   )rK   r   rê   Y  s   rê   c               @   s   e Zd ZdZedd„ ƒZdS )rë   z&
    Get the current Cython line.
    c             C   s   |   ¡ S )N)r]   )r   r   r   r   rj   r  s    zCyLine.invokeN)r7   r8   r9   r±   r%   rj   r   r   r   r   rë   m  s   rë   c               @   s   e Zd ZdZedd„ ƒZdS )rì   zO
    Evaluate Python code in the nearest Python or Cython frame and return
    c             C   s   t jj}|  ||¡S )N)r   rI  ZPy_eval_inputrF  )r   Zpython_expressionrG  r   r   r   rj   |  s    zCyEval.invokeN)r7   r8   r9   r±   r.   rj   r   r   r   r   rì   w  s   rì   c               C   s    t  t d¡tjtjf ¡ d S )NzÏ        define cy step
        cy -step
        end

        define cy next
        cy -next
        end

        document cy step
        %s
        end

        document cy next
        %s
        end
    )r   Zsource_gdb_scriptr€   r   rÚ   r±   rÛ   r   r   r   r   Úregister_defines‡  s    rN  )T)N)gr±   Z
__future__r   Z	raw_inputr  Ú	NameErrorry   r€   r   r   r    rð   r   ZunicodeÚUNICODErv   r÷   rw   Zlxmlr   Z	have_lxmlÚImportErrorZ	xml.etreer   r   Zelementtree.ElementTreeZpygments.lexersr^   Zpygments.formattersÚstderrr{   rÀ   r   Zshlexr   ZCython.Debuggerr   r	   r
   r×   Z_data_typesÚgetfilesystemencodingrù   r   r!   r%   r+   r$   r.   Úobjectr/   r:   r@   rM   r`   r   r¯   rY   r   Z	Parameterr²   r·   r¸   r¹   rº   r•   ZCommandr¾   rÈ   rØ   rÙ   Z
PythonInfor(  ZExecutionControlCommandBaser,  ZPythonStepperMixinrÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rã   rä   r?  rå   ræ   rA  ZPyExecrç   rè   ZFunctionré   rê   rë   rì   r-  rÅ   rN   rN  r   r   r   r   Ú<module>   sÌ   
$


 [?
Q@ %
		+O$
